blogOGImage.tsx1 match
4const LINE_HEIGHT = 72;
56export default function OGImage({
7title = "Val Town Blog",
8...props
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
23export default function (props: React.SVGProps<SVGSVGElement>) {
4return (
5<svg
blogLogoMark.tsx2 matches
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
23export default function(props: React.SVGProps<SVGSVGElement>) {
4return (
5<svg
18}
1920export function Favicon(props: React.SVGProps<SVGSVGElement>) {
21return (
22<svg
bloglive-reload.ts8 matches
4const client = new ValTown({ bearerToken: "" });
56async function getProjectAndBranchIds(importMetaUrl: string) {
7// imported dynamically because this is server-only but this file is also imported on the client
8const { parseProject } = await import("https://esm.town/v/std/utils@85-main/index.ts");
23}
2425async function projectLastUpdatedAt({ project_id, branch_id }: { project_id: string; branch_id: string }) {
26const { updatedAt } = await client.vals.branches.retrieve(
27project_id,
34* Creates a wrapper around a fetch handler that injects a script tag into HTML responses
35*
36* @param handler The original fetch handler function
37* @param scriptContent The HTML content to inject
38* @returns A new fetch handler with HTML rewriting capability
39*/
40export function injectHTML(
41handler: (request: Request) => Promise<Response>,
42html: string,
43): (request: Request) => Promise<Response> {
44let HTMLRewriter: typeof import("https://ghuc.cc/worker-tools/html-rewriter/index.ts").HTMLRewriter | undefined;
45// Return the new handler function
46return async (request: Request) => {
47if (!HTMLRewriter) {
69}
7071export function liveReload(
72handler: (request: Request) => Promise<Response>,
73importMetaUrl: string,
99* ------------------------------ */
100101async function registerNextCheck(
102{ pageLoad, project_id, branch_id }: { pageLoad: number; project_id: string; branch_id: string },
103) {
126}
127128export async function main(ids: { project_id: string; branch_id: string }) {
129// don't run this on custom domains, ie not on blog.val.run
130if (!window.location.hostname.endsWith(".val.run")) {
blogLayout.tsx1 match
14}
1516export function Layout({ title, post, children }: LayoutProps) {
17return (
18<html lang="en">
303border-radius: 9999px;
304transition-property: color, background-color;
305transition-timing-function: ease-in-out;
306transition-duration: 200ms;
307}
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
23export function RSSIcon (props: React.SVGProps<SVGSVGElement>) {
4return (
5<svg
24}
2526export function TwitterIcon (props: React.SVGProps<SVGSVGElement>) {
27return (
28<svg
41}
4243export function GitHubIcon (props: React.SVGProps<SVGSVGElement>) {
44return (
45<svg
59}
6061export function BlueskyIcon (props: React.SVGProps<SVGSVGElement>) {
62return (
63<svg
75}
7677export function DiscordIcon (props: React.SVGProps<SVGSVGElement>) {
78return (
79<svg
blogHomePage.tsx1 match
5import Byline from "./Byline.tsx";
67export function HomePage({ posts }: { posts: BlogPost[] }) {
8const latest = posts.at(0);
9const top = posts.slice(1, 3);
7const HLJS_CSS_URL = "https://cdn.jsdelivr.net/npm/highlight.js@11.8.0/styles/base16/solar-flare-light.css";
89export default function Head({ title, post }: {
10title: string;
11post?: BlogPost;
blogget-posts.ts1 match
45// Get all blog posts (local + RSS)
6export async function getAllBlogPosts(): Promise<BlogPost[]> {
7return (await Promise.all([
8getNewPosts(),