From c1e28224aa2e1450031669d9a7e359b63e04687d Mon Sep 17 00:00:00 2001 From: Volpeon Date: Wed, 22 Jul 2026 19:40:59 +0200 Subject: Init --- src/pages/index.mdx | 10 ++++ src/pages/index.tsx | 64 ++++++++++++++++++++++++ src/pages/pkg/corvos@[version].ts | 35 +++++++++++++ src/pages/releases/[version].tsx | 100 ++++++++++++++++++++++++++++++++++++++ src/pages/releases/feed.ts | 19 ++++++++ src/pages/releases/index.mdx | 8 +++ src/pages/releases/index.tsx | 51 +++++++++++++++++++ src/pages/sitemap.ts | 8 +++ 8 files changed, 295 insertions(+) create mode 100644 src/pages/index.mdx create mode 100644 src/pages/index.tsx create mode 100644 src/pages/pkg/corvos@[version].ts create mode 100644 src/pages/releases/[version].tsx create mode 100644 src/pages/releases/feed.ts create mode 100644 src/pages/releases/index.mdx create mode 100644 src/pages/releases/index.tsx create mode 100644 src/pages/sitemap.ts (limited to 'src/pages') diff --git a/src/pages/index.mdx b/src/pages/index.mdx new file mode 100644 index 0000000..1d35a1d --- /dev/null +++ b/src/pages/index.mdx @@ -0,0 +1,10 @@ +--- +type: "home" +title: "Corvos ยท static site generator" +description: "Project website of Corvos, a static site generator for Deno." +--- + +import { template } from "./index.tsx"; +export { template }; + +Corvos is a Static Site Generator with the goal to provide a customizeable, type-safe experience. diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..b1581b7 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,64 @@ +import { BaseLayout } from "$/ui/base/BaseLayout.tsx"; +import { ReleaseCard } from "$/ui/components/ReleaseCard.tsx"; +import { SiteHeader } from "$/ui/components/SiteHeader.tsx"; +import { CardList } from "$/ui/layouts/CardList.tsx"; +import { Container } from "$/ui/layouts/Container.tsx"; +import { Button } from "$/ui/objects/Button.tsx"; +import { Divider } from "$/ui/objects/Divider.tsx"; +import { Heading } from "$/ui/objects/Heading.tsx"; +import { Icon } from "$/ui/objects/Icon.tsx"; +import site from "@/corvos.config.ts"; + +export const template = site.$.template({ type: "home" }, (page, pages) => { + const query = site.$.query(pages); + const releasesIndex = query.type(".html").match({ type: "releases-index" }).one(); + const releases = query.type(".html").match({ type: "release" }).many().toArray(); + + return ( + + + {page.data.title} + + } + /> + + + + + + Corvos + + {" "} + – A static site generator for Deno. + + +
{{ __html: page.content }}
+ +
+ +
+
+ + + + + + {releases.map((page) => ( + + ))} + + +
+ ); +}); diff --git a/src/pages/pkg/corvos@[version].ts b/src/pages/pkg/corvos@[version].ts new file mode 100644 index 0000000..6dcb65a --- /dev/null +++ b/src/pages/pkg/corvos@[version].ts @@ -0,0 +1,35 @@ +import * as zip from "@zip-js/zip-js"; +import { Page, PipelineStageError } from "corvos"; +import { binaryLoader } from "corvos/core/loaders/binary.ts"; + +import { strapiLoader } from "$/deps/strapi.tsx"; +import { releaseStrapiSchema } from "$/schemas/releases.ts"; +import site from "@/corvos.config.ts"; + +export const pages = site.$.pageGenerator(async function* () { + for await (const item of strapiLoader.loadCollection("corvos-releases", releaseStrapiSchema, { + "populate[0]": "files", + "sort[0]": "date:desc", + })) { + if (item instanceof PipelineStageError) { + yield item; + continue; + } + + const res = await binaryLoader(new URL(item.files.url)); + const reader = new zip.ZipReader(new zip.Uint8ArrayReader(res.content)); + + for await (const entry of reader.getEntriesGenerator()) { + if (entry.directory) { + continue; + } + + yield new Page( + ".", + new Uint8Array(await entry.arrayBuffer()), + { version: item.version }, + `/pkg/corvos@${item.version}/${entry.filename}`, + ); + } + } +}); diff --git a/src/pages/releases/[version].tsx b/src/pages/releases/[version].tsx new file mode 100644 index 0000000..84d807a --- /dev/null +++ b/src/pages/releases/[version].tsx @@ -0,0 +1,100 @@ +import { Page, PipelineStageError } from "corvos"; + +import { strapiLoader } from "$/deps/strapi.tsx"; +import { releaseStrapiSchema } from "$/schemas/releases.ts"; +import { BaseLayout } from "$/ui/base/BaseLayout.tsx"; +import { ReleaseCard } from "$/ui/components/ReleaseCard.tsx"; +import { SiteHeader } from "$/ui/components/SiteHeader.tsx"; +import { CardList } from "$/ui/layouts/CardList.tsx"; +import { Container } from "$/ui/layouts/Container.tsx"; +import { HList } from "$/ui/layouts/HList.tsx"; +import { ActionButton } from "$/ui/objects/ActionButton.tsx"; +import { Badge } from "$/ui/objects/Badge.tsx"; +import { Body } from "$/ui/objects/Body.tsx"; +import { Divider } from "$/ui/objects/Divider.tsx"; +import { Heading } from "$/ui/objects/Heading.tsx"; +import { Icon } from "$/ui/objects/Icon.tsx"; +import site from "@/corvos.config.ts"; + +export const pages = site.$.pageGenerator(async function* () { + for await (const item of strapiLoader.loadCollection("corvos-releases", releaseStrapiSchema, { + "populate[0]": "files", + "sort[0]": "date:desc", + })) { + if (item instanceof PipelineStageError) { + yield item; + } else { + yield new Page(".strapi", item.notes ?? [], { + ...item, + title: `Corvos ${item.version}`, + type: "release" as const, + }); + } + } +}); + +export const template = site.$.template({ type: "release" }, (page, pages) => { + const query = site.$.query(pages); + + const feed = query.type(".rss").match({ type: "releases" }).one(); + + const prev = query.type(".html").match({ type: "release" }).prev(page); + const next = query.type(".html").match({ type: "release" }).next(page); + + return ( + + + } + level="quiet" + pill + title="RSS Feed" + /> + + } + > +
+ {page.data.title} +
+
+ + + +
  • + + + +
  • +
    + + + {page.data.title} + + + {{ __html: page.content }} +
    + + + + + + {prev && } + {next && } + + +
    + ); +}); diff --git a/src/pages/releases/feed.ts b/src/pages/releases/feed.ts new file mode 100644 index 0000000..b430ca5 --- /dev/null +++ b/src/pages/releases/feed.ts @@ -0,0 +1,19 @@ +import type { FeedItem } from "corvos/plugins/feeds.ts"; + +import site from "@/corvos.config.ts"; + +export const feeds = site.$.feedGenerator(function* (pages) { + const items = site.$.query(pages) + .match({ type: "release" }) + .many() + .take(20) + .map( + (page): FeedItem => ({ + title: page.data.title, + url: page.url, + content: page.content, + updated: page.data.date, + }), + ); + yield { type: "releases", title: `Releases`, url: "/releases/", items }; +}); diff --git a/src/pages/releases/index.mdx b/src/pages/releases/index.mdx new file mode 100644 index 0000000..6519c76 --- /dev/null +++ b/src/pages/releases/index.mdx @@ -0,0 +1,8 @@ +--- +type: "releases-index" +title: "Releases" +description: "All releases of Corvos." +--- + +import { template } from "./index.tsx"; +export { template }; diff --git a/src/pages/releases/index.tsx b/src/pages/releases/index.tsx new file mode 100644 index 0000000..132eee7 --- /dev/null +++ b/src/pages/releases/index.tsx @@ -0,0 +1,51 @@ +import { BaseLayout } from "$/ui/base/BaseLayout.tsx"; +import { ReleaseCard } from "$/ui/components/ReleaseCard.tsx"; +import { SiteHeader } from "$/ui/components/SiteHeader.tsx"; +import { CardList } from "$/ui/layouts/CardList.tsx"; +import { Container } from "$/ui/layouts/Container.tsx"; +import { ActionButton } from "$/ui/objects/ActionButton.tsx"; +import { Heading } from "$/ui/objects/Heading.tsx"; +import { Icon } from "$/ui/objects/Icon.tsx"; +import { PlaceholderBox } from "$/ui/objects/PlaceholderBox.tsx"; +import site from "@/corvos.config.ts"; + +export const template = site.$.template({ type: "releases-index" }, (page, pages) => { + const query = site.$.query(pages); + const items = query.type(".html").match({ type: "release" }).many().toArray(); + const feed = query.type(".rss").match({ type: "releases" }).one(); + + return ( + + + } + level="quiet" + pill + title="RSS Feed" + /> + + } + sm={ +
    + {page.data.title} +
    + } + >
    + + + + {items.map((item) => ( + + ))} + {!items.length && Nothing there yet} + + +
    + ); +}); diff --git a/src/pages/sitemap.ts b/src/pages/sitemap.ts new file mode 100644 index 0000000..378a9ed --- /dev/null +++ b/src/pages/sitemap.ts @@ -0,0 +1,8 @@ +import site from "@/corvos.config.ts"; + +export const sitemap = site.$.sitemap((pages) => ({ + items: pages.map((page) => ({ + loc: page.url, + lastmod: page.data.modifiedAt, + })), +})); -- cgit v1.3.1