Web components framework