# Technologies * [Styles](#styles) * [CSS Architecture](#css-architecture) * [CSS Naming Convention](#css-naming-convention) * [CSS Namespacing](#css-namespacing) * [Example](#example-1) * [Scripts](#scripts) * [Example](#example-2) * [Page transitions](#page-transitions) * [Example](#example-3) * [Scroll detection](#scroll-detection) * [Example](#example-4) ## Styles [SCSS][Sass] is a superset of CSS that adds many helpful features to improve and modularize our styles. We use [node-sass] (LibSass) for processing and minifying SCSS into CSS. We also use [PostCSS] and [Autoprefixer] to parse our CSS and add vendor prefixes for experimental features. #### CSS Architecture The boilerplate's CSS architecture is based on [Inuit CSS][inuitcss] and [ITCSS]. * `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 {}`) Learn more about [Inuit CSS](https://github.com/inuitcss/inuitcss#css-directory-structure). #### CSS Naming Convention We use a simplified [BEM] (Block, Element, Modifier) syntax: * `.block` * `.block_element` * `.-modifier` #### CSS Namespacing We namespace our classes for more UI 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. Learn about [namespacing](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/). #### Example \#1 ```html
Heading
``` ```scss .c-block { &.-large { padding: rem(60px); } } .c-block_heading { @media (max-width: $to-medium) { .c-block.-large & { margin-bottom: rem(40px); } } } ``` ## Scripts We use [esbuild] for bundling and minifying JavaScript/ES6. [modularJS] is a small framework we use on top of ES modules. * Automatically init visible modules. * Easily call other modules methods. * Quickly set scoped events with delegation. * Simply select DOM elements scoped in their module. [_source_](https://github.com/modularorg/modularjs#why) #### Example \#2 ```html

Example

``` ```js 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'); } } ``` Learn more about [modularJS]. ## Page transitions [modularLoad] is used for page transitions and lazy loading. #### Example \#3 ```html
``` ```js import modularLoad from 'modularload'; this.load = new modularLoad({ enterDelay: 300, transitions: { transitionName: { enterDelay: 450 } } }); ``` Learn more about [modularLoad]. ## Scroll detection [Locomotive Scroll][locomotive-scroll] is used for elements in viewport detection and smooth scrolling with parallax. #### Example \#4 ```html
Trigger
Parallax
``` ```js import LocomotiveScroll from 'locomotive-scroll'; this.scroll = new LocomotiveScroll({ el: this.el, smooth: true }); ```` Learn more about [Locomotive Scroll][locomotive-scroll]. [Autoprefixer]: https://autoprefixer.github.io/ [BEM]: https://bem.info/ [BrowserSync]: https://browsersync.io/ [esbuild]: https://esbuild.github.io/ [inuitcss]: https://github.com/inuitcss/inuitcss [ITCSS]: https://itcss.io/ [locomotive-scroll]: https://github.com/locomotivemtl/locomotive-scroll [modularJS]: https://github.com/modularorg/modularjs [modularLoad]: https://github.com/modularorg/modularload [node-sass]: https://github.com/sass/node-sass [PostCSS]: https://postcss.org/ [Sass]: https://sass-lang.com/ [svg-mixer]: https://github.com/JetBrains/svg-mixer [Node]: https://nodejs.org/ [NPM]: https://npmjs.com/ [NVM]: https://github.com/nvm-sh/nvm