Docker for electrical engineers - Meetup Ljubljana
Samo Penic
2018-11-28 e78ca8dd3bfb1b540841d3920076212a414403e7
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
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
/*
    So you like the style of impress.js demo?
    Or maybe you are just curious how it was done?
 
    You couldn't find a better place to find out!
 
    Welcome to the stylesheet impress.js demo presentation.
 
    Please remember that it is not meant to be a part of impress.js and is
    not required by impress.js.
    I expect that anyone creating a presentation for impress.js would create
    their own set of styles.
 
    But feel free to read through it and learn how to get the most of what
    impress.js provides.
 
    And let me be your guide.
 
    Shall we begin?
*/
 
 
/*
    We start with a good ol' reset.
    That's the one by Eric Meyer http://meyerweb.com/eric/tools/css/reset/
 
    You can probably argue if it is needed here, or not, but for sure it
    doesn't do any harm and gives us a fresh start.
*/
 
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
 
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
 /*   list-style: none; */
}
li {
    padding-bottom:10px;
}
 
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}
 
table {
    border-collapse: collapse;
    border-spacing: 0;
}
 
/*
    Now here is when interesting things start to appear.
 
    We set up <body> styles with default font and nice gradient in the background.
    And yes, there is a lot of repetition there because of -prefixes but we don't
    want to leave anybody behind.
*/
body {
    font-family: 'PT Sans', sans-serif;
    min-height: 740px;
 
    background: rgb(215, 215, 215);
    background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190)));
    background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
    background:    -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
    background:     -ms-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
    background:      -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
    background:         radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
}
 
/*
    Now let's bring some text styles back ...
*/
b, strong { font-weight: bold }
i, em { font-style: italic }
 
/*
    ... and give links a nice look.
*/
a {
    color: inherit;
    text-decoration: none;
    padding: 0 0.1em;
    background: rgba(255,255,255,0.5);
    text-shadow: -1px -1px 2px rgba(100,100,100,0.9);
    border-radius: 0.2em;
 
    -webkit-transition: 0.5s;
    -moz-transition:    0.5s;
    -ms-transition:     0.5s;
    -o-transition:      0.5s;
    transition:         0.5s;
}
 
a:hover,
a:focus {
    background: rgba(255,255,255,1);
    text-shadow: -1px -1px 2px rgba(100,100,100,0.5);
}
 
/*
    Because the main point behind the impress.js demo is to demo impress.js
    we display a fallback message for users with browsers that don't support
    all the features required by it.
 
    All of the content will be still fully accessible for them, but I want
    them to know that they are missing something - that's what the demo is
    about, isn't it?
 
    And then we hide the message, when support is detected in the browser.
*/
 
.fallback-message {
    font-family: sans-serif;
    line-height: 1.3;
 
    width: 780px;
    padding: 10px 10px 0;
    margin: 20px auto;
 
    border: 1px solid #E4C652;
    border-radius: 10px;
    background: #EEDC94;
}
 
.fallback-message p {
    margin-bottom: 10px;
}
 
.impress-supported .fallback-message {
    display: none;
}
 
/*
    Now let's style the presentation steps.
 
    We start with basics to make sure it displays correctly in everywhere ...
*/
 
.step {
    position: relative;
    width: 900px;
    padding: 40px;
    margin: 20px auto;
 
    -webkit-box-sizing: border-box;
    -moz-box-sizing:    border-box;
    -ms-box-sizing:     border-box;
    -o-box-sizing:      border-box;
    box-sizing:         border-box;
 
    font-family: 'PT Serif', georgia, serif;
    font-size: 48px;
    line-height: 1.5;
}
 
/*
    ... and we enhance the styles for impress.js.
 
    Basically we remove the margin and make inactive steps a little bit transparent.
*/
.impress-enabled .step {
    margin: 0;
    opacity: 0.3;
 
    -webkit-transition: opacity 1s;
    -moz-transition:    opacity 1s;
    -ms-transition:     opacity 1s;
    -o-transition:      opacity 1s;
    transition:         opacity 1s;
}
 
