{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "transfer-document",
  "title": "Transfer Document",
  "description": "The nx-ui Transfer Document block.",
  "dependencies": [
    "@untitledui/icons@^0.0.22"
  ],
  "registryDependencies": [
    "@nx-ui/badge",
    "@nx-ui/domain",
    "@nx-ui/utils"
  ],
  "files": [
    {
      "path": "components/blocks/domain/transfer-document/index.ts",
      "content": "export {\n  TransferDocument,\n  type SignatureRole,\n  type TransferDocumentProps,\n} from \"./transfer-document\"\n",
      "type": "registry:component",
      "target": "components/blocks/domain/transfer-document/index.ts"
    },
    {
      "path": "components/blocks/domain/transfer-document/transfer-document.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { CheckCircle, Edit05, File02, MinusCircle, Ticket01 } from \"@untitledui/icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport type { TransferNoteValues } from \"@/components/blocks/domain/transfer-note\"\n\nexport type SignatureRole = \"transferor\" | \"transferee\"\n\nexport interface TransferDocumentProps {\n  /** The note values, as produced by TransferNoteForm. */\n  values: TransferNoteValues\n  /** Document reference, e.g. \"WTN-2026-00412\". */\n  reference?: string\n  /** Marks the note as a season ticket covering repeat transfers. */\n  seasonTicket?: boolean\n  /** Called when an empty signature slot is activated. */\n  onSign?: (role: SignatureRole) => void\n  className?: string\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n  return (\n    <h4 className=\"text-xs font-semibold tracking-widest text-fg-quaternary uppercase\">\n      {children}\n    </h4>\n  )\n}\n\nfunction Field({\n  label,\n  value,\n  numeric,\n}: {\n  label: string\n  value?: React.ReactNode\n  numeric?: boolean\n}) {\n  return (\n    <div className=\"flex flex-col gap-0.5\">\n      <dt className=\"text-xs text-text-quaternary\">{label}</dt>\n      <dd\n        className={cn(\n          \"text-sm text-text-secondary\",\n          numeric && \"font-medium tabular-nums\"\n        )}\n      >\n        {value || <span className=\"text-text-quaternary\">—</span>}\n      </dd>\n    </div>\n  )\n}\n\nfunction formatDate(iso: string): string | undefined {\n  if (!iso) return undefined\n  const date = new Date(`${iso}T00:00:00`)\n  if (Number.isNaN(date.getTime())) return iso\n  return new Intl.DateTimeFormat(\"en-GB\", {\n    day: \"numeric\",\n    month: \"long\",\n    year: \"numeric\",\n  }).format(date)\n}\n\nfunction PartyCell({\n  label,\n  party,\n}: {\n  label: string\n  party: TransferNoteValues[\"producer\"]\n}) {\n  return (\n    <div className=\"flex flex-col gap-1\">\n      <div className=\"text-xs font-semibold tracking-widest text-fg-quaternary uppercase\">\n        {label}\n      </div>\n      <div className=\"text-sm font-semibold text-foreground\">\n        {party.name || <span className=\"font-normal text-text-quaternary\">—</span>}\n      </div>\n      {party.address ? (\n        <div className=\"text-xs text-text-tertiary\">{party.address}</div>\n      ) : null}\n      {party.licenceNumber ? (\n        <div className=\"text-xs text-text-tertiary tabular-nums\">\n          {party.licenceNumber}\n        </div>\n      ) : null}\n    </div>\n  )\n}\n\nfunction SignatureSlot({\n  label,\n  role,\n  name,\n  onSign,\n}: {\n  label: string\n  role: SignatureRole\n  name: string\n  onSign?: (role: SignatureRole) => void\n}) {\n  return (\n    <div className=\"flex flex-col gap-2 rounded-lg border border-border px-4 py-3\">\n      <div className=\"text-xs font-semibold tracking-widest text-fg-quaternary uppercase\">\n        {label}\n      </div>\n      {name ? (\n        <div className=\"flex items-center gap-2\">\n          <CheckCircle\n            className=\"size-4 shrink-0 text-utility-green-600\"\n            aria-hidden=\"true\"\n          />\n          <span className=\"text-sm font-semibold text-foreground\">{name}</span>\n          <span className=\"text-xs text-text-tertiary\">signed</span>\n        </div>\n      ) : onSign ? (\n        <button\n          type=\"button\"\n          onClick={() => onSign(role)}\n          className=\"inline-flex w-fit cursor-pointer items-center gap-1.5 rounded-lg border border-dashed border-border px-3 py-1.5 text-sm font-semibold text-text-brand-secondary transition-colors outline-none hover:bg-bg-secondary focus-visible:border-ring focus-visible:ring-4 focus-visible:ring-ring/25\"\n        >\n          <Edit05 className=\"size-4\" aria-hidden=\"true\" />\n          Sign as {role}\n        </button>\n      ) : (\n        <span className=\"text-sm text-text-quaternary\">Awaiting signature</span>\n      )}\n    </div>\n  )\n}\n\n/**\n * TransferDocument — a styled duty-of-care waste transfer note preview: the\n * legal-paper sheet with a document header (reference + season-ticket\n * marker), the parties grid, the waste description block (EWC code, material,\n * quantity) and the signatures row. Presentation only — the single\n * interaction is an optional `onSign` on empty signature slots.\n */\nexport function TransferDocument({\n  values,\n  reference,\n  seasonTicket = false,\n  onSign,\n  className,\n}: TransferDocumentProps) {\n  return (\n    <article\n      className={cn(\n        \"flex w-full max-w-3xl flex-col overflow-hidden rounded-xl border border-border bg-card shadow-lg\",\n        className\n      )}\n    >\n      <header className=\"flex items-start justify-between gap-4 border-b border-border px-6 py-5\">\n        <div className=\"flex items-start gap-3\">\n          <File02\n            className=\"mt-0.5 size-5 shrink-0 text-fg-quaternary\"\n            aria-hidden=\"true\"\n          />\n          <div className=\"flex flex-col gap-0.5\">\n            <h3 className=\"text-lg font-semibold text-foreground\">\n              Waste transfer note\n            </h3>\n            <p className=\"text-xs text-text-tertiary\">\n              Duty of care — Environmental Protection Act 1990, s.34\n            </p>\n          </div>\n        </div>\n        <div className=\"flex shrink-0 flex-col items-end gap-1.5\">\n          {reference ? (\n            <span className=\"text-sm font-semibold text-foreground tabular-nums\">\n              {reference}\n            </span>\n          ) : null}\n          {seasonTicket ? (\n            <Badge variant=\"brand\">\n              <Ticket01 className=\"size-3\" aria-hidden=\"true\" />\n              Season ticket\n            </Badge>\n          ) : null}\n        </div>\n      </header>\n\n      <section className=\"flex flex-col gap-3 border-b border-border px-6 py-5\">\n        <SectionLabel>Parties to the transfer</SectionLabel>\n        <div className=\"grid gap-5 sm:grid-cols-3\">\n          <PartyCell label=\"Transferor\" party={values.producer} />\n          <PartyCell label=\"Carrier\" party={values.carrier} />\n          <PartyCell label=\"Transferee\" party={values.receiver} />\n        </div>\n      </section>\n\n      <section className=\"flex flex-col gap-3 border-b border-border px-6 py-5\">\n        <SectionLabel>Description of the waste</SectionLabel>\n        {values.wasteDescription ? (\n          <p className=\"text-sm text-text-secondary\">{values.wasteDescription}</p>\n        ) : (\n          <p className=\"text-sm text-text-quaternary\">—</p>\n        )}\n        <dl className=\"grid gap-x-6 gap-y-3 sm:grid-cols-3\">\n          <Field label=\"EWC code\" value={values.ewcCode} numeric />\n          <Field label=\"SIC code\" value={values.sicCode} numeric />\n          <Field\n            label=\"Quantity\"\n            numeric\n            value={\n              values.quantity\n                ? `${values.quantity} ${values.quantityUnit}`\n                : undefined\n            }\n          />\n          <Field label=\"Container\" value={values.containerType} />\n          <Field label=\"Date of transfer\" value={formatDate(values.transferDate)} />\n          <Field label=\"Place of transfer\" value={values.transferPlace} />\n          {values.brokerName ? (\n            <Field\n              label=\"Broker / dealer\"\n              value={\n                <>\n                  {values.brokerName}\n                  {values.brokerLicenceNumber ? (\n                    <span className=\"text-text-tertiary tabular-nums\">\n                      {\" \"}\n                      · {values.brokerLicenceNumber}\n                    </span>\n                  ) : null}\n                </>\n              }\n            />\n          ) : null}\n        </dl>\n      </section>\n\n      <section className=\"flex flex-col gap-3 border-b border-border px-6 py-5\">\n        <SectionLabel>Declaration</SectionLabel>\n        <div className=\"flex items-center gap-2 text-sm\">\n          {values.hierarchyDeclared ? (\n            <CheckCircle\n              className=\"size-4 shrink-0 text-utility-green-600\"\n              aria-hidden=\"true\"\n            />\n          ) : (\n            <MinusCircle\n              className=\"size-4 shrink-0 text-text-quaternary\"\n              aria-hidden=\"true\"\n            />\n          )}\n          <span\n            className={cn(\n              values.hierarchyDeclared\n                ? \"text-text-secondary\"\n                : \"text-text-quaternary\"\n            )}\n          >\n            The transferor confirms the waste management hierarchy has been\n            applied\n            {values.hierarchyDeclared ? \"\" : \" — not confirmed\"}\n          </span>\n        </div>\n      </section>\n\n      <section className=\"flex flex-col gap-3 px-6 py-5\">\n        <SectionLabel>Signatures</SectionLabel>\n        <div className=\"grid gap-3 sm:grid-cols-2\">\n          <SignatureSlot\n            label=\"Transferor\"\n            role=\"transferor\"\n            name={values.transferorSignature}\n            onSign={onSign}\n          />\n          <SignatureSlot\n            label=\"Transferee\"\n            role=\"transferee\"\n            name={values.transfereeSignature}\n            onSign={onSign}\n          />\n        </div>\n      </section>\n    </article>\n  )\n}\n",
      "type": "registry:component",
      "target": "components/blocks/domain/transfer-document/transfer-document.tsx"
    }
  ],
  "type": "registry:block"
}