Compare commits
2 commits
3d7ef57e7b
...
3a54a5515d
Author | SHA1 | Date | |
---|---|---|---|
gil | 3a54a5515d | ||
gil | 45ba56c49d |
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "gils-nexus",
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.3",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
|
|
@ -1,78 +1,4 @@
|
|||
/*
|
||||
|
||||
COLORS
|
||||
===============================================================================
|
||||
|
||||
*/
|
||||
/*
|
||||
Flexoki (https://stephango.com/flexoki)
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Steph Ango
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
/*
|
||||
|
||||
FONT: LINUX LIBERTINE
|
||||
===============================================================================
|
||||
License: GPL and OFL 1.1
|
||||
|
||||
For license text, see:
|
||||
- https://gils.nexus/font/GPL.txt
|
||||
- https://gils.nexus/font/OFL-1.1.txt
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
src: local("Linux Libertine"), url("../font/LinLibertine_Rah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local("Linux Libertine Semibold"), url("../font/LinLibertine_RZah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local("Linux Libertine Bold"), url("../font/LinLibertine_RBah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
src: local("Linux Libertine Italic"), url("../font/LinLibertine_RIah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: local("Linux Libertine Semibold Italic"), url("../font/LinLibertine_RZIah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: local("Linux Libertine Bold Italic"), url("../font/LinLibertine_RBIah.ttf");
|
||||
}
|
||||
/* IMPORTS ================================================================= */
|
||||
.markup {
|
||||
word-wrap: break-word;
|
||||
line-height: 1.7;
|
||||
|
@ -149,8 +75,84 @@ _vars.scss
|
|||
*******************************************************************************
|
||||
Global variables for the entire website
|
||||
============================================================================ */
|
||||
/* MEDIA BREAKPOINTS ======================================================= */
|
||||
/* SPACING ================================================================= */
|
||||
/* FONT SIZING ============================================================= */
|
||||
/*
|
||||
|
||||
COLORS
|
||||
===============================================================================
|
||||
|
||||
*/
|
||||
/*
|
||||
Flexoki (https://stephango.com/flexoki)
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Steph Ango
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
/*
|
||||
|
||||
FONT: LINUX LIBERTINE
|
||||
===============================================================================
|
||||
License: GPL and OFL 1.1
|
||||
|
||||
For license text, see:
|
||||
- https://gils.nexus/font/GPL.txt
|
||||
- https://gils.nexus/font/OFL-1.1.txt
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
src: local("Linux Libertine"), url("../font/LinLibertine_Rah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: local("Linux Libertine Semibold"), url("../font/LinLibertine_RZah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local("Linux Libertine Bold"), url("../font/LinLibertine_RBah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
src: local("Linux Libertine Italic"), url("../font/LinLibertine_RIah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: local("Linux Libertine Semibold Italic"), url("../font/LinLibertine_RZIah.ttf");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Linux Libertine";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: local("Linux Libertine Bold Italic"), url("../font/LinLibertine_RBIah.ttf");
|
||||
}
|
||||
html {
|
||||
font-size: 12pt;
|
||||
font-family: "Linux Libertine", "Times New Roman", Times, serif;
|
||||
|
@ -160,7 +162,7 @@ body {
|
|||
display: grid;
|
||||
padding: 2em;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
body {
|
||||
grid-template-columns: 2fr 3fr 2fr;
|
||||
height: 100%;
|
||||
|
@ -180,7 +182,7 @@ main,
|
|||
article {
|
||||
font-size: 1rem;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
main,
|
||||
article {
|
||||
grid-row: 2;
|
||||
|
@ -195,7 +197,7 @@ article .gba-portrait {
|
|||
height: auto;
|
||||
max-width: 192px;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
main .gba-portrait,
|
||||
article .gba-portrait {
|
||||
float: right;
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"sourceRoot":"","sources":["../scss/_colors.scss","../scss/_fonts.scss","../scss/_classes.scss","../scss/_vars.scss","../scss/global.scss","../scss/_mixins.scss"],"names":[],"mappings":"AACA;;AAAA;AAAA;;AAAA;AAOA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACRA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAaA;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;ACxDF;EACE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAGF;AAAA;AAAA;EAGE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AChFJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAGA;ACHA;EAEI,WDEa;ECDb,aDEe;;;ACEnB;EACE;EACA;;ACCA;EDHF;IAII;IACA;IACA;;EAEA;IACE;IACA;;EAGF;IACE;IACA;;;;AAKN;AAAA;EAEE;;ACnBA;EDiBF;AAAA;IAII;IACA;;;AAGF;AAAA;EACE;EACA;EACA;EACA;EACA;;AC9BF;EDyBA;AAAA;IAOI;IACA;;;;AAKN;EACE;;;AAGF;EACE;;AAEA;EACE;;;AAIJ;EACE;EACA","file":"global.css"}
|
||||
{"version":3,"sourceRoot":"","sources":["../scss/global.scss","../scss/_classes.scss","../scss/_vars.scss","../scss/_colors.scss","../scss/_fonts.scss","../scss/include/_include-media.scss"],"names":[],"mappings":"AAEA;ACFA;EACE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAGF;AAAA;AAAA;EAGE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AChFJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAGA;AAGA;ACXA;;AAAA;AAAA;;AAAA;AAOA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACRA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAaA;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;AJnCF;EAEI,WEVa;EFWb,aEVe;;;AFcnB;EACE;EACA;;AKmkBE;ELrkBJ;IAII;IACA;IACA;;EAEA;IACE;IACA;;EAGF;IACE;IACA;;;;AAKN;AAAA;EAEE;;AK+iBE;ELjjBJ;AAAA;IAII;IACA;;;AAGF;AAAA;EACE;EACA;EACA;EACA;EACA;;AKoiBA;ELziBF;AAAA;IAOI;IACA;;;;AAKN;EACE;;;AAGF;EACE;;AAEA;EACE;;;AAIJ;EACE;EACA","file":"global.css"}
|
|
@ -1,4 +1,83 @@
|
|||
/* IMPORTS ================================================================= */
|
||||
.markup {
|
||||
word-wrap: break-word;
|
||||
line-height: 1.7;
|
||||
padding: 0 1.5em;
|
||||
}
|
||||
.markup p,
|
||||
.markup blockquote,
|
||||
.markup ul,
|
||||
.markup ol,
|
||||
.markup dl,
|
||||
.markup table,
|
||||
.markup pre {
|
||||
margin: 1em 0;
|
||||
}
|
||||
.markup ul,
|
||||
.markup ol {
|
||||
all: revert;
|
||||
padding-left: 30px;
|
||||
}
|
||||
.markup h1 {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
.markup h2 {
|
||||
font-size: 2em;
|
||||
}
|
||||
.markup h3 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.markup h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.markup h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
.markup h6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
.markup h1,
|
||||
.markup h2,
|
||||
.markup h3,
|
||||
.markup h4,
|
||||
.markup h5,
|
||||
.markup h6 {
|
||||
margin: 0.5em 0 0.25em 0;
|
||||
}
|
||||
.markup h1 + p,
|
||||
.markup h2 + p,
|
||||
.markup h3 + p {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
.markup img {
|
||||
max-width: 100%;
|
||||
}
|
||||
.markup code,
|
||||
.markup pre {
|
||||
background-color: #f8f8f8;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #ddd;
|
||||
font-family: monospace;
|
||||
font-size: 12px;
|
||||
margin: 0 2px;
|
||||
padding: 0 5px;
|
||||
white-space: pre;
|
||||
}
|
||||
.markup pre code {
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
_vars.scss
|
||||
*******************************************************************************
|
||||
Global variables for the entire website
|
||||
============================================================================ */
|
||||
/* MEDIA BREAKPOINTS ======================================================= */
|
||||
/* SPACING ================================================================= */
|
||||
/* FONT SIZING ============================================================= */
|
||||
/*
|
||||
|
||||
COLORS
|
||||
|
@ -74,85 +153,6 @@ For license text, see:
|
|||
font-weight: 700;
|
||||
src: local("Linux Libertine Bold Italic"), url("../font/LinLibertine_RBIah.ttf");
|
||||
}
|
||||
.markup {
|
||||
word-wrap: break-word;
|
||||
line-height: 1.7;
|
||||
padding: 0 1.5em;
|
||||
}
|
||||
.markup p,
|
||||
.markup blockquote,
|
||||
.markup ul,
|
||||
.markup ol,
|
||||
.markup dl,
|
||||
.markup table,
|
||||
.markup pre {
|
||||
margin: 1em 0;
|
||||
}
|
||||
.markup ul,
|
||||
.markup ol {
|
||||
all: revert;
|
||||
padding-left: 30px;
|
||||
}
|
||||
.markup h1 {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
.markup h2 {
|
||||
font-size: 2em;
|
||||
}
|
||||
.markup h3 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.markup h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.markup h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
.markup h6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
.markup h1,
|
||||
.markup h2,
|
||||
.markup h3,
|
||||
.markup h4,
|
||||
.markup h5,
|
||||
.markup h6 {
|
||||
margin: 0.5em 0 0.25em 0;
|
||||
}
|
||||
.markup h1 + p,
|
||||
.markup h2 + p,
|
||||
.markup h3 + p {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
.markup img {
|
||||
max-width: 100%;
|
||||
}
|
||||
.markup code,
|
||||
.markup pre {
|
||||
background-color: #f8f8f8;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #ddd;
|
||||
font-family: monospace;
|
||||
font-size: 12px;
|
||||
margin: 0 2px;
|
||||
padding: 0 5px;
|
||||
white-space: pre;
|
||||
}
|
||||
.markup pre code {
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
/* IMPORTS ================================================================= */
|
||||
/******************************************************************************
|
||||
_vars.scss
|
||||
*******************************************************************************
|
||||
Global variables for the entire website
|
||||
============================================================================ */
|
||||
/* SPACING ================================================================= */
|
||||
/* FONT SIZING ============================================================= */
|
||||
html {
|
||||
font-size: 12pt;
|
||||
font-family: "Linux Libertine", "Times New Roman", Times, serif;
|
||||
|
@ -162,7 +162,7 @@ body {
|
|||
display: grid;
|
||||
padding: 2em;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
body {
|
||||
grid-template-columns: 2fr 3fr 2fr;
|
||||
gap: 1em;
|
||||
|
@ -179,7 +179,7 @@ nav {
|
|||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
nav {
|
||||
grid-column: 2;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ nav a::after {
|
|||
font-style: normal;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
main {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
|
@ -212,7 +212,7 @@ aside {
|
|||
grid-column: 1;
|
||||
max-width: 192px;
|
||||
}
|
||||
@media screen and (min-width: 768px) {
|
||||
@media (min-width: 769px) {
|
||||
aside {
|
||||
grid-column: 2;
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"sourceRoot":"","sources":["../scss/landing.scss","../scss/_colors.scss","../scss/_fonts.scss","../scss/_classes.scss","../scss/_vars.scss","../scss/_mixins.scss"],"names":[],"mappings":"AAEA;ACDA;;AAAA;AAAA;;AAAA;AAOA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACRA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAaA;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;ACxDF;EACE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAGF;AAAA;AAAA;EAGE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AH9EJ;AIFA;AAAA;AAAA;AAAA;AAAA;AAMA;AAGA;AJEA;EAEI,WIHa;EJIb,aIHe;;;AJOnB;EACE;EACA;;AKJA;ELEF;IAII;IACA,KIhBK;IJiBL;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AKnBA;ELaF;IAQI;;;AAIA;EACE;;AAGF;EACE;EACA;;;AK/BJ;ELoCF;IAEI;IACA;IACA;;;AAGF;EACE;EACA;;AAEA;EACE;;;AAKN;EACE;EACA;EACA;;AKxDA;ELqDF;IAKI;;;AAGF;EACE","file":"landing.css"}
|
||||
{"version":3,"sourceRoot":"","sources":["../scss/landing.scss","../scss/_classes.scss","../scss/_vars.scss","../scss/_colors.scss","../scss/_fonts.scss","../scss/include/_include-media.scss"],"names":[],"mappings":"AAEA;ACFA;EACE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAGF;AAAA;AAAA;EAGE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AChFJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAGA;AAGA;ACXA;;AAAA;AAAA;;AAAA;AAOA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACRA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAaA;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;AJnCF;EAEI,WEVa;EFWb,aEVe;;;AFcnB;EACE;EACA;;AKmkBE;ELrkBJ;IAII;IACA,KEvBK;IFwBL;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AKojBE;EL1jBJ;IAQI;;;AAIA;EACE;;AAGF;EACE;EACA;;;AKwiBF;ELniBJ;IAEI;IACA;IACA;;;AAGF;EACE;EACA;;AAEA;EACE;;;AAKN;EACE;EACA;EACA;;AK+gBE;ELlhBJ;IAKI;;;AAGF;EACE","file":"landing.css"}
|
15
src/posts/index.md
Normal file
15
src/posts/index.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: Blog
|
||||
permalink: /blog/
|
||||
override:tags: []
|
||||
eleventyNavigation:
|
||||
key: Blog
|
||||
order: 2
|
||||
---
|
||||
|
||||
{%- for post in collections.blog reversed -%}
|
||||
{% if forloop.first == true %}<ul>{% endif %}
|
||||
<li><a href="{{ post.url }}">{{ post.data.title }}</a>
|
||||
— <i>updated <time datetime="{{ post.date | formatDate }}">{{ post.date | formatDate }}</time></i></li>
|
||||
{% if forloop.last == true %}</ul>{% endif %}
|
||||
{%- endfor -%}
|
3
src/posts/posts.json
Normal file
3
src/posts/posts.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"tags": "blog"
|
||||
}
|
|
@ -1,68 +1,4 @@
|
|||
// src/scss/_colors.scss
|
||||
/*
|
||||
|
||||
COLORS
|
||||
===============================================================================
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Flexoki (https://stephango.com/flexoki)
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Steph Ango
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
$paper: rgb(255, 252, 240);
|
||||
$base-50: rgb(242, 240, 229);
|
||||
$base-100: rgb(230, 228, 217);
|
||||
$base-150: rgb(218, 216, 206);
|
||||
$base-200: rgb(206, 205, 195);
|
||||
$base-300: rgb(183, 181, 172);
|
||||
$base-500: rgb(135, 133, 128);
|
||||
$base-600: rgb(111, 110, 105);
|
||||
$base-700: rgb(87, 86, 83);
|
||||
$base-800: rgb(64, 62, 60);
|
||||
$base-850: rgb(52, 51, 49);
|
||||
$base-900: rgb(40, 39, 38);
|
||||
$base-950: rgb(28, 27, 26);
|
||||
$black: rgb(16, 15, 15);
|
||||
|
||||
$red-400: rgb(209, 77, 65);
|
||||
$red-600: rgb(175, 48, 41);
|
||||
$orange-400: rgb(218, 112, 44);
|
||||
$orange-600: rgb(188, 82, 21);
|
||||
$yellow-400: rgb(208, 162, 21);
|
||||
$yellow-600: rgb(173, 131, 1);
|
||||
$green-400: rgb(135, 154, 57);
|
||||
$green-600: rgb(102, 128, 11);
|
||||
$cyan-400: rgb(58, 169, 159);
|
||||
$cyan-600: rgb(36, 131, 123);
|
||||
$blue-400: rgb(67, 133, 190);
|
||||
$blue-600: rgb(32, 94, 166);
|
||||
$purple-400: rgb(139, 126, 200);
|
||||
$purple-600: rgb(94, 64, 157);
|
||||
$magenta-400: rgb(206, 93, 151);
|
||||
$magenta-600: rgb(160, 47, 111);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// _colors.scss
|
||||
|
||||
$background: #141013;
|
||||
$text: $paper;
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
/*
|
||||
// _fonts.scss
|
||||
/* ============================================================================
|
||||
FONT SOURCES
|
||||
============================================================================ */
|
||||
|
||||
FONT: LINUX LIBERTINE
|
||||
===============================================================================
|
||||
License: GPL and OFL 1.1
|
||||
/* Linux Libertine ------------------------------------------------------------
|
||||
|
||||
For license text, see:
|
||||
Licensed under GPL and OFL 1.1
|
||||
|
||||
Full license texts:
|
||||
- https://gils.nexus/font/GPL.txt
|
||||
- https://gils.nexus/font/OFL-1.1.txt
|
||||
|
||||
*/
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
// Normal
|
||||
@font-face {
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
@use "colors";
|
||||
|
||||
$breakpoints: (
|
||||
"sm": 600px,
|
||||
"md": 768px,
|
||||
"lg": 992px,
|
||||
"xl": 1200px,
|
||||
);
|
||||
|
||||
@mixin breakpoint($mq-breakpoint, $mq-breakpoints: $breakpoints) {
|
||||
// If $mq-breakpoint is a key that exists in $mq-breakpoints, get and use the value
|
||||
@if map-has-key($mq-breakpoints, $mq-breakpoint) {
|
||||
$mq-breakpoint: map-get($mq-breakpoints, $mq-breakpoint);
|
||||
}
|
||||
|
||||
// Place everything inside this mixin under the appropriate @media rule
|
||||
@media screen and (min-width: #{$mq-breakpoint}) {
|
||||
@content;
|
||||
}
|
||||
}
|
|
@ -1,12 +1,17 @@
|
|||
/******************************************************************************
|
||||
_vars.scss
|
||||
*******************************************************************************
|
||||
Global variables for the entire website
|
||||
// _vars.scss
|
||||
/* ============================================================================
|
||||
GLOBAL VARIABLES
|
||||
============================================================================ */
|
||||
|
||||
/* SPACING ================================================================= */
|
||||
/* Media breakpoints ------------------------------------------------------- */
|
||||
|
||||
|
||||
/* Spacing ----------------------------------------------------------------- */
|
||||
$gutter: 1em;
|
||||
|
||||
/* FONT SIZING ============================================================= */
|
||||
/* Typography -------------------------------------------------------------- */
|
||||
$leading: 1.7;
|
||||
|
||||
/* -- Font ----------------------------------------------------------------- */
|
||||
$font-base-size: 12pt;
|
||||
$font-stack-serif: "Linux Libertine", "Times New Roman", Times, serif;
|
||||
|
|
|
@ -1,8 +1,22 @@
|
|||
@use "colors";
|
||||
@use "fonts";
|
||||
@use "mixins" as *;
|
||||
// global.scss
|
||||
|
||||
/* IMPORTS ================================================================= */
|
||||
@use "sass:math";
|
||||
|
||||
@use "modules/include-media" as * with (
|
||||
$breakpoints: (
|
||||
xs: 0,
|
||||
sm: 640px,
|
||||
md: 768px,
|
||||
lg: 1024px,
|
||||
xl: 1280px,
|
||||
2xl: 1536px,
|
||||
)
|
||||
);
|
||||
|
||||
@use "classes" as *;
|
||||
@use "vars" as *;
|
||||
@use "fonts";
|
||||
|
||||
html {
|
||||
font: {
|
||||
|
@ -14,7 +28,7 @@ html {
|
|||
body {
|
||||
display: grid;
|
||||
padding: $gutter * 2;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-template-columns: 2fr 3fr 2fr;
|
||||
height: 100%;
|
||||
padding: ($gutter * 2) 0;
|
||||
|
@ -34,7 +48,7 @@ body {
|
|||
main,
|
||||
article {
|
||||
font-size: 1rem;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
}
|
||||
|
@ -45,7 +59,7 @@ article {
|
|||
width: 100%;
|
||||
height: auto;
|
||||
max-width: 192px;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
float: right;
|
||||
margin: 1em;
|
||||
}
|
||||
|
|
|
@ -2,12 +2,22 @@
|
|||
|
||||
/* IMPORTS ================================================================= */
|
||||
@use "sass:math";
|
||||
@use "colors";
|
||||
@use "fonts";
|
||||
|
||||
@use "modules/include-media" as * with (
|
||||
$breakpoints: (
|
||||
xs: 0,
|
||||
sm: 640px,
|
||||
md: 768px,
|
||||
lg: 1024px,
|
||||
xl: 1280px,
|
||||
2xl: 1536px,
|
||||
)
|
||||
);
|
||||
|
||||
@use "classes" as *;
|
||||
@use "mixins" as *;
|
||||
@use "vars" as *;
|
||||
@use "colors";
|
||||
@use "fonts";
|
||||
|
||||
html {
|
||||
font: {
|
||||
|
@ -19,7 +29,7 @@ html {
|
|||
body {
|
||||
display: grid;
|
||||
padding: $gutter * 2;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-template-columns: 2fr 3fr 2fr;
|
||||
gap: $gutter;
|
||||
height: 100%;
|
||||
|
@ -34,7 +44,7 @@ nav {
|
|||
align-self: end;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-column: 2;
|
||||
}
|
||||
|
||||
|
@ -51,7 +61,7 @@ nav {
|
|||
}
|
||||
|
||||
main {
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
justify-self: center;
|
||||
|
@ -71,7 +81,7 @@ aside {
|
|||
grid-row: 1;
|
||||
grid-column: 1;
|
||||
max-width: 192px;
|
||||
@include breakpoint("md") {
|
||||
@include media(">md") {
|
||||
grid-column: 2;
|
||||
}
|
||||
|
||||
|
|
618
src/scss/modules/_include-media.scss
Normal file
618
src/scss/modules/_include-media.scss
Normal file
|
@ -0,0 +1,618 @@
|
|||
// _ _ _ _ _
|
||||
// (_) | | | | | (_)
|
||||
// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _
|
||||
// | | '_ \ / __| | | | |/ _` |/ _ \ | '_ ` _ \ / _ \/ _` | |/ _` |
|
||||
// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| |
|
||||
// |_|_| |_|\___|_|\__,_|\__,_|\___| |_| |_| |_|\___|\__,_|_|\__,_|
|
||||
//
|
||||
// Simple, elegant and maintainable media queries in Sass
|
||||
// v2.0.0
|
||||
//
|
||||
// https://eduardoboucas.github.io/include-media
|
||||
//
|
||||
// Authors: Eduardo Boucas (@eduardoboucas)
|
||||
// Kitty Giraudel (@kittygiraudel)
|
||||
//
|
||||
// This project is licensed under the terms of the MIT license
|
||||
@charset "UTF-8";
|
||||
|
||||
////
|
||||
/// include-media library public configuration
|
||||
/// @author Eduardo Boucas
|
||||
/// @access public
|
||||
////
|
||||
@use 'sass:math';
|
||||
@use 'sass:map';
|
||||
@use 'sass:list';
|
||||
@use 'sass:string';
|
||||
@use 'sass:meta';
|
||||
|
||||
///
|
||||
/// Creates a list of global breakpoints
|
||||
///
|
||||
/// @example scss - Creates a single breakpoint with the label `phone`
|
||||
/// $breakpoints: ('phone': 320px);
|
||||
///
|
||||
$breakpoints: (
|
||||
'phone': 320px,
|
||||
'tablet': 768px,
|
||||
'desktop': 1024px,
|
||||
) !default;
|
||||
|
||||
///
|
||||
/// Creates a list of static expressions or media types
|
||||
///
|
||||
/// @example scss - Creates a single media type (screen)
|
||||
/// $media-expressions: ('screen': 'screen');
|
||||
///
|
||||
/// @example scss - Creates a static expression with logical disjunction (OR operator)
|
||||
/// $media-expressions: (
|
||||
/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)'
|
||||
/// );
|
||||
///
|
||||
$media-expressions: (
|
||||
'screen': 'screen',
|
||||
'print': 'print',
|
||||
'handheld': 'handheld',
|
||||
'landscape': '(orientation: landscape)',
|
||||
'portrait': '(orientation: portrait)',
|
||||
'retina2x':
|
||||
'(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)',
|
||||
'retina3x':
|
||||
'(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)',
|
||||
) !default;
|
||||
|
||||
///
|
||||
/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals
|
||||
///
|
||||
/// @example scss - Interval for pixels is defined as `1` by default
|
||||
/// @include media('>128px') {}
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// @media (min-width: 129px) {}
|
||||
///
|
||||
/// @example scss - Interval for ems is defined as `0.01` by default
|
||||
/// @include media('>20em') {}
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// @media (min-width: 20.01em) {}
|
||||
///
|
||||
/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;`
|
||||
/// @include media('>2.0rem') {}
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// @media (min-width: 2.1rem) {}
|
||||
///
|
||||
$unit-intervals: (
|
||||
'px': 1,
|
||||
'em': 0.01,
|
||||
'rem': 0.1,
|
||||
'': 0,
|
||||
) !default;
|
||||
|
||||
///
|
||||
/// Defines whether support for media queries is available, useful for creating separate stylesheets
|
||||
/// for browsers that don't support media queries.
|
||||
///
|
||||
/// @example scss - Disables support for media queries
|
||||
/// $im-media-support: false;
|
||||
/// @include media('>=tablet') {
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
///
|
||||
$im-media-support: true !default;
|
||||
|
||||
///
|
||||
/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or
|
||||
/// intercept the breakpoint will be displayed, any others will be ignored.
|
||||
///
|
||||
/// @example scss - This media query will show because it intercepts the static breakpoint
|
||||
/// $im-media-support: false;
|
||||
/// $im-no-media-breakpoint: 'desktop';
|
||||
/// @include media('>=tablet') {
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
///
|
||||
/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint
|
||||
/// $im-media-support: false;
|
||||
/// $im-no-media-breakpoint: 'tablet';
|
||||
/// @include media('>=desktop') {
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// /* No output */
|
||||
///
|
||||
$im-no-media-breakpoint: 'desktop' !default;
|
||||
|
||||
///
|
||||
/// Selects which media expressions are allowed in an expression for it to be used when media queries
|
||||
/// are not supported.
|
||||
///
|
||||
/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions
|
||||
/// $im-media-support: false;
|
||||
/// $im-no-media-breakpoint: 'desktop';
|
||||
/// $im-no-media-expressions: ('screen');
|
||||
/// @include media('>=tablet', 'screen') {
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// /* Generates: */
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
///
|
||||
/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted
|
||||
/// $im-media-support: false;
|
||||
/// $im-no-media-breakpoint: 'desktop';
|
||||
/// $im-no-media-expressions: ('screen');
|
||||
/// @include media('>=tablet', 'retina2x') {
|
||||
/// .foo {
|
||||
/// color: tomato;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// /* No output */
|
||||
///
|
||||
$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default;
|
||||
|
||||
////
|
||||
/// Cross-engine logging engine
|
||||
/// @author Kitty Giraudel
|
||||
/// @access private
|
||||
////
|
||||
|
||||
///
|
||||
/// Log a message either with `@error` if supported
|
||||
/// else with `@warn`, using `feature-exists('at-error')`
|
||||
/// to detect support.
|
||||
///
|
||||
/// @param {String} $message - Message to log
|
||||
///
|
||||
@function im-log($message) {
|
||||
@if meta.feature-exists('at-error') {
|
||||
@error $message;
|
||||
} @else {
|
||||
@warn $message;
|
||||
$_: noop();
|
||||
}
|
||||
|
||||
@return $message;
|
||||
}
|
||||
|
||||
///
|
||||
/// Wrapper mixin for the log function so it can be used with a more friendly
|
||||
/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function
|
||||
/// within functions because it is not possible to include a mixin in a function
|
||||
/// and use the mixin everywhere else because it's much more elegant.
|
||||
///
|
||||
/// @param {String} $message - Message to log
|
||||
///
|
||||
@mixin log($message) {
|
||||
@if im-log($message) {
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
/// Function with no `@return` called next to `@warn` in Sass 3.3
|
||||
/// to trigger a compiling error and stop the process.
|
||||
///
|
||||
@function noop() {
|
||||
}
|
||||
|
||||
///
|
||||
/// Determines whether a list of conditions is intercepted by the static breakpoint.
|
||||
///
|
||||
/// @param {Arglist} $conditions - Media query conditions
|
||||
///
|
||||
/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint
|
||||
///
|
||||
@function im-intercepts-static-breakpoint($conditions...) {
|
||||
$no-media-breakpoint-value: map.get($breakpoints, $im-no-media-breakpoint);
|
||||
|
||||
@if not $no-media-breakpoint-value {
|
||||
@if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {
|
||||
}
|
||||
}
|
||||
|
||||
@each $condition in $conditions {
|
||||
@if not map.has-key($media-expressions, $condition) {
|
||||
$operator: get-expression-operator($condition);
|
||||
$prefix: get-expression-prefix($operator);
|
||||
$value: get-expression-value($condition, $operator);
|
||||
|
||||
@if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or
|
||||
($prefix == 'min' and $value > $no-media-breakpoint-value)
|
||||
{
|
||||
@return false;
|
||||
}
|
||||
} @else if not list.index($im-no-media-expressions, $condition) {
|
||||
@return false;
|
||||
}
|
||||
}
|
||||
|
||||
@return true;
|
||||
}
|
||||
|
||||
////
|
||||
/// Parsing engine
|
||||
/// @author Kitty Giraudel
|
||||
/// @access private
|
||||
////
|
||||
|
||||
///
|
||||
/// Get operator of an expression
|
||||
///
|
||||
/// @param {String} $expression - Expression to extract operator from
|
||||
///
|
||||
/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤`
|
||||
///
|
||||
@function get-expression-operator($expression) {
|
||||
@each $operator in ('>=', '>', '<=', '<', '≥', '≤') {
|
||||
@if string.index($expression, $operator) {
|
||||
@return $operator;
|
||||
}
|
||||
}
|
||||
|
||||
// It is not possible to include a mixin inside a function, so we have to
|
||||
// rely on the `im-log(..)` function rather than the `log(..)` mixin. Because
|
||||
// functions cannot be called anywhere in Sass, we need to hack the call in
|
||||
// a dummy variable, such as `$_`. If anybody ever raise a scoping issue with
|
||||
// Sass 3.3, change this line in `@if im-log(..) {}` instead.
|
||||
$_: im-log('No operator found in `#{$expression}`.');
|
||||
}
|
||||
|
||||
///
|
||||
/// Get dimension of an expression, based on a found operator
|
||||
///
|
||||
/// @param {String} $expression - Expression to extract dimension from
|
||||
/// @param {String} $operator - Operator from `$expression`
|
||||
///
|
||||
/// @return {String} - `width` or `height` (or potentially anything else)
|
||||
///
|
||||
@function get-expression-dimension($expression, $operator) {
|
||||
$operator-index: string.index($expression, $operator);
|
||||
$parsed-dimension: string.slice($expression, 0, $operator-index - 1);
|
||||
$parsed-dimension: str-trim($parsed-dimension);
|
||||
$dimension: 'width';
|
||||
|
||||
@if string.length($parsed-dimension) > 0 {
|
||||
$dimension: $parsed-dimension;
|
||||
}
|
||||
|
||||
@return $dimension;
|
||||
}
|
||||
|
||||
///
|
||||
/// Get dimension prefix based on an operator
|
||||
///
|
||||
/// @param {String} $operator - Operator
|
||||
///
|
||||
/// @return {String} - `min` or `max`
|
||||
///
|
||||
@function get-expression-prefix($operator) {
|
||||
@return if(list.index(('<', '<=', '≤'), $operator), 'max', 'min');
|
||||
}
|
||||
|
||||
///
|
||||
/// Get value of an expression, based on a found operator
|
||||
///
|
||||
/// @param {String} $expression - Expression to extract value from
|
||||
/// @param {String} $operator - Operator from `$expression`
|
||||
///
|
||||
/// @return {Number} - A numeric value
|
||||
///
|
||||
@function get-expression-value($expression, $operator) {
|
||||
$operator-index: string.index($expression, $operator);
|
||||
$value: string.slice($expression, $operator-index + string.length($operator));
|
||||
$trimmedValue: str-trim($value);
|
||||
|
||||
@if map.has-key($breakpoints, $trimmedValue) {
|
||||
$value: map.get($breakpoints, $trimmedValue);
|
||||
} @else {
|
||||
$value: to-number($trimmedValue);
|
||||
}
|
||||
|
||||
$interval: map.get($unit-intervals, math.unit($value));
|
||||
|
||||
@if not $interval {
|
||||
// It is not possible to include a mixin inside a function, so we have to
|
||||
// rely on the `im-log(..)` function rather than the `log(..)` mixin. Because
|
||||
// functions cannot be called anywhere in Sass, we need to hack the call in
|
||||
// a dummy variable, such as `$_`. If anybody ever raise a scoping issue with
|
||||
// Sass 3.3, change this line in `@if im-log(..) {}` instead.
|
||||
$_: im-log('Unknown unit `#{math.unit($value)}`.');
|
||||
}
|
||||
|
||||
@if $operator == '>' {
|
||||
$value: $value + $interval;
|
||||
} @else if $operator == '<' {
|
||||
$value: $value - $interval;
|
||||
}
|
||||
|
||||
@return $value;
|
||||
}
|
||||
|
||||
///
|
||||
/// Parse an expression to return a valid media-query expression
|
||||
///
|
||||
/// @param {String} $expression - Expression to parse
|
||||
///
|
||||
/// @return {String} - Valid media query
|
||||
///
|
||||
@function parse-expression($expression) {
|
||||
// If it is part of $media-expressions, it has no operator
|
||||
// then there is no need to go any further, just return the value
|
||||
@if map.has-key($media-expressions, $expression) {
|
||||
@return map.get($media-expressions, $expression);
|
||||
}
|
||||
|
||||
$operator: get-expression-operator($expression);
|
||||
$dimension: get-expression-dimension($expression, $operator);
|
||||
$prefix: get-expression-prefix($operator);
|
||||
$value: get-expression-value($expression, $operator);
|
||||
|
||||
@return '(#{$prefix}-#{$dimension}: #{$value})';
|
||||
}
|
||||
|
||||
///
|
||||
/// Slice `$list` between `$start` and `$end` indexes
|
||||
///
|
||||
/// @access private
|
||||
///
|
||||
/// @param {List} $list - List to slice
|
||||
/// @param {Number} $start [1] - Start index
|
||||
/// @param {Number} $end [length($list)] - End index
|
||||
///
|
||||
/// @return {List} Sliced list
|
||||
///
|
||||
@function slice($list, $start: 1, $end: list.length($list)) {
|
||||
@if list.length($list) < 1 or $start > $end {
|
||||
@return ();
|
||||
}
|
||||
|
||||
$result: ();
|
||||
|
||||
@for $i from $start through $end {
|
||||
$result: list.append($result, list.nth($list, $i), comma);
|
||||
}
|
||||
|
||||
@return $result;
|
||||
}
|
||||
|
||||
////
|
||||
/// String to number converter
|
||||
/// @author Kitty Giraudel
|
||||
/// @access private
|
||||
////
|
||||
|
||||
///
|
||||
/// Casts a string into a number
|
||||
///
|
||||
/// @param {String | Number} $value - Value to be parsed
|
||||
///
|
||||
/// @return {Number}
|
||||
///
|
||||
|
||||
@function to-number($value) {
|
||||
@if meta.type-of($value) == 'number' {
|
||||
@return $value;
|
||||
} @else if meta.type-of($value) != 'string' {
|
||||
$_: im-log('Value for `to-number` should be a number or a string.');
|
||||
}
|
||||
|
||||
$first-character: string.slice($value, 1, 1);
|
||||
$result: 0;
|
||||
$digits: 0;
|
||||
$minus: ($first-character == '-');
|
||||
$numbers: (
|
||||
'0': 0,
|
||||
'1': 1,
|
||||
'2': 2,
|
||||
'3': 3,
|
||||
'4': 4,
|
||||
'5': 5,
|
||||
'6': 6,
|
||||
'7': 7,
|
||||
'8': 8,
|
||||
'9': 9,
|
||||
);
|
||||
|
||||
// Remove +/- sign if present at first character
|
||||
@if ($first-character == '+' or $first-character == '-') {
|
||||
$value: string.slice($value, 2);
|
||||
}
|
||||
|
||||
@for $i from 1 through string.length($value) {
|
||||
$character: string.slice($value, $i, $i);
|
||||
|
||||
@if not(list.index(map.keys($numbers), $character) or $character == '.') {
|
||||
@return to-length(if($minus, -$result, $result), string.slice($value, $i));
|
||||
}
|
||||
|
||||
@if $character == '.' {
|
||||
$digits: 1;
|
||||
} @else if $digits == 0 {
|
||||
$result: $result * 10 + map.get($numbers, $character);
|
||||
} @else {
|
||||
$digits: $digits * 10;
|
||||
$result: $result + math.div(map.get($numbers, $character), $digits);
|
||||
}
|
||||
}
|
||||
|
||||
@return if($minus, -$result, $result);
|
||||
}
|
||||
|
||||
///
|
||||
/// Add `$unit` to `$value`
|
||||
///
|
||||
/// @param {Number} $value - Value to add unit to
|
||||
/// @param {String} $unit - String representation of the unit
|
||||
///
|
||||
/// @return {Number} - `$value` expressed in `$unit`
|
||||
///
|
||||
@function to-length($value, $unit) {
|
||||
$units: (
|
||||
'px': 1px,
|
||||
'cm': 1cm,
|
||||
'mm': 1mm,
|
||||
'%': 1%,
|
||||
'ch': 1ch,
|
||||
'pc': 1pc,
|
||||
'in': 1in,
|
||||
'em': 1em,
|
||||
'rem': 1rem,
|
||||
'pt': 1pt,
|
||||
'ex': 1ex,
|
||||
'vw': 1vw,
|
||||
'vh': 1vh,
|
||||
'vmin': 1vmin,
|
||||
'vmax': 1vmax,
|
||||
);
|
||||
|
||||
@if not list.index(map.keys($units), $unit) {
|
||||
$_: im-log('Invalid unit `#{$unit}`.');
|
||||
}
|
||||
|
||||
@return $value * map.get($units, $unit);
|
||||
}
|
||||
|
||||
////
|
||||
/// String to number converter
|
||||
/// @author Jack McNicol
|
||||
/// @access private
|
||||
////
|
||||
|
||||
///
|
||||
/// Trims a string of leading and trailing spaces
|
||||
///
|
||||
/// @param {String} $string - Value to be trimmed
|
||||
///
|
||||
/// @return {String}
|
||||
///
|
||||
|
||||
@function str-trim($string) {
|
||||
@if (str-slice($string, 1, 1) == ' ') {
|
||||
@return str-trim(str-slice($string, 2));
|
||||
} @else if (str-slice($string, str-length($string), -1) == ' ') {
|
||||
@return str-trim(str-slice($string, 1, -2));
|
||||
} @else {
|
||||
@return $string;
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
/// This mixin aims at redefining the configuration just for the scope of
|
||||
/// the call. It is helpful when having a component needing an extended
|
||||
/// configuration such as custom breakpoints (referred to as tweakpoints)
|
||||
/// for instance.
|
||||
///
|
||||
/// @author Kitty Giraudel
|
||||
///
|
||||
/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints`
|
||||
/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression`
|
||||
///
|
||||
/// @example scss - Extend the global breakpoints with a tweakpoint
|
||||
/// @include media-context(('custom': 678px)) {
|
||||
/// .foo {
|
||||
/// @include media('>phone', '<=custom') {
|
||||
/// // ...
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// @example scss - Extend the global media expressions with a custom one
|
||||
/// @include media-context($tweak-media-expressions: ('all': 'all')) {
|
||||
/// .foo {
|
||||
/// @include media('all', '>phone') {
|
||||
/// // ...
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// @example scss - Extend both configuration maps
|
||||
/// @include media-context(('custom': 678px), ('all': 'all')) {
|
||||
/// .foo {
|
||||
/// @include media('all', '>phone', '<=custom') {
|
||||
/// // ...
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) {
|
||||
// Save global configuration
|
||||
$global-breakpoints: $breakpoints;
|
||||
$global-media-expressions: $media-expressions;
|
||||
|
||||
// Update global configuration
|
||||
$breakpoints: map.merge($breakpoints, $tweakpoints) !global;
|
||||
$media-expressions: map.merge($media-expressions, $tweak-media-expressions) !global;
|
||||
|
||||
@content;
|
||||
|
||||
// Restore global configuration
|
||||
$breakpoints: $global-breakpoints !global;
|
||||
$media-expressions: $global-media-expressions !global;
|
||||
}
|
||||
|
||||
////
|
||||
/// include-media public exposed API
|
||||
/// @author Eduardo Boucas
|
||||
/// @access public
|
||||
////
|
||||
|
||||
///
|
||||
/// Generates a media query based on a list of conditions
|
||||
///
|
||||
/// @param {Arglist} $conditions - Media query conditions
|
||||
///
|
||||
/// @example scss - With a single set breakpoint
|
||||
/// @include media('>phone') { }
|
||||
///
|
||||
/// @example scss - With two set breakpoints
|
||||
/// @include media('>phone', '<=tablet') { }
|
||||
///
|
||||
/// @example scss - With custom values
|
||||
/// @include media('>=358px', '<850px') { }
|
||||
///
|
||||
/// @example scss - With set breakpoints with custom values
|
||||
/// @include media('>desktop', '<=1350px') { }
|
||||
///
|
||||
/// @example scss - With a static expression
|
||||
/// @include media('retina2x') { }
|
||||
///
|
||||
/// @example scss - Mixing everything
|
||||
/// @include media('>=350px', '<tablet', 'retina3x') { }
|
||||
///
|
||||
@mixin media($conditions...) {
|
||||
@if ($im-media-support and list.length($conditions) == 0) or
|
||||
(not $im-media-support and im-intercepts-static-breakpoint($conditions...))
|
||||
{
|
||||
@content;
|
||||
} @else if ($im-media-support and list.length($conditions) > 0) {
|
||||
@media #{string.unquote(parse-expression(list.nth($conditions, 1)))} {
|
||||
// Recursive call
|
||||
$sliced-conditions: slice($conditions, 2);
|
||||
@include media($sliced-conditions...) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue