ratchet_design 0.1.0

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.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +41 -0
  4. data/app/assets/images/ratchet/favicon.ico +0 -0
  5. data/app/assets/javascripts/ratchet/_svg.js +55 -0
  6. data/app/assets/javascripts/ratchet/base/form.js +220 -0
  7. data/app/assets/javascripts/ratchet/base/mobilemenu.js +62 -0
  8. data/app/assets/javascripts/ratchet/base/validation.js +230 -0
  9. data/app/assets/javascripts/ratchet/core.js +92 -0
  10. data/app/assets/javascripts/ratchet/enhancement/_collapse.js +96 -0
  11. data/app/assets/javascripts/ratchet/enhancement/_lightbox.js +93 -0
  12. data/app/assets/javascripts/ratchet/enhancement/_swap.js +120 -0
  13. data/app/assets/javascripts/ratchet/enhancement/_switcheroo.js +28 -0
  14. data/app/assets/javascripts/ratchet/enhancement/_textcounter.js +92 -0
  15. data/app/assets/javascripts/ratchet/enhancement/loader.js +77 -0
  16. data/app/assets/javascripts/ratchet/enhancement/notice.js +70 -0
  17. data/app/assets/javascripts/ratchet/enhancement/sticky.js +128 -0
  18. data/app/assets/javascripts/ratchet/enhancement/waypoints.js +328 -0
  19. data/app/assets/javascripts/ratchet/shim/classlist.js +234 -0
  20. data/app/assets/javascripts/ratchet/shim/object.assign.js +30 -0
  21. data/app/assets/javascripts/ratchet/utility/compile_data.js +32 -0
  22. data/app/assets/javascripts/ratchet/utility/from_top.js +14 -0
  23. data/app/assets/javascripts/ratchet/utility/full_stop.js +55 -0
  24. data/app/assets/javascripts/ratchet/utility/get_closest.js +20 -0
  25. data/app/assets/javascripts/ratchet/utility/get_next.js +17 -0
  26. data/app/assets/javascripts/ratchet/utility/load_font.js +72 -0
  27. data/app/assets/javascripts/ratchet/utility/load_script.js +34 -0
  28. data/app/assets/javascripts/ratchet/utility/matches.js +15 -0
  29. data/app/assets/javascripts/ratchet/utility/scroll_to.js +74 -0
  30. data/app/assets/javascripts/ratchet/utility/throttle.js +25 -0
  31. data/app/assets/javascripts/ratchet/utility/timeout.js +45 -0
  32. data/app/assets/javascripts/ratchet/utility/unhover.js +56 -0
  33. data/app/assets/javascripts/ratchet/utility/word_count.js +15 -0
  34. data/app/assets/stylesheets/ratchet/_core.scss +20 -0
  35. data/app/assets/stylesheets/ratchet/base/_button.scss +101 -0
  36. data/app/assets/stylesheets/ratchet/base/_document.scss +306 -0
  37. data/app/assets/stylesheets/ratchet/base/_form.scss +614 -0
  38. data/app/assets/stylesheets/ratchet/base/_list.scss +114 -0
  39. data/app/assets/stylesheets/ratchet/base/_media.scss +41 -0
  40. data/app/assets/stylesheets/ratchet/base/_table.scss +81 -0
  41. data/app/assets/stylesheets/ratchet/base/_text.scss +411 -0
  42. data/app/assets/stylesheets/ratchet/enhancement/_contrast-section.scss +22 -0
  43. data/app/assets/stylesheets/ratchet/enhancement/_feature.scss +49 -0
  44. data/app/assets/stylesheets/ratchet/enhancement/_hero.scss +44 -0
  45. data/app/assets/stylesheets/ratchet/enhancement/_loader.scss +109 -0
  46. data/app/assets/stylesheets/ratchet/enhancement/_notice.scss +74 -0
  47. data/app/assets/stylesheets/ratchet/enhancement/_signup.scss +206 -0
  48. data/app/assets/stylesheets/ratchet/enhancement/_sticky-sidebar.scss +36 -0
  49. data/app/assets/stylesheets/ratchet/fonts-woff.css +55 -0
  50. data/app/assets/stylesheets/ratchet/fonts-woff2.css +55 -0
  51. data/app/assets/stylesheets/ratchet/utility/_global.scss +255 -0
  52. data/app/assets/stylesheets/ratchet/utility/_grid.scss +102 -0
  53. data/app/assets/svgs/ratchet/facebook.svg +1 -0
  54. data/app/assets/svgs/ratchet/github.svg +1 -0
  55. data/app/assets/svgs/ratchet/google-plus.svg +1 -0
  56. data/app/assets/svgs/ratchet/ibm.svg +1 -0
  57. data/app/assets/svgs/ratchet/inbox.svg +1 -0
  58. data/app/assets/svgs/ratchet/linkedin.svg +1 -0
  59. data/app/assets/svgs/ratchet/ratchet.svg +1 -0
  60. data/app/assets/svgs/ratchet/search.svg +1 -0
  61. data/app/assets/svgs/ratchet/subscribe.svg +1 -0
  62. data/app/assets/svgs/ratchet/twitter.svg +1 -0
  63. data/app/assets/svgs/ratchet/y-combinator.svg +1 -0
  64. data/app/helpers/ratchet/application_helper.rb +51 -0
  65. data/app/views/layouts/ratchet/default.html.slim +61 -0
  66. data/app/views/shared/ratchet/_footer.html.slim +2 -0
  67. data/app/views/shared/ratchet/_header.html.slim +17 -0
  68. data/app/views/shared/ratchet/_icons.html.slim +89 -0
  69. data/lib/ratchet_design.rb +12 -0
  70. data/lib/ratchet_design/version.rb +3 -0
  71. data/public/assets/ratchet/core-0.1.0.js +103 -0
  72. data/public/assets/ratchet/core-0.1.0.js.gz +0 -0
  73. data/public/assets/ratchet/core-0.1.0.map.json +1 -0
  74. data/public/assets/ratchet/fonts-woff-0.1.0.css +55 -0
  75. data/public/assets/ratchet/fonts-woff-0.1.0.css.gz +0 -0
  76. data/public/assets/ratchet/fonts-woff2-0.1.0.css +55 -0
  77. data/public/assets/ratchet/fonts-woff2-0.1.0.css.gz +0 -0
  78. metadata +177 -0
