mirror of
https://github.com/locomotivemtl/locomotive-boilerplate.git
synced 2026-01-15 00:55:08 +08:00
Compare commits
38 Commits
mcaskill/b
...
6f04e21146
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f04e21146 | ||
|
|
97b0d57dbd | ||
|
|
c434d0843f | ||
|
|
5f8767f04d | ||
|
|
b4ee0955c3 | ||
|
|
1ec1229fe4 | ||
|
|
d593fe5409 | ||
|
|
f8a46043a6 | ||
|
|
25823286d5 | ||
|
|
605f30c948 | ||
|
|
27a41aba66 | ||
|
|
353a38915d | ||
|
|
6d37049989 | ||
|
|
bc3fd3a492 | ||
|
|
45d8be5525 | ||
|
|
ea8f98a52d | ||
|
|
56bbd9e3c5 | ||
|
|
dcb7e91b91 | ||
|
|
2b1eb8e0dd | ||
|
|
f4afd9c6b2 | ||
|
|
7578397a8e | ||
|
|
27effb470d | ||
|
|
7a91cbce61 | ||
|
|
65a265c0ea | ||
|
|
afb3a4aa6a | ||
|
|
40521c3f2b | ||
|
|
2d395cf73a | ||
|
|
81d47b88b8 | ||
|
|
c16407c8c1 | ||
|
|
522c9c0bcb | ||
|
|
ddd12ffc38 | ||
|
|
9e6d7ae182 | ||
|
|
d5bff3ab50 | ||
|
|
0af2be4599 | ||
|
|
98ba8c4972 | ||
|
|
a674a16c4b | ||
|
|
dd2c783938 | ||
|
|
7021666c46 |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -3,4 +3,11 @@ node_modules
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
loconfig.*.json
|
loconfig.*.json
|
||||||
!loconfig.example.json
|
!loconfig.example.json
|
||||||
.prettierrc
|
.prettierrc
|
||||||
|
|
||||||
|
www/assets/scripts/*
|
||||||
|
!www/assets/scripts/.gitkeep
|
||||||
|
www/assets/styles/*
|
||||||
|
!www/assets/styles/.gitkeep
|
||||||
|
|
||||||
|
assets.json
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
> [!WARNING]
|
||||||
|
> This repository is no longer maintained. We recommend checking out our [Astro](https://github.com/locomotivemtl/astro-boilerplate) or [Craft](https://github.com/locomotivemtl/craft-boilerplate) boilerplates instead.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/locomotivemtl/locomotive-boilerplate">
|
<a href="https://github.com/locomotivemtl/locomotive-boilerplate">
|
||||||
<img src="https://user-images.githubusercontent.com/4596862/54868065-c2aea200-4d5e-11e9-9ce3-e0013c15f48c.png" height="140">
|
<img src="https://user-images.githubusercontent.com/4596862/54868065-c2aea200-4d5e-11e9-9ce3-e0013c15f48c.png" height="140">
|
||||||
@@ -23,8 +26,8 @@ Learn more about [languages and technologies](docs/technologies.md).
|
|||||||
|
|
||||||
Make sure you have the following installed:
|
Make sure you have the following installed:
|
||||||
|
|
||||||
* [Node] — at least 17.9, the latest LTS is recommended.
|
* [Node] — at least 20, the latest LTS is recommended.
|
||||||
* [NPM] — at least 8.0, the latest LTS is recommended.
|
* [NPM] — at least 10, the latest LTS is recommended.
|
||||||
|
|
||||||
> 💡 You can use [NVM] to install and use different versions of Node via the command-line.
|
> 💡 You can use [NVM] to install and use different versions of Node via the command-line.
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 1706549368176
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,73 @@ const app = new modular({
|
|||||||
modules,
|
modules,
|
||||||
});
|
});
|
||||||
|
|
||||||
const setViewportSizes = () => {
|
function init() {
|
||||||
|
bindEvents();
|
||||||
|
globals();
|
||||||
|
setViewportSizes();
|
||||||
|
|
||||||
|
app.init(app);
|
||||||
|
|
||||||
|
$html.classList.add(CSS_CLASS.LOADED, CSS_CLASS.READY);
|
||||||
|
$html.classList.remove(CSS_CLASS.LOADING);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug focus
|
||||||
|
*/
|
||||||
|
// document.addEventListener(
|
||||||
|
// "focusin",
|
||||||
|
// function () {
|
||||||
|
// console.log('focused: ', document.activeElement)
|
||||||
|
// }, true
|
||||||
|
// );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Eagerly load the following fonts.
|
||||||
|
*/
|
||||||
|
if (isFontLoadingAPIAvailable) {
|
||||||
|
loadFonts(FONT.EAGER, ENV.IS_DEV).then((eagerFonts) => {
|
||||||
|
$html.classList.add(CSS_CLASS.FONTS_LOADED);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug fonts loading
|
||||||
|
*/
|
||||||
|
// if (ENV.IS_DEV) {
|
||||||
|
// console.group('Eager fonts loaded!', eagerFonts.length, '/', document.fonts.size);
|
||||||
|
// console.group('State of eager fonts:');
|
||||||
|
// eagerFonts.forEach(font => console.log(font.family, font.style, font.weight, font.status));
|
||||||
|
// console.groupEnd();
|
||||||
|
// console.group('State of all fonts:');
|
||||||
|
// document.fonts.forEach(font => console.log(font.family, font.style, font.weight, font.status));
|
||||||
|
// console.groupEnd();
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// Global events
|
||||||
|
////////////////
|
||||||
|
function bindEvents() {
|
||||||
|
|
||||||
|
// Resize event
|
||||||
|
const resizeEndEvent = new CustomEvent(CUSTOM_EVENT.RESIZE_END)
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
debounce(() => {
|
||||||
|
window.dispatchEvent(resizeEndEvent)
|
||||||
|
}, 200, false)
|
||||||
|
)
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
onResize
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onResize() {
|
||||||
|
setViewportSizes()
|
||||||
|
}
|
||||||
|
|
||||||
|
function setViewportSizes() {
|
||||||
|
|
||||||
// Document styles
|
// Document styles
|
||||||
const documentStyles = document.documentElement.style;
|
const documentStyles = document.documentElement.style;
|
||||||
@@ -25,10 +91,10 @@ const setViewportSizes = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Viewport height
|
// Viewport height
|
||||||
const height = window.innerHeight;
|
|
||||||
const svh = document.documentElement.clientHeight * 0.01;
|
const svh = document.documentElement.clientHeight * 0.01;
|
||||||
documentStyles.setProperty('--svh', `${svh}px`);
|
documentStyles.setProperty('--svh', `${svh}px`);
|
||||||
const dvh = height * 0.01;
|
|
||||||
|
const dvh = window.innerHeight * 0.01;
|
||||||
documentStyles.setProperty('--dvh', `${dvh}px`);
|
documentStyles.setProperty('--dvh', `${dvh}px`);
|
||||||
|
|
||||||
if (document.body) {
|
if (document.body) {
|
||||||
@@ -53,6 +119,9 @@ const setViewportSizes = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// Execute
|
||||||
|
////////////////
|
||||||
window.addEventListener('load', () => {
|
window.addEventListener('load', () => {
|
||||||
const $style = document.getElementById('main-css');
|
const $style = document.getElementById('main-css');
|
||||||
|
|
||||||
@@ -66,46 +135,3 @@ window.addEventListener('load', () => {
|
|||||||
console.warn('The "main-css" stylesheet not found');
|
console.warn('The "main-css" stylesheet not found');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function init() {
|
|
||||||
globals();
|
|
||||||
setViewportSizes();
|
|
||||||
|
|
||||||
app.init(app);
|
|
||||||
|
|
||||||
$html.classList.add(CSS_CLASS.LOADED);
|
|
||||||
$html.classList.add(CSS_CLASS.READY);
|
|
||||||
$html.classList.remove(CSS_CLASS.LOADING);
|
|
||||||
|
|
||||||
// Bind window resize event with default vars
|
|
||||||
const resizeEndEvent = new CustomEvent(CUSTOM_EVENT.RESIZE_END);
|
|
||||||
window.addEventListener('resize', () => {
|
|
||||||
setViewportSizes();
|
|
||||||
debounce(() => {
|
|
||||||
window.dispatchEvent(resizeEndEvent);
|
|
||||||
}, 200, false)
|
|
||||||
})
|
|
||||||
|
|
||||||
window.addEventListener('orientationchange', () => {
|
|
||||||
setViewportSizes();
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Eagerly load the following fonts.
|
|
||||||
*/
|
|
||||||
if (isFontLoadingAPIAvailable) {
|
|
||||||
loadFonts(FONT.EAGER, ENV.IS_DEV).then((eagerFonts) => {
|
|
||||||
$html.classList.add(CSS_CLASS.FONTS_LOADED);
|
|
||||||
|
|
||||||
if (ENV.IS_DEV) {
|
|
||||||
console.group('Eager fonts loaded!', eagerFonts.length, '/', document.fonts.size);
|
|
||||||
console.group('State of eager fonts:');
|
|
||||||
eagerFonts.forEach(font => console.log(font.family, font.style, font.weight, font.status));
|
|
||||||
console.groupEnd();
|
|
||||||
console.group('State of all fonts:');
|
|
||||||
document.fonts.forEach(font => console.log(font.family, font.style, font.weight, font.status));
|
|
||||||
console.groupEnd();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import svg4everybody from 'svg4everybody';
|
|
||||||
import { ENV } from './config';
|
import { ENV } from './config';
|
||||||
|
|
||||||
// Dynamic imports for development mode only
|
// Dynamic imports for development mode only
|
||||||
@@ -11,11 +10,6 @@ let gridHelper;
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
/**
|
|
||||||
* Use external SVG spritemaps
|
|
||||||
*/
|
|
||||||
svg4everybody();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add grid helper
|
* Add grid helper
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ $input-icon-color: 424242; // No #
|
|||||||
.c-form_input {
|
.c-form_input {
|
||||||
padding: rem(10px);
|
padding: rem(10px);
|
||||||
border: 1px solid lightgray;
|
border: 1px solid lightgray;
|
||||||
background-color: color(lightest);
|
background-color: colorCode(lightest);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: darkgray;
|
border-color: darkgray;
|
||||||
@@ -71,7 +71,7 @@ $checkbox-icon-color: $input-icon-color;
|
|||||||
}
|
}
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
background-color: color(lightest);
|
background-color: colorCode(lightest);
|
||||||
border: 1px solid lightgray;
|
border: 1px solid lightgray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,30 +2,78 @@
|
|||||||
// Components / Headings
|
// Components / Headings
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
|
// Font sizes
|
||||||
|
// ==========================================================================
|
||||||
|
:root {
|
||||||
|
// Default
|
||||||
|
--font-size-h1: #{responsive-value(38px, 90px, $from-xl)};
|
||||||
|
--font-size-h2: #{responsive-value(34px, 72px, $from-xl)};
|
||||||
|
--font-size-h3: #{responsive-value(28px, 54px, $from-xl)};
|
||||||
|
--font-size-h4: #{responsive-value(24px, 40px, $from-xl)};
|
||||||
|
--font-size-h5: #{responsive-value(20px, 30px, $from-xl)};
|
||||||
|
--font-size-h6: #{responsive-value(18px, 23px, $from-xl)};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixins
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
@mixin heading {
|
||||||
|
font-family: ff('sans');
|
||||||
|
font-weight: $font-weight-medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h1 {
|
||||||
|
font-size: var(--font-size-h1);
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h2 {
|
||||||
|
font-size: var(--font-size-h2);
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h3 {
|
||||||
|
font-size: var(--font-size-h3);
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h4 {
|
||||||
|
font-size: var(--font-size-h4);
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h5 {
|
||||||
|
font-size: var(--font-size-h5);
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin heading-h6 {
|
||||||
|
font-size: var(--font-size-h6);
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
.c-heading {
|
.c-heading {
|
||||||
margin-bottom: rem(30px);
|
@include heading;
|
||||||
|
|
||||||
&.-h1 {
|
&.-h1 {
|
||||||
font-size: var(--font-size-h1);
|
@include heading-h1;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-h2 {
|
&.-h2 {
|
||||||
font-size: var(--font-size-h2);
|
@include heading-h2;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-h3 {
|
&.-h3 {
|
||||||
font-size: var(--font-size-h3);
|
@include heading-h3;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-h4 {
|
&.-h4 {
|
||||||
font-size: var(--font-size-h4);
|
@include heading-h4;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-h5 {
|
&.-h5 {
|
||||||
font-size: var(--font-size-h5);
|
@include heading-h5;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-h6 {
|
&.-h6 {
|
||||||
font-size: var(--font-size-h6);
|
@include heading-h6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
background-color: color(darkest);
|
background-color: colorCode(darkest);
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
width: 7px;
|
width: 7px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
|||||||
53
assets/styles/components/_text.scss
Normal file
53
assets/styles/components/_text.scss
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
// ==========================================================================
|
||||||
|
// Components / Texts
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
// Font sizes
|
||||||
|
// ==========================================================================
|
||||||
|
:root {
|
||||||
|
--font-size-body-regular: #{responsive-value(15px, 17px, $from-lg)};
|
||||||
|
--font-size-body-medium: #{responsive-value(18px, 23px, $from-lg)};
|
||||||
|
--font-size-body-small: #{responsive-value(13px, 16px, $from-lg)};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixins
|
||||||
|
// ==========================================================================
|
||||||
|
@mixin text {
|
||||||
|
font-family: ff('sans');
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin body-regular {
|
||||||
|
font-size: var(--font-size-body-regular);
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin body-medium {
|
||||||
|
font-size: var(--font-size-body-medium);
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin body-small {
|
||||||
|
font-size: var(--font-size-body-small);
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
// ==========================================================================
|
||||||
|
.c-text {
|
||||||
|
@include text;
|
||||||
|
|
||||||
|
&.-body-regular {
|
||||||
|
@include body-regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.-body-medium {
|
||||||
|
@include body-medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.-body-small {
|
||||||
|
@include body-small;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,34 +20,26 @@ html {
|
|||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
|
||||||
@media (max-width: $to-small) {
|
@media (max-width: $to-sm) {
|
||||||
font-size: $font-size - 2px;
|
font-size: $font-size - 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: $from-small) and (max-width: $to-medium) {
|
@media (min-width: $from-sm) and (max-width: $to-lg) {
|
||||||
font-size: $font-size - 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: $from-medium) and (max-width: $to-large) {
|
|
||||||
font-size: $font-size - 1px;
|
font-size: $font-size - 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: $from-large) and (max-width: $to-huge) {
|
@media (min-width: $from-lg) and (max-width: $to-2xl) {
|
||||||
font-size: $font-size; // [1]
|
font-size: $font-size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: $from-huge) and (max-width: $to-gigantic) {
|
@media (min-width: $from-2xl) and (max-width: $to-3xl) {
|
||||||
font-size: $font-size + 1px;
|
font-size: $font-size + 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: $from-gigantic) and (max-width: $to-colossal) {
|
@media (min-width: $from-3xl) {
|
||||||
font-size: $font-size + 2px;
|
font-size: $font-size + 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: $from-colossal) {
|
|
||||||
font-size: $font-size + 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.is-loading {
|
&.is-loading {
|
||||||
cursor: wait;
|
cursor: wait;
|
||||||
}
|
}
|
||||||
|
|||||||
124
assets/styles/elements/_normalize.scss
Normal file
124
assets/styles/elements/_normalize.scss
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
// ==========================================================================
|
||||||
|
// Elements / Normalize
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
// Modern CSS Normalize
|
||||||
|
// Based on the reset by Andy.set with some tweaks.
|
||||||
|
// Original by Andy.set: https://piccalil.li/blog/a-more-modern-css-reset/
|
||||||
|
// Review by Chris collier: https://chriscoyier.net/2023/10/03/being-picky-about-a-css-reset-for-fun-pleasure/
|
||||||
|
|
||||||
|
|
||||||
|
// Box sizing rules
|
||||||
|
*,
|
||||||
|
*:after,
|
||||||
|
*:before {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent font size inflation
|
||||||
|
html {
|
||||||
|
-moz-text-size-adjust: none;
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
text-size-adjust: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove default margin in favour of better control in authored CSS
|
||||||
|
p,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6,
|
||||||
|
dl,
|
||||||
|
dd,
|
||||||
|
figure,
|
||||||
|
blockquote {
|
||||||
|
margin-block: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove list styles on ul, ol elements with a class, which suggests default styling will be removed
|
||||||
|
ul[class],
|
||||||
|
ol[class] {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set core defaults
|
||||||
|
html {
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set shorter line heights on headings and interactive elements
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6,
|
||||||
|
input,
|
||||||
|
label,
|
||||||
|
button {
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Balance text wrapping on headings
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
text-wrap: balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove a elements default styles if they have a class
|
||||||
|
a[class] {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make assets easier to work with
|
||||||
|
img,
|
||||||
|
svg,
|
||||||
|
canvas,
|
||||||
|
picture {
|
||||||
|
display: block;
|
||||||
|
max-inline-size: 100%;
|
||||||
|
block-size: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inherit fonts for inputs and buttons
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure textareas without a rows attribute are not tiny
|
||||||
|
textarea:not([rows]) {
|
||||||
|
min-height: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anything that has been anchored to should have extra scroll margin
|
||||||
|
:target {
|
||||||
|
scroll-margin-block: 1rlh;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reduced mootion preference
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
*,
|
||||||
|
*:after,
|
||||||
|
*:before {
|
||||||
|
animation-duration: 0.01ms !important;
|
||||||
|
animation-iteration-count: 1 !important;
|
||||||
|
transition-duration: 0.01ms !important;
|
||||||
|
scroll-behavior: auto !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
// ==========================================================================
|
|
||||||
// Generic / Buttons
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
// 1. Allow us to style box model properties.
|
|
||||||
// 2. Fixes odd inner spacing in IE7.
|
|
||||||
// 3. Reset/normalize some styles.
|
|
||||||
// 4. Line different sized buttons up a little nicer.
|
|
||||||
// 5. Make buttons inherit font styles (often necessary when styling `input`s as buttons).
|
|
||||||
// 6. Force all button-styled elements to appear clickable.
|
|
||||||
|
|
||||||
button,
|
|
||||||
.c-button {
|
|
||||||
@include u-hocus {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
display: inline-block; // [1]
|
|
||||||
overflow: visible; // [2]
|
|
||||||
margin: 0; // [3]
|
|
||||||
padding: 0;
|
|
||||||
outline: 0;
|
|
||||||
border: 0;
|
|
||||||
background: none transparent;
|
|
||||||
color: inherit;
|
|
||||||
vertical-align: middle; // [4]
|
|
||||||
text-align: center; // [3]
|
|
||||||
text-decoration: none;
|
|
||||||
text-transform: none;
|
|
||||||
font: inherit; // [5]
|
|
||||||
line-height: normal;
|
|
||||||
cursor: pointer; // [6]
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
// ==========================================================================
|
|
||||||
// Generic / Forms
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
input,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
display: block;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
outline: 0;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 0;
|
|
||||||
background: none transparent;
|
|
||||||
color: inherit;
|
|
||||||
font: inherit;
|
|
||||||
line-height: normal;
|
|
||||||
appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
text-transform: none;
|
|
||||||
|
|
||||||
&::-ms-expand {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::-ms-value {
|
|
||||||
background: none;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// // Remove Firefox :focus dotted outline, breaks color inherit
|
|
||||||
// // &:-moz-focusring {
|
|
||||||
// // color: transparent;
|
|
||||||
// // text-shadow: 0 0 0 #000000; // Text :focus color
|
|
||||||
// // }
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
overflow: auto;
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
// ==========================================================================
|
|
||||||
// Generic
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
html {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the correct display in IE 10-.
|
|
||||||
// 1. Add the correct display in IE.
|
|
||||||
|
|
||||||
template, // [1]
|
|
||||||
[hidden] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
*,
|
|
||||||
:before,
|
|
||||||
:after {
|
|
||||||
box-sizing: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
address {
|
|
||||||
font-style: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
dfn,
|
|
||||||
cite,
|
|
||||||
em,
|
|
||||||
i {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: $font-weight-bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
figure {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. Single taps should be dispatched immediately on clickable elements
|
|
||||||
|
|
||||||
a, area, button, input, label, select, textarea, [tabindex] {
|
|
||||||
-ms-touch-action: manipulation; // [1]
|
|
||||||
touch-action: manipulation;
|
|
||||||
}
|
|
||||||
|
|
||||||
[hreflang] > abbr[title] {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-spacing: 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
display: block;
|
|
||||||
margin: 1em 0;
|
|
||||||
padding: 0;
|
|
||||||
height: 1px;
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px solid #CCCCCC;
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
// ==========================================================================
|
|
||||||
// Generic / Media
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
// 1. Setting `vertical-align` removes the whitespace that appears under `img`
|
|
||||||
// elements when they are dropped into a page as-is. Safer alternative to
|
|
||||||
// using `display: block;`.
|
|
||||||
|
|
||||||
audio,
|
|
||||||
canvas,
|
|
||||||
iframe,
|
|
||||||
img,
|
|
||||||
svg,
|
|
||||||
video {
|
|
||||||
vertical-align: middle; // [1]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the correct display in iOS 4-7.
|
|
||||||
|
|
||||||
audio:not([controls]) {
|
|
||||||
display: none;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Fluid media for responsive purposes.
|
|
||||||
|
|
||||||
img,
|
|
||||||
svg {
|
|
||||||
max-width: 100%; // [2]
|
|
||||||
height: auto;
|
|
||||||
|
|
||||||
// 4. If a `width` and/or `height` attribute have been explicitly defined,
|
|
||||||
// let’s not make the image fluid.
|
|
||||||
|
|
||||||
&[width], // [4]
|
|
||||||
&[height] {
|
|
||||||
// [4]
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Offset `alt` text from surrounding copy.
|
|
||||||
|
|
||||||
img {
|
|
||||||
font-style: italic; // [4]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5. SVG elements should fallback to their surrounding text color.
|
|
||||||
|
|
||||||
svg {
|
|
||||||
fill: currentColor; // [5]
|
|
||||||
}
|
|
||||||
@@ -20,32 +20,24 @@
|
|||||||
// Settings
|
// Settings
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
|
@import "settings/config";
|
||||||
@import "settings/config.breakpoints";
|
@import "settings/config.breakpoints";
|
||||||
@import "settings/config.colors";
|
@import "settings/config.colors";
|
||||||
@import "settings/config.eases";
|
@import "settings/config.eases";
|
||||||
@import "settings/config.fonts";
|
@import "settings/config.fonts";
|
||||||
@import "settings/config.spacers";
|
@import "settings/config.spacings";
|
||||||
@import "settings/config.timings";
|
@import "settings/config.speeds";
|
||||||
@import "settings/config.zindexes";
|
@import "settings/config.zindexes";
|
||||||
@import "settings/config";
|
|
||||||
@import "settings/config.variables";
|
@import "settings/config.variables";
|
||||||
|
|
||||||
// Generic
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
@import "node_modules/normalize.css/normalize";
|
|
||||||
@import "generic/generic";
|
|
||||||
@import "generic/media";
|
|
||||||
@import "generic/form";
|
|
||||||
@import "generic/button";
|
|
||||||
|
|
||||||
// Vendors
|
// Vendors
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
@import "node_modules/locomotive-scroll/dist/locomotive-scroll";
|
@import "../../node_modules/locomotive-scroll/dist/locomotive-scroll";
|
||||||
|
|
||||||
// Elements
|
// Elements
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
|
@import "elements/normalize";
|
||||||
@import "elements/document";
|
@import "elements/document";
|
||||||
|
|
||||||
// Objects
|
// Objects
|
||||||
@@ -62,6 +54,7 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
@import "components/heading";
|
@import "components/heading";
|
||||||
|
@import "components/text";
|
||||||
@import "components/button";
|
@import "components/button";
|
||||||
@import "components/form";
|
@import "components/form";
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,8 @@
|
|||||||
grid-template-columns: repeat(4, 1fr);
|
grid-template-columns: repeat(4, 1fr);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-col-#{$base-column-nb}\@from-medium {
|
&.-col-#{$base-column-nb}\@from-md {
|
||||||
@media (min-width: $from-medium) {
|
@media (min-width: $from-md) {
|
||||||
grid-template-columns: repeat(#{$base-column-nb}, 1fr);
|
grid-template-columns: repeat(#{$base-column-nb}, 1fr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
// // Logo
|
// // Logo
|
||||||
// .svg-logo {
|
// .svg-logo {
|
||||||
// --icon-width: #{rem(100px)};
|
// --icon-width: #{rem(100px)};
|
||||||
// --icon-ratio: 20/30; // width/height based on svg viewBox
|
// --icon-ratio: math.div(20, 30); // width/height based on svg viewBox
|
||||||
|
|
||||||
// // Sizes
|
// // Sizes
|
||||||
// .o-icon.-big & {
|
// .o-icon.-big & {
|
||||||
|
|||||||
@@ -6,15 +6,16 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
$breakpoints: (
|
$breakpoints: (
|
||||||
"tiny": 500px,
|
"2xs": 340px,
|
||||||
"small": 700px,
|
"xs": 500px,
|
||||||
"medium": 1000px,
|
"sm": 700px,
|
||||||
"large": 1200px,
|
"md": 1000px,
|
||||||
"big": 1400px,
|
"lg": 1200px,
|
||||||
"huge": 1600px,
|
"xl": 1400px,
|
||||||
"enormous": 1800px,
|
"2xl": 1600px,
|
||||||
"gigantic": 2000px,
|
"3xl": 1800px,
|
||||||
"colossal": 2400px
|
"4xl": 2000px,
|
||||||
|
"5xl": 2400px
|
||||||
);
|
);
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
@@ -75,21 +76,17 @@ $breakpoints: (
|
|||||||
// Legacy
|
// Legacy
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
$from-tiny: map-get($breakpoints, "tiny") !default;
|
$from-xs: map-get($breakpoints, "xs") !default;
|
||||||
$to-tiny: map-get($breakpoints, "tiny") - 1 !default;
|
$to-xs: map-get($breakpoints, "xs") - 1 !default;
|
||||||
$from-small: map-get($breakpoints, "small") !default;
|
$from-sm: map-get($breakpoints, "sm") !default;
|
||||||
$to-small: map-get($breakpoints, "small") - 1 !default;
|
$to-sm: map-get($breakpoints, "sm") - 1 !default;
|
||||||
$from-medium: map-get($breakpoints, "medium") !default;
|
$from-md: map-get($breakpoints, "md") !default;
|
||||||
$to-medium: map-get($breakpoints, "medium") - 1 !default;
|
$to-md: map-get($breakpoints, "md") - 1 !default;
|
||||||
$from-large: map-get($breakpoints, "large") !default;
|
$from-lg: map-get($breakpoints, "lg") !default;
|
||||||
$to-large: map-get($breakpoints, "large") - 1 !default;
|
$to-lg: map-get($breakpoints, "lg") - 1 !default;
|
||||||
$from-big: map-get($breakpoints, "big") !default;
|
$from-xl: map-get($breakpoints, "xl") !default;
|
||||||
$to-big: map-get($breakpoints, "big") - 1 !default;
|
$to-xl: map-get($breakpoints, "xl") - 1 !default;
|
||||||
$from-huge: map-get($breakpoints, "huge") !default;
|
$from-2xl: map-get($breakpoints, "2xl") !default;
|
||||||
$to-huge: map-get($breakpoints, "huge") - 1 !default;
|
$to-2xl: map-get($breakpoints, "2xl") - 1 !default;
|
||||||
$from-enormous: map-get($breakpoints, "enormous") !default;
|
$from-3xl: map-get($breakpoints, "3xl") !default;
|
||||||
$to-enormous: map-get($breakpoints, "enormous") - 1 !default;
|
$to-3xl: map-get($breakpoints, "3xl") - 1 !default;
|
||||||
$from-gigantic: map-get($breakpoints, "gigantic") !default;
|
|
||||||
$to-gigantic: map-get($breakpoints, "gigantic") - 1 !default;
|
|
||||||
$from-colossal: map-get($breakpoints, "colossal") !default;
|
|
||||||
$to-colossal: map-get($breakpoints, "colossal") - 1 !default;
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
@use 'sass:color';
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Settings / Config / Colors
|
// Settings / Config / Colors
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
@@ -18,7 +20,7 @@ $colors: (
|
|||||||
//
|
//
|
||||||
// ```scss
|
// ```scss
|
||||||
// .c-box {
|
// .c-box {
|
||||||
// color: color(primary);
|
// color: colorCode(primary);
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
@@ -26,7 +28,7 @@ $colors: (
|
|||||||
// @param {number} $alpha - The alpha for the color value.
|
// @param {number} $alpha - The alpha for the color value.
|
||||||
// @return {color}
|
// @return {color}
|
||||||
|
|
||||||
@function color($key, $alpha: 1) {
|
@function colorCode($key, $alpha: 1) {
|
||||||
@if not map-has-key($colors, $key) {
|
@if not map-has-key($colors, $key) {
|
||||||
@error "Unknown '#{$key}' in $colors.";
|
@error "Unknown '#{$key}' in $colors.";
|
||||||
}
|
}
|
||||||
@@ -44,13 +46,13 @@ $colors: (
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
// Link
|
// Link
|
||||||
$color-link: color(primary);
|
$color-link: colorCode(primary);
|
||||||
$color-link-focus: color(primary);
|
$color-link-focus: colorCode(primary);
|
||||||
$color-link-hover: darken(color(primary), 10%);
|
$color-link-hover: color.adjust(colorCode(primary), $lightness: -10%);
|
||||||
|
|
||||||
// Selection
|
// Selection
|
||||||
$color-selection-text: color(darkest);
|
$color-selection-text: colorCode(darkest);
|
||||||
$color-selection-background: color(lightest);
|
$color-selection-background: colorCode(lightest);
|
||||||
|
|
||||||
// Socials
|
// Socials
|
||||||
$color-facebook: #3B5998;
|
$color-facebook: #3B5998;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ $assets-path: "../" !default;
|
|||||||
// Base
|
// Base
|
||||||
$font-size: 16px;
|
$font-size: 16px;
|
||||||
$line-height: math.div(24px, $font-size);
|
$line-height: math.div(24px, $font-size);
|
||||||
$font-color: color(darkest);
|
$font-color: colorCode(darkest);
|
||||||
|
|
||||||
// Weights
|
// Weights
|
||||||
$font-weight-light: 300;
|
$font-weight-light: 300;
|
||||||
@@ -32,12 +32,13 @@ $easing: ease("power2.out");
|
|||||||
|
|
||||||
// Spacing Units
|
// Spacing Units
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
$unit: 60px;
|
$unit: 60px;
|
||||||
$unit-small: 20px;
|
$unit-small: 20px;
|
||||||
|
$vw-viewport: 1440;
|
||||||
|
|
||||||
// Container
|
// Container
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
$padding: $unit;
|
$padding: $unit;
|
||||||
|
|
||||||
// Grid
|
// Grid
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
// ==========================================================================
|
|
||||||
// Settings / Config / Spacers
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
// Spacers
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
$spacers: (
|
|
||||||
'gutter': var(--grid-gutter),
|
|
||||||
'xs': #{vh(5)},
|
|
||||||
'sm': #{vh(7.5)},
|
|
||||||
'md': #{vh(10)},
|
|
||||||
'lg': #{vh(12.5)},
|
|
||||||
'xl': #{vh(15)},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Function
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
// Returns spacer.
|
|
||||||
//
|
|
||||||
// ```scss
|
|
||||||
// .c-box {
|
|
||||||
// margin-top: spacer(gutter);
|
|
||||||
// }
|
|
||||||
// ```
|
|
||||||
//
|
|
||||||
// @param {string} $key - The spacer key in $spacers.
|
|
||||||
// @param {number} $multiplier - The multiplier of the spacer value.
|
|
||||||
// @return {size}
|
|
||||||
|
|
||||||
@function spacer($spacer: $spacer-default, $multiplier: 1) {
|
|
||||||
@if not map-has-key($spacers, $spacer) {
|
|
||||||
@error "Unknown master spacer: #{$spacer}";
|
|
||||||
}
|
|
||||||
|
|
||||||
$index: map-get($spacers, $spacer);
|
|
||||||
|
|
||||||
@return calc(#{$index} * #{$multiplier});
|
|
||||||
}
|
|
||||||
69
assets/styles/settings/_config.spacings.scss
Normal file
69
assets/styles/settings/_config.spacings.scss
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// ==========================================================================
|
||||||
|
// Settings / Config / Spacings
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--spacing-2xs-mobile: 6;
|
||||||
|
--spacing-2xs-desktop: 10;
|
||||||
|
|
||||||
|
--spacing-xs-mobile: 12;
|
||||||
|
--spacing-xs-desktop: 16;
|
||||||
|
|
||||||
|
--spacing-sm-mobile: 22;
|
||||||
|
--spacing-sm-desktop: 32;
|
||||||
|
|
||||||
|
--spacing-md-mobile: 32;
|
||||||
|
--spacing-md-desktop: 56;
|
||||||
|
|
||||||
|
--spacing-lg-mobile: 48;
|
||||||
|
--spacing-lg-desktop: 96;
|
||||||
|
|
||||||
|
--spacing-xl-mobile: 64;
|
||||||
|
--spacing-xl-desktop: 128;
|
||||||
|
|
||||||
|
--spacing-2xl-mobile: 88;
|
||||||
|
--spacing-2xl-desktop: 176;
|
||||||
|
|
||||||
|
--spacing-3xl-mobile: 122;
|
||||||
|
--spacing-3xl-desktop: 224;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spacings
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
$spacings: (
|
||||||
|
'gutter': var(--grid-gutter),
|
||||||
|
'2xs': #{size-clamp('2xs')},
|
||||||
|
'xs': #{size-clamp('xs')},
|
||||||
|
'sm': #{size-clamp('sm')},
|
||||||
|
'md': #{size-clamp('md')},
|
||||||
|
'lg': #{size-clamp('lg')},
|
||||||
|
'xl': #{size-clamp('xl')},
|
||||||
|
'2xl': #{size-clamp('2xl')},
|
||||||
|
'3xl': #{size-clamp('3xl')},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Function
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
// Returns spacing.
|
||||||
|
//
|
||||||
|
// ```scss
|
||||||
|
// .c-box {
|
||||||
|
// margin-top: spacing(gutter);
|
||||||
|
// }
|
||||||
|
// ```
|
||||||
|
//
|
||||||
|
// @param {string} $key - The spacing key in $spacings.
|
||||||
|
// @param {number} $multiplier - The multiplier of the spacing value.
|
||||||
|
// @return {size}
|
||||||
|
|
||||||
|
@function spacing($spacing: 'sm', $multiplier: 1) {
|
||||||
|
@if not map-has-key($spacings, $spacing) {
|
||||||
|
@error "Unknown master spacing: #{$spacing}";
|
||||||
|
}
|
||||||
|
|
||||||
|
$index: map-get($spacings, $spacing);
|
||||||
|
|
||||||
|
@return calc(#{$index} * #{$multiplier});
|
||||||
|
}
|
||||||
@@ -1,23 +1,20 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Settings / Config / Timings
|
// Settings / Config / Speeds
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
// Timings
|
// Speeds
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
$timings: (
|
$speeds: (
|
||||||
fastest: 0.1s,
|
fastest: 0.1s,
|
||||||
faster: 0.15s,
|
faster: 0.15s,
|
||||||
fast: 0.25s,
|
fast: 0.25s,
|
||||||
normal: 0.5s,
|
normal: 0.3s,
|
||||||
slow: 0.75s,
|
slow: 0.5s,
|
||||||
slower: 1s,
|
slower: 0.75s,
|
||||||
slowest: 2s,
|
slowest: 1s,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Default timing for t()
|
|
||||||
$timing-default: "normal" !default;
|
|
||||||
|
|
||||||
// Function
|
// Function
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
@@ -25,17 +22,17 @@ $timing-default: "normal" !default;
|
|||||||
//
|
//
|
||||||
// ```scss
|
// ```scss
|
||||||
// .c-box {
|
// .c-box {
|
||||||
// transition-duration: t(slow);
|
// transition-duration: speed(slow);
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
// @param {string} $key - The timing key in $timings.
|
// @param {string} $key - The speed key in $speeds.
|
||||||
// @return {duration}
|
// @return {duration}
|
||||||
|
|
||||||
@function t($key: $timing-default) {
|
@function speed($key: "normal") {
|
||||||
@if not map-has-key($timings, $key) {
|
@if not map-has-key($speeds, $key) {
|
||||||
@error "Unknown '#{$key}' in $timings.";
|
@error "Unknown '#{$key}' in $speeds.";
|
||||||
}
|
}
|
||||||
|
|
||||||
@return map-get($timings, $key);
|
@return map-get($speeds, $key);
|
||||||
}
|
}
|
||||||
@@ -12,20 +12,7 @@
|
|||||||
// Container
|
// Container
|
||||||
--container-width: calc(100% - 2 * var(--grid-margin));
|
--container-width: calc(100% - 2 * var(--grid-margin));
|
||||||
|
|
||||||
// Font sizes
|
@media (min-width: $from-sm) {
|
||||||
--font-size-h1: #{responsive-type(36px, 72px, 1400px)};
|
|
||||||
--font-size-h2: #{rem(28px)};
|
|
||||||
--font-size-h3: #{rem(24px)};
|
|
||||||
--font-size-h4: #{rem(20px)};
|
|
||||||
--font-size-h5: #{rem(18px)};
|
|
||||||
--font-size-h6: #{rem(16px)};
|
|
||||||
|
|
||||||
// // Colors
|
|
||||||
// @each $color, $value in $colors {
|
|
||||||
// --color-#{"" + $color}: #{$value};
|
|
||||||
// }
|
|
||||||
|
|
||||||
@media (min-width: $from-small) {
|
|
||||||
--grid-columns: #{$base-column-nb};
|
--grid-columns: #{$base-column-nb};
|
||||||
--grid-gutter: #{rem(16px)};
|
--grid-gutter: #{rem(16px)};
|
||||||
--grid-margin: #{rem(20px)};
|
--grid-margin: #{rem(20px)};
|
||||||
|
|||||||
@@ -48,17 +48,6 @@
|
|||||||
@return math.div($size, $base) * 1rem;
|
@return math.div($size, $base) * 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts a number to a percentage.
|
|
||||||
//
|
|
||||||
// @alias percentage()
|
|
||||||
// @link http://sassdoc.com/annotations/#alias
|
|
||||||
// @param {Number} $number - The value to convert.
|
|
||||||
// @return {Number} A percentage.
|
|
||||||
|
|
||||||
@function span($number) {
|
|
||||||
@return percentage($number);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks if a list contains a value(s).
|
// Checks if a list contains a value(s).
|
||||||
//
|
//
|
||||||
// @link https://github.com/thoughtbot/bourbon/blob/master/core/bourbon/validators/_contains.scss
|
// @link https://github.com/thoughtbot/bourbon/blob/master/core/bourbon/validators/_contains.scss
|
||||||
@@ -125,11 +114,11 @@ $context: 'frontend' !default;
|
|||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
// @param {number} $number - The percentage spacer
|
// @param {number} $percentage - The percentage spacer
|
||||||
// @param {number} $inset - The grid gutter inset
|
// @param {number} $inset - The grid gutter inset
|
||||||
// @return {function<number>}
|
// @return {function<number>}
|
||||||
@function grid-space($percentage, $inset: 0) {
|
@function grid-space($percentage, $inset: 0) {
|
||||||
@return calc(#{$percentage} * (100vw - 2 * var(--grid-margin, 0px)) - (1 - #{$percentage}) * var(--grid-gutter, 0px) + #{$inset} * var(--grid-gutter, 0px));
|
@return calc(#{$percentage} * (#{vw(100)} - 2 * var(--grid-margin, 0px)) - (1 - #{$percentage}) * var(--grid-gutter, 0px) + #{$inset} * var(--grid-gutter, 0px));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns calculation of a percentage of the viewport small height.
|
// Returns calculation of a percentage of the viewport small height.
|
||||||
@@ -189,16 +178,29 @@ $context: 'frontend' !default;
|
|||||||
@return calc(#{$number} * var(--vw, 1vw));
|
@return calc(#{$number} * var(--vw, 1vw));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@function clamp-with-max($min, $size, $max) {
|
||||||
|
$vw-context: $vw-viewport * 0.01;
|
||||||
|
@return clamp(#{$min}, calc(#{$size} / #{$vw-context} * 1vw), #{$max});
|
||||||
|
}
|
||||||
|
|
||||||
|
@function size-clamp($size) {
|
||||||
|
@return clamp-with-max(
|
||||||
|
calc(#{rem(1px)} * var(--spacing-#{$size}-mobile)),
|
||||||
|
var(--spacing-#{$size}-desktop),
|
||||||
|
calc(#{rem(1px)} * var(--spacing-#{$size}-desktop))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Returns clamp of calculated preferred responsive font size
|
// Returns clamp of calculated preferred responsive font size
|
||||||
// within a font size and breakpoint range.
|
// within a font size and breakpoint range.
|
||||||
//
|
//
|
||||||
// ```scss
|
// ```scss
|
||||||
// .c-heading.-h1 {
|
// .c-heading.-h1 {
|
||||||
// font-size: responsive-type(30px, 60px, 1800);
|
// font-size: responsive-value(30px, 60px, 1800);
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// .c-heading.-h2 {
|
// .c-heading.-h2 {
|
||||||
// font-size: responsive-type(20px, 40px, $from-big);
|
// font-size: responsive-value(20px, 40px, $from-xl);
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
//
|
//
|
||||||
@@ -206,7 +208,7 @@ $context: 'frontend' !default;
|
|||||||
// @param {number} $max-size - Maximum font size in pixels.
|
// @param {number} $max-size - Maximum font size in pixels.
|
||||||
// @param {number} $breakpoint - Maximum breakpoint.
|
// @param {number} $breakpoint - Maximum breakpoint.
|
||||||
// @return {function<number, function<number>, number>}
|
// @return {function<number, function<number>, number>}
|
||||||
@function responsive-type($min-size, $max-size, $breakpoint) {
|
@function responsive-value($min-size, $max-size, $breakpoint) {
|
||||||
$delta: math.div($max-size, $breakpoint);
|
$delta: math.div($max-size, $breakpoint);
|
||||||
@return clamp($min-size, calc(#{strip-unit($delta)} * #{vw(100)}), $max-size);
|
@return clamp($min-size, calc(#{strip-unit($delta)} * #{vw(100)}), $max-size);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,11 @@
|
|||||||
///
|
///
|
||||||
/// @example
|
/// @example
|
||||||
/// .u-margin-top {}
|
/// .u-margin-top {}
|
||||||
/// .u-padding-left-large {}
|
/// .u-margin-top-xs {}
|
||||||
/// .u-margin-right-small {}
|
/// .u-padding-left-lg {}
|
||||||
|
/// .u-margin-right-sm {}
|
||||||
/// .u-padding {}
|
/// .u-padding {}
|
||||||
/// .u-padding-right-none {}
|
/// .u-padding-right-none {}
|
||||||
/// .u-padding-horizontal {}
|
|
||||||
/// .u-padding-vertical-small {}
|
|
||||||
///
|
///
|
||||||
/// @link https://github.com/inuitcss/inuitcss/blob/512977a/utilities/_utilities.spacing.scss
|
/// @link https://github.com/inuitcss/inuitcss/blob/512977a/utilities/_utilities.spacing.scss
|
||||||
////
|
////
|
||||||
@@ -35,7 +34,7 @@ $spacing-properties: (
|
|||||||
'margin': 'margin',
|
'margin': 'margin',
|
||||||
) !default;
|
) !default;
|
||||||
|
|
||||||
$spacing-sizes: join($spacers, (
|
$spacing-sizes: join($spacings, (
|
||||||
null: var(--grid-gutter),
|
null: var(--grid-gutter),
|
||||||
'none': 0
|
'none': 0
|
||||||
));
|
));
|
||||||
@@ -51,8 +50,8 @@ $spacing-sizes: join($spacers, (
|
|||||||
// Base class
|
// Base class
|
||||||
$base-class: ".u-" + #{$property-namespace}#{$direction-namespace}#{$size-namespace};
|
$base-class: ".u-" + #{$property-namespace}#{$direction-namespace}#{$size-namespace};
|
||||||
|
|
||||||
// Spacer without media query
|
// Spacing without media query
|
||||||
@if $breakpoint == "tiny" {
|
@if $breakpoint == "xs" {
|
||||||
#{$base-class} {
|
#{$base-class} {
|
||||||
@each $direction in $directions {
|
@each $direction in $directions {
|
||||||
#{$property}#{$direction}: $size !important;
|
#{$property}#{$direction}: $size !important;
|
||||||
@@ -60,7 +59,7 @@ $spacing-sizes: join($spacers, (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spacer min-width breakpoints `@from-*`
|
// Spacing min-width breakpoints `@from-*`
|
||||||
#{$base-class}\@from-#{$breakpoint} {
|
#{$base-class}\@from-#{$breakpoint} {
|
||||||
@media #{mq-min($breakpoint)} {
|
@media #{mq-min($breakpoint)} {
|
||||||
@each $direction in $directions {
|
@each $direction in $directions {
|
||||||
@@ -69,7 +68,7 @@ $spacing-sizes: join($spacers, (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spacer max-width breakpoints @to-*`
|
// Spacing max-width breakpoints @to-*`
|
||||||
#{$base-class}\@to-#{$breakpoint} {
|
#{$base-class}\@to-#{$breakpoint} {
|
||||||
@media #{mq-max($breakpoint)} {
|
@media #{mq-max($breakpoint)} {
|
||||||
@each $direction in $directions {
|
@each $direction in $directions {
|
||||||
|
|||||||
@@ -46,14 +46,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// .is-hidden\@to-large {
|
// .is-hidden\@to-lg {
|
||||||
// @media (max-width: $to-large) {
|
// @media (max-width: $to-lg) {
|
||||||
// display: none;
|
// display: none;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// .is-hidden\@from-large {
|
// .is-hidden\@from-lg {
|
||||||
// @media (min-width: $from-large) {
|
// @media (min-width: $from-lg) {
|
||||||
// display: none;
|
// display: none;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ $widths-fractions: 1 2 3 4 5 !default;
|
|||||||
|
|
||||||
@include widths($widths-fractions);
|
@include widths($widths-fractions);
|
||||||
|
|
||||||
.u-1\/2\@from-small {
|
.u-1\/2\@from-sm {
|
||||||
@media (min-width: $from-small) {
|
@media (min-width: $from-sm) {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
* @file Provides simple user configuration options.
|
* @file Provides simple user configuration options.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import loconfig from '../../loconfig.json' assert { type: 'json' };
|
import loconfig from '../../loconfig.json' with { type: 'json' };
|
||||||
import { merge } from '../utils/index.js';
|
import { merge } from '../utils/index.js';
|
||||||
|
|
||||||
let usrconfig;
|
let usrconfig;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
usrconfig = await import('../../loconfig.local.json', {
|
usrconfig = await import('../../loconfig.local.json', {
|
||||||
assert: { type: 'json' },
|
with: { type: 'json' },
|
||||||
});
|
});
|
||||||
usrconfig = usrconfig.default;
|
usrconfig = usrconfig.default;
|
||||||
|
|
||||||
|
|||||||
@@ -10,12 +10,9 @@ import resolve from '../helpers/template.js';
|
|||||||
import { merge } from '../utils/index.js';
|
import { merge } from '../utils/index.js';
|
||||||
import { writeFile } from 'node:fs/promises';
|
import { writeFile } from 'node:fs/promises';
|
||||||
import { basename } from 'node:path';
|
import { basename } from 'node:path';
|
||||||
import { promisify } from 'node:util';
|
|
||||||
import * as sass from 'sass';
|
import * as sass from 'sass';
|
||||||
import { PurgeCSS } from 'purgecss';
|
import { PurgeCSS } from 'purgecss';
|
||||||
|
|
||||||
const sassRender = promisify(sass.render);
|
|
||||||
|
|
||||||
let postcssProcessor;
|
let postcssProcessor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,16 +21,15 @@ let postcssProcessor;
|
|||||||
* @const {object} productionSassOptions - The predefined Sass options for production.
|
* @const {object} productionSassOptions - The predefined Sass options for production.
|
||||||
*/
|
*/
|
||||||
export const defaultSassOptions = {
|
export const defaultSassOptions = {
|
||||||
omitSourceMapUrl: true,
|
sourceMapIncludeSources: true,
|
||||||
sourceMap: true,
|
sourceMap: true,
|
||||||
sourceMapContents: true,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const developmentSassOptions = Object.assign({}, defaultSassOptions, {
|
export const developmentSassOptions = Object.assign({}, defaultSassOptions, {
|
||||||
outputStyle: 'expanded',
|
style: 'expanded',
|
||||||
});
|
});
|
||||||
export const productionSassOptions = Object.assign({}, defaultSassOptions, {
|
export const productionSassOptions = Object.assign({}, defaultSassOptions, {
|
||||||
outputStyle: 'compressed',
|
style: 'compressed',
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -127,10 +123,7 @@ export default async function compileStyles(sassOptions = null, postcssOptions =
|
|||||||
infile = resolve(infile);
|
infile = resolve(infile);
|
||||||
outfile = resolve(outfile);
|
outfile = resolve(outfile);
|
||||||
|
|
||||||
let result = await sassRender(Object.assign({}, sassOptions, {
|
let result = sass.compile(infile, sassOptions);
|
||||||
file: infile,
|
|
||||||
outFile: outfile,
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (supportsPostCSS && postcssOptions) {
|
if (supportsPostCSS && postcssOptions) {
|
||||||
if (typeof postcssProcessor === 'undefined') {
|
if (typeof postcssProcessor === 'undefined') {
|
||||||
|
|||||||
@@ -1,21 +1,36 @@
|
|||||||
import loconfig from '../helpers/config.js';
|
import loconfig from '../helpers/config.js';
|
||||||
|
import glob, { supportsGlob } from '../helpers/glob.js';
|
||||||
import message from '../helpers/message.js';
|
import message from '../helpers/message.js';
|
||||||
import notification from '../helpers/notification.js';
|
import notification from '../helpers/notification.js';
|
||||||
import resolve from '../helpers/template.js';
|
import { resolve as resolveTemplate } from '../helpers/template.js';
|
||||||
import { merge } from '../utils/index.js';
|
import { merge } from '../utils/index.js';
|
||||||
import { basename } from 'node:path';
|
import {
|
||||||
|
basename,
|
||||||
|
dirname,
|
||||||
|
extname,
|
||||||
|
resolve,
|
||||||
|
} from 'node:path';
|
||||||
|
import commonPath from 'common-path';
|
||||||
import mixer from 'svg-mixer';
|
import mixer from 'svg-mixer';
|
||||||
|
import slugify from 'url-slug';
|
||||||
|
|
||||||
|
const basePath = loconfig?.paths?.svgs?.src
|
||||||
|
? resolve(loconfig.paths.svgs.src)
|
||||||
|
: null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @const {object} defaultMixerOptions - The default shared Mixer options.
|
* @const {object} defaultMixerOptions - The default shared Mixer options.
|
||||||
* @const {object} developmentMixerOptions - The predefined Mixer options for development.
|
|
||||||
* @const {object} productionMixerOptions - The predefined Mixer options for production.
|
|
||||||
*/
|
*/
|
||||||
export const defaultMixerOptions = {
|
export const defaultMixerOptions = {
|
||||||
spriteConfig: {
|
spriteConfig: {
|
||||||
usages: false,
|
usages: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @const {object} developmentMixerOptions - The predefined Mixer options for development.
|
||||||
|
* @const {object} productionMixerOptions - The predefined Mixer options for production.
|
||||||
|
*/
|
||||||
export const developmentMixerOptions = Object.assign({}, defaultMixerOptions);
|
export const developmentMixerOptions = Object.assign({}, defaultMixerOptions);
|
||||||
export const productionMixerOptions = Object.assign({}, defaultMixerOptions);
|
export const productionMixerOptions = Object.assign({}, defaultMixerOptions);
|
||||||
|
|
||||||
@@ -74,10 +89,52 @@ export default async function compileSVGs(mixerOptions = null) {
|
|||||||
includes = [ includes ];
|
includes = [ includes ];
|
||||||
}
|
}
|
||||||
|
|
||||||
includes = resolve(includes);
|
includes = resolveTemplate(includes);
|
||||||
outfile = resolve(outfile);
|
outfile = resolveTemplate(outfile);
|
||||||
|
|
||||||
const result = await mixer(includes, mixerOptions);
|
if (supportsGlob && basePath) {
|
||||||
|
includes = await glob(includes);
|
||||||
|
includes = [ ...new Set(includes) ];
|
||||||
|
|
||||||
|
const common = commonPath(includes);
|
||||||
|
if (common.commonDir) {
|
||||||
|
common.commonDir = resolve(common.commonDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates the `<symbol id>` attribute and prefix any
|
||||||
|
* SVG files in subdirectories according to the paths
|
||||||
|
* common base path.
|
||||||
|
*
|
||||||
|
* Example for SVG source path `./assets/images/sprite`:
|
||||||
|
*
|
||||||
|
* | Path | ID |
|
||||||
|
* | ------------------------------------ | --------- |
|
||||||
|
* | `./assets/images/sprite/foo.svg` | `foo` |
|
||||||
|
* | `./assets/images/sprite/baz/qux.svg` | `baz-qux` |
|
||||||
|
*
|
||||||
|
* @param {string} path - The absolute path to the file.
|
||||||
|
* @param {string} [query=''] - A query string.
|
||||||
|
* @return {string} The symbol ID.
|
||||||
|
*/
|
||||||
|
mixerOptions.generateSymbolId = (path, query = '') => {
|
||||||
|
let dirName = dirname(path)
|
||||||
|
.replace(common.commonDir ?? basePath, '')
|
||||||
|
.replace(/^\/|\/$/, '')
|
||||||
|
.replace('/', '-');
|
||||||
|
if (dirName) {
|
||||||
|
dirName += '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName = basename(path, extname(path));
|
||||||
|
const decodedQuery = decodeURIComponent(decodeURIComponent(query));
|
||||||
|
return `${dirName}${fileName}${slugify(decodedQuery)}`;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await mixer(includes, {
|
||||||
|
...mixerOptions,
|
||||||
|
});
|
||||||
|
|
||||||
await result.write(outfile);
|
await result.write(outfile);
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,8 @@ The first step is to set intial SCSS values in the following files :
|
|||||||
grid-template-columns: repeat(4, 1fr);
|
grid-template-columns: repeat(4, 1fr);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-col-#{$base-column-nb}\@from-medium {
|
&.-col-#{$base-column-nb}\@from-md {
|
||||||
@media (min-width: $from-medium) {
|
@media (min-width: $from-md) {
|
||||||
grid-template-columns: repeat(#{$base-column-nb}, 1fr);
|
grid-template-columns: repeat(#{$base-column-nb}, 1fr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,10 +80,10 @@ Learn about [namespacing](https://csswizardry.com/2015/03/more-transparent-ui-co
|
|||||||
}
|
}
|
||||||
|
|
||||||
.c-block_heading {
|
.c-block_heading {
|
||||||
@media (max-width: $to-medium) {
|
@media (max-width: $to-md) {
|
||||||
.c-block.-large & {
|
.c-block.-large & {
|
||||||
margin-bottom: rem(40px);
|
margin-bottom: rem(40px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"dest": "./www/assets/scripts"
|
"dest": "./www/assets/scripts"
|
||||||
},
|
},
|
||||||
"svgs": {
|
"svgs": {
|
||||||
"src": "./assets/images/sprite",
|
"src": "./assets/svgs",
|
||||||
"dest": "./www/assets/images"
|
"dest": "./www/assets/images"
|
||||||
},
|
},
|
||||||
"views": {
|
"views": {
|
||||||
|
|||||||
8633
package-lock.json
generated
8633
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
37
package.json
37
package.json
@@ -6,39 +6,42 @@
|
|||||||
"author": "Locomotive <info@locomotive.ca>",
|
"author": "Locomotive <info@locomotive.ca>",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.1",
|
"node": ">=20",
|
||||||
"npm": ">=8.0"
|
"npm": ">=10"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node --experimental-json-modules --no-warnings build/watch.js",
|
"start": "node --no-warnings build/watch.js",
|
||||||
"build": "node --experimental-json-modules --no-warnings build/build.js"
|
"build": "node --no-warnings build/build.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"locomotive-scroll": "^5.0.0-beta.11",
|
"locomotive-scroll": "^5.0.0-beta.21",
|
||||||
"modujs": "^1.4.2",
|
"modujs": "^1.4.2",
|
||||||
"modularload": "^1.2.6",
|
"modularload": "^1.2.6"
|
||||||
"normalize.css": "^8.0.1",
|
|
||||||
"svg4everybody": "^2.1.9"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^10.4.17",
|
"autoprefixer": "^10.4.21",
|
||||||
"browser-sync": "^3.0.2",
|
"browser-sync": "^3.0.4",
|
||||||
|
"common-path": "^1.0.1",
|
||||||
"concat": "^1.0.3",
|
"concat": "^1.0.3",
|
||||||
"esbuild": "^0.20.0",
|
"esbuild": "^0.25.8",
|
||||||
"kleur": "^4.1.5",
|
"kleur": "^4.1.5",
|
||||||
"node-notifier": "^10.0.1",
|
"node-notifier": "^10.0.1",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.5.6",
|
||||||
"purgecss": "^5.0.0",
|
"purgecss": "^7.0.2",
|
||||||
"sass": "^1.70.0",
|
"sass": "^1.89.2",
|
||||||
"svg-mixer": "~2.3.14",
|
"svg-mixer": "^2.3.14",
|
||||||
"tiny-glob": "^0.2.9"
|
"tiny-glob": "^0.2.9"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"browser-sync": {
|
"browser-sync": {
|
||||||
"ua-parser-js": "~1.0.33"
|
"ua-parser-js": "^1.0.33"
|
||||||
},
|
},
|
||||||
"svg-mixer": {
|
"svg-mixer": {
|
||||||
"postcss": "^8.4.20"
|
"micromatch": "^4.0.8",
|
||||||
|
"postcss": "^8.4.49"
|
||||||
|
},
|
||||||
|
"svg-mixer-utils": {
|
||||||
|
"anymatch": "^3.1.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
{"version":3,"sources":[],"names":[],"mappings":"","file":"critical.css"}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -96,9 +96,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script nomodule src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.6.0/polyfill.min.js" crossorigin="anonymous"></script>
|
|
||||||
<script nomodule src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.remove%2CElement.prototype.append%2Cfetch%2CCustomEvent%2CElement.prototype.matches%2CNodeList.prototype.forEach%2CAbortController" crossorigin="anonymous"></script>
|
|
||||||
|
|
||||||
<script src="assets/scripts/vendors.js" defer></script>
|
<script src="assets/scripts/vendors.js" defer></script>
|
||||||
<script src="assets/scripts/app.js" defer></script>
|
<script src="assets/scripts/app.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -83,12 +83,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script nomodule src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.6.0/polyfill.min.js"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
<script nomodule
|
|
||||||
src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.remove%2CElement.prototype.append%2Cfetch%2CCustomEvent%2CElement.prototype.matches%2CNodeList.prototype.forEach%2CAbortController"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
|
|
||||||
<script src="assets/scripts/vendors.js" defer></script>
|
<script src="assets/scripts/vendors.js" defer></script>
|
||||||
<script src="assets/scripts/app.js" defer></script>
|
<script src="assets/scripts/app.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -122,9 +122,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script nomodule src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.6.0/polyfill.min.js" crossorigin="anonymous"></script>
|
|
||||||
<script nomodule src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.remove%2CElement.prototype.append%2Cfetch%2CCustomEvent%2CElement.prototype.matches%2CNodeList.prototype.forEach%2CAbortController" crossorigin="anonymous"></script>
|
|
||||||
|
|
||||||
<script src="assets/scripts/vendors.js" defer></script>
|
<script src="assets/scripts/vendors.js" defer></script>
|
||||||
<script src="assets/scripts/app.js" defer></script>
|
<script src="assets/scripts/app.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -69,12 +69,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script nomodule src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.6.0/polyfill.min.js"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
<script nomodule
|
|
||||||
src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.remove%2CElement.prototype.append%2Cfetch%2CCustomEvent%2CElement.prototype.matches%2CNodeList.prototype.forEach%2CAbortController"
|
|
||||||
crossorigin="anonymous"></script>
|
|
||||||
|
|
||||||
<script src="assets/scripts/vendors.js" defer></script>
|
<script src="assets/scripts/vendors.js" defer></script>
|
||||||
<script src="assets/scripts/app.js" defer></script>
|
<script src="assets/scripts/app.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user