.impress-enabled .step.active { opacity: 1 }
 
/*
    These 'slide' step styles were heavily inspired by HTML5 Slides:
    http://html5slides.googlecode.com/svn/trunk/styles.css
 
    ;)
 
    They cover everything what you see on first three steps of the demo.
*/
.slide {
    display: block;
 
    width: 900px;
    height: 700px;
    padding: 40px 60px;
 
    background-color: white;
    border: 1px solid rgba(0, 0, 0, .3);
    border-radius: 10px;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .1);
 
    color: rgb(102, 102, 102);
    text-shadow: 0 2px 2px rgba(0, 0, 0, .1);
 
    font-family: 'Open Sans', Arial, sans-serif;
    font-size: 30px;
    line-height: 36px;
    letter-spacing: -1px;
}
 
.slide q {
    display: block;
    font-size: 50px;
    line-height: 72px;
 
    margin-top: 100px;
}
 
.slide q strong {
    white-space: nowrap;
}
 
/*
    And now we start to style each step separately.
 
    I agree that this may be not the most efficient, object-oriented and
    scalable way of styling, but most of steps have quite a custom look
    and typography tricks here and there, so they had to be styled separately.
 
    First is the title step with a big <h1> (no room for padding) and some
    3D positioning along Z axis.
*/
 
#title {
    padding: 0;
}
 
#title .try {
    font-size: 58px;
    position: absolute;
    top: -2.5em;
    left: 1.5em;
 
    -webkit-transform: translateZ(20px);
    -moz-transform:    translateZ(20px);
    -ms-transform:     translateZ(20px);
    -o-transform:      translateZ(20px);
    transform:         translateZ(20px);
}
 
#title h1 {
    font-size: 120px;
 
    -webkit-transform: translateZ(50px);
    -moz-transform:    translateZ(50px);
    -ms-transform:     translateZ(50px);
    -o-transform:      translateZ(50px);
    transform:         translateZ(50px);
}
 
#naslovnica .footnote {
    padding-top:20px;
    text-align: right;
    font-size: 32px;
}
 
.center {
    text-align: center;
}
.vsebina {
 
    padding-left:100px;
    padding-right:100px;
}
 
.naslov {
    font-size: 65px;
    padding-bottom:50px;
}
.tiny {
    font-size: 25px;
    }
.samo {
    width:300px;
    height:300px;
    position:relative;
    left:400px;
    top:-150px;
    margin-bottom:-100px;
}
/*
    Second step is nothing special, just a text with a link, so it doesn't need
    any special styling.
 
    Let's move to 'big thoughts' with centered text and custom font sizes.
*/
#big {
    width: 600px;
    text-align: center;
    font-size: 60px;
    line-height: 1;
}
 
#big strong,
#big b {
    display: block;
    font-size: 250px;
    line-height: 250px;
}
 
#big .thoughts {
    font-size: 90px;
    line-height: 150px;
}
 
/*
    'Tiny ideas' just need some tiny styling.
*/
#tiny {
    width: 500px;
    text-align: center;
}
 
/*
    This step has some animated text ...
*/
#ing { width: 500px }
 
/*
    ... so we define display to `inline-block` to enable transforms and
    transition duration to 0.5s ...
*/
#ing b {
    display: inline-block;
    -webkit-transition: 0.5s;
    -moz-transition:    0.5s;
    -ms-transition:     0.5s;
    -o-transition:      0.5s;
    transition:         0.5s;
}
 
/*
    ... and we want 'positioning` word to move up a bit when the step gets
    `present` class ...
*/
#ing.present .positioning {
    -webkit-transform: translateY(-10px);
    -moz-transform:    translateY(-10px);
    -ms-transform:     translateY(-10px);
    -o-transform:      translateY(-10px);
    transform:         translateY(-10px);
}
 
