asw-v01: archive deferred content (packs, site, lab, legacy examples)

- 2.1: packs/ -> archive/packs/
- 2.2: site/ -> archive/site/
- 2.3: src/lab/ -> archive/lab/
- 2.4: examples/ -> archive/examples-legacy/ (SSI-based)
This commit is contained in:
exe.dev user 2026-06-07 10:39:21 +02:00
parent 416fe2f180
commit e47a9f4401
173 changed files with 11 additions and 5 deletions

View file

@ -0,0 +1,129 @@
# ASW-Hugo Pack
A Hugo theme that outputs pure [Agentic Semantic Web (ASW)](https://trentuna.com/asw/) semantic HTML with `data-*` attributes. Drop it into any Hugo project → content renders through ASW.
## What this is
This pack is an **ASW adapter for Hugo** — not a standalone theme. It makes Hugo output the semantic HTML + data-attribute vocabulary that ASW CSS understands.
```
Markdown vault (Git)
→ Hugo + ASW-Hugo pack (layouts emit ASW HTML)
→ static HTML with ASW CSS + data-* attributes
→ deploy anywhere
```
Long-term: trentuna will build a native ASW Site Builder. This pack is the bridge to alpha.
## Install
1. Copy or symlink `packs/hugo/` from the ASW repo into your project's `themes/` directory:
```bash
# From the agentic-semantic-web repo root:
cp -r packs/hugo/ /path/to/your-site/themes/asw-hugo/
# or symlink:
ln -s /path/to/agentic-semantic-web/packs/hugo/ /path/to/your-site/themes/asw-hugo
```
2. Add to your `hugo.toml`:
```toml
theme = "asw-hugo"
[taxonomies]
tag = "tags"
```
3. Copy ASW CSS into the theme's static directory:
```bash
cp /path/to/agentic-semantic-web/asw.css themes/asw-hugo/static/css/asw.css
```
> **Note:** `asw.css` is the `asw.css` file from the ASW repo root. B.A.'s deploy script handles this copy automatically for trentuna-web deployments.
4. **Self-host fonts** (recommended for production): The default `theme.css` imports Inter and
JetBrains Mono from Google Fonts. For self-hosted deployment, download the font files and
replace the `@import` in `static/css/theme.css` with local `@font-face` declarations.
See [google-webfonts-helper](https://gwfh.mranftl.com/) for font download.
## Usage
Write standard Markdown. Hugo renders it through ASW layouts automatically.
### Shortcodes
**Callout block:**
```
{{< callout note >}}
This is a note callout. Types: note, warning, tip, info
{{< /callout >}}
```
Renders as: `<aside data-callout="note">...</aside>`
**Wikilink:**
```
{{< wikilink "Page Name" "/path/to/page/" >}}
```
Renders as: `<a href="/path/to/page/" data-wikilink>Page Name</a>`
### ASW data-* vocabulary used
See `docs/agent-directive.md` in the ASW repo for the full vocabulary.
| Attribute | Where used | Meaning |
|-----------|-----------|---------|
| `data-callout="note\|warning\|tip\|info"` | `<aside>` | Callout block type |
| `data-wikilink` | `<a>` | Internal vault-style link |
| `data-role="tag-cloud"` | `<nav>` | Tag navigation |
| `data-layout="grid"` | `<section>` | Grid layout for list pages |
| `data-tag` | `<a>` | Tag label on links |
## Decap CMS
The `admin/` directory contains a minimal Decap CMS configuration for browser-based Markdown editing without SSH.
To enable:
1. Update `admin/config.yml`: set `repo` to your Forgejo repo path
2. Set `base_url` to your Forgejo instance URL
3. Deploy the `admin/` directory alongside your Hugo output
4. Access at `https://yoursite.com/admin/`
## Pack structure
```
packs/hugo/
├── README.md ← This file
├── layouts/
│ ├── _default/
│ │ ├── baseof.html ← Base template (html, head, body structure)
│ │ ├── single.html ← Single pages (articles)
│ │ └── list.html ← List + taxonomy pages (grid)
│ ├── partials/
│ │ ├── head.html ← <head>: meta, CSS links
│ │ └── tag-nav.html ← Tag cloud nav (use in list templates or sidebar)
│ └── shortcodes/
│ ├── callout.html ← {{< callout type >}} shortcode
│ └── wikilink.html ← {{< wikilink text href >}} shortcode
├── static/
│ └── css/
│ └── theme.css ← Trentuna design tokens (Inter, JetBrains Mono, dark palette)
├── archetypes/
│ └── default.md ← Default frontmatter template
└── admin/
└── config.yml ← Minimal Decap CMS config
```
## Alpha scope (April 2026)
- [x] Pack scaffolded: all layouts + partials + shortcodes
- [x] Tag navigation partial (`tag-nav.html`)
- [x] Wikilink support (`wikilink` shortcode + `data-wikilink` on list page links)
- [x] Callout blocks (`callout` shortcode → `<aside data-callout>`)
- [x] Trentuna theme tokens (`theme.css`: Inter, JetBrains Mono, dark palette)
- [x] Decap CMS config minimal but functional
- [ ] Deployed to trentuna-web infra — B.A. task: wire `asw.css` copy + nginx config
## Relationship to existing packs
This pack joins the ASW server/framework integration packs:
- `packs/nginx/` — nginx serving ASW content
- `packs/pandoc/` — pandoc converting Markdown → ASW HTML
- `packs/hugo/`**this pack** — Hugo site generation with ASW output

View file

@ -0,0 +1,82 @@
# Decap CMS configuration for ASW-Hugo pack
# Browser-based Markdown editing — no backend server required.
#
# Setup:
# 1. Update `repo` below to your Forgejo repo path (owner/repo)
# 2. Update `base_url` to your Forgejo instance URL
# 3. Register an OAuth app in Forgejo: Settings → Applications → OAuth2 Apps
# - Redirect URL: https://yoursite.com/admin/
# 4. Deploy admin/ alongside your Hugo output
# 5. Access at https://yoursite.com/admin/
backend:
name: gitea # Forgejo is Gitea-compatible
repo: trentuna/vault # ← CHANGE: your repo (owner/repo)
branch: main
base_url: https://trentuna.com # ← CHANGE: your Forgejo instance URL
auth_endpoint: /api/v1/oauth2/
media_folder: static/images
public_folder: /images
# Slug format for new posts
slug:
encoding: ascii
clean_accents: true
collections:
- name: posts
label: Posts
label_singular: Post
folder: content/posts
create: true
slug: "{{year}}-{{month}}-{{day}}-{{slug}}"
preview_path: "posts/{{slug}}/"
fields:
- label: Title
name: title
widget: string
- label: Date
name: date
widget: datetime
default: ""
date_format: "YYYY-MM-DD"
time_format: "HH:mm:ss"
format: "YYYY-MM-DDTHH:mm:ssZ"
- label: Description
name: description
widget: string
required: false
hint: Short summary shown in list views
- label: Tags
name: tags
widget: list
required: false
hint: Comma-separated tags
- label: Draft
name: draft
widget: boolean
default: true
- label: Body
name: body
widget: markdown
- name: pages
label: Pages
label_singular: Page
folder: content
create: true
filter:
field: _type
value: page
fields:
- label: Title
name: title
widget: string
- label: Description
name: description
widget: string
required: false
- label: Body
name: body
widget: markdown

View file

@ -0,0 +1,17 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
description: ""
tags: []
---
<!-- Write content here. Use shortcodes for ASW-specific elements:
{{< callout note >}}
This is a note.
{{< /callout >}}
{{< wikilink "Related Page" "/related-page/" >}}
-->

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="{{ .Site.Language.LanguageCode | default "en" }}" data-theme="dark">
<head>
{{- partial "head.html" . -}}
</head>
<body>
<nav>
<ul><li><a href="{{ .Site.BaseURL }}"><strong>{{ .Site.Title }}</strong></a></li></ul>
<ul data-nav-links>
{{- range .Site.Menus.main }}
<li><a href="{{ .URL }}"{{ if $.IsMenuCurrent "main" . }} aria-current="page"{{ end }}>{{ .Name }}</a></li>
{{- end }}
</ul>
<button data-theme-toggle aria-label="Toggle theme"></button>
</nav>
<main>
{{- block "main" . }}{{- end }}
</main>
<footer>
<small>
<a href="{{ "/" | relURL }}">{{ .Site.Title }}</a>
· {{ now.Year }}
{{- with .Site.Params.description }} · {{ . }}{{- end }}
</small>
</footer>
</body>
</html>

View file

@ -0,0 +1,39 @@
{{ define "main" }}
<section>
<header>
<h1>{{ .Title }}</h1>
{{- with .Description }}<p>{{ . }}</p>{{- end }}
</header>
{{- if .IsHome }}
{{- partial "tag-nav.html" . }}
{{- end }}
<section data-layout="grid">
{{- range .Pages }}
<article>
<header>
<h3>
<a href="{{ .RelPermalink }}" data-wikilink>{{ .Title }}</a>
</h3>
{{- if not .Date.IsZero }}
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "Jan 2, 2006" }}</time>
{{- end }}
</header>
{{- with .Summary }}
<p>{{ . }}</p>
{{- end }}
{{- with .GetTerms "tags" }}
<footer>
{{- range . }}
<a href="{{ .Permalink }}" data-tag="{{ .Name }}">{{ .Name }}</a>
{{- end }}
</footer>
{{- end }}
</article>
{{- end }}
</section>
</section>
{{ end }}

