<!--
 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='/nifi-fds/'>
    <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='node_modules/@nifi-fds/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>