/*
    ... 'rotating' to rotate a quarter of a second later ...
*/
#ing.present .rotating {
    -webkit-transform: rotate(-10deg);
    -moz-transform:    rotate(-10deg);
    -ms-transform:     rotate(-10deg);
    -o-transform:      rotate(-10deg);
    transform:         rotate(-10deg);
 
    -webkit-transition-delay: 0.25s;
    -moz-transition-delay:    0.25s;
    -ms-transition-delay:     0.25s;
    -o-transition-delay:      0.25s;
    transition-delay:         0.25s;
}
 
/*
    ... and 'scaling' to scale down after another quarter of a second.
*/
#ing.present .scaling {
    -webkit-transform: scale(0.7);
    -moz-transform:    scale(0.7);
    -ms-transform:     scale(0.7);
    -o-transform:      scale(0.7);
    transform:         scale(0.7);
 
    -webkit-transition-delay: 0.5s;
    -moz-transition-delay:    0.5s;
    -ms-transition-delay:     0.5s;
    -o-transition-delay:      0.5s;
    transition-delay:         0.5s;
}
 
/*
    The 'imagination' step is again some boring font-sizing.
*/
 
#imagination {
    width: 600px;
}
 
#imagination .imagination {
    font-size: 78px;
}
 
/*
    There is nothing really special about 'use the source, Luke' step, too,
    except maybe of the Yoda background.
 
    As you can see below I've 'hard-coded' it in data URL.
    That's not the best way to serve images, but because that's just this one
    I decided it will be OK to have it this way.
 
    Just make sure you don't blindly copy this approach.
*/
#source {
    width: 700px;
    padding-bottom: 300px;
 
    /* Yoda Icon :: Pixel Art from Star Wars http://www.pixeljoint.com/pixelart/1423.htm */
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAEYCAMAAACwUBm+AAAAAXNSR0IArs4c6QAAAKtQTFRFsAAAvbWSLUUrLEQqY1s8UYJMqJ1vNTEgOiIdIzYhjIFVLhsXZ6lgSEIsP2U8JhcCVzMsSXZEgXdOO145XJdWOl03LzAYMk4vSXNExr+hwcuxRTs1Qmk+RW9Am49eFRANQz4pUoNMQWc+OSMDTz0wLBsCNVMxa2NBOyUDUoNNSnlEWo9VRGxAVzYFl6tXCggHbLNmMUIcHhwTXkk5f3VNRT8wUT8xAAAACQocRBWFFwAAAAF0Uk5TAEDm2GYAAAPCSURBVHja7d3JctNAFIZRMwRCCGEmzPM8z/D+T8bu/ptbXXJFdij5fMt2Wuo+2UgqxVmtttq5WVotLzBgwIABAwYMGDCn0qVqbo69psPqVpWx+1XG5iaavF8wYMCAAQMGDBgwi4DJ6Y6qkxB1HNlcN3a92gbR5P2CAQMGDBgwYMCAWSxMlrU+UY5yu2l9okfV4bAxUVbf7TJnAwMGDBgwYMCAAbMLMHeqbGR82Zy+VR1Ht81nVca6R+UdTLaU24Ruzd3qM/e4yjnAgAEDBgwYMGDA7AJMd1l/3NRdVGcj3eX/2WEhCmDGxnM7yqygu8XIPjJj8iN/MGDAgAEDBgwYMAuDGb8q0RGlLCHLv1t9qDKWn3vdNHVuEI6HPaxO9Jo3GDBgwIABAwYMmIXBdC9ShGgMk+XnkXUeuGcsP/e1+lhNnZsL/G5Vs3OAAQMGDBgwYMCAWSxMR3SzOmraG5atdy9wZKzb+vg16qyqe2FltbnAgAEDBgwYMGDALAxmTJSuN3WA76rnVca6GTnemGN1WoEBAwYMGDBgwIBZGMxUomy4+xO899V4LAg5Xnc2MGDAgAEDBgwYMGA218Wq+2K1LDqvY9xZu8zN8fICdM6btYABAwYMGDBgwIABMzfH0+pGU5afze2tXebmeAfVz+p8BQYMGDBgwIABAwbMPBzZ+oWmfJrln1273FhkbHzee9WWbw7AgAEDBgwYMGDALAKm43hcdctKgblcPamOhuXnXlY5Xs6bsW4FGyQCAwYMGDBgwIABswiYMceZKgvMo+h8mrHLTdn676rj+FEFoTtHd8MwOxEYMGDAgAEDBgyYRcBM5UhXqiymW3R3c9ARhWO/OmjqfjVZy+xEYMCAAQMGDBgwYBYG073OnCV0RFNhMhaOa9WfKmOB6XjHMN1tQmaAAQMGDBgwYMCA2VWY7vXjz1U4croAzgPztwIDBgwYMGDAgAEDZhswh035NBw59Dww3RgYMGDAgAEDBgwYMJuD6f4tXT7NUqfCdBvZLkxXdgQGDBgwYMCAAQNmt2DGj8WzwAfV/w7T/aq7mxwwYMCAAQMGDBgwuwqTOo7uTwTngflSzQ3TdaJvAwEDBgwYMGDAgAED5gSvgbyo5oHZ4Pc+gwEDBgwYMGDAgAEzhOm+5G0qTGaAAQMGDBgwYMCAAXNaMOcnls3tNwWm+zRzp54NDBgwYMCAAQMGDJh5YNL36k1TLuGvVq+qnKMbS5n7tulT9asCAwYMGDBgwIABA2ZumKuztLnjgQEDBgwYMGDAgNl5mH/4/ltKA6vBNAAAAABJRU5ErkJggg==);
    background-position: bottom right;
    background-repeat: no-repeat;
}
 
