d4ded2a64e34906dfe53c2ffd4ee79b3ee9b6b73
Changed:
- Renamed 'mconfig.json' to 'loconfig.json'.
- Renamed 'concat.js' to 'concats.js' to represent flexible functionality.
- loconfig.json: Base paths are nested under "paths".
- loconfig.json: Paths for tasks are nested under "tasks".
- Refactored each task to process corresponding entries under "tasks" in 'loconfig.json'.
- watch.js: Changed concats watch to use task's includes.
Added:
- tiny-glob v0.2.9
- Utility 'glob.js' to use dynamic imports to fetch an available glob function from node modules.
- Utility 'template.js' to provide a function to render template tags (`{% ... %}`) in tasks.
- concats.js: Support for concatenating groupes of files.
- scripts.js: Support for ESBuild's "outdir" option.
Locomotive Boilerplate
Front-end boilerplate for projects by Locomotive.
Requirements
| Name | Version |
|---|---|
| Node | > 14.15 |
You can use nvm to install the node version in .nvmrc.
Installation
npm i
Usage
# start it
npm start
Configuration
Rename occurrences of locomotive-boilerplate with your project's name in loconfig.json.
Build
Tasks
# watch
npm start
# build
npm run build
Styles
Sass is our CSS preprocessor. Autoprefixer is also included.
Architecture
ITCSS is our CSS architecture.
settings: Global variables, site-wide settings, config switches, etc.tools: Site-wide mixins and functions.generic: Low-specificity, far-reaching rulesets (e.g. resets).elements: Unclassed HTML elements (e.g.a {},blockquote {},address {}).objects: Objects, abstractions, and design patterns (e.g..o-layout {}).components: Discrete, complete chunks of UI (e.g..c-carousel {}).utilities: High-specificity, very explicit selectors. Overrides and helper classes (e.g..u-hidden {})
Naming
We use a simplified BEM syntax.
.block .block_element -modifier
Namespaces
We namespace our classes for more transparency.
o-: Object that it may be used in any number of unrelated contexts to the one you can currently see it in. Making modifications to these types of class could potentially have knock-on effects in a lot of other unrelated places.c-: Component is a concrete, implementation-specific piece of UI. All of the changes you make to its styles should be detectable in the context you’re currently looking at. Modifying these styles should be safe and have no side effects.u-: Utility has a very specific role (often providing only one declaration) and should not be bound onto or changed. It can be reused and is not tied to any specific piece of UI.s-: Scope creates a new styling context. Similar to a Theme, but not necessarily cosmetic, these should be used sparingly—they can be open to abuse and lead to poor CSS if not used wisely.is-,has-: Is currently styled a certain way because of a state or condition. It tells us that the DOM currently has a temporary, optional, or short-lived style applied to it due to a certain state being invoked.
Example
<div class="c-block -large">
<div class="c-block_layout o-layout">
<div class="o-layout_item u-1/2@from-medium">
<div class="c-block_heading o-h -medium">Heading</div>
</div>
<div class="o-layout_item u-1/2@from-medium">
<a class="c-block_button o-button -outline" href="#">Button</a>
</div>
</div>
</div>
.c-block {
&.-large {
padding: rem(60px);
}
}
.c-block_heading {
@media (max-width: $to-medium) {
.c-block.-large & {
margin-bottom: rem(40px);
}
}
}
Scripts
modularJS is a small framework we use on top of ES modules. It compiles with Rollup and Babel.
Why
- Automatically init visible modules.
- Easily call other modules methods.
- Quickly set scoped events with delegation.
- Simply select DOM elements scoped in their module.
Example
<div data-module-example>
<div data-example="main">
<h2>Example</h2>
</div>
<button data-example="load">More</button>
</div>
import { module } from 'modujs';
export default class extends module {
constructor(m) {
super(m);
this.events = {
click: {
load: 'loadMore'
}
}
}
loadMore() {
this.$('main')[0].classList.add('is-loading');
}
}
Page transitions
modularLoad is used for page transitions and lazy loading.
Example
<nav>
<a href="/">Home</a>
<a href="/page" data-load="transitionName">Page</a>
</nav>
<div data-load-container>
<img data-load-src="assets/images/hello.jpg">
</div>
import modularLoad from 'modularload';
this.load = new modularLoad({
enterDelay: 300,
transitions: {
transitionName: {
enterDelay: 450
}
}
});
Scroll detection
Locomotive Scroll is used for elements in viewport detection and smooth scrolling with parallax.
Example
<div data-module-scroll>
<div data-scroll>Trigger</div>
<div data-scroll data-scroll-speed="1">Parallax</div>
</div>
import LocomotiveScroll from 'locomotive-scroll';
this.scroll = new LocomotiveScroll({
el: this.el,
smooth: true
});
Description
Languages
JavaScript
64.5%
SCSS
22.1%
HTML
7%
CSS
6.4%