initial commit
This commit is contained in:
commit
14b485e2d7
38 changed files with 1664 additions and 0 deletions
26
.drone.yml
Normal file
26
.drone.yml
Normal file
|
@ -0,0 +1,26 @@
|
|||
pipeline:
|
||||
build:
|
||||
image: ulexus/drone-revel
|
||||
pull: true
|
||||
commands:
|
||||
- mkdir -p ${GOPATH}/github.com/CyCoreSystems/test-revel
|
||||
- cp -a * ${GOPATH}/github.com/CyCoreSystems/test-revel/
|
||||
- revel build github.com/CyCoreSystems/test-revel tmp
|
||||
publish:
|
||||
image: plugins/docker
|
||||
repo: quay.io/cycore/web
|
||||
tags:
|
||||
- "${DRONE_COMMIT}"
|
||||
registry: quay.io
|
||||
email: ulexus@gmail.com
|
||||
secrets: [ docker_username, docker_password ]
|
||||
deploy:
|
||||
image: quay.io/honestbee/drone-kubernetes
|
||||
namespace: web
|
||||
deployment: cycore
|
||||
container: web
|
||||
secrets: [ kubernetes_username, kubernetes_token, kubernetes_server ]
|
||||
repo: quay.io/cycore/web
|
||||
tag:
|
||||
- "${DRONE_COMMIT}"
|
||||
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
test-results/
|
||||
tmp/
|
||||
routes/
|
3
Dockerfile
Normal file
3
Dockerfile
Normal file
|
@ -0,0 +1,3 @@
|
|||
FROM ulexus/go-minimal
|
||||
COPY tmp/cycore-web /app
|
||||
COPY tmp/src /
|
75
README.md
Normal file
75
README.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
# Welcome to Revel
|
||||
|
||||
## Getting Started
|
||||
|
||||
A high-productivity web framework for the [Go language](http://www.golang.org/).
|
||||
|
||||
### Start the web server:
|
||||
|
||||
revel run myapp
|
||||
|
||||
Run with <tt>--help</tt> for options.
|
||||
|
||||
### Go to http://localhost:9000/ and you'll see:
|
||||
|
||||
"It works"
|
||||
|
||||
### Description of Contents
|
||||
|
||||
The default directory structure of a generated Revel application:
|
||||
|
||||
myapp App root
|
||||
app App sources
|
||||
controllers App controllers
|
||||
init.go Interceptor registration
|
||||
models App domain models
|
||||
routes Reverse routes (generated code)
|
||||
views Templates
|
||||
tests Test suites
|
||||
conf Configuration files
|
||||
app.conf Main configuration file
|
||||
routes Routes definition
|
||||
messages Message files
|
||||
public Public assets
|
||||
css CSS files
|
||||
js Javascript files
|
||||
images Image files
|
||||
|
||||
app
|
||||
|
||||
The app directory contains the source code and templates for your application.
|
||||
|
||||
conf
|
||||
|
||||
The conf directory contains the application’s configuration files. There are two main configuration files:
|
||||
|
||||
* app.conf, the main configuration file for the application, which contains standard configuration parameters
|
||||
* routes, the routes definition file.
|
||||
|
||||
|
||||
messages
|
||||
|
||||
The messages directory contains all localized message files.
|
||||
|
||||
public
|
||||
|
||||
Resources stored in the public directory are static assets that are served directly by the Web server. Typically it is split into three standard sub-directories for images, CSS stylesheets and JavaScript files.
|
||||
|
||||
The names of these directories may be anything; the developer need only update the routes.
|
||||
|
||||
test
|
||||
|
||||
Tests are kept in the tests directory. Revel provides a testing framework that makes it easy to write and run functional tests against your application.
|
||||
|
||||
### Follow the guidelines to start developing your application:
|
||||
|
||||
* The README file created within your application.
|
||||
* The [Getting Started with Revel](http://revel.github.io/tutorial/index.html).
|
||||
* The [Revel guides](http://revel.github.io/manual/index.html).
|
||||
* The [Revel sample apps](http://revel.github.io/samples/index.html).
|
||||
* The [API documentation](https://godoc.org/github.com/revel/revel).
|
||||
|
||||
## Contributing
|
||||
We encourage you to contribute to Revel! Please check out the [Contributing to Revel
|
||||
guide](https://github.com/revel/revel/blob/master/CONTRIBUTING.md) for guidelines about how
|
||||
to proceed. [Join us](https://groups.google.com/forum/#!forum/revel-framework)!
|
11
app/controllers/app.go
Normal file
11
app/controllers/app.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package controllers
|
||||
|
||||
import "github.com/revel/revel"
|
||||
|
||||
type App struct {
|
||||
*revel.Controller
|
||||
}
|
||||
|
||||
func (c App) Index() revel.Result {
|
||||
return c.Render()
|
||||
}
|
109
app/controllers/contact.go
Normal file
109
app/controllers/contact.go
Normal file
|
@ -0,0 +1,109 @@
|
|||
package controllers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/CyCoreSystems/test-revel/app/routes"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/revel/revel"
|
||||
)
|
||||
|
||||
var contactEmailT *template.Template
|
||||
|
||||
func init() {
|
||||
contactEmailT = template.Must(template.New("contactEmail").Parse(contactEmailTemplate))
|
||||
}
|
||||
|
||||
// Contact controller handles customer contact operations
|
||||
type Contact struct {
|
||||
*revel.Controller
|
||||
}
|
||||
|
||||
// Request handles a customer contact request
|
||||
func (c Contact) Request(name, email string) revel.Result {
|
||||
emailBody, err := renderContactEmail(name, email)
|
||||
if err != nil {
|
||||
return c.Controller.RenderError(errors.Wrap(err, "failed to render email for contact request"))
|
||||
}
|
||||
|
||||
body, err := emailRequestBody(emailBody)
|
||||
if err != nil {
|
||||
return c.Controller.RenderError(errors.Wrap(err, "failed to encode email request"))
|
||||
}
|
||||
|
||||
// Don't sent when in dev mode
|
||||
if revel.Config.BoolDefault("mode.dev", true) {
|
||||
revel.INFO.Println("email:", name, email, bytes.NewBuffer(body).String())
|
||||
c.Flash.Success("request faked")
|
||||
return c.Redirect(routes.App.Index())
|
||||
}
|
||||
|
||||
mreq, err := http.NewRequest("POST", "https://api.sendinblue.com/v2.0/email", bytes.NewReader(body))
|
||||
mreq.Header.Add("api-key", os.Getenv("SENDINBLUE_APIKEY"))
|
||||
mreq.Header.Add("Content-Type", "application/json")
|
||||
mreq.Header.Add("X-Mailin-Tag", "contact-request")
|
||||
|
||||
resp, err := http.DefaultClient.Do(mreq)
|
||||
if err != nil {
|
||||
revel.ERROR.Println("Failed to send contact request email", name, email, err)
|
||||
return c.Controller.RenderError(errors.Wrap(err, "failed to send contact request email"))
|
||||
}
|
||||
if resp.StatusCode > 299 {
|
||||
revel.ERROR.Println("Contact request email was rejected:", name, email, resp.Status, bytes.NewBuffer(body).String())
|
||||
c.Flash.Error("failed to send context request")
|
||||
return c.Redirect(routes.App.Index())
|
||||
}
|
||||
|
||||
c.Flash.Success("Request sent")
|
||||
return c.Redirect(routes.App.Index())
|
||||
}
|
||||
|
||||
func renderContactEmail(name, email string) (string, error) {
|
||||
buf := new(bytes.Buffer)
|
||||
err := contactEmailT.Execute(buf, struct {
|
||||
Name string
|
||||
Email string
|
||||
Timestamp string
|
||||
}{
|
||||
Name: name,
|
||||
Email: email,
|
||||
Timestamp: time.Now().String(),
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return buf.String(), nil
|
||||
}
|
||||
|
||||
func emailRequestBody(email string) ([]byte, error) {
|
||||
body := struct {
|
||||
To map[string]string `json:"to"`
|
||||
Subject string `json:"subject"`
|
||||
From []string `json:"from"`
|
||||
HTML string `json:"html"`
|
||||
}{
|
||||
To: map[string]string{"ulexus@gmail.com": "Sean C McCord"},
|
||||
Subject: "Contact Request",
|
||||
From: []string{"sys@cycoresys.com", "CyCore Systems Inc"},
|
||||
HTML: email,
|
||||
}
|
||||
return json.Marshal(&body)
|
||||
}
|
||||
|
||||
var contactEmailTemplate = `
|
||||
<html>
|
||||
<body>
|
||||
<h3>Web Contact Form</h3>
|
||||
<ul>
|
||||
<li><b>Name:</b> {{.Name}}</li>
|
||||
<li><b>Email:</b> {{.Email}}</li>
|
||||
<li><b>Timestamp:</b> {{.Timestamp}}</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
`
|
38
app/init.go
Normal file
38
app/init.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package app
|
||||
|
||||
import "github.com/revel/revel"
|
||||
|
||||
func init() {
|
||||
// Filters is the default set of global filters.
|
||||
revel.Filters = []revel.Filter{
|
||||
revel.PanicFilter, // Recover from panics and display an error page instead.
|
||||
revel.RouterFilter, // Use the routing table to select the right Action
|
||||
revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters.
|
||||
revel.ParamsFilter, // Parse parameters into Controller.Params.
|
||||
revel.SessionFilter, // Restore and write the session cookie.
|
||||
revel.FlashFilter, // Restore and write the flash cookie.
|
||||
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
|
||||
revel.I18nFilter, // Resolve the requested language
|
||||
HeaderFilter, // Add some security based headers
|
||||
revel.InterceptorFilter, // Run interceptors around the action.
|
||||
revel.CompressFilter, // Compress the result.
|
||||
revel.ActionInvoker, // Invoke the action.
|
||||
}
|
||||
|
||||
// register startup functions with OnAppStart
|
||||
// ( order dependent )
|
||||
// revel.OnAppStart(InitDB)
|
||||
// revel.OnAppStart(FillCache)
|
||||
}
|
||||
|
||||
// TODO turn this into revel.HeaderFilter
|
||||
// should probably also have a filter for CSRF
|
||||
// not sure if it can go in the same filter or not
|
||||
var HeaderFilter = func(c *revel.Controller, fc []revel.Filter) {
|
||||
// Add some common security headers
|
||||
c.Response.Out.Header().Add("X-Frame-Options", "SAMEORIGIN")
|
||||
c.Response.Out.Header().Add("X-XSS-Protection", "1; mode=block")
|
||||
c.Response.Out.Header().Add("X-Content-Type-Options", "nosniff")
|
||||
|
||||
fc[0](c, fc[1:]) // Execute the next filter stage.
|
||||
}
|
31
app/views/App/Index.html
Normal file
31
app/views/App/Index.html
Normal file
|
@ -0,0 +1,31 @@
|
|||
{{set . "title" "CyCore Systems"}}
|
||||
{{template "header.html" .}}
|
||||
|
||||
<div id="page">
|
||||
<div class="transcontentunit twelve" id="mainlogo">
|
||||
|
||||
</div>
|
||||
<div class="transcontentunit twelve" id="mainstatement">
|
||||
<h2>
|
||||
Whether you need a design, an MVP, or a finished product: we solve problems.
|
||||
</h2>
|
||||
</div>
|
||||
<div class="transcontentunit twelve" id="maincontact">
|
||||
{{template "flash.html" .}}
|
||||
{{template "contact.html" .}}
|
||||
</div>
|
||||
<div class="transcontentunit twelve" id="mainservice">
|
||||
<ul>
|
||||
<li class="one">Architecture</li>
|
||||
<li class="two">Design</li>
|
||||
<li class="one">Performance</li>
|
||||
<li class="three">Containerizing</li>
|
||||
<li class="one">UI, UX, Usability</li>
|
||||
<li class="two">App Development</li>
|
||||
<li class="three">Voice & IoT</li>
|
||||
<li class="two">Training</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{template "footer.html" .}}
|
7
app/views/contact.html
Normal file
7
app/views/contact.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
<h4>Set up a no-obligation fifteen minute call now
|
||||
<form action="/contact/request" method="POST">
|
||||
<input type="text" name="name" placeholder="Your Name" REQUIRED />
|
||||
<input type="email" name="email" placeholder="Your Email" REQUIRED />
|
||||
<input type="submit" name="submit" value="Let's Chat" />
|
||||
</form>
|
||||
</h4>
|
64
app/views/debug.html
Normal file
64
app/views/debug.html
Normal file
|
@ -0,0 +1,64 @@
|
|||
<style type="text/css">
|
||||
#sidebar {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top:69px;
|
||||
max-width: 75%;
|
||||
z-index: 1000;
|
||||
background-color: #fee;
|
||||
border: thin solid grey;
|
||||
padding: 10px;
|
||||
}
|
||||
#toggleSidebar {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top: 50px;
|
||||
background-color: #fee;
|
||||
}
|
||||
|
||||
</style>
|
||||
<div id="sidebar" style="display:none;">
|
||||
<h4>Available pipelines</h4>
|
||||
<dl>
|
||||
{{ range $index, $value := .}}
|
||||
<dt>{{$index}}</dt>
|
||||
<dd>{{$value}}</dd>
|
||||
{{end}}
|
||||
</dl>
|
||||
<h4>Flash</h4>
|
||||
<dl>
|
||||
{{ range $index, $value := .flash}}
|
||||
<dt>{{$index}}</dt>
|
||||
<dd>{{$value}}</dd>
|
||||
{{end}}
|
||||
</dl>
|
||||
|
||||
<h4>Errors</h4>
|
||||
<dl>
|
||||
{{ range $index, $value := .errors}}
|
||||
<dt>{{$index}}</dt>
|
||||
<dd>{{$value}}</dd>
|
||||
{{end}}
|
||||
</dl>
|
||||
</div>
|
||||
<a id="toggleSidebar" href="#" class="toggles"><i class="glyphicon glyphicon-chevron-left"></i></a>
|
||||
|
||||
<script>
|
||||
$sidebar = 0;
|
||||
$('#toggleSidebar').click(function() {
|
||||
if ($sidebar === 1) {
|
||||
$('#sidebar').hide();
|
||||
$('#toggleSidebar i').addClass('glyphicon-chevron-left');
|
||||
$('#toggleSidebar i').removeClass('glyphicon-chevron-right');
|
||||
$sidebar = 0;
|
||||
}
|
||||
else {
|
||||
$('#sidebar').show();
|
||||
$('#toggleSidebar i').addClass('glyphicon-chevron-right');
|
||||
$('#toggleSidebar i').removeClass('glyphicon-chevron-left');
|
||||
$sidebar = 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
</script>
|
20
app/views/errors/404.html
Normal file
20
app/views/errors/404.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Not found</title>
|
||||
</head>
|
||||
<body>
|
||||
{{if eq .RunMode "dev"}}
|
||||
{{template "errors/404-dev.html" .}}
|
||||
{{else}}
|
||||
{{with .Error}}
|
||||
<h1>
|
||||
{{.Title}}
|
||||
</h1>
|
||||
<p>
|
||||
{{.Description}}
|
||||
</p>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</body>
|
||||
</html>
|
16
app/views/errors/500.html
Normal file
16
app/views/errors/500.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Application error</title>
|
||||
</head>
|
||||
<body>
|
||||
{{if eq .RunMode "dev"}}
|
||||
{{template "errors/500-dev.html" .}}
|
||||
{{else}}
|
||||
<h1>Oops, an error occured</h1>
|
||||
<p>
|
||||
This exception has been logged.
|
||||
</p>
|
||||
{{end}}
|
||||
</body>
|
||||
</html>
|
18
app/views/flash.html
Normal file
18
app/views/flash.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
{{if .flash.success}}
|
||||
<div class="alert alert-success">
|
||||
{{.flash.success}}
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
{{if or .errors .flash.error}}
|
||||
<div class="alert alert-error">
|
||||
{{if .flash.error}}
|
||||
{{.flash.error}}
|
||||
{{end}}
|
||||
<ul style="margin-top:10px;">
|
||||
{{range .errors}}
|
||||
<li>{{.}}</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
</div>
|
||||
{{end}}
|
25
app/views/footer.html
Normal file
25
app/views/footer.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
|
||||
<div class="footer">
|
||||
<div class="credit">
|
||||
<a href="http://www.cycoresys.com">
|
||||
Site by CyCore Systems
|
||||
</a>
|
||||
</div>
|
||||
<div class="copy">
|
||||
© 2016 CyCore Systems
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="social">
|
||||
<a href="">
|
||||
<i class="fa fa-twitter"></i>
|
||||
</a>
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
|
||||
{{if eq .RunMode "dev"}}
|
||||
{{template "debug.html" .}}
|
||||
{{end}}
|
||||
</body>
|
||||
</html>
|
19
app/views/header.html
Normal file
19
app/views/header.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>{{.title}}</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="author" content="CyCore Systems, Inc.">
|
||||
<link rel="shortcut icon" type="image/png" href="/public/img/favicon.png">
|
||||
<link rel="stylesheet/less" type="text/css" href="/public/css/master.less"/>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.7.1/less.min.js"></script>
|
||||
{{range .moreStyles}}
|
||||
<link rel="stylesheet" type="text/css" href="/public/{{.}}">
|
||||
{{end}}
|
||||
{{range .moreScripts}}
|
||||
<script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
|
||||
{{end}}
|
||||
</head>
|
||||
<body>
|
218
conf/app.conf
Normal file
218
conf/app.conf
Normal file
|
@ -0,0 +1,218 @@
|
|||
################################################################################
|
||||
# Revel configuration file
|
||||
# See:
|
||||
# http://revel.github.io/manual/appconf.html
|
||||
# for more detailed documentation.
|
||||
################################################################################
|
||||
|
||||
# This sets the `AppName` variable which can be used in your code as
|
||||
# `if revel.AppName {...}`
|
||||
app.name = cycore-web
|
||||
|
||||
# A secret string which is passed to cryptographically sign the cookie to prevent
|
||||
# (and detect) user modification.
|
||||
# Keep this string secret or users will be able to inject arbitrary cookie values
|
||||
# into your application
|
||||
app.secret = pggqixEuKBuN8nuwrUAkTyrjCnx5YtRNh4Y7TIHvmRKh0SXrqcqPxDny6UtMyxLL
|
||||
|
||||
# Revel running behind proxy like nginx, haproxy, etc
|
||||
app.behind.proxy = false
|
||||
|
||||
|
||||
# The IP address on which to listen.
|
||||
http.addr =
|
||||
|
||||
# The port on which to listen.
|
||||
http.port = 9000
|
||||
|
||||
# Whether to use SSL or not.
|
||||
http.ssl = false
|
||||
|
||||
# Path to an X509 certificate file, if using SSL.
|
||||
#http.sslcert =
|
||||
|
||||
# Path to an X509 certificate key, if using SSL.
|
||||
#http.sslkey =
|
||||
|
||||
|
||||
# For any cookies set by Revel (Session,Flash,Error) these properties will set
|
||||
# the fields of:
|
||||
# http://golang.org/pkg/net/http/#Cookie
|
||||
#
|
||||
# Each cookie set by Revel is prefixed with this string.
|
||||
cookie.prefix = CYCORE
|
||||
|
||||
# A secure cookie has the secure attribute enabled and is only used via HTTPS,
|
||||
# ensuring that the cookie is always encrypted when transmitting from client to
|
||||
# server. This makes the cookie less likely to be exposed to cookie theft via
|
||||
# eavesdropping.
|
||||
#
|
||||
# In dev mode, this will default to false, otherwise it will
|
||||
# default to true.
|
||||
# cookie.secure = false
|
||||
|
||||
# Limit cookie access to a given domain
|
||||
#cookie.domain =
|
||||
|
||||
# Define when your session cookie expires. Possible values:
|
||||
# "720h"
|
||||
# A time duration (http://golang.org/pkg/time/#ParseDuration) after which
|
||||
# the cookie expires and the session is invalid.
|
||||
# "session"
|
||||
# Sets a session cookie which invalidates the session when the user close
|
||||
# the browser.
|
||||
session.expires = 720h
|
||||
|
||||
|
||||
# The date format used by Revel. Possible formats defined by the Go `time`
|
||||
# package (http://golang.org/pkg/time/#Parse)
|
||||
format.date = 2006-01-02
|
||||
format.datetime = 2006-01-02 15:04
|
||||
|
||||
# Timeout specifies a time limit for request (in seconds) made by a single client.
|
||||
# A Timeout of zero means no timeout.
|
||||
timeout.read = 90
|
||||
timeout.write = 60
|
||||
|
||||
|
||||
# Determines whether the template rendering should use chunked encoding.
|
||||
# Chunked encoding can decrease the time to first byte on the client side by
|
||||
# sending data before the entire template has been fully rendered.
|
||||
results.chunked = false
|
||||
|
||||
|
||||
# Prefixes for each log message line
|
||||
# User can override these prefix values within any section
|
||||
# For e.g: [dev], [prod], etc
|
||||
log.trace.prefix = "TRACE "
|
||||
log.info.prefix = "INFO "
|
||||
log.warn.prefix = "WARN "
|
||||
log.error.prefix = "ERROR "
|
||||
|
||||
|
||||
# The default language of this application.
|
||||
i18n.default_language = en
|
||||
|
||||
# The default format when message is missing.
|
||||
# The original message shows in %s
|
||||
#i18n.unknown_format = "??? %s ???"
|
||||
|
||||
|
||||
# Module to serve static content such as CSS, JavaScript and Media files
|
||||
# Allows Routes like this:
|
||||
# `Static.ServeModule("modulename","public")`
|
||||
module.static=github.com/revel/modules/static
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
# Section: dev
|
||||
# This section is evaluated when running Revel in dev mode. Like so:
|
||||
# `revel run path/to/myapp`
|
||||
[dev]
|
||||
# This sets `DevMode` variable to `true` which can be used in your code as
|
||||
# `if revel.DevMode {...}`
|
||||
# or in your templates with
|
||||
# `<no value>`
|
||||
mode.dev = true
|
||||
|
||||
|
||||
# Pretty print JSON/XML when calling RenderJson/RenderXml
|
||||
results.pretty = true
|
||||
|
||||
|
||||
# Automatically watches your applicaton files and recompiles on-demand
|
||||
watch = true
|
||||
|
||||
|
||||
# If you set watch.mode = "eager", the server starts to recompile
|
||||
# your application every time your application's files change.
|
||||
watch.mode = "normal"
|
||||
|
||||
# Watch the entire $GOPATH for code changes. Default is false.
|
||||
#watch.gopath = true
|
||||
|
||||
|
||||
# Module to run code tests in the browser
|
||||
# See:
|
||||
# http://revel.github.io/manual/testing.html
|
||||
module.testrunner = github.com/revel/modules/testrunner
|
||||
|
||||
|
||||
# Where to log the various Revel logs
|
||||
log.trace.output = off
|
||||
log.info.output = stderr
|
||||
log.warn.output = stderr
|
||||
log.error.output = stderr
|
||||
|
||||
|
||||
# Revel log flags. Possible flags defined by the Go `log` package,
|
||||
# please refer https://golang.org/pkg/log/#pkg-constants
|
||||
# Go log is "Bits or'ed together to control what's printed"
|
||||
# Examples:
|
||||
# 0 => just log the message, turn off the flags
|
||||
# 3 => log.LstdFlags (log.Ldate|log.Ltime)
|
||||
# 19 => log.Ldate|log.Ltime|log.Lshortfile
|
||||
# 23 => log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile
|
||||
log.trace.flags = 19
|
||||
log.info.flags = 19
|
||||
log.warn.flags = 19
|
||||
log.error.flags = 19
|
||||
|
||||
|
||||
# Revel request access log
|
||||
# Access log line format:
|
||||
# RequestStartTime ClientIP ResponseStatus RequestLatency HTTPMethod URLPath
|
||||
# Sample format:
|
||||
# 2016/05/25 17:46:37.112 127.0.0.1 200 270.157µs GET /
|
||||
log.request.output = stderr
|
||||
|
||||
|
||||
################################################################################
|
||||
# Section: prod
|
||||
# This section is evaluated when running Revel in production mode. Like so:
|
||||
# `revel run path/to/myapp prod`
|
||||
# See:
|
||||
# [dev] section for documentation of the various settings
|
||||
[prod]
|
||||
mode.dev = false
|
||||
|
||||
|
||||
results.pretty = false
|
||||
|
||||
|
||||
watch = false
|
||||
|
||||
|
||||
module.testrunner =
|
||||
|
||||
|
||||
log.trace.output = off
|
||||
log.info.output = off
|
||||
log.warn.output = log/%(app.name)s.log
|
||||
log.error.output = log/%(app.name)s.log
|
||||
|
||||
# Revel log flags. Possible flags defined by the Go `log` package,
|
||||
# please refer https://golang.org/pkg/log/#pkg-constants
|
||||
# Go log is "Bits or'ed together to control what's printed"
|
||||
# Examples:
|
||||
# 0 => just log the message, turn off the flags
|
||||
# 3 => log.LstdFlags (log.Ldate|log.Ltime)
|
||||
# 19 => log.Ldate|log.Ltime|log.Lshortfile
|
||||
# 23 => log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile
|
||||
log.trace.flags = 3
|
||||
log.info.flags = 3
|
||||
log.warn.flags = 3
|
||||
log.error.flags = 3
|
||||
|
||||
|
||||
# Revel request access log
|
||||
# Access log line format:
|
||||
# RequestStartTime ClientIP ResponseStatus RequestLatency HTTPMethod URLPath
|
||||
# Sample format:
|
||||
# 2016/05/25 17:46:37.112 127.0.0.1 200 270.157µs GET /
|
||||
# Example:
|
||||
# log.request.output = %(app.name)s-request.log
|
||||
log.request.output = off
|
||||
app.behind.proxy = true
|
||||
app.secret = ${COOKIE_SECRET}
|
22
conf/routes
Normal file
22
conf/routes
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Routes
|
||||
# This file defines all application routes (Higher priority routes first)
|
||||
# ~~~~
|
||||
|
||||
module:testrunner
|
||||
|
||||
GET / App.Index
|
||||
|
||||
# Handle contact requests
|
||||
POST /contact/request Contact.Request
|
||||
|
||||
# Ignore favicon requests
|
||||
GET /favicon.ico 404
|
||||
|
||||
# Map static resources from the /app/public folder to the /public path
|
||||
GET /public/*filepath Static.Serve("public")
|
||||
|
||||
# GPG Public key
|
||||
GET /scm.asc Static.Serve("public", "scm.asc")
|
||||
|
||||
# Catch all
|
||||
* /:controller/:action :controller.:action
|
7
messages/sample.en
Normal file
7
messages/sample.en
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Sample messages file for the English language (en)
|
||||
# Message file extensions should be ISO 639-1 codes (http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
|
||||
# Sections within each message file can optionally override the defaults using ISO 3166-1 alpha-2 codes (http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
||||
# See also:
|
||||
# - http://www.rfc-editor.org/rfc/bcp/bcp47.txt
|
||||
# - http://www.w3.org/International/questions/qa-accept-lang-locales
|
||||
|
12
public/css/alert.import.less
vendored
Normal file
12
public/css/alert.import.less
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
.alert {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.alert-error {
|
||||
color: @red;
|
||||
}
|
||||
|
||||
.alert-success {
|
||||
color: @green;
|
||||
}
|
1
public/css/anim.import.less
vendored
Normal file
1
public/css/anim.import.less
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
//ANIMATIONS
|
164
public/css/base.import.less
vendored
Normal file
164
public/css/base.import.less
vendored
Normal file
|
@ -0,0 +1,164 @@
|
|||
|
||||
//PRESETS
|
||||
|
||||
body, div, nav, ul, li, a, label, span, table {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
float: left;
|
||||
box-sizing: border-box;
|
||||
background-clip: border-box;
|
||||
}
|
||||
body {
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
background: @background;
|
||||
}
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
div {
|
||||
float: left;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
padding: 5px 10px;
|
||||
.border-radius(7px);
|
||||
.fasttrans;
|
||||
color: @key;
|
||||
}
|
||||
a:hover { .fasttrans; color: @keylight;}
|
||||
|
||||
.hide { display: none; }
|
||||
|
||||
//GRID COLUMNS
|
||||
|
||||
.twelve { .column(12); }
|
||||
.ten { .column(10); }
|
||||
.nine { .column(9); }
|
||||
.eight { .column(8); }
|
||||
.six { .column(6); }
|
||||
.five { .column(5); }
|
||||
.four { .column(4); }
|
||||
.three { .column(3); }
|
||||
.two { .column(2); }
|
||||
|
||||
//STRUCTURES
|
||||
|
||||
#page {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 500px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.unit { //used for tables
|
||||
overflow: hidden;
|
||||
.background-linear-gradient(#fff 25%, @lightgrey);
|
||||
border: 1px solid @lightgrey;
|
||||
.border-radius(5px);
|
||||
.box-shadow(1px 1px 1px 0 rgba(0, 0, 0, 0.6));
|
||||
}
|
||||
.contentunit {
|
||||
.background-linear-gradient(white, fadeout(@keylight, 98%));
|
||||
.border-radius(10px);
|
||||
border: 2px solid fadeout(@keylight, 60%);
|
||||
}
|
||||
.transcontentunit {
|
||||
.contentunit;
|
||||
background: transparent none;
|
||||
border: 2px solid transparent;
|
||||
}
|
||||
.colorcontentunit {
|
||||
.contentunit;
|
||||
background: @key;
|
||||
border: 2px solid @key;
|
||||
font-size: 1.3em;
|
||||
color: white;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
label {
|
||||
width: 40%;
|
||||
text-align: right;
|
||||
margin-left: 7px;
|
||||
}
|
||||
|
||||
|
||||
i {
|
||||
color: white;
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
background-color: @key;
|
||||
.border-radius(150px);
|
||||
.box-shadow(0px 1px 2px 0 @darkestgrey);
|
||||
.fasttrans;
|
||||
}
|
||||
i:hover { background-color: @keylight; .fasttrans; }
|
||||
|
||||
.social i {
|
||||
font-size: 26px;
|
||||
height: 32px;
|
||||
width: 42px;
|
||||
padding-top: 10px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.hide { display: none; }
|
||||
|
||||
.tag {
|
||||
display: block;
|
||||
background: fadeout(@keylight, 80%);
|
||||
.border-radius(2px);
|
||||
padding: 2px 5px;
|
||||
margin: 2px 10px 2px 0;
|
||||
border: 1px solid @lightestgrey;
|
||||
color: @darkgrey;
|
||||
font-weight: bold;
|
||||
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: relative;
|
||||
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 50px 30px 0 30px;
|
||||
|
||||
.copy, .credit {
|
||||
.sans;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
line-height: 30px;
|
||||
margin: 0;
|
||||
width: auto;
|
||||
padding: 0 10px;
|
||||
}
|
||||
.credit a {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
line-height: 30px;
|
||||
color: @key;
|
||||
}
|
||||
.credit a:hover {
|
||||
color: @keydark;
|
||||
}
|
||||
.copy {
|
||||
color: @darkgrey;
|
||||
float: right;
|
||||
}
|
||||
.login {
|
||||
float: right;
|
||||
|
||||
a { .sans; }
|
||||
}
|
||||
|
||||
.social {
|
||||
float: right;
|
||||
height: 100%;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
}
|
||||
|
82
public/css/button.import.less
vendored
Normal file
82
public/css/button.import.less
vendored
Normal file
|
@ -0,0 +1,82 @@
|
|||
|
||||
//BUTTONS
|
||||
|
||||
button { border: 0 none; }
|
||||
|
||||
button.demo {
|
||||
background-color: @key;
|
||||
border-top: 1px solid @keylight;
|
||||
border-bottom: 1px solid @transblack;
|
||||
.box-shadow(
|
||||
inset 0 0 20px 5px @transblack,
|
||||
inset 0 0 0 0 @keylight,
|
||||
0 2px 4px 0 @lightblack);
|
||||
text-shadow: -1px -1px 0 black, 1px 1px 0 @keylight;
|
||||
|
||||
color: white;
|
||||
|
||||
.slowtrans;
|
||||
|
||||
i {
|
||||
color: @key;
|
||||
font-size: 85px;
|
||||
text-shadow: 0 0 0 transparent;
|
||||
vertical-align: bottom;
|
||||
position: relative;
|
||||
top: -11px;
|
||||
}
|
||||
|
||||
}
|
||||
button.demo:hover {
|
||||
// background-color: @keylight;
|
||||
.box-shadow(
|
||||
inset 0 0 20px 5px @transblack,
|
||||
inset 0px 10px 50px 0 fadeout(@keylight, 70%),
|
||||
0 2px 4px 0 @lightblack);
|
||||
text-shadow: -1px -1px 0 black, 1px 1px 0 @key;
|
||||
|
||||
.slowtrans;
|
||||
|
||||
i {
|
||||
color: white;
|
||||
text-shadow: 0 0 4px @key;
|
||||
.fasttrans;
|
||||
}
|
||||
}
|
||||
button.large {
|
||||
width: 800px;
|
||||
margin: 0 auto;
|
||||
height: 100px;
|
||||
.border-radius(8px);
|
||||
padding-top: 7px;
|
||||
|
||||
font-size: 80px;
|
||||
line-height: 100px;
|
||||
|
||||
}
|
||||
button.medium {
|
||||
.column(5, 8);
|
||||
.push(2);
|
||||
height: 60px;
|
||||
.border-radius(6px);
|
||||
margin-top: 20px;
|
||||
|
||||
font-size: 40px;
|
||||
line-height: 60px;
|
||||
|
||||
i { font-size: 50px; top: -6px; }
|
||||
}
|
||||
button.green:hover { background-color: @green; .fasttrans; }
|
||||
button.small {
|
||||
.column(2);
|
||||
.push(2);
|
||||
margin-top: 100px;
|
||||
height: 50px;
|
||||
.border-radius(6px);
|
||||
font-size: 40px;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
button:focus { outline: none; }
|
||||
|
||||
|
76
public/css/fonts.import.less
vendored
Normal file
76
public/css/fonts.import.less
vendored
Normal file
|
@ -0,0 +1,76 @@
|
|||
//CHANGE IMPORT AND open/sans/bold
|
||||
|
||||
@import url(https://fonts.googleapis.com/css?family=Montserrat|Rokkitt:700|Rubik+Mono+One);
|
||||
|
||||
.open { font-family: Verdana, sans-serif; }
|
||||
.sans { font-family: Monserrat, sans-serif; }
|
||||
.bold { font-family: Rokkitt, sans-serif; }
|
||||
|
||||
* {
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: bold;
|
||||
}
|
||||
.nav a { .open; }
|
||||
|
||||
.brand {
|
||||
.open;
|
||||
display: block;
|
||||
color: @grey;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
line-height: 48px;
|
||||
}
|
||||
.light {
|
||||
color: white;
|
||||
text-shadow: 1px 1px 2px @darkgrey, -1px -1px 1px @darkestgrey;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 { .open; }
|
||||
|
||||
h1 {
|
||||
font-size: 5em;
|
||||
position: relative;
|
||||
color: @red;
|
||||
word-wrap: break-word;
|
||||
font-weight: normal;
|
||||
line-height: 2em;
|
||||
text-shadow: -1px -1px 0 black;
|
||||
}
|
||||
h2 {
|
||||
font-size: 3em;
|
||||
line-height: 1.2em;
|
||||
color: @key;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.2em;
|
||||
padding-left: 10px; padding-right: 10px;
|
||||
}
|
||||
h4 {
|
||||
font-size: 2.2em;
|
||||
line-height: 1em;
|
||||
color: @keylight;
|
||||
text-align: center;
|
||||
}
|
||||
h5, h6 { color: @darkergrey; }
|
||||
h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
h6 {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
em {
|
||||
color: @keydark;
|
||||
font-style: italic;
|
||||
font-weight: normal;
|
||||
padding: 2px;
|
||||
.border-radius(2px);
|
||||
}
|
||||
|
||||
|
||||
|
||||
.fix { color: @red; }
|
||||
|
34
public/css/forms.import.less
vendored
Normal file
34
public/css/forms.import.less
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
label, .label, input, select, textarea {
|
||||
font-size: 20px;
|
||||
line-height: 20px;
|
||||
display: inline-block;
|
||||
.border-radius(3px);
|
||||
vertical-align: top;
|
||||
padding: 5px 10px;
|
||||
border: 0 none;
|
||||
float: left;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
|
||||
}
|
||||
|
||||
input {
|
||||
border: 1px solid @lightgrey;
|
||||
}
|
||||
input[type=submit] {
|
||||
.bold;
|
||||
padding: 7px 20px;
|
||||
margin-left: 10px;
|
||||
background: @keylight;
|
||||
color: white;
|
||||
.fasttrans;
|
||||
}
|
||||
input[type=submit]:hover, input[type=submit]:active {
|
||||
background: saturate(@contrast, 20%);
|
||||
.fasttrans;
|
||||
}
|
||||
|
||||
|
||||
|
65
public/css/grid.import.less
vendored
Normal file
65
public/css/grid.import.less
vendored
Normal file
|
@ -0,0 +1,65 @@
|
|||
/////////////////
|
||||
// Semantic.gs // for LESS: http://lesscss.org/
|
||||
/////////////////
|
||||
|
||||
// Defaults which you can freely override
|
||||
@column-width: 60;
|
||||
@gutter-width: 0;
|
||||
@columns: 12;
|
||||
|
||||
// Utility variable — you should never need to modify this
|
||||
@gridsystem-width: (@column-width*@columns) + (@gutter-width*@columns) * 1px;
|
||||
|
||||
// Set @total-width to 100% for a fluid layout
|
||||
@total-width: 100%;
|
||||
|
||||
// Uncomment these two lines and the star-hack width/margin lines below to enable sub-pixel fix for IE6 & 7. See http://tylertate.com/blog/2012/01/05/subpixel-rounding.html
|
||||
// @min-width: 960;
|
||||
// @correction: 0.5 / @min-width * 100 * 1%;
|
||||
|
||||
// The micro clearfix http://nicolasgallagher.com/micro-clearfix-hack/
|
||||
.clearfix() {
|
||||
*zoom:1;
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
content:"";
|
||||
display:table;
|
||||
}
|
||||
&:after {
|
||||
clear:both;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////
|
||||
// GRID //
|
||||
//////////
|
||||
|
||||
body {
|
||||
width: 100%;
|
||||
.clearfix;
|
||||
}
|
||||
|
||||
.row(@columns:@columns) {
|
||||
display: block;
|
||||
width: @total-width*((@gutter-width + @gridsystem-width)/@gridsystem-width);
|
||||
margin: 0 @total-width*(((@gutter-width*.5)/@gridsystem-width)*-1);
|
||||
// *width: @total-width*((@gutter-width + @gridsystem-width)/@gridsystem-width)-@correction;
|
||||
// *margin: 0 @total-width*(((@gutter-width*.5)/@gridsystem-width)*-1)-@correction;
|
||||
.clearfix;
|
||||
}
|
||||
.column(@x,@columns:@columns) {
|
||||
display: inline;
|
||||
float: left;
|
||||
width: @total-width*((((@gutter-width+@column-width)*@x)-@gutter-width) / @gridsystem-width);
|
||||
margin: 0 @total-width*((@gutter-width*.5)/@gridsystem-width);
|
||||
// *width: @total-width*((((@gutter-width+@column-width)*@x)-@gutter-width) / @gridsystem-width)-@correction;
|
||||
// *margin: 0 @total-width*((@gutter-width*.5)/@gridsystem-width)-@correction;
|
||||
}
|
||||
.push(@offset:1) {
|
||||
margin-left: @total-width*(((@gutter-width+@column-width)*@offset) / @gridsystem-width) + @total-width*((@gutter-width*.5)/@gridsystem-width);
|
||||
}
|
||||
.pull(@offset:1) {
|
||||
margin-right: @total-width*(((@gutter-width+@column-width)*@offset) / @gridsystem-width) + @total-width*((@gutter-width*.5)/@gridsystem-width);
|
||||
}
|
87
public/css/master.less
Normal file
87
public/css/master.less
Normal file
|
@ -0,0 +1,87 @@
|
|||
@import 'grid.import.less';
|
||||
@import 'var.import.less';
|
||||
@import 'fonts.import.less';
|
||||
@import 'rules.import.less';
|
||||
@import 'anim.import.less';
|
||||
|
||||
@import 'base.import.less';
|
||||
@import 'nav.import.less';
|
||||
|
||||
@import 'forms.import.less';
|
||||
@import 'tables.import.less';
|
||||
@import 'button.import.less';
|
||||
|
||||
@import 'media.import.less';
|
||||
|
||||
@import 'alert.import.less';
|
||||
|
||||
//ADD CUSTOM AND OVERRIDE CODE HERE
|
||||
|
||||
|
||||
|
||||
|
||||
//HOME
|
||||
|
||||
#mainlogo {
|
||||
background: url('/public/img/logo/Cycore_web_optimized.jpg')
|
||||
center center no-repeat;
|
||||
background-size: contain;
|
||||
height: 500px;
|
||||
}
|
||||
#mainstatement {
|
||||
color: @keydark;
|
||||
text-align: center;
|
||||
}
|
||||
#maincontact {
|
||||
h4 { text-align: center; }
|
||||
form { padding: 20px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
input { margin: 2px; flex: 1 0 auto; }
|
||||
}
|
||||
#mainservice {
|
||||
padding: 0 10px;
|
||||
ul { .twelve;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-around;
|
||||
align-content: stretch;
|
||||
|
||||
li {
|
||||
display: block;
|
||||
height: 5em;
|
||||
width: auto;
|
||||
margin: 10px;
|
||||
flex: 1 0 auto;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
color: @darkergrey;
|
||||
text-align: center;
|
||||
padding: 1em;
|
||||
padding-top: 2em;
|
||||
.stripes;
|
||||
}
|
||||
.one {background-color: @contrast; }
|
||||
.two {background-color: lighten(#2196f3, 10%);}
|
||||
.three {background-color: fadeout(#4caf50, 10%);}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
14
public/css/media.import.less
vendored
Normal file
14
public/css/media.import.less
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
//COLUMN RESPONSE
|
||||
|
||||
|
||||
//add here
|
||||
|
||||
//ADD BREAKPOINTS IF NECESSARY
|
||||
|
||||
@media all and (max-width: 1180px) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
39
public/css/nav.import.less
vendored
Normal file
39
public/css/nav.import.less
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
|
||||
//NAV MENUS AND LINKS
|
||||
|
||||
.nav {
|
||||
position: fixed;
|
||||
height: 50px;
|
||||
margin: 0 0;
|
||||
padding: 0;
|
||||
z-index: 1000;
|
||||
background: black ;
|
||||
background-size: contain;
|
||||
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.logo { padding: 7px 0 0 0;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
a {
|
||||
display: block;
|
||||
flex: 0 0 auto;
|
||||
padding-top: 18px;
|
||||
|
||||
.two;
|
||||
.slowtrans;
|
||||
z-index: 1000;
|
||||
|
||||
color: @keylight;
|
||||
|
||||
}
|
||||
a:hover {
|
||||
.fasttrans;
|
||||
}
|
||||
|
||||
|
||||
}
|
142
public/css/rules.import.less
vendored
Normal file
142
public/css/rules.import.less
vendored
Normal file
|
@ -0,0 +1,142 @@
|
|||
.placeholder (@color) {
|
||||
input::-webkit-input-placeholder { color: @color; padding: 7px 10px 3px 10px;}
|
||||
input:-moz-placeholder { color: @color;padding: 7px 10px 3px 10px; }
|
||||
input::-moz-placeholder { color: @color;padding: 7px 10px 3px 10px; }
|
||||
input:-ms-input-placeholder { color: @color;padding: 7px 10px 3px 10px; }
|
||||
}
|
||||
.border-radius (@radius) {
|
||||
border-radius: @radius;
|
||||
-moz-border-radius: @radius;
|
||||
-webkit-border-radius: @radius;
|
||||
background-clip: padding-box;
|
||||
-moz-background-clip: padding;
|
||||
-webkit-background-clip: padding-box;
|
||||
}
|
||||
.background-linear-gradient (@color1, @color2) {
|
||||
background: linear-gradient(top, @color1, @color2);
|
||||
background: -moz-linear-gradient(@color1, @color2); //FF3.6-
|
||||
background: -webkit-linear-gradient(top, @color1, @color2); //S5.1, Chrome 10-
|
||||
background: -o-linear-gradient(top, @color1, @color2); //O 11.1
|
||||
background: -ms-linear-gradient(@color1, @color2); //IE10
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='@color1', endColorstr='@color2'); //IE6-7
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='@color1', endColorstr='@color2')"; //IE8-9
|
||||
}
|
||||
.background-linear-gradient (@color1, @color2, @color3) {
|
||||
background: linear-gradient(top, @color1, @color2, @color3);
|
||||
background: -moz-linear-gradient(@color1, @color2, @color3); //FF3.6-
|
||||
background: -webkit-linear-gradient(top, @color1, @color2, @color3); //S5.1, Chrome 10-
|
||||
background: -o-linear-gradient(top, @color1, @color2, @color3); //O 11.1
|
||||
background: -ms-linear-gradient(@color1, @color2, @color3); //IE10
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='@color1', endColorstr='@color3'); //IE6-7
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='@color1', endColorstr='@color3')"; //IE8-9
|
||||
}
|
||||
.background-gradient (@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7) {
|
||||
background-image: linear-gradient(@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7);
|
||||
background-image: -moz-linear-gradient(@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7);
|
||||
background-image: -webkit-linear-gradient(@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7);
|
||||
background-image: -o-linear-gradient(@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7);
|
||||
background-image: -ms-linear-gradient(@degrees, @color1, @color2, @color3, @color4, @color5, @color6, @color7);
|
||||
}
|
||||
.box-shadow (none) {
|
||||
box-shadow: none;
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
}
|
||||
.box-shadow (@shadow) {
|
||||
box-shadow: @shadow;
|
||||
-moz-box-shadow: @shadow;
|
||||
-webkit-box-shadow: @shadow;
|
||||
}
|
||||
.box-shadow (@shadow1, @shadow2) {
|
||||
box-shadow: @shadow1, @shadow2;
|
||||
-moz-box-shadow: @shadow1, @shadow2;
|
||||
-webkit-box-shadow: @shadow1, @shadow2;
|
||||
}
|
||||
.box-shadow (@shadow1, @shadow2, @shadow3) {
|
||||
box-shadow: @shadow1, @shadow2, @shadow3;
|
||||
-moz-box-shadow: @shadow1, @shadow2, @shadow3;
|
||||
-webkit-box-shadow: @shadow1, @shadow2, @shadow3;
|
||||
}
|
||||
|
||||
.transition (@property, @duration, @function, @delay) {
|
||||
-webkit-transition: @property @duration @function @delay;
|
||||
-moz-transition: @property @duration @function @delay;
|
||||
-o-transition: @property @duration @function @delay;
|
||||
-ms-transition: @property @duration @function @delay;
|
||||
transition: @property @duration @function @delay;
|
||||
}
|
||||
.transition (@property1, @duration1, @function1, @delay1, @property2, @duration2, @function2, @delay2) {
|
||||
-webkit-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2;
|
||||
-moz-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2;
|
||||
-o-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2;
|
||||
-ms-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2;
|
||||
transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2;
|
||||
}
|
||||
.transition (@property1, @duration1, @function1, @delay1, @property2, @duration2, @function2, @delay2, @property3, @duration3, @function3, @delay3) {
|
||||
-webkit-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3;
|
||||
-moz-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3;
|
||||
-o-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3;
|
||||
-ms-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3;
|
||||
transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3;
|
||||
}
|
||||
.transition (@property1, @duration1, @function1, @delay1, @property2, @duration2, @function2, @delay2, @property3, @duration3, @function3, @delay3, @property4, @duration4, @function4, @delay4) {
|
||||
-webkit-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3, @property4 @duration4 @function4 @delay4;
|
||||
-moz-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3, @property4 @duration4 @function4 @delay4;
|
||||
-o-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3, @property4 @duration4 @function4 @delay4;
|
||||
-ms-transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3, @property4 @duration4 @function4 @delay4;
|
||||
transition: @property1 @duration1 @function1 @delay1, @property2 @duration2 @function2 @delay2, @property3 @duration3 @function3 @delay3, @property4 @duration4 @function4 @delay4;
|
||||
}
|
||||
|
||||
.transition (inherit) {
|
||||
-webkit-transition: inherit;
|
||||
-moz-transition: inherit;
|
||||
-o-transition: inherit;
|
||||
-ms-transition: inherit;
|
||||
transition: inherit;
|
||||
}
|
||||
.fasttrans { .transition(all, 0.4s, ease, 0s); }
|
||||
.slowtrans { .transition(all, 2s, ease, 0s); }
|
||||
|
||||
|
||||
.rotate (@deg) {
|
||||
-webkit-transform: rotate(@deg);
|
||||
-moz-transform: rotate(@deg);
|
||||
-o-transform: rotate(@deg);
|
||||
-ms-transform: rotate(@deg);
|
||||
transform: rotate(@deg);
|
||||
}
|
||||
|
||||
.scale(@amount) {
|
||||
-webkit-transform: scale(@amount);
|
||||
-moz-transform: scale(@amount);
|
||||
-ms-transform: scale(@amount);
|
||||
transform: scale(@amount);
|
||||
}
|
||||
.flipX {
|
||||
-webkit-transform: scaleX(-1);
|
||||
-moz-transform: scaleX(-1);
|
||||
-ms-transform: scaleX(-1);
|
||||
-o-transform: scaleX(-1);
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
//TEXTURES
|
||||
|
||||
.polka {
|
||||
background:
|
||||
radial-gradient(@lighttransblack 15%, transparent 16%) 0 0,
|
||||
radial-gradient(@lighttransblack 15%, transparent 16%) 8px 8px,
|
||||
radial-gradient(rgba(255,255,255,.01) 15%, transparent 20%) 0 1px,
|
||||
radial-gradient(rgba(255,255,255,.01) 15%, transparent 20%) 8px 9px;
|
||||
background-size: 8px 8px;
|
||||
}
|
||||
.stripes {
|
||||
background: repeating-linear-gradient(
|
||||
45deg,
|
||||
transparent,
|
||||
transparent 10px,
|
||||
@transwhite 10px,
|
||||
@transwhite 20px
|
||||
);
|
||||
}
|
||||
|
49
public/css/tables.import.less
vendored
Normal file
49
public/css/tables.import.less
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
//TABLE
|
||||
|
||||
table {
|
||||
.unit;
|
||||
border-collapse: collapse;
|
||||
background-clip: padding-box;
|
||||
}
|
||||
td, th {
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 7px 5px;
|
||||
}
|
||||
|
||||
@color1: fadeout(#fff, 40%);
|
||||
@color2: fadeout(lighten(desaturate(@highlightblue, 20%), 40%), 45%);
|
||||
|
||||
tr:nth-child(2n+1) td {
|
||||
background: @color1;
|
||||
}
|
||||
tr:nth-child(2n) td {
|
||||
background: @color2;
|
||||
}
|
||||
|
||||
th {
|
||||
background: @lightergrey;
|
||||
color: @darkgrey;
|
||||
}
|
||||
tr:hover td:nth-child(1n) {
|
||||
background-color: @highlightyellow;
|
||||
}
|
||||
td.header {
|
||||
background: transparent !important;
|
||||
color: @darkergrey;
|
||||
text-shadow: 1px 1px 1px #fff;
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
table i {
|
||||
color: @darkergrey;
|
||||
}
|
||||
table i:hover {
|
||||
color: fadeout(@lightlightblue, 30%);
|
||||
}
|
||||
|
||||
.large { width: 80%; margin-left: 10%; }
|
||||
|
54
public/css/var.import.less
vendored
Normal file
54
public/css/var.import.less
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
//COLOR VARIABLES
|
||||
|
||||
@background: white;
|
||||
@border: @transblack;
|
||||
|
||||
//BRAND COLORS
|
||||
|
||||
@key: #2d65af; //CHANGE ME!! NOT >>
|
||||
@keylight: #38b4e7;
|
||||
@keylightest: lighten(@key, 25%);
|
||||
@keydark: darken(@key, 15%);
|
||||
@keydarker: darken(@key, 29%);
|
||||
@keydarkest: darken(@key, 36%);
|
||||
|
||||
@contrast: #ff9900;
|
||||
@contrastdark: darken(@contrast, 28%);
|
||||
@contrastlight: lighten(@contrast, 15%);
|
||||
@contrastlightest: lighten(@contrast, 23%);
|
||||
|
||||
//FUNCTION COLORS
|
||||
|
||||
@lightlightblue: lighten(@highlightblue, 14%);
|
||||
@highlightblue: #0069ff;
|
||||
@darkhighlightblue: darken(@highlightblue, 10%);
|
||||
|
||||
@orange: #FF8300;
|
||||
@highlightyellow: #fcf4b5;
|
||||
@gold: #FFEF02;
|
||||
|
||||
@red: #aa0000;
|
||||
@purple: #1100ff;
|
||||
@green: #008d00;
|
||||
@darkgreen: darken(desaturate(@green, 10%), 10%);
|
||||
|
||||
//MONO
|
||||
|
||||
@lightestgrey: #eee;
|
||||
@lightergrey: #ddd;
|
||||
@lightgrey: #ccc;
|
||||
@grey: #aaa;
|
||||
@darkgrey: #888;
|
||||
@darkergrey: #555;
|
||||
@darkestgrey: #222;
|
||||
|
||||
@lighttransblack: rgba(0,0,0,0.02);
|
||||
@transblack: rgba(0, 0, 0, 0.2);
|
||||
@lightblack: rgba(0, 0, 0, 0.5);
|
||||
@midblack: rgba(0, 0, 0, 0.8);
|
||||
@transwhite: rgba(255, 255, 255, 0.05);
|
||||
@lightwhite: rgba(255, 255, 255, 0.1);
|
||||
@midwhite: rgba(255, 255, 255, 0.6);
|
||||
|
||||
|
||||
|
BIN
public/fonts/glyphicons-halflings-regular.ttf
Normal file
BIN
public/fonts/glyphicons-halflings-regular.ttf
Normal file
Binary file not shown.
BIN
public/fonts/glyphicons-halflings-regular.woff
Normal file
BIN
public/fonts/glyphicons-halflings-regular.woff
Normal file
Binary file not shown.
BIN
public/fonts/glyphicons-halflings-regular.woff2
Normal file
BIN
public/fonts/glyphicons-halflings-regular.woff2
Normal file
Binary file not shown.
BIN
public/img/favicon.png
Normal file
BIN
public/img/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.5 KiB |
BIN
public/img/logo/Cycore_web_optimized.jpg
Normal file
BIN
public/img/logo/Cycore_web_optimized.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
112
public/scm.asc
Normal file
112
public/scm.asc
Normal file
|
@ -0,0 +1,112 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
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
|
||||
dvqfj+9x
|
||||
=isk0
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
21
tests/apptest.go
Normal file
21
tests/apptest.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package tests
|
||||
|
||||
import "github.com/revel/revel/testing"
|
||||
|
||||
type AppTest struct {
|
||||
testing.TestSuite
|
||||
}
|
||||
|
||||
func (t *AppTest) Before() {
|
||||
println("Set up")
|
||||
}
|
||||
|
||||
func (t *AppTest) TestThatIndexPageWorks() {
|
||||
t.Get("/")
|
||||
t.AssertOk()
|
||||
t.AssertContentType("text/html; charset=utf-8")
|
||||
}
|
||||
|
||||
func (t *AppTest) After() {
|
||||
println("Tear down")
|
||||
}
|
Loading…
Reference in a new issue