#source q {
    font-size: 60px;
}
 
/*
    And the "it's in 3D" step again brings some 3D typography - just for fun.
 
    Because we want to position <span> elements in 3D we set transform-style to
    `preserve-3d` on the paragraph.
    It is not needed by webkit browsers, but it is in Firefox. It's hard to say
    which behaviour is correct as 3D transforms spec is not very clear about it.
*/
#its-in-3d p {
    -webkit-transform-style: preserve-3d;
    -moz-transform-style:    preserve-3d; /* Y U need this Firefox?! */
    -ms-transform-style:     preserve-3d;
    -o-transform-style:      preserve-3d;
    transform-style:         preserve-3d;
}
 
/*
    Below we position each word separately along Z axis and we want it to transition
    to default position in 0.5s when the step gets `present` class.
 
    Quite a simple idea, but lot's of styles and prefixes.
*/
#its-in-3d span,
#its-in-3d b {
    display: inline-block;
    -webkit-transform: translateZ(40px);
    -moz-transform:    translateZ(40px);
    -ms-transform:     translateZ(40px);
    -o-transform:      translateZ(40px);
     transform:        translateZ(40px);
 
    -webkit-transition: 0.5s;
    -moz-transition:    0.5s;
    -ms-transition:     0.5s;
    -o-transition:      0.5s;
    transition:         0.5s;
}
 
#its-in-3d .have {
    -webkit-transform: translateZ(-40px);
    -moz-transform:    translateZ(-40px);
    -ms-transform:     translateZ(-40px);
    -o-transform:      translateZ(-40px);
    transform:         translateZ(-40px);
}
 
#its-in-3d .you {
    -webkit-transform: translateZ(20px);
    -moz-transform:    translateZ(20px);
    -ms-transform:     translateZ(20px);
    -o-transform:      translateZ(20px);
    transform:         translateZ(20px);
}
 
#its-in-3d .noticed {
    -webkit-transform: translateZ(-40px);
    -moz-transform:    translateZ(-40px);
    -ms-transform:     translateZ(-40px);
    -o-transform:      translateZ(-40px);
    transform:         translateZ(-40px);
}
 
#its-in-3d .its {
    -webkit-transform: translateZ(60px);
    -moz-transform:    translateZ(60px);
    -ms-transform:     translateZ(60px);
    -o-transform:      translateZ(60px);
    transform:         translateZ(60px);
}
 
