Core
Eddy's core.
Table of Contents
Getting Started
To use Eddy's core, run the following command in your project.
yarn add --dev @eddy-aus/core
Then add the following @use
statement in your Sass:
@use '~@eddy-aus/core/sass';
Configuration
The following options can be configured by creating a con file in your project's root diretory.
Dark Scheme
The darkScheme
property includes a dark scheme in your project's CSS
Boilerplate.
Syntax
Name | Type | Default Value |
---|---|---|
darkScheme |
{boolean} |
true |
Example
To exclude a dark scheme, configure your eddy.config.js
file as follows:
// eddy.config.js
module.exports = {
darkScheme: false,
};
Note: if the boilerplate
property is set to false
then any darkScheme
configuration will have no effect.
font-size
The $font-size
variable sets the root font-size
in your project's Sass.
Syntax
Name | Type | Default Value |
---|---|---|
$font-size |
{number} |
16px |
Example
To change the root font-size
, configure your @use
statement as follows:
@use '~@eddy-aus/core/sass' with (
$font-size: 20px
);
namespace
The $namespace
variable includes a namespace in your project's Sass.
Syntax
Name | Type | Default Value |
---|---|---|
$namespace |
{(string|false)} |
false |
Example
To include a namespace, configure your @use
statement as follows:
@use '~@eddy-aus/core/sass' with (
$namespace: 'eddy'
);
reset
The $reset
variable includes a CSS Reset in your project's CSS Boilerplate.
Syntax
Name | Type | Default Value |
---|---|---|
$reset |
{bool} |
true |
Example
To exclude a CSS Reset from your project, configure your @use
statement as
follows:
@use '~@eddy-aus/core/sass' with (
$reset: false
);
root
The $root
variable includes a root selector in your project's Sass.
Syntax
Name | Type | Default Value |
---|---|---|
$root |
{(string|false)} |
false |
Example
To include a root selector, configure your @use
statement as follows:
@use '~@eddy-aus/core/sass' with (
$root: '#root'
);
vendors
The $vendors
variable includes vendor-specific Custom Properties in your
project's CSS Boilerplate.
Syntax
Name | Type | Default Value |
---|---|---|
$vendors |
{((swinburne?: string(), yoobee?: string())|false)} |
(swinburne: '.swiburne', yoobee: '.yoobee') |
Examples
To exclude all vendors, configure your @use
statement as follows:
@use '~@eddy-aus/core/sass' with (
$vendors: false
);
To exclude specific vendors, configure your @use
statement as follows:
@use '~@eddy-aus/core/sass' with (
$vendors: (
swinburne: (
'.swinburne',
),
)
);
JavaScript
Sass
Functions
The following functions are available for use in your project.
circ
The circ()
function converts a diameter to its corresponding circumference.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$diameter |
{number} |
None | The diameter to convert |
Returns
Type | Description |
---|---|
{number} |
The corresponding circumference |
Examples
circ(12);
// => 37.6991118431
circ(20px);
// => 62.8318530718px
class
The class()
function converts strings into classes.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$strings |
{string()} |
None | The strings to convert |
Returns
Type | Description |
---|---|
{string} |
The classes |
Examples
class('active');
// => .active
$namespace: 'eddy';
class('mounted', 'active');
// => .eddy-mounted.eddy-active
display-p3
The display-p3()
function converts a color to its corresponding display-p3
value.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$color |
{color} |
None | The color to convert |
Returns
Type | Description |
---|---|
{string} |
The corresponding display-p3 value |
Examples
display-p3(#6bf906);
// => color(display-p3 0.4196078431 0.9764705882 0.0235294118)
display-p3(rgba(36, 36, 36, 0.06));
// => color(display-p3 0.1411764706 0.1411764706 0.1411764706 / 6%)
em
The em()
function converts a pixel value to its corresponding em value.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$pixels |
{number} |
None | The pixel value to convert |
Returns
Type | Description |
---|---|
{number} |
The corresponding em value |
Examples
em(400px);
// => 25em
$font-size: 20px;
em(400px);
// => 20em
flatten
The flatten()
function converts a multi-dimensional map into a one-dimensional
map.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$map |
{map} |
None | The multi-dimensional map to convert |
$flattened-parent-keys |
{string} |
'' |
The map's flattened, parent keys |
Returns
Type | Description |
---|---|
{map} |
The one-dimensional map |
Examples
flatten(
(
motion: (
duration: (
'1': calc(var(--motion-duration-unit) * 1),
'2': calc(var(--motion-duration-unit) * 2),
),
),
),
);
// => (
// => motion-duration-1: calc(var(--motion-duration-unit) * 1),
// => motion-duration-2: calc(var(--motion-duration-unit) * 2),
// => )
flatten(
(
font: (
family: (
monospace: var(--font-stack-monospace),
sans-serif: var(--font-stack-sans-serif),
),
size: (
s: calc(var(--font-size-unit) * 1.265625),
l: calc(var(--font-size-unit) * 1.6018066406),
),
),
),
);
// => (
// => font-family-monospace: var(--font-stack-monospace),
// => font-family-sans-serif: var(--font-stack-sans-serif),
// => font-size-s: calc(var(--font-size-unit) * 1.265625),
// => font-size-l: calc(var(--font-size-unit) * 1.6018066406),
// => )
prefix
The prefix()
function creates a kebab-case prefix based on the $namespace
variable.
Returns
Type | Description |
---|---|
{string} |
The prefix |
Examples
prefix();
// => ''
$namespace: 'eddy';
prefix();
// => eddy-
prop
The prop()
function converts a string into a Custom Property.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$string |
{string} |
None | The string to convert |
$method |
{('get'|'set')} |
'get' |
The Custom Property method |
Returns
Type | Description |
---|---|
{string} |
The Custom Property |
Examples
prop('color-accent-1');
// => var(--color-accent-1)
$namespace: 'eddy';
prop('font-size-xl', 'set');
// => --eddy-font-size-xl
rem
The rem()
function converts a pixel value to its corresponding rem value.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$pixels |
{number} |
None | The pixel value to convert |
Returns
Type | Description |
---|---|
{number} |
The corresponding rem value |
Examples
rem(20px);
// => 1.25rem
$font-size: 12px;
rem(20px);
// => 1.6666666667rem
replace
The replace()
function modifies a string, replacing an original substring with
a replacement substring.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$string |
{string} |
None | The string to modify |
$original |
{string} |
None | The original substring |
$replacement |
{string} |
'' |
The replacement substring |
Returns
Type | Description |
---|---|
{string} |
The modified string |
Examples
replace('color-neutral-1-inverse', '-inverse');
// => 'color-neutral-1
replace('font-stack-monospace', 'monospace', 'sans-serif');
// => font-stack-sans-serif
unitless
The unitless()
function removes a unit from a number.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$number |
{number} |
None | The number to remove the unit from |
Returns
Type | Description |
---|---|
{number} |
The number without its unit |
Examples
unitless(8px);
// => 8
unitless(3.25rem);
// => 3.25
Mixins
The following mixins are available for use in your project.
font-face
The font-face()
mixin adds a @font-face
delaration.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$name |
{string} |
None | The name of the font |
$weight |
{(100|200|300|400|500|600|700|800|900)} |
400 |
The weight of the font |
$style |
{('italic'|'normal')} |
'normal' |
The style of the font |
$glyphs |
{('all'|'latin')} |
'all' |
The glyphs of the font |
$path |
{string} |
'../fonts' |
The path of the font's source files |
Examples
@include font-face('metropolis', 800, 'italic');
// => @font-face {
// => font-display: swap;
// => font-family: 'metropolis';
// => font-style: italic;
// => font-weight: 800;
// => src:
// => url('../fonts/metropolis-all-800-italic.woff2') format('woff2'),
// => url('../fonts/metropolis-all-800-italic.woff') format('woff);
// => }
@include font-face($glyphs: 'latin', $name: 'open sans');
// => @font-face {
// => font-display: swap;
// => font-family: 'open sans';
// => font-style: normal;
// => font-weight: 400;
// => src:
// => url('../fonts/open-sans-latin-400-normal.woff2') format('woff2'),
// => url('../fonts/open-sans-latin-400-normal.woff') format('woff);
// => }
media
The media()
mixin wraps any nested CSS rules in a @media
query.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$min-width |
{(number|false)} |
false |
The media query's minimum width |
$min-height |
{(number|false)} |
false |
The media query's minimum height |
$orientation |
{('landscape'|'portrait'|false)} |
false |
The media query's orientation |
$prefers-color-scheme |
{('dark'|'light'|false)} |
false |
The media query's color scheme preferences |
$prefers-reduced-motion |
{('no-preference'|'reduce'|false)} |
false |
The media query's motion preferences |
$min-device-pixel-ratio |
{(1|2|3)} |
1 |
The media query's minimum device pixel ratio |
$media-type |
{('all'|'print'|'screen')} |
screen |
The media query's media type |
Examples
@include media(400px) {
h3 {
font-size: var(--font-size-xxxxl);
}
}
// => @media only screen and (min-width: 25em) {
// => h3 {
// => font-size: var(--font-size-xxxxl);
// => }
// => }
body {
--font-weight-unit: 400;
@include media($min-device-pixel-ratio: 2) {
--font-weight-unit: 300;
}
}
// => body {
// => --font-weight-unit 400;
// => }
// =>
// => @media only screen and (min-device-pixel-ratio: 2),
// => only screen and (min-resolution: 192dpi),
// => only screen and (min-resolution: 2dppx) {
// => body {
// => --font-weight-unit: 300;
// => }
// => }
props
The props()
mixin sets a map of key-value pairs as CSS Custom Properties.
Arguments
Name | Type | Default Value | Description |
---|---|---|---|
$tokens |
{map} |
None | The map of key-value pairs to set |
Examples
body {
@include props(
(
default: (
r-jewel: 18,
g-jewel: 108,
b-jewel: 1,
rgb-jewel: (
prop(--r-jewel),
prop(--g-jewel),
prop(--b-jewel),
),
),
supports-display-p3: (
display-p3-jewel: (
display-p3 calc(prop(--r-jewel) / 255) calc(prop(--g-jewel) / 255)
calc(prop(--b-jewel) / 255),
),
),
)
);
}
// => body {
// => --r-jewel: 18;
// => --g-jewel: 108;
// => --b-jewel: 1;
// => --rgb-jewel: var(--r-jewel), var(--g-jewel), var(--b-jewel);
// => }
// =>
// => @supports (color: color(display-p3 0 0 0)) {
// => body {
// => --display-p3-jewel:
// => display-p3 calc(var(--r-jewel) / 255)
// => calc(var(--g-jewel) / 255) calc(var(--b-jewel) / 255);
// => }
// => }
$namespace: 'eddy';
body {
@include props(
(
default: (
r-jewel: 18,
g-jewel: 108,
b-jewel: 1,
rgb-jewel: (
prop(--r-jewel),
prop(--g-jewel),
prop(--b-jewel),
),
),
supports-display-p3: (
display-p3-jewel: (
display-p3 calc(prop(--r-jewel) / 255) calc(prop(--g-jewel) / 255)
calc(prop(--b-jewel) / 255),
),
),
)
);
}
// => body {
// => --eddy-r-jewel: 18;
// => --eddy-g-jewel: 108;
// => --eddy-b-jewel: 1;
// => --eddy-rgb-jewel:
// => var(--eddy-r-jewel), var(--eddy-g-jewel), var(--eddy-b-jewel);
// => }
// =>
// => @supports (color: color(display-p3 0 0 0)) {
// => body {
// => --eddy-display-p3-jewel:
// => display-p3 calc(var(--eddy-r-jewel) / 255)
// => calc(var(--eddy-g-jewel) / 255)
// => calc(var(--eddy-b-jewel) / 255);
// => }
// => }
scope
The scope()
mixin scopes any nested CSS rules to the $root
selector if one
is set, or a fallback selector if one is passed.
Examples
@include scope {
.button {
cursor: pointer;
}
}
// => .button {
// => cursor: pointer;
// => }
$root: '#root';
@include scope('body') {
.button {
cursor: pointer;
}
}
// => #root .button {
// => cursor: pointer;
// => }
Tokens
The following tokens are available for use in your project as CSS Custom
Properties. It's recommended that you reference these tokens in conjunction with
the prop()
function:
body {
background-color: prop('color-scheme-background-primary');
color: prop('color-scheme-text-primary');
}
Defaults
Each token has a default value which may be contextualised to support different vendors:
Border
Token | Type | Value |
---|---|---|
border-radius-xxxs |
{number} |
0.5rem |
border-radius-xxs |
{number} |
0.75rem |
border-radius-xs |
{number} |
0.1rem |
border-radius-s |
{number} |
1.5rem |
border-radius-m |
{number} |
2.25rem |
border-radius-l |
{number} |
3.5rem |
border-radius-xl |
{number} |
5.5rem |
border-radius-xxl |
{number} |
8.75rem |
border-radius-xxxl |
{number} |
14rem |
Color
Brand
Token | Type | Value |
---|---|---|
color-brand-alabaster |
{color} |
#fefefe |
color-brand-bilbao |
{color} |
#248802 |
color-brand-christi |
{color} |
#59dd05 |
color-brand-crusoe |
{color} |
#005000 |
color-brand-harlequin |
{color} |
#6bf906 |
color-brand-jewel |
{color} |
#126c01 |
color-brand-limeaid |
{color} |
#47c104 |
color-brand-mercury |
{color} |
#e8e8e8 |
color-brand-mine-shaft |
{color} |
#242424 |
color-brand-salem |
{color} |
#36a503 |
color-brand-tundora |
{color} |
#333333 |
Scheme
Token | Type | Value | Dark Scheme Value |
---|---|---|---|
color-scheme-background-primary |
{color} |
#fefefe |
#333333 |
color-scheme-background-primary-inverse |
{color} |
#333333 |
#fefefe |
color-scheme-background-secondary |
{color} |
#e8e8e8 |
#242424 |
color-scheme-background-secondary-inverse |
{color} |
#242424 |
#e8e8e8 |
color-scheme-gray-1 |
{color} |
#242424 |
#fefefe |
color-scheme-gray-1-inverse |
{color} |
#fefefe |
#242424 |
color-scheme-gray-2 |
{color} |
rgba(36, 36, 36, 0.86) |
rgba(254, 254, 254, 0.79) |
color-scheme-gray-2-inverse |
{color} |
rgba(254, 254, 254, 0.79) |
rgba(36, 36, 36, 0.86) |
color-scheme-gray-3 |
{color} |
rgba(36, 36, 36, 0.66) |
rgba(254, 254, 254, 0.51) |
color-scheme-gray-3-inverse |
{color} |
rgba(254, 254, 254, 0.51) |
rgba(36, 36, 36, 0.66) |
color-scheme-gray-4 |
{color} |
rgba(36, 36, 36, 0.51) |
rgba(254, 254, 254, 0.36) |
color-scheme-gray-4-inverse |
{color} |
rgba(254, 254, 254, 0.36) |
rgba(36, 36, 36, 0.51) |
color-scheme-gray-5 |
{color} |
rgba(36, 36, 36, 0.16) |
rgba(254, 254, 254, 0.1) |
color-scheme-gray-5-inverse |
{color} |
rgba(254, 254, 254, 0.1) |
rgba(36, 36, 36, 0.16) |
color-scheme-gray-6 |
{color} |
rgba(36, 36, 36, 0.11) |
rgba(254, 254, 254, 0.07) |
color-scheme-gray-6-inverse |
{color} |
rgba(254, 254, 254, 0.07) |
rgba(36, 36, 36, 0.11) |
color-scheme-gray-7 |
{color} |
rgba(36, 36, 36, 0.06) |
rgba(254, 254, 254, 0.04) |
color-scheme-gray-7-inverse |
{color} |
rgba(254, 254, 254, 0.04) |
rgba(36, 36, 36, 0.06) |
color-scheme-icon |
{color} |
rgba(36, 36, 36, 0.51) |
rgba(254, 254, 254, 0.36) |
color-scheme-icon-inverse |
{color} |
rgba(254, 254, 254, 0.36) |
rgba(36, 36, 36, 0.51) |
color-scheme-interaction-primary |
{color} |
#126c01 |
#59dd05 |
color-scheme-interaction-primary-inverse |
{color} |
#59dd05 |
#126c01 |
color-scheme-interaction-secondary |
{color} |
rgba(89, 221, 5, 0.4) |
rgba(18, 108, 1, 0.32) |
color-scheme-interaction-secondary-inverse |
{color} |
rgba(18, 108, 1, 0.32) |
rgba(89, 221, 5, 0.4) |
color-scheme-text-primary |
{color} |
#242424 |
#fefefe |
color-scheme-text-primary-inverse |
{color} |
#fefefe |
#242424 |
color-scheme-text-secondary |
{color} |
rgba(36, 36, 36, 0.86) |
rgba(254, 254, 254, 0.79) |
color-scheme-text-secondary-inverse |
{color} |
rgba(254, 254, 254, 0.79) |
rgba(36, 36, 36, 0.86) |
color-scheme-text-tertiary |
{color} |
rgba(36, 36, 36, 0.66) |
rgba(254, 254, 254, 0.51) |
color-scheme-text-tertiary-inverse |
{color} |
rgba(254, 254, 254, 0.51) |
rgba(36, 36, 36, 0.66) |
Font
Family
Token | Type | Value |
---|---|---|
font-family-heading |
{string()} |
('metropolis', 'figtree', 'montserrat', 'helvetica neue', arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
font-family-paragraph |
{string()} |
(system-ui, -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, 'helvetica neue', arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
font-family-source |
{string()} |
(ui-monospace, menlo, monaco, 'cascadia mono', 'segoe ui mono', 'roboto mono', 'courier new', monospace, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
font-family-ui |
{string()} |
(system-ui, -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, 'helvetica neue', arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
Size
Token | Type | Value |
---|---|---|
font-size-xxxxxxs |
{number} |
0.585rem |
font-size-xxxxxs |
{number} |
0.658125rem |
font-size-xxxxs |
{number} |
0.740625rem |
font-size-xxxs |
{number} |
0.833125rem |
font-size-xxs |
{number} |
0.9375rem |
font-size-xs |
{number} |
1.055rem |
font-size-s |
{number} |
1.18625rem |
font-size-m |
{number} |
1.335rem |
font-size-l |
{number} |
1.501875rem |
font-size-xl |
{number} |
1.689375rem |
font-size-xxl |
{number} |
1.900625rem |
font-size-xxxl |
{number} |
2.138125rem |
font-size-xxxxl |
{number} |
2.405625rem |
font-size-xxxxxl |
{number} |
2.70625rem |
font-size-xxxxxxl |
{number} |
3.044375rem |
Stack
Token | Type | Value |
---|---|---|
font-stack-monospace |
{string()} |
(ui-monospace, menlo, monaco, 'cascadia mono', 'segoe ui mono', 'roboto mono', 'courier new', monospace, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
font-stack-sans-serif |
{string()} |
(system-ui, -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, 'helvetica neue', arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol') |
Motion
Token | Type | Value | Reduced Motion Value |
---|---|---|---|
motion-duration-1 |
{number} |
200ms |
100ms |
motion-duration-2 |
{number} |
400ms |
200ms |
motion-duration-3 |
{number} |
600ms |
300ms |
motion-duration-4 |
{number} |
800ms |
400ms |
motion-duration-5 |
{number} |
1000ms |
500ms |
motion-duration-6 |
{number} |
1200ms |
600ms |
motion-duration-7 |
{number} |
1400ms |
700ms |
motion-duration-8 |
{number} |
1600ms |
800ms |
motion-duration-9 |
{number} |
1800ms |
900ms |
motion-duration-10 |
{number} |
2000ms |
1000ms |
Space
Token | Type | Value |
---|---|---|
space-xxxs |
{number} |
0.25rem |
space-xxs |
{number} |
0.5rem |
space-xs |
{number} |
0.75rem |
space-s |
{number} |
1.25rem |
space-m |
{number} |
2rem |
space-l |
{number} |
3.25rem |
space-xl |
{number} |
5.25rem |
space-xxl |
{number} |
8.5rem |
space-xxxl |
{number} |
13.75rem |