<html>
  <head>
    <title>Expivi - 3D Configurator sample code</title>
    <link href="https://assets.expivi.net/options/latest/css/app.css" rel="stylesheet" />
    <script src="https://assets.expivi.net/viewer/latest/viewer.js"></script>
    <script src="https://assets.expivi.net/options/latest/js/app.js"></script>
    <script src="https://unpkg.com/vue@2"></script>
  </head>
  <body>
    <div class="expivi-single-product-container">
      <div class="expivi-viewer-container">
        <div id="viewerContainer" style="position: sticky;top:0;width:100%;height:100vh;"></div>
      </div>
      <div class="expivi-option-container">
        <div id="priceContainer"></div>
        <div id="optionsContainer"></div>
      </div>
    </div>
  </body>
<html>
body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}

.expivi-single-product-container {
  display: table;
  height: 100%;
  width: 100%;
}

.expivi-single-product-container .expivi-viewer-container {
  display: table-cell;
  width: 64%;
  padding-right: 15px;
  vertical-align: top;
}

.expivi-single-product-container .expivi-option-container {
  height: 100%;
  display: table-cell;
  width: 36%;
  max-width: 400px;
}

@media (max-width: 600px) {
  .expivi-single-product-container {
    display: block;
  }

  .expivi-single-product-container .expivi-viewer-container {
    height: 60vh;
    display: block;
    width: 100%;
    padding-right: 0;
  }

  .expivi-single-product-container .expivi-option-container {
    height: initial;
    display: block;
    width: 100%;
  }
}
var Token =  "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiMjAyM2RjYTQ2ZDYyNGZkNjAxOGMyMmEyMTRjMDM5YjVjYjUzNjQwY2E4MDAxMjVlNWYzZTRmOWUxNjY4MmJiZjE4NGU4OTJhOGFhNzY0ODciLCJpYXQiOjE3MjE3NDIzMjUuMTA2MTIsIm5iZiI6MTcyMTc0MjMyNS4xMDYxMjIsImV4cCI6MjAzNzI3NTEyNC44MTc4NSwic3ViIjoiMyIsInNjb3BlcyI6W119.EQr6L3cr9STgLQoA_rYOht-4JhR4W-0h-V2bsC7CbroIHk8nWIp0fxw8y17MbYl4ireY6IJekDPOq_d429lKtad0hLZF37tCn2p0yJyfn1jc7zoLqY4R865gd9VIFEMwvb1_ZGfHz_oYiZjop-z-Dusl8-0uBwdT7geSXp8flfMBM8pBrSPENuCULVv9hJx3gQRiWgMTfAQedNlgGGI6Ny1_PdOlch4KFSIa9q7p8swf_mYKQ-8mBt3J6KDZtdSefGmkX5u4t6sYC49FsYbxVGlrOFsKdMdAELIgjZppmuMiZ6JIkiBFeeGbI4mgBCM_APaqXqT2TzgCaoUPwu7h50m8BZ8qn5CqrvqVKLcnHlwgD_OsTuOg7FwOb8WVPA8WMlPqfg3vdrNkGOyrNgASkXLrzkBZmiQYbPs4AwDeGgby6eJH4Cp6sXU4C2jFIJ53WNn5Ax5BlbLKboQh5hVvLXRO6yiNXmjV_j8L7Xs0G5T6QED3O_Th2sI9jd3Ks9Zbm3fJrrLDdAx7Fl2-8SFkriHO81YdhC2u1EeC8hdS_JxzmvuY7_UdXm7I6wT18igWuVfiCr1JTXYhRP1xkxmarAAgTYKBwVzXnwtpBT6bZbFYDvwjXgR0uP-jqUCTW2NeG6l6y2Y6Cf01ZU-2Ld9Ow-dQv8PS5l-UxQmpsTbHe64";

window.addEventListener("load", function () {
  const CheckboxSelectorView = Vue.component("checkbox", {
    props: {
      label: String,
      value: {
        default: null
      },
      items: Array,
      loading: {
        default: false
      },
      size: {
        type: String,
        default: "lg"
      },
      rounded: {
        type: String,
        default: "no"
      },
      node_id: Number
    },
    data: function () {
      return {
        selected: null
      };
    },
    methods: {
      updateCheckbox() {
        this.selected = this.items.length > 0 && this.value != this.items[0].id;
      }
    },
    template: `
                <div>
                    <h2>Our custom checkbox component:</h2>
                    <input type="checkbox" :id="'checkbox_group_'+node_id" v-model="selected" />
                    <label :for="'checkbox_group_'+node_id">{{label}}</label>
                </div>
            `,
    watch: {
      value() {
        this.updateCheckbox();
      },
      selected(aNewValue) {
        if (aNewValue && this.items.length > 1) {
          this.$emit("input", this.items[1].id);
        } else if (this.items.length > 0) {
          this.$emit("input", this.items[0].id);
        }
      }
    }
  });

  ExpiviOptionsVueInstance.prototype.$customViews[
    "Checkbox"
  ] = CheckboxSelectorView;

  const expiviInstance = new ExpiviComponent({
    catalogueId: 67,
    viewerContainer: "#viewerContainer",
    optionContainer: "#optionsContainer",
    priceContainer: "#priceContainer",
    token: Token
  });
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.