elements based on their data-language attribute.
+ def fix_code_blocks(html)
+ html.gsub(%r{}) { %() }
+ end
+
+ def fix_links(html, page)
+ html.gsub(/href="(\/[^"]*)"/) { %(href="#{fix_link($1, page)}") }
+ end
+
+ def fix_link(href, page)
+ path, _, fragment = href.partition('#')
+ path = path.delete_prefix('/')
+
+ if (target = pages_by_source_path[path.delete_suffix('.md')])
+ path = relative_path_from(page.path, target.path)
+ else
+ # Anything that isn't scraped (the blog, the playground, the thesis PDF)
+ # is linked to the website instead.
+ path = File.join(base_url.to_s, path.sub(/\.md\z/, '/'))
+ end
+
+ fragment.empty? ? path : "#{path}##{fragment}"
+ end
+
+ def relative_path_from(path, other_path)
+ Pathname.new(other_path).relative_path_from(File.dirname(path)).to_s
+ end
+
+ # Mirrors AttributionFilter, which isn't in the pipeline because these pages
+ # never go through it. The link points at the HTML version of the page.
+ def attribution_for(page)
+ url = File.join(base_url.to_s, page.source_path, '/')
+ <<-HTML.strip_heredoc
+
+
+ #{options[:attribution].strip_heredoc.delete "\n"}
+ #{url}
+
+
+ HTML
+ end
+
+ def markdown_renderer
+ @markdown_renderer ||= Redcarpet::Markdown.new(
+ Redcarpet::Render::HTML.new(with_toc_data: true),
+ autolink: true,
+ fenced_code_blocks: true,
+ no_intra_emphasis: true,
+ strikethrough: true,
+ tables: true
+ )
+ end
+ end
+end
diff --git a/public/icons/docs/valibot/16.png b/public/icons/docs/valibot/16.png
new file mode 100644
index 0000000000..4b26b54465
Binary files /dev/null and b/public/icons/docs/valibot/16.png differ
diff --git a/public/icons/docs/valibot/16@2x.png b/public/icons/docs/valibot/16@2x.png
new file mode 100644
index 0000000000..fc7c53fe7d
Binary files /dev/null and b/public/icons/docs/valibot/16@2x.png differ
diff --git a/public/icons/docs/valibot/SOURCE b/public/icons/docs/valibot/SOURCE
new file mode 100644
index 0000000000..22b4aab9c5
--- /dev/null
+++ b/public/icons/docs/valibot/SOURCE
@@ -0,0 +1 @@
+https://valibot.dev/icon-32px.png