digraph G {
  graph [
    rankdir=TB,
    bgcolor="#FBFCFF",
    pad="0.35",
    nodesep="0.55",
    ranksep="0.75",
    splines=ortho,
    outputorder=edgesfirst,
    label=<
      <TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="4">
        <TR><TD><FONT FACE="Architects Daughter" POINT-SIZE="30" COLOR="#243042">bluetape-rs-core</FONT></TD></TR>
        <TR><TD><FONT FACE="Comic Mono" POINT-SIZE="15" COLOR="#667085">Small validation, string, numeric, and hex helpers</FONT></TD></TR>
      </TABLE>
    >,
    labelloc=t,
    labeljust=c
  ];
  node [shape=plain, margin=0, fontname="Comic Mono"];
  edge [color="#9AA4B2", penwidth=2.2, arrowsize=0.8, fontname="Comic Mono", fontsize=12, fontcolor="#667085"];

  input [label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="8" BGCOLOR="#FFFFFF">
<TR><TD><FONT FACE="Architects Daughter" POINT-SIZE="22" COLOR="#243042">Inputs</FONT></TD></TR>
<TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">caller field names</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">strings</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">numbers</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">hex text</FONT></TD></TR>
</TABLE>>];
  crate [label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="8" BGCOLOR="#DDEBFF">
<TR><TD><FONT FACE="Architects Daughter" POINT-SIZE="22" COLOR="#243042">bluetape-rs-core</FONT></TD></TR>
<TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">typed validation errors</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">Result-first helper contracts</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">modules: error | string | number | hex</FONT></TD></TR>
</TABLE>>];
  output [label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="8" BGCOLOR="#FFFFFF">
<TR><TD><FONT FACE="Architects Daughter" POINT-SIZE="22" COLOR="#243042">Outputs</FONT></TD></TR>
<TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">validated values</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">ValidationError</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">safe fallbacks</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">UTF-8 truncation</FONT></TD></TR>
</TABLE>>];
  legend [label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0" CELLPADDING="8" BGCOLOR="#F2F4F7">
<TR><TD><FONT FACE="Architects Daughter" POINT-SIZE="22" COLOR="#243042">Route meaning</FONT></TD></TR>
<TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">left edge: caller input</FONT></TD></TR><TR><TD ALIGN="LEFT"><FONT FACE="Comic Mono" POINT-SIZE="13" COLOR="#667085">right edge: returned output</FONT></TD></TR>
</TABLE>>];
  { rank=same; input; crate; output; }
  input -> crate;
  crate -> output;
  crate -> legend [style=invis, weight=1];
}
