adding some docs and tests, reworking how `make_elements` works