Rustelo/forms/content/blog/post-form.ncl
Jesús Pérez 642998ba35
chore: update
2026-07-18 20:15:23 +01:00

154 lines
5.3 KiB
Text

{
name = "Blog Post Metadata",
description = "Create or edit blog post metadata. Saved to {slug}.ncl alongside the post body. thumbnail and image_url are excluded — owned exclusively by generate-images.nu.",
display_mode = "complete",
elements = [
# ── Identity ─────────────────────────────────────────────────────────────
{
type = "section_header",
name = "identity_header",
title = "Identity",
border_top = true,
border_bottom = true,
},
{
type = "text",
name = "title",
prompt = "Title",
required = true,
nickel_path = ["title"],
help = "Post title shown in listings, headings, and browser tab.",
},
{
type = "text",
name = "slug",
prompt = "Slug",
required = true,
nickel_path = ["slug"],
help = "URL segment — lowercase, hyphens only, max 60 chars. Matches the .ncl filename stem. Immutable after publication.",
},
{
type = "text",
name = "subtitle",
prompt = "Subtitle",
required = false,
nickel_path = ["subtitle"],
help = "Secondary heading displayed under the title.",
},
{
type = "text",
name = "excerpt",
prompt = "Excerpt",
required = false,
nickel_path = ["excerpt"],
help = "1-3 sentences for index listings and SEO meta description.",
},
# ── Taxonomy ──────────────────────────────────────────────────────────────
{
type = "section_header",
name = "taxonomy_header",
title = "Taxonomy",
border_top = true,
border_bottom = true,
},
{
type = "text",
name = "category",
prompt = "Category",
required = true,
nickel_path = ["category"],
help = "Primary category slug — must match the parent directory name (e.g. rust, devops, web3).",
},
{
type = "text",
name = "tags",
prompt = "Tags",
required = false,
nickel_path = ["tags"],
help = "Comma-separated. new-post.nu converts to Array String before writing the NCL. E.g. rust, leptos, async",
},
# ── Publication ───────────────────────────────────────────────────────────
{
type = "section_header",
name = "publication_header",
title = "Publication",
border_top = true,
border_bottom = true,
},
{
type = "text",
name = "date",
prompt = "Publication date",
required = true,
nickel_path = ["date"],
help = "YYYY-MM-DD. Original publication date — never update after publication.",
},
{
type = "text",
name = "updated_at",
prompt = "Updated at",
required = false,
nickel_path = ["updated_at"],
help = "YYYY-MM-DD — date of last significant content change. Leave blank on creation.",
},
{
type = "confirm",
name = "published",
prompt = "Published?",
default = false,
nickel_path = ["published"],
help = "False hides the post from all listings and the API. Set to false on creation.",
},
{
type = "confirm",
name = "draft",
prompt = "Draft?",
default = true,
nickel_path = ["draft"],
help = "Draft posts are excluded from the index and /api/content-render. Set to true on creation.",
},
{
type = "confirm",
name = "featured",
prompt = "Featured?",
default = false,
nickel_path = ["featured"],
help = "Pins to the top of the category listing and enables featured styling.",
},
# ── Display ───────────────────────────────────────────────────────────────
{
type = "section_header",
name = "display_header",
title = "Display",
border_top = true,
border_bottom = true,
},
{
type = "text",
name = "read_time",
prompt = "Read time",
required = false,
nickel_path = ["read_time"],
help = "Estimated reading time for the listing card. E.g. '8 min read'. Auto-derived from word count when absent.",
},
{
type = "text",
name = "sort_order",
prompt = "Sort order",
required = false,
default = "0",
nickel_path = ["sort_order"],
help = "Manual position within the category listing. Lower values appear first. 0 = no preference. new-post.nu converts to Number.",
},
],
}