commit 4ce8e50226b1f636d7f0e42f9e2a30ed5e60a7b3
parent ee86d9041275f4d51dc4895235e0ce5cd09276a7
Author: Konstantin Tarkus <koistya@gmail.com>
Date: Tue, 16 Dec 2014 11:02:24 +0300
Merge pull request #44 from kriasoft/new-project-structure
Refactor the directory strucure
Diffstat:
19 files changed, 343 insertions(+), 289 deletions(-)
diff --git a/README.md b/README.md
@@ -40,12 +40,14 @@ utilizing a unidirectional data flow.
├── /src/ # The source code of the application
│ ├── /actions/ # Action creators that allow to trigger a dispatch to stores
│ ├── /assets/ # Static files which are copied to ./build on compile
-│ ├── /components/ # React components. E.g. Navbar.jsx, Calendar.jsx
+│ ├── /components/ # React components
+│ │ ├── /common/ # - Shared components. E.g. Link.js
+│ │ ├── /forms/ # - Form components. E.g. TextBox.js
+│ │ ├── /layout/ # - Layout components. E.g. Navbar.js
+│ │ └── /pages/ # - Web-page components. E.g. About.js
│ ├── /constants/ # Enumerations used in action creators and stores
│ ├── /core/ # Core components (Flux dispatcher, base classes)
│ ├── /images/ # Graphics (.png, .jpg, .svg etc.)
-│ ├── /layouts/ # Shared layouts for top-level components
-│ ├── /pages/ # Top-level, URL-bound React components
│ ├── /stores/ # Stores contain the application state and logic
│ ├── /styles/ # CSS style sheets (or LESS, SASS, Stylus)
│ ├── /app.js # The application's main file (entry point)
diff --git a/gulpfile.js b/gulpfile.js
@@ -107,7 +107,7 @@ gulp.task('images', function() {
// HTML pages
gulp.task('pages', function() {
- src.pages = ['src/pages/**/*.js', 'src/pages/404.html'];
+ src.pages = ['src/components/pages/**/*.js', 'src/components/pages/404.html'];
var currentPage = {};
var Dispatcher = require('./src/core/Dispatcher');
@@ -123,7 +123,7 @@ gulp.task('pages', function() {
});
var render = $.render({
- template: './src/pages/_template.html',
+ template: './src/components/pages/index.html',
data: function() { return currentPage; }
})
.on('error', function(err) { console.log(err); render.end(); });
@@ -137,6 +137,7 @@ gulp.task('pages', function() {
collapseWhitespace: true,
minifyJS: true
}), $.jsbeautifier()))
+ .pipe($.if('**/home.html', $.rename('index.html')))
.pipe(gulp.dest(DEST))
.pipe($.size({title: 'pages'}));
});
diff --git a/package.json b/package.json
@@ -31,6 +31,7 @@
"gulp-load-plugins": "^0.8.0",
"gulp-minify-css": "^0.3.11",
"gulp-plumber": "^0.6.6",
+ "gulp-rename": "^1.2.0",
"gulp-render": "^0.2.1",
"gulp-replace": "^0.5.0",
"gulp-size": "^1.1.0",
diff --git a/src/app.js b/src/app.js
@@ -54,8 +54,8 @@ function render(page) {
// Define URL routes
// See https://github.com/flatiron/director
var routes = {
- '/': () => render(require('./pages/Index')),
- '/privacy': () => render(require('./pages/Privacy'))
+ '/': () => render(require('./components/pages/Home')),
+ '/privacy': () => render(require('./components/pages/Privacy'))
};
// Initialize a router
diff --git a/src/components/Link.js b/src/components/Link.js
@@ -1,31 +0,0 @@
-/*
- * React.js Starter Kit
- * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE.txt file in the root directory of this source tree.
- */
-
-'use strict';
-
-var React = require('react');
-var RouteActions = require('../actions/RouteActions');
-
-var Link = React.createClass({
- propTypes: {
- to: React.PropTypes.string.isRequired
- },
- render() {
- this.props.href =
- this.props.to && this.props.to.lastIndexOf('/', 0) === 0 ?
- this.props.to : '/' + this.props.to;
-
- return <a onClick={this.handleClick} {...this.props}>{this.props.children}</a>;
- },
- handleClick(e) {
- e.preventDefault();
- RouteActions.setRoute(this.props.to);
- }
-});
-
-module.exports = Link;
diff --git a/src/components/Navbar.js b/src/components/Navbar.js
@@ -1,29 +0,0 @@
-/*
- * React.js Starter Kit
- * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE.txt file in the root directory of this source tree.
- */
-
-'use strict';
-
-var React = require('react');
-var Link = require('./Link');
-
-var Navbar = React.createClass({
- render() {
- return (
- <div className="navbar-top" role="navigation">
- <div className="container">
- <Link className="navbar-brand row" to="/">
- <img src="/images/logo-small.png" width="38" height="38" alt="React" />
- <span>React.js Starter Kit</span>
- </Link>
- </div>
- </div>
- );
- }
-});
-
-module.exports = Navbar;
diff --git a/src/components/common/Link.js b/src/components/common/Link.js
@@ -0,0 +1,31 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+var React = require('react');
+var RouteActions = require('../../actions/RouteActions');
+
+var Link = React.createClass({
+ propTypes: {
+ to: React.PropTypes.string.isRequired
+ },
+ render() {
+ this.props.href =
+ this.props.to && this.props.to.lastIndexOf('/', 0) === 0 ?
+ this.props.to : '/' + this.props.to;
+
+ return <a onClick={this.handleClick} {...this.props}>{this.props.children}</a>;
+ },
+ handleClick(e) {
+ e.preventDefault();
+ RouteActions.setRoute(this.props.to);
+ }
+});
+
+module.exports = Link;
diff --git a/src/components/forms/TextBox.js b/src/components/forms/TextBox.js
@@ -0,0 +1,40 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+require('./TextBox.less');
+
+var React = require('react');
+
+var TextBox = React.createClass({
+
+ propTypes: {
+ maxLines: React.PropTypes.number
+ },
+
+ getDefaultProps() {
+ return {
+ maxLines: 1
+ };
+ },
+
+ render() {
+ return (
+ <div className="TextBox">
+ {this.props.maxLines > 1 ?
+ <textarea {...this.props} className="TextBox-input" ref="input" key="input" rows={this.props.maxLines} /> :
+ <input {...this.props} className="TextBox-input" ref="input" key="input" />}
+ </div>
+ );
+ }
+
+});
+
+module.exports = TextBox;
+
diff --git a/src/components/forms/TextBox.less b/src/components/forms/TextBox.less
@@ -0,0 +1,10 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+.TextBox {}
+.TextBox-input {}
diff --git a/src/components/layout/App.js b/src/components/layout/App.js
@@ -0,0 +1,79 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+var React = require('react');
+var PageStore = require('../../stores/PageStore');
+var Link = require('../common/Link');
+var Navbar = require('../layout/Navbar');
+
+/**
+ * Retrieves the current page metadata from the PageStore.
+ * @returns {{title: string}}
+ */
+function getState() {
+ return {
+ title: PageStore.get().title
+ };
+}
+
+var DefaultLayout = React.createClass({
+
+ mixins: [PageStore.Mixin],
+
+ getInitialState() {
+ return getState();
+ },
+
+ componentDidMount() {
+ PageStore.emitChange();
+ },
+
+ render() {
+ var header = this.props.children.type.breadcrumb ? (
+ <div className="container">
+ <h2>{this.state.title}</h2>
+ {this.props.children.type.breadcrumb}
+ </div>
+ ) : (
+ <div className="jumbotron">
+ <div className="container text-center">
+ <h1>React</h1>
+ <p>Complex web apps made easy</p>
+ </div>
+ </div>
+ );
+
+ return (
+ <div>
+ <Navbar />
+ {header}
+ {this.props.children}
+ <div className="navbar-footer">
+ <div className="container">
+ <p className="text-muted">
+ <span>© KriaSoft</span>
+ <span><Link to="/">Home</Link></span>
+ <span><Link to="/privacy">Privacy</Link></span>
+ </p>
+ </div>
+ </div>
+ </div>
+ );
+ },
+
+ /**
+ * Event handler for 'change' events coming from the PageStore.
+ */
+ onChange() {
+ this.setState(getState());
+ }
+});
+
+module.exports = DefaultLayout;
diff --git a/src/components/layout/Navbar.js b/src/components/layout/Navbar.js
@@ -0,0 +1,29 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+var React = require('react');
+var Link = require('../common/Link');
+
+var Navbar = React.createClass({
+ render() {
+ return (
+ <div className="navbar-top" role="navigation">
+ <div className="container">
+ <Link className="navbar-brand row" to="/">
+ <img src="/images/logo-small.png" width="38" height="38" alt="React" />
+ <span>React.js Starter Kit</span>
+ </Link>
+ </div>
+ </div>
+ );
+ }
+});
+
+module.exports = Navbar;
diff --git a/src/components/__tests__/Navbar-test.js b/src/components/layout/__tests__/Navbar-test.js
diff --git a/src/pages/404.html b/src/components/pages/404.html
diff --git a/src/components/pages/Home.js b/src/components/pages/Home.js
@@ -0,0 +1,62 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+var React = require('react');
+var PageActions = require('../../actions/PageActions');
+var App = require('../layout/App');
+
+var HomePage = React.createClass({
+
+ statics: {
+ layout: App
+ },
+
+ componentWillMount() {
+ PageActions.set({title: 'React.js Starter Kit'});
+ },
+
+ render() {
+ return (
+ <div className="container">
+ <div className="row">
+ <div className="col-sm-4">
+ <h3>Runtime Components</h3>
+ <dl>
+ <dt><a href="https://facebook.github.io/react/">React</a></dt>
+ <dd>A JavaScript library for building user interfaces, developed by Facebook</dd>
+ <dt><a href="https://github.com/flatiron/director">Director</a></dt>
+ <dd>A tiny and isomorphic URL router for JavaScript</dd>
+ <dt><a href="http://getbootstrap.com/">Bootstrap</a></dt>
+ <dd>CSS framework for developing responsive, mobile first interfaces</dd>
+ </dl>
+ </div>
+ <div className="col-sm-4">
+ <h3>Development Tools</h3>
+ <dl>
+ <dt><a href="http://gulpjs.com">Gulp</a></dt>
+ <dd>JavaScript streaming build system and task automation</dd>
+ <dt><a href="http://webpack.github.io/">Webpack</a></dt>
+ <dd>Compiles front-end source code into modules / bundles</dd>
+ <dt><a href="http://www.browsersync.io/">BrowserSync</a></dt>
+ <dd>A lightweight HTTP server for development</dd>
+ </dl>
+ </div>
+ <div className="col-sm-4">
+ <h3>Fork me on GitHub</h3>
+ <p><a href="https://github.com/kriasoft/react-starter-kit">github.com/kriasoft/react-starter-kit</a></p>
+ </div>
+ </div>
+ </div>
+ );
+ }
+
+});
+
+module.exports = HomePage;
diff --git a/src/components/pages/Privacy.js b/src/components/pages/Privacy.js
@@ -0,0 +1,81 @@
+/*
+ * React.js Starter Kit
+ * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.txt file in the root directory of this source tree.
+ */
+
+'use strict';
+
+var React = require('react');
+var PageActions = require('../../actions/PageActions');
+var App = require('../layout/App');
+var Link = require('../common/Link');
+
+var PrivacyPage = React.createClass({
+
+ statics: {
+ layout: App,
+ breadcrumb: (
+ <ol className="breadcrumb">
+ <li><Link to="/">Home</Link></li>
+ <li className="active">Privacy</li>
+ </ol>
+ )
+ },
+
+ componentWillMount() {
+ PageActions.set({title: 'Privacy Policy'});
+ },
+
+ render() {
+ return (
+ <div className="container">
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat tortor fermentum mi
+ fermentum dignissim. Nullam vel ipsum ut ligula elementum lobortis. Maecenas aliquam, massa laoreet
+ lacinia pretium, nisi urna venenatis tortor, nec imperdiet tellus libero efficitur metus. Fusce
+ semper posuere ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem pharetra
+ commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat augue libero, id consectetur
+ tortor bibendum non. Quisque nec fringilla lorem. Nullam efficitur vulputate mauris, nec maximus leo
+ dignissim id.
+ </p>
+ <p>
+ In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. Morbi pellentesque
+ venenatis felis sed convallis. Nulla varius, nibh vitae placerat tempus, mauris sem elementum ipsum,
+ eget sollicitudin nisl est vel purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras
+ pharetra sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non scelerisque
+ purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus posuere placerat. Sed et libero eu
+ nibh tristique mollis a eget lectus. Donec interdum augue sollicitudin vehicula hendrerit. Vivamus
+ justo orci, molestie ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu
+ tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in consequat elit tellus
+ auctor nulla. Donec placerat elementum diam, vitae imperdiet lectus luctus at.
+ </p>
+ <p>
+ Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam non quam nisi. Donec
+ rutrum turpis ac diam blandit, id pulvinar mauris suscipit. Pellentesque tincidunt libero ultricies
+ risus iaculis, sit amet consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit
+ ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum justo sapien, sit amet
+ consequat orci accumsan et. Aliquam ornare ullamcorper sem sed finibus. Nullam ac lacus pulvinar,
+ egestas felis ut, accumsan est.
+ </p>
+ <p>
+ Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem hendrerit aliquam.
+ Integer eu varius orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
+ cubilia Curae; Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia
+ Curae; Ut at mauris nibh. Suspendisse maximus ac eros at vestibulum.
+ </p>
+ <p>
+ Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas tortor et dui
+ consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, vulputate nisl. Aenean congue varius
+ ex, sit amet bibendum odio posuere at. Nulla facilisi. In finibus, nulla vitae tincidunt ornare,
+ sapien nulla fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam enim.
+ </p>
+ </div>
+ );
+ }
+
+});
+
+module.exports = PrivacyPage;
diff --git a/src/pages/_template.html b/src/components/pages/index.html
diff --git a/src/layouts/DefaultLayout.js b/src/layouts/DefaultLayout.js
@@ -1,79 +0,0 @@
-/*
- * React.js Starter Kit
- * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE.txt file in the root directory of this source tree.
- */
-
-'use strict';
-
-var React = require('react');
-var PageStore = require('../stores/PageStore');
-var Link = require('../components/Link');
-var Navbar = require('../components/Navbar');
-
-/**
- * Retrieves the current page metadata from the PageStore.
- * @returns {{title: string}}
- */
-function getState() {
- return {
- title: PageStore.get().title
- };
-}
-
-var DefaultLayout = React.createClass({
-
- mixins: [PageStore.Mixin],
-
- getInitialState() {
- return getState();
- },
-
- componentDidMount() {
- PageStore.emitChange();
- },
-
- render() {
- var header = this.props.children.type.breadcrumb ? (
- <div className="container">
- <h2>{this.state.title}</h2>
- {this.props.children.type.breadcrumb}
- </div>
- ) : (
- <div className="jumbotron">
- <div className="container text-center">
- <h1>React</h1>
- <p>Complex web apps made easy</p>
- </div>
- </div>
- );
-
- return (
- <div>
- <Navbar />
- {header}
- {this.props.children}
- <div className="navbar-footer">
- <div className="container">
- <p className="text-muted">
- <span>© KriaSoft</span>
- <span><Link to="/">Home</Link></span>
- <span><Link to="/privacy">Privacy</Link></span>
- </p>
- </div>
- </div>
- </div>
- );
- },
-
- /**
- * Event handler for 'change' events coming from the PageStore.
- */
- onChange() {
- this.setState(getState());
- }
-});
-
-module.exports = DefaultLayout;
diff --git a/src/pages/Index.js b/src/pages/Index.js
@@ -1,62 +0,0 @@
-/*
- * React.js Starter Kit
- * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE.txt file in the root directory of this source tree.
- */
-
-'use strict';
-
-var React = require('react');
-var PageActions = require('../actions/PageActions');
-var DefaultLayout = require('../layouts/DefaultLayout');
-
-var HomePage = React.createClass({
-
- statics: {
- layout: DefaultLayout
- },
-
- componentWillMount() {
- PageActions.set({title: 'React.js Starter Kit'});
- },
-
- render() {
- return (
- <div className="container">
- <div className="row">
- <div className="col-sm-4">
- <h3>Runtime Components</h3>
- <dl>
- <dt><a href="https://facebook.github.io/react/">React</a></dt>
- <dd>A JavaScript library for building user interfaces, developed by Facebook</dd>
- <dt><a href="https://github.com/flatiron/director">Director</a></dt>
- <dd>A tiny and isomorphic URL router for JavaScript</dd>
- <dt><a href="http://getbootstrap.com/">Bootstrap</a></dt>
- <dd>CSS framework for developing responsive, mobile first interfaces</dd>
- </dl>
- </div>
- <div className="col-sm-4">
- <h3>Development Tools</h3>
- <dl>
- <dt><a href="http://gulpjs.com">Gulp</a></dt>
- <dd>JavaScript streaming build system and task automation</dd>
- <dt><a href="http://webpack.github.io/">Webpack</a></dt>
- <dd>Compiles front-end source code into modules / bundles</dd>
- <dt><a href="http://www.browsersync.io/">BrowserSync</a></dt>
- <dd>A lightweight HTTP server for development</dd>
- </dl>
- </div>
- <div className="col-sm-4">
- <h3>Fork me on GitHub</h3>
- <p><a href="https://github.com/kriasoft/react-starter-kit">github.com/kriasoft/react-starter-kit</a></p>
- </div>
- </div>
- </div>
- );
- }
-
-});
-
-module.exports = HomePage;
diff --git a/src/pages/Privacy.js b/src/pages/Privacy.js
@@ -1,81 +0,0 @@
-/*
- * React.js Starter Kit
- * Copyright (c) 2014 Konstantin Tarkus (@koistya), KriaSoft LLC.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE.txt file in the root directory of this source tree.
- */
-
-'use strict';
-
-var React = require('react');
-var PageActions = require('../actions/PageActions');
-var DefaultLayout = require('../layouts/DefaultLayout');
-var Link = require('../components/Link');
-
-var PrivacyPage = React.createClass({
-
- statics: {
- layout: DefaultLayout,
- breadcrumb: (
- <ol className="breadcrumb">
- <li><Link to="/">Home</Link></li>
- <li className="active">Privacy</li>
- </ol>
- )
- },
-
- componentWillMount() {
- PageActions.set({title: 'Privacy Policy'});
- },
-
- render() {
- return (
- <div className="container">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat tortor fermentum mi
- fermentum dignissim. Nullam vel ipsum ut ligula elementum lobortis. Maecenas aliquam, massa laoreet
- lacinia pretium, nisi urna venenatis tortor, nec imperdiet tellus libero efficitur metus. Fusce
- semper posuere ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem pharetra
- commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat augue libero, id consectetur
- tortor bibendum non. Quisque nec fringilla lorem. Nullam efficitur vulputate mauris, nec maximus leo
- dignissim id.
- </p>
- <p>
- In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. Morbi pellentesque
- venenatis felis sed convallis. Nulla varius, nibh vitae placerat tempus, mauris sem elementum ipsum,
- eget sollicitudin nisl est vel purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras
- pharetra sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non scelerisque
- purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus posuere placerat. Sed et libero eu
- nibh tristique mollis a eget lectus. Donec interdum augue sollicitudin vehicula hendrerit. Vivamus
- justo orci, molestie ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu
- tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in consequat elit tellus
- auctor nulla. Donec placerat elementum diam, vitae imperdiet lectus luctus at.
- </p>
- <p>
- Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam non quam nisi. Donec
- rutrum turpis ac diam blandit, id pulvinar mauris suscipit. Pellentesque tincidunt libero ultricies
- risus iaculis, sit amet consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit
- ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum justo sapien, sit amet
- consequat orci accumsan et. Aliquam ornare ullamcorper sem sed finibus. Nullam ac lacus pulvinar,
- egestas felis ut, accumsan est.
- </p>
- <p>
- Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem hendrerit aliquam.
- Integer eu varius orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
- cubilia Curae; Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia
- Curae; Ut at mauris nibh. Suspendisse maximus ac eros at vestibulum.
- </p>
- <p>
- Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas tortor et dui
- consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, vulputate nisl. Aenean congue varius
- ex, sit amet bibendum odio posuere at. Nulla facilisi. In finibus, nulla vitae tincidunt ornare,
- sapien nulla fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam enim.
- </p>
- </div>
- );
- }
-
-});
-
-module.exports = PrivacyPage;