#its-in-3d .in {
    -webkit-transform: translateZ(-10px);
    -moz-transform:    translateZ(-10px);
    -ms-transform:     translateZ(-10px);
    -o-transform:      translateZ(-10px);
    transform:         translateZ(-10px);
}
 
#its-in-3d .footnote {
    font-size: 32px;
 
    -webkit-transform: translateZ(-10px);
    -moz-transform:    translateZ(-10px);
    -ms-transform:     translateZ(-10px);
    -o-transform:      translateZ(-10px);
    transform:         translateZ(-10px);
}
 
#its-in-3d.present span,
#its-in-3d.present b {
    -webkit-transform: translateZ(0px);
    -moz-transform:    translateZ(0px);
    -ms-transform:     translateZ(0px);
    -o-transform:      translateZ(0px);
    transform:         translateZ(0px);
}
 
/*
    The last step is an overview.
    There is no content in it, so we make sure it's not visible because we want
    to be able to click on other steps.
 
*/
#overview { display: none }
 
/*
    We also make other steps visible and give them a pointer cursor using the
    `impress-on-` class.
*/
.impress-on-overview .step {
    opacity: 1;
    cursor: pointer;
}
 
/*
    This version of impress.js supports plugins, and in particular, a UI toolbar
    plugin that allows easy navigation between steps and autoplay.
*/
.impress-enabled div#impress-toolbar {
    position: fixed;
    right: 1px;
    bottom: 1px;
    opacity: 0.6;
}
.impress-enabled div#impress-toolbar > span {
    margin-right: 10px;
}
 
/*
    With help from the mouse-timeout plugin, we can hide the toolbar and
    have it show only when you move/click/touch the mouse.
*/
body.impress-mouse-timeout div#impress-toolbar {
    display: none;
}
 
/*
    In fact, we can hide the mouse cursor itself too, when mouse isn't used.
*/
body.impress-mouse-timeout {
    cursor: none;
}
 
 
/*
    Now, when we have all the steps styled let's give users a hint how to navigate
    around the presentation.
 
    The best way to do this would be to use JavaScript, show a delayed hint for a
    first time users, then hide it and store a status in cookie or localStorage...
 
    But I wanted to have some CSS fun and avoid additional scripting...
 
    Let me explain it first, so maybe the transition magic will be more readable
    when you read the code.
 
    First of all I wanted the hint to appear only when user is idle for a while.
    You can't detect the 'idle' state in CSS, but I delayed a appearing of the
    hint by 5s using transition-delay.
 
    You also can't detect in CSS if the user is a first-time visitor, so I had to
    make an assumption that I'll only show the hint on the first step. And when
    the step is changed hide the hint, because I can assume that user already
    knows how to navigate.
 
    To summarize it - hint is shown when the user is on the first step for longer
    than 5 seconds.
 
    The other problem I had was caused by the fact that I wanted the hint to fade
    in and out. It can be easily achieved by transitioning the opacity property.
    But that also meant that the hint was always on the screen, even if totally
    transparent. It covered part of the screen and you couldn't correctly clicked
    through it.
    Unfortunately you cannot transition between display `block` and `none` in pure
    CSS, so I needed a way to not only fade out the hint but also move it out of
    the screen.
 
    I solved this problem by positioning the hint below the bottom of the screen
    with CSS transform and moving it up to show it. But I also didn't want this move
    to be visible. I wanted the hint only to fade in and out visually, so I delayed
    the fade in transition, so it starts when the hint is already in its correct
    position on the screen.
 
    I know, it sounds complicated ... maybe it would be easier with the code?
*/
 
