<!--
 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.
-->
<!DOCTYPE html>
<html>
<head>
    <title>Apache NiFi Flow Design System Demo</title>
    <base href='/'>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
    <link rel="stylesheet" href="node_modules/@covalent/core/common/platform.css">
    <link rel="stylesheet" href='platform/core/common/styles/css/flow-design-system.min.css'/>
    <link rel="stylesheet" href='demo-app/css/fds-demo.min.css'/>
    <link rel='stylesheet' href='node_modules/font-awesome/css/font-awesome.css'/>
</head>
<body>
<fds-app></fds-app>
</body>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="demo-app/systemjs.config.js?"></script>
<script>
    System.import('demo-app/fds-bootstrap.js').catch(function(err) {console.error(err);});
</script>
</html>
