forked from learningequality/kolibri-design-system
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkimg.vue
391 lines (348 loc) · 11.3 KB
/
kimg.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
<template>
<DocsPageTemplate apiDocs>
<DocsPageSection
title="Overview"
anchor="#overview"
>
<p>
<code>KImg</code> displays an image and provides functionality to manipulate it such as
setting its dimensions, aspect ratio, scaling, letterboxing, and more.
</p>
</DocsPageSection>
<DocsPageSection
title="Usage"
anchor="#usage"
>
<p>Unless you set fixed dimensions, <code>KImg</code> is responsive by default.</p>
<p>
<em>Note that the majority of settings are applied to the image container rather than the
image itself.</em>
If you need to apply dimensions, aspect ratio, etc. directly to the image, you can use
<code>'fitXY'</code>
<DocsInternalLink href="/kimg#prop:scaleType"> scale type </DocsInternalLink>.
</p>
<p>
Depending on the scale type and other settings, the image may be letterboxed. When an image
is letterboxed,
<DocsInternalLink href="/kimg#prop:backgroundColor">
<code>backgroundColor</code>
</DocsInternalLink>
(gray by default) fills the remaining space.
</p>
<p>
This is in more detail illustrated in the examples below, where the original image
dimensions are 200×114 px.
</p>
<h3>Rendering within inline and block elements</h3>
<h4>Inline</h4>
<p>
When rendered within an inline element, the image preserves its original dimensions by
default.
</p>
<DocsShowCode language="html">
<span>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</span>
</DocsShowCode>
<DocsShow>
<span>
<KImg
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
altText="A sitting hummingbird"
/>
</span>
</DocsShow>
<h4>Block</h4>
<p>
When rendered within a block element, the image container fills the parent block element and
the image scales with the <code>'centerInside'</code>
<DocsInternalLink href="/kimg#prop:scaleType"> scale type </DocsInternalLink> by default.
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
altText="A sitting hummingbird"
/>
</div>
</DocsShow>
<h3>Alternative text</h3>
<p>
Unless an image is
<DocsExternalLink
text="decorative"
href="https://www.w3.org/WAI/tutorials/images/decorative/"
/>, you need to provide alternative text via
<DocsInternalLink href="/kimg#prop:altText">
<code>altText</code>
</DocsInternalLink>.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</DocsShowCode>
<p>
If it's meant to be decorative, indicate it by using
<DocsInternalLink href="/kimg#prop:isDecorative">
<code>isDecorative</code>
</DocsInternalLink>. Alternative text won't be required in this case and the image will be hidden from
assistive technologies.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
isDecorative
/>
</DocsShowCode>
<h3 id="scaling">Scaling</h3>
<p>
The <DocsInternalLink href="/kimg#prop:scaleType"> scale type </DocsInternalLink> determines
how an image scales within the image container.
</p>
<h4><code style="font-weight: bold">'centerInside'</code> scale type</h4>
<p>
Scales an image uniformly and maintains its original aspect ratio. Both its width and height
are equal to or less than the width and height of the image container. An image can be
letterboxed. It's the safest mode as it
<em>never distorts an image or impairs its quality.</em>
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
scaleType="centerInside"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
altText="A sitting hummingbird"
scaleType="centerInside"
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShow>
<h4><code style="font-weight: bold">'contain'</code> scale type</h4>
<p>
Behaves similarly to <code>'centerInside'</code> except it ensures that at least one axis of
an image fits the image container exactly. The original aspect ratio is maintained. An image
can be letterboxed. This mode
<em>may impair an image's quality by enlarging it above its original size</em>.
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
scaleType="contain"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
altText="A sitting hummingbird"
scaleType="contain"
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShow>
<h4><code style="font-weight: bold">'fitXY'</code> scale type</h4>
<p>
Scales X and Y axis of an image independently, so that the image matches the container
exactly. An image is never letterboxed. This mode
<em>may impair an image's quality by enlarging it above its original size, or distort its
aspect ratio.</em>
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
scaleType="fitXY"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
altText="A sitting hummingbird"
scaleType="fitXY"
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
:style="{ height: '200px', width: '100%', maxWidth: '500px' }"
/>
</div>
</DocsShow>
<h3>Aspect ratio</h3>
<p>
You can set the aspect ratio of the image container with
<DocsInternalLink href="/kimg#prop:aspectRatio">
<code>aspectRatio</code>
</DocsInternalLink>
and combine it with any of the scale types.
</p>
<p>
Note that the ratio styles calculations need to have the width information, therefore it
needs to be available in some way. For example, you can set the width directly on
<code>KImg</code>. Alternatively, you could ensure that <code>KImg</code>'s parent element
has width by setting it explicitly or by using a block element.
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
aspectRatio="4:3"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
altText="A sitting hummingbird"
aspectRatio="4:3"
/>
</div>
</DocsShow>
<h3>Placeholder area</h3>
<p>
The placeholder area is displayed when an image is not available. The area respects the
dimensions set on the image container and is gray by default. You can change the area color
via
<DocsInternalLink href="/kimg#prop:backgroundColor">
<code>backgroundColor</code>
</DocsInternalLink>
and use the
<DocsInternalLink href="/kimg#slot:placeholder">
<code>#placeholder</code>
</DocsInternalLink>
slot to place content in the area.
</p>
<DocsShowCode language="html">
<div>
<KImg
src=""
isDecorative
aspectRatio="16:9"
:style="{ maxWidth: '200px' }"
>
<template #placeholder>
<span
:style="{
display: 'flex',
height: '100%',
justifyContent: 'center',
alignItems: 'center',
}"
>
<KIcon icon="readSolid" />
</span>
</template>
</KImg>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
src=""
isDecorative
aspectRatio="16:9"
:style="{ maxWidth: '200px' }"
>
<template #placeholder>
<span
:style="{
display: 'flex',
height: '100%',
justifyContent: 'center',
alignItems: 'center',
}"
>
<KIcon icon="readSolid" />
</span>
</template>
</KImg>
</div>
</DocsShow>
<h3>Displaying content on top of an image</h3>
<p>
Use
<DocsInternalLink href="/kimg#slot:topLeft">
<code>#topLeft</code>
</DocsInternalLink>,
<DocsInternalLink href="/kimg#slot:topRight">
<code>#topRight</code>
</DocsInternalLink>,
<DocsInternalLink href="/kimg#slot:bottomLeft">
<code>#bottomLeft</code>
</DocsInternalLink>, or
<DocsInternalLink href="/kimg#slot:bottomRight">
<code>#bottomRight</code>
</DocsInternalLink>
slots to place content on top of the image container.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
>
<template #topLeft>
<span
:style="{
display: 'inline-block',
margin: '8px',
padding: '2px',
backgroundColor: 'white',
}"
>
Top left
</span>
</template>
</KImg>
</DocsShowCode>
<DocsShow>
<KImg
:src="require('../assets/hummingbird-small-cc-by-sa-4.jpg')"
altText="A sitting hummingbird"
>
<template #topLeft>
<span
:style="{
display: 'inline-block',
margin: '8px',
padding: '2px',
backgroundColor: 'white',
}"
>
Top left
</span>
</template>
</KImg>
</DocsShow>
</DocsPageSection>
</DocsPageTemplate>
</template>
<script>
export default {};
</script>