@@ -0,0 +1,614 @@
1
+ /* ========================================================================== *
2
+ * e. Form module
3
+ * -------------------------------------------------------------------------- */
4
+
5
+ /* ===================================== *
6
+ * i. Utility
7
+ * ------------------------------------- */
8
+
9
+ // Nested labels
10
+ @mixin nested-label($size: normal) {
11
+
12
+ // Scoped variables
13
+ $font-size: if($size == large, 17px, 16px);
14
+ $margin: if($size == large, 19px, 25px);
15
+ $padding-y: if($size == large, 12px, 9px);
16
+ $padding-x: if($size == large, 14px, 12px);
17
+ $distance: if($size == large, -24px, -22px);
18
+ $scale: if($size == large, .824, .875);
19
+
20
+ // Active state
21
+ %active {
22
+ z-index: 2;
23
+ transform: translate3d(0, $distance, 0) scale($scale);
24
+ }
25
+
26
+ // Hide input placeholder text
27
+ ::placeholder {
28
+ opacity: 0;
29
+ color: transparent;
30
+ }
31
+
32
+ // Input labels
33
+ label {
34
+ display: flex;
35
+ width: 100%;
36
+ padding: 0;
37
+ background: $white;
38
+ font-size: $font-size;
39
+ margin-bottom: $margin;
40
+ }
41
+
42
+ // Default active color
43
+ :not(.valid):not(.invalid) > {
44
+ input,
45
+ textarea {
46
+ &:focus + span,
47
+ &:active + span {
48
+ color: darken($aluminum, 10);
49
+ }
50
+ }
51
+ }
52
+
53
+ // Validated label
54
+ .valid > {
55
+ input,
56
+ textarea {
57
+
58
+ // Active state
59
+ + span {
60
+ @extend %active;
61
+ }
62
+
63
+ // Non-required active color
64
+ &:not(:required):focus + span,
65
+ &:not(:required):active + span {
66
+ color: darken($aluminum, 10);
67
+ }
68
+
69
+ // Required active color
70
+ &:required + span {
71
+ color: $lima;
72
+ }
73
+ }
74
+ }
75
+
76
+ // Invalidated label
77
+ .invalid > {
78
+ input,
79
+ textarea {
80
+
81
+ // Active state
82
+ + span {
83
+ @extend %active;
84
+ }
85
+
86
+ // Non-required active color
87
+ &:not(:required):focus + span,
88
+ &:not(:required):active + span {
89
+ color: darken($aluminum, 10);
90
+ }
91
+
92
+ // Required active color
93
+ &:required + span {
94
+ color: $punch;
95
+ }
96
+ }
97
+ }
98
+
99
+ // Select-specific styles
100
+ select {
101
+ font-size: $font-size;
102
+ line-height: inherit;
103
+ padding: $padding-y $padding-x;
104
+ }
105
+
106
+ // Inputs
107
+ input,
108
+ select,
109
+ textarea {
110
+ z-index: 1;
111
+ margin: 0;
112
+ font-size: $font-size;
113
+ line-height: inherit;
114
+ background: transparent;
115
+ padding: $padding-y $padding-x;
116
+
117
+ // Faux-placeholder labels
118
+ & + span {
119
+ background: $white;
120
+ box-shadow:
121
+ -6px 0 $white,
122
+ 6px 0 $white;
123
+ font-size: inherit;
124
+ height: vr(2); // 30px
125
+ position: absolute;
126
+ top: $padding-y;
127
+ left: $padding-x;
128
+ padding: 1px 0 0 1px;
129
+ transform-origin: left top 0;
130
+ will-change: transform;
131
+ -webkit-filter: blur(0);
132
+ backface-visibility: hidden;
133
+ -webkit-font-smoothing: subpixel-antialiased;
134
+ z-index: 0;
135
+ color: $alto;
136
+ transform: perspective(1px) translate3d(0, 0, 0) scale(1);
137
+ transition:
138
+ z-index .2s,
139
+ color .2s,
140
+ transform .2s;
141
+ }
142
+
143
+ // Move labels out of the way on focus
144
+ &:focus + span,
145
+ &:active + span {
146
+ @extend %active;
147
+ }
148
+ }
149
+ }
150
+
151
+ %success-btn {
152
+ @include button($color: $lima);
153
+ }
154
+
155
+ /* ===================================== *
156
+ * ii. Common
157
+ * ------------------------------------- */
158
+
159
+ // Remove default fieldset styles
160
+ fieldset {
161
+ border: 0;
162
+ padding: 0;
163
+ margin-left: 0;
164
+ margin-right: 0;
165
+ }
166
+
167
+ // Fieldset legends
168
+ legend {
169
+ font-size: 14px;
170
+ text-transform: uppercase;
171
+ letter-spacing: .02em;
172
+ font-weight: 700;
173
+ padding-top: 11px;
174
+ box-shadow: 0 1px $iron;
175
+ width: 100%;
176
+ margin-bottom: 19px;
177
+ }
178
+
179
+ // Placeholder text color
180
+ ::placeholder {
181
+ opacity: 1;
182
+ color: $alto;
183
+ }
184
+
185
+ // Remove FF’s default input outline
186
+ input::-moz-focus-inner {
187
+ border: 0;
188
+ }
189
+
190
+ // Labels
191
+ label {
192
+ display: flex;
193
+ flex-direction: column;
194
+ position: relative;
195
+ font-size: 15px;
196
+ padding-top: 10px;
197
+ margin-bottom: 10px;
198
+
199
+ // Checkbox- & radio-specific labels
200
+ &.tick-label {
201
+ flex-direction: row;
202
+ align-items: center;
203
+ margin-bottom: 5px;
204
+ }
205
+
206
+ // Bare text-based inputs
207
+ + input,
208
+ + select,
209
+ + textarea {
210
+ margin-top: -5px;
211
+ }
212
+
213
+ // Nested text-based inputs
214
+ > input,
215
+ > select,
216
+ > textarea {
217
+ margin-top: 5px;
218
+ }
219
+
220
+ // Nested range inputs
221
+ > input[type=range] {
222
+ margin-top: 12px;
223
+ margin-bottom: 5px;
224
+ }
225
+ }
226
+
227
+ /* ===================================== *
228
+ * iii. Text-based
229
+ * ------------------------------------- */
230
+
231
+ // Inputs
232
+ input,
233
+ select,
234
+ textarea {
235
+ width: 100%;
236
+ font-size: 16px;
237
+ line-height: vr(2); // 30px
238
+ padding: 9px 12px;
239
+ border: 1px solid $alto;
240
+ border-radius: $radius;
241
+ transition: border-color .2s;
242
+ appearance: none;
243
+
244
+ // Keep Chrome’s autofilled fields white
245
+ &:-webkit-autofill {
246
+ -webkit-box-shadow: 0 0 0 1000px $white inset;
247
+ }
248
+
249
+ &:hover,
250
+ &:focus,
251
+ &:active {
252
+ outline: 0;
253
+ border-color: $aluminum;
254
+ }
255
+ }
256
+
257
+ // Bare inputs
258
+ :not(label) > {
259
+ input,
260
+ select,
261
+ textarea {
262
+ margin-bottom: 10px;
263
+ }
264
+ }
265
+
266
+ // Override default search styling
267
+ input[type=search] {
268
+ &,
269
+ &::-webkit-search-decoration,
270
+ &::-webkit-search-cancel-button {
271
+ -webkit-appearance: none;
272
+ }
273
+ }
274
+
275
+ // Confine resizing of textareas
276
+ textarea {
277
+ display: block;
278
+ resize: vertical;
279
+ max-height: vr(20) + 5px; // 305px
280
+ min-height: vr(8) + 5px; // 125px;
281
+ }
282
+
283
+ /* ===================================== *
284
+ * iv. Select
285
+ * ------------------------------------- */
286
+
287
+ // Select inputs
288
+ select {
289
+ height: 50px;
290
+ cursor: pointer;
291
+ background: $white url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 7 14'%3E%3Cpolygon fill='%237A7B7C' points='3.5,0 0,6 7,6'/%3E%3Cpolygon fill='%237A7B7C' points='3.5,14 0,8 7,8'/%3E%3C/svg%3E") calc(100% - 14px) 50% / 7px 14px no-repeat;
292
+ }
293
+
294
+ /* ===================================== *
295
+ * v. Radio button & checkbox
296
+ * ------------------------------------- */
297
+
298
+ // Radios & checkboxes
299
+ input[type=radio],
300
+ input[type=checkbox] {
301
+ display: none;
302
+
303
+ + span {
304
+ width: 20px;
305
+ height: 20px;
306
+ margin: 0 8px 0 0;
307
+ cursor: pointer;
308
+ background: $white;
309
+ transition: .2s box-shadow;
310
+ box-shadow: 0 0 0 1px $alto inset;
311
+
312
+ &:hover,
313
+ &:focus,
314
+ &:active {
315
+ outline: 0;
316
+ box-shadow: 0 0 0 1px $aluminum inset;
317
+ }
318
+ }
319
+ }
320
+
321
+ // Radios
322
+ input[type=radio] {
323
+
324
+ + span {
325
+ border-radius: 50%;
326
+ }
327
+
328
+ &:checked + span {
329
+ box-shadow: 0 0 0 8px $cerulean inset;
330
+ }
331
+ }
332
+
333
+ // Checkboxes
334
+ input[type=checkbox] {
335
+
336
+ + span {
337
+ border-radius: $radius;
338
+ position: relative;
339
+
340
+ &:before {
341
+ content: '';
342
+ position: absolute;
343
+ left: 0;
344
+ top: 0;
345
+ width: 100%;
346
+ height: 60%;
347
+ margin: 15% 0 0 0;
348
+ border: solid $white;
349
+ border-width: 0 0 3px 3px;
350
+ transition: transform .2s;
351
+ transform: scale(0) rotate(-45deg);
352
+ }
353
+ }
354
+
355
+ &:checked + span {
356
+ box-shadow: 0 0 0 10px $cerulean inset;
357
+ }
358
+
359
+ &:checked + span:before {
360
+ transform: scale(.5) rotate(-45deg);
361
+ }
362
+ }
363
+
364
+ /* ===================================== *
365
+ * vi. Range slider
366
+ * ------------------------------------- */
367
+
368
+ // Range sliders
369
+ input[type=range] {
370
+ background-color: $alto;
371
+ width: 100%;
372
+ height: 8px;
373
+ border-radius: 4px;
374
+ outline: 0;
375
+ border: 0;
376
+ padding: 0;
377
+ display: flex;
378
+ position: relative;
379
+ -webkit-appearance: none;
380
+ cursor: pointer;
381
+
382
+ // Firefox track
383
+ &::-moz-range-track {
384
+ -moz-appearance: none;
385
+ opacity: 0;
386
+ }
387
+
388
+ // Remove default Firefox focus styles
389
+ &::-moz-focus-outer {
390
+ border: 0;
391
+ }
392
+
393
+ // Webkit thumb
394
+ &::-webkit-slider-thumb {
395
+ border: 0;
396
+ width: 22px;
397
+ height: 22px;
398
+ border-radius: 50%;
399
+ background: $white;
400
+ -webkit-appearance: none;
401
+ background: rgba($aluminum, .25);
402
+ border: 1px solid rgba($aluminum, .25);
403
+ box-shadow:
404
+ 0 0 0 8px $white inset,
405
+ 0 0 0 10px $aluminum inset;
406
+ transition:
407
+ border .2s,
408
+ box-shadow .2s;
409
+ }
410
+
411
+ &:hover::-webkit-slider-thumb {
412
+ border: 1px solid $aluminum;
413
+ }
414
+
415
+ &:focus::-webkit-slider-thumb,
416
+ &:active::-webkit-slider-thumb {
417
+ border: 1px solid $cerulean;
418
+ box-shadow:
419
+ 0 0 0 8px $white inset,
420
+ 0 0 0 10px $cerulean inset;
421
+ }
422
+
423
+ // Firefox thumb
424
+ &::-moz-range-thumb {
425
+ border: 0;
426
+ width: 22px;
427
+ height: 22px;
428
+ cursor: pointer;
429
+ border-radius: 50%;
430
+ -moz-appearance: none;
431
+ box-sizing: border-box;
432
+ background: rgba($aluminum, .25);
433
+ border: 1px solid rgba($aluminum, .25);
434
+ box-shadow:
435
+ 0 0 0 8px $white inset,
436
+ 0 0 0 10px $aluminum inset;
437
+ transition:
438
+ border .2s,
439
+ box-shadow .2s;
440
+ }
441
+
442
+ &:hover::-moz-range-thumb {
443
+ border: 1px solid $aluminum;
444
+ }
445
+
446
+ &:focus::-moz-range-thumb,
447
+ &:active::-moz-range-thumb {
448
+ border: 1px solid $cerulean;
449
+ box-shadow:
450
+ 0 0 0 8px $white inset,
451
+ 0 0 0 10px $cerulean inset;
452
+ }
453
+ }
454
+
455
+ /* ===================================== *
456
+ * vii. Other HTML5
457
+ * ------------------------------------- */
458
+
459
+ // Color inputs
460
+ input[type=color] {
461
+ appearance: none;
462
+ width: 50px;
463
+ height: 50px;
464
+ padding: 5px 3px;
465
+ background: $white;
466
+ border: 1px solid $alto;
467
+ border-radius: $radius;
468
+ cursor: crosshair;
469
+
470
+ &:hover,
471
+ &:focus,
472
+ &:active {
473
+ border-color: $aluminum;
474
+ }
475
+
476
+ &::-webkit-color-swatch-wrapper {
477
+ background: $white;
478
+ padding: 0 2px;
479
+ }
480
+ }
481
+
482
+ input[type=date],
483
+ input[type=month],
484
+ input[type=week],
485
+ input[type=datetime],
486
+ input[type=datetime-local] {
487
+ height: 50px;
488
+ }
489
+
490
+ /* ===================================== *
491
+ * viii. Button
492
+ * ------------------------------------- */
493
+
494
+ // Form buttons
495
+ input[type=button],
496
+ button[type=button] {
497
+ @include button;
498
+ }
499
+
500
+ // Form submit buttons
501
+ input[type=submit],
502
+ button[type=submit] {
503
+ @extend %success-btn;
504
+ }
505
+
506
+ /* ===================================== *
507
+ * ix. Validation
508
+ * ------------------------------------- */
509
+
510
+ // Apply validation styles to inputs & textareas
511
+ textarea,
512
+ input[type=url],
513
+ input[type=tel],
514
+ input[type=text],
515
+ input[type=email],
516
+ input[type=number],
517
+ input[type=password] {
518
+
519
+ // Strip default styling
520
+ &:invalid {
521
+ outline: 0;
522
+ box-shadow: none;
523
+ }
524
+
525
+ // Apply valid state color to required fields & adjacent labels
526
+ &.valid:required,
527
+ .valid &:required {
528
+ color: $lima;
529
+ }
530
+
531
+ // Apply valid state to required fields
532
+ &.valid:required,
533
+ .valid &:required {
534
+ border-color: $lima;
535
+ }
536
+
537
+ // Apply invalid state color to required fields & adjacent labels
538
+ &.invalid:required,
539
+ .invalid &:required {
540
+ color: $punch;
541
+ }
542
+
543
+ // Apply invalid state to required fields
544
+ &.invalid:required,
545
+ .invalid &:required {
546
+ border-color: $punch;
547
+ }
548
+
549
+ // Apply valid state to Chrome’s autofilled fields
550
+ &.valid:required:-webkit-autofill,
551
+ .valid &:required:-webkit-autofill {
552
+ -webkit-text-fill-color: $lima;
553
+ }
554
+
555
+ // Apply invalid state to Chrome’s autofilled fields
556
+ &.invalid:required::-webkit-autofill,
557
+ .invalid &:required::-webkit-autofill {
558
+ -webkit-text-fill-color: $punch;
559
+ }
560
+ }
561
+
562
+ // Validation message animation declaration
563
+ @keyframes scale-fade-in {
564
+ 0% {
565
+ opacity: 0;
566
+ transform: translate(-50%, -6px) scale(.5);
567
+ }
568
+
569
+ 100% {
570
+ opacity: 1;
571
+ transform: translate(-50%, 6px) scale(1);
572
+ }
573
+ }
574
+
575
+ // Inline validation messages
576
+ .validation-message {
577
+ position: absolute;
578
+ left: 50%;
579
+ top: 100%;
580
+ width: 325px;
581
+ max-width: 100vw;
582
+ z-index: 3;
583
+ text-align: center;
584
+ transform: translate(-50%, 6px) scale(1);
585
+ transform-origin: center top;
586
+ animation: scale-fade-in .2s ease-out;
587
+
588
+ // Message bubble (also a hack to maintain proper word wrap)
589
+ p {
590
+ display: inline-block;
591
+ margin: 0;
592
+ padding: 12px 18px;
593
+ border-radius: $radius;
594
+ background: $punch;
595
+ color: $white;
596
+ font-size: 14px;
597
+ line-height: 21px;
598
+
599
+
600
+ // Message bubble triangle
601
+ &:before {
602
+ content: '';
603
+ position: absolute;
604
+ left: 50%;
605
+ margin-left: -6px;
606
+ bottom: 100%;
607
+ width: 0;
608
+ height: 0;
609
+ border-style: solid;
610
+ border-width: 0 6px 6px 6px;
611
+ border-color: transparent transparent $punch transparent;
612
+ }
613
+ }
614
+ }