View file

@ -0,0 +1,36 @@
{{ define "main" }}
<article>
<header>
<h1>{{ .Title }}</h1>
{{- if not .Date.IsZero }}
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "January 2, 2006" }}</time>
{{- end }}
{{- with .Description }}
<p>{{ . }}</p>
{{- end }}
{{- with .GetTerms "tags" }}
<nav data-role="tag-cloud" aria-label="Tags">
{{- range . }}
<a href="{{ .Permalink }}" data-tag="{{ .Name }}">{{ .Name }}</a>
{{- end }}
</nav>
{{- end }}
</header>
{{ .Content }}
{{- if .PrevInSection }}
<footer>
{{- with .PrevInSection }}
<a href="{{ .RelPermalink }}" rel="prev" data-wikilink>← {{ .Title }}</a>
{{- end }}
{{- with .NextInSection }}
<a href="{{ .RelPermalink }}" rel="next" data-wikilink>{{ .Title }} →</a>
{{- end }}
</footer>
{{- end }}
</article>
{{ end }}

View file

@ -0,0 +1,20 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>
{{- if .IsHome -}}
{{ .Site.Title }}
{{- else -}}
{{ .Title }} · {{ .Site.Title }}
{{- end -}}
</title>
{{- with .Description }}<meta name="description" content="{{ . }}">{{- end }}
{{- if not .Description }}{{- with .Site.Params.description }}<meta name="description" content="{{ . }}">{{- end }}{{- end }}
<!-- ASW framework CSS — absURL ensures correct path when served at a subpath -->
<link rel="stylesheet" href="{{ "css/asw.css" | absURL }}">
<!-- Trentuna theme tokens: Inter, JetBrains Mono, dark palette -->
<link rel="stylesheet" href="{{ "css/theme.css" | absURL }}">
{{- range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{- end }}

View file

@ -0,0 +1,21 @@
{{- /*
tag-nav.html — renders all site tags as a navigable tag cloud.
Usage in a layout:
{{ partial "tag-nav.html" . }}
Outputs: <nav data-role="tag-cloud"> with links to each tag page.
The (N) count shows how many pages have each tag.
*/ -}}
{{- $tags := .Site.Taxonomies.tags -}}
{{- if $tags }}
<nav data-role="tag-cloud" aria-label="Browse by tag">
{{- range $name, $pages := $tags }}
{{- $tagPage := site.GetPage (printf "/tags/%s" ($name | urlize)) }}
<a href="{{ if $tagPage }}{{ $tagPage.Permalink }}{{ else }}{{ print site.BaseURL "tags/" ($name | urlize) "/" }}{{ end }}" data-tag="{{ $name }}">
{{ $name -}}
<small>({{ len $pages }})</small>
</a>
{{- end }}
</nav>
{{- end }}

View file

@ -0,0 +1,16 @@
{{- /*
callout shortcode — wraps content in an ASW callout block.
Usage:
{{< callout note >}}
Content here. Markdown is rendered.
{{< /callout >}}
First positional param: callout type.
Valid types: note, warning, tip, info (maps to ASW data-callout attribute).
Default: note
*/ -}}
{{- $type := .Get 0 | default "note" -}}
<aside data-callout="{{ $type }}">
{{ .Inner | markdownify }}
</aside>

View file

@ -0,0 +1,20 @@
{{- /*
wikilink shortcode — renders an internal link with ASW data-wikilink attribute.
Usage:
{{< wikilink "Display Text" "/path/to/page/" >}}
Param 0 (required): display text
Param 1 (optional): href path. Defaults to /display-text-slugified/
Examples:
{{< wikilink "My Note" >}}
<a href="/my-note/" data-wikilink>My Note</a>
{{< wikilink "My Note" "/vault/my-note/" >}}
<a href="/vault/my-note/" data-wikilink>My Note</a>
*/ -}}
{{- $text := .Get 0 -}}
{{- $slug := $text | lower | replace " " "-" -}}
{{- $href := .Get 1 | default (printf "/%s/" $slug) -}}
<a href="{{ $href | relURL }}" data-wikilink>{{ $text }}</a>

View file

@ -0,0 +1,82 @@
# Decap CMS configuration for ASW-Hugo pack
# Browser-based Markdown editing — no backend server required.
#
# Setup:
# 1. Update `repo` below to your Forgejo repo path (owner/repo)
# 2. Update `base_url` to your Forgejo instance URL
# 3. Register an OAuth app in Forgejo: Settings → Applications → OAuth2 Apps
# - Redirect URL: https://yoursite.com/admin/
# 4. Deploy admin/ alongside your Hugo output
# 5. Access at https://yoursite.com/admin/
backend:
name: gitea # Forgejo is Gitea-compatible
repo: trentuna/vault # ← CHANGE: your repo (owner/repo)
branch: main
base_url: https://trentuna.com # ← CHANGE: your Forgejo instance URL
auth_endpoint: /api/v1/oauth2/
media_folder: static/images
public_folder: /images
# Slug format for new posts
slug:
encoding: ascii
clean_accents: true
collections:
- name: posts
label: Posts
label_singular: Post
folder: content/posts
create: true
slug: "{{year}}-{{month}}-{{day}}-{{slug}}"
preview_path: "posts/{{slug}}/"
fields:
- label: Title
name: title
widget: string
- label: Date
name: date
widget: datetime
default: ""
date_format: "YYYY-MM-DD"
time_format: "HH:mm:ss"
format: "YYYY-MM-DDTHH:mm:ssZ"
- label: Description
name: description
widget: string
required: false
hint: Short summary shown in list views
- label: Tags
name: tags
widget: list
required: false
hint: Comma-separated tags
- label: Draft
name: draft
widget: boolean
default: true
- label: Body
name: body
widget: markdown
- name: pages
label: Pages
label_singular: Page
folder: content
create: true
filter:
field: _type
value: page
fields:
- label: Title
name: title
widget: string
- label: Description
name: description
widget: string
required: false
- label: Body
name: body
widget: markdown

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,130 @@
/*
* Trentuna theme tokens for ASW-Hugo pack
* Overrides ASW custom properties with trentuna-specific values.
*
* Zero CDN dependencies system font stacks only, matching ASW's own ethos.
* ASW framework (web-fonts.css) uses system fonts by design: zero external requests,
* zero layout shift, fonts resolve to native equivalents on every device.
*
* Inter and JetBrains Mono resolve to system-ui / monospace on most platforms.
* To use web fonts: add @font-face declarations to a local fonts.css and
* @import it before this file.
*/
:root {
/* --- Typography (system font stacks — no external loading) --- */
--font-sans: Inter, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', ui-monospace, monospace;
/* --- Dark palette --- */
--color-bg: #0f0f0f;
--color-surface: #1a1a1a;
--color-surface-2:#222222;
--color-border: #2e2e2e;
--color-text: #e8e8e8;
--color-muted: #888888;
--color-accent: #e8c87a; /* warm gold */
--color-accent-2: #7aadcf; /* cool blue */
--color-danger: #cf7a7a;
--color-success: #7acf9a;
/* --- Spacing scale (matches ASW defaults) --- */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2.5rem;
--space-2xl: 4rem;
}
/* Base */
html {
background-color: var(--color-bg);
color: var(--color-text);
font-family: var(--font-sans);
}
code, pre, kbd, samp, tt {
font-family: var(--font-mono);
}
/* Links */
a {
color: var(--color-accent);
}
a:hover {
color: var(--color-accent-2);
}
a[data-wikilink] {
text-decoration: underline dotted;
}
/* Navigation */
header nav {
display: flex;
gap: var(--space-md);
align-items: center;
padding: var(--space-md) var(--space-lg);
border-bottom: 1px solid var(--color-border);
}
header nav a {
text-decoration: none;
font-weight: 500;
}
header nav strong {
color: var(--color-text);
margin-right: var(--space-md);
}
/* Tag cloud */
nav[data-role="tag-cloud"] {
display: flex;
flex-wrap: wrap;
gap: var(--space-xs) var(--space-sm);
}
nav[data-role="tag-cloud"] a {
font-size: 0.8rem;
text-decoration: none;
padding: 0.15em 0.5em;
border: 1px solid var(--color-border);
border-radius: 2px;
color: var(--color-muted);
}
nav[data-role="tag-cloud"] a:hover {
color: var(--color-accent);
border-color: var(--color-accent);
}
a[data-tag] {
font-size: 0.8rem;
color: var(--color-muted);
text-decoration: none;
}
a[data-tag]:hover {
color: var(--color-accent);
}
/* Grid layout */
section[data-layout="grid"] {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
gap: var(--space-lg);
}
/* Article cards in grid */
section[data-layout="grid"] article {
border: 1px solid var(--color-border);
padding: var(--space-md);
border-radius: 3px;
}
section[data-layout="grid"] article:hover {
border-color: var(--color-border);
background: var(--color-surface);
}
/* Footer */
footer {
padding: var(--space-lg);
color: var(--color-muted);
border-top: 1px solid var(--color-border);
font-size: 0.85rem;
}