Compare commits

...

142 Commits

Author SHA1 Message Date
c8f6f9a6f3 Merge pull request 'varvara kaplenko data' (#1) from vviora/varvara_kaplenko:main into main
Reviewed-on: #1
2024-08-10 11:33:17 +03:00
dc0daa2b3e Загрузить файлы в «data/home/images/people» 2024-08-10 11:16:52 +03:00
716dc77922 Загрузить файлы в «data/home/content/people» 2024-08-10 11:16:03 +03:00
8494a9d880 Update plugin version 2023-07-11 13:54:55 +03:00
6d051dc151 Update magprog 2023-04-03 22:27:11 +03:00
e79e363645 Update magprog 2023-04-03 21:13:27 +03:00
b5df13b5ef Fix line endings. Again 2023-03-27 16:24:26 +03:00
5f2439f42a Minor UI fixes 2023-03-27 13:39:19 +03:00
f61bb5cc90 Temporary workaround for resource-based data 2023-03-27 13:23:03 +03:00
1f0d0a8124 Implemented binary propagation 2023-03-27 10:23:25 +03:00
6c384b2d7b Merge branch 'dev' into feature/no-files 2023-03-27 09:41:35 +03:00
269451dbfa Fix text. Add Palmin 2023-03-15 18:42:50 +03:00
0ea7d41b6f Fix line endings and punctuation 2023-03-15 18:31:04 +03:00
9d5db776e9 Fix texts 2023-03-13 21:00:47 +03:00
ba578aa795 Update partens 2023-03-13 18:28:42 +03:00
5fb2c2379e
Merge MIPT-NPM-MR-29: newRITM 2023-03-13 13:33:04 +00:00
742244c92b WIP - working on file-less trees 2023-03-13 16:25:21 +03:00
Aleksandr Svetlichnyy
cad408e215
New file data/magprog/content/mentors/komisov[info].md 2023-03-13 09:08:40 +00:00
Aleksandr Svetlichnyy
817daf00f1
New file data/magprog/content/mentors/komisov.md 2023-03-13 09:07:40 +00:00
Aleksandr Svetlichnyy
8c31d75c7a
upload Komisov photo 2023-03-13 09:02:37 +00:00
Aleksandr Svetlichnyy
67e57353ca
New file data/magprog/content/mentors/kluev[info].md 2023-03-13 08:56:56 +00:00
Aleksandr Svetlichnyy
4e17ec5de9
upload a photo 2023-03-13 08:52:32 +00:00
Aleksandr Svetlichnyy
122303b82d
New file data/magprog/content/mentors/kluev.md 2023-03-13 08:51:56 +00:00
2a5bc95d16 Update mentors 2023-01-23 20:37:48 +03:00
7192f7fafe add BMK site 2023-01-23 20:33:48 +03:00
92b031392a Constants for language access 2023-01-09 11:24:11 +03:00
b11be7df2d Add language support 2023-01-08 21:26:09 +03:00
a1baa33102
Work on language support 2023-01-08 15:58:20 +03:00
e636d70c51
Update courses 2022-12-21 23:43:46 +03:00
fa294bef0f
Update member pages. Add date 2022-12-21 23:26:27 +03:00
ade8f61aa0
Update icons and page names 2022-10-04 12:55:05 +03:00
SPC-code
38b6147794
Merge pull request #8 from GregTheMadMonk/layout-fixes
Minor layout fixes
2022-10-04 12:02:09 +03:00
1756f0d6b1 Improve "Centre was created..." position on the main page
Improve the underlined image links fix
2022-09-27 02:30:47 +03:00
6f6960f8b8 Fix ul having too much bottom margin as last child in blockquote 2022-09-27 02:08:55 +03:00
6da4a70a1a Add 'All rights reserved' after 'SPC' to all footers 2022-09-27 02:04:18 +03:00
37156c79ad Remove underline from image links 2022-09-27 01:59:33 +03:00
950903c938 Update .gitignore 2022-09-27 01:32:03 +03:00
57d4f12f7f Replace list padding-left with list-style-position
Fixes the issue with list bullet points overlapping `float:left` images
2022-09-26 23:23:57 +03:00
f3eb441c61 Same as previous commit, but for /magprog 2022-09-26 22:56:11 +03:00
a6836c8516 Fix content overlapping footer on /people/* pages
Also, add executable permissions to gradlew

Known side-effects:
* "Centre was created..." on the home page now takes a little bit more
  vertical space
2022-09-26 22:37:39 +03:00
9284e107d7
Update education pages 2022-09-03 18:39:06 +03:00
38e739c5c4
Add forward headers 2022-09-03 15:40:37 +03:00
6d3d0420dd
Add forward headers 2022-09-03 14:11:36 +03:00
9e87eddcb6
Update build tools and DF 2022-09-03 11:54:56 +03:00
3896c13136 Merge MIPT-NPM-MR-25: dev 2022-07-19 15:06:48 +00:00
95714e4b40 add deployment configuration 2022-07-07 17:15:51 +00:00
2b5af660af
Quick-fix for sharing common data 2022-07-03 17:13:39 +03:00
7975a2072e
Add publishing 2022-07-03 16:39:38 +03:00
5e93f982f8
Spliting site and the snark project complete 2022-07-03 16:28:53 +03:00
eb81d46238
Spliting site and the snark project 2022-06-30 20:51:57 +03:00
4024eed50f
Update readme 2022-06-26 13:14:57 +03:00
4066712014
Final fix for static rendering 2022-06-26 12:46:12 +03:00
d3a6ab658a
Add ref resolution to basic page features 2022-06-26 12:32:22 +03:00
bf884732c1
Add text preprocessors 2022-06-25 23:27:29 +03:00
781b185349
Yet another bug with context receivers 2022-06-25 13:07:52 +03:00
f530b7605b
Fixing static gen after refactor 2022-06-24 18:46:15 +03:00
072655ac51
Complete refactor to new routing API 2022-06-24 17:54:52 +03:00
218e76a2a8
Complete refactor to new routing API 2022-06-24 17:23:08 +03:00
c15a0ea948
Complete refactor to new routing API 2022-06-24 16:39:10 +03:00
43bf8e8e96
Add Https redirect 2022-06-23 11:02:26 +03:00
846c02020b
Multiple engine logic cleanup 2022-06-23 10:44:16 +03:00
d657282a33
Resolving paths for static sites. 2022-06-22 23:35:16 +03:00
bafc75086a
Implementation for static site generator 2022-06-22 22:14:19 +03:00
d74c8be135
Merge remote-tracking branch 'origin/main' into dev
# Conflicts:
#	src/main/kotlin/ru/mipt/spc/master.kt
2022-06-22 21:39:30 +03:00
9fd4620947
Fix all errors with new SNARK architecture. 2022-06-22 21:37:22 +03:00
4966bfc9b3
Refactor page placement. 2022-06-22 12:18:35 +03:00
0a28331e05 Remove homepage link at matrts, it breaks the code 2022-06-21 13:37:03 +03:00
600a9b5529
Refactor snark part 2022-06-21 10:52:24 +03:00
285057fbb0
bug in PagesFrom 2022-06-20 20:32:44 +03:00
23a736a012
Refactor SPC home page to use decoupled representation from KTor 2022-06-20 17:10:37 +03:00
a907c57134
Separating from KTor 2022-06-20 14:11:41 +03:00
e9f71cdab9
fix links 2022-06-20 12:11:13 +03:00
4484bbfac7
Simplify deploy logic 2022-06-20 11:55:18 +03:00
cfc7fa5161
Add clarification to message 2022-06-20 11:05:13 +03:00
3f27061e25
Consulting page update 2022-06-20 11:04:37 +03:00
e02d218d1a
Research content update 2022-06-20 10:58:07 +03:00
fa9c042c75
Fix directory name in deploy 2022-06-19 21:41:51 +03:00
3a25c37a47
fix deploy task separator 2022-06-19 21:11:10 +03:00
895ca5f76a
Add readme 2022-06-19 20:49:20 +03:00
2324e9d81b
Fix deploy 2022-06-19 19:36:48 +03:00
2990e2f28f fix secrets names 2022-06-19 11:27:52 +00:00
892fa009e7 Change image 2022-06-19 11:25:29 +00:00
696ca38efe
Another attempt on deploy 2022-06-19 14:18:44 +03:00
a5121b8637 Experiment with CD 2022-06-16 06:58:17 +00:00
84848f611e Update CD 2022-06-15 17:40:33 +00:00
ddc0f58b34 Update CD 2022-06-15 17:37:04 +00:00
679d993b6d Update CD 2022-06-15 16:53:13 +00:00
8a1deab1f7 update CD 2022-06-15 16:44:42 +00:00
9495fdb96e Update CD 2022-06-15 16:39:31 +00:00
4f85177c0a Update CD 2022-06-15 16:37:21 +00:00
5e1625d98c Update CD 2022-06-15 16:29:59 +00:00
0f223da648 Update CD 2022-06-15 16:18:29 +00:00
ba883b5b11
Update consulting and magprog 2022-06-15 14:53:36 +03:00
8bc8f5348d
Always update build date 2022-06-08 19:07:20 +03:00
72c3dc87df
Fix name for Efanov 2022-06-08 19:00:53 +03:00
6e8a6c46c2
Update master's mentors 2022-06-08 18:37:54 +03:00
Tatiana Muhina
4d127f500d image 2022-06-08 09:53:09 +00:00
Tatiana Muhina
d4704211db New file data/magprog/content/mentors/Efanov[info].md 2022-06-08 09:51:53 +00:00
Tatiana Muhina
93a0a7534a correction 2022-06-08 09:46:49 +00:00
Tatiana Muhina
a9d77bd4c7 New file data/magprog/content/mentors/Efanov.md 2022-06-08 09:38:54 +00:00
def1ef13ff
Update consulting.md 2022-06-01 10:47:00 +03:00
6bcf7d6092 update CD 2022-05-27 07:40:25 +00:00
72bd67797c
Fix task outputs for build date 2022-05-26 22:57:55 +03:00
1c3fb97826
Fix task outputs for build date 2022-05-26 21:48:56 +03:00
d06cc8d359 update CD 2022-05-26 15:27:50 +00:00
7826311893 Update CD 2022-05-26 14:53:09 +00:00
c75cbe7217 update CD 2022-05-26 14:15:24 +00:00
56822a3644 Refactor masters 2022-05-26 11:55:50 +03:00
a85322231e
Merge remote-tracking branch 'origin/main' 2022-05-25 22:38:35 +03:00
21f2d82289
Update deployment options 2022-05-25 22:38:18 +03:00
7563693259 Fix typo in shell script 2022-05-25 19:06:15 +00:00
54803df50d update CD 2022-05-25 19:00:18 +00:00
7e0ce0254c
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	.space.kts
2022-05-25 21:53:42 +03:00
99eab81cb3
update CD 2022-05-25 21:52:55 +03:00
73949a23cb
Add FPMI label 2022-05-25 21:23:56 +03:00
2be1e9c275 update CD 2022-05-25 17:34:17 +00:00
98ad36d777 update CD 2022-05-25 17:28:59 +00:00
2ed8586cb1 update build 2022-05-25 16:18:00 +00:00
e8b9a35a61
Update CD 2022-05-25 18:40:23 +03:00
060583a418
Update mentors and emails 2022-05-25 18:28:30 +03:00
62380ddc65 Merge MIPT-NPM-MR-21: muhina 2022-05-25 14:50:57 +00:00
Tatiana Muhina
d09dcf4439 kharuk 2022-05-25 14:25:41 +00:00
Tatiana Muhina
2cc9c3296e New file data/magprog/content/mentors/kharuk[info].md 2022-05-25 14:24:44 +00:00
Tatiana Muhina
9b7a5d7e27 name 2022-05-25 14:22:05 +00:00
Tatiana Muhina
fed8e765c6 New file data/magprog/content/mentors/Kharuk.md 2022-05-25 14:21:33 +00:00
Tatiana Muhina
30157c4b18 New file data/magprog/content/mentors/kondratov[info].md 2022-05-25 14:12:48 +00:00
Tatiana Muhina
8dbbfafacc New file data/magprog/content/mentors/kondratov.md 2022-05-25 14:10:06 +00:00
Tatiana Muhina
3fa69b7594 image by tinkoff mentor 2022-05-25 14:01:11 +00:00
18ba3587e3
Update research 2022-05-25 12:59:39 +03:00
ccc68b614f
Some fixes at masters 2022-05-24 21:39:01 +03:00
b92f880ce4
Moving files around 2022-05-22 16:52:36 +03:00
2d98770984 Merge MIPT-NPM-MR-20: muhina 2022-05-22 11:51:39 +00:00
d88036c1bb
Add break in the moto 2022-05-21 20:10:44 +03:00
120989a333
Large content update 2022-05-21 19:21:21 +03:00
Tatiana Muhina
3597298bdb images 2022-05-21 15:41:35 +00:00
Tatiana Muhina
c638ffe1bd New file data/magprog/content/mentors/svetlichny[info].md 2022-05-21 15:35:15 +00:00
Tatiana Muhina
cc27baf248 New file data/magprog/content/mentors/nizovtseva[info].md 2022-05-21 15:24:40 +00:00
Tatiana Muhina
54729d259b New file data/magprog/content/mentors/nizovtseva.md 2022-05-21 14:44:45 +00:00
Tatiana Muhina
95889ef87f New file data/magprog/content/mentors/svetlichny.md 2022-05-21 14:38:15 +00:00
fd5b4f0b23
Research + Team 2022-05-21 13:38:15 +03:00
bfd865727b
language as string 2022-05-14 11:08:28 +03:00
d4236a65b8
home page added 2022-05-13 17:21:06 +03:00
341 changed files with 22462 additions and 5020 deletions

43
.gitignore vendored
View File

@ -1,39 +1,10 @@
.gradle
.gradle/
build/
.idea/
/logs/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
/deploy.ps1
### STS ###
.apt_generated
.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/
.sass-cache
*.css.map

36
.space.kts Normal file
View 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
View 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/

View File

@ -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 {
id("ru.mipt.npm.gradle.project")
id("ru.mipt.npm.gradle.jvm")
id("space.kscience.gradle.project")
id("space.kscience.gradle.jvm")
id("space.kscience.snark")
application
}
//repositories{
// mavenLocal()
//}
group = "ru.mipt.npm"
version = "0.0.1-SNAPSHOT"
group = "center.sciprog"
version = "0.1.0"
application {
mainClass.set("ru.mipt.spc.ApplicationKt")
mainClass.set("io.ktor.server.netty.EngineMain")
val isDevelopment: Boolean = project.ext.has("development")
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment", "-Xmx200M")
}
val dataforgeVersion by extra("0.6.0-dev-6")
val snarkVersion: String by extra
val ktorVersion = KScienceVersions.ktorVersion
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
implementation("io.ktor:ktor-server-core:$ktorVersion")
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("space.kscience:snark-ktor:$snarkVersion")
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("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")
}
kotlin {
explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled
sourceSets.all {
languageSettings {
languageVersion = "1.7"
apiVersion = "1.7"
}
apiValidation{
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 {
main {
resources.srcDir(project.rootDir.resolve("data"))
val staticSite by tasks.creating(JavaExec::class){
doFirst {
buildDir.resolve("public").deleteRecursively()
}
group = "application"
mainClass.set("center.sciprog.StaticRenderKt")
classpath = sourceSets["main"].runtimeClasspath
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

3785
data/bmk/assets/css/main.css Normal file

File diff suppressed because it is too large Load Diff

View 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
View 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
View 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

File diff suppressed because one or more lines are too long

View 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);

View 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
View 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
View 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);

View 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');
}
}
}

View 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;
}

View 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;

View 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;
}
}
}
}
}
}
}

View 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;

View 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;

View 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);
}
}
}
}

View 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;

View 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;

View 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;
}
}
}

View 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%;
}
}
}

View 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;

View 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');
}
}

View 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;

View 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;

View 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;
}
}
}
}

View 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;

View 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);
}
}

View 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)');
}
}
}
}

View 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;
}
}
}
}
}

View 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;
}
}
}

View 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%;
}
}

View 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;
}
}

View 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...);
}

View 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;
}
}
}
}
}
}

View 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}");
}

View 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
);

View 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};
}
}

View 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';

View 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
View File

@ -0,0 +1,12 @@
---
title: БМК-Сервис
fragment: about
language: ru
---
ООО «БМК-Сервис» - отечественная высокотехнологическая компания - разработчик программного обеспечения в области геофизических исследований.
Компания основана в 2020 году и ее штат состоит из инженеров, программистов, математиков и научных сотрудников. Исследования, разработки, а также тестирование компании размещены в г. Долгопрудный Московской области.
Мы создаем решения для оптимального планирования морских сейсморазведочных 2D, 3D, и 4D работ. Наша экспертиза позволяет соединить различные аспекты при планировании разведки. Совместный учет геофизических и навигационных особенностей вместе с передовыми практиками программирование позволяет нам создавать передовое программное обеспечение для решений в области оптимального планирования разведывательных работ.
Разрабатываемое программное обеспечение протестировано с лидирующими отечественными нефтесервисными компаниями, среди которых СКФ Гео и Росгеология, а также защищено свидетельством о государственной регистрации программы для ЭВМ № 2022667423 «Программное обеспечение для моделирования и оптимизации проведения морских сейсморазведочных работ».

View 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-экосистемы, поэтому использует наиболее продвинуты инструменты и технологии.

View File

@ -0,0 +1,5 @@
---
title: Партнеры
fragment: partners
language: ru
---

View 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

View File

@ -0,0 +1,5 @@
---
title: "Команда"
fragment: team
language: ru
---

View File

@ -0,0 +1,8 @@
---
type: team
title: Святослав Ковалев
image: kovalev.png
order: 4
language: ru
---
Более 15 лет опыта в ИТ-сфере. Участвовал в проектах по разработке CAD-ов, антивирусов. Занимал должности математика-программиста, разработчика в тестировании, инженера-программиста, тимлида, системного аналитика. Выпускник ФГАОУ ВО «Южный федеральный университет».

View File

@ -0,0 +1,8 @@
---
type: team
title: Сергей Курков
image: kurcov.png
order: 1
language: ru
---
Руководитель высокотехнологичных проектов с более чем 10-летним опытом работы. Реализовано более 10 проектов по разработке оборудования и программного обеспечения, организации производства, по заказам нефтяных и нефтесервисных компаний, в том числе международных. Выпускник МФТИ.

View File

@ -0,0 +1,8 @@
---
type: team
title: Александр Нозик
image: Nozik.jpg
order: 3
language: ru
---
Более 15 лет опыта в научном программировании. Реализация международных проектов. Руководитель центра Научного программирования МФТИ, заместитель руководителя лаборатории методов ядерной физики в МФТИ, Руководитель исследовательской группы в JetBrains Research, автор образовательных курсов в МФТИ. Выпускник МФТИ.

View File

@ -0,0 +1,8 @@
---
type: team
title: Владимир Пальмин
image: palmin.jpeg
order: 2
language: ru
---
Руководитель аналитического отдела Центра Научного Программирования МФТИ. Реализовано более 3 проектов по разработке программного обеспечения, в том числе для международных нефтегазовых компаний. Выпускник МФТИ.

View File

@ -0,0 +1,8 @@
---
type: team
title: Андрей Разин
image: razin.jpg
order: 1.5
language: ru
---
Инженер-геофизик с 32-летним стажем морских геофизических работ, один из ведущих российских специалистов по сейсморазведке в «транзитных» зонах. Выпускник ФГБОУ ВО «Российский государственный геологоразведочный университет имени Серго Орджоникидзе».

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 KiB

BIN
data/bmk/images/ifz.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
data/bmk/images/kovalev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

BIN
data/bmk/images/kurcov.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

BIN
data/bmk/images/palmin.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
data/bmk/images/razin.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
data/bmk/images/rosgeo.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
data/bmk/images/scf.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
data/bmk/images/split.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 730 KiB

After

Width:  |  Height:  |  Size: 730 KiB

View File

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 141 KiB

View File

Before

Width:  |  Height:  |  Size: 897 KiB

After

Width:  |  Height:  |  Size: 897 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

BIN
data/common/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View 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"}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More