Compare commits
142 Commits
Author | SHA1 | Date | |
---|---|---|---|
c8f6f9a6f3 | |||
dc0daa2b3e | |||
716dc77922 | |||
8494a9d880 | |||
6d051dc151 | |||
e79e363645 | |||
b5df13b5ef | |||
5f2439f42a | |||
f61bb5cc90 | |||
1f0d0a8124 | |||
6c384b2d7b | |||
269451dbfa | |||
0ea7d41b6f | |||
9d5db776e9 | |||
ba578aa795 | |||
5fb2c2379e | |||
742244c92b | |||
|
cad408e215 | ||
|
817daf00f1 | ||
|
8c31d75c7a | ||
|
67e57353ca | ||
|
4e17ec5de9 | ||
|
122303b82d | ||
2a5bc95d16 | |||
7192f7fafe | |||
92b031392a | |||
b11be7df2d | |||
a1baa33102 | |||
e636d70c51 | |||
fa294bef0f | |||
ade8f61aa0 | |||
|
38b6147794 | ||
1756f0d6b1 | |||
6f6960f8b8 | |||
6da4a70a1a | |||
37156c79ad | |||
950903c938 | |||
57d4f12f7f | |||
f3eb441c61 | |||
a6836c8516 | |||
9284e107d7 | |||
38e739c5c4 | |||
6d3d0420dd | |||
9e87eddcb6 | |||
3896c13136 | |||
95714e4b40 | |||
2b5af660af | |||
7975a2072e | |||
5e93f982f8 | |||
eb81d46238 | |||
4024eed50f | |||
4066712014 | |||
d3a6ab658a | |||
bf884732c1 | |||
781b185349 | |||
f530b7605b | |||
072655ac51 | |||
218e76a2a8 | |||
c15a0ea948 | |||
43bf8e8e96 | |||
846c02020b | |||
d657282a33 | |||
bafc75086a | |||
d74c8be135 | |||
9fd4620947 | |||
4966bfc9b3 | |||
0a28331e05 | |||
600a9b5529 | |||
285057fbb0 | |||
23a736a012 | |||
a907c57134 | |||
e9f71cdab9 | |||
4484bbfac7 | |||
cfc7fa5161 | |||
3f27061e25 | |||
e02d218d1a | |||
fa9c042c75 | |||
3a25c37a47 | |||
895ca5f76a | |||
2324e9d81b | |||
2990e2f28f | |||
892fa009e7 | |||
696ca38efe | |||
a5121b8637 | |||
84848f611e | |||
ddc0f58b34 | |||
679d993b6d | |||
8a1deab1f7 | |||
9495fdb96e | |||
4f85177c0a | |||
5e1625d98c | |||
0f223da648 | |||
ba883b5b11 | |||
8bc8f5348d | |||
72c3dc87df | |||
6e8a6c46c2 | |||
|
4d127f500d | ||
|
d4704211db | ||
|
93a0a7534a | ||
|
a9d77bd4c7 | ||
def1ef13ff | |||
6bcf7d6092 | |||
72bd67797c | |||
1c3fb97826 | |||
d06cc8d359 | |||
7826311893 | |||
c75cbe7217 | |||
56822a3644 | |||
a85322231e | |||
21f2d82289 | |||
7563693259 | |||
54803df50d | |||
7e0ce0254c | |||
99eab81cb3 | |||
73949a23cb | |||
2be1e9c275 | |||
98ad36d777 | |||
2ed8586cb1 | |||
e8b9a35a61 | |||
060583a418 | |||
62380ddc65 | |||
|
d09dcf4439 | ||
|
2cc9c3296e | ||
|
9b7a5d7e27 | ||
|
fed8e765c6 | ||
|
30157c4b18 | ||
|
8dbbfafacc | ||
|
3fa69b7594 | ||
18ba3587e3 | |||
ccc68b614f | |||
b92f880ce4 | |||
2d98770984 | |||
d88036c1bb | |||
120989a333 | |||
|
3597298bdb | ||
|
c638ffe1bd | ||
|
cc27baf248 | ||
|
54729d259b | ||
|
95889ef87f | ||
fd5b4f0b23 | |||
bfd865727b | |||
d4236a65b8 |
43
.gitignore
vendored
@ -1,39 +1,10 @@
|
|||||||
.gradle
|
.gradle/
|
||||||
build/
|
build/
|
||||||
|
.idea/
|
||||||
|
/logs/
|
||||||
|
|
||||||
!gradle/wrapper/gradle-wrapper.jar
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
!**/src/main/**/build/
|
/deploy.ps1
|
||||||
!**/src/test/**/build/
|
|
||||||
|
|
||||||
### STS ###
|
.sass-cache
|
||||||
.apt_generated
|
*.css.map
|
||||||
.classpath
|
|
||||||
.factorypath
|
|
||||||
.project
|
|
||||||
.settings
|
|
||||||
.springBeans
|
|
||||||
.sts4-cache
|
|
||||||
bin/
|
|
||||||
!**/src/main/**/bin/
|
|
||||||
!**/src/test/**/bin/
|
|
||||||
|
|
||||||
### IntelliJ IDEA ###
|
|
||||||
.idea
|
|
||||||
*.iws
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
out/
|
|
||||||
!**/src/main/**/out/
|
|
||||||
!**/src/test/**/out/
|
|
||||||
|
|
||||||
### NetBeans ###
|
|
||||||
/nbproject/private/
|
|
||||||
/nbbuild/
|
|
||||||
/dist/
|
|
||||||
/nbdist/
|
|
||||||
/.nb-gradle/
|
|
||||||
|
|
||||||
### VS Code ###
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
|
|
||||||
/logs/
|
|
||||||
|
36
.space.kts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
job("Deploy") {
|
||||||
|
startOn {
|
||||||
|
gitPush { enabled = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
container(image = "gradle:jdk17-alpine") {
|
||||||
|
env["SPC_HOST"] = Params("spc-host")
|
||||||
|
env["SPC_USER"] = Secrets("spc-webmaster-user")
|
||||||
|
env["SPC_ID"] = Secrets("spc-webmaster-id")
|
||||||
|
kotlinScript { api ->
|
||||||
|
api.space().projects.automation.deployments.start(
|
||||||
|
project = api.projectIdentifier(),
|
||||||
|
targetIdentifier = TargetIdentifier.Key("spc-site"),
|
||||||
|
version = "current",
|
||||||
|
// automatically update deployment status based on a status of a job
|
||||||
|
syncWithAutomationJob = true
|
||||||
|
)
|
||||||
|
api.gradle("uploadDistribution")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
job("Restart service"){
|
||||||
|
startOn {
|
||||||
|
gitPush { enabled = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
container(image = "gradle:jdk17-alpine") {
|
||||||
|
env["SPC_HOST"] = Params("spc-host")
|
||||||
|
env["SPC_USER"] = Secrets("spc-webmaster-user")
|
||||||
|
env["SPC_ID"] = Secrets("spc-webmaster-id")
|
||||||
|
kotlinScript { api ->
|
||||||
|
api.gradle("reloadDistribution")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
22
README.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Scientific programming center site
|
||||||
|
|
||||||
|
The site is [here](https://sciprog.center/)
|
||||||
|
|
||||||
|
## The mechanics
|
||||||
|
|
||||||
|
The site is a unique mix between static and dynamic content rendering.
|
||||||
|
It uses [DataForge](https://github.com/mipt-npm/dataforge-core) and a prototype for SNARK project to load data lazily and
|
||||||
|
render it with very low resource consumption.
|
||||||
|
|
||||||
|
The idea is the following:
|
||||||
|
* The file tree from [data](/data) directory is lazily loaded into a DataForge `DataSet`structure. Each element in a `DataSet` is a lazy data with eagerly loaded metadata. In case of files, metadata includes some file parameters like extensions and creation time a front matter YAML translated into DF `Meta`.
|
||||||
|
* The `DataSet` is transformed using parsers defined in `SnarkPlugin`. Parser transforms the bytearray-like file content into some typed object like Markdown or Html. Json/yaml files are transformed into `Meta`. All objects are lazy, they are not parsed and computed until they are read.
|
||||||
|
* There could be additional transformation for tree. For example severl blocks could be combined into one. Data could be loaded inside the page, etc.
|
||||||
|
* The resulting `DataSet` is loaded into a `PageContext`, which is used by a site template to render resulting pages.
|
||||||
|
* In the future, there will be utilities to automatically transform into a `DataSet`, loading templates as plugins.
|
||||||
|
* Once computed, the data is cached in-memory and is not recomputed until the underlying data is changed.
|
||||||
|
* A `PageContex` is loaded as a context receiver for all page rendering activities. It allows to seamlessly load data into the page, also it could be substituted on language change or other configuration changes. Also one could use `PageContext` to isolate different parts of site from each other.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
Currently, we use two different designs from https://html5up.net/
|
@ -1,58 +1,99 @@
|
|||||||
import ru.mipt.npm.gradle.KScienceVersions
|
import space.kscience.gradle.KScienceVersions
|
||||||
|
import space.kscience.snark.plugin.JSch
|
||||||
|
import space.kscience.snark.plugin.execute
|
||||||
|
import space.kscience.snark.plugin.uploadDirectory
|
||||||
|
import space.kscience.snark.plugin.useSession
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("ru.mipt.npm.gradle.project")
|
id("space.kscience.gradle.project")
|
||||||
id("ru.mipt.npm.gradle.jvm")
|
id("space.kscience.gradle.jvm")
|
||||||
|
id("space.kscience.snark")
|
||||||
application
|
application
|
||||||
}
|
}
|
||||||
|
|
||||||
//repositories{
|
group = "center.sciprog"
|
||||||
// mavenLocal()
|
version = "0.1.0"
|
||||||
//}
|
|
||||||
|
|
||||||
group = "ru.mipt.npm"
|
|
||||||
version = "0.0.1-SNAPSHOT"
|
|
||||||
|
|
||||||
application {
|
application {
|
||||||
mainClass.set("ru.mipt.spc.ApplicationKt")
|
mainClass.set("io.ktor.server.netty.EngineMain")
|
||||||
|
|
||||||
val isDevelopment: Boolean = project.ext.has("development")
|
val isDevelopment: Boolean = project.ext.has("development")
|
||||||
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment", "-Xmx200M")
|
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment", "-Xmx200M")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val snarkVersion: String by extra
|
||||||
val dataforgeVersion by extra("0.6.0-dev-6")
|
|
||||||
val ktorVersion = KScienceVersions.ktorVersion
|
val ktorVersion = KScienceVersions.ktorVersion
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
mavenLocal()
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("io.ktor:ktor-server-core:$ktorVersion")
|
implementation("space.kscience:snark-ktor:$snarkVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-html:0.7.5")
|
|
||||||
implementation("io.ktor:ktor-server-html-builder:$ktorVersion")
|
|
||||||
implementation("org.jetbrains.kotlin-wrappers:kotlin-css")
|
|
||||||
implementation("io.ktor:ktor-server-host-common:$ktorVersion")
|
|
||||||
implementation("io.ktor:ktor-server-status-pages:$ktorVersion")
|
|
||||||
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
||||||
|
implementation("io.ktor:ktor-server-http-redirect:$ktorVersion")
|
||||||
|
implementation("io.ktor:ktor-server-forwarded-header:$ktorVersion")
|
||||||
implementation("ch.qos.logback:logback-classic:1.2.11")
|
implementation("ch.qos.logback:logback-classic:1.2.11")
|
||||||
implementation("space.kscience:dataforge-workspace:$dataforgeVersion")
|
|
||||||
implementation("space.kscience:dataforge-io-yaml:$dataforgeVersion")
|
|
||||||
implementation("org.jetbrains:markdown:0.3.1")
|
|
||||||
|
|
||||||
testImplementation("io.ktor:ktor-server-tests:$ktorVersion")
|
testImplementation("io.ktor:ktor-server-tests:$ktorVersion")
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled
|
explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled
|
||||||
sourceSets.all {
|
}
|
||||||
languageSettings {
|
|
||||||
languageVersion = "1.7"
|
apiValidation{
|
||||||
apiVersion = "1.7"
|
validationDisabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Upload with JSch */
|
||||||
|
|
||||||
|
val host = System.getenv("SPC_HOST")
|
||||||
|
val user = System.getenv("SPC_USER")
|
||||||
|
//val password = System.getenv("SPC_PASSWORD")
|
||||||
|
val identityString = System.getenv("SPC_ID")
|
||||||
|
val serviceName = "sciprog-site"
|
||||||
|
|
||||||
|
if (host != null && user != null || identityString != null) {
|
||||||
|
val uploadDistribution by tasks.creating {
|
||||||
|
group = "distribution"
|
||||||
|
dependsOn("installDist")
|
||||||
|
doLast {
|
||||||
|
JSch {
|
||||||
|
addIdentity("spc-webmaster", identityString.encodeToByteArray(), null, null)
|
||||||
|
}.useSession(host, user) {
|
||||||
|
//stopping service during the upload
|
||||||
|
execute("sudo systemctl stop $serviceName")
|
||||||
|
uploadDirectory(buildDir.resolve("install/spc-site"), "/opt")
|
||||||
|
//adding executable flag to the entry point
|
||||||
|
execute("sudo chmod +x /opt/spc-site/bin/spc-site")
|
||||||
|
execute("sudo systemctl start $serviceName")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val reloadDistribution by tasks.creating {
|
||||||
|
group = "distribution"
|
||||||
|
doLast {
|
||||||
|
JSch {
|
||||||
|
addIdentity("spc-webmaster", identityString.encodeToByteArray(), null, null)
|
||||||
|
}.useSession(host, user) {
|
||||||
|
execute("sudo systemctl restart $serviceName")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
logger.error("Host, user or ID are not defined. Skipping deployment tasks.")
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
val staticSite by tasks.creating(JavaExec::class){
|
||||||
main {
|
doFirst {
|
||||||
resources.srcDir(project.rootDir.resolve("data"))
|
buildDir.resolve("public").deleteRecursively()
|
||||||
}
|
}
|
||||||
|
group = "application"
|
||||||
|
mainClass.set("center.sciprog.StaticRenderKt")
|
||||||
|
classpath = sourceSets["main"].runtimeClasspath
|
||||||
}
|
}
|
101
data/bmk/assets/css/fontawesome-all.min.css
vendored
Normal file
BIN
data/bmk/assets/css/images/overlay.png
Normal file
After Width: | Height: | Size: 20 KiB |
3785
data/bmk/assets/css/main.css
Normal file
18
data/bmk/assets/css/noscript.css
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Stellar by HTML5 UP
|
||||||
|
html5up.net | @ajlkn
|
||||||
|
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
|
||||||
|
body.is-preload #header.alt > * {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.is-preload #header.alt .logo {
|
||||||
|
-moz-transform: none;
|
||||||
|
-webkit-transform: none;
|
||||||
|
-ms-transform: none;
|
||||||
|
transform: none;
|
||||||
|
}
|
2
data/bmk/assets/js/breakpoints.min.js
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* breakpoints.js v1.0 | @ajlkn | MIT licensed */
|
||||||
|
var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e<t.events.length;e++)n=t.events[e],t.active(n.query)?n.state||(n.state=!0,n.handler()):n.state&&(n.state=!1)}};return e._=t,e.on=function(e,n){t.on(e,n)},e.active=function(e){return t.active(e)},e}();!function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():e.breakpoints=t()}(this,function(){return breakpoints});
|
2
data/bmk/assets/js/browser.min.js
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* browser.js v1.0.1 | @ajlkn | MIT licensed */
|
||||||
|
var browser=function(){"use strict";var t={name:null,version:null,os:null,osVersion:null,touch:null,mobile:null,_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,r=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+r in n||"Webkit"+r in n||"O"+r in n||"ms"+r in n},init:function(){for(var e=navigator.userAgent,n="other",r=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],o=0;o<i.length;o++)if(e.match(i[o][1])){n=i[o][0],r=parseFloat(RegExp.$1);break}for(t.name=n,t.version=r,n="other",i=[["ios",/([0-9_]+) like Mac OS X/,function(e){return e.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(e){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(e){return e.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null],["linux",/Linux/,null],["bsd",/BSD/,null],["unix",/X11/,null]],o=r=0;o<i.length;o++)if(e.match(i[o][1])){n=i[o][0],r=parseFloat(i[o][2]?i[o][2](RegExp.$1):RegExp.$1);break}"mac"==n&&"ontouchstart"in window&&(1024==screen.width&&1366==screen.height||834==screen.width&&1112==screen.height||810==screen.width&&1080==screen.height||768==screen.width&&1024==screen.height)&&(n="ios"),t.os=n,t.osVersion=r,t.touch="wp"==t.os?0<navigator.msMaxTouchPoints:!!("ontouchstart"in window),t.mobile="wp"==t.os||"android"==t.os||"ios"==t.os||"bb"==t.os}};return t.init(),t}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser});
|
2
data/bmk/assets/js/jquery.min.js
vendored
Normal file
2
data/bmk/assets/js/jquery.scrollex.min.js
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */
|
||||||
|
!function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r<this.length;r++)t(this[r]).scrollex(l);return s}if(s.data("_scrollexId"))return s;var a,u,h,c,p;switch(a=i++,u=jQuery.extend({top:0,bottom:0,delay:0,mode:"default",enter:null,leave:null,initialize:null,terminate:null,scroll:null},l),u.mode){case"top":h=function(t,e,n,i,o){return t>=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n<this.length;n++)t(this[n]).unscrollex();return e}var i,l;return(i=e.data("_scrollexId"))?(l=o[i],window.clearTimeout(l.timeoutId),delete o[i],e.removeData("_scrollexId"),l.options.terminate&&l.options.terminate.apply(this),e):e}}(jQuery);
|
2
data/bmk/assets/js/jquery.scrolly.min.js
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* jquery.scrolly v1.0.0-dev | (c) @ajlkn | MIT licensed */
|
||||||
|
(function(e){function u(s,o){var u,a,f;if((u=e(s))[t]==0)return n;a=u[i]()[r];switch(o.anchor){case"middle":f=a-(e(window).height()-u.outerHeight())/2;break;default:case r:f=Math.max(a,0)}return typeof o[i]=="function"?f-=o[i]():f-=o[i],f}var t="length",n=null,r="top",i="offset",s="click.scrolly",o=e(window);e.fn.scrolly=function(i){var o,a,f,l,c=e(this);if(this[t]==0)return c;if(this[t]>1){for(o=0;o<this[t];o++)e(this[o]).scrolly(i);return c}l=n,f=c.attr("href");if(f.charAt(0)!="#"||f[t]<2)return c;a=jQuery.extend({anchor:r,easing:"swing",offset:0,parent:e("body,html"),pollOnce:!1,speed:1e3},i),a.pollOnce&&(l=u(f,a)),c.off(s).on(s,function(e){var t=l!==n?l:u(f,a);t!==n&&(e.preventDefault(),a.parent.stop().animate({scrollTop:t},a.speed,a.easing))})}})(jQuery);
|
123
data/bmk/assets/js/main.js
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
Stellar by HTML5 UP
|
||||||
|
html5up.net | @ajlkn
|
||||||
|
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
var $window = $(window),
|
||||||
|
$body = $('body'),
|
||||||
|
$main = $('#main');
|
||||||
|
|
||||||
|
// Breakpoints.
|
||||||
|
breakpoints({
|
||||||
|
xlarge: [ '1281px', '1680px' ],
|
||||||
|
large: [ '981px', '1280px' ],
|
||||||
|
medium: [ '737px', '980px' ],
|
||||||
|
small: [ '481px', '736px' ],
|
||||||
|
xsmall: [ '361px', '480px' ],
|
||||||
|
xxsmall: [ null, '360px' ]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Play initial animations on page load.
|
||||||
|
$window.on('load', function() {
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$body.removeClass('is-preload');
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Nav.
|
||||||
|
var $nav = $('#nav');
|
||||||
|
|
||||||
|
if ($nav.length > 0) {
|
||||||
|
|
||||||
|
// Shrink effect.
|
||||||
|
$main
|
||||||
|
.scrollex({
|
||||||
|
mode: 'top',
|
||||||
|
enter: function() {
|
||||||
|
$nav.addClass('alt');
|
||||||
|
},
|
||||||
|
leave: function() {
|
||||||
|
$nav.removeClass('alt');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Links.
|
||||||
|
var $nav_a = $nav.find('a');
|
||||||
|
|
||||||
|
$nav_a
|
||||||
|
.scrolly({
|
||||||
|
speed: 1000,
|
||||||
|
offset: function() { return $nav.height(); }
|
||||||
|
})
|
||||||
|
.on('click', function() {
|
||||||
|
|
||||||
|
var $this = $(this);
|
||||||
|
|
||||||
|
// External link? Bail.
|
||||||
|
if ($this.attr('href').charAt(0) != '#')
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Deactivate all links.
|
||||||
|
$nav_a
|
||||||
|
.removeClass('active')
|
||||||
|
.removeClass('active-locked');
|
||||||
|
|
||||||
|
// Activate link *and* lock it (so Scrollex doesn't try to activate other links as we're scrolling to this one's section).
|
||||||
|
$this
|
||||||
|
.addClass('active')
|
||||||
|
.addClass('active-locked');
|
||||||
|
|
||||||
|
})
|
||||||
|
.each(function() {
|
||||||
|
|
||||||
|
var $this = $(this),
|
||||||
|
id = $this.attr('href'),
|
||||||
|
$section = $(id);
|
||||||
|
|
||||||
|
// No section for this link? Bail.
|
||||||
|
if ($section.length < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Scrollex.
|
||||||
|
$section.scrollex({
|
||||||
|
mode: 'middle',
|
||||||
|
initialize: function() {
|
||||||
|
|
||||||
|
// Deactivate section.
|
||||||
|
if (browser.canUse('transition'))
|
||||||
|
$section.addClass('inactive');
|
||||||
|
|
||||||
|
},
|
||||||
|
enter: function() {
|
||||||
|
|
||||||
|
// Activate section.
|
||||||
|
$section.removeClass('inactive');
|
||||||
|
|
||||||
|
// No locked links? Deactivate all links and activate this section's one.
|
||||||
|
if ($nav_a.filter('.active-locked').length == 0) {
|
||||||
|
|
||||||
|
$nav_a.removeClass('active');
|
||||||
|
$this.addClass('active');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, if this section's link is the one that's locked, unlock it.
|
||||||
|
else if ($this.hasClass('active-locked'))
|
||||||
|
$this.removeClass('active-locked');
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scrolly.
|
||||||
|
$('.scrolly').scrolly({
|
||||||
|
speed: 1000
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
587
data/bmk/assets/js/util.js
Normal file
@ -0,0 +1,587 @@
|
|||||||
|
(function($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate an indented list of links from a nav. Meant for use with panel().
|
||||||
|
* @return {jQuery} jQuery object.
|
||||||
|
*/
|
||||||
|
$.fn.navList = function() {
|
||||||
|
|
||||||
|
var $this = $(this);
|
||||||
|
$a = $this.find('a'),
|
||||||
|
b = [];
|
||||||
|
|
||||||
|
$a.each(function() {
|
||||||
|
|
||||||
|
var $this = $(this),
|
||||||
|
indent = Math.max(0, $this.parents('li').length - 1),
|
||||||
|
href = $this.attr('href'),
|
||||||
|
target = $this.attr('target');
|
||||||
|
|
||||||
|
b.push(
|
||||||
|
'<a ' +
|
||||||
|
'class="link depth-' + indent + '"' +
|
||||||
|
( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
|
||||||
|
( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
|
||||||
|
'>' +
|
||||||
|
'<span class="indent-' + indent + '"></span>' +
|
||||||
|
$this.text() +
|
||||||
|
'</a>'
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return b.join('');
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Panel-ify an element.
|
||||||
|
* @param {object} userConfig User config.
|
||||||
|
* @return {jQuery} jQuery object.
|
||||||
|
*/
|
||||||
|
$.fn.panel = function(userConfig) {
|
||||||
|
|
||||||
|
// No elements?
|
||||||
|
if (this.length == 0)
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
// Multiple elements?
|
||||||
|
if (this.length > 1) {
|
||||||
|
|
||||||
|
for (var i=0; i < this.length; i++)
|
||||||
|
$(this[i]).panel(userConfig);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vars.
|
||||||
|
var $this = $(this),
|
||||||
|
$body = $('body'),
|
||||||
|
$window = $(window),
|
||||||
|
id = $this.attr('id'),
|
||||||
|
config;
|
||||||
|
|
||||||
|
// Config.
|
||||||
|
config = $.extend({
|
||||||
|
|
||||||
|
// Delay.
|
||||||
|
delay: 0,
|
||||||
|
|
||||||
|
// Hide panel on link click.
|
||||||
|
hideOnClick: false,
|
||||||
|
|
||||||
|
// Hide panel on escape keypress.
|
||||||
|
hideOnEscape: false,
|
||||||
|
|
||||||
|
// Hide panel on swipe.
|
||||||
|
hideOnSwipe: false,
|
||||||
|
|
||||||
|
// Reset scroll position on hide.
|
||||||
|
resetScroll: false,
|
||||||
|
|
||||||
|
// Reset forms on hide.
|
||||||
|
resetForms: false,
|
||||||
|
|
||||||
|
// Side of viewport the panel will appear.
|
||||||
|
side: null,
|
||||||
|
|
||||||
|
// Target element for "class".
|
||||||
|
target: $this,
|
||||||
|
|
||||||
|
// Class to toggle.
|
||||||
|
visibleClass: 'visible'
|
||||||
|
|
||||||
|
}, userConfig);
|
||||||
|
|
||||||
|
// Expand "target" if it's not a jQuery object already.
|
||||||
|
if (typeof config.target != 'jQuery')
|
||||||
|
config.target = $(config.target);
|
||||||
|
|
||||||
|
// Panel.
|
||||||
|
|
||||||
|
// Methods.
|
||||||
|
$this._hide = function(event) {
|
||||||
|
|
||||||
|
// Already hidden? Bail.
|
||||||
|
if (!config.target.hasClass(config.visibleClass))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If an event was provided, cancel it.
|
||||||
|
if (event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide.
|
||||||
|
config.target.removeClass(config.visibleClass);
|
||||||
|
|
||||||
|
// Post-hide stuff.
|
||||||
|
window.setTimeout(function() {
|
||||||
|
|
||||||
|
// Reset scroll position.
|
||||||
|
if (config.resetScroll)
|
||||||
|
$this.scrollTop(0);
|
||||||
|
|
||||||
|
// Reset forms.
|
||||||
|
if (config.resetForms)
|
||||||
|
$this.find('form').each(function() {
|
||||||
|
this.reset();
|
||||||
|
});
|
||||||
|
|
||||||
|
}, config.delay);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Vendor fixes.
|
||||||
|
$this
|
||||||
|
.css('-ms-overflow-style', '-ms-autohiding-scrollbar')
|
||||||
|
.css('-webkit-overflow-scrolling', 'touch');
|
||||||
|
|
||||||
|
// Hide on click.
|
||||||
|
if (config.hideOnClick) {
|
||||||
|
|
||||||
|
$this.find('a')
|
||||||
|
.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
|
||||||
|
|
||||||
|
$this
|
||||||
|
.on('click', 'a', function(event) {
|
||||||
|
|
||||||
|
var $a = $(this),
|
||||||
|
href = $a.attr('href'),
|
||||||
|
target = $a.attr('target');
|
||||||
|
|
||||||
|
if (!href || href == '#' || href == '' || href == '#' + id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Cancel original event.
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
// Hide panel.
|
||||||
|
$this._hide();
|
||||||
|
|
||||||
|
// Redirect to href.
|
||||||
|
window.setTimeout(function() {
|
||||||
|
|
||||||
|
if (target == '_blank')
|
||||||
|
window.open(href);
|
||||||
|
else
|
||||||
|
window.location.href = href;
|
||||||
|
|
||||||
|
}, config.delay + 10);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Event: Touch stuff.
|
||||||
|
$this.on('touchstart', function(event) {
|
||||||
|
|
||||||
|
$this.touchPosX = event.originalEvent.touches[0].pageX;
|
||||||
|
$this.touchPosY = event.originalEvent.touches[0].pageY;
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
$this.on('touchmove', function(event) {
|
||||||
|
|
||||||
|
if ($this.touchPosX === null
|
||||||
|
|| $this.touchPosY === null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX,
|
||||||
|
diffY = $this.touchPosY - event.originalEvent.touches[0].pageY,
|
||||||
|
th = $this.outerHeight(),
|
||||||
|
ts = ($this.get(0).scrollHeight - $this.scrollTop());
|
||||||
|
|
||||||
|
// Hide on swipe?
|
||||||
|
if (config.hideOnSwipe) {
|
||||||
|
|
||||||
|
var result = false,
|
||||||
|
boundary = 20,
|
||||||
|
delta = 50;
|
||||||
|
|
||||||
|
switch (config.side) {
|
||||||
|
|
||||||
|
case 'left':
|
||||||
|
result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'right':
|
||||||
|
result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'top':
|
||||||
|
result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'bottom':
|
||||||
|
result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
|
||||||
|
$this.touchPosX = null;
|
||||||
|
$this.touchPosY = null;
|
||||||
|
$this._hide();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent vertical scrolling past the top or bottom.
|
||||||
|
if (($this.scrollTop() < 0 && diffY < 0)
|
||||||
|
|| (ts > (th - 2) && ts < (th + 2) && diffY > 0)) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event: Prevent certain events inside the panel from bubbling.
|
||||||
|
$this.on('click touchend touchstart touchmove', function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event: Hide panel if a child anchor tag pointing to its ID is clicked.
|
||||||
|
$this.on('click', 'a[href="#' + id + '"]', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
config.target.removeClass(config.visibleClass);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Body.
|
||||||
|
|
||||||
|
// Event: Hide panel on body click/tap.
|
||||||
|
$body.on('click touchend', function(event) {
|
||||||
|
$this._hide(event);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event: Toggle.
|
||||||
|
$body.on('click', 'a[href="#' + id + '"]', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
config.target.toggleClass(config.visibleClass);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Window.
|
||||||
|
|
||||||
|
// Event: Hide on ESC.
|
||||||
|
if (config.hideOnEscape)
|
||||||
|
$window.on('keydown', function(event) {
|
||||||
|
|
||||||
|
if (event.keyCode == 27)
|
||||||
|
$this._hide(event);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply "placeholder" attribute polyfill to one or more forms.
|
||||||
|
* @return {jQuery} jQuery object.
|
||||||
|
*/
|
||||||
|
$.fn.placeholder = function() {
|
||||||
|
|
||||||
|
// Browser natively supports placeholders? Bail.
|
||||||
|
if (typeof (document.createElement('input')).placeholder != 'undefined')
|
||||||
|
return $(this);
|
||||||
|
|
||||||
|
// No elements?
|
||||||
|
if (this.length == 0)
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
// Multiple elements?
|
||||||
|
if (this.length > 1) {
|
||||||
|
|
||||||
|
for (var i=0; i < this.length; i++)
|
||||||
|
$(this[i]).placeholder();
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vars.
|
||||||
|
var $this = $(this);
|
||||||
|
|
||||||
|
// Text, TextArea.
|
||||||
|
$this.find('input[type=text],textarea')
|
||||||
|
.each(function() {
|
||||||
|
|
||||||
|
var i = $(this);
|
||||||
|
|
||||||
|
if (i.val() == ''
|
||||||
|
|| i.val() == i.attr('placeholder'))
|
||||||
|
i
|
||||||
|
.addClass('polyfill-placeholder')
|
||||||
|
.val(i.attr('placeholder'));
|
||||||
|
|
||||||
|
})
|
||||||
|
.on('blur', function() {
|
||||||
|
|
||||||
|
var i = $(this);
|
||||||
|
|
||||||
|
if (i.attr('name').match(/-polyfill-field$/))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (i.val() == '')
|
||||||
|
i
|
||||||
|
.addClass('polyfill-placeholder')
|
||||||
|
.val(i.attr('placeholder'));
|
||||||
|
|
||||||
|
})
|
||||||
|
.on('focus', function() {
|
||||||
|
|
||||||
|
var i = $(this);
|
||||||
|
|
||||||
|
if (i.attr('name').match(/-polyfill-field$/))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (i.val() == i.attr('placeholder'))
|
||||||
|
i
|
||||||
|
.removeClass('polyfill-placeholder')
|
||||||
|
.val('');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Password.
|
||||||
|
$this.find('input[type=password]')
|
||||||
|
.each(function() {
|
||||||
|
|
||||||
|
var i = $(this);
|
||||||
|
var x = $(
|
||||||
|
$('<div>')
|
||||||
|
.append(i.clone())
|
||||||
|
.remove()
|
||||||
|
.html()
|
||||||
|
.replace(/type="password"/i, 'type="text"')
|
||||||
|
.replace(/type=password/i, 'type=text')
|
||||||
|
);
|
||||||
|
|
||||||
|
if (i.attr('id') != '')
|
||||||
|
x.attr('id', i.attr('id') + '-polyfill-field');
|
||||||
|
|
||||||
|
if (i.attr('name') != '')
|
||||||
|
x.attr('name', i.attr('name') + '-polyfill-field');
|
||||||
|
|
||||||
|
x.addClass('polyfill-placeholder')
|
||||||
|
.val(x.attr('placeholder')).insertAfter(i);
|
||||||
|
|
||||||
|
if (i.val() == '')
|
||||||
|
i.hide();
|
||||||
|
else
|
||||||
|
x.hide();
|
||||||
|
|
||||||
|
i
|
||||||
|
.on('blur', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
|
||||||
|
|
||||||
|
if (i.val() == '') {
|
||||||
|
|
||||||
|
i.hide();
|
||||||
|
x.show();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
x
|
||||||
|
.on('focus', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']');
|
||||||
|
|
||||||
|
x.hide();
|
||||||
|
|
||||||
|
i
|
||||||
|
.show()
|
||||||
|
.focus();
|
||||||
|
|
||||||
|
})
|
||||||
|
.on('keypress', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
x.val('');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Events.
|
||||||
|
$this
|
||||||
|
.on('submit', function() {
|
||||||
|
|
||||||
|
$this.find('input[type=text],input[type=password],textarea')
|
||||||
|
.each(function(event) {
|
||||||
|
|
||||||
|
var i = $(this);
|
||||||
|
|
||||||
|
if (i.attr('name').match(/-polyfill-field$/))
|
||||||
|
i.attr('name', '');
|
||||||
|
|
||||||
|
if (i.val() == i.attr('placeholder')) {
|
||||||
|
|
||||||
|
i.removeClass('polyfill-placeholder');
|
||||||
|
i.val('');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
.on('reset', function(event) {
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
$this.find('select')
|
||||||
|
.val($('option:first').val());
|
||||||
|
|
||||||
|
$this.find('input,textarea')
|
||||||
|
.each(function() {
|
||||||
|
|
||||||
|
var i = $(this),
|
||||||
|
x;
|
||||||
|
|
||||||
|
i.removeClass('polyfill-placeholder');
|
||||||
|
|
||||||
|
switch (this.type) {
|
||||||
|
|
||||||
|
case 'submit':
|
||||||
|
case 'reset':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'password':
|
||||||
|
i.val(i.attr('defaultValue'));
|
||||||
|
|
||||||
|
x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
|
||||||
|
|
||||||
|
if (i.val() == '') {
|
||||||
|
i.hide();
|
||||||
|
x.show();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
i.show();
|
||||||
|
x.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'checkbox':
|
||||||
|
case 'radio':
|
||||||
|
i.attr('checked', i.attr('defaultValue'));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'text':
|
||||||
|
case 'textarea':
|
||||||
|
i.val(i.attr('defaultValue'));
|
||||||
|
|
||||||
|
if (i.val() == '') {
|
||||||
|
i.addClass('polyfill-placeholder');
|
||||||
|
i.val(i.attr('placeholder'));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
i.val(i.attr('defaultValue'));
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves elements to/from the first positions of their respective parents.
|
||||||
|
* @param {jQuery} $elements Elements (or selector) to move.
|
||||||
|
* @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations.
|
||||||
|
*/
|
||||||
|
$.prioritize = function($elements, condition) {
|
||||||
|
|
||||||
|
var key = '__prioritize';
|
||||||
|
|
||||||
|
// Expand $elements if it's not already a jQuery object.
|
||||||
|
if (typeof $elements != 'jQuery')
|
||||||
|
$elements = $($elements);
|
||||||
|
|
||||||
|
// Step through elements.
|
||||||
|
$elements.each(function() {
|
||||||
|
|
||||||
|
var $e = $(this), $p,
|
||||||
|
$parent = $e.parent();
|
||||||
|
|
||||||
|
// No parent? Bail.
|
||||||
|
if ($parent.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Not moved? Move it.
|
||||||
|
if (!$e.data(key)) {
|
||||||
|
|
||||||
|
// Condition is false? Bail.
|
||||||
|
if (!condition)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get placeholder (which will serve as our point of reference for when this element needs to move back).
|
||||||
|
$p = $e.prev();
|
||||||
|
|
||||||
|
// Couldn't find anything? Means this element's already at the top, so bail.
|
||||||
|
if ($p.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Move element to top of parent.
|
||||||
|
$e.prependTo($parent);
|
||||||
|
|
||||||
|
// Mark element as moved.
|
||||||
|
$e.data(key, $p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moved already?
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Condition is true? Bail.
|
||||||
|
if (condition)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$p = $e.data(key);
|
||||||
|
|
||||||
|
// Move element back to its original location (using our placeholder).
|
||||||
|
$e.insertAfter($p);
|
||||||
|
|
||||||
|
// Unmark element as moved.
|
||||||
|
$e.removeData(key);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
51
data/bmk/assets/sass/base/_page.scss
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Basic */
|
||||||
|
|
||||||
|
// MSIE: Required for IEMobile.
|
||||||
|
@-ms-viewport {
|
||||||
|
width: device-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MSIE: Prevents scrollbar from overlapping content.
|
||||||
|
body {
|
||||||
|
-ms-overflow-style: scrollbar;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensures page width is always >=320px.
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
html, body {
|
||||||
|
min-width: 320px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set box model to border-box.
|
||||||
|
// Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice
|
||||||
|
html {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: _palette(bg);
|
||||||
|
@include vendor('background-image', (
|
||||||
|
'url("images/overlay.png")',
|
||||||
|
'linear-gradient(45deg, #{_palette(bg1)} 15%, #{_palette(bg2) 85%})',
|
||||||
|
));
|
||||||
|
|
||||||
|
// Stops initial animations until page loads.
|
||||||
|
&.is-preload {
|
||||||
|
*, *:before, *:after {
|
||||||
|
@include vendor('animation', 'none !important');
|
||||||
|
@include vendor('transition', 'none !important');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
76
data/bmk/assets/sass/base/_reset.scss
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
// Reset.
|
||||||
|
// Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain)
|
||||||
|
|
||||||
|
html, body, div, span, applet, object,
|
||||||
|
iframe, h1, h2, h3, h4, h5, h6, p, blockquote,
|
||||||
|
pre, a, abbr, acronym, address, big, cite,
|
||||||
|
code, del, dfn, em, img, ins, kbd, q, s, samp,
|
||||||
|
small, strike, strong, sub, sup, tt, var, b,
|
||||||
|
u, i, center, dl, dt, dd, ol, ul, li, fieldset,
|
||||||
|
form, label, legend, table, caption, tbody,
|
||||||
|
tfoot, thead, tr, th, td, article, aside,
|
||||||
|
canvas, details, embed, figure, figcaption,
|
||||||
|
footer, header, hgroup, menu, nav, output, ruby,
|
||||||
|
section, summary, time, mark, audio, video {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
font: inherit;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
article, aside, details, figcaption, figure,
|
||||||
|
footer, header, hgroup, menu, nav, section {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol, ul {
|
||||||
|
list-style:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote, q {
|
||||||
|
quotes: none;
|
||||||
|
|
||||||
|
&:before,
|
||||||
|
&:after {
|
||||||
|
content: '';
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
mark {
|
||||||
|
background-color: transparent;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
input::-moz-focus-inner {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, select, textarea {
|
||||||
|
-moz-appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-ms-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
}
|
216
data/bmk/assets/sass/base/_typography.scss
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Type */
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: _palette(bg);
|
||||||
|
color: _palette(fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
body, input, select, textarea {
|
||||||
|
font-family: _font(family);
|
||||||
|
font-size: 17pt;
|
||||||
|
font-weight: _font(weight);
|
||||||
|
line-height: 1.65;
|
||||||
|
|
||||||
|
@include breakpoint('<=xlarge') {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xxsmall') {
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
@include vendor('transition', (
|
||||||
|
'color #{_duration(transition)} ease',
|
||||||
|
'border-bottom #{_duration(transition)} ease'
|
||||||
|
));
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: dotted 1px;
|
||||||
|
color: inherit;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strong, b {
|
||||||
|
font-weight: _font(weight-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
em, i {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
|
||||||
|
&.content {
|
||||||
|
-moz-columns: 20em 2;
|
||||||
|
-webkit-columns: 20em 2;
|
||||||
|
-ms-columns: 20em 2;
|
||||||
|
columns: 20em 2;
|
||||||
|
-moz-column-gap: _size(element-margin);
|
||||||
|
-webkit-column-gap: _size(element-margin);
|
||||||
|
-ms-column-gap: _size(element-margin);
|
||||||
|
column-gap: _size(element-margin);
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-weight: _font(weight);
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.35) 0;
|
||||||
|
letter-spacing: _font(letter-spacing);
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2.5em;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
font-size: 0.8em;
|
||||||
|
position: relative;
|
||||||
|
top: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
font-size: 0.8em;
|
||||||
|
position: relative;
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
border-left: solid 4px;
|
||||||
|
font-style: italic;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
padding: (_size(element-margin) / 4) 0 (_size(element-margin) / 4) _size(element-margin);
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: solid 1px;
|
||||||
|
font-family: _font(family-fixed);
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin: 0 0.25em;
|
||||||
|
padding: 0.25em 0.65em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
font-family: _font(family-fixed);
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
|
||||||
|
code {
|
||||||
|
display: block;
|
||||||
|
line-height: 1.75;
|
||||||
|
padding: 1em 1.5em;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: 0;
|
||||||
|
border-bottom: solid 1px;
|
||||||
|
margin: _size(element-margin) 0;
|
||||||
|
|
||||||
|
&.major {
|
||||||
|
margin: (_size(element-margin) * 1.5) 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-typography($p: null) {
|
||||||
|
@if $p != null {
|
||||||
|
background-color: _palette($p, bg);
|
||||||
|
color: _palette($p, fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
input, select, textarea {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
&:hover {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strong, b {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
border-left-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: _palette($p, border-bg);
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-bottom-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-typography;
|
101
data/bmk/assets/sass/components/_actions.scss
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Actions */
|
||||||
|
|
||||||
|
ul.actions {
|
||||||
|
@include vendor('display', 'flex');
|
||||||
|
cursor: default;
|
||||||
|
list-style: none;
|
||||||
|
margin-left: (_size(element-margin) * -0.5);
|
||||||
|
padding-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0 0 0 (_size(element-margin) * 0.5);
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.special {
|
||||||
|
@include vendor('justify-content', 'center');
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
&:first-child {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.stacked {
|
||||||
|
@include vendor('flex-direction', 'column');
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: (_size(element-margin) * 0.65) 0 0 0;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fit {
|
||||||
|
width: calc(100% + #{_size(element-margin) * 0.5});
|
||||||
|
|
||||||
|
li {
|
||||||
|
@include vendor('flex-grow', '1');
|
||||||
|
@include vendor('flex-shrink', '1');
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.stacked {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
&:not(.fixed) {
|
||||||
|
@include vendor('flex-direction', 'column');
|
||||||
|
margin-left: 0;
|
||||||
|
width: 100% !important;
|
||||||
|
|
||||||
|
li {
|
||||||
|
@include vendor('flex-grow', '1');
|
||||||
|
@include vendor('flex-shrink', '1');
|
||||||
|
padding: (_size(element-margin) * 0.5) 0 0 0;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"],
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&.icon {
|
||||||
|
&:before {
|
||||||
|
margin-left: -0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
34
data/bmk/assets/sass/components/_box.scss
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Box */
|
||||||
|
|
||||||
|
.box {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: solid _size(border-width);
|
||||||
|
margin-bottom: _size(element-margin);
|
||||||
|
padding: 1.5em;
|
||||||
|
|
||||||
|
> :last-child,
|
||||||
|
> :last-child > :last-child,
|
||||||
|
> :last-child > :last-child > :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-box($p: null) {
|
||||||
|
.box {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-box;
|
109
data/bmk/assets/sass/components/_button.scss
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Button */
|
||||||
|
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"],
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
@include vendor('appearance', 'none');
|
||||||
|
@include vendor('transition', (
|
||||||
|
'background-color #{_duration(transition)} ease-in-out',
|
||||||
|
'color #{_duration(transition)} ease-in-out'
|
||||||
|
));
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: _font(weight);
|
||||||
|
height: 2.75em;
|
||||||
|
line-height: 2.75em;
|
||||||
|
min-width: 9.25em;
|
||||||
|
padding: 0 1.5em;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&.icon {
|
||||||
|
padding-left: 1.35em;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fit {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.small {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.large {
|
||||||
|
font-size: 1.35em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled,
|
||||||
|
&:disabled {
|
||||||
|
@include vendor('pointer-events', 'none');
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-button($p: null) {
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"],
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
background-color: transparent;
|
||||||
|
box-shadow: inset 0 0 0 1px _palette($p, border);
|
||||||
|
color: _palette($p, fg-bold) !important;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: _palette($p, border-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: _palette($p, border2-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.icon {
|
||||||
|
&:before {
|
||||||
|
color: _palette($p, fg-light);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background-color: _palette(accent);
|
||||||
|
color: _palette(invert, bg) !important;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten(_palette(accent), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken(_palette(accent), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.icon {
|
||||||
|
&:before {
|
||||||
|
color: _palette(invert, bg) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-button;
|
60
data/bmk/assets/sass/components/_features.scss
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Features */
|
||||||
|
|
||||||
|
.features {
|
||||||
|
@include vendor('display', 'flex');
|
||||||
|
@include vendor('flex-wrap', 'wrap');
|
||||||
|
@include vendor('justify-content', 'center');
|
||||||
|
width: calc(100% + #{_size(element-margin)});
|
||||||
|
margin: 0 0 (_size(element-margin) * 1.5) (_size(element-margin) * -1);
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li {
|
||||||
|
width: calc(#{(100% / 3)} - #{_size(element-margin)});
|
||||||
|
margin-left: _size(element-margin);
|
||||||
|
margin-top: (_size(element-margin) * 1.5);
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
&:nth-child(1),
|
||||||
|
&:nth-child(2),
|
||||||
|
&:nth-child(3) {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
li {
|
||||||
|
width: calc(#{(100% / 2)} - #{_size(element-margin)});
|
||||||
|
|
||||||
|
&:nth-child(3) {
|
||||||
|
margin-top: (_size(element-margin) * 1.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: _size(element-margin);
|
||||||
|
|
||||||
|
&:nth-child(2),
|
||||||
|
&:nth-child(3) {
|
||||||
|
margin-top: _size(element-margin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
221
data/bmk/assets/sass/components/_form.scss
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Form */
|
||||||
|
|
||||||
|
form {
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: _font(weight-bold);
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.5) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"],
|
||||||
|
input[type="email"],
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
@include vendor('appearance', 'none');
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: solid 1px;
|
||||||
|
color: inherit;
|
||||||
|
display: block;
|
||||||
|
outline: 0;
|
||||||
|
padding: 0 1em;
|
||||||
|
text-decoration: none;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&:invalid {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
background-size: 1.25rem;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: calc(100% - 1rem) center;
|
||||||
|
height: _size(element-height);
|
||||||
|
padding-right: _size(element-height);
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
&::-ms-value {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::-ms-expand {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"],
|
||||||
|
input[type="email"],
|
||||||
|
select {
|
||||||
|
height: _size(element-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
padding: 0.75em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"], {
|
||||||
|
@include vendor('appearance', 'none');
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
margin-right: -2em;
|
||||||
|
opacity: 0;
|
||||||
|
width: 1em;
|
||||||
|
z-index: -1;
|
||||||
|
|
||||||
|
& + label {
|
||||||
|
@include icon(false, solid);
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: _font(weight);
|
||||||
|
padding-left: (_size(element-height) * 0.6) + 0.75em;
|
||||||
|
padding-right: 0.75em;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: solid 1px;
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 0.8em;
|
||||||
|
height: (_size(element-height) * 0.75);
|
||||||
|
left: 0;
|
||||||
|
line-height: (_size(element-height) * 0.75);
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
top: 0;
|
||||||
|
width: (_size(element-height) * 0.75);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked + label {
|
||||||
|
&:before {
|
||||||
|
content: '\f00c';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
& + label {
|
||||||
|
&:before {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"] {
|
||||||
|
& + label {
|
||||||
|
&:before {
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:-moz-placeholder {
|
||||||
|
opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-moz-placeholder {
|
||||||
|
opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:-ms-input-placeholder {
|
||||||
|
opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-form($p: null) {
|
||||||
|
label {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"],
|
||||||
|
input[type="email"],
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
background-color: _palette($p, border-bg);
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border-color: _palette(accent);
|
||||||
|
box-shadow: 0 0 0 1px _palette(accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
background-image: svg-url("<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40' preserveAspectRatio='none' viewBox='0 0 40 40'><path d='M9.4,12.3l10.4,10.4l10.4-10.4c0.2-0.2,0.5-0.4,0.9-0.4c0.3,0,0.6,0.1,0.9,0.4l3.3,3.3c0.2,0.2,0.4,0.5,0.4,0.9 c0,0.4-0.1,0.6-0.4,0.9L20.7,31.9c-0.2,0.2-0.5,0.4-0.9,0.4c-0.3,0-0.6-0.1-0.9-0.4L4.3,17.3c-0.2-0.2-0.4-0.5-0.4-0.9 c0-0.4,0.1-0.6,0.4-0.9l3.3-3.3c0.2-0.2,0.5-0.4,0.9-0.4S9.1,12.1,9.4,12.3z' fill='#{_palette($p, border)}' /></svg>");
|
||||||
|
|
||||||
|
option {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
background: _palette($p, bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"], {
|
||||||
|
& + label {
|
||||||
|
color: _palette($p, fg);
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
background: _palette($p, border-bg);
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked + label {
|
||||||
|
&:before {
|
||||||
|
background-color: _palette($p, fg-bold);
|
||||||
|
border-color: _palette($p, fg-bold);
|
||||||
|
color: _palette($p, bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus + label {
|
||||||
|
&:before {
|
||||||
|
border-color: _palette(accent);
|
||||||
|
box-shadow: 0 0 0 1px _palette(accent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
color: _palette($p, fg-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:-moz-placeholder {
|
||||||
|
color: _palette($p, fg-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-moz-placeholder {
|
||||||
|
color: _palette($p, fg-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:-ms-input-placeholder {
|
||||||
|
color: _palette($p, fg-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formerize-placeholder {
|
||||||
|
color: _palette($p, fg-light) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-form;
|
146
data/bmk/assets/sass/components/_icon.scss
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Icon */
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
@include icon;
|
||||||
|
@include vendor('transition', (
|
||||||
|
'background-color #{_duration(transition)} ease-in-out',
|
||||||
|
'color #{_duration(transition)} ease-in-out'
|
||||||
|
));
|
||||||
|
border-bottom: none;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
> .label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
line-height: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.solid {
|
||||||
|
&:before {
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.brands {
|
||||||
|
&:before {
|
||||||
|
font-family: 'Font Awesome 5 Brands';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.major {
|
||||||
|
border: solid 1px;
|
||||||
|
display: inline-block;
|
||||||
|
border-radius: 100%;
|
||||||
|
padding: 0.65em;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 6.25rem;
|
||||||
|
width: 2.25em;
|
||||||
|
height: 2.25em;
|
||||||
|
line-height: 2.2em;
|
||||||
|
border-radius: 100%;
|
||||||
|
border: solid 1px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
display: inline-block;
|
||||||
|
border: solid 1px;
|
||||||
|
border-radius: 100%;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
display: block;
|
||||||
|
font-size: 1.25em;
|
||||||
|
width: 2em;
|
||||||
|
height: 2em;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style1 {
|
||||||
|
color: _palette(accent1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style2 {
|
||||||
|
color: _palette(accent2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style3 {
|
||||||
|
color: _palette(accent3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style4 {
|
||||||
|
color: _palette(accent4);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style5 {
|
||||||
|
color: _palette(accent5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xlarge') {
|
||||||
|
&.major {
|
||||||
|
&:before {
|
||||||
|
font-size: 5.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
&.major {
|
||||||
|
&:before {
|
||||||
|
font-size: 4.75rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
&.major {
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.75) 0;
|
||||||
|
padding: 0.35em;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
font-size: 3.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-icon($p: null) {
|
||||||
|
.icon {
|
||||||
|
&.major {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: _palette($p, border-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: _palette($p, border2-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-icon;
|
22
data/bmk/assets/sass/components/_icons.scss
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Icons */
|
||||||
|
|
||||||
|
ul.icons {
|
||||||
|
cursor: default;
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 0.65em 0 0;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
60
data/bmk/assets/sass/components/_image.scss
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Image */
|
||||||
|
|
||||||
|
.image {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
border: 0;
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
img {
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.left,
|
||||||
|
&.right {
|
||||||
|
max-width: 40%;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.left {
|
||||||
|
float: left;
|
||||||
|
margin: 0 1.5em 1em 0;
|
||||||
|
top: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 1em 1.5em;
|
||||||
|
top: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fit {
|
||||||
|
display: block;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.main {
|
||||||
|
display: block;
|
||||||
|
margin: 0 0 (_size(element-margin) * 1.5) 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
94
data/bmk/assets/sass/components/_list.scss
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* List */
|
||||||
|
|
||||||
|
ol {
|
||||||
|
list-style: decimal;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
padding-left: 1.25em;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: 0.25em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: disc;
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
padding-left: 1em;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
border-top: solid 1px;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dl {
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
|
||||||
|
dt {
|
||||||
|
display: block;
|
||||||
|
font-weight: _font(weight-bold);
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.5) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin-left: _size(element-margin);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
dt {
|
||||||
|
display: block;
|
||||||
|
width: 3em;
|
||||||
|
margin: 0;
|
||||||
|
clear: left;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin: 0 0 0.85em 5.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-list($p: null) {
|
||||||
|
ul {
|
||||||
|
&.alt {
|
||||||
|
li {
|
||||||
|
border-top-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dl {
|
||||||
|
dt {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-list;
|
31
data/bmk/assets/sass/components/_row.scss
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Row */
|
||||||
|
|
||||||
|
.row {
|
||||||
|
@include html-grid(1.5em);
|
||||||
|
|
||||||
|
@include breakpoint('<=xlarge') {
|
||||||
|
@include html-grid(1.5em, 'xlarge');
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
@include html-grid(1.5em, 'large');
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
@include html-grid(1.5em, 'medium');
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
@include html-grid(1em, 'small');
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
@include html-grid(1.25em, 'xsmall');
|
||||||
|
}
|
||||||
|
}
|
104
data/bmk/assets/sass/components/_section.scss
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Section/Article */
|
||||||
|
|
||||||
|
section, article {
|
||||||
|
&.special {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
&.major {
|
||||||
|
margin-bottom: (_size(element-margin) * 1.5);
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2em;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
display: block;
|
||||||
|
content: '';
|
||||||
|
width: 3.25em;
|
||||||
|
height: 2px;
|
||||||
|
margin: (_size(element-margin) * 0.35) 0 (_size(element-margin) * 0.5) 0;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
section.special &, article.special & {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1.25em;
|
||||||
|
letter-spacing: _font(letter-spacing);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.special {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
&:after {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
&.major {
|
||||||
|
margin-top: (_size(element-margin) * 1.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
header {
|
||||||
|
&.major {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1em;
|
||||||
|
letter-spacing: 0;
|
||||||
|
|
||||||
|
br {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
&.major {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-section($p: null) {
|
||||||
|
header {
|
||||||
|
&.major {
|
||||||
|
h2 {
|
||||||
|
&:after {
|
||||||
|
background-color: _palette($p, border);
|
||||||
|
|
||||||
|
@if $p == 'invert' {
|
||||||
|
@include vendor('background-image', 'linear-gradient(90deg, #{_palette(accent1)}, #{_palette(accent3)}, #{_palette(accent5)})');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-section;
|
93
data/bmk/assets/sass/components/_spotlight.scss
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Spotlight */
|
||||||
|
|
||||||
|
.spotlight {
|
||||||
|
@include vendor('display', 'flex');
|
||||||
|
@include vendor('align-items', 'center');
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
@include vendor('flex', '1');
|
||||||
|
|
||||||
|
> :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
&.major {
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 4em;
|
||||||
|
padding: 0.65em;
|
||||||
|
border-radius: 100%;
|
||||||
|
border: solid 1px;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
border-radius: 100%;
|
||||||
|
width: 16em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
@include vendor('flex-direction', 'column-reverse');
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
@include vendor('flex', '0 1 auto');
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
header {
|
||||||
|
&.major {
|
||||||
|
h2 {
|
||||||
|
&:after {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.actions {
|
||||||
|
@include vendor('justify-content', 'center');
|
||||||
|
width: calc(100% + #{_size(element-margin) * 0.5});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
@include vendor('flex', '0 1 auto');
|
||||||
|
margin-left: 0;
|
||||||
|
margin-bottom: _size(element-margin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
.image {
|
||||||
|
padding: 0.35em;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 12em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-spotlight($p: null) {
|
||||||
|
.spotlight {
|
||||||
|
.image {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-spotlight;
|
108
data/bmk/assets/sass/components/_statistics.scss
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Statistics */
|
||||||
|
|
||||||
|
.statistics {
|
||||||
|
@include vendor('display', 'flex');
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 0 (_size(element-margin) * 1.5) 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
li {
|
||||||
|
@include vendor('flex', '1');
|
||||||
|
padding: 1.5em;
|
||||||
|
color: _palette(fg-bold);
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
&.style1 {
|
||||||
|
background-color: _palette(accent1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style2 {
|
||||||
|
background-color: _palette(accent2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style3 {
|
||||||
|
background-color: _palette(accent3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style4 {
|
||||||
|
background-color: _palette(accent4);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.style5 {
|
||||||
|
background-color: _palette(accent5);
|
||||||
|
}
|
||||||
|
|
||||||
|
strong, b {
|
||||||
|
display: block;
|
||||||
|
font-size: 2em;
|
||||||
|
line-height: 1.1;
|
||||||
|
color: inherit !important;
|
||||||
|
font-weight: _font(weight);
|
||||||
|
letter-spacing: _font(letter-spacing);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top-left-radius: _size(border-radius);
|
||||||
|
border-bottom-left-radius: _size(border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-top-right-radius: _size(border-radius);
|
||||||
|
border-bottom-right-radius: _size(border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
font-size: 2.75rem;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
li {
|
||||||
|
strong, b {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
display: block;
|
||||||
|
width: 20em;
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 0 auto _size(element-margin) auto;
|
||||||
|
|
||||||
|
li {
|
||||||
|
&:first-child {
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-top-right-radius: _size(border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-left-radius: _size(border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
&:before {
|
||||||
|
font-size: 3.75rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strong, b {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
114
data/bmk/assets/sass/components/_table.scss
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Table */
|
||||||
|
|
||||||
|
.table-wrapper {
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
margin: 0 0 _size(element-margin) 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
tbody {
|
||||||
|
tr {
|
||||||
|
border: solid 1px;
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 0.75em 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: _font(weight-bold);
|
||||||
|
padding: 0 0.75em 0.75em 0.75em;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
border-bottom: solid 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfoot {
|
||||||
|
border-top: solid 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
border-collapse: separate;
|
||||||
|
|
||||||
|
tbody {
|
||||||
|
tr {
|
||||||
|
td {
|
||||||
|
border: solid 1px;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-top-width: 0;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-left-width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
td {
|
||||||
|
border-top-width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfoot {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin color-table($p: null) {
|
||||||
|
table {
|
||||||
|
tbody {
|
||||||
|
tr {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
|
||||||
|
&:nth-child(2n + 1) {
|
||||||
|
background-color: _palette($p, border-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
color: _palette($p, fg-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
border-bottom-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfoot {
|
||||||
|
border-top-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
tbody {
|
||||||
|
tr {
|
||||||
|
td {
|
||||||
|
border-color: _palette($p, border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include color-table;
|
60
data/bmk/assets/sass/layout/_footer.scss
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Footer */
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
@include vendor('display', 'flex');
|
||||||
|
@include vendor('flex-wrap', 'wrap');
|
||||||
|
@include padding(5em, 5em);
|
||||||
|
width: calc(100% + #{_size(element-margin)});
|
||||||
|
margin: 0 0 (_size(element-margin) * 1.5) (_size(element-margin) * -1);
|
||||||
|
|
||||||
|
> * {
|
||||||
|
width: calc(50% - #{_size(element-margin)});
|
||||||
|
margin-left: _size(element-margin);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright {
|
||||||
|
width: 100%;
|
||||||
|
margin: (_size(element-margin) * 1.25) 0 _size(element-margin) 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
@include padding(4em, 4em);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
@include padding(4em, 3em);
|
||||||
|
display: block;
|
||||||
|
margin: 0 0 (_size(element-margin) * 1.5) 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-bottom: (_size(element-margin) * 1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
@include padding(3em, 2em);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
@include padding(3em, 1.5em);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
@include padding(2.5em, 1em);
|
||||||
|
}
|
||||||
|
}
|
116
data/bmk/assets/sass/layout/_header.scss
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
|
||||||
|
#header {
|
||||||
|
@include padding(5em, 5em, (0, 0, -2em, 0));
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.125) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1.25em;
|
||||||
|
letter-spacing: _font(letter-spacing);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(6em, 5em, (1em, 0, 0, 0));
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
@include vendor('transition', 'opacity 3s ease');
|
||||||
|
@include vendor('transition-delay', '0.5s');
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
@include vendor('transition', (
|
||||||
|
'opacity 1.25s ease',
|
||||||
|
'transform 0.5s ease'
|
||||||
|
));
|
||||||
|
@include vendor('transition-delay', '0s');
|
||||||
|
display: block;
|
||||||
|
margin: 0 0 (_size(element-margin) * 0.75) 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 75%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
@include padding(4em, 4em, (0, 0, -2em, 0));
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(5em, 4em, (1em, 0, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
@include padding(4em, 3em, (0, 0, -2em, 0));
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(4em, 3em, (1em, 0, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
@include padding(3em, 2em, (0, 0, -1em, 0));
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1em;
|
||||||
|
letter-spacing: 0;
|
||||||
|
|
||||||
|
br {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(3em, 2em, (1em, 0, 0, 0));
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
@include padding(3em, 1.5em, (0, 0, -1em, 0));
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(3em, 1.5em, (1em, 0, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xxsmall') {
|
||||||
|
@include padding(2.5em, 1em, (0, 0, -1em, 0));
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
@include padding(2.5em, 1em, (1em, 0, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.is-preload & {
|
||||||
|
&.alt {
|
||||||
|
> * {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
@include vendor('transform', 'scale(0.8) rotate(-30deg)');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
99
data/bmk/assets/sass/layout/_main.scss
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Main */
|
||||||
|
|
||||||
|
#main {
|
||||||
|
@include color(invert);
|
||||||
|
border-radius: _size(border-radius-main);
|
||||||
|
|
||||||
|
> .main {
|
||||||
|
@include padding(5em, 5em);
|
||||||
|
border-top: solid 1px _palette(invert, border);
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -5em 0 5em -5em;
|
||||||
|
width: calc(100% + 10em);
|
||||||
|
border-top-right-radius: _size(border-radius-main);
|
||||||
|
border-top-left-radius: _size(border-radius-main);
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
border-top-right-radius: _size(border-radius-main);
|
||||||
|
border-top-left-radius: _size(border-radius-main);
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=large') {
|
||||||
|
> .main {
|
||||||
|
@include padding(4em, 4em);
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -4em 0 4em -4em;
|
||||||
|
width: calc(100% + 8em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=medium') {
|
||||||
|
> .main {
|
||||||
|
@include padding(4em, 3em);
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -4em 0 4em -3em;
|
||||||
|
width: calc(100% + 6em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
> .main {
|
||||||
|
@include padding(3em, 2em);
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -3em 0 2em -2em;
|
||||||
|
width: calc(100% + 4em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
> .main {
|
||||||
|
@include padding(3em, 1.5em);
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -3em 0 1.5em -1.5em;
|
||||||
|
width: calc(100% + 3em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xxsmall') {
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
> .main {
|
||||||
|
@include padding(2.5em, 1em);
|
||||||
|
|
||||||
|
> .image.main:first-child {
|
||||||
|
margin: -2.5em 0 1.5em -1em;
|
||||||
|
width: calc(100% + 2em);
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
96
data/bmk/assets/sass/layout/_nav.scss
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Nav */
|
||||||
|
|
||||||
|
#nav {
|
||||||
|
@include vendor('transition', (
|
||||||
|
'background-color #{_duration(transition)} ease',
|
||||||
|
'border-top-left-radius #{_duration(transition)} ease',
|
||||||
|
'border-top-right-radius #{_duration(transition)} ease',
|
||||||
|
'padding #{_duration(transition)} ease',
|
||||||
|
));
|
||||||
|
@include color-typography(invert);
|
||||||
|
position: absolute;
|
||||||
|
width: _size(inner);
|
||||||
|
max-width: calc(100% - #{_size(element-margin) * 2});
|
||||||
|
padding: 1em;
|
||||||
|
background-color: _palette(invert, bg-alt);
|
||||||
|
border-top-left-radius: _size(border-radius-main);
|
||||||
|
border-top-right-radius: _size(border-radius-main);
|
||||||
|
cursor: default;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
& + #main {
|
||||||
|
padding-top: 4.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li {
|
||||||
|
@include vendor('transition', (
|
||||||
|
'margin #{_duration(transition)} ease'
|
||||||
|
));
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0.35em;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
a {
|
||||||
|
@include vendor('transition', (
|
||||||
|
'font-size #{_duration(transition)} ease'
|
||||||
|
));
|
||||||
|
display: inline-block;
|
||||||
|
height: 2.25em;
|
||||||
|
line-height: 2.25em;
|
||||||
|
padding: 0 1.25em;
|
||||||
|
border: 0;
|
||||||
|
border-radius: _size(border-radius);
|
||||||
|
box-shadow: inset 0 0 0 1px transparent;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: _palette(invert, border-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background-color: _palette(invert, bg);
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
background-color: transparentize(_palette(invert, bg-alt), 0.05);
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
z-index: _misc(z-index-base);
|
||||||
|
|
||||||
|
ul {
|
||||||
|
li {
|
||||||
|
margin: 0 0.175em;
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=small') {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
& + #main {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
data/bmk/assets/sass/layout/_wrapper.scss
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
///
|
||||||
|
/// Stellar by HTML5 UP
|
||||||
|
/// html5up.net | @ajlkn
|
||||||
|
/// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
///
|
||||||
|
|
||||||
|
/* Wrapper */
|
||||||
|
|
||||||
|
#wrapper {
|
||||||
|
width: _size(inner);
|
||||||
|
max-width: calc(100% - 4em);
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
@include breakpoint('<=xsmall') {
|
||||||
|
max-width: calc(100% - 2em);
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint('<=xxsmall') {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
223
data/bmk/assets/sass/libs/_breakpoints.scss
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
// breakpoints.scss v1.0 | @ajlkn | MIT licensed */
|
||||||
|
|
||||||
|
// Vars.
|
||||||
|
|
||||||
|
/// Breakpoints.
|
||||||
|
/// @var {list}
|
||||||
|
$breakpoints: () !global;
|
||||||
|
|
||||||
|
// Mixins.
|
||||||
|
|
||||||
|
/// Sets breakpoints.
|
||||||
|
/// @param {map} $x Breakpoints.
|
||||||
|
@mixin breakpoints($x: ()) {
|
||||||
|
$breakpoints: $x !global;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wraps @content in a @media block targeting a specific orientation.
|
||||||
|
/// @param {string} $orientation Orientation.
|
||||||
|
@mixin orientation($orientation) {
|
||||||
|
@media screen and (orientation: #{$orientation}) {
|
||||||
|
@content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wraps @content in a @media block using a given query.
|
||||||
|
/// @param {string} $query Query.
|
||||||
|
@mixin breakpoint($query: null) {
|
||||||
|
|
||||||
|
$breakpoint: null;
|
||||||
|
$op: null;
|
||||||
|
$media: null;
|
||||||
|
|
||||||
|
// Determine operator, breakpoint.
|
||||||
|
|
||||||
|
// Greater than or equal.
|
||||||
|
@if (str-slice($query, 0, 2) == '>=') {
|
||||||
|
|
||||||
|
$op: 'gte';
|
||||||
|
$breakpoint: str-slice($query, 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than or equal.
|
||||||
|
@elseif (str-slice($query, 0, 2) == '<=') {
|
||||||
|
|
||||||
|
$op: 'lte';
|
||||||
|
$breakpoint: str-slice($query, 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greater than.
|
||||||
|
@elseif (str-slice($query, 0, 1) == '>') {
|
||||||
|
|
||||||
|
$op: 'gt';
|
||||||
|
$breakpoint: str-slice($query, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than.
|
||||||
|
@elseif (str-slice($query, 0, 1) == '<') {
|
||||||
|
|
||||||
|
$op: 'lt';
|
||||||
|
$breakpoint: str-slice($query, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not.
|
||||||
|
@elseif (str-slice($query, 0, 1) == '!') {
|
||||||
|
|
||||||
|
$op: 'not';
|
||||||
|
$breakpoint: str-slice($query, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal.
|
||||||
|
@else {
|
||||||
|
|
||||||
|
$op: 'eq';
|
||||||
|
$breakpoint: $query;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build media.
|
||||||
|
@if ($breakpoint and map-has-key($breakpoints, $breakpoint)) {
|
||||||
|
|
||||||
|
$a: map-get($breakpoints, $breakpoint);
|
||||||
|
|
||||||
|
// Range.
|
||||||
|
@if (type-of($a) == 'list') {
|
||||||
|
|
||||||
|
$x: nth($a, 1);
|
||||||
|
$y: nth($a, 2);
|
||||||
|
|
||||||
|
// Max only.
|
||||||
|
@if ($x == null) {
|
||||||
|
|
||||||
|
// Greater than or equal (>= 0 / anything)
|
||||||
|
@if ($op == 'gte') {
|
||||||
|
$media: 'screen';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than or equal (<= y)
|
||||||
|
@elseif ($op == 'lte') {
|
||||||
|
$media: 'screen and (max-width: ' + $y + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greater than (> y)
|
||||||
|
@elseif ($op == 'gt') {
|
||||||
|
$media: 'screen and (min-width: ' + ($y + 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than (< 0 / invalid)
|
||||||
|
@elseif ($op == 'lt') {
|
||||||
|
$media: 'screen and (max-width: -1px)';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not (> y)
|
||||||
|
@elseif ($op == 'not') {
|
||||||
|
$media: 'screen and (min-width: ' + ($y + 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal (<= y)
|
||||||
|
@else {
|
||||||
|
$media: 'screen and (max-width: ' + $y + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Min only.
|
||||||
|
@else if ($y == null) {
|
||||||
|
|
||||||
|
// Greater than or equal (>= x)
|
||||||
|
@if ($op == 'gte') {
|
||||||
|
$media: 'screen and (min-width: ' + $x + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than or equal (<= inf / anything)
|
||||||
|
@elseif ($op == 'lte') {
|
||||||
|
$media: 'screen';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greater than (> inf / invalid)
|
||||||
|
@elseif ($op == 'gt') {
|
||||||
|
$media: 'screen and (max-width: -1px)';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than (< x)
|
||||||
|
@elseif ($op == 'lt') {
|
||||||
|
$media: 'screen and (max-width: ' + ($x - 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not (< x)
|
||||||
|
@elseif ($op == 'not') {
|
||||||
|
$media: 'screen and (max-width: ' + ($x - 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal (>= x)
|
||||||
|
@else {
|
||||||
|
$media: 'screen and (min-width: ' + $x + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Min and max.
|
||||||
|
@else {
|
||||||
|
|
||||||
|
// Greater than or equal (>= x)
|
||||||
|
@if ($op == 'gte') {
|
||||||
|
$media: 'screen and (min-width: ' + $x + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than or equal (<= y)
|
||||||
|
@elseif ($op == 'lte') {
|
||||||
|
$media: 'screen and (max-width: ' + $y + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greater than (> y)
|
||||||
|
@elseif ($op == 'gt') {
|
||||||
|
$media: 'screen and (min-width: ' + ($y + 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than (< x)
|
||||||
|
@elseif ($op == 'lt') {
|
||||||
|
$media: 'screen and (max-width: ' + ($x - 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not (< x and > y)
|
||||||
|
@elseif ($op == 'not') {
|
||||||
|
$media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal (>= x and <= y)
|
||||||
|
@else {
|
||||||
|
$media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// String.
|
||||||
|
@else {
|
||||||
|
|
||||||
|
// Missing a media type? Prefix with "screen".
|
||||||
|
@if (str-slice($a, 0, 1) == '(') {
|
||||||
|
$media: 'screen and ' + $a;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, use as-is.
|
||||||
|
@else {
|
||||||
|
$media: $a;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output.
|
||||||
|
@media #{$media} {
|
||||||
|
@content;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
90
data/bmk/assets/sass/libs/_functions.scss
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/// Removes a specific item from a list.
|
||||||
|
/// @author Hugo Giraudel
|
||||||
|
/// @param {list} $list List.
|
||||||
|
/// @param {integer} $index Index.
|
||||||
|
/// @return {list} Updated list.
|
||||||
|
@function remove-nth($list, $index) {
|
||||||
|
|
||||||
|
$result: null;
|
||||||
|
|
||||||
|
@if type-of($index) != number {
|
||||||
|
@warn "$index: #{quote($index)} is not a number for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else if $index == 0 {
|
||||||
|
@warn "List index 0 must be a non-zero integer for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else if abs($index) > length($list) {
|
||||||
|
@warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
|
||||||
|
$result: ();
|
||||||
|
$index: if($index < 0, length($list) + $index + 1, $index);
|
||||||
|
|
||||||
|
@for $i from 1 through length($list) {
|
||||||
|
|
||||||
|
@if $i != $index {
|
||||||
|
$result: append($result, nth($list, $i));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a value from a map.
|
||||||
|
/// @author Hugo Giraudel
|
||||||
|
/// @param {map} $map Map.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function val($map, $keys...) {
|
||||||
|
|
||||||
|
@if nth($keys, 1) == null {
|
||||||
|
$keys: remove-nth($keys, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@each $key in $keys {
|
||||||
|
$map: map-get($map, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $map;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a duration value.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function _duration($keys...) {
|
||||||
|
@return val($duration, $keys...);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a font value.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function _font($keys...) {
|
||||||
|
@return val($font, $keys...);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a misc value.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function _misc($keys...) {
|
||||||
|
@return val($misc, $keys...);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a palette value.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function _palette($keys...) {
|
||||||
|
@return val($palette, $keys...);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a size value.
|
||||||
|
/// @param {string} $keys Key(s).
|
||||||
|
/// @return {string} Value.
|
||||||
|
@function _size($keys...) {
|
||||||
|
@return val($size, $keys...);
|
||||||
|
}
|
149
data/bmk/assets/sass/libs/_html-grid.scss
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
// html-grid.scss v1.0 | @ajlkn | MIT licensed */
|
||||||
|
|
||||||
|
// Mixins.
|
||||||
|
|
||||||
|
/// Initializes the current element as an HTML grid.
|
||||||
|
/// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually).
|
||||||
|
/// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list).
|
||||||
|
@mixin html-grid($gutters: 1.5em, $suffix: '') {
|
||||||
|
|
||||||
|
// Initialize.
|
||||||
|
$cols: 12;
|
||||||
|
$multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00;
|
||||||
|
$unit: 100% / $cols;
|
||||||
|
|
||||||
|
// Suffixes.
|
||||||
|
$suffixes: null;
|
||||||
|
|
||||||
|
@if (type-of($suffix) == 'list') {
|
||||||
|
$suffixes: $suffix;
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
$suffixes: ($suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gutters.
|
||||||
|
$guttersCols: null;
|
||||||
|
$guttersRows: null;
|
||||||
|
|
||||||
|
@if (type-of($gutters) == 'list') {
|
||||||
|
|
||||||
|
$guttersCols: nth($gutters, 1);
|
||||||
|
$guttersRows: nth($gutters, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
|
||||||
|
$guttersCols: $gutters;
|
||||||
|
$guttersRows: 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Row.
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
box-sizing: border-box;
|
||||||
|
align-items: stretch;
|
||||||
|
|
||||||
|
// Columns.
|
||||||
|
> * {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gutters.
|
||||||
|
&.gtr-uniform {
|
||||||
|
> * {
|
||||||
|
> :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alignment.
|
||||||
|
&.aln-left {
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.aln-center {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.aln-right {
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.aln-top {
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.aln-middle {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.aln-bottom {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step through suffixes.
|
||||||
|
@each $suffix in $suffixes {
|
||||||
|
|
||||||
|
// Suffix.
|
||||||
|
@if ($suffix != '') {
|
||||||
|
$suffix: '-' + $suffix;
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
$suffix: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Row.
|
||||||
|
|
||||||
|
// Important.
|
||||||
|
> .imp#{$suffix} {
|
||||||
|
order: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Columns, offsets.
|
||||||
|
@for $i from 1 through $cols {
|
||||||
|
> .col-#{$i}#{$suffix} {
|
||||||
|
width: $unit * $i;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .off-#{$i}#{$suffix} {
|
||||||
|
margin-left: $unit * $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step through multipliers.
|
||||||
|
@each $multiplier in $multipliers {
|
||||||
|
|
||||||
|
// Gutters.
|
||||||
|
$class: null;
|
||||||
|
|
||||||
|
@if ($multiplier != 1) {
|
||||||
|
$class: '.gtr-' + ($multiplier * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
&#{$class} {
|
||||||
|
margin-top: ($guttersRows * $multiplier * -1);
|
||||||
|
margin-left: ($guttersCols * $multiplier * -1);
|
||||||
|
|
||||||
|
> * {
|
||||||
|
padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uniform.
|
||||||
|
&.gtr-uniform {
|
||||||
|
margin-top: $guttersCols * $multiplier * -1;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
padding-top: $guttersCols * $multiplier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
78
data/bmk/assets/sass/libs/_mixins.scss
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/// Makes an element's :before pseudoelement a FontAwesome icon.
|
||||||
|
/// @param {string} $content Optional content value to use.
|
||||||
|
/// @param {string} $category Optional category to use.
|
||||||
|
/// @param {string} $where Optional pseudoelement to target (before or after).
|
||||||
|
@mixin icon($content: false, $category: regular, $where: before) {
|
||||||
|
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:#{$where} {
|
||||||
|
|
||||||
|
@if $content {
|
||||||
|
content: $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
display: inline-block;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-rendering: auto;
|
||||||
|
line-height: 1;
|
||||||
|
text-transform: none !important;
|
||||||
|
|
||||||
|
@if ($category == brands) {
|
||||||
|
font-family: 'Font Awesome 5 Brands';
|
||||||
|
}
|
||||||
|
@elseif ($category == solid) {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Applies padding to an element, taking the current element-margin value into account.
|
||||||
|
/// @param {mixed} $tb Top/bottom padding.
|
||||||
|
/// @param {mixed} $lr Left/right padding.
|
||||||
|
/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left)
|
||||||
|
/// @param {bool} $important If true, adds !important.
|
||||||
|
@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) {
|
||||||
|
|
||||||
|
@if $important {
|
||||||
|
$important: '!important';
|
||||||
|
}
|
||||||
|
|
||||||
|
$x: 0.1em;
|
||||||
|
|
||||||
|
@if unit(_size(element-margin)) == 'rem' {
|
||||||
|
$x: 0.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp).
|
||||||
|
/// @param {string} $svg SVG data URL.
|
||||||
|
/// @return {string} Encoded SVG data URL.
|
||||||
|
@function svg-url($svg) {
|
||||||
|
|
||||||
|
$svg: str-replace($svg, '"', '\'');
|
||||||
|
$svg: str-replace($svg, '%', '%25');
|
||||||
|
$svg: str-replace($svg, '<', '%3C');
|
||||||
|
$svg: str-replace($svg, '>', '%3E');
|
||||||
|
$svg: str-replace($svg, '&', '%26');
|
||||||
|
$svg: str-replace($svg, '#', '%23');
|
||||||
|
$svg: str-replace($svg, '{', '%7B');
|
||||||
|
$svg: str-replace($svg, '}', '%7D');
|
||||||
|
$svg: str-replace($svg, ';', '%3B');
|
||||||
|
|
||||||
|
@return url("data:image/svg+xml;charset=utf8,#{$svg}");
|
||||||
|
|
||||||
|
}
|
60
data/bmk/assets/sass/libs/_vars.scss
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Misc.
|
||||||
|
$misc: (
|
||||||
|
z-index-base: 10000
|
||||||
|
);
|
||||||
|
|
||||||
|
// Duration.
|
||||||
|
$duration: (
|
||||||
|
transition: 0.2s
|
||||||
|
);
|
||||||
|
|
||||||
|
// Size.
|
||||||
|
$size: (
|
||||||
|
border-radius: 8px,
|
||||||
|
border-radius-main: 0.25em,
|
||||||
|
element-height: 2.75em,
|
||||||
|
element-margin: 2em,
|
||||||
|
inner: 64em
|
||||||
|
);
|
||||||
|
|
||||||
|
// Font.
|
||||||
|
$font: (
|
||||||
|
family: ('Source Sans Pro', Helvetica, sans-serif),
|
||||||
|
family-fixed: ('Courier New', monospace),
|
||||||
|
weight: 300,
|
||||||
|
weight-bold: 400,
|
||||||
|
letter-spacing: -0.025em
|
||||||
|
);
|
||||||
|
|
||||||
|
// Palette.
|
||||||
|
$palette: (
|
||||||
|
bg: #935d8c,
|
||||||
|
fg: rgba(255,255,255,0.65),
|
||||||
|
fg-bold: #ffffff,
|
||||||
|
fg-light: rgba(255,255,255,0.5),
|
||||||
|
border: rgba(255,255,255,0.35),
|
||||||
|
border-bg: rgba(255,255,255,0.075),
|
||||||
|
border2: rgba(255,255,255,0.75),
|
||||||
|
border2-bg: rgba(255,255,255,0.2),
|
||||||
|
|
||||||
|
invert: (
|
||||||
|
bg: #ffffff,
|
||||||
|
bg-alt: #f7f7f7,
|
||||||
|
fg: #636363,
|
||||||
|
fg-bold: #636363,
|
||||||
|
fg-light: rgba(99,99,99,0.25),
|
||||||
|
border: #dddddd,
|
||||||
|
border-bg: rgba(222,222,222,0.25),
|
||||||
|
border2: #dddddd,
|
||||||
|
border2-bg: rgba(222,222,222,0.5),
|
||||||
|
),
|
||||||
|
|
||||||
|
accent: #8cc9f0,
|
||||||
|
accent1: #efa8b0,
|
||||||
|
accent2: #c79cc8,
|
||||||
|
accent3: #a89cc8,
|
||||||
|
accent4: #9bb2e1,
|
||||||
|
accent5: #8cc9f0,
|
||||||
|
bg1: #e37682,
|
||||||
|
bg2: #5f4d93
|
||||||
|
);
|
376
data/bmk/assets/sass/libs/_vendor.scss
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
// vendor.scss v1.0 | @ajlkn | MIT licensed */
|
||||||
|
|
||||||
|
// Vars.
|
||||||
|
|
||||||
|
/// Vendor prefixes.
|
||||||
|
/// @var {list}
|
||||||
|
$vendor-prefixes: (
|
||||||
|
'-moz-',
|
||||||
|
'-webkit-',
|
||||||
|
'-ms-',
|
||||||
|
''
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Properties that should be vendorized.
|
||||||
|
/// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org
|
||||||
|
/// @var {list}
|
||||||
|
$vendor-properties: (
|
||||||
|
|
||||||
|
// Animation.
|
||||||
|
'animation',
|
||||||
|
'animation-delay',
|
||||||
|
'animation-direction',
|
||||||
|
'animation-duration',
|
||||||
|
'animation-fill-mode',
|
||||||
|
'animation-iteration-count',
|
||||||
|
'animation-name',
|
||||||
|
'animation-play-state',
|
||||||
|
'animation-timing-function',
|
||||||
|
|
||||||
|
// Appearance.
|
||||||
|
'appearance',
|
||||||
|
|
||||||
|
// Backdrop filter.
|
||||||
|
'backdrop-filter',
|
||||||
|
|
||||||
|
// Background image options.
|
||||||
|
'background-clip',
|
||||||
|
'background-origin',
|
||||||
|
'background-size',
|
||||||
|
|
||||||
|
// Box sizing.
|
||||||
|
'box-sizing',
|
||||||
|
|
||||||
|
// Clip path.
|
||||||
|
'clip-path',
|
||||||
|
|
||||||
|
// Filter effects.
|
||||||
|
'filter',
|
||||||
|
|
||||||
|
// Flexbox.
|
||||||
|
'align-content',
|
||||||
|
'align-items',
|
||||||
|
'align-self',
|
||||||
|
'flex',
|
||||||
|
'flex-basis',
|
||||||
|
'flex-direction',
|
||||||
|
'flex-flow',
|
||||||
|
'flex-grow',
|
||||||
|
'flex-shrink',
|
||||||
|
'flex-wrap',
|
||||||
|
'justify-content',
|
||||||
|
'order',
|
||||||
|
|
||||||
|
// Font feature.
|
||||||
|
'font-feature-settings',
|
||||||
|
'font-language-override',
|
||||||
|
'font-variant-ligatures',
|
||||||
|
|
||||||
|
// Font kerning.
|
||||||
|
'font-kerning',
|
||||||
|
|
||||||
|
// Fragmented borders and backgrounds.
|
||||||
|
'box-decoration-break',
|
||||||
|
|
||||||
|
// Grid layout.
|
||||||
|
'grid-column',
|
||||||
|
'grid-column-align',
|
||||||
|
'grid-column-end',
|
||||||
|
'grid-column-start',
|
||||||
|
'grid-row',
|
||||||
|
'grid-row-align',
|
||||||
|
'grid-row-end',
|
||||||
|
'grid-row-start',
|
||||||
|
'grid-template-columns',
|
||||||
|
'grid-template-rows',
|
||||||
|
|
||||||
|
// Hyphens.
|
||||||
|
'hyphens',
|
||||||
|
'word-break',
|
||||||
|
|
||||||
|
// Masks.
|
||||||
|
'mask',
|
||||||
|
'mask-border',
|
||||||
|
'mask-border-outset',
|
||||||
|
'mask-border-repeat',
|
||||||
|
'mask-border-slice',
|
||||||
|
'mask-border-source',
|
||||||
|
'mask-border-width',
|
||||||
|
'mask-clip',
|
||||||
|
'mask-composite',
|
||||||
|
'mask-image',
|
||||||
|
'mask-origin',
|
||||||
|
'mask-position',
|
||||||
|
'mask-repeat',
|
||||||
|
'mask-size',
|
||||||
|
|
||||||
|
// Multicolumn.
|
||||||
|
'break-after',
|
||||||
|
'break-before',
|
||||||
|
'break-inside',
|
||||||
|
'column-count',
|
||||||
|
'column-fill',
|
||||||
|
'column-gap',
|
||||||
|
'column-rule',
|
||||||
|
'column-rule-color',
|
||||||
|
'column-rule-style',
|
||||||
|
'column-rule-width',
|
||||||
|
'column-span',
|
||||||
|
'column-width',
|
||||||
|
'columns',
|
||||||
|
|
||||||
|
// Object fit.
|
||||||
|
'object-fit',
|
||||||
|
'object-position',
|
||||||
|
|
||||||
|
// Regions.
|
||||||
|
'flow-from',
|
||||||
|
'flow-into',
|
||||||
|
'region-fragment',
|
||||||
|
|
||||||
|
// Scroll snap points.
|
||||||
|
'scroll-snap-coordinate',
|
||||||
|
'scroll-snap-destination',
|
||||||
|
'scroll-snap-points-x',
|
||||||
|
'scroll-snap-points-y',
|
||||||
|
'scroll-snap-type',
|
||||||
|
|
||||||
|
// Shapes.
|
||||||
|
'shape-image-threshold',
|
||||||
|
'shape-margin',
|
||||||
|
'shape-outside',
|
||||||
|
|
||||||
|
// Tab size.
|
||||||
|
'tab-size',
|
||||||
|
|
||||||
|
// Text align last.
|
||||||
|
'text-align-last',
|
||||||
|
|
||||||
|
// Text decoration.
|
||||||
|
'text-decoration-color',
|
||||||
|
'text-decoration-line',
|
||||||
|
'text-decoration-skip',
|
||||||
|
'text-decoration-style',
|
||||||
|
|
||||||
|
// Text emphasis.
|
||||||
|
'text-emphasis',
|
||||||
|
'text-emphasis-color',
|
||||||
|
'text-emphasis-position',
|
||||||
|
'text-emphasis-style',
|
||||||
|
|
||||||
|
// Text size adjust.
|
||||||
|
'text-size-adjust',
|
||||||
|
|
||||||
|
// Text spacing.
|
||||||
|
'text-spacing',
|
||||||
|
|
||||||
|
// Transform.
|
||||||
|
'transform',
|
||||||
|
'transform-origin',
|
||||||
|
|
||||||
|
// Transform 3D.
|
||||||
|
'backface-visibility',
|
||||||
|
'perspective',
|
||||||
|
'perspective-origin',
|
||||||
|
'transform-style',
|
||||||
|
|
||||||
|
// Transition.
|
||||||
|
'transition',
|
||||||
|
'transition-delay',
|
||||||
|
'transition-duration',
|
||||||
|
'transition-property',
|
||||||
|
'transition-timing-function',
|
||||||
|
|
||||||
|
// Unicode bidi.
|
||||||
|
'unicode-bidi',
|
||||||
|
|
||||||
|
// User select.
|
||||||
|
'user-select',
|
||||||
|
|
||||||
|
// Writing mode.
|
||||||
|
'writing-mode',
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Values that should be vendorized.
|
||||||
|
/// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org
|
||||||
|
/// @var {list}
|
||||||
|
$vendor-values: (
|
||||||
|
|
||||||
|
// Cross fade.
|
||||||
|
'cross-fade',
|
||||||
|
|
||||||
|
// Element function.
|
||||||
|
'element',
|
||||||
|
|
||||||
|
// Filter function.
|
||||||
|
'filter',
|
||||||
|
|
||||||
|
// Flexbox.
|
||||||
|
'flex',
|
||||||
|
'inline-flex',
|
||||||
|
|
||||||
|
// Grab cursors.
|
||||||
|
'grab',
|
||||||
|
'grabbing',
|
||||||
|
|
||||||
|
// Gradients.
|
||||||
|
'linear-gradient',
|
||||||
|
'repeating-linear-gradient',
|
||||||
|
'radial-gradient',
|
||||||
|
'repeating-radial-gradient',
|
||||||
|
|
||||||
|
// Grid layout.
|
||||||
|
'grid',
|
||||||
|
'inline-grid',
|
||||||
|
|
||||||
|
// Image set.
|
||||||
|
'image-set',
|
||||||
|
|
||||||
|
// Intrinsic width.
|
||||||
|
'max-content',
|
||||||
|
'min-content',
|
||||||
|
'fit-content',
|
||||||
|
'fill',
|
||||||
|
'fill-available',
|
||||||
|
'stretch',
|
||||||
|
|
||||||
|
// Sticky position.
|
||||||
|
'sticky',
|
||||||
|
|
||||||
|
// Transform.
|
||||||
|
'transform',
|
||||||
|
|
||||||
|
// Zoom cursors.
|
||||||
|
'zoom-in',
|
||||||
|
'zoom-out',
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
// Functions.
|
||||||
|
|
||||||
|
/// Removes a specific item from a list.
|
||||||
|
/// @author Hugo Giraudel
|
||||||
|
/// @param {list} $list List.
|
||||||
|
/// @param {integer} $index Index.
|
||||||
|
/// @return {list} Updated list.
|
||||||
|
@function remove-nth($list, $index) {
|
||||||
|
|
||||||
|
$result: null;
|
||||||
|
|
||||||
|
@if type-of($index) != number {
|
||||||
|
@warn "$index: #{quote($index)} is not a number for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else if $index == 0 {
|
||||||
|
@warn "List index 0 must be a non-zero integer for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else if abs($index) > length($list) {
|
||||||
|
@warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`.";
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
|
||||||
|
$result: ();
|
||||||
|
$index: if($index < 0, length($list) + $index + 1, $index);
|
||||||
|
|
||||||
|
@for $i from 1 through length($list) {
|
||||||
|
|
||||||
|
@if $i != $index {
|
||||||
|
$result: append($result, nth($list, $i));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Replaces a substring within another string.
|
||||||
|
/// @author Hugo Giraudel
|
||||||
|
/// @param {string} $string String.
|
||||||
|
/// @param {string} $search Substring.
|
||||||
|
/// @param {string} $replace Replacement.
|
||||||
|
/// @return {string} Updated string.
|
||||||
|
@function str-replace($string, $search, $replace: '') {
|
||||||
|
|
||||||
|
$index: str-index($string, $search);
|
||||||
|
|
||||||
|
@if $index {
|
||||||
|
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $string;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Replaces a substring within each string in a list.
|
||||||
|
/// @param {list} $strings List of strings.
|
||||||
|
/// @param {string} $search Substring.
|
||||||
|
/// @param {string} $replace Replacement.
|
||||||
|
/// @return {list} Updated list of strings.
|
||||||
|
@function str-replace-all($strings, $search, $replace: '') {
|
||||||
|
|
||||||
|
@each $string in $strings {
|
||||||
|
$strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace));
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $strings;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixins.
|
||||||
|
|
||||||
|
/// Wraps @content in vendorized keyframe blocks.
|
||||||
|
/// @param {string} $name Name.
|
||||||
|
@mixin keyframes($name) {
|
||||||
|
|
||||||
|
@-moz-keyframes #{$name} { @content; }
|
||||||
|
@-webkit-keyframes #{$name} { @content; }
|
||||||
|
@-ms-keyframes #{$name} { @content; }
|
||||||
|
@keyframes #{$name} { @content; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Vendorizes a declaration's property and/or value(s).
|
||||||
|
/// @param {string} $property Property.
|
||||||
|
/// @param {mixed} $value String/list of value(s).
|
||||||
|
@mixin vendor($property, $value) {
|
||||||
|
|
||||||
|
// Determine if property should expand.
|
||||||
|
$expandProperty: index($vendor-properties, $property);
|
||||||
|
|
||||||
|
// Determine if value should expand (and if so, add '-prefix-' placeholder).
|
||||||
|
$expandValue: false;
|
||||||
|
|
||||||
|
@each $x in $value {
|
||||||
|
@each $y in $vendor-values {
|
||||||
|
@if $y == str-slice($x, 1, str-length($y)) {
|
||||||
|
|
||||||
|
$value: set-nth($value, index($value, $x), '-prefix-' + $x);
|
||||||
|
$expandValue: true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand property?
|
||||||
|
@if $expandProperty {
|
||||||
|
@each $vendor in $vendor-prefixes {
|
||||||
|
#{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand just the value?
|
||||||
|
@elseif $expandValue {
|
||||||
|
@each $vendor in $vendor-prefixes {
|
||||||
|
#{$property}: #{str-replace-all($value, '-prefix-', $vendor)};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Neither? Treat them as a normal declaration.
|
||||||
|
@else {
|
||||||
|
#{$property}: #{$value};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
70
data/bmk/assets/sass/main.scss
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
@import 'libs/vars';
|
||||||
|
@import 'libs/functions';
|
||||||
|
@import 'libs/mixins';
|
||||||
|
@import 'libs/vendor';
|
||||||
|
@import 'libs/breakpoints';
|
||||||
|
@import 'libs/html-grid';
|
||||||
|
@import 'fontawesome-all.min.css';
|
||||||
|
@import 'https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Stellar by HTML5 UP
|
||||||
|
html5up.net | @ajlkn
|
||||||
|
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Breakpoints.
|
||||||
|
|
||||||
|
@include breakpoints((
|
||||||
|
xlarge: ( 1281px, 1680px ),
|
||||||
|
large: ( 981px, 1280px ),
|
||||||
|
medium: ( 737px, 980px ),
|
||||||
|
small: ( 481px, 736px ),
|
||||||
|
xsmall: ( 361px, 480px ),
|
||||||
|
xxsmall: ( null, 360px )
|
||||||
|
));
|
||||||
|
|
||||||
|
// Mixins.
|
||||||
|
|
||||||
|
@mixin color($p) {
|
||||||
|
@include color-typography($p);
|
||||||
|
@include color-box($p);
|
||||||
|
@include color-button($p);
|
||||||
|
@include color-form($p);
|
||||||
|
@include color-icon($p);
|
||||||
|
@include color-list($p);
|
||||||
|
@include color-section($p);
|
||||||
|
@include color-table($p);
|
||||||
|
@include color-spotlight($p);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base.
|
||||||
|
|
||||||
|
@import 'base/reset';
|
||||||
|
@import 'base/page';
|
||||||
|
@import 'base/typography';
|
||||||
|
|
||||||
|
// Component.
|
||||||
|
|
||||||
|
@import 'components/row';
|
||||||
|
@import 'components/box';
|
||||||
|
@import 'components/button';
|
||||||
|
@import 'components/form';
|
||||||
|
@import 'components/icon';
|
||||||
|
@import 'components/image';
|
||||||
|
@import 'components/list';
|
||||||
|
@import 'components/actions';
|
||||||
|
@import 'components/icons';
|
||||||
|
@import 'components/section';
|
||||||
|
@import 'components/table';
|
||||||
|
@import 'components/features';
|
||||||
|
@import 'components/statistics';
|
||||||
|
@import 'components/spotlight';
|
||||||
|
|
||||||
|
// Layout.
|
||||||
|
|
||||||
|
@import 'layout/header';
|
||||||
|
@import 'layout/nav';
|
||||||
|
@import 'layout/main';
|
||||||
|
@import 'layout/footer';
|
||||||
|
@import 'layout/wrapper';
|
28
data/bmk/assets/sass/noscript.scss
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
@import 'libs/vars';
|
||||||
|
@import 'libs/functions';
|
||||||
|
@import 'libs/mixins';
|
||||||
|
@import 'libs/vendor';
|
||||||
|
@import 'libs/breakpoints';
|
||||||
|
@import 'libs/html-grid';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Stellar by HTML5 UP
|
||||||
|
html5up.net | @ajlkn
|
||||||
|
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
|
||||||
|
#header {
|
||||||
|
body.is-preload & {
|
||||||
|
&.alt {
|
||||||
|
> * {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
@include vendor('transform', 'none');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
data/bmk/content/about.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: БМК-Сервис
|
||||||
|
fragment: about
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
ООО «БМК-Сервис» - отечественная высокотехнологическая компания - разработчик программного обеспечения в области геофизических исследований.
|
||||||
|
|
||||||
|
Компания основана в 2020 году и ее штат состоит из инженеров, программистов, математиков и научных сотрудников. Исследования, разработки, а также тестирование компании размещены в г. Долгопрудный Московской области.
|
||||||
|
|
||||||
|
Мы создаем решения для оптимального планирования морских сейсморазведочных 2D, 3D, и 4D работ. Наша экспертиза позволяет соединить различные аспекты при планировании разведки. Совместный учет геофизических и навигационных особенностей вместе с передовыми практиками программирование позволяет нам создавать передовое программное обеспечение для решений в области оптимального планирования разведывательных работ.
|
||||||
|
|
||||||
|
Разрабатываемое программное обеспечение протестировано с лидирующими отечественными нефтесервисными компаниями, среди которых СКФ Гео и Росгеология, а также защищено свидетельством о государственной регистрации программы для ЭВМ № 2022667423 «Программное обеспечение для моделирования и оптимизации проведения морских сейсморазведочных работ».
|
18
data/bmk/content/lotSeis.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: Решения
|
||||||
|
fragment: solutions
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
|
||||||
|
### Рынок сейсморазведки
|
||||||
|
|
||||||
|
По оценкам, к концу 2030 года мировой рынок сейсморазведки принесет доход в размере 11 658,2 млн долларов США, увеличившись со среднегодовым темпом роста в 3,96%. На рост помимо увеличения спроса на поиск новых залежей нефти и природного газа, развитее Carbon Capture & Storage технологий требует изучение геологических структур под дном морей для создания хранилищ углекислого газа.
|
||||||
|
|
||||||
|
Стоимость сейсморазведки при этом может составлять порядка $100,000 за квадратную милю для 3D работ. При этом основная часть затрат находится в аренде сейсморазведочного судна. Поэтому для уменьшения стоимости работ и увеличения прибыли необходимо производить оптимальное планирование разведки.
|
||||||
|
|
||||||
|
### LotSeis
|
||||||
|
Планирование разведки состоит из нескольких этапов от выдвижения гипотез о геологической структуре и построения области разведки до создания траектории движения сейсморазведочного судна. LotSeis помогает с последней частью.
|
||||||
|
|
||||||
|
LotSeis является продвинутым программным обеспечением, которое автоматизирует и оптимизирует планирование сейсморазведки. LotSeis разделяет планирование на два этапа. Первый основан на геофизическом планировании. Рассчитывается карта разрешений съемки, которая позволяет выбрать более подходящую конфигурацию корабля или изменить область разведки. Второй этап производит оптимизацию навигации. LotSeis позволяет задавать препятствия различных форм и устанавливать для них разные безопасные расстояния. В результате LotSeis создает оптимальный маршрут движения судна, учитывая все физические ограничения и особенности.
|
||||||
|
|
||||||
|
Ядро оптимизации LotSeis основано на продвинутых алгоритмах, симулирующих природные явления. Архитектура ядра позволяет добавлять различные модули, изменяющие решение. Это делает LotSeis гибким решением, которое может подстраиваться под клиента. LotSeis является частью Kotlin-экосистемы, поэтому использует наиболее продвинуты инструменты и технологии.
|
5
data/bmk/content/partners.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
title: Партнеры
|
||||||
|
fragment: partners
|
||||||
|
language: ru
|
||||||
|
---
|
25
data/bmk/content/partnersData.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
content:
|
||||||
|
- title: Институт физики Земли им. О.Ю. Шмидта РАН
|
||||||
|
target: "https://ifz.ru/"
|
||||||
|
image: images/ifz.jpeg
|
||||||
|
- title: Институт океанологии им. П.П. Ширшова
|
||||||
|
target: "https://ocean.ru/"
|
||||||
|
image: images/IMG_8289.jpg
|
||||||
|
- title: ООО «СПЛИТ»
|
||||||
|
target: "https://split-k.com/"
|
||||||
|
image: images/scf.jpg
|
||||||
|
- title: ООО «СКФ ГЕО»
|
||||||
|
target: "https://www.scf-group.ru/"
|
||||||
|
image: images/split.png
|
||||||
|
- title: АО «Морская арктическая геологоразведочная экспедиция»
|
||||||
|
target: "https://mage.ru/ru/"
|
||||||
|
image: images/IMG_8287.jpg
|
||||||
|
- title: АО «Росгеология»
|
||||||
|
target: "https://rusgeology.ru/"
|
||||||
|
image: images/rosgeo.jpeg
|
||||||
|
- title: МФТИ
|
||||||
|
target: "https://mipt.ru/"
|
||||||
|
image: images/IMG_8290.jpg
|
||||||
|
- title: ФГБОУ «Фонд содействия развитию малых форм предприятий в научно-технической сфере»
|
||||||
|
target: "https://fasie.ru/"
|
||||||
|
image: images/IMG_8284.jpg
|
5
data/bmk/content/team/index.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
title: "Команда"
|
||||||
|
fragment: team
|
||||||
|
language: ru
|
||||||
|
---
|
8
data/bmk/content/team/kovalyov.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: team
|
||||||
|
title: Святослав Ковалев
|
||||||
|
image: kovalev.png
|
||||||
|
order: 4
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
Более 15 лет опыта в ИТ-сфере. Участвовал в проектах по разработке CAD-ов, антивирусов. Занимал должности математика-программиста, разработчика в тестировании, инженера-программиста, тимлида, системного аналитика. Выпускник ФГАОУ ВО «Южный федеральный университет».
|
8
data/bmk/content/team/kutcov.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: team
|
||||||
|
title: Сергей Курков
|
||||||
|
image: kurcov.png
|
||||||
|
order: 1
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
Руководитель высокотехнологичных проектов с более чем 10-летним опытом работы. Реализовано более 10 проектов по разработке оборудования и программного обеспечения, организации производства, по заказам нефтяных и нефтесервисных компаний, в том числе международных. Выпускник МФТИ.
|
8
data/bmk/content/team/nozik.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: team
|
||||||
|
title: Александр Нозик
|
||||||
|
image: Nozik.jpg
|
||||||
|
order: 3
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
Более 15 лет опыта в научном программировании. Реализация международных проектов. Руководитель центра Научного программирования МФТИ, заместитель руководителя лаборатории методов ядерной физики в МФТИ, Руководитель исследовательской группы в JetBrains Research, автор образовательных курсов в МФТИ. Выпускник МФТИ.
|
8
data/bmk/content/team/palmin.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: team
|
||||||
|
title: Владимир Пальмин
|
||||||
|
image: palmin.jpeg
|
||||||
|
order: 2
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
Руководитель аналитического отдела Центра Научного Программирования МФТИ. Реализовано более 3 проектов по разработке программного обеспечения, в том числе для международных нефтегазовых компаний. Выпускник МФТИ.
|
8
data/bmk/content/team/razin.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: team
|
||||||
|
title: Андрей Разин
|
||||||
|
image: razin.jpg
|
||||||
|
order: 1.5
|
||||||
|
language: ru
|
||||||
|
---
|
||||||
|
Инженер-геофизик с 32-летним стажем морских геофизических работ, один из ведущих российских специалистов по сейсморазведке в «транзитных» зонах. Выпускник ФГБОУ ВО «Российский государственный геологоразведочный университет имени Серго Орджоникидзе».
|
BIN
data/bmk/images/IMG_8284.jpg
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
data/bmk/images/IMG_8285.jpg
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
data/bmk/images/IMG_8286.jpg
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
data/bmk/images/IMG_8287.jpg
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
data/bmk/images/IMG_8288.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
data/bmk/images/IMG_8289.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
data/bmk/images/IMG_8290.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
data/bmk/images/IMG_8291.jpg
Normal file
After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
BIN
data/bmk/images/Rosgeo_Logo.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
data/bmk/images/fresnel_lands_critdepth2.png
Normal file
After Width: | Height: | Size: 840 KiB |
BIN
data/bmk/images/ifz.jpeg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
data/bmk/images/kovalev.png
Normal file
After Width: | Height: | Size: 299 KiB |
BIN
data/bmk/images/kurcov.png
Normal file
After Width: | Height: | Size: 274 KiB |
BIN
data/bmk/images/palmin.jpeg
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
data/bmk/images/razin.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
data/bmk/images/rosgeo.jpeg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
data/bmk/images/scf.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
data/bmk/images/split.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
data/bmk/images/МАГЭ.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
data/bmk/images/Совкомфлот.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
data/common/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
data/common/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
data/common/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 730 KiB After Width: | Height: | Size: 730 KiB |
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 897 KiB After Width: | Height: | Size: 897 KiB |
BIN
data/common/favicon-16x16.png
Normal file
After Width: | Height: | Size: 226 B |
BIN
data/common/favicon-32x32.png
Normal file
After Width: | Height: | Size: 396 B |
BIN
data/common/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
1
data/common/site.webmanifest
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"name":"Scientific Programming Centre","short_name":"SPC","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|