sclass HTMLForm {
new L rows;
S tableClass = "responstableForForms";
asclass Row {
S label; // HTML
abstract O contents(); // HTML
}
sclass LiteralRow extends Row {
S contents;
*(S *label, S *contents) {}
O contents() { ret contents; }
}
S css() {
ret eq(tableClass, "responstableForForms") ? hcss_responstableForForms() : "";
}
S get() { ret hcss(css()) + html(); }
S html() {
LLS matrix = map(rows, row -> ll(row.label, strOrEmpty(row.contents())));
ret htableRaw_valignTop(matrix, empty(tableClass) ? litparams(border := 1, cellpadding := 4) : litparams(class := tableClass));
}
void add(S label, O contents) {
rows.add(new LiteralRow(label, strOrEmpty(contents)));
}
}