# GENERATED. Do not change this line unless the file contains project specific changes.
# DO NOT EDIT THIS FILE. Changes are overwritten on the next build.
# Owner command: archetype.registry.build
# Edit instead: the archetype.registry.build generator source (not this file).
# Regenerate:   pnpm exec werkstatt run archetype.registry.build
id: hero
displayName: Hero
version: 1.1.0
semanticRole: hero
description: |
  Hero composite — background image, portrait, header (h1 default), CTAs and
  stats. RFC-0101/0102 composed.
expectedIntents:
  - convert-visitor
  - establish-identity
  - clarify-positioning
expectedIndustryFit:
  - non-profit
layoutHint: decision-card
bodyKind: composite
propsSchema:
  $shape: zod
  compose:
    - section-visual
    - section-header
  shape: |
    z.object({
      tagline: z.string().optional(),
      subheading: z.string().optional(),
      description: z.string().optional(),
      imageAlt: z.string().min(1),
      backgroundImage: z.string().optional(),
      portraitImage: z.string().optional(),
      ctaPrimaryLabel: z.string().optional(),
      ctaPrimaryAriaLabel: z.string().optional(),
      ctaSecondaryLabel: z.string().optional(),
      ctaSecondaryAriaLabel: z.string().optional(),
      ctaPrimaryUrl: z.string().optional(),
      primaryCtaTarget: z.discriminatedUnion("kind", [
        z.object({
          kind: z.literal("internal"),
          pageId: z.string().min(1),
          query: z.record(z.string().regex(/^[a-zA-Z0-9_-]{1,32}$/), z.string().regex(/^[a-zA-Z0-9_%.-]{0,128}$/)).optional(),
          anchor: z.string().optional(),
        }).strict(),
        z.object({
          kind: z.literal("external"),
          href: z.string().min(1),
          rel: z.string().optional(),
        }).strict(),
        z.object({
          kind: z.literal("anchor"),
          anchor: z.string().min(1),
        }).strict(),
      ]).optional(),
      secondaryCtaTarget: z.discriminatedUnion("kind", [
        z.object({
          kind: z.literal("internal"),
          pageId: z.string().min(1),
          query: z.record(z.string().regex(/^[a-zA-Z0-9_-]{1,32}$/), z.string().regex(/^[a-zA-Z0-9_%.-]{0,128}$/)).optional(),
          anchor: z.string().optional(),
        }).strict(),
        z.object({
          kind: z.literal("external"),
          href: z.string().min(1),
          rel: z.string().optional(),
        }).strict(),
        z.object({
          kind: z.literal("anchor"),
          anchor: z.string().min(1),
        }).strict(),
      ]).optional(),
      animated: z.boolean().optional(),
      containerVariant: z.enum(["default", "narrow", "full"]).optional(),
      stats: z.array(z.object({
        value: z.string().optional(),
        label: z.string().min(1),
        numericValue: z.number().optional(),
        prefix: z.string().optional(),
        suffix: z.string().optional(),
        decimals: z.number().int().nonnegative().optional(),
        duration: z.number().positive().optional(),
      })).min(1),
    }).strict()
acceptedCosmicNames:
  - Europa
constraints: {}
