tips 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.markdown +307 -0
- data/app/assets/javascripts/tips.js +65 -57
- data/lib/tips/version.rb +1 -1
- metadata +11 -11
- data/README.md +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88eefb61e9358a7277d98c91dab830c502ac3032
|
4
|
+
data.tar.gz: 921e3580b09209f64afd35b78beb38ba3f55488d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8ffee509e78bd2b222e7eaee4faf725feab0936743474ff94361b62c118374b6925f26eb26c9dc2e7b637c26c72cad1f70f25e3cfd3a37350de116dc652a48c
|
7
|
+
data.tar.gz: 8f4a860f9dcb5120c707ba75481896c590c83bb96207968ad933d42e72f91cb5fdd9d8f6a5a800537ddb6e2f65095b2774f82b8835c9b9207ca1bfb035172f8f
|
data/README.markdown
ADDED
@@ -0,0 +1,307 @@
|
|
1
|
+
# Tips (beta)
|
2
|
+
|
3
|
+
Slack inspired onboarding tips.
|
4
|
+
|
5
|
+
Note: Tips is currently in Beta. Left, much work there is. To see a backlog of features and work currently in progress <a href='https://huboard.com/rguerrettaz/tips-rails/' target='_blank'>checkout the HuBoard.</a>
|
6
|
+
|
7
|
+
<a href="http://codepen.io/rguerrettaz/pen/eNNXKB" target='_blank'><img src="http://i.imgur.com/EQuPxuh.gif"></a>
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'tips'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install tips
|
22
|
+
|
23
|
+
## Examples
|
24
|
+
|
25
|
+
* <a href="http://codepen.io/rguerrettaz/pen/LVVVzR" target='_blank'>Single Tip</a>
|
26
|
+
* <a href="http://codepen.io/rguerrettaz/pen/doorJm" target='_blank'>Single Tip, multiple pages of content</a>
|
27
|
+
* <a href="http://codepen.io/rguerrettaz/pen/KppEop" target='_blank'>Multiple Tips</a>
|
28
|
+
* <a href="http://codepen.io/rguerrettaz/pen/eNNXKB" target='_blank'>Multiple Tips, multiple pages of content</a>
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
Tips uses HTML data-attributes to pass the majority of its configuration.
|
33
|
+
|
34
|
+
#### Creating a tip
|
35
|
+
|
36
|
+
Creating a tip is easy. Just add the necessary data-attributes to your target
|
37
|
+
element and call `Tips.init()`. For example, if you want to target a div on your
|
38
|
+
page you'd add the following data-attributes to the div:
|
39
|
+
|
40
|
+
```html
|
41
|
+
<div data-tips-id='my-unique-tip-name'
|
42
|
+
data-tips-content='{"page1Header" : "This is my header",
|
43
|
+
"page1Body" : "This is the body of my tip",
|
44
|
+
}'
|
45
|
+
data-tips-hot-spot-position='top-right'
|
46
|
+
data-tips-card-position='right'
|
47
|
+
data-tips-priority='1'
|
48
|
+
data-tips-pages='1'>
|
49
|
+
</div>
|
50
|
+
```
|
51
|
+
|
52
|
+
Once the data attributes have been added add this line to your javascript
|
53
|
+
```javascript
|
54
|
+
Tips.init()
|
55
|
+
```
|
56
|
+
|
57
|
+
#### Creating multiple tips on a single page
|
58
|
+
|
59
|
+
Use the same data-attributes as a single tip just make sure `data-tips-id` is
|
60
|
+
unique for each tip and set the `data-tips-priority` appropriately.
|
61
|
+
|
62
|
+
```html
|
63
|
+
<div data-tips-id='my-unique-tip-name'
|
64
|
+
data-tips-content='{"page1Header" : "This is my header",
|
65
|
+
"page1Body" : "This is the body of my tip",
|
66
|
+
}'
|
67
|
+
data-tips-hot-spot-position='top-right'
|
68
|
+
data-tips-card-position='right'
|
69
|
+
data-tips-priority='1'
|
70
|
+
data-tips-pages='1'>
|
71
|
+
<button>My 1st Button</button>
|
72
|
+
</div>
|
73
|
+
|
74
|
+
<div data-tips-id='my-unique-tip-name-number-two'
|
75
|
+
data-tips-content='{"page1Header" : "This is my header no. 2",
|
76
|
+
"page1Body" : "This is the body of my tip no. 2",
|
77
|
+
}'
|
78
|
+
data-tips-hot-spot-position='top-right'
|
79
|
+
data-tips-card-position='right'
|
80
|
+
data-tips-priority='2'
|
81
|
+
data-tips-pages='1'>
|
82
|
+
<button>My 2nd Button</button>
|
83
|
+
</div>
|
84
|
+
|
85
|
+
```
|
86
|
+
|
87
|
+
Once the data attributes have been added add this line to your javascript
|
88
|
+
```javascript
|
89
|
+
Tips.init()
|
90
|
+
```
|
91
|
+
|
92
|
+
#### Creating tips with multiple pages of content
|
93
|
+
|
94
|
+
To do this just add the extra pages to `data-tips-content`
|
95
|
+
```html
|
96
|
+
<div data-tips-id='my-unique-tip-name'
|
97
|
+
data-tips-content='{"page1Header" : "This is my header",
|
98
|
+
"page1Body" : "This is the body of my tip",
|
99
|
+
"page2Header" : "A second header?",
|
100
|
+
"page2Body" : "Yes! If you so choose, you can have
|
101
|
+
tips with multiple pages."
|
102
|
+
}'
|
103
|
+
data-tips-hot-spot-position='top-right'
|
104
|
+
data-tips-card-position='right'
|
105
|
+
data-tips-priority='1'
|
106
|
+
data-tips-pages='1'>
|
107
|
+
<button>My 1st Button</button>
|
108
|
+
</div>
|
109
|
+
```
|
110
|
+
|
111
|
+
Once the data attributes have been added add this line to your javascript
|
112
|
+
```javascript
|
113
|
+
Tips.init()
|
114
|
+
```
|
115
|
+
|
116
|
+
## Attributes overview
|
117
|
+
|
118
|
+
#### data-tips-id
|
119
|
+
`data-tips-id` should be unique for each tip you have on your website.
|
120
|
+
These are used as references when we check if a user has previously seen a tip.
|
121
|
+
|
122
|
+
```
|
123
|
+
data-tips-id='some-unique-name-for-this-tip'
|
124
|
+
```
|
125
|
+
|
126
|
+
#### data-tips-content
|
127
|
+
`data-tips-content` is a JSON string representation of the content for your tip.
|
128
|
+
To allow Tips to support multiple pages of content we use keys in the form of
|
129
|
+
`page1Header` and `page1Body`. Pages should be sequential. Shit will fail
|
130
|
+
otherwise.
|
131
|
+
|
132
|
+
```
|
133
|
+
data-tips-content='{"page1Header":"The header for the first page of this tip",
|
134
|
+
"page1Boy":"The body for the first page of this tip",
|
135
|
+
"page2Header":"The header for the second page of this tip",
|
136
|
+
"page2Body":"The body for the second page of this tip"
|
137
|
+
}
|
138
|
+
```
|
139
|
+
|
140
|
+
#### data-tips-hot-spot-position
|
141
|
+
`data-tips-hot-spot-position` controls the position of the throbbing hot spot
|
142
|
+
icon in relation to the element you're targeting.
|
143
|
+
|
144
|
+
|
145
|
+
```html
|
146
|
+
<!-- Default value: 'right' -->
|
147
|
+
data-tips-hot-spot-position='bottom-left'
|
148
|
+
```
|
149
|
+
|
150
|
+
Acceptable values:
|
151
|
+
```
|
152
|
+
top-right
|
153
|
+
top-left
|
154
|
+
top
|
155
|
+
bottom-right
|
156
|
+
bottom-left
|
157
|
+
bottom
|
158
|
+
left
|
159
|
+
right
|
160
|
+
middle
|
161
|
+
```
|
162
|
+
|
163
|
+
#### data-tips-card-position
|
164
|
+
`data-tips-card-position` controls the side your tip modal will show up on.
|
165
|
+
|
166
|
+
```
|
167
|
+
<!-- Default value: 'right' -->
|
168
|
+
data-tips-card-position='left'
|
169
|
+
```
|
170
|
+
|
171
|
+
Acceptable values:
|
172
|
+
```
|
173
|
+
top
|
174
|
+
bottom
|
175
|
+
left
|
176
|
+
right
|
177
|
+
```
|
178
|
+
|
179
|
+
#### data-tips-priority
|
180
|
+
`data-tips-priority` is used when you have multiple tips on a given page.
|
181
|
+
Priority 1 will be shown first.
|
182
|
+
```
|
183
|
+
data-tips-priority='1'
|
184
|
+
```
|
185
|
+
|
186
|
+
#### data-tips-pages
|
187
|
+
`data-tips-pages` tells Tips how many pages you want on a given tip. Required
|
188
|
+
attribute. There is no default set at this point.
|
189
|
+
```
|
190
|
+
data-tips-priority='1'
|
191
|
+
```
|
192
|
+
|
193
|
+
## Storage
|
194
|
+
#### Default Storage (localStorage)
|
195
|
+
By default Tips will use `localStorage` to store which tips have been seen.
|
196
|
+
This works, however, it's sub-optimal. Using `localStorage` means tips may be
|
197
|
+
seen twice. When using localStorage the following scenarios may show tips twice:
|
198
|
+
* User opens pages in incognito mode
|
199
|
+
* User opens pages in multiple browsers
|
200
|
+
* User opens pages from multiple devices
|
201
|
+
|
202
|
+
Because the lack of persistence with `localStorage`, Tips comes with the ability
|
203
|
+
to [define your own](#custom-storage-device) `customStorageDevice`.
|
204
|
+
|
205
|
+
Here's the `defaultStorageDevice`:
|
206
|
+
```javascript
|
207
|
+
var defaultStorageDevice = {
|
208
|
+
optOutKey: 'tips-opted-out',
|
209
|
+
|
210
|
+
addTip: function(tipName){
|
211
|
+
localStorage.setItem(tipName, true);
|
212
|
+
},
|
213
|
+
|
214
|
+
tipHasBeenSeen: function(tipName){
|
215
|
+
return !!localStorage.getItem(tipName);
|
216
|
+
},
|
217
|
+
|
218
|
+
optOut: function(){
|
219
|
+
localStorage.setItem(this.optOutKey, true);
|
220
|
+
},
|
221
|
+
|
222
|
+
userHasOptedOut: function(){
|
223
|
+
return !!localStorage.getItem(this.optOutKey);
|
224
|
+
},
|
225
|
+
|
226
|
+
removeAll: function(tipNames){
|
227
|
+
tipNames.push(this.optOutKey);
|
228
|
+
tipNames.forEach(function(key){
|
229
|
+
localStorage.removeItem(key);
|
230
|
+
});
|
231
|
+
}
|
232
|
+
};
|
233
|
+
```
|
234
|
+
|
235
|
+
#### Custom Storage Device
|
236
|
+
You can define your own custom storage device and pass it in as an argument when
|
237
|
+
you initialize with `Tips.init(myCustomStorageDevice)`. Example using `jQuery`:
|
238
|
+
```javascript
|
239
|
+
(function initTipsWithCustomStorage() {
|
240
|
+
|
241
|
+
// Make an ajax call for a list of seen tips and if the user has opted out
|
242
|
+
// On success, init tips with out customStorageDevice
|
243
|
+
(function(){
|
244
|
+
$.ajax('/tips/data', {
|
245
|
+
method: 'GET'
|
246
|
+
})
|
247
|
+
.success(function(data){
|
248
|
+
var userHasOptedOut = data.optedOut;
|
249
|
+
var seenTips = data.seenTips;
|
250
|
+
var storageDevice = {
|
251
|
+
seenTips: seenTips,
|
252
|
+
|
253
|
+
addTip: function(tipName){
|
254
|
+
$.ajax('/tips/tip_seen', {
|
255
|
+
method: 'POST',
|
256
|
+
data: {name: tipName}
|
257
|
+
});
|
258
|
+
|
259
|
+
// Add tip to list of seenTips so it doesn't show again in the same
|
260
|
+
// window session
|
261
|
+
seenTips.push(tipName);
|
262
|
+
},
|
263
|
+
|
264
|
+
tipHasBeenSeen: function(tipName){
|
265
|
+
return seenTips.indexOf(tipName) != -1;
|
266
|
+
},
|
267
|
+
|
268
|
+
optOut: function(){
|
269
|
+
$.ajax('/tips/opted_out', {
|
270
|
+
method: 'POST',
|
271
|
+
data: {name: 'opt-out'}
|
272
|
+
})
|
273
|
+
},
|
274
|
+
|
275
|
+
userHasOptedOut: function(){
|
276
|
+
return !!userHasOptedOut;
|
277
|
+
},
|
278
|
+
};
|
279
|
+
|
280
|
+
// Begin the magic
|
281
|
+
Tips.init(storageDevice);
|
282
|
+
})
|
283
|
+
.fail(function(jqXHR, textStatus){
|
284
|
+
console.log('Failure? Yes, failure with status: ' + textStatus)
|
285
|
+
});
|
286
|
+
})();
|
287
|
+
})();
|
288
|
+
|
289
|
+
```
|
290
|
+
|
291
|
+
Important things to note here
|
292
|
+
* You're passing an object with public methods, not a function
|
293
|
+
* You must have the following methods defined
|
294
|
+
```javascript
|
295
|
+
storageDevice.addTip()
|
296
|
+
storageDevice.tipHasBeenSeen()
|
297
|
+
storageDevice.optOut()
|
298
|
+
storageDevice.userHasOptedOut()
|
299
|
+
```
|
300
|
+
|
301
|
+
## Contributing
|
302
|
+
|
303
|
+
1. Fork it ( http://github.com/<my-github-username>/tips/fork )
|
304
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
305
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
306
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
307
|
+
5. Create new Pull Request
|
@@ -1,6 +1,13 @@
|
|
1
1
|
;(function setup(window){
|
2
2
|
|
3
3
|
function initTips(){
|
4
|
+
|
5
|
+
//
|
6
|
+
//
|
7
|
+
// Validation
|
8
|
+
// TODO: add validation to tip data-attributes config
|
9
|
+
//
|
10
|
+
//
|
4
11
|
function Validation(config, settableAttrs, acceptableValues) {
|
5
12
|
|
6
13
|
function logInvalidKeyError(key){
|
@@ -25,42 +32,19 @@
|
|
25
32
|
})
|
26
33
|
}
|
27
34
|
|
28
|
-
|
29
|
-
|
30
|
-
// STORAGE DEVICE
|
31
|
-
//
|
32
|
-
//
|
33
|
-
var tipsCustomStorageDevice;
|
34
|
-
var storageDevice;
|
35
|
-
var defaultStorageDevice = {
|
36
|
-
optOutKey: 'tips-opted-out',
|
37
|
-
|
38
|
-
addTip: function(tipName){
|
39
|
-
localStorage.setItem(tipName, true);
|
40
|
-
},
|
41
|
-
|
42
|
-
tipHasBeenSeen: function(tipName){
|
43
|
-
return !!localStorage.getItem(tipName);
|
44
|
-
},
|
45
|
-
|
46
|
-
optOut: function(){
|
47
|
-
localStorage.setItem(this.optOutKey, true);
|
48
|
-
},
|
49
|
-
|
50
|
-
userHasOptedOut: function(){
|
51
|
-
return !!localStorage.getItem(this.optOutKey);
|
52
|
-
},
|
35
|
+
function createTips(){
|
36
|
+
var tipNodes = document.querySelectorAll('[data-tips-id]');
|
53
37
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
localStorage.removeItem(key)
|
58
|
-
})
|
38
|
+
for(i = 0; i < tipNodes.length; ++i) {
|
39
|
+
var tip = new Tip(tipNodes[i])
|
40
|
+
Tips.list.push(tip)
|
59
41
|
}
|
60
42
|
};
|
61
43
|
|
62
|
-
|
63
|
-
|
44
|
+
// Sort list to make TipCard showing easier
|
45
|
+
function sortTipsList(list){
|
46
|
+
Tips.list.sort(function(a,b) {return a.priority - b.priority})
|
47
|
+
}
|
64
48
|
|
65
49
|
//
|
66
50
|
//
|
@@ -68,11 +52,52 @@
|
|
68
52
|
//
|
69
53
|
//
|
70
54
|
var Tips = {
|
55
|
+
init: function(customStorageDevice){
|
56
|
+
|
57
|
+
// Allow user to define their own storageDevice
|
58
|
+
if(customStorageDevice != undefined) {
|
59
|
+
this.storageDevice = customStorageDevice;
|
60
|
+
}
|
61
|
+
|
62
|
+
createTips();
|
63
|
+
sortTipsList();
|
64
|
+
this.showNextTip();
|
65
|
+
},
|
66
|
+
|
71
67
|
list: [],
|
72
68
|
|
73
|
-
|
69
|
+
storageDevice: {
|
70
|
+
optOutKey: 'tips-opted-out',
|
71
|
+
|
72
|
+
addTip: function(tipName){
|
73
|
+
localStorage.setItem(tipName, true);
|
74
|
+
},
|
75
|
+
|
76
|
+
tipHasBeenSeen: function(tipName){
|
77
|
+
console.log(" I GET CALLED BEFORE I GET OVERWRITTEN")
|
78
|
+
console.log(tipName)
|
79
|
+
return !!localStorage.getItem(tipName);
|
80
|
+
},
|
81
|
+
|
82
|
+
optOut: function(){
|
83
|
+
localStorage.setItem(this.optOutKey, true);
|
84
|
+
},
|
74
85
|
|
75
|
-
|
86
|
+
userHasOptedOut: function(){
|
87
|
+
return !!localStorage.getItem(this.optOutKey);
|
88
|
+
},
|
89
|
+
|
90
|
+
removeAll: function(tipNames){
|
91
|
+
tipNames.push(this.optOutKey)
|
92
|
+
tipNames.forEach(function(key){
|
93
|
+
localStorage.removeItem(key)
|
94
|
+
})
|
95
|
+
}
|
96
|
+
},
|
97
|
+
|
98
|
+
userOptedOut: function(){ return this.storageDevice.userHasOptedOut() },
|
99
|
+
|
100
|
+
reset: function(){ this.storageDevice.removeAll(this.tipNames()) },
|
76
101
|
|
77
102
|
tipNames: function(){
|
78
103
|
var names = [];
|
@@ -102,7 +127,7 @@
|
|
102
127
|
//
|
103
128
|
//
|
104
129
|
function Tip(el) {
|
105
|
-
this.name = 'tips:' + el.getAttribute('data-tips-
|
130
|
+
this.name = 'tips:' + el.getAttribute('data-tips-id');
|
106
131
|
this.priority = el.getAttribute('data-tips-priority') || 1;
|
107
132
|
this.pages = el.getAttribute('data-tips-pages') || 1;
|
108
133
|
this.tipNode = el;
|
@@ -116,7 +141,7 @@
|
|
116
141
|
|
117
142
|
Tip.prototype.hasBeenSeen = function() {
|
118
143
|
//Look in storage device for tip seen
|
119
|
-
return !!storageDevice.tipHasBeenSeen(this.name)
|
144
|
+
return !!Tips.storageDevice.tipHasBeenSeen(this.name)
|
120
145
|
}
|
121
146
|
|
122
147
|
//
|
@@ -217,7 +242,7 @@
|
|
217
242
|
}
|
218
243
|
|
219
244
|
function storeThatTipHasBeenSeen(){
|
220
|
-
storageDevice.addTip(hotSpot.tipName);
|
245
|
+
Tips.storageDevice.addTip(hotSpot.tipName);
|
221
246
|
}
|
222
247
|
|
223
248
|
function showTipCard(){
|
@@ -248,7 +273,8 @@
|
|
248
273
|
// Highlight the tip node
|
249
274
|
// For z-index to work the tipNode must have a positon in the following:
|
250
275
|
// ['absolute', 'relative', 'fixed']
|
251
|
-
|
276
|
+
// TODO: only hightlight the element if user sets it in config
|
277
|
+
// this.tipNode.style.zIndex = 9999;
|
252
278
|
};
|
253
279
|
|
254
280
|
tipCard.hide = function(){
|
@@ -459,7 +485,7 @@
|
|
459
485
|
function addOptOutListener(optOutLink) {
|
460
486
|
optOutLink.addEventListener('click', function(e){
|
461
487
|
e.preventDefault();
|
462
|
-
storageDevice.optOut();
|
488
|
+
Tips.storageDevice.optOut();
|
463
489
|
tipCard.hide();
|
464
490
|
})
|
465
491
|
};
|
@@ -553,24 +579,6 @@
|
|
553
579
|
return this.charAt(0).toUpperCase() + this.slice(1);
|
554
580
|
}
|
555
581
|
|
556
|
-
function createTips(){
|
557
|
-
var tipNodes = document.querySelectorAll('[data-tips-single-item]');
|
558
|
-
|
559
|
-
for(i = 0; i < tipNodes.length; ++i) {
|
560
|
-
var tip = new Tip(tipNodes[i])
|
561
|
-
Tips.list.push(tip)
|
562
|
-
}
|
563
|
-
};
|
564
|
-
|
565
|
-
// Sort list to make TipCard showing easier
|
566
|
-
function sortTipsList(list){
|
567
|
-
Tips.list.sort(function(a,b) {return a.priority - b.priority})
|
568
|
-
}
|
569
|
-
|
570
|
-
createTips();
|
571
|
-
sortTipsList();
|
572
|
-
Tips.showNextTip();
|
573
|
-
|
574
582
|
return Tips;
|
575
583
|
}
|
576
584
|
|
data/lib/tips/version.rb
CHANGED
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tips
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Guerrettaz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: ''
|
@@ -45,10 +45,10 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- .gitignore
|
48
|
+
- ".gitignore"
|
49
49
|
- Gemfile
|
50
50
|
- LICENSE.txt
|
51
|
-
- README.
|
51
|
+
- README.markdown
|
52
52
|
- Rakefile
|
53
53
|
- app/assets/images/tip_throbber.png
|
54
54
|
- app/assets/javascripts/tips.js
|
@@ -67,17 +67,17 @@ require_paths:
|
|
67
67
|
- lib
|
68
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
69
69
|
requirements:
|
70
|
-
- -
|
70
|
+
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '0'
|
73
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- -
|
75
|
+
- - ">="
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
requirements: []
|
79
79
|
rubyforge_project:
|
80
|
-
rubygems_version: 2.
|
80
|
+
rubygems_version: 2.2.3
|
81
81
|
signing_key:
|
82
82
|
specification_version: 4
|
83
83
|
summary: Slack inspired onboarding tips
|
data/README.md
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# Tips
|
2
|
-
|
3
|
-
TODO: Write a gem description
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
gem 'tips'
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install tips
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
22
|
-
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork it ( http://github.com/<my-github-username>/tips/fork )
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|