summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2022-02-06 20:23:11 +0100
committerVolpeon <git@volpeon.ink>2022-02-06 20:23:11 +0100
commit9691ccf48f64dd0fac669ae51943907cc8da9b78 (patch)
tree01fa18eee29ec1266bbe3d276a8dac6f54390f16
parentFixes (diff)
downloadiro-design-9691ccf48f64dd0fac669ae51943907cc8da9b78.tar.gz
iro-design-9691ccf48f64dd0fac669ae51943907cc8da9b78.tar.bz2
iro-design-9691ccf48f64dd0fac669ae51943907cc8da9b78.zip
Added status indicator and avatar
-rw-r--r--src/_functions.scss20
-rw-r--r--src/index.scss3
-rw-r--r--src/layouts/_card.scss12
-rw-r--r--src/layouts/_container.scss12
-rw-r--r--src/objects/_action-button.scss8
-rw-r--r--src/objects/_avatar.scss89
-rw-r--r--src/objects/_button.scss8
-rw-r--r--src/objects/_checkbox.scss10
-rw-r--r--src/objects/_radio.scss10
-rw-r--r--src/objects/_status-indicator.scss33
-rw-r--r--src/objects/_switch.scss10
-rw-r--r--src/objects/_text-field.scss8
-rwxr-xr-xstatic/avatar.pngbin0 -> 61956 bytes
-rw-r--r--tpl/index.pug72
-rw-r--r--tpl/objects/avatar.pug26
-rw-r--r--tpl/objects/status-indicator.pug8
16 files changed, 286 insertions, 43 deletions
diff --git a/src/_functions.scss b/src/_functions.scss
index a649cc2..a11d5f4 100644
--- a/src/_functions.scss
+++ b/src/_functions.scss
@@ -1,19 +1,31 @@
1@use 'iro-sass/src/index' as iro; 1@use 'iro-sass/src/index' as iro;
2 2
3@function color($key, $tree: 'colors', $default: null, $global: false) { 3@function color($key, $tree: 'colors', $default: null, $global: false) {
4 $new-key: iro.fn-list-prepend($key, --colors); 4 $key: iro.fn-list-prepend($key, --colors);
5 @return iro.props-get($new-key, $tree, $default, $global); 5 @return iro.props-get($key, $tree, $default, $global);
6} 6}
7 7
8@function global-color($key, $tree: 'colors', $default: null, $global: true) { 8@function global-color($key, $tree: 'colors', $default: null, $global: true) {
9 @return color($key, $tree, $default, $global); 9 @return color($key, $tree, $default, $global);
10} 10}
11 11
12@function foreign-color($foreign-key, $key, $tree: 'colors', $default: null, $global: true) {
13 $key: iro.fn-list-prepend($key, --colors);
14 $key: iro.fn-list-prepend($key, $foreign-key);
15 @return iro.props-get($key, $tree, $default, $global);
16}
17
12@function dim($key, $tree: 'dims', $default: null, $global: false) { 18@function dim($key, $tree: 'dims', $default: null, $global: false) {
13 $new-key: iro.fn-list-prepend($key, --dims); 19 $key: iro.fn-list-prepend($key, --dims);
14 @return iro.props-get($new-key, $tree, $default, $global); 20 @return iro.props-get($key, $tree, $default, $global);
15} 21}
16 22
17@function global-dim($key, $tree: 'dims', $default: null, $global: true) { 23@function global-dim($key, $tree: 'dims', $default: null, $global: true) {
18 @return dim($key, $tree, $default, $global); 24 @return dim($key, $tree, $default, $global);
19} 25}
26
27@function foreign-dim($foreign-key, $key, $tree: 'dims', $default: null, $global: true) {
28 $key: iro.fn-list-prepend($key, --dims);
29 $key: iro.fn-list-prepend($key, $foreign-key);
30 @return iro.props-get($key, $tree, $default, $global);
31}
diff --git a/src/index.scss b/src/index.scss
index 63124ed..813764c 100644
--- a/src/index.scss
+++ b/src/index.scss
@@ -4,6 +4,7 @@
4@import 'vars'; 4@import 'vars';
5@import 'general'; 5@import 'general';
6 6
7@import 'layouts/card';
7@import 'layouts/container'; 8@import 'layouts/container';
8 9
9@import 'objects/icon'; 10@import 'objects/icon';
@@ -16,6 +17,8 @@
16@import 'objects/checkbox'; 17@import 'objects/checkbox';
17@import 'objects/switch'; 18@import 'objects/switch';
18@import 'objects/action-button'; 19@import 'objects/action-button';
20@import 'objects/status-indicator';
21@import 'objects/avatar';
19 22
20@import 'layouts/form'; 23@import 'layouts/form';
21 24
diff --git a/src/layouts/_card.scss b/src/layouts/_card.scss
index 5db1a6a..a5b9028 100644
--- a/src/layouts/_card.scss
+++ b/src/layouts/_card.scss
@@ -5,11 +5,11 @@
5@include iro.props-namespace('card') { 5@include iro.props-namespace('card') {
6 @include iro.props-store(( 6 @include iro.props-store((
7 --dims: ( 7 --dims: (
8 --pad-x: iro.fn-px-to-rem(11px), 8 --pad-x: .6rem,
9 --pad-y: iro.fn-px-to-rem(8px), 9 --pad-y: .4rem,
10 --lg: ( 10 --lg: (
11 --pad-x: iro.fn-px-to-rem(14px), 11 --pad-x: .9rem,
12 --pad-y: iro.fn-px-to-rem(11px), 12 --pad-y: .7rem,
13 ) 13 )
14 ) 14 )
15 ), 'dims'); 15 ), 'dims');
@@ -34,8 +34,8 @@
34 flex: 0 0 auto; 34 flex: 0 0 auto;
35 35
36 @include iro.bem-modifier('main') { 36 @include iro.bem-modifier('main') {
37 flex-shrink: 1; 37 width: 100%;
38 width: 100%; 38 min-width: 0;
39 } 39 }
40 } 40 }
41 } 41 }
diff --git a/src/layouts/_container.scss b/src/layouts/_container.scss
index 40e8ab6..7f13a8b 100644
--- a/src/layouts/_container.scss
+++ b/src/layouts/_container.scss
@@ -7,8 +7,8 @@
7 --dims: ( 7 --dims: (
8 --content-width: iro.fn-px-to-rem(700px), 8 --content-width: iro.fn-px-to-rem(700px),
9 --sm-content-width: iro.fn-px-to-rem(360px), 9 --sm-content-width: iro.fn-px-to-rem(360px),
10 --padding-x: 3rem, 10 --pad-x: 3rem,
11 --padding-y: 3rem, 11 --pad-y: 3rem,
12 --in-page-spacing-y: fn.global-dim(--spacing --y --xl), 12 --in-page-spacing-y: fn.global-dim(--spacing --y --xl),
13 ) 13 )
14 ), 'dims'); 14 ), 'dims');
@@ -38,13 +38,13 @@
38 } 38 }
39 39
40 @include iro.bem-modifier('pad-x') { 40 @include iro.bem-modifier('pad-x') {
41 padding-right: fn.dim(--padding-x); 41 padding-right: fn.dim(--pad-x);
42 padding-left: fn.dim(--padding-x); 42 padding-left: fn.dim(--pad-x);
43 } 43 }
44 44
45 @include iro.bem-modifier('pad-y') { 45 @include iro.bem-modifier('pad-y') {
46 padding-top: fn.dim(--padding-y); 46 padding-top: fn.dim(--pad-y);
47 padding-bottom: fn.dim(--padding-y); 47 padding-bottom: fn.dim(--pad-y);
48 } 48 }
49 49
50 @include iro.bem-modifier('narrow') { 50 @include iro.bem-modifier('narrow') {
diff --git a/src/objects/_action-button.scss b/src/objects/_action-button.scss
index dd5cea7..86c7089 100644
--- a/src/objects/_action-button.scss
+++ b/src/objects/_action-button.scss
@@ -4,9 +4,9 @@
4@include iro.props-namespace('action-button') { 4@include iro.props-namespace('action-button') {
5 @include iro.props-store(( 5 @include iro.props-store((
6 --dims: ( 6 --dims: (
7 --padding-x: .6rem, 7 --pad-x: .6rem,
8 --padding-y: .6rem, 8 --pad-y: .6rem,
9 --rounding: 3px, 9 --rounding: 3px,
10 ), 10 ),
11 ), 'dims'); 11 ), 'dims');
12 12
@@ -93,7 +93,7 @@
93 93
94 @include iro.bem-object(iro.props-namespace()) { 94 @include iro.bem-object(iro.props-namespace()) {
95 display: inline-block; 95 display: inline-block;
96 padding: fn.dim(--padding-y) fn.dim(--padding-x); 96 padding: fn.dim(--pad-y) fn.dim(--pad-x);
97 border: 1px solid fn.color(--border); 97 border: 1px solid fn.color(--border);
98 border-radius: fn.dim(--rounding); 98 border-radius: fn.dim(--rounding);
99 background-color: fn.color(--bg); 99 background-color: fn.color(--bg);
diff --git a/src/objects/_avatar.scss b/src/objects/_avatar.scss
new file mode 100644
index 0000000..3bdfddc
--- /dev/null
+++ b/src/objects/_avatar.scss
@@ -0,0 +1,89 @@
1@use 'iro-sass/src/index' as iro;
2@use '../functions' as fn;
3
4@include iro.props-namespace('avatar') {
5 @include iro.props-store((
6 --dims: (
7 --size: iro.fn-px-to-rem(40px),
8 --size-sm: iro.fn-px-to-rem(30px),
9 --size-xs: iro.fn-px-to-rem(20px),
10 --indicator-size: fn.foreign-dim(--status-indicator, --size),
11 --indicator-spacing: iro.fn-px-to-rem(3px),
12 --rounding: 25%,
13 ),
14 ), 'dims');
15
16 @include iro.props-store((
17 --colors: (
18 --h: 354,
19 --s: 44%,
20 --l: 45%,
21 ),
22 ), 'colors');
23
24 @include iro.bem-object(iro.props-namespace()) {
25 display: inline-block;
26 position: relative;
27 font-size: 1rem;
28 font-style: normal;
29
30 @include iro.bem-elem('status') {
31 position: absolute;
32 right: 0;
33 bottom: 0;
34
35 @include iro.bem-next-elem('content') {
36 mask-image: radial-gradient(
37 circle calc(.5 * fn.dim(--indicator-size) + fn.dim(--indicator-spacing)) at
38 calc(100% - .5 * fn.dim(--indicator-size))
39 calc(100% - .5 * fn.dim(--indicator-size)),
40 transparent 95%,
41 #fff
42 );
43 }
44 }
45
46 @include iro.bem-elem('content') {
47 display: block;
48 width: fn.dim(--size);
49 height: fn.dim(--size);
50 border-radius: fn.dim(--rounding);
51 background-color: hsl(fn.color(--h), fn.color(--s), fn.color(--l));
52 color: #fff;
53 line-height: fn.dim(--size);
54 text-align: center;
55 }
56
57 @include iro.bem-modifier('circle') {
58 @include iro.bem-elem('content') {
59 border-radius: 100%;
60 }
61 }
62
63 @include iro.bem-modifier('placeholder') {
64 @include iro.bem-elem('content') {
65 background-color: hsl(0, 0%, fn.color(--l));
66 }
67 }
68
69 @include iro.bem-modifier('sm') {
70 font-size: iro.fn-px-to-rem(13px);
71
72 @include iro.bem-elem('content') {
73 width: fn.dim(--size-sm);
74 height: fn.dim(--size-sm);
75 line-height: fn.dim(--size-sm);
76 }
77 }
78
79 @include iro.bem-modifier('xs') {
80 font-size: iro.fn-px-to-rem(12px);
81
82 @include iro.bem-elem('content') {
83 width: fn.dim(--size-xs);
84 height: fn.dim(--size-xs);
85 line-height: fn.dim(--size-xs);
86 }
87 }
88 }
89}
diff --git a/src/objects/_button.scss b/src/objects/_button.scss
index 57c49e8..f158176 100644
--- a/src/objects/_button.scss
+++ b/src/objects/_button.scss
@@ -35,9 +35,9 @@
35@include iro.props-namespace('button') { 35@include iro.props-namespace('button') {
36 @include iro.props-store(( 36 @include iro.props-store((
37 --dims: ( 37 --dims: (
38 --padding-x: 1.2rem, 38 --pad-x: 1.2rem,
39 --padding-y: .5rem, 39 --pad-y: .5rem,
40 --rounding: 10em, 40 --rounding: 10em,
41 ), 41 ),
42 ), 'dims'); 42 ), 'dims');
43 43
@@ -114,7 +114,7 @@
114 @include typography.set-font(vars.$font--main, (weight: 500)); 114 @include typography.set-font(vars.$font--main, (weight: 500));
115 115
116 display: inline-block; 116 display: inline-block;
117 padding: fn.dim(--padding-y) fn.dim(--padding-x); 117 padding: fn.dim(--pad-y) fn.dim(--pad-x);
118 border: 2px solid transparent; 118 border: 2px solid transparent;
119 border-radius: fn.dim(--rounding); 119 border-radius: fn.dim(--rounding);
120 line-height: 1; 120 line-height: 1;
diff --git a/src/objects/_checkbox.scss b/src/objects/_checkbox.scss
index 377b002..3bda5e7 100644
--- a/src/objects/_checkbox.scss
+++ b/src/objects/_checkbox.scss
@@ -7,8 +7,8 @@
7 --size: iro.fn-px-to-rem(14px), 7 --size: iro.fn-px-to-rem(14px),
8 --label-gap: .6rem, 8 --label-gap: .6rem,
9 --border-width: fn.global-dim(--border-width --medium), 9 --border-width: fn.global-dim(--border-width --medium),
10 --padding-x: .3rem, 10 --pad-x: .3rem,
11 --padding-y: .3rem, 11 --pad-y: .3rem,
12 --margin-right: fn.global-dim(--spacing --x --md), 12 --margin-right: fn.global-dim(--spacing --x --md),
13 ), 13 ),
14 ), 'dims'); 14 ), 'dims');
@@ -46,9 +46,9 @@
46 display: inline-flex; 46 display: inline-flex;
47 position: relative; 47 position: relative;
48 align-items: flex-start; 48 align-items: flex-start;
49 margin-right: calc(-1 * fn.dim(--padding-x) + fn.dim(--margin-right)); 49 margin-right: calc(-1 * fn.dim(--pad-x) + fn.dim(--margin-right));
50 margin-left: calc(-1 * fn.dim(--padding-x)); 50 margin-left: calc(-1 * fn.dim(--pad-x));
51 padding: fn.dim(--padding-y) fn.dim(--padding-x); 51 padding: fn.dim(--pad-y) fn.dim(--pad-x);
52 52
53 @include iro.bem-elem('box') { 53 @include iro.bem-elem('box') {
54 display: block; 54 display: block;
diff --git a/src/objects/_radio.scss b/src/objects/_radio.scss
index 51bfcd8..26e8c31 100644
--- a/src/objects/_radio.scss
+++ b/src/objects/_radio.scss
@@ -7,8 +7,8 @@
7 --diameter: iro.fn-px-to-rem(15px), 7 --diameter: iro.fn-px-to-rem(15px),
8 --label-gap: .6rem, 8 --label-gap: .6rem,
9 --border-width: fn.global-dim(--border-width --medium), 9 --border-width: fn.global-dim(--border-width --medium),
10 --padding-x: .3rem, 10 --pad-x: .3rem,
11 --padding-y: .3rem, 11 --pad-y: .3rem,
12 --margin-right: fn.global-dim(--spacing --x --md), 12 --margin-right: fn.global-dim(--spacing --x --md),
13 ), 13 ),
14 ), 'dims'); 14 ), 'dims');
@@ -46,9 +46,9 @@
46 display: inline-flex; 46 display: inline-flex;
47 position: relative; 47 position: relative;
48 align-items: flex-start; 48 align-items: flex-start;
49 margin-right: calc(-1 * fn.dim(--padding-x) + fn.dim(--margin-right)); 49 margin-right: calc(-1 * fn.dim(--pad-x) + fn.dim(--margin-right));
50 margin-left: calc(-1 * fn.dim(--padding-x)); 50 margin-left: calc(-1 * fn.dim(--pad-x));
51 padding: fn.dim(--padding-y) fn.dim(--padding-x); 51 padding: fn.dim(--pad-y) fn.dim(--pad-x);
52 52
53 @include iro.bem-elem('circle') { 53 @include iro.bem-elem('circle') {
54 display: block; 54 display: block;
diff --git a/src/objects/_status-indicator.scss b/src/objects/_status-indicator.scss
new file mode 100644
index 0000000..18d6f81
--- /dev/null
+++ b/src/objects/_status-indicator.scss
@@ -0,0 +1,33 @@
1@use 'iro-sass/src/index' as iro;
2@use '../functions' as fn;
3
4@include iro.props-namespace('status-indicator') {
5 @include iro.props-store((
6 --dims: (
7 --size: iro.fn-px-to-rem(10px),
8 ),
9 ), 'dims');
10
11 @include iro.props-store((
12 --colors: (
13 --default: fn.global-color(--obj-lo),
14 --green: scale-color(hsl(113, 49.8%, 49.6%), $lightness: 15%),
15 --yellow: scale-color(hsl(50, 59.8%, 58.4%), $lightness: 15%),
16 --red: scale-color(hsl(352, 69.8%, 58.4%), $lightness: 15%),
17 ),
18 ), 'colors');
19
20 @include iro.bem-object(iro.props-namespace()) {
21 display: inline-block;
22 width: fn.dim(--size);
23 height: fn.dim(--size);
24 border-radius: fn.dim(--size);
25 background-color: fn.color(--default);
26
27 @each $color in 'green' 'yellow' 'red' {
28 @include iro.bem-is($color) {
29 background-color: fn.color(--#{$color});
30 }
31 }
32 }
33}
diff --git a/src/objects/_switch.scss b/src/objects/_switch.scss
index 85aa782..2d70844 100644
--- a/src/objects/_switch.scss
+++ b/src/objects/_switch.scss
@@ -8,8 +8,8 @@
8 --height: iro.fn-px-to-rem(15px), 8 --height: iro.fn-px-to-rem(15px),
9 --label-gap: .6rem, 9 --label-gap: .6rem,
10 --border-width: fn.global-dim(--border-width --medium), 10 --border-width: fn.global-dim(--border-width --medium),
11 --padding-x: .3rem, 11 --pad-x: .3rem,
12 --padding-y: .3rem, 12 --pad-y: .3rem,
13 --margin-right: fn.global-dim(--spacing --x --md), 13 --margin-right: fn.global-dim(--spacing --x --md),
14 ), 14 ),
15 ), 'dims'); 15 ), 'dims');
@@ -50,9 +50,9 @@
50 display: inline-flex; 50 display: inline-flex;
51 position: relative; 51 position: relative;
52 align-items: flex-start; 52 align-items: flex-start;
53 margin-right: calc(-1 * fn.dim(--padding-x) + fn.dim(--margin-right)); 53 margin-right: calc(-1 * fn.dim(--pad-x) + fn.dim(--margin-right));
54 margin-left: calc(-1 * fn.dim(--padding-x)); 54 margin-left: calc(-1 * fn.dim(--pad-x));
55 padding: fn.dim(--padding-y) fn.dim(--padding-x); 55 padding: fn.dim(--pad-y) fn.dim(--pad-x);
56 56
57 @include iro.bem-elem('indicator') { 57 @include iro.bem-elem('indicator') {
58 display: block; 58 display: block;
diff --git a/src/objects/_text-field.scss b/src/objects/_text-field.scss
index ca0eb5b..90d4b11 100644
--- a/src/objects/_text-field.scss
+++ b/src/objects/_text-field.scss
@@ -34,8 +34,8 @@
34@include iro.props-namespace('text-field') { 34@include iro.props-namespace('text-field') {
35 @include iro.props-store(( 35 @include iro.props-store((
36 --dims: ( 36 --dims: (
37 --padding-x: .6rem, 37 --pad-x: .6rem,
38 --padding-y: .5rem, 38 --pad-y: .5rem,
39 --border-width: fn.global-dim(--border-width --thin), 39 --border-width: fn.global-dim(--border-width --thin),
40 --border-radius: 2px, 40 --border-radius: 2px,
41 41
@@ -91,7 +91,7 @@
91 @include iro.bem-object(iro.props-namespace()) { 91 @include iro.bem-object(iro.props-namespace()) {
92 position: relative; 92 position: relative;
93 min-width: 0; 93 min-width: 0;
94 padding: fn.dim(--padding-y) fn.dim(--padding-x); 94 padding: fn.dim(--pad-y) fn.dim(--pad-x);
95 background-color: fn.color(--bg); 95 background-color: fn.color(--bg);
96 96
97 @include iro.bem-elem('bg') { 97 @include iro.bem-elem('bg') {
@@ -176,7 +176,7 @@
176 176
177 @include iro.bem-elem('native') { 177 @include iro.bem-elem('native') {
178 box-sizing: border-box; 178 box-sizing: border-box;
179 padding: fn.dim(--padding-y) fn.dim(--padding-x); 179 padding: fn.dim(--pad-y) fn.dim(--pad-x);
180 } 180 }
181 } 181 }
182 182
diff --git a/static/avatar.png b/static/avatar.png
new file mode 100755
index 0000000..aa4345f
--- /dev/null
+++ b/static/avatar.png
Binary files differ
diff --git a/tpl/index.pug b/tpl/index.pug
index 2980016..206e40b 100644
--- a/tpl/index.pug
+++ b/tpl/index.pug
@@ -13,6 +13,8 @@ include objects/checkbox.pug
13include objects/switch.pug 13include objects/switch.pug
14include objects/form.pug 14include objects/form.pug
15include objects/action-button.pug 15include objects/action-button.pug
16include objects/status-indicator.pug
17include objects/avatar.pug
16 18
17mixin box 19mixin box
18 +container(padX=true padY=true inPage=true theme="raised") 20 +container(padX=true padY=true inPage=true theme="raised")
@@ -363,3 +365,73 @@ html
363 = ' ' 365 = ' '
364 +action-button(quiet=true icon='trash' selected=true disabled=true) 366 +action-button(quiet=true icon='trash' selected=true disabled=true)
365 367
368 //-----------------------------------------
369
370 +h1-heading(level='xl')= 'Status indicator'
371 +rule(level='medium')
372
373 +box
374 +status-indicator
375 = ' '
376 +status-indicator('green')
377 = ' '
378 +status-indicator('yellow')
379 = ' '
380 +status-indicator('red')
381
382 //-----------------------------------------
383
384 +h1-heading(level='xl')= 'Avatar'
385 +rule(level='medium')
386
387 +box
388 div(style={ display: 'flex', gap: '.3em' })
389 +avatar
390 = 'Vo'
391 +avatar(status='green' hue=45)
392 = 'lp'
393 +avatar(src='avatar.png')
394 +avatar(src='avatar.png' status='red')
395 br
396 br
397 div(style={ display: 'flex', gap: '.3em' })
398 +avatar(size='sm' hue=90)
399 = 'eo'
400 +avatar(size='sm' status='green' hue=135)
401 = 'n'
402 +avatar(size='sm' src='avatar.png')
403 +avatar(size='sm' src='avatar.png' status='red')
404 br
405 br
406 div(style={ display: 'flex', gap: '.3em' })
407 +avatar(size='xs' hue=180)
408 = 'V'
409 +avatar(size='xs' hue=225)
410 = 'o'
411 +avatar(size='xs' src='avatar.png')
412
413 +box
414 div(style={ display: 'flex', gap: '.3em' })
415 +avatar(circle=true)
416 = 'Vo'
417 +avatar(circle=true status='green' hue=45)
418 = 'lp'
419 +avatar(circle=true src='avatar.png')
420 +avatar(circle=true src='avatar.png' status='red')
421 br
422 br
423 div(style={ display: 'flex', gap: '.3em' })
424 +avatar(circle=true size='sm' hue=90)
425 = 'eo'
426 +avatar(circle=true size='sm' status='green' hue=135)
427 = 'n'
428 +avatar(circle=true size='sm' src='avatar.png')
429 +avatar(circle=true size='sm' src='avatar.png' status='red')
430 br
431 br
432 div(style={ display: 'flex', gap: '.3em' })
433 +avatar(circle=true size='xs' hue=180)
434 = 'V'
435 +avatar(circle=true size='xs' hue=225)
436 = 'o'
437 +avatar(circle=true size='xs' src='avatar.png')
diff --git a/tpl/objects/avatar.pug b/tpl/objects/avatar.pug
new file mode 100644
index 0000000..83c0f7c
--- /dev/null
+++ b/tpl/objects/avatar.pug
@@ -0,0 +1,26 @@
1include ../objects/status-indicator.pug
2
3mixin avatar
4 -
5 let classes = {
6 'o-avatar': true,
7 'o-avatar--circle': attributes.circle
8 }
9
10 if (attributes.size) {
11 classes['o-avatar--' + attributes.size] = true;
12 }
13
14 let styles = {}
15 if (attributes.hue) {
16 styles['--avatar--colors--h'] = attributes.hue;
17 }
18
19 div(class=classes style=styles)
20 if attributes.status
21 +status-indicator(attributes.status)(class='o-avatar__status')
22 if attributes.src
23 img.o-avatar__content(src=attributes.src)
24 else
25 .o-avatar__content
26 block
diff --git a/tpl/objects/status-indicator.pug b/tpl/objects/status-indicator.pug
new file mode 100644
index 0000000..9b240e1
--- /dev/null
+++ b/tpl/objects/status-indicator.pug
@@ -0,0 +1,8 @@
1mixin status-indicator(status)
2 -
3 let classes = {
4 'o-status-indicator': true,
5 }
6 classes['is-' + status] = true
7
8 div(class=classes)&attributes(attributes)