Add examples and UI for the demo page
Browse files- demo/images/separator.png +0 -0
- demo/{demo.js β scripts/demo.js} +62 -3
- demo/{emoji.js β scripts/emoji.js} +0 -0
- demo/{base.scss β styles/base.scss} +13 -39
- demo/{demo.scss β styles/demo.scss} +36 -8
- index.html +78 -36
- webpack.config.dev.js +5 -4
demo/images/separator.png
ADDED
![]() |
demo/{demo.js β scripts/demo.js}
RENAMED
@@ -1,11 +1,12 @@
|
|
1 |
/* eslint-disable */
|
2 |
-
|
|
|
3 |
animate: true,
|
4 |
opacity: 0.8,
|
5 |
padding: 5,
|
6 |
});
|
7 |
|
8 |
-
|
9 |
{
|
10 |
element: '.section__header',
|
11 |
popover: {
|
@@ -14,6 +15,20 @@ sholo.defineSteps([
|
|
14 |
position: 'bottom',
|
15 |
},
|
16 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
{
|
18 |
element: '.section__how',
|
19 |
popover: {
|
@@ -43,5 +58,49 @@ sholo.defineSteps([
|
|
43 |
|
44 |
document.querySelector('.btn__example')
|
45 |
.addEventListener('click', () => {
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
});
|
|
|
1 |
/* eslint-disable */
|
2 |
+
|
3 |
+
const tourSholo = new Sholo({
|
4 |
animate: true,
|
5 |
opacity: 0.8,
|
6 |
padding: 5,
|
7 |
});
|
8 |
|
9 |
+
tourSholo.defineSteps([
|
10 |
{
|
11 |
element: '.section__header',
|
12 |
popover: {
|
|
|
15 |
position: 'bottom',
|
16 |
},
|
17 |
},
|
18 |
+
{
|
19 |
+
element: '.btn__dark',
|
20 |
+
popover: {
|
21 |
+
title: 'This is Button',
|
22 |
+
description: 'Yeah I know I dont need to tell that but anyways, we need a step in the listing so yeah!'
|
23 |
+
}
|
24 |
+
},
|
25 |
+
{
|
26 |
+
element: '#free-use',
|
27 |
+
popover: {
|
28 |
+
title: 'Free to Use',
|
29 |
+
description: 'Yes, you can use it in your personal or commercial products'
|
30 |
+
}
|
31 |
+
},
|
32 |
{
|
33 |
element: '.section__how',
|
34 |
popover: {
|
|
|
58 |
|
59 |
document.querySelector('.btn__example')
|
60 |
.addEventListener('click', () => {
|
61 |
+
tourSholo.start();
|
62 |
+
});
|
63 |
+
|
64 |
+
|
65 |
+
document.querySelectorAll('pre code').forEach((element) => {
|
66 |
+
hljs.highlightBlock(element);
|
67 |
+
});
|
68 |
+
|
69 |
+
|
70 |
+
/////////////////////////////////////////////
|
71 |
+
// First example β highlighting without popover
|
72 |
+
/////////////////////////////////////////////
|
73 |
+
const singleSholoNoPopover = new Sholo();
|
74 |
+
document.querySelector('#run-single-element-no-popover')
|
75 |
+
.addEventListener('click', (e) => {
|
76 |
+
e.preventDefault();
|
77 |
+
singleSholoNoPopover.highlight('#single-element-no-popover');
|
78 |
+
});
|
79 |
+
|
80 |
+
/////////////////////////////////////////////
|
81 |
+
// Form focus examples
|
82 |
+
/////////////////////////////////////////////
|
83 |
+
const focusSholo = new Sholo({ padding: 0 });
|
84 |
+
const inputIds = ['creation-input', 'creation-input-2', 'creation-input-3', 'creation-input-4'];
|
85 |
+
inputIds.forEach(inputId => {
|
86 |
+
// Highlight the section on focus
|
87 |
+
document.getElementById(inputId).addEventListener('focus', () => {
|
88 |
+
focusSholo.highlight(`#${inputId}`);
|
89 |
+
});
|
90 |
+
});
|
91 |
+
|
92 |
+
/////////////////////////////////////////////
|
93 |
+
// Highlighting single element with popover
|
94 |
+
/////////////////////////////////////////////
|
95 |
+
const singleSholoWithPopover = new Sholo();
|
96 |
+
document.querySelector('#run-single-element-with-popover')
|
97 |
+
.addEventListener('click', (e) => {
|
98 |
+
e.preventDefault();
|
99 |
+
singleSholoWithPopover.highlight({
|
100 |
+
element: '#single-element-with-popover',
|
101 |
+
popover: {
|
102 |
+
title: 'Did you know?',
|
103 |
+
description: 'You can add HTML in title or description also!',
|
104 |
+
}
|
105 |
+
});
|
106 |
});
|
demo/{emoji.js β scripts/emoji.js}
RENAMED
File without changes
|
demo/{base.scss β styles/base.scss}
RENAMED
@@ -50,16 +50,21 @@ label {
|
|
50 |
p {
|
51 |
margin-top: 0;
|
52 |
margin-bottom: 20px;
|
|
|
53 |
}
|
54 |
|
55 |
-
hr {
|
56 |
display: block;
|
57 |
margin: $global-guttering*1.25 0;
|
58 |
border: 0;
|
59 |
border-bottom: 1px solid #eaeaea;
|
60 |
-
|
61 |
-
|
62 |
-
|
|
|
|
|
|
|
|
|
63 |
}
|
64 |
|
65 |
h1, h2, h3, h4, h5, h6 {
|
@@ -85,6 +90,7 @@ a, a:visited, a:focus {
|
|
85 |
font-size: 14px;
|
86 |
-webkit-appearance: none;
|
87 |
appearance: none;
|
|
|
88 |
margin-bottom: $global-guttering;
|
89 |
}
|
90 |
|
@@ -115,6 +121,7 @@ h6, .h6 {
|
|
115 |
ul li, ol li {
|
116 |
list-style-type: none;
|
117 |
line-height: 1.5;
|
|
|
118 |
}
|
119 |
|
120 |
blockquote {
|
@@ -124,41 +131,8 @@ blockquote {
|
|
124 |
border-radius: 10px;
|
125 |
}
|
126 |
|
127 |
-
.
|
128 |
-
|
129 |
-
margin: auto;
|
130 |
-
max-width: 40em;
|
131 |
-
padding: $global-guttering*2;
|
132 |
-
@media (max-width: 620px) {
|
133 |
-
padding: 0;
|
134 |
-
}
|
135 |
-
}
|
136 |
-
|
137 |
-
.section {
|
138 |
-
background-color: #FFFFFF;
|
139 |
-
padding: $global-guttering;
|
140 |
-
color: #333;
|
141 |
-
a, a:visited, a:focus {
|
142 |
-
color: #00bcd4;
|
143 |
-
}
|
144 |
-
}
|
145 |
-
|
146 |
-
.logo {
|
147 |
-
display: block;
|
148 |
-
margin-bottom: $global-guttering/2;
|
149 |
-
}
|
150 |
-
|
151 |
-
.logo__img {
|
152 |
-
width: 100%;
|
153 |
-
height: auto;
|
154 |
-
display: inline-block;
|
155 |
-
max-width: 100%;
|
156 |
-
vertical-align: top;
|
157 |
-
padding: $global-guttering/4 0;
|
158 |
-
}
|
159 |
-
|
160 |
-
.visible-ie {
|
161 |
-
display: none;
|
162 |
}
|
163 |
|
164 |
.zero-bottom {
|
|
|
50 |
p {
|
51 |
margin-top: 0;
|
52 |
margin-bottom: 20px;
|
53 |
+
line-height: 1.5;
|
54 |
}
|
55 |
|
56 |
+
hr, .hr {
|
57 |
display: block;
|
58 |
margin: $global-guttering*1.25 0;
|
59 |
border: 0;
|
60 |
border-bottom: 1px solid #eaeaea;
|
61 |
+
height: 1px;
|
62 |
+
|
63 |
+
&.hr__fancy {
|
64 |
+
background: url("./separator.png") repeat-y;
|
65 |
+
height: 5px;
|
66 |
+
background-size: cover;
|
67 |
+
}
|
68 |
}
|
69 |
|
70 |
h1, h2, h3, h4, h5, h6 {
|
|
|
90 |
font-size: 14px;
|
91 |
-webkit-appearance: none;
|
92 |
appearance: none;
|
93 |
+
outline: none;
|
94 |
margin-bottom: $global-guttering;
|
95 |
}
|
96 |
|
|
|
121 |
ul li, ol li {
|
122 |
list-style-type: none;
|
123 |
line-height: 1.5;
|
124 |
+
margin-bottom: 3px;
|
125 |
}
|
126 |
|
127 |
blockquote {
|
|
|
131 |
border-radius: 10px;
|
132 |
}
|
133 |
|
134 |
+
.top-20 {
|
135 |
+
margin-top: 20px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
}
|
137 |
|
138 |
.zero-bottom {
|
demo/{demo.scss β styles/demo.scss}
RENAMED
@@ -1,5 +1,5 @@
|
|
1 |
-
@import "base";
|
2 |
-
@import "
|
3 |
|
4 |
$container-width: 500px !default;
|
5 |
$logo-font-size: 55px !default;
|
@@ -23,14 +23,12 @@ img.emoji {
|
|
23 |
padding: 10px 30px;
|
24 |
border-radius: 5px;
|
25 |
color: #333333;
|
26 |
-
}
|
27 |
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
border-radius: 3px;
|
32 |
|
33 |
-
|
34 |
color: #FFFFFF;
|
35 |
background-color: #F44336;
|
36 |
padding: 0 18px;
|
@@ -45,6 +43,16 @@ img.emoji {
|
|
45 |
margin: auto;
|
46 |
display: block;
|
47 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
}
|
49 |
|
50 |
section {
|
@@ -67,4 +75,24 @@ section {
|
|
67 |
position: relative;
|
68 |
}
|
69 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
}
|
|
|
1 |
+
@import "./base";
|
2 |
+
@import "../../src/sholo";
|
3 |
|
4 |
$container-width: 500px !default;
|
5 |
$logo-font-size: 55px !default;
|
|
|
23 |
padding: 10px 30px;
|
24 |
border-radius: 5px;
|
25 |
color: #333333;
|
|
|
26 |
|
27 |
+
a, a:visited, a:focus {
|
28 |
+
color: #333333;
|
29 |
+
}
|
|
|
30 |
|
31 |
+
a.btn__dark {
|
32 |
color: #FFFFFF;
|
33 |
background-color: #F44336;
|
34 |
padding: 0 18px;
|
|
|
43 |
margin: auto;
|
44 |
display: block;
|
45 |
}
|
46 |
+
|
47 |
+
a.btn__run-demo {
|
48 |
+
background: #f54336;
|
49 |
+
padding: 5px;
|
50 |
+
border-radius: 20px;
|
51 |
+
color: white;
|
52 |
+
display: block;
|
53 |
+
margin: 15px 0 10px;
|
54 |
+
text-align: center;
|
55 |
+
}
|
56 |
}
|
57 |
|
58 |
section {
|
|
|
75 |
position: relative;
|
76 |
}
|
77 |
}
|
78 |
+
}
|
79 |
+
|
80 |
+
.section__examples {
|
81 |
+
.section__example {
|
82 |
+
margin-bottom: 20px;
|
83 |
+
}
|
84 |
+
|
85 |
+
#creation-input {
|
86 |
+
margin-top: 20px;
|
87 |
+
}
|
88 |
+
|
89 |
+
input {
|
90 |
+
padding: 10px;
|
91 |
+
background-color: #fafbfc;
|
92 |
+
border: 3px solid #e1e4e8;
|
93 |
+
border-radius: 3px;
|
94 |
+
box-shadow: inset 0 0 10px rgba(27,31,35,0.05);
|
95 |
+
margin-bottom: 0;
|
96 |
+
margin-top: 7px;
|
97 |
+
}
|
98 |
}
|
index.html
CHANGED
@@ -7,66 +7,108 @@
|
|
7 |
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
8 |
<title>Sholo</title>
|
9 |
<link rel="stylesheet" href="./dist/demo.css">
|
|
|
10 |
</head>
|
11 |
<body>
|
12 |
<div class="page-wrap">
|
13 |
<section class="section__header" data-sholo="Hey welcome to presenter!">
|
14 |
<h1><span class="emoji">π¨βπ§οΈ</span> Driver</h1>
|
15 |
-
<p class="text-muted">A light-weight, no-dependency, vanilla JavaScript library to drive the user's focus across the
|
16 |
-
|
|
|
17 |
</section>
|
18 |
|
19 |
<blockquote>
|
20 |
<p>A lightweight (~4kb gzipped) yet powerful JavaScript engine that helps you drive the user's focus on page.</p>
|
21 |
-
<p class="zero-bottom">Some sample use-cases can be creating powerful feature introductions, call-to-action
|
|
|
22 |
</blockquote>
|
23 |
|
24 |
<section class="section__purpose">
|
25 |
-
<h3>
|
|
|
|
|
26 |
<ul>
|
27 |
-
<li>Highlight any item on page</li>
|
28 |
-
<li>Block user interactions</li>
|
29 |
-
<li
|
30 |
-
<li
|
31 |
-
<li
|
32 |
-
<li
|
33 |
-
<li>
|
34 |
-
<li
|
|
|
35 |
</ul>
|
36 |
</section>
|
37 |
-
<hr>
|
38 |
<section class="section__how">
|
39 |
<h3>How does it do that?</h3>
|
40 |
-
<p>
|
41 |
-
|
42 |
-
|
43 |
-
ipsa molestias, natus nulla odit optio pariatur perspiciatis, quae quam quasi quibusdam recusandae repellendus
|
44 |
-
reprehenderit tempora!</p>
|
45 |
</section>
|
|
|
46 |
<section class="section__examples">
|
47 |
<h3>Can you show some Examples?</h3>
|
48 |
-
<p>
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
<
|
63 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
</section>
|
67 |
</div>
|
68 |
|
69 |
<script src="//twemoji.maxcdn.com/2/twemoji.min.js?2.5"></script>
|
|
|
70 |
|
71 |
<script src="./dist/sholo.js"></script>
|
72 |
<script src="./dist/demo.js"></script>
|
|
|
7 |
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
8 |
<title>Sholo</title>
|
9 |
<link rel="stylesheet" href="./dist/demo.css">
|
10 |
+
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/monokai.min.css">
|
11 |
</head>
|
12 |
<body>
|
13 |
<div class="page-wrap">
|
14 |
<section class="section__header" data-sholo="Hey welcome to presenter!">
|
15 |
<h1><span class="emoji">π¨βπ§οΈ</span> Driver</h1>
|
16 |
+
<p class="text-muted">A light-weight, no-dependency, vanilla JavaScript library to drive the user's focus across the
|
17 |
+
page</p>
|
18 |
+
<a href="javascript:void(0)" class="btn btn__example btn__dark">Quick Tour</a>
|
19 |
</section>
|
20 |
|
21 |
<blockquote>
|
22 |
<p>A lightweight (~4kb gzipped) yet powerful JavaScript engine that helps you drive the user's focus on page.</p>
|
23 |
+
<p class="zero-bottom">Some sample use-cases can be creating powerful feature introductions, call-to-action
|
24 |
+
components, focus shifters etc.</p>
|
25 |
</blockquote>
|
26 |
|
27 |
<section class="section__purpose">
|
28 |
+
<h3>What are the features?</h3>
|
29 |
+
<p>Driver is compatible with all the major browsers and can be used for any of your overlay needs. Feature
|
30 |
+
introductions, focus shifters, call-to-action are just a few examples.</p>
|
31 |
<ul>
|
32 |
+
<li>π <strong>Highlight</strong> any item on page</li>
|
33 |
+
<li>β <strong>Block user interactions</strong></li>
|
34 |
+
<li>π£ Create <strong>feature introductions</strong></li>
|
35 |
+
<li>π Add <strong>focus shifters</strong> for users</li>
|
36 |
+
<li>π οΈ Highly customizable β <strong>Use it anywhere</strong> for overlay</li>
|
37 |
+
<li>β¨οΈ User Friendly β <strong>Controllable by keys</strong></li>
|
38 |
+
<li id="free-use">π <strong>MIT Licensed</strong> β Free for personal and commercial use</li>
|
39 |
+
<li>ποΈ Lightweight β Only <strong>~4kb</strong> when gzipped</li>
|
40 |
+
<li>π <strong>Consistent behavior</strong> across all major browsers</li>
|
41 |
</ul>
|
42 |
</section>
|
43 |
+
<hr class="hr__fancy">
|
44 |
<section class="section__how">
|
45 |
<h3>How does it do that?</h3>
|
46 |
+
<p>In it simplest, it puts the canvas on top of the whole page and then cuts the part that is over the element to be
|
47 |
+
highlighted and provides you several hooks when highlighting, highlighted or un-highlighting elements making it
|
48 |
+
highly customizable.</p>
|
|
|
|
|
49 |
</section>
|
50 |
+
<hr class="hr__fancy">
|
51 |
<section class="section__examples">
|
52 |
<h3>Can you show some Examples?</h3>
|
53 |
+
<p>Below you find some of the examples and sample use-cases on how you can use it. Run by clicking the
|
54 |
+
<code>RUN</code> button.</p>
|
55 |
+
<div id="single-element-no-popover" class="section__example">
|
56 |
+
<h4>Highlighting a Single Element β Without Popover</h4>
|
57 |
+
<p class="zero-bottom">If all you want is just highlight a single element, you can do that simply by passing the
|
58 |
+
selector</p>
|
59 |
+
<a href="#" class="btn__run-demo" id="run-single-element-no-popover">Run it</a>
|
60 |
+
<pre><code class="javascript">const driver = new Driver();
|
61 |
+
driver.highlight('#create-post');
|
62 |
+
</code></pre>
|
63 |
+
</div>
|
64 |
+
|
65 |
+
<hr class="hr__fancy">
|
66 |
+
|
67 |
+
<div class="section__example">
|
68 |
+
<p>A <strong>real world use-case</strong> for this could be highlighting an element when user is interacting with
|
69 |
+
it</p>
|
70 |
+
<pre><code class="javascript">const focusDriver = new Driver();
|
71 |
+
|
72 |
+
// Highlight the section on focus
|
73 |
+
document.getElementById('creation-input')
|
74 |
+
.addEventListener('focus', (e) => {
|
75 |
+
focusDriver.focus('#creation-input');
|
76 |
+
});
|
77 |
+
</code></pre>
|
78 |
+
<p class="top-20">Focus any of the inputs and see how it moves the highlight from one element to the other</p>
|
79 |
+
<div id="creation-forms">
|
80 |
+
<input type="text" id="creation-input" class="form-control" placeholder="Focus any of the inputs">
|
81 |
+
<input type="text" id="creation-input-2" class="form-control" placeholder="Focus any of the inputs">
|
82 |
+
<input type="text" id="creation-input-3" class="form-control" placeholder="Focus any of the inputs">
|
83 |
+
<input type="text" id="creation-input-4" class="form-control" placeholder="Focus any of the inputs">
|
84 |
+
</div>
|
85 |
+
</div>
|
86 |
+
|
87 |
+
<p>You can also turn off the animation or set the padding around the corner. More on it later.</p>
|
88 |
+
|
89 |
+
<hr class="hr__fancy">
|
90 |
+
|
91 |
+
<div id="single-element-with-popover" class="section__example">
|
92 |
+
<h4>Highlighting a Single Element β With Popover</h4>
|
93 |
+
<p>If you would like to show some details alongside the highlighted element, you can do that easily by specifying
|
94 |
+
title and description</p>
|
95 |
+
<a href="#" class="btn__run-demo" id="run-single-element-with-popover">Run it</a>
|
96 |
+
<pre><code class="javascript">const driver = new Driver();
|
97 |
+
driver.highlight({
|
98 |
+
element: '#some-element',
|
99 |
+
popover: {
|
100 |
+
title: 'Title for the Popover',
|
101 |
+
description: 'Description for it',
|
102 |
+
}
|
103 |
+
});
|
104 |
+
</code></pre>
|
105 |
+
</div>
|
106 |
+
|
107 |
</section>
|
108 |
</div>
|
109 |
|
110 |
<script src="//twemoji.maxcdn.com/2/twemoji.min.js?2.5"></script>
|
111 |
+
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
|
112 |
|
113 |
<script src="./dist/sholo.js"></script>
|
114 |
<script src="./dist/demo.js"></script>
|
webpack.config.dev.js
CHANGED
@@ -6,7 +6,7 @@ module.exports = {
|
|
6 |
mode: 'development',
|
7 |
entry: [
|
8 |
'webpack-dev-server/client?http://localhost:3000',
|
9 |
-
'./demo/demo.scss',
|
10 |
'./src/index.js',
|
11 |
],
|
12 |
output: {
|
@@ -39,7 +39,7 @@ module.exports = {
|
|
39 |
},
|
40 |
{
|
41 |
test: /.scss$/,
|
42 |
-
loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader']),
|
43 |
},
|
44 |
],
|
45 |
},
|
@@ -49,8 +49,9 @@ module.exports = {
|
|
49 |
allChunks: true,
|
50 |
}),
|
51 |
new CopyWebpackPlugin([
|
52 |
-
'./demo/
|
53 |
-
'./demo/
|
|
|
54 |
]),
|
55 |
],
|
56 |
stats: {
|
|
|
6 |
mode: 'development',
|
7 |
entry: [
|
8 |
'webpack-dev-server/client?http://localhost:3000',
|
9 |
+
'./demo/styles/demo.scss',
|
10 |
'./src/index.js',
|
11 |
],
|
12 |
output: {
|
|
|
39 |
},
|
40 |
{
|
41 |
test: /.scss$/,
|
42 |
+
loader: ExtractTextPlugin.extract(['css-loader?url=false', 'sass-loader']),
|
43 |
},
|
44 |
],
|
45 |
},
|
|
|
49 |
allChunks: true,
|
50 |
}),
|
51 |
new CopyWebpackPlugin([
|
52 |
+
'./demo/scripts/emoji.js',
|
53 |
+
'./demo/scripts/demo.js',
|
54 |
+
'./demo/images/separator.png',
|
55 |
]),
|
56 |
],
|
57 |
stats: {
|