Add blog section
This commit is contained in:
		
							parent
							
								
									3d7ef57e7b
								
							
						
					
					
						commit
						45ba56c49d
					
				| 
						 | 
					@ -1,78 +1,4 @@
 | 
				
			||||||
/*
 | 
					/* IMPORTS ================================================================= */
 | 
				
			||||||
 | 
					 | 
				
			||||||
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");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.markup {
 | 
					.markup {
 | 
				
			||||||
  word-wrap: break-word;
 | 
					  word-wrap: break-word;
 | 
				
			||||||
  line-height: 1.7;
 | 
					  line-height: 1.7;
 | 
				
			||||||
| 
						 | 
					@ -149,8 +75,84 @@ _vars.scss
 | 
				
			||||||
*******************************************************************************
 | 
					*******************************************************************************
 | 
				
			||||||
Global variables for the entire website
 | 
					Global variables for the entire website
 | 
				
			||||||
============================================================================ */
 | 
					============================================================================ */
 | 
				
			||||||
 | 
					/* MEDIA BREAKPOINTS ======================================================= */
 | 
				
			||||||
/* SPACING ================================================================= */
 | 
					/* SPACING ================================================================= */
 | 
				
			||||||
/* FONT SIZING ============================================================= */
 | 
					/* 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 {
 | 
					html {
 | 
				
			||||||
  font-size: 12pt;
 | 
					  font-size: 12pt;
 | 
				
			||||||
  font-family: "Linux Libertine", "Times New Roman", Times, serif;
 | 
					  font-family: "Linux Libertine", "Times New Roman", Times, serif;
 | 
				
			||||||
| 
						 | 
					@ -160,7 +162,7 @@ body {
 | 
				
			||||||
  display: grid;
 | 
					  display: grid;
 | 
				
			||||||
  padding: 2em;
 | 
					  padding: 2em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  body {
 | 
					  body {
 | 
				
			||||||
    grid-template-columns: 2fr 3fr 2fr;
 | 
					    grid-template-columns: 2fr 3fr 2fr;
 | 
				
			||||||
    height: 100%;
 | 
					    height: 100%;
 | 
				
			||||||
| 
						 | 
					@ -180,7 +182,7 @@ main,
 | 
				
			||||||
article {
 | 
					article {
 | 
				
			||||||
  font-size: 1rem;
 | 
					  font-size: 1rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  main,
 | 
					  main,
 | 
				
			||||||
  article {
 | 
					  article {
 | 
				
			||||||
    grid-row: 2;
 | 
					    grid-row: 2;
 | 
				
			||||||
| 
						 | 
					@ -195,7 +197,7 @@ article .gba-portrait {
 | 
				
			||||||
  height: auto;
 | 
					  height: auto;
 | 
				
			||||||
  max-width: 192px;
 | 
					  max-width: 192px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  main .gba-portrait,
 | 
					  main .gba-portrait,
 | 
				
			||||||
  article .gba-portrait {
 | 
					  article .gba-portrait {
 | 
				
			||||||
    float: right;
 | 
					    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 ================================================================= */
 | 
					/* 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
 | 
					COLORS
 | 
				
			||||||
| 
						 | 
					@ -74,85 +153,6 @@ For license text, see:
 | 
				
			||||||
  font-weight: 700;
 | 
					  font-weight: 700;
 | 
				
			||||||
  src: local("Linux Libertine Bold Italic"), url("../font/LinLibertine_RBIah.ttf");
 | 
					  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 {
 | 
					html {
 | 
				
			||||||
  font-size: 12pt;
 | 
					  font-size: 12pt;
 | 
				
			||||||
  font-family: "Linux Libertine", "Times New Roman", Times, serif;
 | 
					  font-family: "Linux Libertine", "Times New Roman", Times, serif;
 | 
				
			||||||
| 
						 | 
					@ -162,7 +162,7 @@ body {
 | 
				
			||||||
  display: grid;
 | 
					  display: grid;
 | 
				
			||||||
  padding: 2em;
 | 
					  padding: 2em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  body {
 | 
					  body {
 | 
				
			||||||
    grid-template-columns: 2fr 3fr 2fr;
 | 
					    grid-template-columns: 2fr 3fr 2fr;
 | 
				
			||||||
    gap: 1em;
 | 
					    gap: 1em;
 | 
				
			||||||
| 
						 | 
					@ -179,7 +179,7 @@ nav {
 | 
				
			||||||
  font-size: 1.5em;
 | 
					  font-size: 1.5em;
 | 
				
			||||||
  font-weight: bold;
 | 
					  font-weight: bold;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  nav {
 | 
					  nav {
 | 
				
			||||||
    grid-column: 2;
 | 
					    grid-column: 2;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -192,7 +192,7 @@ nav a::after {
 | 
				
			||||||
  font-style: normal;
 | 
					  font-style: normal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  main {
 | 
					  main {
 | 
				
			||||||
    grid-row: 2;
 | 
					    grid-row: 2;
 | 
				
			||||||
    grid-column: 2;
 | 
					    grid-column: 2;
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,7 @@ aside {
 | 
				
			||||||
  grid-column: 1;
 | 
					  grid-column: 1;
 | 
				
			||||||
  max-width: 192px;
 | 
					  max-width: 192px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@media screen and (min-width: 768px) {
 | 
					@media (min-width: 769px) {
 | 
				
			||||||
  aside {
 | 
					  aside {
 | 
				
			||||||
    grid-column: 2;
 | 
					    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.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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//-----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$background: #141013;
 | 
					$background: #141013;
 | 
				
			||||||
$text: $paper;
 | 
					$text: $paper;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,17 @@
 | 
				
			||||||
/*
 | 
					// _fonts.scss
 | 
				
			||||||
 | 
					/* ============================================================================
 | 
				
			||||||
 | 
					FONT SOURCES
 | 
				
			||||||
 | 
					============================================================================ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FONT: LINUX LIBERTINE 
 | 
					/* Linux Libertine ------------------------------------------------------------
 | 
				
			||||||
===============================================================================
 | 
					 | 
				
			||||||
License: GPL and OFL 1.1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
For license text, see:
 | 
					Licensed under GPL and OFL 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Full license texts:
 | 
				
			||||||
- https://gils.nexus/font/GPL.txt
 | 
					- https://gils.nexus/font/GPL.txt
 | 
				
			||||||
- https://gils.nexus/font/OFL-1.1.txt
 | 
					- https://gils.nexus/font/OFL-1.1.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					---------------------------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Normal
 | 
					// Normal
 | 
				
			||||||
@font-face {
 | 
					@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
 | 
				
			||||||
_vars.scss
 | 
					/* ============================================================================
 | 
				
			||||||
*******************************************************************************
 | 
					GLOBAL VARIABLES
 | 
				
			||||||
Global variables for the entire website
 | 
					 | 
				
			||||||
============================================================================ */
 | 
					============================================================================ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SPACING ================================================================= */
 | 
					/* Media breakpoints ------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Spacing ----------------------------------------------------------------- */
 | 
				
			||||||
$gutter: 1em;
 | 
					$gutter: 1em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* FONT SIZING ============================================================= */
 | 
					/* Typography -------------------------------------------------------------- */
 | 
				
			||||||
 | 
					$leading: 1.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -- Font ----------------------------------------------------------------- */
 | 
				
			||||||
$font-base-size: 12pt;
 | 
					$font-base-size: 12pt;
 | 
				
			||||||
$font-stack-serif: "Linux Libertine", "Times New Roman", Times, serif;
 | 
					$font-stack-serif: "Linux Libertine", "Times New Roman", Times, serif;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,22 @@
 | 
				
			||||||
@use "colors";
 | 
					// global.scss
 | 
				
			||||||
@use "fonts";
 | 
					
 | 
				
			||||||
@use "mixins" as *;
 | 
					/* 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 "classes" as *;
 | 
				
			||||||
@use "vars" as *;
 | 
					@use "vars" as *;
 | 
				
			||||||
 | 
					@use "fonts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
html {
 | 
					html {
 | 
				
			||||||
  font: {
 | 
					  font: {
 | 
				
			||||||
| 
						 | 
					@ -14,7 +28,7 @@ html {
 | 
				
			||||||
body {
 | 
					body {
 | 
				
			||||||
  display: grid;
 | 
					  display: grid;
 | 
				
			||||||
  padding: $gutter * 2;
 | 
					  padding: $gutter * 2;
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-template-columns: 2fr 3fr 2fr;
 | 
					    grid-template-columns: 2fr 3fr 2fr;
 | 
				
			||||||
    height: 100%;
 | 
					    height: 100%;
 | 
				
			||||||
    padding: ($gutter * 2) 0;
 | 
					    padding: ($gutter * 2) 0;
 | 
				
			||||||
| 
						 | 
					@ -34,7 +48,7 @@ body {
 | 
				
			||||||
main,
 | 
					main,
 | 
				
			||||||
article {
 | 
					article {
 | 
				
			||||||
  font-size: 1rem;
 | 
					  font-size: 1rem;
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-row: 2;
 | 
					    grid-row: 2;
 | 
				
			||||||
    grid-column: 2;
 | 
					    grid-column: 2;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -45,7 +59,7 @@ article {
 | 
				
			||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
    height: auto;
 | 
					    height: auto;
 | 
				
			||||||
    max-width: 192px;
 | 
					    max-width: 192px;
 | 
				
			||||||
    @include breakpoint("md") {
 | 
					    @include media(">md") {
 | 
				
			||||||
      float: right;
 | 
					      float: right;
 | 
				
			||||||
      margin: 1em;
 | 
					      margin: 1em;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,22 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* IMPORTS ================================================================= */
 | 
					/* IMPORTS ================================================================= */
 | 
				
			||||||
@use "sass:math";
 | 
					@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 "classes" as *;
 | 
				
			||||||
@use "mixins" as *;
 | 
					 | 
				
			||||||
@use "vars" as *;
 | 
					@use "vars" as *;
 | 
				
			||||||
 | 
					@use "colors";
 | 
				
			||||||
 | 
					@use "fonts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
html {
 | 
					html {
 | 
				
			||||||
  font: {
 | 
					  font: {
 | 
				
			||||||
| 
						 | 
					@ -19,7 +29,7 @@ html {
 | 
				
			||||||
body {
 | 
					body {
 | 
				
			||||||
  display: grid;
 | 
					  display: grid;
 | 
				
			||||||
  padding: $gutter * 2;
 | 
					  padding: $gutter * 2;
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-template-columns: 2fr 3fr 2fr;
 | 
					    grid-template-columns: 2fr 3fr 2fr;
 | 
				
			||||||
    gap: $gutter;
 | 
					    gap: $gutter;
 | 
				
			||||||
    height: 100%;
 | 
					    height: 100%;
 | 
				
			||||||
| 
						 | 
					@ -34,7 +44,7 @@ nav {
 | 
				
			||||||
  align-self: end;
 | 
					  align-self: end;
 | 
				
			||||||
  font-size: 1.5em;
 | 
					  font-size: 1.5em;
 | 
				
			||||||
  font-weight: bold;
 | 
					  font-weight: bold;
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-column: 2;
 | 
					    grid-column: 2;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +61,7 @@ nav {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main {
 | 
					main {
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-row: 2;
 | 
					    grid-row: 2;
 | 
				
			||||||
    grid-column: 2;
 | 
					    grid-column: 2;
 | 
				
			||||||
    justify-self: center;
 | 
					    justify-self: center;
 | 
				
			||||||
| 
						 | 
					@ -71,7 +81,7 @@ aside {
 | 
				
			||||||
  grid-row: 1;
 | 
					  grid-row: 1;
 | 
				
			||||||
  grid-column: 1;
 | 
					  grid-column: 1;
 | 
				
			||||||
  max-width: 192px;
 | 
					  max-width: 192px;
 | 
				
			||||||
  @include breakpoint("md") {
 | 
					  @include media(">md") {
 | 
				
			||||||
    grid-column: 2;
 | 
					    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