From 4af79539e5e57f14f8f76508f43cb859cf0c880b Mon Sep 17 00:00:00 2001 From: crowlkats Date: Mon, 22 Apr 2024 19:12:05 +0200 Subject: [PATCH 01/17] rework "all symbols" page --- examples/ddoc/main.rs | 8 +- src/html/comrak_adapters.rs | 6 +- src/html/jsdoc.rs | 77 +++++----- src/html/mod.rs | 143 +++++++++++-------- src/html/pages.rs | 53 ++++--- src/html/partition.rs | 74 ++++++++++ src/html/render_context.rs | 58 +++----- src/html/search.rs | 22 +-- src/html/sidepanels.rs | 12 +- src/html/symbols/class.rs | 48 +++---- src/html/symbols/enum.rs | 8 +- src/html/symbols/function.rs | 16 +-- src/html/symbols/interface.rs | 32 ++--- src/html/symbols/mod.rs | 17 ++- src/html/symbols/namespace.rs | 12 +- src/html/symbols/type_alias.rs | 8 +- src/html/symbols/variable.rs | 8 +- src/html/templates/breadcrumbs.hbs | 4 +- src/html/templates/namespace_section.hbs | 29 ++-- src/html/templates/section.hbs | 14 +- src/html/templates/styles.css | 59 ++++---- src/html/templates/styles.gen.css | 2 +- src/html/types.rs | 8 +- src/html/usage.rs | 10 +- src/html/util.rs | 37 +++-- tailwind.config.ts | 2 +- tests/html_test.rs | 27 +--- tests/testdata/module_doc-syntect.json | 125 ++++++++++++---- tests/testdata/module_doc-tree-sitter.json | 125 ++++++++++++---- tests/testdata/module_doc.json | 125 ++++++++++++---- tests/testdata/symbol_group-syntect.json | 108 ++++++++++++-- tests/testdata/symbol_group-tree-sitter.json | 108 ++++++++++++-- tests/testdata/symbol_group.json | 108 ++++++++++++-- 33 files changed, 1035 insertions(+), 458 deletions(-) diff --git a/examples/ddoc/main.rs b/examples/ddoc/main.rs index b7ea1293..350f6359 100644 --- a/examples/ddoc/main.rs +++ b/examples/ddoc/main.rs @@ -186,12 +186,8 @@ impl HrefResolver for EmptyResolver { None } - fn resolve_usage( - &self, - current_specifier: &deno_ast::ModuleSpecifier, - _current_file: Option<&ShortPath>, - ) -> Option { - Some(current_specifier.to_string()) + fn resolve_usage(&self, current_file: &ShortPath) -> Option { + Some(current_file.specifier.to_string()) } fn resolve_source(&self, location: &deno_doc::Location) -> Option { diff --git a/src/html/comrak_adapters.rs b/src/html/comrak_adapters.rs index 75695427..460a0f8e 100644 --- a/src/html/comrak_adapters.rs +++ b/src/html/comrak_adapters.rs @@ -2,6 +2,7 @@ //! Adapter for the Syntect syntax highlighter plugin. +use crate::html::ShortPath; use comrak::adapters::HeadingAdapter; use comrak::adapters::HeadingMeta; use comrak::adapters::SyntaxHighlighterAdapter; @@ -264,6 +265,5 @@ impl HeadingAdapter for HeadingToCAdapter { } #[cfg(feature = "ammonia")] -pub type URLRewriter = Arc< - dyn (Fn(Option<&deno_ast::ModuleSpecifier>, &str) -> String) + Send + Sync, ->; +pub type URLRewriter = + Arc, &str) -> String) + Send + Sync>; diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index b9af118c..de88c71a 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -1,6 +1,7 @@ use super::render_context::RenderContext; use super::util::*; use crate::html::usage::UsagesCtx; +use crate::html::ShortPath; use crate::js_doc::JsDoc; use crate::js_doc::JsDocTag; use crate::DocNodeKind; @@ -9,7 +10,6 @@ use comrak::nodes::AstNode; use comrak::nodes::NodeHtmlBlock; use comrak::nodes::NodeValue; use comrak::Arena; -use deno_ast::ModuleSpecifier; use serde::Serialize; use std::borrow::Cow; use std::cell::RefCell; @@ -79,6 +79,8 @@ fn split_markdown_title(md: &str) -> (Option<&str>, &str) { let index = newline.min(codeblock).min(md.len()); + dbg!(md.split_at(index)); + match md.split_at(index) { ("", body) => (None, body), (title, "") => (None, title), @@ -88,14 +90,14 @@ fn split_markdown_title(md: &str) -> (Option<&str>, &str) { #[cfg(feature = "ammonia")] struct AmmoniaRelativeUrlEvaluator { - current_specifier: Option, + current_file: Option, url_rewriter: URLRewriter, } #[cfg(feature = "ammonia")] impl ammonia::UrlRelativeEvaluate for AmmoniaRelativeUrlEvaluator { fn evaluate<'a>(&self, url: &'a str) -> Option> { - Some((self.url_rewriter)(self.current_specifier.as_ref(), url).into()) + Some((self.url_rewriter)(self.current_file.as_ref(), url).into()) } } @@ -241,7 +243,7 @@ fn render_node<'a>( String::from_utf8(bw.into_inner().unwrap()).unwrap() } -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Clone, Default)] pub struct Markdown { pub html: String, pub toc: Option, @@ -252,7 +254,7 @@ pub fn markdown_to_html( md: &str, summary: bool, render_toc: bool, -) -> Markdown { +) -> Option { // TODO(bartlomieju): this should be initialized only once let mut options = comrak::Options::default(); options.extension.autolink = true; @@ -281,12 +283,16 @@ pub fn markdown_to_html( let md = parse_links(md, render_ctx); let md = if summary { - let (title, body) = split_markdown_title(md.as_ref()); - title.unwrap_or(body) + let (title, _body) = split_markdown_title(&md); + title.unwrap_or_default() } else { md.as_ref() }; + if md.is_empty() { + return None; + } + let class_name = if summary { "markdown_summary" } else { @@ -356,7 +362,7 @@ pub fn markdown_to_html( ammonia::UrlRelative::PassThrough, |url_rewriter| { ammonia::UrlRelative::Custom(Box::new(AmmoniaRelativeUrlEvaluator { - current_specifier: render_ctx.get_current_specifier().cloned(), + current_file: render_ctx.get_current_resolve().get_file().cloned(), url_rewriter: url_rewriter.clone(), })) }, @@ -407,21 +413,25 @@ pub fn markdown_to_html( None }; - Markdown { + Some(Markdown { html: format!(r#"
{html}
"#), toc, - } + }) } pub(crate) fn render_markdown_summary( render_ctx: &RenderContext, md: &str, ) -> String { - markdown_to_html(render_ctx, md, true, false).html + markdown_to_html(render_ctx, md, true, false) + .unwrap_or_default() + .html } pub(crate) fn render_markdown(render_ctx: &RenderContext, md: &str) -> String { - markdown_to_html(render_ctx, md, false, false).html + markdown_to_html(render_ctx, md, false, false) + .unwrap_or_default() + .html } pub(crate) fn jsdoc_body_to_html( @@ -430,11 +440,7 @@ pub(crate) fn jsdoc_body_to_html( summary: bool, ) -> Option { if let Some(doc) = js_doc.doc.as_deref() { - if doc.is_empty() { - None - } else { - Some(markdown_to_html(ctx, doc, summary, false).html) - } + markdown_to_html(ctx, doc, summary, false).map(|markdown| markdown.html) } else { None } @@ -461,10 +467,10 @@ pub(crate) fn jsdoc_examples( .collect::>(); if !examples.is_empty() { - Some(SectionCtx { - title: "Examples".to_string(), - content: SectionContentCtx::Example(examples), - }) + Some(SectionCtx::new( + "Examples", + SectionContentCtx::Example(examples), + )) } else { None } @@ -513,13 +519,13 @@ pub struct ModuleDocCtx { impl ModuleDocCtx { pub fn new( render_ctx: &RenderContext, - specifier: &ModuleSpecifier, + short_path: &ShortPath, doc_nodes_by_url: &super::ContextDocNodesByUrl, ) -> Self { - let module_doc_nodes = doc_nodes_by_url.get(specifier).unwrap(); + let module_doc_nodes = doc_nodes_by_url.get(&short_path.specifier).unwrap(); let title = if !render_ctx.ctx.hide_module_doc_title { - Some(render_ctx.ctx.url_to_short_path(specifier).to_name()) + Some(short_path.display_name()) } else { None }; @@ -546,7 +552,7 @@ impl ModuleDocCtx { .js_doc .doc .as_ref() - .map(|doc| markdown_to_html(render_ctx, doc, false, true)) + .and_then(|doc| markdown_to_html(render_ctx, doc, false, true)) { (Some(markdown.html), markdown.toc) } else { @@ -558,18 +564,25 @@ impl ModuleDocCtx { (None, None, None) }; - if !render_ctx - .ctx - .main_entrypoint - .as_ref() - .is_some_and(|main_entrypoint| main_entrypoint == specifier) - { + if short_path.is_main { let partitions_by_kind = super::partition::partition_nodes_by_kind(module_doc_nodes, true); sections.extend(super::namespace::render_namespace( render_ctx, - partitions_by_kind, + partitions_by_kind + .into_iter() + .map(|(title, nodes)| { + ( + SectionHeaderCtx { + title, + href: None, + doc: None, + }, + nodes, + ) + }) + .collect(), )); } diff --git a/src/html/mod.rs b/src/html/mod.rs index 638c0ada..3b0ed6e6 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -105,37 +105,6 @@ pub struct GenerateCtx<'ctx> { } impl<'ctx> GenerateCtx<'ctx> { - pub fn url_to_short_path(&self, url: &ModuleSpecifier) -> ShortPath { - if let Some(rewrite) = self - .rewrite_map - .as_ref() - .and_then(|rewrite_map| rewrite_map.get(url)) - { - return rewrite.to_owned().into(); - } - - let Ok(url_file_path) = url.to_file_path() else { - return url.to_string().into(); - }; - - let Some(common_ancestor) = &self.common_ancestor else { - return url_file_path.to_string_lossy().to_string().into(); - }; - - let stripped_path = url_file_path - .strip_prefix(common_ancestor) - .unwrap_or(&url_file_path); - - let path = stripped_path.to_string_lossy().to_string(); - - if path.is_empty() { - ".".to_string() - } else { - path - } - .into() - } - pub fn doc_nodes_by_url_add_context( &self, doc_nodes_by_url: IndexMap>, @@ -143,10 +112,12 @@ impl<'ctx> GenerateCtx<'ctx> { doc_nodes_by_url .into_iter() .map(|(specifier, nodes)| { + let short_path = Rc::new(ShortPath::new(self, specifier.clone())); + let nodes = nodes .into_iter() .map(|node| DocNodeWithContext { - origin: Rc::new(self.url_to_short_path(&specifier)), + origin: short_path.clone(), ns_qualifiers: Rc::new(vec![]), drilldown_parent_kind: None, kind_with_drilldown: DocNodeKindWithDrilldown::Other(node.kind), @@ -163,32 +134,85 @@ impl<'ctx> GenerateCtx<'ctx> { pub type ContextDocNodesByUrl = IndexMap>; -#[derive(Clone, Debug)] -pub struct ShortPath(String); +#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] +pub struct ShortPath { + pub path: String, + pub specifier: ModuleSpecifier, + pub is_main: bool, +} impl ShortPath { - pub fn to_name(&self) -> String { - if self.0.is_empty() || self.0 == "." { - "main".to_string() + pub fn new(ctx: &GenerateCtx, specifier: ModuleSpecifier) -> Self { + let is_main = ctx + .main_entrypoint + .as_ref() + .is_some_and(|main_entrypoint| main_entrypoint == &specifier); + + if let Some(rewrite) = ctx + .rewrite_map + .as_ref() + .and_then(|rewrite_map| rewrite_map.get(&specifier)) + { + return ShortPath { + path: rewrite.to_owned(), + specifier, + is_main, + }; + } + + let Ok(url_file_path) = specifier.to_file_path() else { + return ShortPath { + path: specifier.to_string(), + specifier, + is_main, + }; + }; + + let Some(common_ancestor) = &ctx.common_ancestor else { + return ShortPath { + path: url_file_path.to_string_lossy().to_string(), + specifier, + is_main, + }; + }; + + let stripped_path = url_file_path + .strip_prefix(common_ancestor) + .unwrap_or(&url_file_path); + + let path = stripped_path.to_string_lossy().to_string(); + + ShortPath { + path: if path.is_empty() { + ".".to_string() + } else { + path + }, + specifier, + is_main, + } + } + + pub fn display_name(&self) -> String { + if self.is_main { + "default".to_string() } else { self - .0 + .path .strip_prefix('.') - .unwrap_or(&self.0) + .unwrap_or(&self.path) .strip_prefix('/') - .unwrap_or(&self.0) + .unwrap_or(&self.path) .to_string() } } - pub fn as_str(&self) -> &str { - &self.0 - } -} - -impl From for ShortPath { - fn from(value: String) -> Self { - ShortPath(value) + pub fn as_resolve_kind(&self) -> UrlResolveKind { + if self.is_main { + UrlResolveKind::Root + } else { + UrlResolveKind::File(self) + } } } @@ -454,24 +478,26 @@ pub fn generate( .collect::>(); let partitions_by_kind = - partition::partition_nodes_by_kind(&all_doc_nodes, true); + partition::partition_nodes_by_entrypoint(&all_doc_nodes, true); - let all_symbols_render = - pages::render_all_symbols_page(&ctx, partitions_by_kind); + let all_symbols_render = pages::render_all_symbols_page( + &ctx, + partitions_by_kind, + &doc_nodes_by_url, + ); files.insert("./all_symbols.html".to_string(), all_symbols_render); } // Pages for all discovered symbols { for (specifier, doc_nodes) in &doc_nodes_by_url { - let short_path = ctx.url_to_short_path(specifier); + let short_path = ShortPath::new(&ctx, specifier.clone()); let partitions_for_nodes = partition::get_partitions_for_file(&ctx, doc_nodes); let symbol_pages = generate_symbol_pages_for_module( &ctx, - specifier, &short_path, &partitions_for_nodes, doc_nodes, @@ -499,11 +525,8 @@ pub fn generate( Some(short_path.clone()), ); - let file_name = format!( - "{}/~/{}.html", - short_path.as_str(), - symbol_group_ctx.name - ); + let file_name = + format!("{}/~/{}.html", short_path.path, symbol_group_ctx.name); let page_ctx = pages::PageCtx { html_head_ctx, @@ -527,7 +550,7 @@ pub fn generate( .unwrap(); let file_name = - format!("{}/~/{}.html", short_path.as_str(), current_symbol); + format!("{}/~/{}.html", short_path.path, current_symbol); (file_name, symbol_page) } @@ -542,7 +565,7 @@ pub fn generate( Some(short_path.clone()), ); - files.insert(format!("{}/~/index.html", short_path.as_str()), index); + files.insert(format!("{}/~/index.html", short_path.path), index); } } diff --git a/src/html/pages.rs b/src/html/pages.rs index 2f391552..d52165ce 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -20,6 +20,7 @@ use super::SEARCH_INDEX_FILENAME; use super::STYLESHEET_FILENAME; use crate::function::FunctionDef; +use crate::html::jsdoc::markdown_to_html; use crate::html::partition::Partition; use crate::variable::VariableDef; use crate::DocNode; @@ -56,7 +57,7 @@ impl HtmlHeadCtx { ), current_file: current_file .as_ref() - .map(|current_file| current_file.as_str()) + .map(|current_file| &*current_file.path) .unwrap_or_default() .to_string(), stylesheet_url: format!("{root}{STYLESHEET_FILENAME}"), @@ -92,7 +93,9 @@ pub fn render_index( file.as_ref(), ); - let short_path = specifier.map(|specifier| ctx.url_to_short_path(specifier)); + let short_path = specifier + .cloned() + .map(|specifier| ShortPath::new(ctx, specifier)); // will be default on index page with no main entrypoint let default = vec![]; @@ -107,11 +110,10 @@ pub fn render_index( short_path .as_ref() .map_or(UrlResolveKind::Root, UrlResolveKind::File), - specifier, ); - let module_doc = specifier.map(|specifier| { - super::jsdoc::ModuleDocCtx::new(&render_ctx, specifier, doc_nodes_by_url) + let module_doc = short_path.as_ref().map(|short_path| { + super::jsdoc::ModuleDocCtx::new(&render_ctx, short_path, doc_nodes_by_url) }); let root = ctx.href_resolver.resolve_path( @@ -147,13 +149,39 @@ struct AllSymbolsCtx { pub(crate) fn render_all_symbols_page( ctx: &GenerateCtx, - partitions: Partition, + partitions: crate::html::partition::EntrypointPartition, + doc_nodes_by_url: &super::ContextDocNodesByUrl, ) -> String { // TODO(@crowlKats): handle doc_nodes in all symbols page for each symbol - let render_ctx = - RenderContext::new(ctx, &[], UrlResolveKind::AllSymbols, None); + let render_ctx = RenderContext::new(ctx, &[], UrlResolveKind::AllSymbols); - let sections = super::namespace::render_namespace(&render_ctx, partitions); + let sections = super::namespace::render_namespace( + &render_ctx, + partitions + .into_iter() + .map(|(path, nodes)| { + let module_doc_nodes = doc_nodes_by_url.get(&path.specifier).unwrap(); + + let doc = module_doc_nodes + .iter() + .find(|n| n.kind == DocNodeKind::ModuleDoc) + .and_then(|node| node.js_doc.doc.as_ref()) + .and_then(|doc| markdown_to_html(&render_ctx, doc, true, false)) + .map(|markdown| markdown.html); + + let header = crate::html::util::SectionHeaderCtx { + title: path.display_name(), + href: Some(render_ctx.ctx.href_resolver.resolve_path( + render_ctx.get_current_resolve(), + path.as_resolve_kind(), + )), + doc, + }; + + (header, nodes) + }) + .collect(), + ); let html_head_ctx = HtmlHeadCtx::new("./", "All Symbols", ctx.package_name.as_ref(), None); @@ -188,7 +216,6 @@ pub enum SymbolPage { pub fn generate_symbol_pages_for_module( ctx: &GenerateCtx, - current_specifier: &ModuleSpecifier, short_path: &ShortPath, partitions_for_nodes: &Partition, doc_nodes: &[DocNodeWithContext], @@ -308,7 +335,6 @@ pub fn generate_symbol_pages_for_module( doc_nodes, partitions_for_nodes, &name_partitions, - current_specifier, short_path, vec![], ) @@ -319,7 +345,6 @@ fn generate_symbol_pages_inner( doc_nodes_for_module: &[DocNodeWithContext], partitions_for_nodes: &Partition, name_partitions: &Partition, - current_specifier: &ModuleSpecifier, short_path: &ShortPath, namespace_paths: Vec<&str>, ) -> Vec { @@ -343,7 +368,6 @@ fn generate_symbol_pages_inner( let (breadcrumbs_ctx, symbol_group_ctx) = render_symbol_page( ctx, doc_nodes_for_module, - current_specifier, short_path, &namespace_paths, &namespaced_name, @@ -401,7 +425,6 @@ fn generate_symbol_pages_inner( doc_nodes_for_module, partitions_for_nodes, &namespace_name_partitions, - current_specifier, short_path, namespace_paths, ); @@ -423,7 +446,6 @@ pub struct PageCtx { pub fn render_symbol_page( ctx: &GenerateCtx, doc_nodes_for_module: &[DocNodeWithContext], - current_specifier: &ModuleSpecifier, short_path: &ShortPath, namespace_paths: &[&str], namespaced_name: &str, @@ -436,7 +458,6 @@ pub fn render_symbol_page( file: short_path, symbol: namespaced_name, }, - Some(current_specifier), ); if !namespace_paths.is_empty() { render_ctx = render_ctx.with_namespace(namespace_paths.to_vec()) diff --git a/src/html/partition.rs b/src/html/partition.rs index 45a05df3..c22052c5 100644 --- a/src/html/partition.rs +++ b/src/html/partition.rs @@ -1,6 +1,7 @@ use super::DocNodeKindWithDrilldown; use super::DocNodeWithContext; use super::GenerateCtx; +use super::ShortPath; use crate::js_doc::JsDocTag; use crate::DocNodeKind; use indexmap::IndexMap; @@ -224,6 +225,79 @@ pub fn partition_nodes_by_category( .collect() } +pub type EntrypointPartition = IndexMap, Vec>; + +pub fn partition_nodes_by_entrypoint( + doc_nodes: &[DocNodeWithContext], + flatten_namespaces: bool, +) -> EntrypointPartition { + fn partition_nodes_by_entrypoint_inner( + partitions: &mut EntrypointPartition, + doc_nodes: &[DocNodeWithContext], + flatten_namespaces: bool, + ) { + for node in doc_nodes { + if matches!(node.kind, DocNodeKind::ModuleDoc | DocNodeKind::Import) + || node.declaration_kind == crate::node::DeclarationKind::Private + { + continue; + } + + if flatten_namespaces && node.kind == DocNodeKind::Namespace { + let namespace_def = node.namespace_def.as_ref().unwrap(); + let mut namespace = (*node.ns_qualifiers).clone(); + namespace.push(node.get_name().to_string()); + + let ns_qualifiers = Rc::new(namespace); + + partition_nodes_by_entrypoint_inner( + partitions, + &namespace_def + .elements + .iter() + .map(|element| { + let mut child = node.create_child(element.clone()); + child.ns_qualifiers = ns_qualifiers.clone(); + child + }) + .collect::>(), + true, + ) + } + + let entry = partitions.entry(node.origin.clone()).or_default(); + + if !entry + .iter() + .any(|n| n.get_name() == node.get_name() && n.kind == node.kind) + { + entry.push(node.clone()); + } + } + } + + let mut partitions = IndexMap::default(); + + partition_nodes_by_entrypoint_inner( + &mut partitions, + doc_nodes, + flatten_namespaces, + ); + + for (_kind, nodes) in partitions.iter_mut() { + nodes.sort_by_key(|n| n.get_name().to_string()); + } + + partitions + .sorted_by(|key1, _value1, key2, _value2| { + key1 + .is_main + .cmp(&key2.is_main) + .then_with(|| key1.display_name().cmp(&key2.display_name())) + }) + .collect() +} + pub fn get_partitions_for_file( ctx: &GenerateCtx, doc_nodes: &[DocNodeWithContext], diff --git a/src/html/render_context.rs b/src/html/render_context.rs index 9fc048ba..ca68f6f0 100644 --- a/src/html/render_context.rs +++ b/src/html/render_context.rs @@ -17,7 +17,6 @@ pub struct RenderContext<'ctx> { current_imports: Rc>, current_type_params: Rc>, current_resolve: UrlResolveKind<'ctx>, - current_specifier: Option<&'ctx ModuleSpecifier>, /// A vector of parts of the current namespace, eg. `vec!["Deno", "errors"]`. namespace_parts: Rc>, } @@ -27,7 +26,6 @@ impl<'ctx> RenderContext<'ctx> { ctx: &'ctx GenerateCtx<'ctx>, doc_nodes: &[DocNodeWithContext], current_resolve: UrlResolveKind<'ctx>, - current_specifier: Option<&'ctx ModuleSpecifier>, ) -> Self { Self { ctx, @@ -35,7 +33,6 @@ impl<'ctx> RenderContext<'ctx> { current_imports: Rc::new(get_current_imports(doc_nodes)), current_type_params: Default::default(), current_resolve, - current_specifier, namespace_parts: Rc::new(vec![]), } } @@ -69,10 +66,6 @@ impl<'ctx> RenderContext<'ctx> { self.current_resolve } - pub fn get_current_specifier(&self) -> Option<&ModuleSpecifier> { - self.current_specifier - } - pub fn lookup_symbol_href(&self, target_symbol: &str) -> Option { let target_symbol_parts = target_symbol .split('.') @@ -112,7 +105,12 @@ impl<'ctx> RenderContext<'ctx> { .get_current_resolve() .get_file() .cloned() - .unwrap_or_else(|| ShortPath::from(String::from("."))), + .unwrap_or_else(|| { + ShortPath::new( + self.ctx, + self.ctx.main_entrypoint.clone().unwrap(), + ) + }), symbol: target_symbol, }, ), @@ -125,7 +123,7 @@ impl<'ctx> RenderContext<'ctx> { return Some(self.ctx.href_resolver.resolve_path( self.get_current_resolve(), UrlResolveKind::Symbol { - file: &self.ctx.url_to_short_path(&module_specifier), + file: &ShortPath::new(self.ctx, module_specifier), symbol: target_symbol, }, )); @@ -175,7 +173,7 @@ impl<'ctx> RenderContext<'ctx> { ] } UrlResolveKind::File(file) => { - if self.current_specifier == self.ctx.main_entrypoint.as_ref() { + if file.is_main { vec![BreadcrumbCtx { name: index_name, href: "".to_string(), @@ -194,7 +192,7 @@ impl<'ctx> RenderContext<'ctx> { is_first_symbol: false, }, BreadcrumbCtx { - name: file.to_name(), + name: file.display_name(), href: "".to_string(), is_symbol: false, is_first_symbol: false, @@ -213,9 +211,9 @@ impl<'ctx> RenderContext<'ctx> { is_first_symbol: false, }]; - if self.current_specifier != self.ctx.main_entrypoint.as_ref() { + if file.is_main { parts.push(BreadcrumbCtx { - name: file.to_name(), + name: file.display_name(), href: self .ctx .href_resolver @@ -307,12 +305,8 @@ mod test { Some(format!("{src}/{}", symbol.join("."))) } - fn resolve_usage( - &self, - current_specifier: &deno_ast::ModuleSpecifier, - _current_file: Option<&ShortPath>, - ) -> Option { - Some(current_specifier.to_string()) + fn resolve_usage(&self, current_file: &ShortPath) -> Option { + Some(current_file.specifier.to_string()) } fn resolve_source(&self, location: &Location) -> Option { @@ -340,11 +334,10 @@ mod test { }; let doc_nodes = vec![DocNodeWithContext { - origin: Rc::new( - ctx.url_to_short_path( - &ModuleSpecifier::parse("file:///mod.ts").unwrap(), - ), - ), + origin: Rc::new(ShortPath::new( + &ctx, + ModuleSpecifier::parse("file:///mod.ts").unwrap(), + )), ns_qualifiers: Rc::new(vec![]), drilldown_parent_kind: None, kind_with_drilldown: DocNodeKindWithDrilldown::Other(DocNodeKind::Import), @@ -374,22 +367,17 @@ mod test { }]; // globals - let render_ctx = - RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root, None); + let render_ctx = RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root); assert_eq!(render_ctx.lookup_symbol_href("bar").unwrap(), "global$bar"); // imports - let render_ctx = - RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root, None); + let render_ctx = RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root); assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); - let short_path = ShortPath::from("a".to_string()); - let render_ctx = RenderContext::new( - &ctx, - &doc_nodes, - UrlResolveKind::File(&short_path), - None, - ); + let short_path = + ShortPath::new(&ctx, ModuleSpecifier::parse("file:///a").unwrap()); + let render_ctx = + RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::File(&short_path)); assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); } } diff --git a/src/html/search.rs b/src/html/search.rs index a3f47943..dcf34517 100644 --- a/src/html/search.rs +++ b/src/html/search.rs @@ -1,6 +1,6 @@ -use super::ContextDocNodesByUrl; use super::DocNodeWithContext; use super::GenerateCtx; +use super::{ContextDocNodesByUrl, ShortPath}; use crate::node::Location; use crate::DocNodeKind; use deno_ast::ModuleSpecifier; @@ -55,8 +55,10 @@ fn doc_node_into_search_index_nodes( .map(|main_entrypoint| main_entrypoint != &location_url) .unwrap_or(true) { - html_escape::encode_text(&ctx.url_to_short_path(&location_url).to_name()) - .into_owned() + html_escape::encode_text( + &ShortPath::new(ctx, location_url).display_name(), + ) + .into_owned() } else { String::new() }; @@ -65,7 +67,7 @@ fn doc_node_into_search_index_nodes( kind: kinds, name, file: html_escape::encode_double_quoted_attribute( - doc_nodes[0].origin.as_str(), + &doc_nodes[0].origin.path, ) .into_owned(), location, @@ -86,7 +88,7 @@ fn doc_node_into_search_index_nodes( .map(|main_entrypoint| main_entrypoint != &location_url) .unwrap_or(true) { - html_escape::encode_text(&ctx.url_to_short_path(&location_url).to_name()) + html_escape::encode_text(&ShortPath::new(ctx, location_url).display_name()) .into_owned() } else { String::new() @@ -96,7 +98,7 @@ fn doc_node_into_search_index_nodes( kind: kinds, name, file: html_escape::encode_double_quoted_attribute( - doc_nodes[0].origin.as_str(), + &doc_nodes[0].origin.path, ) .into_owned(), location, @@ -130,8 +132,10 @@ fn doc_node_into_search_index_nodes( .map(|main_entrypoint| main_entrypoint != &location_url) .unwrap_or(true) { - html_escape::encode_text(&ctx.url_to_short_path(&location_url).to_name()) - .into_owned() + html_escape::encode_text( + &ShortPath::new(ctx, location_url).display_name(), + ) + .into_owned() } else { String::new() }; @@ -152,7 +156,7 @@ fn doc_node_into_search_index_nodes( kind: kinds, name, file: html_escape::encode_double_quoted_attribute( - doc_nodes[0].origin.as_str(), + &doc_nodes[0].origin.path, ) .into_owned(), location, diff --git a/src/html/sidepanels.rs b/src/html/sidepanels.rs index c2d86859..ebfbadb6 100644 --- a/src/html/sidepanels.rs +++ b/src/html/sidepanels.rs @@ -126,19 +126,13 @@ impl IndexSidepanelCtx { .unwrap_or(true) }) .map(|url| { - let short_path = ctx.url_to_short_path(url); + let short_path = ShortPath::new(&ctx, url.clone()); IndexSidepanelFileCtx { href: ctx.href_resolver.resolve_path( current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), - if ctx.main_entrypoint.is_some() - && ctx.main_entrypoint.as_ref() == Some(url) - { - UrlResolveKind::Root - } else { - UrlResolveKind::File(&short_path) - }, + short_path.as_resolve_kind(), ), - name: short_path.to_name(), + name: short_path.display_name(), active: current_entrypoint .is_some_and(|current_entrypoint| current_entrypoint == url), } diff --git a/src/html/symbols/class.rs b/src/html/symbols/class.rs index fcb048e8..34b12622 100644 --- a/src/html/symbols/class.rs +++ b/src/html/symbols/class.rs @@ -56,47 +56,47 @@ pub(crate) fn render_class( } if !class_items.properties.is_empty() { - sections.push(SectionCtx { - title: "Properties".to_string(), - content: SectionContentCtx::DocEntry(render_class_properties( + sections.push(SectionCtx::new( + "Properties", + SectionContentCtx::DocEntry(render_class_properties( ctx, doc_node.get_name(), class_items.properties, )), - }); + )); } if !class_items.methods.is_empty() { - sections.push(SectionCtx { - title: "Methods".to_string(), - content: SectionContentCtx::DocEntry(render_class_methods( + sections.push(SectionCtx::new( + "Methods", + SectionContentCtx::DocEntry(render_class_methods( ctx, doc_node.get_name(), class_items.methods, )), - }); + )); } if !class_items.static_properties.is_empty() { - sections.push(SectionCtx { - title: "Static Properties".to_string(), - content: SectionContentCtx::DocEntry(render_class_properties( + sections.push(SectionCtx::new( + "Static Properties", + SectionContentCtx::DocEntry(render_class_properties( ctx, doc_node.get_name(), class_items.static_properties, )), - }); + )); } if !class_items.static_methods.is_empty() { - sections.push(SectionCtx { - title: "Static Methods".to_string(), - content: SectionContentCtx::DocEntry(render_class_methods( + sections.push(SectionCtx::new( + "Static Methods", + SectionContentCtx::DocEntry(render_class_methods( ctx, doc_node.get_name(), class_items.static_methods, )), - }) + )); } sections @@ -138,10 +138,10 @@ fn render_constructors( }) .collect::>(); - Some(SectionCtx { - title: "Constructors".to_string(), - content: SectionContentCtx::DocEntry(items), - }) + Some(SectionCtx::new( + "Constructors", + SectionContentCtx::DocEntry(items), + )) } #[derive(Debug, Serialize, Clone)] @@ -186,10 +186,10 @@ fn render_index_signatures( }); } - Some(SectionCtx { - title: "Index Signatures".to_string(), - content: SectionContentCtx::IndexSignature(items), - }) + Some(SectionCtx::new( + "Index Signatures", + SectionContentCtx::IndexSignature(items), + )) } enum PropertyOrMethod { diff --git a/src/html/symbols/enum.rs b/src/html/symbols/enum.rs index 17464c68..4c0f713f 100644 --- a/src/html/symbols/enum.rs +++ b/src/html/symbols/enum.rs @@ -38,8 +38,8 @@ pub(crate) fn render_enum( }) .collect::>(); - vec![SectionCtx { - title: "Members".to_string(), - content: SectionContentCtx::DocEntry(items), - }] + vec![SectionCtx::new( + "Members", + SectionContentCtx::DocEntry(items), + )] } diff --git a/src/html/symbols/function.rs b/src/html/symbols/function.rs index 689e60c0..dc10d6f8 100644 --- a/src/html/symbols/function.rs +++ b/src/html/symbols/function.rs @@ -257,19 +257,19 @@ fn render_single_function( } if !params.is_empty() { - sections.push(SectionCtx { - title: "Parameters".to_string(), - content: SectionContentCtx::DocEntry(params), - }); + sections.push(SectionCtx::new( + "Parameters", + SectionContentCtx::DocEntry(params), + )); } - sections.push(SectionCtx { - title: "Return Type".to_string(), - content: SectionContentCtx::DocEntry( + sections.push(SectionCtx::new( + "Return Type", + SectionContentCtx::DocEntry( render_function_return_type(ctx, function_def, doc_node, overload_id) .map_or_else(Default::default, |doc_entry| vec![doc_entry]), ), - }); + )); SymbolContentCtx { id: format!("{overload_id}_div"), diff --git a/src/html/symbols/interface.rs b/src/html/symbols/interface.rs index 8138dad9..18251ff8 100644 --- a/src/html/symbols/interface.rs +++ b/src/html/symbols/interface.rs @@ -89,10 +89,10 @@ fn render_index_signatures( }); } - Some(SectionCtx { - title: "Index Signatures".to_string(), - content: SectionContentCtx::IndexSignature(items), - }) + Some(SectionCtx::new( + "Index Signatures", + SectionContentCtx::IndexSignature(items), + )) } fn render_call_signatures( @@ -134,10 +134,10 @@ fn render_call_signatures( }) .collect::>(); - Some(SectionCtx { - title: "Call Signatures".to_string(), - content: SectionContentCtx::DocEntry(items), - }) + Some(SectionCtx::new( + "Call Signatures", + SectionContentCtx::DocEntry(items), + )) } fn render_properties( @@ -204,10 +204,10 @@ fn render_properties( }) .collect::>(); - Some(SectionCtx { - title: "Properties".to_string(), - content: SectionContentCtx::DocEntry(items), - }) + Some(SectionCtx::new( + "Properties", + SectionContentCtx::DocEntry(items), + )) } fn render_methods( @@ -265,8 +265,8 @@ fn render_methods( }) .collect::>(); - Some(SectionCtx { - title: "Methods".to_string(), - content: SectionContentCtx::DocEntry(items), - }) + Some(SectionCtx::new( + "Methods", + SectionContentCtx::DocEntry(items), + )) } diff --git a/src/html/symbols/mod.rs b/src/html/symbols/mod.rs index 9773020d..8f370272 100644 --- a/src/html/symbols/mod.rs +++ b/src/html/symbols/mod.rs @@ -288,7 +288,22 @@ impl SymbolInnerCtx { let ns_parts = name.split('.').collect::>(); - namespace::render_namespace(&ctx.with_namespace(ns_parts), partitions) + namespace::render_namespace( + &ctx.with_namespace(ns_parts), + partitions + .into_iter() + .map(|(title, nodes)| { + ( + crate::html::util::SectionHeaderCtx { + title, + href: None, + doc: None, + }, + nodes, + ) + }) + .collect(), + ) } DocNodeKind::ModuleDoc | DocNodeKind::Import => unreachable!(), }; diff --git a/src/html/symbols/namespace.rs b/src/html/symbols/namespace.rs index d6d6e96a..74e7e7b0 100644 --- a/src/html/symbols/namespace.rs +++ b/src/html/symbols/namespace.rs @@ -7,19 +7,19 @@ use std::collections::HashSet; pub fn render_namespace( ctx: &RenderContext, - partitions: super::super::partition::Partition, + partitions: IndexMap>, ) -> Vec { partitions .into_iter() - .map(|(title, doc_nodes)| { - get_namespace_section_render_ctx(ctx, title, doc_nodes) + .map(|(header, doc_nodes)| { + get_namespace_section_render_ctx(ctx, header, doc_nodes) }) .collect() } fn get_namespace_section_render_ctx( ctx: &RenderContext, - title: String, + header: SectionHeaderCtx, doc_nodes: Vec, ) -> SectionCtx { let mut grouped_nodes = IndexMap::new(); @@ -41,7 +41,7 @@ fn get_namespace_section_render_ctx( .collect::>(); SectionCtx { - title, + header, content: SectionContentCtx::NamespaceSection(nodes), } } @@ -86,7 +86,7 @@ impl NamespaceNodeCtx { origin_name: if ctx.ctx.single_file_mode { None } else { - Some(nodes[0].origin.to_name()) + Some(nodes[0].origin.display_name()) }, href: ctx.ctx.href_resolver.resolve_path( current_resolve, diff --git a/src/html/symbols/type_alias.rs b/src/html/symbols/type_alias.rs index 1fc2cb19..afe7b25e 100644 --- a/src/html/symbols/type_alias.rs +++ b/src/html/symbols/type_alias.rs @@ -32,9 +32,9 @@ pub(crate) fn render_type_alias( sections.push(type_params); } - sections.push(SectionCtx { - title: "Definition".to_string(), - content: SectionContentCtx::DocEntry(vec![DocEntryCtx::new( + sections.push(SectionCtx::new( + "Definition", + SectionContentCtx::DocEntry(vec![DocEntryCtx::new( ctx, &id, "", @@ -44,7 +44,7 @@ pub(crate) fn render_type_alias( None, &doc_node.location, )]), - }); + )); sections } diff --git a/src/html/symbols/variable.rs b/src/html/symbols/variable.rs index 75ccbdb6..d2aa2060 100644 --- a/src/html/symbols/variable.rs +++ b/src/html/symbols/variable.rs @@ -16,9 +16,9 @@ pub(crate) fn render_variable( let id = name_to_id("variable", doc_node.get_name()); - vec![SectionCtx { - title: "Type".to_string(), - content: SectionContentCtx::DocEntry(vec![DocEntryCtx::new( + vec![SectionCtx::new( + "Type", + SectionContentCtx::DocEntry(vec![DocEntryCtx::new( ctx, &id, "", @@ -28,5 +28,5 @@ pub(crate) fn render_variable( None, &doc_node.location, )]), - }] + )] } diff --git a/src/html/templates/breadcrumbs.hbs b/src/html/templates/breadcrumbs.hbs index 52462477..6e490a29 100644 --- a/src/html/templates/breadcrumbs.hbs +++ b/src/html/templates/breadcrumbs.hbs @@ -4,11 +4,11 @@
    {{~/if~}} -
  • +
  • {{~#if @last~}} {{~this.name~}} {{~else~}} - + {{~this.name~}} {{~/if~}} diff --git a/src/html/templates/namespace_section.hbs b/src/html/templates/namespace_section.hbs index ffb2f0fb..eb1cf683 100644 --- a/src/html/templates/namespace_section.hbs +++ b/src/html/templates/namespace_section.hbs @@ -1,25 +1,20 @@
    {{~#each this~}}
    -
    - {{~> doc_node_kind_icon this.doc_node_kind_ctx ~}} + {{~> doc_node_kind_icon this.doc_node_kind_ctx ~}} -
    - - {{~this.name~}} - +
    + + {{~this.name~}} + - {{~#if this.origin_name~}} -
    from {{this.origin_name}}
    - {{~/if~}} -
    -
    -
    - {{~#if this.docs~}} - {{{~this.docs~}}} {{! markdown rendering }} - {{~else~}} - No documentation available - {{~/if~}} +
    + {{~#if this.docs~}} + {{{~this.docs~}}} {{! markdown rendering }} + {{~else~}} + No documentation available + {{~/if~}} +
    {{~/each~}} diff --git a/src/html/templates/section.hbs b/src/html/templates/section.hbs index 0b017e11..61c0e504 100644 --- a/src/html/templates/section.hbs +++ b/src/html/templates/section.hbs @@ -1,5 +1,17 @@
    -

    {{title}}

    +
    +

    + {{~#if header.href~}} + {{header.title}} + {{~else~}} + {{header.title}} + {{~/if~}} +

    + + {{~#if header.doc~}} + {{{header.doc}}} {{! markdown }} + {{~/if~}} +
    {{~#if (eq content.kind "namespace_section")~}} {{~> namespace_section content.content ~}} diff --git a/src/html/templates/styles.css b/src/html/templates/styles.css index 1bebd375..578115e3 100644 --- a/src/html/templates/styles.css +++ b/src/html/templates/styles.css @@ -109,44 +109,49 @@ summary::-webkit-details-marker { } .section { - > h2 { - @apply text-xl leading-6 font-semibold py-1 mb-4; + @apply space-y-6; + + > div { + @apply space-y-1; + + > h2 { + @apply text-xl leading-6 font-semibold py-1; + } } } .namespaceSection { - @apply grid grid-cols-1 lg:grid-cols-3 gap-8; + @apply grid grid-cols-1 gap-y-3 lg:grid-cols-4 lg:gap-x-3 lg:gap-y-8; .namespaceItem { - @apply space-y-2; + @apply flex gap-x-2.5; - &[aria-label="deprecated"] { - @apply opacity-60; + .docNodeKindIcon { + @apply w-auto flex-col justify-start; - .namespaceItemTitle a { - @apply line-through decoration-2 decoration-stone-500/70 text-stone-500; + > * + * { + @apply ml-0 -mt-0.5; } } - .namespaceItemTitle { - @apply flex gap-2 items-center; + &[aria-label="deprecated"] { + @apply opacity-60; - > div:last-child { - @apply flex justify-between gap-4 flex-1 min-w-0 items-end overflow-hidden; - - > a { - @apply leading-tight truncate; - } - - > div { - @apply text-xs italic lg:mr-4 text-stone-400 truncate; - } + .namespaceItemContent > a { + @apply line-through decoration-2 decoration-stone-500/70 text-stone-500; } } .namespaceItemContent { - @apply py-1 text-sm leading-5 text-stone-600 markdown_border; - @apply ml-2 !important; + @apply space-y-1.5; + + > a { + @apply inline-block leading-tight truncate font-medium; + } + + > div { + @apply text-sm leading-5 text-stone-600; + } } } } @@ -168,7 +173,7 @@ summary::-webkit-details-marker { } .docNodeKindIcon { - @apply flex justify-end w-[2.125rem] shrink-0; + @apply inline-flex justify-end shrink-0; div { @apply rounded-full size-5 font-medium text-xs leading-5 text-center align-middle shrink-0 select-none font-mono; @@ -243,16 +248,16 @@ summary::-webkit-details-marker { } } +.contextLink { + @apply text-contextLink underline decoration-[1.5px] decoration-contextLink/50 underline-offset-4 hover:decoration-contextLink; +} + .breadcrumbs { @apply whitespace-nowrap inline-flex gap-1 items-center; > li, > ul { @apply py-1 px-2; } - - a { - @apply text-breadcrumb underline decoration-[1.5px] decoration-breadcrumb/50 underline-offset-4 hover:decoration-breadcrumb; - } } .functionOverload { diff --git a/src/html/templates/styles.gen.css b/src/html/templates/styles.gen.css index 5f692e8d..26f3e445 100644 --- a/src/html/templates/styles.gen.css +++ b/src/html/templates/styles.gen.css @@ -1 +1 @@ -.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .mb-4{margin-bottom:1rem}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-2{margin-top:.5rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.ddoc .text-lg{font-size:1.125rem;line-height:1.75rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .font-semibold{font-weight:600}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>h2{margin-bottom:1rem;padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));gap:2rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{grid-template-columns:repeat(3,minmax(0,1fr))}}.ddoc .namespaceSection .namespaceItem>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemTitle a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemTitle{align-items:center;gap:.5rem;display:flex}.ddoc .namespaceSection .namespaceItem .namespaceItemTitle>div:last-child{flex:1;justify-content:space-between;align-items:flex-end;gap:1rem;min-width:0;display:flex;overflow:hidden}.ddoc .namespaceSection .namespaceItem .namespaceItemTitle>div:last-child>a{text-overflow:ellipsis;white-space:nowrap;line-height:1.25;overflow:hidden}.ddoc .namespaceSection .namespaceItem .namespaceItemTitle>div:last-child>div{text-overflow:ellipsis;white-space:nowrap;--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-size:.75rem;font-style:italic;line-height:1rem;overflow:hidden}@media (min-width:1024px){.ddoc .namespaceSection .namespaceItem .namespaceItemTitle>div:last-child>div{margin-right:1rem}}.ddoc .namespaceSection .namespaceItem .namespaceItemContent{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-top:.25rem;padding-bottom:.25rem;padding-left:.625rem;font-size:.875rem;line-height:1.25rem;margin-left:.5rem!important}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;width:2.125rem;display:flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:18rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;justify-content:space-between;align-items:center;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .breadcrumbs a{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .breadcrumbs a:hover{text-decoration-color:#0e6590}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file +.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .mb-4{margin-bottom:1rem}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-2{margin-top:.5rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.ddoc .text-lg{font-size:1.125rem;line-height:1.75rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .font-semibold{font-weight:600}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:1.25;display:inline-block;overflow:hidden}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:18rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;justify-content:space-between;align-items:center;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file diff --git a/src/html/types.rs b/src/html/types.rs index ba659c51..4702c5d3 100644 --- a/src/html/types.rs +++ b/src/html/types.rs @@ -588,8 +588,8 @@ pub(crate) fn render_type_params( items.push(content); } - Some(SectionCtx { - title: "Type Parameters".to_string(), - content: SectionContentCtx::DocEntry(items), - }) + Some(SectionCtx::new( + "Type Parameters", + SectionContentCtx::DocEntry(items), + )) } diff --git a/src/html/usage.rs b/src/html/usage.rs index 65b1f419..c73d850d 100644 --- a/src/html/usage.rs +++ b/src/html/usage.rs @@ -35,7 +35,7 @@ pub fn usage_to_md( let import_symbol = if is_default && doc_nodes[0].get_name() == "default" { file - .to_name() + .display_name() .replace('-', "_") .replace(|c: char| c.is_ascii_alphanumeric(), "") } else { @@ -120,10 +120,10 @@ impl UsagesCtx { ctx: &RenderContext, doc_nodes: &[DocNodeWithContext], ) -> Option { - let url = ctx.ctx.href_resolver.resolve_usage( - ctx.get_current_specifier()?, - ctx.get_current_resolve().get_file(), - )?; + let url = ctx + .ctx + .href_resolver + .resolve_usage(ctx.get_current_resolve().get_file()?)?; if let Some(usage_composer) = &ctx.ctx.usage_composer { let usages = usage_composer(ctx, doc_nodes, url); diff --git a/src/html/util.rs b/src/html/util.rs index 0a526c60..b744d8bc 100644 --- a/src/html/util.rs +++ b/src/html/util.rs @@ -6,7 +6,6 @@ use crate::js_doc::JsDoc; use crate::js_doc::JsDocTag; use crate::DocNodeKind; use deno_ast::swc::ast::Accessibility; -use deno_ast::ModuleSpecifier; use serde::Serialize; use std::collections::HashMap; use std::collections::HashSet; @@ -186,10 +185,10 @@ pub trait HrefResolver { ) -> String { let backs = match current { UrlResolveKind::Symbol { file, .. } | UrlResolveKind::File(file) => "../" - .repeat(if file.as_str() == "." { + .repeat(if file.path == "." { 1 } else { - file.as_str().split('/').count() + 1 + file.path.split('/').count() + 1 }), UrlResolveKind::Root => String::new(), UrlResolveKind::AllSymbols => String::from("./"), @@ -202,10 +201,10 @@ pub trait HrefResolver { file: target_file, symbol: target_symbol, } => { - format!("{backs}./{}/~/{target_symbol}.html", target_file.as_str()) + format!("{backs}./{}/~/{target_symbol}.html", target_file.path) } UrlResolveKind::File(target_file) => { - format!("{backs}./{}/~/index.html", target_file.as_str()) + format!("{backs}./{}/~/index.html", target_file.path) } } } @@ -218,11 +217,7 @@ pub trait HrefResolver { -> Option; /// Resolve the URL used in "usage" blocks. - fn resolve_usage( - &self, - current_specifier: &ModuleSpecifier, - current_file: Option<&ShortPath>, - ) -> Option; + fn resolve_usage(&self, current_file: &ShortPath) -> Option; /// Resolve the URL used in source code link buttons. fn resolve_source(&self, location: &crate::Location) -> Option; @@ -310,12 +305,32 @@ pub enum SectionContentCtx { NamespaceSection(Vec), } +#[derive(Debug, Serialize, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] +pub struct SectionHeaderCtx { + pub title: String, + pub href: Option, + pub doc: Option, +} + #[derive(Debug, Serialize, Clone)] pub struct SectionCtx { - pub title: String, + pub header: SectionHeaderCtx, pub content: SectionContentCtx, } +impl SectionCtx { + pub fn new(title: &'static str, content: SectionContentCtx) -> Self { + Self { + header: SectionHeaderCtx { + title: title.to_string(), + href: None, + doc: None, + }, + content, + } + } +} + #[derive(Debug, Serialize, Clone, Eq, PartialEq, Hash)] #[serde(rename_all = "snake_case", tag = "kind", content = "value")] pub enum Tag { diff --git a/tailwind.config.ts b/tailwind.config.ts index c6b16dcc..20ba6761 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -43,7 +43,7 @@ export default { extend: { colors: { ...extraColors, - "breadcrumb": "#0E6590", + "contextLink": "#0E6590", }, }, }, diff --git a/tests/html_test.rs b/tests/html_test.rs index 923dbad8..2521435a 100644 --- a/tests/html_test.rs +++ b/tests/html_test.rs @@ -58,16 +58,8 @@ impl HrefResolver for EmptyResolver { None } - fn resolve_usage( - &self, - _current_specifier: &ModuleSpecifier, - current_file: Option<&ShortPath>, - ) -> Option { - Some( - current_file - .map(|current_file| current_file.as_str().to_string()) - .unwrap_or_default(), - ) + fn resolve_usage(&self, current_file: &ShortPath) -> Option { + Some(current_file.path.clone()) } fn resolve_source(&self, _location: &deno_doc::Location) -> Option { @@ -276,14 +268,13 @@ async fn symbol_group() { { for (specifier, doc_nodes) in &doc_nodes_by_url { - let short_path = ctx.url_to_short_path(specifier); + let short_path = ShortPath::new(&ctx, specifier.clone()); let partitions_for_nodes = partition::get_partitions_for_file(&ctx, doc_nodes); let symbol_pages = generate_symbol_pages_for_module( &ctx, - specifier, &short_path, &partitions_for_nodes, doc_nodes, @@ -452,16 +443,12 @@ async fn module_doc() { let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); for specifier in &ctx.specifiers { - let short_path = ctx.url_to_short_path(specifier); + let short_path = ShortPath::new(&ctx, specifier.clone()); let doc_nodes = doc_nodes_by_url.get(specifier).unwrap(); - let render_ctx = RenderContext::new( - &ctx, - doc_nodes, - UrlResolveKind::File(&short_path), - Some(specifier), - ); + let render_ctx = + RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(&short_path)); let module_doc = - jsdoc::ModuleDocCtx::new(&render_ctx, specifier, &doc_nodes_by_url); + jsdoc::ModuleDocCtx::new(&render_ctx, &short_path, &doc_nodes_by_url); module_docs.push(module_doc); } diff --git a/tests/testdata/module_doc-syntect.json b/tests/testdata/module_doc-syntect.json index 0015700d..bcc918d6 100644 --- a/tests/testdata/module_doc-syntect.json +++ b/tests/testdata/module_doc-syntect.json @@ -1,6 +1,6 @@ [ { - "title": "main", + "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -17,7 +17,100 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [] + "sections": [ + { + "header": { + "title": "Classes", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Bar.html", + "name": "Bar", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foo.html", + "name": "Foo", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foobar.html", + "name": "Foobar", + "docs": null, + "deprecated": false + } + ] + } + }, + { + "header": { + "title": "Interfaces", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Interface", + "char": "I", + "title": "Interface", + "title_lowercase": "interface", + "title_plural": "Interfaces" + } + ], + "origin_name": null, + "href": "../././~/Hello.html", + "name": "Hello", + "docs": null, + "deprecated": false + } + ] + } + } + ] } }, { @@ -38,33 +131,7 @@ "sections": { "id": "module_doc", "docs": null, - "sections": [ - { - "title": "Functions", - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Function", - "char": "f", - "title": "Function", - "title_lowercase": "function", - "title_plural": "Functions" - } - ], - "origin_name": null, - "href": "../.././foo/~/x.html", - "name": "x", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } } ] diff --git a/tests/testdata/module_doc-tree-sitter.json b/tests/testdata/module_doc-tree-sitter.json index 0f1475b4..3b57c509 100644 --- a/tests/testdata/module_doc-tree-sitter.json +++ b/tests/testdata/module_doc-tree-sitter.json @@ -1,6 +1,6 @@ [ { - "title": "main", + "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -17,7 +17,100 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [] + "sections": [ + { + "header": { + "title": "Classes", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Bar.html", + "name": "Bar", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foo.html", + "name": "Foo", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foobar.html", + "name": "Foobar", + "docs": null, + "deprecated": false + } + ] + } + }, + { + "header": { + "title": "Interfaces", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Interface", + "char": "I", + "title": "Interface", + "title_lowercase": "interface", + "title_plural": "Interfaces" + } + ], + "origin_name": null, + "href": "../././~/Hello.html", + "name": "Hello", + "docs": null, + "deprecated": false + } + ] + } + } + ] } }, { @@ -38,33 +131,7 @@ "sections": { "id": "module_doc", "docs": null, - "sections": [ - { - "title": "Functions", - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Function", - "char": "f", - "title": "Function", - "title_lowercase": "function", - "title_plural": "Functions" - } - ], - "origin_name": null, - "href": "../.././foo/~/x.html", - "name": "x", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } } ] diff --git a/tests/testdata/module_doc.json b/tests/testdata/module_doc.json index b68b24d3..ee54ae31 100644 --- a/tests/testdata/module_doc.json +++ b/tests/testdata/module_doc.json @@ -1,6 +1,6 @@ [ { - "title": "main", + "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -17,7 +17,100 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [] + "sections": [ + { + "header": { + "title": "Classes", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Bar.html", + "name": "Bar", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foo.html", + "name": "Foo", + "docs": null, + "deprecated": false + }, + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Class", + "char": "c", + "title": "Class", + "title_lowercase": "class", + "title_plural": "Classes" + } + ], + "origin_name": null, + "href": "../././~/Foobar.html", + "name": "Foobar", + "docs": null, + "deprecated": false + } + ] + } + }, + { + "header": { + "title": "Interfaces", + "href": null, + "doc": null + }, + "content": { + "kind": "namespace_section", + "content": [ + { + "tags": [], + "doc_node_kind_ctx": [ + { + "kind": "Interface", + "char": "I", + "title": "Interface", + "title_lowercase": "interface", + "title_plural": "Interfaces" + } + ], + "origin_name": null, + "href": "../././~/Hello.html", + "name": "Hello", + "docs": null, + "deprecated": false + } + ] + } + } + ] } }, { @@ -38,33 +131,7 @@ "sections": { "id": "module_doc", "docs": null, - "sections": [ - { - "title": "Functions", - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Function", - "char": "f", - "title": "Function", - "title_lowercase": "function", - "title_plural": "Functions" - } - ], - "origin_name": null, - "href": "../.././foo/~/x.html", - "name": "x", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } } ] diff --git a/tests/testdata/symbol_group-syntect.json b/tests/testdata/symbol_group-syntect.json index 6eeeae37..836249f1 100644 --- a/tests/testdata/symbol_group-syntect.json +++ b/tests/testdata/symbol_group-syntect.json @@ -141,6 +141,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Bar", "href": "../././~/Bar.html", @@ -263,7 +269,11 @@ "docs": "

    some Foo docs

    \n
    ", "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -295,7 +305,11 @@ } }, { - "title": "Static Properties", + "header": { + "title": "Static Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -342,6 +356,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -490,6 +510,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foobar", "href": "../././~/Foobar.html", @@ -606,7 +632,11 @@ "docs": null, "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -653,6 +683,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -768,7 +804,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -815,6 +855,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -936,7 +982,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -983,6 +1033,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1110,7 +1166,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1157,6 +1217,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1284,7 +1350,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1331,6 +1401,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -1416,7 +1492,11 @@ "docs": null, "sections": [ { - "title": "Parameters", + "header": { + "title": "Parameters", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1440,7 +1520,11 @@ } }, { - "title": "Return Type", + "header": { + "title": "Return Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1489,12 +1573,6 @@ "is_symbol": false, "is_first_symbol": false }, - { - "name": "foo", - "href": "../.././foo/~/index.html", - "is_symbol": false, - "is_first_symbol": false - }, { "name": "x", "href": "../.././foo/~/x.html", diff --git a/tests/testdata/symbol_group-tree-sitter.json b/tests/testdata/symbol_group-tree-sitter.json index 253396d8..d0b60f0f 100644 --- a/tests/testdata/symbol_group-tree-sitter.json +++ b/tests/testdata/symbol_group-tree-sitter.json @@ -141,6 +141,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Bar", "href": "../././~/Bar.html", @@ -263,7 +269,11 @@ "docs": "

    some Foo docs

    \n
    ", "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -295,7 +305,11 @@ } }, { - "title": "Static Properties", + "header": { + "title": "Static Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -342,6 +356,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -490,6 +510,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foobar", "href": "../././~/Foobar.html", @@ -606,7 +632,11 @@ "docs": null, "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -653,6 +683,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -768,7 +804,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -815,6 +855,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -936,7 +982,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -983,6 +1033,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1110,7 +1166,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1157,6 +1217,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1284,7 +1350,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1331,6 +1401,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -1416,7 +1492,11 @@ "docs": null, "sections": [ { - "title": "Parameters", + "header": { + "title": "Parameters", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1440,7 +1520,11 @@ } }, { - "title": "Return Type", + "header": { + "title": "Return Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1489,12 +1573,6 @@ "is_symbol": false, "is_first_symbol": false }, - { - "name": "foo", - "href": "../.././foo/~/index.html", - "is_symbol": false, - "is_first_symbol": false - }, { "name": "x", "href": "../.././foo/~/x.html", diff --git a/tests/testdata/symbol_group.json b/tests/testdata/symbol_group.json index 60e62125..43919206 100644 --- a/tests/testdata/symbol_group.json +++ b/tests/testdata/symbol_group.json @@ -141,6 +141,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Bar", "href": "../././~/Bar.html", @@ -263,7 +269,11 @@ "docs": "

    some Foo docs

    \n
    ", "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -295,7 +305,11 @@ } }, { - "title": "Static Properties", + "header": { + "title": "Static Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -342,6 +356,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -490,6 +510,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foobar", "href": "../././~/Foobar.html", @@ -606,7 +632,11 @@ "docs": null, "sections": [ { - "title": "Properties", + "header": { + "title": "Properties", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -653,6 +683,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -768,7 +804,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -815,6 +855,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -936,7 +982,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -983,6 +1033,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1110,7 +1166,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1157,6 +1217,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Foo", "href": "../././~/Foo.html", @@ -1284,7 +1350,11 @@ "docs": null, "sections": [ { - "title": "Type", + "header": { + "title": "Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1331,6 +1401,12 @@ "is_symbol": false, "is_first_symbol": false }, + { + "name": "default", + "href": "../././~/index.html", + "is_symbol": false, + "is_first_symbol": false + }, { "name": "Hello", "href": "../././~/Hello.html", @@ -1416,7 +1492,11 @@ "docs": null, "sections": [ { - "title": "Parameters", + "header": { + "title": "Parameters", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1440,7 +1520,11 @@ } }, { - "title": "Return Type", + "header": { + "title": "Return Type", + "href": null, + "doc": null + }, "content": { "kind": "doc_entry", "content": [ @@ -1489,12 +1573,6 @@ "is_symbol": false, "is_first_symbol": false }, - { - "name": "foo", - "href": "../.././foo/~/index.html", - "is_symbol": false, - "is_first_symbol": false - }, { "name": "x", "href": "../.././foo/~/x.html", From c90e0b0992260f82e36b808834199aeb46166a84 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Mon, 22 Apr 2024 19:39:54 +0200 Subject: [PATCH 02/17] fix --- src/html/jsdoc.rs | 93 +++++++++++++++++++++++++++++++++-------------- src/html/pages.rs | 14 ++++++- 2 files changed, 78 insertions(+), 29 deletions(-) diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index de88c71a..ff9ea23f 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -73,18 +73,20 @@ fn parse_links<'a>(md: &'a str, ctx: &RenderContext) -> Cow<'a, str> { }) } -fn split_markdown_title(md: &str) -> (Option<&str>, &str) { +fn split_markdown_title( + md: &str, + prefer_title: bool, +) -> (Option<&str>, Option<&str>) { let newline = md.find("\n\n").unwrap_or(usize::MAX); let codeblock = md.find("```").unwrap_or(usize::MAX); let index = newline.min(codeblock).min(md.len()); - dbg!(md.split_at(index)); - match md.split_at(index) { - ("", body) => (None, body), - (title, "") => (None, title), - (title, body) => (Some(title), body), + ("", body) => (None, Some(body)), + (title, "") if prefer_title => (Some(title), None), + (title, "") if !prefer_title => (None, Some(title)), + (title, body) => (Some(title), Some(body)), } } @@ -249,11 +251,16 @@ pub struct Markdown { pub toc: Option, } +pub struct MarkdownToHTMLOptions { + pub summary: bool, + pub summary_prefer_title: bool, + pub render_toc: bool, +} + pub fn markdown_to_html( render_ctx: &RenderContext, md: &str, - summary: bool, - render_toc: bool, + render_options: MarkdownToHTMLOptions, ) -> Option { // TODO(bartlomieju): this should be initialized only once let mut options = comrak::Options::default(); @@ -282,8 +289,9 @@ pub fn markdown_to_html( let md = parse_links(md, render_ctx); - let md = if summary { - let (title, _body) = split_markdown_title(&md); + let md = if render_options.summary { + let (title, _body) = + split_markdown_title(&md, render_options.summary_prefer_title); title.unwrap_or_default() } else { md.as_ref() @@ -293,7 +301,7 @@ pub fn markdown_to_html( return None; } - let class_name = if summary { + let class_name = if render_options.summary { "markdown_summary" } else { "markdown" @@ -377,7 +385,7 @@ pub fn markdown_to_html( html = ammonia_builder.clean(&html).to_string(); } - let toc = if render_toc { + let toc = if render_options.render_toc { let toc = heading_adapter.into_toc(); if toc.is_empty() { @@ -423,15 +431,31 @@ pub(crate) fn render_markdown_summary( render_ctx: &RenderContext, md: &str, ) -> String { - markdown_to_html(render_ctx, md, true, false) - .unwrap_or_default() - .html + markdown_to_html( + render_ctx, + md, + MarkdownToHTMLOptions { + summary: true, + summary_prefer_title: false, + render_toc: false, + }, + ) + .unwrap_or_default() + .html } pub(crate) fn render_markdown(render_ctx: &RenderContext, md: &str) -> String { - markdown_to_html(render_ctx, md, false, false) - .unwrap_or_default() - .html + markdown_to_html( + render_ctx, + md, + MarkdownToHTMLOptions { + summary: false, + summary_prefer_title: false, + render_toc: false, + }, + ) + .unwrap_or_default() + .html } pub(crate) fn jsdoc_body_to_html( @@ -440,7 +464,16 @@ pub(crate) fn jsdoc_body_to_html( summary: bool, ) -> Option { if let Some(doc) = js_doc.doc.as_deref() { - markdown_to_html(ctx, doc, summary, false).map(|markdown| markdown.html) + markdown_to_html( + ctx, + doc, + MarkdownToHTMLOptions { + summary, + summary_prefer_title: false, + render_toc: false, + }, + ) + .map(|markdown| markdown.html) } else { None } @@ -488,7 +521,7 @@ impl ExampleCtx { pub fn new(render_ctx: &RenderContext, example: &str, i: usize) -> Self { let id = name_to_id("example", &i.to_string()); - let (maybe_title, body) = split_markdown_title(example); + let (maybe_title, body) = split_markdown_title(example, false); let title = if let Some(title) = maybe_title { title.to_string() } else { @@ -496,7 +529,7 @@ impl ExampleCtx { }; let markdown_title = render_markdown_summary(render_ctx, &title); - let markdown_body = render_markdown(render_ctx, body); + let markdown_body = render_markdown(render_ctx, body.unwrap_or_default()); ExampleCtx { anchor: AnchorCtx { id: id.to_string() }, @@ -548,12 +581,18 @@ impl ModuleDocCtx { sections.push(examples); } - let (html, toc) = if let Some(markdown) = node - .js_doc - .doc - .as_ref() - .and_then(|doc| markdown_to_html(render_ctx, doc, false, true)) - { + let (html, toc) = if let Some(markdown) = + node.js_doc.doc.as_ref().and_then(|doc| { + markdown_to_html( + render_ctx, + doc, + MarkdownToHTMLOptions { + summary: false, + summary_prefer_title: false, + render_toc: true, + }, + ) + }) { (Some(markdown.html), markdown.toc) } else { (None, None) diff --git a/src/html/pages.rs b/src/html/pages.rs index d52165ce..e5c4e80a 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -20,7 +20,7 @@ use super::SEARCH_INDEX_FILENAME; use super::STYLESHEET_FILENAME; use crate::function::FunctionDef; -use crate::html::jsdoc::markdown_to_html; +use crate::html::jsdoc::{markdown_to_html, MarkdownToHTMLOptions}; use crate::html::partition::Partition; use crate::variable::VariableDef; use crate::DocNode; @@ -166,7 +166,17 @@ pub(crate) fn render_all_symbols_page( .iter() .find(|n| n.kind == DocNodeKind::ModuleDoc) .and_then(|node| node.js_doc.doc.as_ref()) - .and_then(|doc| markdown_to_html(&render_ctx, doc, true, false)) + .and_then(|doc| { + markdown_to_html( + &render_ctx, + doc, + MarkdownToHTMLOptions { + summary: true, + summary_prefer_title: true, + render_toc: false, + }, + ) + }) .map(|markdown| markdown.html); let header = crate::html::util::SectionHeaderCtx { From be5f97d9f68abf4618d9cc889f4f88b2e16c4cd9 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Mon, 22 Apr 2024 19:40:52 +0200 Subject: [PATCH 03/17] fix --- src/html/pages.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/html/pages.rs b/src/html/pages.rs index e5c4e80a..0481d735 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -20,7 +20,8 @@ use super::SEARCH_INDEX_FILENAME; use super::STYLESHEET_FILENAME; use crate::function::FunctionDef; -use crate::html::jsdoc::{markdown_to_html, MarkdownToHTMLOptions}; +use crate::html::jsdoc::markdown_to_html; +use crate::html::jsdoc::MarkdownToHTMLOptions; use crate::html::partition::Partition; use crate::variable::VariableDef; use crate::DocNode; From 6f2d730f23342b0659607091fca50ea452120dba Mon Sep 17 00:00:00 2001 From: crowlkats Date: Mon, 22 Apr 2024 19:55:01 +0200 Subject: [PATCH 04/17] lint --- src/html/sidepanels.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/sidepanels.rs b/src/html/sidepanels.rs index ebfbadb6..ed253a53 100644 --- a/src/html/sidepanels.rs +++ b/src/html/sidepanels.rs @@ -126,7 +126,7 @@ impl IndexSidepanelCtx { .unwrap_or(true) }) .map(|url| { - let short_path = ShortPath::new(&ctx, url.clone()); + let short_path = ShortPath::new(ctx, url.clone()); IndexSidepanelFileCtx { href: ctx.href_resolver.resolve_path( current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), From c7f1b58264618a5bb3d5beac4b01ce392263f454 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Mon, 22 Apr 2024 21:51:39 +0200 Subject: [PATCH 05/17] cleanup --- examples/ddoc/main.rs | 1 - src/html/jsdoc.rs | 8 -------- src/html/mod.rs | 3 --- src/html/render_context.rs | 1 - src/html/templates/module_doc.hbs | 5 ----- tests/html_test.rs | 5 ----- tests/testdata/module_doc-syntect.json | 2 -- tests/testdata/module_doc-tree-sitter.json | 2 -- tests/testdata/module_doc.json | 2 -- 9 files changed, 29 deletions(-) diff --git a/examples/ddoc/main.rs b/examples/ddoc/main.rs index 350f6359..87a42b6c 100644 --- a/examples/ddoc/main.rs +++ b/examples/ddoc/main.rs @@ -215,7 +215,6 @@ fn generate_docs_directory( href_resolver: Rc::new(EmptyResolver()), usage_composer: None, rewrite_map: Some(index_map), - hide_module_doc_title: false, sidebar_flatten_namespaces: false, }; let html = deno_doc::html::generate(options.clone(), doc_nodes_by_url)?; diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index ff9ea23f..4c3d76f6 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -542,7 +542,6 @@ impl ExampleCtx { #[derive(Debug, Serialize, Clone, Default)] pub struct ModuleDocCtx { - pub title: Option, pub deprecated: Option, pub usages: Option, pub toc: Option, @@ -557,12 +556,6 @@ impl ModuleDocCtx { ) -> Self { let module_doc_nodes = doc_nodes_by_url.get(&short_path.specifier).unwrap(); - let title = if !render_ctx.ctx.hide_module_doc_title { - Some(short_path.display_name()) - } else { - None - }; - let mut sections = Vec::with_capacity(7); let (deprecated, html, toc) = if let Some(node) = module_doc_nodes @@ -626,7 +619,6 @@ impl ModuleDocCtx { } Self { - title, deprecated, usages: UsagesCtx::new(render_ctx, &[]), toc, diff --git a/src/html/mod.rs b/src/html/mod.rs index 3b0ed6e6..2fe0ff3f 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -82,7 +82,6 @@ pub struct GenerateOptions { pub href_resolver: Rc, pub usage_composer: Option, pub rewrite_map: Option>, - pub hide_module_doc_title: bool, pub sidebar_flatten_namespaces: bool, } @@ -98,7 +97,6 @@ pub struct GenerateCtx<'ctx> { pub href_resolver: Rc, pub usage_composer: Option, pub rewrite_map: Option>, - pub hide_module_doc_title: bool, pub single_file_mode: bool, pub sidebar_hide_all_symbols: bool, pub sidebar_flatten_namespaces: bool, @@ -445,7 +443,6 @@ pub fn generate( href_resolver: options.href_resolver, usage_composer: options.usage_composer, rewrite_map: options.rewrite_map, - hide_module_doc_title: options.hide_module_doc_title, single_file_mode: doc_nodes_by_url.len() == 1, sidebar_hide_all_symbols: false, sidebar_flatten_namespaces: options.sidebar_flatten_namespaces, diff --git a/src/html/render_context.rs b/src/html/render_context.rs index ca68f6f0..2b57d8aa 100644 --- a/src/html/render_context.rs +++ b/src/html/render_context.rs @@ -327,7 +327,6 @@ mod test { href_resolver: Rc::new(TestResolver()), usage_composer: None, rewrite_map: None, - hide_module_doc_title: false, single_file_mode: false, sidebar_hide_all_symbols: false, sidebar_flatten_namespaces: false, diff --git a/src/html/templates/module_doc.hbs b/src/html/templates/module_doc.hbs index 0f4907e3..598bfd5b 100644 --- a/src/html/templates/module_doc.hbs +++ b/src/html/templates/module_doc.hbs @@ -1,10 +1,5 @@
    - {{~#if title~}} -

    {{title}}

    -
    - {{~/if~}} - {{~> deprecated deprecated ~}} {{~#if usages~}} diff --git a/tests/html_test.rs b/tests/html_test.rs index 2521435a..e298535f 100644 --- a/tests/html_test.rs +++ b/tests/html_test.rs @@ -129,7 +129,6 @@ async fn html_doc_files() { href_resolver: Rc::new(EmptyResolver {}), usage_composer: None, rewrite_map: None, - hide_module_doc_title: false, sidebar_flatten_namespaces: false, }, get_files("single").await, @@ -185,7 +184,6 @@ async fn html_doc_files_rewrite() { href_resolver: Rc::new(EmptyResolver {}), usage_composer: None, rewrite_map: Some(rewrite_map), - hide_module_doc_title: false, sidebar_flatten_namespaces: false, }, get_files("multiple").await, @@ -257,7 +255,6 @@ async fn symbol_group() { href_resolver: Rc::new(EmptyResolver {}), usage_composer: None, rewrite_map: Some(rewrite_map), - hide_module_doc_title: false, single_file_mode: false, sidebar_hide_all_symbols: false, sidebar_flatten_namespaces: false, @@ -373,7 +370,6 @@ async fn symbol_search() { href_resolver: Rc::new(EmptyResolver {}), usage_composer: None, rewrite_map: Some(rewrite_map), - hide_module_doc_title: false, single_file_mode: false, sidebar_hide_all_symbols: false, sidebar_flatten_namespaces: false, @@ -433,7 +429,6 @@ async fn module_doc() { href_resolver: Rc::new(EmptyResolver {}), usage_composer: None, rewrite_map: Some(rewrite_map), - hide_module_doc_title: false, single_file_mode: true, sidebar_hide_all_symbols: false, sidebar_flatten_namespaces: false, diff --git a/tests/testdata/module_doc-syntect.json b/tests/testdata/module_doc-syntect.json index bcc918d6..6f5e247a 100644 --- a/tests/testdata/module_doc-syntect.json +++ b/tests/testdata/module_doc-syntect.json @@ -1,6 +1,5 @@ [ { - "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -114,7 +113,6 @@ } }, { - "title": "foo", "deprecated": null, "usages": { "show_tabs": false, diff --git a/tests/testdata/module_doc-tree-sitter.json b/tests/testdata/module_doc-tree-sitter.json index 3b57c509..240dd5e7 100644 --- a/tests/testdata/module_doc-tree-sitter.json +++ b/tests/testdata/module_doc-tree-sitter.json @@ -1,6 +1,5 @@ [ { - "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -114,7 +113,6 @@ } }, { - "title": "foo", "deprecated": null, "usages": { "show_tabs": false, diff --git a/tests/testdata/module_doc.json b/tests/testdata/module_doc.json index ee54ae31..6c787e42 100644 --- a/tests/testdata/module_doc.json +++ b/tests/testdata/module_doc.json @@ -1,6 +1,5 @@ [ { - "title": "default", "deprecated": null, "usages": { "show_tabs": false, @@ -114,7 +113,6 @@ } }, { - "title": "foo", "deprecated": null, "usages": { "show_tabs": false, From d766b1da18d2bd36cd3f830ed066a97ae6f3ed5e Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 00:30:45 +0200 Subject: [PATCH 06/17] fixes --- src/html/mod.rs | 10 ++--- src/html/pages.rs | 101 ++++++++++++++++++++++++++-------------------- 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/html/mod.rs b/src/html/mod.rs index ca7449d7..4344040e 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -483,7 +483,6 @@ pub fn generate( href_resolver: options.href_resolver, usage_composer: options.usage_composer, rewrite_map: options.rewrite_map, - hide_module_doc_title: file_mode == FileMode::SingleDts, sidebar_hide_all_symbols: file_mode == FileMode::SingleDts, file_mode, }; @@ -550,7 +549,8 @@ pub fn generate( let partitions_by_kind = partition::partition_nodes_by_entrypoint(&all_doc_nodes, true); - let all_symbols = pages::AllSymbolsCtx::new(&ctx, partitions_by_kind, &doc_nodes_by_url); + let all_symbols = + pages::AllSymbolsCtx::new(&ctx, partitions_by_kind, &doc_nodes_by_url); if options.composable_output { files.insert( @@ -627,7 +627,8 @@ pub fn generate( ctx.render(SymbolGroupCtx::TEMPLATE, &symbol_group_ctx), ), ] - } else {let file_name = + } else { + let file_name = format!("{}/~/{}.html", short_path.path, symbol_group_ctx.name); let page_ctx = pages::SymbolPageCtx { @@ -652,8 +653,7 @@ pub fn generate( if options.composable_output { let file_name = format!( "{}/~/{}/redirect.json", - short_path.path, - current_symbol + short_path.path, current_symbol ); vec![(file_name, serde_json::to_string(&redirect).unwrap())] diff --git a/src/html/pages.rs b/src/html/pages.rs index c2890606..3fd02f19 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -3,6 +3,7 @@ use super::sidepanels::SidepanelCtx; use super::symbols::SymbolContentCtx; use super::util::qualify_drilldown_name; use super::util::BreadcrumbsCtx; +use super::util::SectionHeaderCtx; use super::DocNodeKindWithDrilldown; use super::DocNodeWithContext; use super::FileMode; @@ -93,10 +94,9 @@ impl IndexCtx { partitions: Partition, file: Option, ) -> Self { - let short_path = - specifier - .cloned() - .map(|specifier| ShortPath::new(ctx, specifier)); + let short_path = specifier + .cloned() + .map(|specifier| ShortPath::new(ctx, specifier)); // will be default on index page with no main entrypoint let default = vec![]; @@ -105,13 +105,13 @@ impl IndexCtx { .and_then(|specifier| doc_nodes_by_url.get(specifier)) .unwrap_or(&default); - let render_ctx = RenderContext::new( - ctx, - doc_nodes, - short_path - .as_ref() - .map_or(UrlResolveKind::Root, UrlResolveKind::File), - ); + let render_ctx = RenderContext::new( + ctx, + doc_nodes, + short_path + .as_ref() + .map_or(UrlResolveKind::Root, UrlResolveKind::File), + ); let module_doc = short_path.as_ref().map(|short_path| { super::jsdoc::ModuleDocCtx::new(&render_ctx, short_path, doc_nodes_by_url) @@ -128,8 +128,23 @@ impl IndexCtx { HtmlHeadCtx::new(&root, "Index", ctx.package_name.as_ref(), None); let all_symbols = if ctx.file_mode == FileMode::SingleDts { - let sections = - super::namespace::render_namespace(&render_ctx, partitions.clone()); + let sections = super::namespace::render_namespace( + &render_ctx, + partitions + .clone() + .into_iter() + .map(|(title, nodes)| { + ( + SectionHeaderCtx { + title, + href: None, + doc: None, + }, + nodes, + ) + }) + .collect(), + ); Some(SymbolContentCtx { id: String::new(), @@ -183,36 +198,36 @@ impl AllSymbolsCtx { .map(|(path, nodes)| { let module_doc_nodes = doc_nodes_by_url.get(&path.specifier).unwrap(); - let doc = module_doc_nodes - .iter() - .find(|n| n.kind == DocNodeKind::ModuleDoc) - .and_then(|node| node.js_doc.doc.as_ref()) - .and_then(|doc| { - markdown_to_html( - &render_ctx, - doc, - MarkdownToHTMLOptions { - summary: true, - summary_prefer_title: true, - render_toc: false, - }, - ) - }) - .map(|markdown| markdown.html); - - let header = crate::html::util::SectionHeaderCtx { - title: path.display_name(), - href: Some(render_ctx.ctx.href_resolver.resolve_path( - render_ctx.get_current_resolve(), - path.as_resolve_kind(), - )), - doc, - }; - - (header, nodes) - }) - .collect(), - ); + let doc = module_doc_nodes + .iter() + .find(|n| n.kind == DocNodeKind::ModuleDoc) + .and_then(|node| node.js_doc.doc.as_ref()) + .and_then(|doc| { + markdown_to_html( + &render_ctx, + doc, + MarkdownToHTMLOptions { + summary: true, + summary_prefer_title: true, + render_toc: false, + }, + ) + }) + .map(|markdown| markdown.html); + + let header = crate::html::util::SectionHeaderCtx { + title: path.display_name(), + href: Some(render_ctx.ctx.href_resolver.resolve_path( + render_ctx.get_current_resolve(), + path.as_resolve_kind(), + )), + doc, + }; + + (header, nodes) + }) + .collect(), + ); let html_head_ctx = HtmlHeadCtx::new("./", "All Symbols", ctx.package_name.as_ref(), None); From e3677809a232742ab28287d1862e63d2538b6d81 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 02:54:36 +0200 Subject: [PATCH 07/17] simplify modulespecifier and shortpath usages --- examples/ddoc/main.rs | 2 +- src/html/jsdoc.rs | 4 +-- src/html/mod.rs | 53 ++++++++++++++++++++++---------------- src/html/pages.rs | 40 ++++++++++++----------------- src/html/partition.rs | 16 ------------ src/html/search.rs | 7 ++--- src/html/sidepanels.rs | 58 +++++++++++++++++++++--------------------- tests/html_test.rs | 16 +++++------- 8 files changed, 89 insertions(+), 107 deletions(-) diff --git a/examples/ddoc/main.rs b/examples/ddoc/main.rs index ccd97c7e..0a344f57 100644 --- a/examples/ddoc/main.rs +++ b/examples/ddoc/main.rs @@ -224,7 +224,7 @@ fn generate_docs_directory( href_resolver: Rc::new(EmptyResolver()), usage_composer: None, rewrite_map: Some(index_map), - composable_output: true, + composable_output: false, }; let html = deno_doc::html::generate(options, doc_nodes_by_url)?; diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index d917b80a..eed80f0c 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -556,9 +556,9 @@ impl ModuleDocCtx { pub fn new( render_ctx: &RenderContext, short_path: &ShortPath, - doc_nodes_by_url: &super::ContextDocNodesByUrl, + doc_nodes_by_url: &super::ContextDocNodesByShortPath, ) -> Self { - let module_doc_nodes = doc_nodes_by_url.get(&short_path.specifier).unwrap(); + let module_doc_nodes = doc_nodes_by_url.get(short_path).unwrap(); let mut sections = Vec::with_capacity(7); diff --git a/src/html/mod.rs b/src/html/mod.rs index 4344040e..62f0da65 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -25,6 +25,7 @@ mod usage; mod util; use crate::html::pages::SymbolPage; +use crate::html::partition::get_partitions_for_file; pub use pages::generate_symbol_pages_for_module; pub use render_context::RenderContext; pub use search::generate_search_index; @@ -106,11 +107,11 @@ impl<'ctx> GenerateCtx<'ctx> { pub fn doc_nodes_by_url_add_context( &self, doc_nodes_by_url: IndexMap>, - ) -> ContextDocNodesByUrl { + ) -> ContextDocNodesByShortPath { doc_nodes_by_url .into_iter() .map(|(specifier, nodes)| { - let short_path = Rc::new(ShortPath::new(self, specifier.clone())); + let short_path = Rc::new(ShortPath::new(self, specifier)); let nodes = nodes .into_iter() @@ -123,7 +124,7 @@ impl<'ctx> GenerateCtx<'ctx> { }) .collect::>(); - (specifier, nodes) + (short_path, nodes) }) .collect::>() } @@ -137,8 +138,8 @@ impl<'ctx> GenerateCtx<'ctx> { } } -pub type ContextDocNodesByUrl = - IndexMap>; +pub type ContextDocNodesByShortPath = + IndexMap, Vec>; #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] pub struct ShortPath { @@ -488,19 +489,27 @@ pub fn generate( }; let mut files = HashMap::new(); - let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); + let doc_nodes_by_short_path = + ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); // Index page { + let main_entrypoint = doc_nodes_by_short_path + .iter() + .find(|(short_path, _)| short_path.is_main); + let partitions_for_entrypoint_nodes = - partition::get_partitions_for_main_entrypoint(&ctx, &doc_nodes_by_url); + if let Some((_, doc_nodes)) = main_entrypoint { + get_partitions_for_file(&ctx, doc_nodes) + } else { + Default::default() + }; let index = pages::IndexCtx::new( &ctx, - ctx.main_entrypoint.as_ref(), - &doc_nodes_by_url, + main_entrypoint.map(|(short_path, _)| short_path.clone()), + &doc_nodes_by_short_path, partitions_for_entrypoint_nodes, - None, ); if options.composable_output { @@ -540,7 +549,7 @@ pub fn generate( // All symbols (list of all symbols in all files) if ctx.file_mode != FileMode::SingleDts { - let all_doc_nodes = doc_nodes_by_url + let all_doc_nodes = doc_nodes_by_short_path .values() .flatten() .cloned() @@ -549,8 +558,11 @@ pub fn generate( let partitions_by_kind = partition::partition_nodes_by_entrypoint(&all_doc_nodes, true); - let all_symbols = - pages::AllSymbolsCtx::new(&ctx, partitions_by_kind, &doc_nodes_by_url); + let all_symbols = pages::AllSymbolsCtx::new( + &ctx, + partitions_by_kind, + &doc_nodes_by_short_path, + ); if options.composable_output { files.insert( @@ -573,15 +585,13 @@ pub fn generate( // Pages for all discovered symbols { - for (specifier, doc_nodes) in &doc_nodes_by_url { - let short_path = ShortPath::new(&ctx, specifier.clone()); - + for (short_path, doc_nodes) in &doc_nodes_by_short_path { let partitions_for_nodes = partition::get_partitions_for_file(&ctx, doc_nodes); let symbol_pages = generate_symbol_pages_for_module( &ctx, - &short_path, + short_path, &partitions_for_nodes, doc_nodes, ); @@ -605,7 +615,7 @@ pub fn generate( &root, &symbol_group_ctx.name, ctx.package_name.as_ref(), - Some(short_path.clone()), + Some(short_path), ); if options.composable_output { @@ -669,10 +679,9 @@ pub fn generate( let index = pages::IndexCtx::new( &ctx, - Some(specifier), - &doc_nodes_by_url, - partitions_for_nodes, Some(short_path.clone()), + &doc_nodes_by_short_path, + partitions_for_nodes, ); if options.composable_output { @@ -717,7 +726,7 @@ pub fn generate( files.insert(STYLESHEET_FILENAME.into(), STYLESHEET.into()); files.insert( SEARCH_INDEX_FILENAME.into(), - search::get_search_index_file(&ctx, &doc_nodes_by_url)?, + search::get_search_index_file(&ctx, &doc_nodes_by_short_path)?, ); files.insert(SCRIPT_FILENAME.into(), SCRIPT_JS.into()); diff --git a/src/html/pages.rs b/src/html/pages.rs index 3fd02f19..c1993fcb 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -3,7 +3,6 @@ use super::sidepanels::SidepanelCtx; use super::symbols::SymbolContentCtx; use super::util::qualify_drilldown_name; use super::util::BreadcrumbsCtx; -use super::util::SectionHeaderCtx; use super::DocNodeKindWithDrilldown; use super::DocNodeWithContext; use super::FileMode; @@ -28,7 +27,6 @@ use crate::html::partition::Partition; use crate::variable::VariableDef; use crate::DocNode; use crate::DocNodeKind; -use deno_ast::ModuleSpecifier; use indexmap::IndexMap; use serde::Serialize; @@ -51,7 +49,7 @@ impl HtmlHeadCtx { root: &str, page: &str, package_name: Option<&String>, - current_file: Option, + current_file: Option<&ShortPath>, ) -> Self { Self { title: format!( @@ -61,7 +59,6 @@ impl HtmlHeadCtx { .unwrap_or_default() ), current_file: current_file - .as_ref() .map(|current_file| &*current_file.path) .unwrap_or_default() .to_string(), @@ -87,30 +84,26 @@ pub struct IndexCtx { impl IndexCtx { pub const TEMPLATE: &'static str = "pages/index"; + /// short_path is None in case there this is a root index page but there is no main entrypoint pub fn new( ctx: &GenerateCtx, - specifier: Option<&ModuleSpecifier>, - doc_nodes_by_url: &super::ContextDocNodesByUrl, + short_path: Option>, + doc_nodes_by_url: &super::ContextDocNodesByShortPath, partitions: Partition, - file: Option, ) -> Self { - let short_path = specifier - .cloned() - .map(|specifier| ShortPath::new(ctx, specifier)); - // will be default on index page with no main entrypoint let default = vec![]; - let doc_nodes = specifier - .or(ctx.main_entrypoint.as_ref()) - .and_then(|specifier| doc_nodes_by_url.get(specifier)) + let doc_nodes = short_path + .as_ref() + .and_then(|short_path| doc_nodes_by_url.get(short_path)) .unwrap_or(&default); let render_ctx = RenderContext::new( ctx, doc_nodes, short_path - .as_ref() - .map_or(UrlResolveKind::Root, UrlResolveKind::File), + .as_deref() + .map_or(UrlResolveKind::Root, ShortPath::as_resolve_kind), ); let module_doc = short_path.as_ref().map(|short_path| { @@ -118,9 +111,9 @@ impl IndexCtx { }); let root = ctx.href_resolver.resolve_path( - file - .as_ref() - .map_or(UrlResolveKind::Root, UrlResolveKind::File), + short_path + .as_deref() + .map_or(UrlResolveKind::Root, ShortPath::as_resolve_kind), UrlResolveKind::Root, ); @@ -135,7 +128,7 @@ impl IndexCtx { .into_iter() .map(|(title, nodes)| { ( - SectionHeaderCtx { + crate::html::util::SectionHeaderCtx { title, href: None, doc: None, @@ -157,10 +150,9 @@ impl IndexCtx { let sidepanel_ctx = sidepanels::IndexSidepanelCtx::new( ctx, - specifier, + short_path.clone(), doc_nodes_by_url, partitions, - file.as_ref(), ); IndexCtx { @@ -186,7 +178,7 @@ impl AllSymbolsCtx { pub fn new( ctx: &GenerateCtx, partitions: crate::html::partition::EntrypointPartition, - doc_nodes_by_url: &super::ContextDocNodesByUrl, + doc_nodes_by_url: &super::ContextDocNodesByShortPath, ) -> Self { // TODO(@crowlKats): handle doc_nodes in all symbols page for each symbol let render_ctx = RenderContext::new(ctx, &[], UrlResolveKind::AllSymbols); @@ -196,7 +188,7 @@ impl AllSymbolsCtx { partitions .into_iter() .map(|(path, nodes)| { - let module_doc_nodes = doc_nodes_by_url.get(&path.specifier).unwrap(); + let module_doc_nodes = doc_nodes_by_url.get(&path).unwrap(); let doc = module_doc_nodes .iter() diff --git a/src/html/partition.rs b/src/html/partition.rs index 88f00924..03d44a75 100644 --- a/src/html/partition.rs +++ b/src/html/partition.rs @@ -318,19 +318,3 @@ pub fn get_partitions_for_file( categories } } - -pub fn get_partitions_for_main_entrypoint( - ctx: &GenerateCtx, - doc_nodes_by_url: &super::ContextDocNodesByUrl, -) -> Partition { - let doc_nodes = ctx - .main_entrypoint - .as_ref() - .and_then(|main_entrypoint| doc_nodes_by_url.get(main_entrypoint)); - - if let Some(doc_nodes) = doc_nodes { - get_partitions_for_file(ctx, doc_nodes) - } else { - Default::default() - } -} diff --git a/src/html/search.rs b/src/html/search.rs index dcf34517..e27ef42a 100644 --- a/src/html/search.rs +++ b/src/html/search.rs @@ -1,6 +1,7 @@ +use super::ContextDocNodesByShortPath; use super::DocNodeWithContext; use super::GenerateCtx; -use super::{ContextDocNodesByUrl, ShortPath}; +use super::ShortPath; use crate::node::Location; use crate::DocNodeKind; use deno_ast::ModuleSpecifier; @@ -184,7 +185,7 @@ fn doc_node_into_search_index_nodes( pub fn generate_search_index( ctx: &GenerateCtx, - doc_nodes_by_url: &ContextDocNodesByUrl, + doc_nodes_by_url: &ContextDocNodesByShortPath, ) -> serde_json::Value { let doc_nodes = doc_nodes_by_url.values().flatten().collect::>(); @@ -225,7 +226,7 @@ pub fn generate_search_index( pub(crate) fn get_search_index_file( ctx: &GenerateCtx, - doc_nodes_by_url: &ContextDocNodesByUrl, + doc_nodes_by_url: &ContextDocNodesByShortPath, ) -> Result { let search_index = generate_search_index(ctx, doc_nodes_by_url); let search_index_str = serde_json::to_string(&search_index)?; diff --git a/src/html/sidepanels.rs b/src/html/sidepanels.rs index 2a00fd0d..75f1ecd5 100644 --- a/src/html/sidepanels.rs +++ b/src/html/sidepanels.rs @@ -4,9 +4,9 @@ use super::DocNodeWithContext; use super::GenerateCtx; use super::ShortPath; use super::UrlResolveKind; -use deno_ast::ModuleSpecifier; use indexmap::IndexMap; use serde::Serialize; +use std::rc::Rc; #[derive(Debug, Serialize, Clone)] struct SidepanelPartitionSymbolCtx { @@ -121,31 +121,33 @@ impl IndexSidepanelCtx { pub fn new( ctx: &GenerateCtx, - current_entrypoint: Option<&ModuleSpecifier>, - doc_nodes_by_url: &super::ContextDocNodesByUrl, + current_file: Option>, + doc_nodes_by_url: &super::ContextDocNodesByShortPath, partitions: Partition, - current_file: Option<&ShortPath>, ) -> Self { + let current_resolve_kind = current_file + .as_deref() + .map_or(UrlResolveKind::Root, ShortPath::as_resolve_kind); + + let main_short_path = doc_nodes_by_url + .keys() + .find(|short_path| short_path.is_main); + let files = doc_nodes_by_url .keys() - .filter(|url| { - ctx - .main_entrypoint - .as_ref() - .map(|main_entrypoint| *url != main_entrypoint) + .filter(|short_path| { + main_short_path + .map(|main_short_path| short_path != &main_short_path) .unwrap_or(true) }) - .map(|url| { - let short_path = ShortPath::new(ctx, url.clone()); - IndexSidepanelFileCtx { - href: ctx.href_resolver.resolve_path( - current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), - short_path.as_resolve_kind(), - ), - name: short_path.display_name(), - active: current_entrypoint - .is_some_and(|current_entrypoint| current_entrypoint == url), - } + .map(|short_path| IndexSidepanelFileCtx { + href: ctx + .href_resolver + .resolve_path(current_resolve_kind, short_path.as_resolve_kind()), + name: short_path.display_name(), + active: current_file + .as_ref() + .is_some_and(|current_file| current_file == short_path), }) .collect::>(); @@ -172,7 +174,7 @@ impl IndexSidepanelCtx { &nodes, false, ctx.href_resolver.resolve_path( - current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), + current_resolve_kind, UrlResolveKind::Symbol { file: &nodes[0].origin, symbol: &node_name, @@ -187,15 +189,13 @@ impl IndexSidepanelCtx { .collect::>(); Self { - root_url: ctx.href_resolver.resolve_path( - current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), - UrlResolveKind::Root, - ), + root_url: ctx + .href_resolver + .resolve_path(current_resolve_kind, UrlResolveKind::Root), all_symbols_url: (!ctx.sidebar_hide_all_symbols).then(|| { - ctx.href_resolver.resolve_path( - current_file.map_or(UrlResolveKind::Root, UrlResolveKind::File), - UrlResolveKind::AllSymbols, - ) + ctx + .href_resolver + .resolve_path(current_resolve_kind, UrlResolveKind::AllSymbols) }), kind_partitions, files, diff --git a/tests/html_test.rs b/tests/html_test.rs index cfda40ab..8b3dc0a7 100644 --- a/tests/html_test.rs +++ b/tests/html_test.rs @@ -271,15 +271,13 @@ async fn symbol_group() { let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); { - for (specifier, doc_nodes) in &doc_nodes_by_url { - let short_path = ShortPath::new(&ctx, specifier.clone()); - + for (short_path, doc_nodes) in &doc_nodes_by_url { let partitions_for_nodes = partition::get_partitions_for_file(&ctx, doc_nodes); let symbol_pages = generate_symbol_pages_for_module( &ctx, - &short_path, + short_path, &partitions_for_nodes, doc_nodes, ); @@ -303,7 +301,7 @@ async fn symbol_group() { &root, &symbol_group_ctx.name, ctx.package_name.as_ref(), - Some(short_path.clone()), + Some(short_path), ); Some(pages::SymbolPageCtx { @@ -442,13 +440,11 @@ async fn module_doc() { let mut module_docs = vec![]; let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); - for specifier in &ctx.specifiers { - let short_path = ShortPath::new(&ctx, specifier.clone()); - let doc_nodes = doc_nodes_by_url.get(specifier).unwrap(); + for (short_path, doc_nodes) in &doc_nodes_by_url { let render_ctx = - RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(&short_path)); + RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(short_path)); let module_doc = - jsdoc::ModuleDocCtx::new(&render_ctx, &short_path, &doc_nodes_by_url); + jsdoc::ModuleDocCtx::new(&render_ctx, short_path, &doc_nodes_by_url); module_docs.push(module_doc); } From c534ec513528ba6b5828e020a98b3448046937af Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 12:15:37 +0200 Subject: [PATCH 08/17] simplify modulespecifier, shortpath and doc_nodes_by_url usages --- src/html/jsdoc.rs | 11 +- src/html/mod.rs | 190 ++++++++++--------- src/html/pages.rs | 50 +---- src/html/render_context.rs | 90 ++++----- src/html/search.rs | 52 ++--- src/html/sidepanels.rs | 9 +- src/html/templates/styles.css | 94 ++++----- src/html/templates/styles.gen.css | 2 +- src/html/util.rs | 38 ++++ tests/html_test.rs | 112 ++++++----- tests/testdata/module_doc-syntect.json | 95 +--------- tests/testdata/module_doc-tree-sitter.json | 95 +--------- tests/testdata/module_doc.json | 95 +--------- tests/testdata/symbol_group-syntect.json | 16 +- tests/testdata/symbol_group-tree-sitter.json | 16 +- tests/testdata/symbol_group.json | 16 +- tests/testdata/symbol_search.json | 8 +- 17 files changed, 350 insertions(+), 639 deletions(-) diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index eed80f0c..26698343 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -1,6 +1,7 @@ use super::render_context::RenderContext; use super::util::*; use crate::html::usage::UsagesCtx; +use crate::html::FileMode; use crate::html::ShortPath; use crate::js_doc::JsDoc; use crate::js_doc::JsDocTag; @@ -553,12 +554,8 @@ pub struct ModuleDocCtx { impl ModuleDocCtx { pub const TEMPLATE: &'static str = "module_doc"; - pub fn new( - render_ctx: &RenderContext, - short_path: &ShortPath, - doc_nodes_by_url: &super::ContextDocNodesByShortPath, - ) -> Self { - let module_doc_nodes = doc_nodes_by_url.get(short_path).unwrap(); + pub fn new(render_ctx: &RenderContext, short_path: &ShortPath) -> Self { + let module_doc_nodes = render_ctx.ctx.doc_nodes.get(short_path).unwrap(); let mut sections = Vec::with_capacity(7); @@ -600,7 +597,7 @@ impl ModuleDocCtx { (None, None, None) }; - if short_path.is_main { + if short_path.is_main && render_ctx.ctx.file_mode == FileMode::SingleDts { let partitions_by_kind = super::partition::partition_nodes_by_kind(module_doc_nodes, true); diff --git a/src/html/mod.rs b/src/html/mod.rs index 62f0da65..b0792930 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -39,6 +39,7 @@ pub use util::qualify_drilldown_name; pub use util::DocNodeKindCtx; pub use util::HrefResolver; pub use util::NamespacedGlobalSymbols; +pub use util::SectionHeaderCtx; pub use util::UrlResolveKind; pub const STYLESHEET: &str = include_str!("./templates/styles.gen.css"); @@ -87,11 +88,11 @@ pub struct GenerateOptions { pub composable_output: bool, } +#[non_exhaustive] pub struct GenerateCtx<'ctx> { pub package_name: Option, pub common_ancestor: Option, - pub main_entrypoint: Option, - pub specifiers: Vec, + pub doc_nodes: IndexMap, Vec>, pub hbs: Handlebars<'ctx>, pub highlight_adapter: comrak_adapters::HighlightAdapter, #[cfg(feature = "ammonia")] @@ -104,14 +105,21 @@ pub struct GenerateCtx<'ctx> { } impl<'ctx> GenerateCtx<'ctx> { - pub fn doc_nodes_by_url_add_context( - &self, + pub fn new( + options: GenerateOptions, + common_ancestor: Option, + file_mode: FileMode, doc_nodes_by_url: IndexMap>, - ) -> ContextDocNodesByShortPath { - doc_nodes_by_url + ) -> Result { + let doc_nodes = doc_nodes_by_url .into_iter() .map(|(specifier, nodes)| { - let short_path = Rc::new(ShortPath::new(self, specifier)); + let short_path = Rc::new(ShortPath::new( + specifier, + options.main_entrypoint.as_ref(), + options.rewrite_map.as_ref(), + common_ancestor.as_ref(), + )); let nodes = nodes .into_iter() @@ -126,7 +134,22 @@ impl<'ctx> GenerateCtx<'ctx> { (short_path, nodes) }) - .collect::>() + .collect::>(); + + Ok(Self { + package_name: options.package_name, + common_ancestor, + doc_nodes, + hbs: setup_hbs()?, + highlight_adapter: setup_highlighter(false), + #[cfg(feature = "ammonia")] + url_rewriter: None, + href_resolver: options.href_resolver, + usage_composer: options.usage_composer, + rewrite_map: options.rewrite_map, + sidebar_hide_all_symbols: file_mode == FileMode::SingleDts, + file_mode, + }) } pub fn render( @@ -138,9 +161,6 @@ impl<'ctx> GenerateCtx<'ctx> { } } -pub type ContextDocNodesByShortPath = - IndexMap, Vec>; - #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] pub struct ShortPath { pub path: String, @@ -149,16 +169,17 @@ pub struct ShortPath { } impl ShortPath { - pub fn new(ctx: &GenerateCtx, specifier: ModuleSpecifier) -> Self { - let is_main = ctx - .main_entrypoint - .as_ref() + pub fn new( + specifier: ModuleSpecifier, + main_entrypoint: Option<&ModuleSpecifier>, + rewrite_map: Option<&IndexMap>, + common_ancestor: Option<&PathBuf>, + ) -> Self { + let is_main = main_entrypoint .is_some_and(|main_entrypoint| main_entrypoint == &specifier); - if let Some(rewrite) = ctx - .rewrite_map - .as_ref() - .and_then(|rewrite_map| rewrite_map.get(&specifier)) + if let Some(rewrite) = + rewrite_map.and_then(|rewrite_map| rewrite_map.get(&specifier)) { return ShortPath { path: rewrite.to_owned(), @@ -175,7 +196,7 @@ impl ShortPath { }; }; - let Some(common_ancestor) = &ctx.common_ancestor else { + let Some(common_ancestor) = common_ancestor else { return ShortPath { path: url_file_path.to_string_lossy().to_string(), specifier, @@ -471,30 +492,17 @@ pub fn generate( FileMode::Normal }; + let composable_output = options.composable_output; + let common_ancestor = find_common_ancestor(doc_nodes_by_url.keys(), true); - let ctx = GenerateCtx { - package_name: options.package_name, - common_ancestor, - main_entrypoint: options.main_entrypoint, - specifiers: doc_nodes_by_url.keys().cloned().collect(), - hbs: setup_hbs()?, - highlight_adapter: setup_highlighter(false), - #[cfg(feature = "ammonia")] - url_rewriter: None, - href_resolver: options.href_resolver, - usage_composer: options.usage_composer, - rewrite_map: options.rewrite_map, - sidebar_hide_all_symbols: file_mode == FileMode::SingleDts, - file_mode, - }; + let ctx = + GenerateCtx::new(options, common_ancestor, file_mode, doc_nodes_by_url)?; let mut files = HashMap::new(); - let doc_nodes_by_short_path = - ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); - // Index page { - let main_entrypoint = doc_nodes_by_short_path + let main_entrypoint = ctx + .doc_nodes .iter() .find(|(short_path, _)| short_path.is_main); @@ -508,11 +516,10 @@ pub fn generate( let index = pages::IndexCtx::new( &ctx, main_entrypoint.map(|(short_path, _)| short_path.clone()), - &doc_nodes_by_short_path, partitions_for_entrypoint_nodes, ); - if options.composable_output { + if composable_output { files.insert( "./sidepanel.html".to_string(), ctx.render( @@ -549,7 +556,8 @@ pub fn generate( // All symbols (list of all symbols in all files) if ctx.file_mode != FileMode::SingleDts { - let all_doc_nodes = doc_nodes_by_short_path + let all_doc_nodes = ctx + .doc_nodes .values() .flatten() .cloned() @@ -558,13 +566,9 @@ pub fn generate( let partitions_by_kind = partition::partition_nodes_by_entrypoint(&all_doc_nodes, true); - let all_symbols = pages::AllSymbolsCtx::new( - &ctx, - partitions_by_kind, - &doc_nodes_by_short_path, - ); + let all_symbols = pages::AllSymbolsCtx::new(&ctx, partitions_by_kind); - if options.composable_output { + if composable_output { files.insert( "./all_symbols/content.html".to_string(), ctx.render(SymbolContentCtx::TEMPLATE, &all_symbols.content), @@ -585,9 +589,8 @@ pub fn generate( // Pages for all discovered symbols { - for (short_path, doc_nodes) in &doc_nodes_by_short_path { - let partitions_for_nodes = - partition::get_partitions_for_file(&ctx, doc_nodes); + for (short_path, doc_nodes) in &ctx.doc_nodes { + let partitions_for_nodes = get_partitions_for_file(&ctx, doc_nodes); let symbol_pages = generate_symbol_pages_for_module( &ctx, @@ -605,7 +608,7 @@ pub fn generate( } => { let root = ctx.href_resolver.resolve_path( UrlResolveKind::Symbol { - file: &short_path, + file: short_path, symbol: &symbol_group_ctx.name, }, UrlResolveKind::Root, @@ -618,7 +621,7 @@ pub fn generate( Some(short_path), ); - if options.composable_output { + if composable_output { let dir_name = format!("{}/~/{}", short_path.path, symbol_group_ctx.name); @@ -660,7 +663,7 @@ pub fn generate( } => { let redirect = serde_json::json!({ "path": href }); - if options.composable_output { + if composable_output { let file_name = format!( "{}/~/{}/redirect.json", short_path.path, current_symbol @@ -677,48 +680,51 @@ pub fn generate( } })); - let index = pages::IndexCtx::new( - &ctx, - Some(short_path.clone()), - &doc_nodes_by_short_path, - partitions_for_nodes, - ); - - if options.composable_output { - let dir = format!("{}/~", short_path.path); - files.insert( - format!("{dir}/sidepanel.html"), - ctx.render( - sidepanels::IndexSidepanelCtx::TEMPLATE, - &index.sidepanel_ctx, - ), - ); - - files.insert( - format!("{dir}/breadcrumbs.html"), - ctx.render(util::BreadcrumbsCtx::TEMPLATE, &index.breadcrumbs_ctx), + if !short_path.is_main { + let index = pages::IndexCtx::new( + &ctx, + Some(short_path.clone()), + partitions_for_nodes, ); - if index.module_doc.is_some() || index.all_symbols.is_some() { - let mut out = String::new(); + if composable_output { + let dir = format!("{}/~", short_path.path); + files.insert( + format!("{dir}/sidepanel.html"), + ctx.render( + sidepanels::IndexSidepanelCtx::TEMPLATE, + &index.sidepanel_ctx, + ), + ); + + files.insert( + format!("{dir}/breadcrumbs.html"), + ctx.render(util::BreadcrumbsCtx::TEMPLATE, &index.breadcrumbs_ctx), + ); + + if index.module_doc.is_some() || index.all_symbols.is_some() { + let mut out = String::new(); + + if let Some(module_doc) = index.module_doc { + out.push_str( + &ctx.render(jsdoc::ModuleDocCtx::TEMPLATE, &module_doc), + ); + } - if let Some(module_doc) = index.module_doc { - out.push_str( - &ctx.render(jsdoc::ModuleDocCtx::TEMPLATE, &module_doc), - ); - } + if let Some(all_symbols) = index.all_symbols { + out.push_str( + &ctx.render(SymbolContentCtx::TEMPLATE, &all_symbols), + ); + } - if let Some(all_symbols) = index.all_symbols { - out.push_str(&ctx.render(SymbolContentCtx::TEMPLATE, &all_symbols)); + files.insert(format!("{dir}/content.html"), out); } - - files.insert(format!("{dir}/content.html"), out); + } else { + files.insert( + format!("{}/~/index.html", short_path.path), + ctx.render(pages::IndexCtx::TEMPLATE, &index), + ); } - } else { - files.insert( - format!("{}/~/index.html", short_path.path), - ctx.render(pages::IndexCtx::TEMPLATE, &index), - ); } } } @@ -726,11 +732,11 @@ pub fn generate( files.insert(STYLESHEET_FILENAME.into(), STYLESHEET.into()); files.insert( SEARCH_INDEX_FILENAME.into(), - search::get_search_index_file(&ctx, &doc_nodes_by_short_path)?, + search::get_search_index_file(&ctx)?, ); files.insert(SCRIPT_FILENAME.into(), SCRIPT_JS.into()); - if !options.composable_output { + if !composable_output { files.insert(PAGE_STYLESHEET_FILENAME.into(), PAGE_STYLESHEET.into()); files.insert(FUSE_FILENAME.into(), FUSE_JS.into()); files.insert(SEARCH_FILENAME.into(), SEARCH_JS.into()); diff --git a/src/html/pages.rs b/src/html/pages.rs index c1993fcb..64789d0b 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -3,6 +3,7 @@ use super::sidepanels::SidepanelCtx; use super::symbols::SymbolContentCtx; use super::util::qualify_drilldown_name; use super::util::BreadcrumbsCtx; +use super::util::SectionHeaderCtx; use super::DocNodeKindWithDrilldown; use super::DocNodeWithContext; use super::FileMode; @@ -21,8 +22,6 @@ use super::SEARCH_INDEX_FILENAME; use super::STYLESHEET_FILENAME; use crate::function::FunctionDef; -use crate::html::jsdoc::markdown_to_html; -use crate::html::jsdoc::MarkdownToHTMLOptions; use crate::html::partition::Partition; use crate::variable::VariableDef; use crate::DocNode; @@ -88,14 +87,13 @@ impl IndexCtx { pub fn new( ctx: &GenerateCtx, short_path: Option>, - doc_nodes_by_url: &super::ContextDocNodesByShortPath, partitions: Partition, ) -> Self { // will be default on index page with no main entrypoint let default = vec![]; let doc_nodes = short_path .as_ref() - .and_then(|short_path| doc_nodes_by_url.get(short_path)) + .and_then(|short_path| ctx.doc_nodes.get(short_path)) .unwrap_or(&default); let render_ctx = RenderContext::new( @@ -107,7 +105,7 @@ impl IndexCtx { ); let module_doc = short_path.as_ref().map(|short_path| { - super::jsdoc::ModuleDocCtx::new(&render_ctx, short_path, doc_nodes_by_url) + super::jsdoc::ModuleDocCtx::new(&render_ctx, short_path) }); let root = ctx.href_resolver.resolve_path( @@ -148,12 +146,8 @@ impl IndexCtx { None }; - let sidepanel_ctx = sidepanels::IndexSidepanelCtx::new( - ctx, - short_path.clone(), - doc_nodes_by_url, - partitions, - ); + let sidepanel_ctx = + sidepanels::IndexSidepanelCtx::new(ctx, short_path.clone(), partitions); IndexCtx { html_head_ctx, @@ -178,7 +172,6 @@ impl AllSymbolsCtx { pub fn new( ctx: &GenerateCtx, partitions: crate::html::partition::EntrypointPartition, - doc_nodes_by_url: &super::ContextDocNodesByShortPath, ) -> Self { // TODO(@crowlKats): handle doc_nodes in all symbols page for each symbol let render_ctx = RenderContext::new(ctx, &[], UrlResolveKind::AllSymbols); @@ -188,35 +181,10 @@ impl AllSymbolsCtx { partitions .into_iter() .map(|(path, nodes)| { - let module_doc_nodes = doc_nodes_by_url.get(&path).unwrap(); - - let doc = module_doc_nodes - .iter() - .find(|n| n.kind == DocNodeKind::ModuleDoc) - .and_then(|node| node.js_doc.doc.as_ref()) - .and_then(|doc| { - markdown_to_html( - &render_ctx, - doc, - MarkdownToHTMLOptions { - summary: true, - summary_prefer_title: true, - render_toc: false, - }, - ) - }) - .map(|markdown| markdown.html); - - let header = crate::html::util::SectionHeaderCtx { - title: path.display_name(), - href: Some(render_ctx.ctx.href_resolver.resolve_path( - render_ctx.get_current_resolve(), - path.as_resolve_kind(), - )), - doc, - }; - - (header, nodes) + ( + SectionHeaderCtx::new_for_namespace(&render_ctx, &path), + nodes, + ) }) .collect(), ); diff --git a/src/html/render_context.rs b/src/html/render_context.rs index fb241d26..4b456012 100644 --- a/src/html/render_context.rs +++ b/src/html/render_context.rs @@ -1,9 +1,9 @@ use crate::html::util::BreadcrumbCtx; use crate::html::util::BreadcrumbsCtx; use crate::html::util::NamespacedSymbols; -use crate::html::ShortPath; +use crate::html::DocNodeWithContext; +use crate::html::GenerateCtx; use crate::html::UrlResolveKind; -use crate::html::{DocNodeWithContext, GenerateCtx}; use crate::DocNodeKind; use deno_graph::ModuleSpecifier; use std::collections::HashMap; @@ -106,9 +106,14 @@ impl<'ctx> RenderContext<'ctx> { .get_file() .cloned() .unwrap_or_else(|| { - ShortPath::new( - self.ctx, - self.ctx.main_entrypoint.clone().unwrap(), + Rc::unwrap_or_clone( + self + .ctx + .doc_nodes + .keys() + .find(|short_path| short_path.is_main) + .unwrap() + .clone(), ) }), symbol: target_symbol, @@ -119,11 +124,16 @@ impl<'ctx> RenderContext<'ctx> { if let Some(src) = self.current_imports.get(target_symbol) { if let Ok(module_specifier) = ModuleSpecifier::parse(src) { - if self.ctx.specifiers.contains(&module_specifier) { + if let Some(short_path) = self + .ctx + .doc_nodes + .keys() + .find(|short_path| short_path.specifier == module_specifier) + { return Some(self.ctx.href_resolver.resolve_path( self.get_current_resolve(), UrlResolveKind::Symbol { - file: &ShortPath::new(self.ctx, module_specifier), + file: short_path, symbol: target_symbol, }, )); @@ -276,15 +286,12 @@ fn get_current_imports( #[cfg(test)] mod test { use super::*; - use crate::html::setup_hbs; - use crate::html::setup_highlighter; - use crate::html::DocNodeKindWithDrilldown; + use crate::html::GenerateOptions; use crate::html::HrefResolver; use crate::node::DeclarationKind; use crate::node::ImportDef; use crate::DocNode; use crate::Location; - use std::sync::Arc; struct TestResolver(); @@ -313,7 +320,10 @@ mod test { Some(format!("{src}/{}", symbol.join("."))) } - fn resolve_usage(&self, current_file: &ShortPath) -> Option { + fn resolve_usage( + &self, + current_file: &crate::html::ShortPath, + ) -> Option { Some(current_file.specifier.to_string()) } @@ -324,30 +334,9 @@ mod test { #[test] fn lookup_symbol_href() { - let ctx = GenerateCtx { - package_name: None, - common_ancestor: None, - main_entrypoint: None, - specifiers: vec![], - hbs: setup_hbs().unwrap(), - highlight_adapter: setup_highlighter(false), - url_rewriter: None, - href_resolver: Rc::new(TestResolver()), - usage_composer: None, - rewrite_map: None, - file_mode: Default::default(), - sidebar_hide_all_symbols: false, - }; - - let doc_nodes = vec![DocNodeWithContext { - origin: Rc::new(ShortPath::new( - &ctx, - ModuleSpecifier::parse("file:///mod.ts").unwrap(), - )), - ns_qualifiers: Rc::new(vec![]), - drilldown_parent_kind: None, - kind_with_drilldown: DocNodeKindWithDrilldown::Other(DocNodeKind::Import), - inner: Arc::new(DocNode { + let doc_nodes_by_url = indexmap::IndexMap::from([( + ModuleSpecifier::parse("file:///mod.ts").unwrap(), + vec![DocNode { kind: DocNodeKind::Import, name: "foo".to_string(), location: Location { @@ -369,21 +358,36 @@ mod test { src: "b".to_string(), imported: Some("foo".to_string()), }), - }), - }]; + }], + )]); + + let ctx = GenerateCtx::new( + GenerateOptions { + package_name: None, + main_entrypoint: None, + href_resolver: Rc::new(TestResolver()), + usage_composer: None, + rewrite_map: None, + composable_output: false, + }, + None, + Default::default(), + doc_nodes_by_url, + ) + .unwrap(); + + let (short_path, doc_nodes) = ctx.doc_nodes.first().unwrap(); // globals - let render_ctx = RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root); + let render_ctx = RenderContext::new(&ctx, doc_nodes, UrlResolveKind::Root); assert_eq!(render_ctx.lookup_symbol_href("bar").unwrap(), "global$bar"); // imports - let render_ctx = RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::Root); + let render_ctx = RenderContext::new(&ctx, doc_nodes, UrlResolveKind::Root); assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); - let short_path = - ShortPath::new(&ctx, ModuleSpecifier::parse("file:///a").unwrap()); let render_ctx = - RenderContext::new(&ctx, &doc_nodes, UrlResolveKind::File(&short_path)); + RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(&short_path)); assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); } } diff --git a/src/html/search.rs b/src/html/search.rs index e27ef42a..9ffe38bf 100644 --- a/src/html/search.rs +++ b/src/html/search.rs @@ -1,7 +1,5 @@ -use super::ContextDocNodesByShortPath; use super::DocNodeWithContext; use super::GenerateCtx; -use super::ShortPath; use crate::node::Location; use crate::DocNodeKind; use deno_ast::ModuleSpecifier; @@ -50,16 +48,12 @@ fn doc_node_into_search_index_nodes( if doc_nodes[0].kind != DocNodeKind::Namespace { let mut location = doc_nodes[0].location.clone(); let location_url = ModuleSpecifier::parse(&location.filename).unwrap(); - location.filename = if ctx - .main_entrypoint - .as_ref() - .map(|main_entrypoint| main_entrypoint != &location_url) - .unwrap_or(true) + location.filename = if let Some(short_path) = ctx + .doc_nodes + .keys() + .find(|short_path| short_path.specifier == location_url) { - html_escape::encode_text( - &ShortPath::new(ctx, location_url).display_name(), - ) - .into_owned() + html_escape::encode_text(&short_path.display_name()).into_owned() } else { String::new() }; @@ -83,14 +77,12 @@ fn doc_node_into_search_index_nodes( let mut location = doc_nodes[0].location.clone(); let location_url = ModuleSpecifier::parse(&location.filename).unwrap(); - location.filename = if ctx - .main_entrypoint - .as_ref() - .map(|main_entrypoint| main_entrypoint != &location_url) - .unwrap_or(true) + location.filename = if let Some(short_path) = ctx + .doc_nodes + .keys() + .find(|short_path| short_path.specifier == location_url) { - html_escape::encode_text(&ShortPath::new(ctx, location_url).display_name()) - .into_owned() + html_escape::encode_text(&short_path.display_name()).into_owned() } else { String::new() }; @@ -127,16 +119,12 @@ fn doc_node_into_search_index_nodes( let mut location = el_nodes[0].location.clone(); let location_url = ModuleSpecifier::parse(&location.filename).unwrap(); - location.filename = if ctx - .main_entrypoint - .as_ref() - .map(|main_entrypoint| main_entrypoint != &location_url) - .unwrap_or(true) + location.filename = if let Some(short_path) = ctx + .doc_nodes + .keys() + .find(|short_path| short_path.specifier == location_url) { - html_escape::encode_text( - &ShortPath::new(ctx, location_url).display_name(), - ) - .into_owned() + html_escape::encode_text(&short_path.display_name()).into_owned() } else { String::new() }; @@ -183,11 +171,8 @@ fn doc_node_into_search_index_nodes( nodes } -pub fn generate_search_index( - ctx: &GenerateCtx, - doc_nodes_by_url: &ContextDocNodesByShortPath, -) -> serde_json::Value { - let doc_nodes = doc_nodes_by_url.values().flatten().collect::>(); +pub fn generate_search_index(ctx: &GenerateCtx) -> serde_json::Value { + let doc_nodes = ctx.doc_nodes.values().flatten().collect::>(); let mut grouped_nodes: IndexMap<&str, Vec<&DocNodeWithContext>> = IndexMap::new(); @@ -226,9 +211,8 @@ pub fn generate_search_index( pub(crate) fn get_search_index_file( ctx: &GenerateCtx, - doc_nodes_by_url: &ContextDocNodesByShortPath, ) -> Result { - let search_index = generate_search_index(ctx, doc_nodes_by_url); + let search_index = generate_search_index(ctx); let search_index_str = serde_json::to_string(&search_index)?; let index = format!( diff --git a/src/html/sidepanels.rs b/src/html/sidepanels.rs index 75f1ecd5..a4a05a21 100644 --- a/src/html/sidepanels.rs +++ b/src/html/sidepanels.rs @@ -122,18 +122,17 @@ impl IndexSidepanelCtx { pub fn new( ctx: &GenerateCtx, current_file: Option>, - doc_nodes_by_url: &super::ContextDocNodesByShortPath, partitions: Partition, ) -> Self { let current_resolve_kind = current_file .as_deref() .map_or(UrlResolveKind::Root, ShortPath::as_resolve_kind); - let main_short_path = doc_nodes_by_url - .keys() - .find(|short_path| short_path.is_main); + let main_short_path = + ctx.doc_nodes.keys().find(|short_path| short_path.is_main); - let files = doc_nodes_by_url + let files = ctx + .doc_nodes .keys() .filter(|short_path| { main_short_path diff --git a/src/html/templates/styles.css b/src/html/templates/styles.css index 578115e3..3f9ef7c2 100644 --- a/src/html/templates/styles.css +++ b/src/html/templates/styles.css @@ -24,35 +24,35 @@ summary::-webkit-details-marker { #sidepanel { @apply shrink-0 box-border lg:h-screen lg:sticky lg:top-0 lg:left-0 lg:overflow-y-auto lg:overscroll-y-contain; scrollbar-width: thin; - + label, a, h2, h3 { @apply py-1.5 pr-4 pl-2; } - + h2 { @apply flex items-center gap-2.5 mt-2 text-xl font-bold; } - + h3 { @apply font-bold; } - + ul { @apply list-none; } - + li { @apply block; } - + a { @apply flex items-center gap-2 leading-none relative rounded-lg; } - + li > a > span { @apply block w-full overflow-hidden whitespace-nowrap text-ellipsis text-sm; } - + li > a:has(span) { @apply py-1; } @@ -68,7 +68,7 @@ summary::-webkit-details-marker { .anchorable { @apply relative; - + &:hover .anchor { @apply block; } @@ -77,12 +77,12 @@ summary::-webkit-details-marker { .deprecated { > div:first-child { @apply py-1 text-red-500 flex gap-1 items-center; - + > span { @apply font-semibold leading-6; } } - + > div:nth-child(2) { @apply ml-1 pl-2 border-l-4 border-red-300; } @@ -90,7 +90,7 @@ summary::-webkit-details-marker { .symbolSubtitle { @apply space-y-0.5 text-sm leading-4; - + .type { @apply text-stone-400 italic; } @@ -98,10 +98,10 @@ summary::-webkit-details-marker { .docEntry { @apply text-sm; - + .docEntryHeader { @apply flex justify-between items-start; - + > span { @apply flex items-center break-words gap-2; } @@ -110,10 +110,10 @@ summary::-webkit-details-marker { .section { @apply space-y-6; - + > div { @apply space-y-1; - + > h2 { @apply text-xl leading-6 font-semibold py-1; } @@ -122,33 +122,33 @@ summary::-webkit-details-marker { .namespaceSection { @apply grid grid-cols-1 gap-y-3 lg:grid-cols-4 lg:gap-x-3 lg:gap-y-8; - + .namespaceItem { @apply flex gap-x-2.5; - + .docNodeKindIcon { @apply w-auto flex-col justify-start; - + > * + * { @apply ml-0 -mt-0.5; } } - + &[aria-label="deprecated"] { @apply opacity-60; - + .namespaceItemContent > a { @apply line-through decoration-2 decoration-stone-500/70 text-stone-500; } } - + .namespaceItemContent { @apply space-y-1.5; - + > a { - @apply inline-block leading-tight truncate font-medium; + @apply block leading-tight break-all font-medium; } - + > div { @apply text-sm leading-5 text-stone-600; } @@ -158,13 +158,13 @@ summary::-webkit-details-marker { .symbolGroup { @apply space-y-12; - + article { @apply space-y-5; - + > div:first-child { @apply flex justify-between items-start; - + > div:first-child { @apply font-medium space-y-1; } @@ -174,11 +174,11 @@ summary::-webkit-details-marker { .docNodeKindIcon { @apply inline-flex justify-end shrink-0; - + div { @apply rounded-full size-5 font-medium text-xs leading-5 text-center align-middle shrink-0 select-none font-mono; } - + > * + * { @apply -ml-1.5; } @@ -187,12 +187,12 @@ summary::-webkit-details-marker { .example details { summary { @apply list-none flex items-center gap-2 py-2 rounded-lg w-full leading-6 cursor-pointer; - + > div:first-child { @apply text-stone-600 select-none; } } - + &[open] summary > div:first-child { @apply rotate-90; } @@ -200,18 +200,18 @@ summary::-webkit-details-marker { .tocable { @apply flex max-lg:flex-col-reverse gap-6; - + .toc { @apply flex-none max-w-52 text-sm max-lg:hidden sticky top-0 py-4 max-h-screen box-border; - + > ul { @apply space-y-2 block overflow-y-auto h-full; - + ul { @apply ml-4 space-y-2; } } - + a { @apply hover:underline block overflow-x-hidden whitespace-nowrap text-ellipsis; } @@ -220,21 +220,21 @@ summary::-webkit-details-marker { .usage { @apply px-6 py-5 mb-4 border max-md:border-x-0 md:rounded-lg bg-stone-50 border-stone-200; - + nav { @apply flex items-center flex-row gap-2 mb-3 font-semibold; - + details { > summary { @apply flex gap-1 select-none cursor-pointer rounded border border-gray-300 py-2 px-3; } - + > div { @apply md:relative; - + > div { @apply absolute max-md:inset-x-0 mt-1.5 p-2 block z-30 md:w-72 bg-white md:rounded border max-md:border-x-0 border-gray-300; - + label { @apply flex items-center justify-between cursor-pointer select-none px-2 py-1 leading-normal rounded-sm hover:bg-gray-50; } @@ -242,7 +242,7 @@ summary::-webkit-details-marker { } } } - + pre.highlight { @apply border border-gray-300 max-md:border-x-0; } @@ -254,7 +254,7 @@ summary::-webkit-details-marker { .breadcrumbs { @apply whitespace-nowrap inline-flex gap-1 items-center; - + > li, > ul { @apply py-1 px-2; } @@ -275,11 +275,11 @@ summary::-webkit-details-marker { .markdown_summary { @apply inline text-stone-600; - + p { @apply inline-block; } - + :not(pre) > code { @apply font-mono text-sm py-0.5 px-1 rounded bg-stone-200; } @@ -337,7 +337,7 @@ summary::-webkit-details-marker { :not(pre) > code { @apply font-mono text-sm py-0.5 px-1 rounded bg-stone-200; } - + h1, h2, h3, h4, h5, h6 { & > code { font-size: inherit !important; @@ -427,7 +427,7 @@ summary::-webkit-details-marker { .markdown .highlight { @apply relative; - + .lineNumbers { @apply border-r-2 border-stone-300 pr-1 text-right flex-none; } diff --git a/src/html/templates/styles.gen.css b/src/html/templates/styles.gen.css index 26f3e445..5a57d51f 100644 --- a/src/html/templates/styles.gen.css +++ b/src/html/templates/styles.gen.css @@ -1 +1 @@ -.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .mb-4{margin-bottom:1rem}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-2{margin-top:.5rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.ddoc .text-lg{font-size:1.125rem;line-height:1.75rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .font-semibold{font-weight:600}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:1.25;display:inline-block;overflow:hidden}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:18rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;justify-content:space-between;align-items:center;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file +.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{word-break:break-all;font-weight:500;line-height:1.25;display:block}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:18rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;justify-content:space-between;align-items:center;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file diff --git a/src/html/util.rs b/src/html/util.rs index d8367288..89aeafab 100644 --- a/src/html/util.rs +++ b/src/html/util.rs @@ -1,3 +1,5 @@ +use crate::html::jsdoc::markdown_to_html; +use crate::html::jsdoc::MarkdownToHTMLOptions; use crate::html::DocNodeKindWithDrilldown; use crate::html::DocNodeWithContext; use crate::html::RenderContext; @@ -193,6 +195,7 @@ pub fn href_path_resolve( match target { UrlResolveKind::Root => backs, + UrlResolveKind::File(target_file) if target_file.is_main => backs, UrlResolveKind::AllSymbols => format!("{backs}./all_symbols.html"), UrlResolveKind::Symbol { file: target_file, @@ -325,6 +328,41 @@ pub struct SectionHeaderCtx { pub doc: Option, } +impl SectionHeaderCtx { + pub fn new_for_namespace( + render_ctx: &RenderContext, + path: &ShortPath, + ) -> Self { + let module_doc_nodes = render_ctx.ctx.doc_nodes.get(path).unwrap(); + + let doc = module_doc_nodes + .iter() + .find(|n| n.kind == DocNodeKind::ModuleDoc) + .and_then(|node| node.js_doc.doc.as_ref()) + .and_then(|doc| { + markdown_to_html( + render_ctx, + doc, + MarkdownToHTMLOptions { + summary: true, + summary_prefer_title: true, + render_toc: false, + }, + ) + }) + .map(|markdown| markdown.html); + + SectionHeaderCtx { + title: path.display_name(), + href: Some(render_ctx.ctx.href_resolver.resolve_path( + render_ctx.get_current_resolve(), + path.as_resolve_kind(), + )), + doc, + } + } +} + #[derive(Debug, Serialize, Clone)] pub struct SectionCtx { pub header: SectionHeaderCtx, diff --git a/tests/html_test.rs b/tests/html_test.rs index 8b3dc0a7..5e5f8d26 100644 --- a/tests/html_test.rs +++ b/tests/html_test.rs @@ -157,7 +157,6 @@ async fn html_doc_files() { "./~/Foo.prototype.html", "./~/Foobar.html", "./~/Foobar.prototype.html", - "./~/index.html", "fuse.js", "page.css", "script.js", @@ -250,28 +249,27 @@ async fn symbol_group() { "foo".to_string(), ); - let ctx = GenerateCtx { - package_name: None, - common_ancestor: None, - main_entrypoint: Some( - ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), - ), - specifiers: rewrite_map.keys().cloned().collect(), - hbs: setup_hbs().unwrap(), - highlight_adapter: setup_highlighter(false), - url_rewriter: None, - href_resolver: Rc::new(EmptyResolver {}), - usage_composer: None, - rewrite_map: Some(rewrite_map), - file_mode: Default::default(), - sidebar_hide_all_symbols: false, - }; + let ctx = GenerateCtx::new( + GenerateOptions { + package_name: None, + main_entrypoint: Some( + ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), + ), + href_resolver: Rc::new(EmptyResolver {}), + usage_composer: None, + rewrite_map: Some(rewrite_map), + composable_output: false, + }, + None, + Default::default(), + doc_nodes_by_url, + ) + .unwrap(); let mut files = vec![]; - let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); { - for (short_path, doc_nodes) in &doc_nodes_by_url { + for (short_path, doc_nodes) in &ctx.doc_nodes { let partitions_for_nodes = partition::get_partitions_for_file(&ctx, doc_nodes); @@ -362,26 +360,24 @@ async fn symbol_search() { "foo".to_string(), ); - let ctx = GenerateCtx { - package_name: None, - common_ancestor: None, - main_entrypoint: Some( - ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), - ), - specifiers: rewrite_map.keys().cloned().collect(), - hbs: setup_hbs().unwrap(), - highlight_adapter: setup_highlighter(false), - url_rewriter: None, - href_resolver: Rc::new(EmptyResolver {}), - usage_composer: None, - rewrite_map: Some(rewrite_map), - file_mode: Default::default(), - sidebar_hide_all_symbols: false, - }; - - let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); - - let search_index = generate_search_index(&ctx, &doc_nodes_by_url); + let ctx = GenerateCtx::new( + GenerateOptions { + package_name: None, + main_entrypoint: Some( + ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), + ), + href_resolver: Rc::new(EmptyResolver {}), + usage_composer: None, + rewrite_map: Some(rewrite_map), + composable_output: false, + }, + None, + Default::default(), + doc_nodes_by_url, + ) + .unwrap(); + + let search_index = generate_search_index(&ctx); let mut file_json = serde_json::to_string_pretty(&search_index).unwrap(); file_json.push('\n'); @@ -420,31 +416,29 @@ async fn module_doc() { "foo".to_string(), ); - let ctx = GenerateCtx { - package_name: None, - common_ancestor: None, - main_entrypoint: Some( - ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), - ), - specifiers: rewrite_map.keys().cloned().collect(), - hbs: setup_hbs().unwrap(), - highlight_adapter: setup_highlighter(false), - url_rewriter: None, - href_resolver: Rc::new(EmptyResolver {}), - usage_composer: None, - rewrite_map: Some(rewrite_map), - file_mode: FileMode::Single, - sidebar_hide_all_symbols: false, - }; + let ctx = GenerateCtx::new( + GenerateOptions { + package_name: None, + main_entrypoint: Some( + ModuleSpecifier::from_file_path(multiple_dir.join("a.ts")).unwrap(), + ), + href_resolver: Rc::new(EmptyResolver {}), + usage_composer: None, + rewrite_map: Some(rewrite_map), + composable_output: false, + }, + None, + FileMode::Single, + doc_nodes_by_url, + ) + .unwrap(); let mut module_docs = vec![]; - let doc_nodes_by_url = ctx.doc_nodes_by_url_add_context(doc_nodes_by_url); - for (short_path, doc_nodes) in &doc_nodes_by_url { + for (short_path, doc_nodes) in &ctx.doc_nodes { let render_ctx = RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(short_path)); - let module_doc = - jsdoc::ModuleDocCtx::new(&render_ctx, short_path, &doc_nodes_by_url); + let module_doc = jsdoc::ModuleDocCtx::new(&render_ctx, short_path); module_docs.push(module_doc); } diff --git a/tests/testdata/module_doc-syntect.json b/tests/testdata/module_doc-syntect.json index 6f5e247a..71dc5124 100644 --- a/tests/testdata/module_doc-syntect.json +++ b/tests/testdata/module_doc-syntect.json @@ -16,100 +16,7 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [ - { - "header": { - "title": "Classes", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Bar.html", - "name": "Bar", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foo.html", - "name": "Foo", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foobar.html", - "name": "Foobar", - "docs": null, - "deprecated": false - } - ] - } - }, - { - "header": { - "title": "Interfaces", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Interface", - "char": "I", - "title": "Interface", - "title_lowercase": "interface", - "title_plural": "Interfaces" - } - ], - "origin_name": null, - "href": "../././~/Hello.html", - "name": "Hello", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } }, { diff --git a/tests/testdata/module_doc-tree-sitter.json b/tests/testdata/module_doc-tree-sitter.json index 240dd5e7..f8c1648c 100644 --- a/tests/testdata/module_doc-tree-sitter.json +++ b/tests/testdata/module_doc-tree-sitter.json @@ -16,100 +16,7 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [ - { - "header": { - "title": "Classes", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Bar.html", - "name": "Bar", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foo.html", - "name": "Foo", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foobar.html", - "name": "Foobar", - "docs": null, - "deprecated": false - } - ] - } - }, - { - "header": { - "title": "Interfaces", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Interface", - "char": "I", - "title": "Interface", - "title_lowercase": "interface", - "title_plural": "Interfaces" - } - ], - "origin_name": null, - "href": "../././~/Hello.html", - "name": "Hello", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } }, { diff --git a/tests/testdata/module_doc.json b/tests/testdata/module_doc.json index 6c787e42..b60432e2 100644 --- a/tests/testdata/module_doc.json +++ b/tests/testdata/module_doc.json @@ -16,100 +16,7 @@ "sections": { "id": "module_doc", "docs": "

    Some docs

    \n
    \n \n \n \n \n\nNote

    \nUseful information that users should know, even when skimming content.

    \n
    \n
    \n \n \n \n \n\nTip

    \nHelpful advice for doing things better or more easily.

    \n
    \n
    \n \n \n \n \n\nImportant

    \nKey information users need to know to achieve their goal.

    \n
    \n
    \n \n \n \n \n\nWarning

    \nUrgent info that needs immediate user attention to avoid problems.

    \n
    \n
    \n \n \n \n \n\nCaution

    \nAdvises about risks or negative outcomes of certain actions.

    \n
    \n
    ", - "sections": [ - { - "header": { - "title": "Classes", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Bar.html", - "name": "Bar", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foo.html", - "name": "Foo", - "docs": null, - "deprecated": false - }, - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Class", - "char": "c", - "title": "Class", - "title_lowercase": "class", - "title_plural": "Classes" - } - ], - "origin_name": null, - "href": "../././~/Foobar.html", - "name": "Foobar", - "docs": null, - "deprecated": false - } - ] - } - }, - { - "header": { - "title": "Interfaces", - "href": null, - "doc": null - }, - "content": { - "kind": "namespace_section", - "content": [ - { - "tags": [], - "doc_node_kind_ctx": [ - { - "kind": "Interface", - "char": "I", - "title": "Interface", - "title_lowercase": "interface", - "title_plural": "Interfaces" - } - ], - "origin_name": null, - "href": "../././~/Hello.html", - "name": "Hello", - "docs": null, - "deprecated": false - } - ] - } - } - ] + "sections": [] } }, { diff --git a/tests/testdata/symbol_group-syntect.json b/tests/testdata/symbol_group-syntect.json index 836249f1..c15638d4 100644 --- a/tests/testdata/symbol_group-syntect.json +++ b/tests/testdata/symbol_group-syntect.json @@ -143,7 +143,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -358,7 +358,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -512,7 +512,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -685,7 +685,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -857,7 +857,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1035,7 +1035,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1219,7 +1219,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1403,7 +1403,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, diff --git a/tests/testdata/symbol_group-tree-sitter.json b/tests/testdata/symbol_group-tree-sitter.json index d0b60f0f..11e2bb37 100644 --- a/tests/testdata/symbol_group-tree-sitter.json +++ b/tests/testdata/symbol_group-tree-sitter.json @@ -143,7 +143,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -358,7 +358,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -512,7 +512,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -685,7 +685,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -857,7 +857,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1035,7 +1035,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1219,7 +1219,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1403,7 +1403,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, diff --git a/tests/testdata/symbol_group.json b/tests/testdata/symbol_group.json index 43919206..78e86bd6 100644 --- a/tests/testdata/symbol_group.json +++ b/tests/testdata/symbol_group.json @@ -143,7 +143,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -358,7 +358,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -512,7 +512,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -685,7 +685,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -857,7 +857,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1035,7 +1035,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1219,7 +1219,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, @@ -1403,7 +1403,7 @@ }, { "name": "default", - "href": "../././~/index.html", + "href": "../", "is_symbol": false, "is_first_symbol": false }, diff --git a/tests/testdata/symbol_search.json b/tests/testdata/symbol_search.json index 1dcf7f5a..b700059e 100644 --- a/tests/testdata/symbol_search.json +++ b/tests/testdata/symbol_search.json @@ -7,7 +7,7 @@ "name": "Foo", "file": ".", "location": { - "filename": "", + "filename": "default", "line": 25, "col": 0, "byteIndex": 488 @@ -22,7 +22,7 @@ "name": "Bar", "file": ".", "location": { - "filename": "", + "filename": "default", "line": 31, "col": 0, "byteIndex": 591 @@ -37,7 +37,7 @@ "name": "Foobar", "file": ".", "location": { - "filename": "", + "filename": "default", "line": 34, "col": 0, "byteIndex": 625 @@ -52,7 +52,7 @@ "name": "Hello", "file": ".", "location": { - "filename": "", + "filename": "default", "line": 37, "col": 0, "byteIndex": 658 From 42029f3fff1dae0d26dc6c47303a9680a67ef73f Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 12:18:30 +0200 Subject: [PATCH 09/17] lint --- src/html/render_context.rs | 2 +- tests/html_test.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/html/render_context.rs b/src/html/render_context.rs index 4b456012..36f5359f 100644 --- a/src/html/render_context.rs +++ b/src/html/render_context.rs @@ -387,7 +387,7 @@ mod test { assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); let render_ctx = - RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(&short_path)); + RenderContext::new(&ctx, doc_nodes, UrlResolveKind::File(short_path)); assert_eq!(render_ctx.lookup_symbol_href("foo").unwrap(), "b/foo"); } } diff --git a/tests/html_test.rs b/tests/html_test.rs index 5e5f8d26..6d9e8bb1 100644 --- a/tests/html_test.rs +++ b/tests/html_test.rs @@ -289,7 +289,7 @@ async fn symbol_group() { } => { let root = ctx.href_resolver.resolve_path( UrlResolveKind::Symbol { - file: &short_path, + file: short_path, symbol: &symbol_group_ctx.name, }, UrlResolveKind::Root, From 48ca7a88739eda9bedd867c3481617467ab473c0 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 12:20:49 +0200 Subject: [PATCH 10/17] clean --- src/html/pages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/pages.rs b/src/html/pages.rs index 64789d0b..6a2be958 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -83,7 +83,7 @@ pub struct IndexCtx { impl IndexCtx { pub const TEMPLATE: &'static str = "pages/index"; - /// short_path is None in case there this is a root index page but there is no main entrypoint + /// short_path is None in the case this is a root index page but there is no main entrypoint pub fn new( ctx: &GenerateCtx, short_path: Option>, From daf3aa27f5f119cd0e34a9e18897f4787b667d30 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 12:21:33 +0200 Subject: [PATCH 11/17] clean --- src/html/pages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/pages.rs b/src/html/pages.rs index 6a2be958..ff4d4ce0 100644 --- a/src/html/pages.rs +++ b/src/html/pages.rs @@ -126,7 +126,7 @@ impl IndexCtx { .into_iter() .map(|(title, nodes)| { ( - crate::html::util::SectionHeaderCtx { + SectionHeaderCtx { title, href: None, doc: None, From a29a0129222c06c3b4a4e93d8e5a9644c25eb197 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 12:51:28 +0200 Subject: [PATCH 12/17] fix ordering --- src/html/mod.rs | 18 +++++++++++++++++- src/html/partition.rs | 19 ++++++++----------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/html/mod.rs b/src/html/mod.rs index b0792930..406e4dc9 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -2,6 +2,7 @@ use deno_ast::ModuleSpecifier; use handlebars::handlebars_helper; use handlebars::Handlebars; use indexmap::IndexMap; +use std::cmp::Ordering; use std::collections::HashMap; use std::path::PathBuf; use std::rc::Rc; @@ -161,7 +162,7 @@ impl<'ctx> GenerateCtx<'ctx> { } } -#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] +#[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct ShortPath { pub path: String, pub specifier: ModuleSpecifier, @@ -244,6 +245,21 @@ impl ShortPath { } } +impl Ord for ShortPath { + fn cmp(&self, other: &Self) -> Ordering { + self + .is_main + .cmp(&other.is_main) + .then_with(|| self.display_name().cmp(&other.display_name())) + } +} + +impl PartialOrd for ShortPath { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] pub enum DocNodeKindWithDrilldown { Property, diff --git a/src/html/partition.rs b/src/html/partition.rs index 03d44a75..16744b1b 100644 --- a/src/html/partition.rs +++ b/src/html/partition.rs @@ -264,18 +264,13 @@ pub fn partition_nodes_by_entrypoint( flatten_namespaces, ); - for (_kind, nodes) in partitions.iter_mut() { - nodes.sort_by_key(|n| n.get_name().to_string()); + for (_file, nodes) in partitions.iter_mut() { + nodes.sort_by(compare_node); } + partitions.sort_keys(); + partitions - .sorted_by(|key1, _value1, key2, _value2| { - key1 - .is_main - .cmp(&key2.is_main) - .then_with(|| key1.display_name().cmp(&key2.display_name())) - }) - .collect() } fn compare_node( @@ -298,9 +293,11 @@ fn compare_node( .then_with(|| { node1 .get_name() - .cmp(node2.get_name()) - .then_with(|| node1.kind.cmp(&node2.kind)) + .to_ascii_lowercase() + .cmp(&node2.get_name().to_ascii_lowercase()) }) + .then_with(|| node1.get_name().cmp(node2.get_name())) + .then_with(|| node1.kind.cmp(&node2.kind)) } pub fn get_partitions_for_file( From 0fb85ad663ef5144c97355a1064e5b26de273bdc Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 15:55:46 +0200 Subject: [PATCH 13/17] fix ordering --- src/html/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/html/mod.rs b/src/html/mod.rs index 406e4dc9..9ed13659 100644 --- a/src/html/mod.rs +++ b/src/html/mod.rs @@ -247,9 +247,9 @@ impl ShortPath { impl Ord for ShortPath { fn cmp(&self, other: &Self) -> Ordering { - self + other .is_main - .cmp(&other.is_main) + .cmp(&self.is_main) .then_with(|| self.display_name().cmp(&other.display_name())) } } From f4e92609392587648728bd718cfb05192d51c3f2 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Tue, 23 Apr 2024 18:12:43 +0200 Subject: [PATCH 14/17] update usage styling --- src/html/templates/styles.css | 4 ++-- src/html/templates/styles.gen.css | 2 +- src/html/templates/usages.hbs | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/html/templates/styles.css b/src/html/templates/styles.css index 3f9ef7c2..3f4fb8be 100644 --- a/src/html/templates/styles.css +++ b/src/html/templates/styles.css @@ -233,10 +233,10 @@ summary::-webkit-details-marker { @apply md:relative; > div { - @apply absolute max-md:inset-x-0 mt-1.5 p-2 block z-30 md:w-72 bg-white md:rounded border max-md:border-x-0 border-gray-300; + @apply absolute max-md:inset-x-0 mt-1.5 p-2 block z-30 md:w-48 bg-white md:rounded border max-md:border-x-0 border-gray-300; label { - @apply flex items-center justify-between cursor-pointer select-none px-2 py-1 leading-normal rounded-sm hover:bg-gray-50; + @apply flex items-center gap-2 cursor-pointer select-none px-2 py-1 leading-normal rounded-sm hover:bg-gray-50; } } } diff --git a/src/html/templates/styles.gen.css b/src/html/templates/styles.gen.css index 5a57d51f..46c63a72 100644 --- a/src/html/templates/styles.gen.css +++ b/src/html/templates/styles.gen.css @@ -1 +1 @@ -.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{word-break:break-all;font-weight:500;line-height:1.25;display:block}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:18rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;justify-content:space-between;align-items:center;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file +.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{word-break:break-all;font-weight:500;line-height:1.25;display:block}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:12rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;align-items:center;gap:.5rem;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file diff --git a/src/html/templates/usages.hbs b/src/html/templates/usages.hbs index 856d13ea..26118bf6 100644 --- a/src/html/templates/usages.hbs +++ b/src/html/templates/usages.hbs @@ -29,9 +29,8 @@
    {{~#each usages~}} {{~/each~}}
    From 9ba32778b0e3d110fc93f36946aabdf9da667a3f Mon Sep 17 00:00:00 2001 From: crowlkats Date: Wed, 24 Apr 2024 04:03:17 +0200 Subject: [PATCH 15/17] fixes --- src/html/templates/breadcrumbs.hbs | 2 +- src/html/templates/pages/page.css | 8 +++++- src/html/templates/pages/page.gen.css | 2 +- src/html/templates/styles.css | 18 ++++++++----- src/html/templates/styles.gen.css | 2 +- src/html/templates/usages.hbs | 38 +++++++++++++++------------ src/html/usage.rs | 7 +---- 7 files changed, 43 insertions(+), 34 deletions(-) diff --git a/src/html/templates/breadcrumbs.hbs b/src/html/templates/breadcrumbs.hbs index 6e490a29..5f00ee5a 100644 --- a/src/html/templates/breadcrumbs.hbs +++ b/src/html/templates/breadcrumbs.hbs @@ -4,7 +4,7 @@
      {{~/if~}} -
    • +
    • {{~#if @last~}} {{~this.name~}} {{~else~}} diff --git a/src/html/templates/pages/page.css b/src/html/templates/pages/page.css index d8f93689..e05a880d 100644 --- a/src/html/templates/pages/page.css +++ b/src/html/templates/pages/page.css @@ -5,9 +5,15 @@ body { @apply flex flex-col lg:flex-row w-full overflow-x-hidden; } + #content { - @apply p-7 max-w-screen-xl w-full overflow-x-hidden + @apply p-7 max-w-screen-xl w-full overflow-x-hidden; + + &:not(:has(#sidepanel)) { + @apply mx-auto; + } } + #sidepanel { @apply py-3 pl-3 lg:w-72; } diff --git a/src/html/templates/pages/page.gen.css b/src/html/templates/pages/page.gen.css index 57b95277..196c19a4 100644 --- a/src/html/templates/pages/page.gen.css +++ b/src/html/templates/pages/page.gen.css @@ -1 +1 @@ -*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{color:inherit;border-top-width:1px;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.mb-6{margin-bottom:1.5rem}.block{display:block}.flex{display:flex}.flex-1{flex:1}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-4{gap:1rem}.overflow-hidden{overflow:hidden}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.bg-transparent{background-color:#0000}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.italic{font-style:italic}.leading-none{line-height:1}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.blur{--tw-blur:blur(8px);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}body{flex-direction:column;width:100%;display:flex;overflow-x:hidden}@media (min-width:1024px){body{flex-direction:row}}#content{width:100%;max-width:1280px;padding:1.75rem;overflow-x:hidden}#sidepanel{padding-top:.75rem;padding-bottom:.75rem;padding-left:.75rem}@media (min-width:1024px){#sidepanel{width:18rem}}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}@media not all and (min-width:1024px){.max-lg\:flex-col-reverse{flex-direction:column-reverse}}@media (min-width:1024px){.lg\:max-w-80{max-width:20rem}.lg\:items-center{align-items:center}} \ No newline at end of file +*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{color:inherit;border-top-width:1px;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.mb-6{margin-bottom:1.5rem}.block{display:block}.flex{display:flex}.flex-1{flex:1}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-4{gap:1rem}.overflow-hidden{overflow:hidden}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.bg-transparent{background-color:#0000}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.italic{font-style:italic}.leading-none{line-height:1}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.blur{--tw-blur:blur(8px);filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}body{flex-direction:column;width:100%;display:flex;overflow-x:hidden}@media (min-width:1024px){body{flex-direction:row}}#content{width:100%;max-width:1280px;padding:1.75rem;overflow-x:hidden}#content:not(:has(#sidepanel)){margin-left:auto;margin-right:auto}#sidepanel{padding-top:.75rem;padding-bottom:.75rem;padding-left:.75rem}@media (min-width:1024px){#sidepanel{width:18rem}}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}@media not all and (min-width:1024px){.max-lg\:flex-col-reverse{flex-direction:column-reverse}}@media (min-width:1024px){.lg\:max-w-80{max-width:20rem}.lg\:items-center{align-items:center}} \ No newline at end of file diff --git a/src/html/templates/styles.css b/src/html/templates/styles.css index 3f4fb8be..2923f520 100644 --- a/src/html/templates/styles.css +++ b/src/html/templates/styles.css @@ -121,7 +121,7 @@ summary::-webkit-details-marker { } .namespaceSection { - @apply grid grid-cols-1 gap-y-3 lg:grid-cols-4 lg:gap-x-3 lg:gap-y-8; + @apply grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-y-3 md:gap-x-3 md:gap-y-8; .namespaceItem { @apply flex gap-x-2.5; @@ -242,21 +242,25 @@ summary::-webkit-details-marker { } } } +} - pre.highlight { - @apply border border-gray-300 max-md:border-x-0; - } +.usageContent pre.highlight { + @apply border border-gray-300 max-md:border-x-0; } .contextLink { - @apply text-contextLink underline decoration-[1.5px] decoration-contextLink/50 underline-offset-4 hover:decoration-contextLink; + @apply text-contextLink/80 underline decoration-[1.5px] decoration-contextLink/50 underline-offset-4 hover:text-contextLink hover:decoration-contextLink; } .breadcrumbs { @apply whitespace-nowrap inline-flex gap-1 items-center; - > li, > ul { - @apply py-1 px-2; + > li:first-child { + @apply text-xl lg:text-2xl leading-none font-bold; + } + + li { + @apply inline lg:text-xl leading-[0.9em]; } } diff --git a/src/html/templates/styles.gen.css b/src/html/templates/styles.gen.css index 46c63a72..8f0d50b8 100644 --- a/src/html/templates/styles.gen.css +++ b/src/html/templates/styles.gen.css @@ -1 +1 @@ -.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .rounded-lg{border-radius:.5rem}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .italic{font-style:italic}.ddoc .leading-\[0\.9em\]{line-height:.9em}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:1024px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:2rem .75rem}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{word-break:break-all;font-weight:500;line-height:1.25;display:block}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:12rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;align-items:center;gap:.5rem;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usage pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usage pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li,.ddoc .breadcrumbs>ul{padding:.25rem .5rem}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .hover\:bg-\[\#EBF6FF\]:hover{--tw-bg-opacity:1;background-color:rgb(235 246 255/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}.ddoc .lg\:text-2xl{font-size:1.5rem;line-height:2rem}.ddoc .lg\:text-xl{font-size:1.25rem;line-height:1.75rem}} \ No newline at end of file +.ddoc .container{width:100%}@media (min-width:640px){.ddoc .container{max-width:640px}}@media (min-width:768px){.ddoc .container{max-width:768px}}@media (min-width:1024px){.ddoc .container{max-width:1024px}}@media (min-width:1280px){.ddoc .container{max-width:1280px}}@media (min-width:1536px){.ddoc .container{max-width:1536px}}.ddoc .static{position:static}.ddoc .relative{position:relative}.ddoc .\!ml-2{margin-left:.5rem!important}.ddoc .ml-2{margin-left:.5rem}.ddoc .ml-4{margin-left:1rem}.ddoc .mr-2{margin-right:.5rem}.ddoc .mt-1{margin-top:.25rem}.ddoc .mt-3{margin-top:.75rem}.ddoc .block{display:block}.ddoc .inline{display:inline}.ddoc .flex{display:flex}.ddoc .inline-flex{display:inline-flex}.ddoc .table{display:table}.ddoc .hidden{display:none}.ddoc .h-4{height:1rem}.ddoc .h-5{height:1.25rem}.ddoc .min-w-0{min-width:0}.ddoc .flex-1{flex:1}.ddoc .grow{flex-grow:1}.ddoc .rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .items-center{align-items:center}.ddoc .gap-0{gap:0}.ddoc .gap-0\.5{gap:.125rem}.ddoc .gap-1{gap:.25rem}.ddoc .gap-2{gap:.5rem}.ddoc .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*calc(1 - var(--tw-space-x-reverse)))}.ddoc .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.ddoc .overflow-x-auto{overflow-x:auto}.ddoc .rounded-full{border-radius:9999px}.ddoc .border{border-width:1px}.ddoc .border-l-2{border-left-width:2px}.ddoc .border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ddoc .bg-Class\/15{background-color:#20b44b26}.ddoc .bg-Enum\/15{background-color:#22abb026}.ddoc .bg-Function\/15{background-color:#056cf026}.ddoc .bg-Interface\/15{background-color:#d2a06426}.ddoc .bg-Method\/15{background-color:#056cf026}.ddoc .bg-Namespace\/15{background-color:#d2564626}.ddoc .bg-Property\/15{background-color:#7e57c026}.ddoc .bg-TypeAlias\/15{background-color:#a4478c26}.ddoc .bg-Variable\/15{background-color:#7e57c026}.ddoc .bg-abstract\/15{background-color:#0cafc626}.ddoc .bg-deprecated\/15{background-color:#dc262626}.ddoc .bg-new\/15{background-color:#7b61ff26}.ddoc .bg-optional\/15{background-color:#0cafc626}.ddoc .bg-other\/15{background-color:#57534e26}.ddoc .bg-permissions\/15{background-color:#0cafc626}.ddoc .bg-private\/15,.ddoc .bg-protected\/15,.ddoc .bg-readonly\/15,.ddoc .bg-writeonly\/15{background-color:#7b61ff26}.ddoc .px-2{padding-left:.5rem;padding-right:.5rem}.ddoc .px-3{padding-left:.75rem;padding-right:.75rem}.ddoc .py-1{padding-top:.25rem;padding-bottom:.25rem}.ddoc .py-2{padding-top:.5rem;padding-bottom:.5rem}.ddoc .pl-4{padding-left:1rem}.ddoc .text-sm{font-size:.875rem;line-height:1.25rem}.ddoc .text-xl{font-size:1.25rem;line-height:1.75rem}.ddoc .font-bold{font-weight:700}.ddoc .font-medium{font-weight:500}.ddoc .font-normal{font-weight:400}.ddoc .italic{font-style:italic}.ddoc .leading-none{line-height:1}.ddoc .text-Class{--tw-text-opacity:1;color:rgb(32 180 75/var(--tw-text-opacity))}.ddoc .text-Enum{--tw-text-opacity:1;color:rgb(34 171 176/var(--tw-text-opacity))}.ddoc .text-Function{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Interface{--tw-text-opacity:1;color:rgb(210 160 100/var(--tw-text-opacity))}.ddoc .text-Method{--tw-text-opacity:1;color:rgb(5 108 240/var(--tw-text-opacity))}.ddoc .text-Namespace{--tw-text-opacity:1;color:rgb(210 86 70/var(--tw-text-opacity))}.ddoc .text-Property{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-TypeAlias{--tw-text-opacity:1;color:rgb(164 71 140/var(--tw-text-opacity))}.ddoc .text-Variable{--tw-text-opacity:1;color:rgb(126 87 192/var(--tw-text-opacity))}.ddoc .text-\[\#0F172A\]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ddoc .text-abstract{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-deprecated{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .text-new{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-optional{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-other{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .text-permissions{--tw-text-opacity:1;color:rgb(12 175 198/var(--tw-text-opacity))}.ddoc .text-private,.ddoc .text-protected,.ddoc .text-readonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ddoc .text-writeonly{--tw-text-opacity:1;color:rgb(123 97 255/var(--tw-text-opacity))}.ddoc .line-through{text-decoration-line:line-through}.ddoc .decoration-stone-500\/70{text-decoration-color:#78716cb3}.ddoc .decoration-2{text-decoration-thickness:2px}.ddoc .opacity-60{opacity:.6}.ddoc .filter{filter:var(--tw-blur)var(--tw-brightness)var(--tw-contrast)var(--tw-grayscale)var(--tw-hue-rotate)var(--tw-invert)var(--tw-saturate)var(--tw-sepia)var(--tw-drop-shadow)}.ddoc summary::-webkit-details-marker{display:none}.ddoc{--ddoc-selection-border-width:2px;--ddoc-selection-border-color-default:#d6d3d1;--ddoc-selection-selected-border-color:#2564eb;--ddoc-selection-selected-bg:#056cf00c;--ddoc-selection-padding:9px 15px}.ddoc .link{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .link:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc #sidepanel{box-sizing:border-box;flex-shrink:0}@media (min-width:1024px){.ddoc #sidepanel{overscroll-behavior-y:contain;height:100vh;position:sticky;top:0;left:0;overflow-y:auto}}.ddoc #sidepanel{scrollbar-width:thin}.ddoc #sidepanel label,.ddoc #sidepanel a,.ddoc #sidepanel h2,.ddoc #sidepanel h3{padding:.375rem 1rem .375rem .5rem}.ddoc #sidepanel h2{align-items:center;gap:.625rem;margin-top:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;display:flex}.ddoc #sidepanel h3{font-weight:700}.ddoc #sidepanel ul{list-style-type:none}.ddoc #sidepanel li{display:block}.ddoc #sidepanel a{border-radius:.5rem;align-items:center;gap:.5rem;line-height:1;display:flex;position:relative}.ddoc #sidepanel li>a>span{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.875rem;line-height:1.25rem;display:block;overflow:hidden}.ddoc #sidepanel li>a:has(span){padding-top:.25rem;padding-bottom:.25rem}.ddoc #sidepanel a:hover,.ddoc #sidepanel a.active{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ddoc .anchor{float:left;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));margin-left:-24px;padding:.25rem;line-height:1;display:none;top:0;bottom:0}.ddoc .anchorable{position:relative}.ddoc .anchorable:hover .anchor{display:block}.ddoc .deprecated>div:first-child{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));align-items:center;gap:.25rem;padding-top:.25rem;padding-bottom:.25rem;display:flex}.ddoc .deprecated>div:first-child>span{font-weight:600;line-height:1.5rem}.ddoc .deprecated>div:nth-child(2){--tw-border-opacity:1;border-left-width:4px;border-color:rgb(252 165 165/var(--tw-border-opacity));margin-left:.25rem;padding-left:.5rem}.ddoc .symbolSubtitle>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.ddoc .symbolSubtitle{font-size:.875rem;line-height:1rem}.ddoc .symbolSubtitle .type{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity));font-style:italic}.ddoc .docEntry{font-size:.875rem;line-height:1.25rem}.ddoc .docEntry .docEntryHeader{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .docEntry .docEntryHeader>span{overflow-wrap:break-word;align-items:center;gap:.5rem;display:flex}.ddoc .section>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.ddoc .section>div>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .section>div>h2{padding-top:.25rem;padding-bottom:.25rem;font-size:1.25rem;font-weight:600;line-height:1.5rem}.ddoc .namespaceSection{grid-template-columns:repeat(1,minmax(0,1fr));row-gap:.75rem;display:grid}@media (min-width:640px){.ddoc .namespaceSection{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.ddoc .namespaceSection{-moz-column-gap:.75rem;grid-template-columns:repeat(3,minmax(0,1fr));gap:2rem .75rem}}@media (min-width:1024px){.ddoc .namespaceSection{grid-template-columns:repeat(4,minmax(0,1fr))}}.ddoc .namespaceSection .namespaceItem{-moz-column-gap:.625rem;column-gap:.625rem;display:flex}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon{flex-direction:column;justify-content:flex-start;width:auto}.ddoc .namespaceSection .namespaceItem .docNodeKindIcon>*+*{margin-top:-.125rem;margin-left:0}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated]{opacity:.6}.ddoc .namespaceSection .namespaceItem[aria-label=deprecated] .namespaceItemContent>a{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity));text-decoration-line:line-through;text-decoration-color:#78716cb3;text-decoration-thickness:2px}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>a{word-break:break-all;font-weight:500;line-height:1.25;display:block}.ddoc .namespaceSection .namespaceItem .namespaceItemContent>div{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem}.ddoc .symbolGroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child{justify-content:space-between;align-items:flex-start;display:flex}.ddoc .symbolGroup article>div:first-child>div:first-child>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .symbolGroup article>div:first-child>div:first-child{font-weight:500}.ddoc .docNodeKindIcon{flex-shrink:0;justify-content:flex-end;display:inline-flex}.ddoc .docNodeKindIcon div{-webkit-user-select:none;user-select:none;text-align:center;vertical-align:middle;border-radius:9999px;flex-shrink:0;width:1.25rem;height:1.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;font-weight:500;line-height:1.25rem}.ddoc .docNodeKindIcon>*+*{margin-left:-.375rem}.ddoc .example details summary{cursor:pointer;border-radius:.5rem;align-items:center;gap:.5rem;width:100%;padding-top:.5rem;padding-bottom:.5rem;line-height:1.5rem;list-style-type:none;display:flex}.ddoc .example details summary>div:first-child{-webkit-user-select:none;user-select:none;--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ddoc .example details[open] summary>div:first-child{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.ddoc .tocable{gap:1.5rem;display:flex}@media not all and (min-width:1024px){.ddoc .tocable{flex-direction:column-reverse}}.ddoc .tocable .toc{box-sizing:border-box;flex:none;max-width:13rem;max-height:100vh;padding-top:1rem;padding-bottom:1rem;font-size:.875rem;line-height:1.25rem;position:sticky;top:0}@media not all and (min-width:1024px){.ddoc .tocable .toc{display:none}}.ddoc .tocable .toc>ul{height:100%;display:block}.ddoc .tocable .toc>ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc>ul{overflow-y:auto}.ddoc .tocable .toc>ul ul{margin-left:1rem}.ddoc .tocable .toc>ul ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .tocable .toc a{text-overflow:ellipsis;white-space:nowrap;display:block;overflow-x:hidden}.ddoc .tocable .toc a:hover{text-decoration-line:underline}.ddoc .usage{--tw-border-opacity:1;border-width:1px;border-color:rgb(231 229 228/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity));margin-bottom:1rem;padding:1.25rem 1.5rem}@media not all and (min-width:768px){.ddoc .usage{border-left-width:0;border-right-width:0}}@media (min-width:768px){.ddoc .usage{border-radius:.5rem}}.ddoc .usage nav{flex-direction:row;align-items:center;gap:.5rem;margin-bottom:.75rem;font-weight:600;display:flex}.ddoc .usage nav details>summary{cursor:pointer;-webkit-user-select:none;user-select:none;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));border-radius:.25rem;gap:.25rem;padding:.5rem .75rem;display:flex}@media (min-width:768px){.ddoc .usage nav details>div{position:relative}}.ddoc .usage nav details>div>div{z-index:30;--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));margin-top:.375rem;padding:.5rem;display:block;position:absolute}@media not all and (min-width:768px){.ddoc .usage nav details>div>div{border-left-width:0;border-right-width:0;left:0;right:0}}@media (min-width:768px){.ddoc .usage nav details>div>div{border-radius:.25rem;width:12rem}}.ddoc .usage nav details>div>div label{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:.125rem;align-items:center;gap:.5rem;padding:.25rem .5rem;line-height:1.5;display:flex}.ddoc .usage nav details>div>div label:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ddoc .usageContent pre.highlight{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity))}@media not all and (min-width:768px){.ddoc .usageContent pre.highlight{border-left-width:0;border-right-width:0}}.ddoc .contextLink{color:#0e6590cc;text-underline-offset:4px;text-decoration-line:underline;text-decoration-color:#0e659080;text-decoration-thickness:1.5px}.ddoc .contextLink:hover{--tw-text-opacity:1;color:rgb(14 101 144/var(--tw-text-opacity));text-decoration-color:#0e6590}.ddoc .breadcrumbs{white-space:nowrap;align-items:center;gap:.25rem;display:inline-flex}.ddoc .breadcrumbs>li:first-child{font-size:1.25rem;font-weight:700;line-height:1}@media (min-width:1024px){.ddoc .breadcrumbs>li:first-child{font-size:1.5rem;line-height:2rem}}.ddoc .breadcrumbs li{line-height:.9em;display:inline}@media (min-width:1024px){.ddoc .breadcrumbs li{font-size:1.25rem;line-height:1.75rem}}.ddoc .functionOverload{cursor:pointer;display:block}.ddoc .functionOverload>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.ddoc .functionOverload{--tw-border-opacity:1;border-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));border-radius:.5rem;padding:.625rem 1rem}.ddoc .functionOverload:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ddoc .context_button{z-index:10;cursor:pointer;background-color:inherit;border-width:1px;border-radius:.25rem;padding:.375rem;line-height:0}.ddoc .context_button:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ddoc .markdown_border{border-color:#d6d3d166;border-left-width:2px;margin-left:.25rem;padding-left:.625rem}.ddoc .markdown_summary{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity));display:inline}.ddoc .markdown_summary p{display:inline-block}.ddoc .markdown_summary :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown{flex-shrink:1;min-width:0}.ddoc .markdown>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.ddoc .markdown a:not(.no_color){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:75ms;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ddoc .markdown a:not(.no_color):hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ddoc .markdown h1{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.25rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h1{font-size:1.5rem;line-height:2rem}}@media (min-width:1024px){.ddoc .markdown h1{font-size:1.875rem;line-height:2.25rem}}.ddoc .markdown h2{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(214 211 209/var(--tw-border-opacity));padding-bottom:.25rem;font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.ddoc .markdown h2{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h2{font-size:1.5rem;line-height:2rem}}.ddoc .markdown h3{font-weight:700}@media (min-width:768px){.ddoc .markdown h3{font-size:1.125rem;font-weight:400;line-height:1.75rem}}@media (min-width:1024px){.ddoc .markdown h3{font-size:1.25rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h4{font-weight:600}@media (min-width:768px){.ddoc .markdown h4{font-weight:700}}@media (min-width:1024px){.ddoc .markdown h4{font-size:1.125rem;font-weight:400;line-height:1.75rem}}.ddoc .markdown h5{font-style:italic}@media (min-width:768px){.ddoc .markdown h5{font-weight:600}}@media (min-width:1024px){.ddoc .markdown h5{font-weight:700}}@media (min-width:768px){.ddoc .markdown h6{font-style:italic}}@media (min-width:1024px){.ddoc .markdown h6{font-weight:600}}.ddoc .markdown hr{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity));margin:.5rem}.ddoc .markdown ol,.ddoc .markdown ul{margin-left:1rem;list-style-position:outside}.ddoc .markdown ol{list-style-type:decimal}.ddoc .markdown ul{list-style-type:disc}.ddoc .markdown :not(pre)>code{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity));border-radius:.25rem;padding:.125rem .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}:is(.ddoc .markdown h1,.ddoc .markdown h2,.ddoc .markdown h3,.ddoc .markdown h4,.ddoc .markdown h5,.ddoc .markdown h6)>code{font-size:inherit!important}.ddoc .markdown pre{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity));border-radius:.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.ddoc .markdown pre>code:first-child{padding:1rem;display:block;overflow-x:auto}.ddoc .markdown p{margin:.25rem 0}.ddoc .markdown table{table-layout:auto;width:max-content;max-width:100%;display:block;overflow:auto}.ddoc .markdown td{--tw-border-opacity:1;border-width:1px;border-color:rgb(120 113 108/var(--tw-border-opacity));padding:.5rem}.ddoc .markdown th{text-align:center;font-weight:700}.ddoc .markdown img{display:inline-block}.ddoc .markdown .alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.ddoc .markdown .alert{border-left-width:4px;padding:.5rem 1rem}.ddoc .markdown .alert div:first-child{align-items:center;gap:.375rem;font-weight:500;display:flex}.ddoc .markdown .alert div:first-child svg{width:1.25rem;height:1.25rem}.ddoc .markdown .alert-note{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ddoc .markdown .alert-note div:first-child{stroke:#2563eb;--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ddoc .markdown .alert-tip{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ddoc .markdown .alert-tip div:first-child{stroke:#16a34a;--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ddoc .markdown .alert-important{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ddoc .markdown .alert-important div:first-child{stroke:#9333ea;--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ddoc .markdown .alert-warning{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ddoc .markdown .alert-warning div:first-child{stroke:#ca8a04;--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ddoc .markdown .alert-caution{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ddoc .markdown .alert-caution div:first-child{stroke:#dc2626;--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ddoc .markdown .highlight{position:relative}.ddoc .markdown .highlight .lineNumbers{--tw-border-opacity:1;border-right-width:2px;border-color:rgb(214 211 209/var(--tw-border-opacity));text-align:right;flex:none;padding-right:.25rem}.ddoc .markdown .highlight .context_button{opacity:.6;position:absolute;top:.75rem;right:1rem}.ddoc .markdown .highlight .context_button:hover{opacity:1}.ddoc .markdown .highlight .pl-c{color:#6a737d}.ddoc .markdown .highlight .pl-c1,.ddoc .markdown .highlight .pl-s .pl-v{color:#005cc5}.ddoc .markdown .highlight .pl-e,.ddoc .markdown .highlight .pl-en{color:#6f42c1}.ddoc .markdown .highlight .pl-smi,.ddoc .markdown .highlight .pl-s .pl-s1{color:#24292e}.ddoc .markdown .highlight .pl-ent{color:#22863a}.ddoc .markdown .highlight .pl-k{color:#d73a49}.ddoc .markdown .highlight .pl-s,.ddoc .markdown .highlight .pl-pds,.ddoc .markdown .highlight .pl-s .pl-pse .pl-s1,.ddoc .markdown .highlight .pl-sr,.ddoc .markdown .highlight .pl-sr .pl-cce,.ddoc .markdown .highlight .pl-sr .pl-sre,.ddoc .markdown .highlight .pl-sr .pl-sra{color:#032f62}.ddoc .markdown .highlight .pl-v,.ddoc .markdown .highlight .pl-smw{color:#e36209}.ddoc .markdown .highlight .pl-bu{color:#b31d28}.ddoc .markdown .highlight .pl-ii{color:#fafbfc;background-color:#b31d28}.ddoc .markdown .highlight .pl-c2{color:#fafbfc;background-color:#d73a49}.ddoc .markdown .highlight .pl-c2:before{content:"^M"}.ddoc .markdown .highlight .pl-sr .pl-cce{color:#22863a;font-weight:700}.ddoc .markdown .highlight .pl-ml{color:#735c0f}.ddoc .markdown .highlight .pl-mh,.ddoc .markdown .highlight .pl-mh .pl-en,.ddoc .markdown .highlight .pl-ms{color:#005cc5;font-weight:700}.ddoc .markdown .highlight .pl-mi{color:#24292e;font-style:italic}.ddoc .markdown .highlight .pl-mb{color:#24292e;font-weight:700}.ddoc .markdown .highlight .pl-md{color:#b31d28;background-color:#ffeef0}.ddoc .markdown .highlight .pl-mi1{color:#22863a;background-color:#f0fff4}.ddoc .markdown .highlight .pl-mc{color:#e36209;background-color:#ffebda}.ddoc .markdown .highlight .pl-mi2{color:#f6f8fa;background-color:#005cc5}.ddoc .\*\:h-4>*{height:1rem}.ddoc .\*\:h-5>*{height:1.25rem}.ddoc .\*\:w-auto>*{width:auto}.ddoc .\*\:flex-none>*{flex:none}.ddoc .target\:bg-yellow-200:target{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ddoc .peer:checked~.peer-checked\:block{display:block}@media not all and (min-width:1024px){.ddoc .max-lg\:flex{display:flex}.ddoc .max-lg\:hidden{display:none}.ddoc .max-lg\:justify-between{justify-content:space-between}}@media (min-width:1024px){.ddoc .lg\:hidden{display:none}} \ No newline at end of file diff --git a/src/html/templates/usages.hbs b/src/html/templates/usages.hbs index 26118bf6..3900c8f6 100644 --- a/src/html/templates/usages.hbs +++ b/src/html/templates/usages.hbs @@ -1,14 +1,14 @@ -
      - {{~#each usages~}} - +{{~#if (gte (len usages) 2) ~}} +
      + {{~#each usages~}} + - - {{~/each~}} + + {{~/each~}} - {{~#if ../show_tabs~}} -
      - {{~/if}} -
      - {{~#each usages~}} -
      - {{{~content~}}} {{! markdown rendering }} -
      - {{~/each~}} +
      + {{~#each usages~}} +
      + {{{~content~}}} {{! markdown rendering }} +
      + {{~/each~}} +
      +
      +{{~else~}} +
      + {{{~usages.[0].content~}}} {{! markdown rendering }}
      -
      +{{~/if~}} diff --git a/src/html/usage.rs b/src/html/usage.rs index 461619da..89bdae52 100644 --- a/src/html/usage.rs +++ b/src/html/usage.rs @@ -103,7 +103,6 @@ pub fn usage_to_md( #[derive(Clone, Debug, Serialize)] pub struct UsagesCtx { - show_tabs: bool, usages: Vec, } @@ -149,10 +148,7 @@ impl UsagesCtx { if usages.is_empty() { None } else { - Some(UsagesCtx { - show_tabs: true, - usages, - }) + Some(UsagesCtx { usages }) } } else { let import_statement = usage_to_md(ctx, doc_nodes, &url); @@ -160,7 +156,6 @@ impl UsagesCtx { crate::html::jsdoc::render_markdown(ctx, &import_statement); Some(UsagesCtx { - show_tabs: false, usages: vec![UsageCtx { name: "".to_string(), content: rendered_import_statement, From 909b757fa154bffad6645349dcea7d38186c30df Mon Sep 17 00:00:00 2001 From: crowlkats Date: Wed, 24 Apr 2024 05:53:05 +0200 Subject: [PATCH 16/17] fix markdown --- src/html/jsdoc.rs | 7 ++++++- src/html/symbols/function.rs | 2 +- src/html/symbols/mod.rs | 4 +--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/html/jsdoc.rs b/src/html/jsdoc.rs index 26698343..c3d7399f 100644 --- a/src/html/jsdoc.rs +++ b/src/html/jsdoc.rs @@ -49,6 +49,8 @@ fn parse_links<'a>(md: &'a str, ctx: &RenderContext) -> Cow<'a, str> { (title, href) } else { + let title = if title.is_empty() { link } else { title }; + (title, link.to_string()) }; @@ -565,7 +567,10 @@ impl ModuleDocCtx { { let deprecated = node.js_doc.tags.iter().find_map(|tag| { if let JsDocTag::Deprecated { doc } = tag { - Some(doc.to_owned().unwrap_or_default()) + Some(render_markdown( + render_ctx, + doc.as_deref().unwrap_or_default(), + )) } else { None } diff --git a/src/html/symbols/function.rs b/src/html/symbols/function.rs index 34d849c3..8aea0931 100644 --- a/src/html/symbols/function.rs +++ b/src/html/symbols/function.rs @@ -80,7 +80,7 @@ impl FunctionCtx { Some( doc .as_ref() - .map(|doc| crate::html::jsdoc::render_markdown_summary(ctx, doc)) + .map(|doc| crate::html::jsdoc::render_markdown(ctx, doc)) .unwrap_or_default(), ) } else { diff --git a/src/html/symbols/mod.rs b/src/html/symbols/mod.rs index 12d62441..8cdd34af 100644 --- a/src/html/symbols/mod.rs +++ b/src/html/symbols/mod.rs @@ -105,9 +105,7 @@ impl SymbolGroupCtx { Some( doc .as_ref() - .map(|doc| { - crate::html::jsdoc::render_markdown_summary(ctx, doc) - }) + .map(|doc| crate::html::jsdoc::render_markdown(ctx, doc)) .unwrap_or_default(), ) } else { From 964a579e2ff1b6d611c32f19ce47f198fc397354 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Wed, 24 Apr 2024 14:28:46 +0200 Subject: [PATCH 17/17] update test --- tests/testdata/module_doc-syntect.json | 2 -- tests/testdata/module_doc-tree-sitter.json | 2 -- tests/testdata/module_doc.json | 2 -- tests/testdata/symbol_group-syntect.json | 9 --------- tests/testdata/symbol_group-tree-sitter.json | 9 --------- tests/testdata/symbol_group.json | 9 --------- 6 files changed, 33 deletions(-) diff --git a/tests/testdata/module_doc-syntect.json b/tests/testdata/module_doc-syntect.json index 71dc5124..4b40ac31 100644 --- a/tests/testdata/module_doc-syntect.json +++ b/tests/testdata/module_doc-syntect.json @@ -2,7 +2,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -22,7 +21,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", diff --git a/tests/testdata/module_doc-tree-sitter.json b/tests/testdata/module_doc-tree-sitter.json index f8c1648c..dfb5eb04 100644 --- a/tests/testdata/module_doc-tree-sitter.json +++ b/tests/testdata/module_doc-tree-sitter.json @@ -2,7 +2,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -22,7 +21,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", diff --git a/tests/testdata/module_doc.json b/tests/testdata/module_doc.json index b60432e2..3971b11f 100644 --- a/tests/testdata/module_doc.json +++ b/tests/testdata/module_doc.json @@ -2,7 +2,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -22,7 +21,6 @@ { "deprecated": null, "usages": { - "show_tabs": false, "usages": [ { "name": "", diff --git a/tests/testdata/symbol_group-syntect.json b/tests/testdata/symbol_group-syntect.json index c15638d4..05ff81af 100644 --- a/tests/testdata/symbol_group-syntect.json +++ b/tests/testdata/symbol_group-syntect.json @@ -122,7 +122,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -337,7 +336,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -491,7 +489,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -664,7 +661,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -836,7 +832,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1014,7 +1009,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1198,7 +1192,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1382,7 +1375,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1554,7 +1546,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", diff --git a/tests/testdata/symbol_group-tree-sitter.json b/tests/testdata/symbol_group-tree-sitter.json index 11e2bb37..6337de9f 100644 --- a/tests/testdata/symbol_group-tree-sitter.json +++ b/tests/testdata/symbol_group-tree-sitter.json @@ -122,7 +122,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -337,7 +336,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -491,7 +489,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -664,7 +661,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -836,7 +832,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1014,7 +1009,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1198,7 +1192,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1382,7 +1375,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1554,7 +1546,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", diff --git a/tests/testdata/symbol_group.json b/tests/testdata/symbol_group.json index 78e86bd6..e57cd602 100644 --- a/tests/testdata/symbol_group.json +++ b/tests/testdata/symbol_group.json @@ -122,7 +122,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -337,7 +336,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -491,7 +489,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -664,7 +661,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -836,7 +832,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1014,7 +1009,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1198,7 +1192,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1382,7 +1375,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "", @@ -1554,7 +1546,6 @@ } ], "usages": { - "show_tabs": false, "usages": [ { "name": "",