/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the
NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses
this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance
with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS
IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific
language governing permissions and * limitations under the License. */
<template>
  <router-view></router-view>
</template>
<script lang="ts">
  import { Component, Vue } from 'vue-property-decorator';

  @Component
  export default class App extends Vue {}
</script>
<style>
  @import './assets/styles/reset.scss';
  @import './assets/styles/lib.scss';
  @import './assets/styles/style.scss';
  @import './assets/styles/grid.scss';
  #app,
  .container {
    height: 100%;
  }
  #app {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
  }
</style>
