# 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: price-card
displayName: Price card
version: 1.1.0
semanticRole: pricing-disclosure
description: |
  Open price disclosure block. RFC-0101/0102 composed; RFC-0100 list-item shape
  for "includes". Forbidden to frame as discount ("only X €/day") or to
  compare to small purchases ("less than a coffee").
expectedIntents:
  - pricing
  - trust
  - clarify-positioning
expectedIndustryFit:
  - trades-and-construction
  - consulting-and-coaching
  - legal-services
layoutHint: decision-card
bodyKind: composite
recommendedItemCount:
  min: 1
  max: 1
propsSchema:
  $shape: zod
  compose:
    - section-visual
    - section-header
  shape: |
    z.object({
      monthly: z.string().optional(),
      yearly: z.string().optional(),
      setup: z.string().optional(),
      includes: z.array(z.object({
        text: z.string().min(1),
        icon: z.object({
          vendor: z.string(),
          collection: z.string(),
          name: z.string(),
          size: z.number().optional(),
        }).optional(),
      })).optional(),
      cta: z.object({
        label: z.string().min(2),
        target: 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(),
    }).strict()
acceptedCosmicNames:
  - Pan
constraints:
  forbidPhrases:
    - günstig
    - von 1 €/Tag
    - weniger als ein Kaffee
    - Schnäppchen
  enforceTabularNumerals: true