.hint {
    /*
        We hide the hint until presentation is started and from browsers not supporting
        impress.js, as they will have a linear scrollable view ...
    */
    display: none;
 
    /*
        ... and give it some fixed position and nice styles.
    */
    position: fixed;
    left: 0;
    right: 0;
    bottom: 200px;
 
    background: rgba(0,0,0,0.5);
    color: #EEE;
    text-align: center;
 
    font-size: 50px;
    padding: 20px;
 
    z-index: 100;
 
    /*
        By default we don't want the hint to be visible, so we make it transparent ...
    */
    opacity: 0;
 
    /*
        ... and position it below the bottom of the screen (relative to it's fixed position)
    */
    -webkit-transform: translateY(400px);
    -moz-transform:    translateY(400px);
    -ms-transform:     translateY(400px);
    -o-transform:      translateY(400px);
    transform:         translateY(400px);
 
    /*
        Now let's imagine that the hint is visible and we want to fade it out and move out
        of the screen.
 
        So we define the transition on the opacity property with 1s duration and another
        transition on transform property delayed by 1s so it will happen after the fade out
        on opacity finished.
 
        This way user will not see the hint moving down.
    */
    -webkit-transition: opacity 1s, -webkit-transform 0.5s 1s;
    -moz-transition:    opacity 1s,    -moz-transform 0.5s 1s;
    -ms-transition:     opacity 1s,     -ms-transform 0.5s 1s;
    -o-transition:      opacity 1s,      -o-transform 0.5s 1s;
    transition:         opacity 1s,         transform 0.5s 1s;
}
 
/*
    Now we 'enable' the hint when presentation is initialized ...
*/
.impress-enabled .hint { display: block }
 
/*
    ... and we will show it when the first step (with id 'bored') is active.
*/
.impress-on-bored .hint {
    /*
        We remove the transparency and position the hint in its default fixed
        position.
    */
    opacity: 1;
 
    -webkit-transform: translateY(0px);
    -moz-transform:    translateY(0px);
    -ms-transform:     translateY(0px);
    -o-transform:      translateY(0px);
    transform:         translateY(0px);
 
    /*
        Now for fade in transition we have the oposite situation from the one
        above.
 
        First after 4.5s delay we animate the transform property to move the hint
        into its correct position and after that we fade it in with opacity
        transition.
    */
    -webkit-transition: opacity 1s 5s, -webkit-transform 0.5s 4.5s;
    -moz-transition:    opacity 1s 5s,    -moz-transform 0.5s 4.5s;
    -ms-transition:     opacity 1s 5s,     -ms-transform 0.5s 4.5s;
    -o-transition:      opacity 1s 5s,      -o-transform 0.5s 4.5s;
    transition:         opacity 1s 5s,         transform 0.5s 4.5s;
}
 
/*
    And as the last thing there is a workaround for quite strange bug.
    It happens a lot in Chrome. I don't remember if I've seen it in Firefox.
 
    Sometimes the element positioned in 3D (especially when it's moved back
    along Z axis) is not clickable, because it falls 'behind' the <body>
    element.
 
    To prevent this, I decided to make <body> non clickable by setting
    pointer-events property to `none` value.
    Value if this property is inherited, so to make everything else clickable
    I bring it back on the #impress element.
 
    If you want to know more about `pointer-events` here are some docs:
    https://developer.mozilla.org/en/CSS/pointer-events
 
    There is one very important thing to notice about this workaround - it makes
    everything 'unclickable' except what's in #impress element.
 
    So use it wisely ... or don't use at all.
*/
.impress-enabled                          { pointer-events: none }
.impress-enabled #impress                 { pointer-events: auto }
.impress-enabled #impress-toolbar         { pointer-events: auto }
.impress-enabled #impress-console-button  { pointer-events: auto }
/*
    There is one funny thing I just realized.
 
    Thanks to this workaround above everything except #impress element is invisible
    for click events. That means that the hint element is also not clickable.
    So basically all of this transforms and delayed transitions trickery was probably
    not needed at all...
 
    But it was fun to learn about it, wasn't it?
*/
 
/*
    That's all I have for you in this file.
    Thanks for reading. I hope you enjoyed it at least as much as I enjoyed writing it
    for you.
*/