diff options
Diffstat (limited to 'src/objects/_card.scss')
-rw-r--r-- | src/objects/_card.scss | 276 |
1 files changed, 177 insertions, 99 deletions
diff --git a/src/objects/_card.scss b/src/objects/_card.scss index f56a96c..c87e676 100644 --- a/src/objects/_card.scss +++ b/src/objects/_card.scss | |||
@@ -1,132 +1,170 @@ | |||
1 | @use 'iro-sass/src/index' as iro; | 1 | @use 'sass:meta'; |
2 | @use '../functions' as fn; | 2 | @use 'iro-sass/src/bem'; |
3 | @use 'iro-sass/src/props'; | ||
4 | @use '../props' as *; | ||
5 | @use 'avatar.vars' as avatar; | ||
3 | 6 | ||
4 | @include iro.props-namespace('card') { | 7 | @forward 'card.vars'; |
5 | @include iro.props-store(( | 8 | @use 'card.vars' as vars; |
6 | --dims: ( | ||
7 | --border: fn.global-dim(--border --thin), | ||
8 | --divider: fn.global-dim(--border --thin), | ||
9 | --pad-i: fn.global-dim(--size --300), | ||
10 | --pad-b: fn.global-dim(--size --250), | ||
11 | --spacing: fn.global-dim(--size --200), | ||
12 | --rounding: fn.global-dim(--rounding), | ||
13 | 9 | ||
14 | --key-focus: ( | 10 | @mixin styles { |
15 | --border: fn.global-dim(--key-focus --border), | 11 | @include materialize-at-root(meta.module-variables('vars')); |
16 | --border-offset: fn.global-dim(--key-focus --border-offset), | ||
17 | --outline: fn.global-dim(--key-focus --outline), | ||
18 | ), | ||
19 | ), | ||
20 | --colors: ( | ||
21 | --bg: fn.global-color(--bg-l2), | ||
22 | --border: fn.global-color(--border-mute), | ||
23 | --divider: fn.global-color(--border-mute), | ||
24 | 12 | ||
25 | --hover: ( | 13 | @include bem.object('card') { |
26 | --border: fn.global-color(--border), | 14 | position: relative; |
27 | ), | 15 | display: flex; |
16 | flex-direction: column; | ||
17 | margin: calc(-1 * props.get(vars.$key-focus--border-width)); | ||
18 | background-color: props.get(vars.$bg-color); | ||
19 | background-clip: content-box; | ||
20 | border: props.get(vars.$key-focus--border-offset) solid transparent; | ||
21 | border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset)); | ||
22 | transition: transform .2s; | ||
28 | 23 | ||
29 | --key-focus: ( | 24 | @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { |
30 | --label: fn.global-color(--focus --text), | ||
31 | --border: fn.global-color(--focus --border), | ||
32 | --outline: fn.global-color(--focus --outline), | ||
33 | ), | ||
34 | |||
35 | --quiet: ( | ||
36 | --image: fn.global-color(--bg-base), | ||
37 | |||
38 | --hover: ( | ||
39 | --image: fn.global-color(--border), | ||
40 | ), | ||
41 | ) | ||
42 | ), | ||
43 | )); | ||
44 | |||
45 | @include iro.bem-object(iro.props-namespace()) { | ||
46 | display: block; | ||
47 | border: fn.dim(--border) solid fn.color(--border); | ||
48 | border-radius: fn.dim(--rounding); | ||
49 | background-color: fn.color(--bg); | ||
50 | |||
51 | @include iro.bem-multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { | ||
52 | &:hover, | 25 | &:hover, |
53 | &:focus-visible, | 26 | &:active, |
54 | &:active { | 27 | &:focus-visible { |
55 | border-color: fn.color(--hover --border); | 28 | transform: translateY(props.get(vars.$hover--offset-b)); |
29 | |||
30 | @include bem.elem('body') { | ||
31 | @include bem.modifier('hidden') { | ||
32 | visibility: visible; | ||
33 | opacity: 1; | ||
34 | transition: | ||
35 | opacity .2s ease, | ||
36 | visibility .2s linear; | ||
37 | } | ||
38 | } | ||
56 | } | 39 | } |
57 | 40 | ||
58 | &:focus-visible { | 41 | &:focus-visible { |
59 | border-color: fn.color(--key-focus --border); | 42 | outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); |
60 | outline: fn.color(--key-focus --border) solid calc(fn.dim(--key-focus --border) - fn.dim(--border)); | 43 | box-shadow: |
61 | box-shadow: 0 0 0 calc(fn.dim(--key-focus --border) + fn.dim(--key-focus --outline)) fn.color(--key-focus --outline); | 44 | 0 |
45 | 0 | ||
46 | 0 | ||
47 | calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) | ||
48 | props.get(vars.$key-focus--outline-color); | ||
62 | } | 49 | } |
63 | } | 50 | } |
64 | 51 | ||
65 | @include iro.bem-elem('avatar') { | 52 | @include bem.elem('avatar') { |
66 | margin-block-start: fn.dim(--pad-b); | 53 | margin-block-start: props.get(vars.$pad-b); |
67 | margin-inline-start: fn.dim(--pad-i); | 54 | margin-inline-start: props.get(vars.$pad-i); |
68 | } | 55 | } |
69 | 56 | ||
70 | @include iro.bem-elem('image') { | 57 | @include bem.elem('image') { |
71 | display: block; | 58 | position: relative; |
72 | inline-size: 100%; | 59 | display: block; |
73 | object-fit: cover; | 60 | flex: 0 0 auto; |
61 | inline-size: 100%; | ||
62 | overflow: hidden; | ||
63 | object-fit: cover; | ||
64 | transition: background-color .2s, transform .2s, opacity .2s; | ||
74 | 65 | ||
75 | &:first-child { | 66 | &:first-child { |
76 | border-start-start-radius: calc(fn.dim(--rounding) - fn.dim(--border)); | 67 | border-start-start-radius: props.get(vars.$rounding); |
77 | border-start-end-radius: calc(fn.dim(--rounding) - fn.dim(--border)); | 68 | border-start-end-radius: props.get(vars.$rounding); |
78 | } | 69 | } |
79 | 70 | ||
80 | &:last-child { | 71 | &:last-child { |
81 | border-end-start-radius: calc(fn.dim(--rounding) - fn.dim(--border)); | 72 | border-end-start-radius: props.get(vars.$rounding); |
82 | border-end-end-radius: calc(fn.dim(--rounding) - fn.dim(--border)); | 73 | border-end-end-radius: props.get(vars.$rounding); |
83 | } | 74 | } |
84 | 75 | ||
85 | @include iro.bem-next-elem('avatar') { | 76 | @include bem.next-elem('avatar') { |
86 | margin-block-start: calc(-.7 * fn.foreign-dim(--avatar, --xl --size)); | 77 | margin-block-start: calc(-.7 * props.get(avatar.$size--xl)); |
87 | } | 78 | } |
88 | } | 79 | } |
89 | 80 | ||
90 | @include iro.bem-elem('body') { | 81 | @include bem.elem('image-img') { |
91 | padding-block: fn.dim(--pad-b); | 82 | display: block; |
92 | padding-inline: fn.dim(--pad-i); | 83 | inline-size: 100%; |
84 | object-fit: cover; | ||
85 | } | ||
86 | |||
87 | @include bem.elem('image-overlay') { | ||
88 | position: absolute; | ||
89 | inset-block-end: 0; | ||
90 | inset-inline: 0; | ||
91 | z-index: 5; | ||
92 | padding-block: props.get(vars.$image-overlay--pad-b); | ||
93 | padding-inline: props.get(vars.$image-overlay--pad-i); | ||
94 | } | ||
95 | |||
96 | @include bem.elem('body') { | ||
97 | flex: 1 0 auto; | ||
98 | padding-block: props.get(vars.$pad-b); | ||
99 | padding-inline: props.get(vars.$pad-i); | ||
93 | 100 | ||
94 | &::before { | 101 | &::before { |
95 | content: ''; | ||
96 | display: block; | 102 | display: block; |
97 | margin-block: -100em 100em; | 103 | margin-block: -100em 100em; |
104 | content: ''; | ||
105 | } | ||
106 | |||
107 | @include bem.modifier('hidden') { | ||
108 | position: absolute; | ||
109 | inset-block-end: 0; | ||
110 | inset-inline: 0; | ||
111 | z-index: 10; | ||
112 | visibility: hidden; | ||
113 | background-color: props.get(vars.$bg-color); | ||
114 | //border-end-start-radius: props.get(vars.$rounding); | ||
115 | //border-end-end-radius: props.get(vars.$rounding); | ||
116 | opacity: 0; | ||
117 | transition: | ||
118 | opacity .2s ease, | ||
119 | visibility 0s .2s linear; | ||
120 | |||
121 | @include bem.next-elem('image') { | ||
122 | border-start-start-radius: props.get(vars.$rounding); | ||
123 | border-start-end-radius: props.get(vars.$rounding); | ||
124 | } | ||
98 | } | 125 | } |
99 | } | 126 | } |
100 | 127 | ||
101 | @include iro.bem-elem('content') { | 128 | @include bem.elem('content') { |
102 | margin-block-start: fn.dim(--spacing); | 129 | margin-block-start: props.get(vars.$spacing); |
103 | } | 130 | } |
104 | 131 | ||
105 | @include iro.bem-elem('footer') { | 132 | @include bem.elem('footer') { |
106 | padding-block: 0 fn.dim(--pad-b); | 133 | flex: 0 0 auto; |
107 | padding-inline: fn.dim(--pad-i); | 134 | padding-block: 0 props.get(vars.$pad-b); |
108 | margin-block-start: calc(-1 * fn.dim(--pad-b)); | 135 | padding-inline: props.get(vars.$pad-i); |
136 | margin-block-start: calc(-1 * props.get(vars.$pad-b)); | ||
109 | 137 | ||
110 | &::before { | 138 | &::before { |
111 | content: ''; | ||
112 | display: block; | 139 | display: block; |
113 | block-size: fn.dim(--divider); | 140 | block-size: props.get(vars.$divider-width); |
114 | margin-block: fn.dim(--spacing); | 141 | margin-block: props.get(vars.$spacing); |
115 | background-color: fn.color(--divider); | 142 | content: ''; |
143 | background-color: props.get(vars.$divider-width); | ||
116 | } | 144 | } |
117 | } | 145 | } |
118 | 146 | ||
119 | @include iro.bem-modifier('quiet') { | 147 | @include bem.modifier('quiet') { |
120 | position: relative; | 148 | margin-inline: 0; |
121 | border: 0; | ||
122 | background-color: transparent; | 149 | background-color: transparent; |
150 | border: 0; | ||
123 | 151 | ||
124 | @include iro.bem-multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { | 152 | @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { |
125 | &:hover, | 153 | &:hover, |
126 | &:active { | 154 | &:active, |
127 | @include iro.bem-elem('image') { | 155 | &:focus-visible { |
156 | transform: none; | ||
157 | |||
158 | @include bem.elem('image') { | ||
159 | background-color: props.get(vars.$quiet--hover--image-color); | ||
128 | opacity: .75; | 160 | opacity: .75; |
129 | background-color: fn.color(--quiet --hover --image); | 161 | transform: translateY(props.get(vars.$hover--offset-b)); |
162 | } | ||
163 | |||
164 | @include bem.elem('body') { | ||
165 | @include bem.modifier('hidden') { | ||
166 | transform: translateY(props.get(vars.$hover--offset-b)); | ||
167 | } | ||
130 | } | 168 | } |
131 | } | 169 | } |
132 | 170 | ||
@@ -134,32 +172,72 @@ | |||
134 | outline: none; | 172 | outline: none; |
135 | box-shadow: none; | 173 | box-shadow: none; |
136 | 174 | ||
137 | @include iro.bem-elem('image') { | 175 | @include bem.elem('image') { |
138 | outline: fn.color(--key-focus --border) solid fn.dim(--key-focus --border); | 176 | background-color: props.get(vars.$quiet--hover--image-color); |
177 | outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); | ||
178 | box-shadow: | ||
179 | 0 | ||
180 | 0 | ||
181 | 0 | ||
182 | calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) | ||
183 | props.get(vars.$key-focus--outline-color); | ||
139 | opacity: 1; | 184 | opacity: 1; |
140 | background-color: fn.color(--quiet --hover --image); | ||
141 | box-shadow: 0 0 0 calc(fn.dim(--key-focus --border) + fn.dim(--key-focus --outline)) fn.color(--key-focus --outline); | ||
142 | } | 185 | } |
143 | } | 186 | } |
144 | } | 187 | } |
145 | 188 | ||
146 | @include iro.bem-elem('image') { | 189 | @include bem.elem('image') { |
147 | position: relative; | 190 | position: relative; |
148 | margin: calc(-1 * fn.dim(--key-focus --border)); | 191 | margin: calc(-1 * props.get(vars.$key-focus--border-width)); |
149 | border: fn.dim(--key-focus --border-offset) solid transparent; | 192 | background-color: props.get(vars.$quiet--image-color); |
150 | border-radius: calc(fn.dim(--rounding) + fn.dim(--key-focus --border-offset)); | ||
151 | background-color: fn.color(--quiet --image); | ||
152 | background-clip: padding-box; | 193 | background-clip: padding-box; |
194 | border: props.get(vars.$key-focus--border-offset) solid transparent; | ||
195 | border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset)); | ||
153 | } | 196 | } |
154 | 197 | ||
155 | @include iro.bem-elem('body') { | 198 | @include bem.elem('body') { |
156 | padding: 0; | 199 | padding: 0; |
157 | padding-block-start: fn.dim(--spacing); | 200 | padding-block-start: props.get(vars.$spacing); |
201 | |||
202 | @include bem.modifier('hidden') { | ||
203 | padding-block: props.get(vars.$pad-b); | ||
204 | padding-inline: props.get(vars.$pad-i); | ||
205 | } | ||
158 | } | 206 | } |
159 | 207 | ||
160 | @include iro.bem-elem('footer') { | 208 | @include bem.elem('footer') { |
161 | padding-inline: 0; | 209 | padding-inline: 0; |
162 | } | 210 | } |
163 | } | 211 | } |
212 | |||
213 | @include bem.modifier('horizontal') { | ||
214 | flex-direction: row; | ||
215 | align-items: center; | ||
216 | |||
217 | @include bem.elem('image') { | ||
218 | align-self: stretch; | ||
219 | inline-size: auto; | ||
220 | |||
221 | &:first-child { | ||
222 | border-start-end-radius: 0; | ||
223 | border-end-start-radius: props.get(vars.$rounding); | ||
224 | } | ||
225 | |||
226 | &:last-child { | ||
227 | border-start-end-radius: props.get(vars.$rounding); | ||
228 | border-end-start-radius: 0; | ||
229 | } | ||
230 | } | ||
231 | |||
232 | @include bem.elem('body') { | ||
233 | flex: 0 0 auto; | ||
234 | |||
235 | @include bem.modifier('main') { | ||
236 | flex-shrink: 1; | ||
237 | inline-size: 100%; | ||
238 | min-inline-size: 0; | ||
239 | } | ||
240 | } | ||
241 | } | ||
164 | } | 242 | } |
165 | } | 243 | } |