ratchet_design 0.1.5 → 0.1.6

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/ratchet/favicon.ico +0 -0
  3. data/app/assets/javascripts/ratchet/base/form.js +117 -8
  4. data/app/assets/javascripts/ratchet/base/mobilemenu.js +50 -12
  5. data/app/assets/javascripts/ratchet/base/validation.js +263 -0
  6. data/app/assets/javascripts/ratchet/core.js +78 -57
  7. data/app/assets/javascripts/ratchet/enhancement/_collapse.js +6 -3
  8. data/app/assets/javascripts/ratchet/enhancement/_lightbox.js +93 -0
  9. data/app/assets/javascripts/ratchet/enhancement/_swap.js +7 -3
  10. data/app/assets/javascripts/ratchet/{utility → enhancement}/loader.js +8 -15
  11. data/app/assets/javascripts/ratchet/enhancement/notice.js +3 -8
  12. data/app/assets/javascripts/ratchet/enhancement/sticky.js +35 -18
  13. data/app/assets/javascripts/ratchet/enhancement/waypoints.js +162 -125
  14. data/app/assets/javascripts/ratchet/shim/classlist.js +234 -0
  15. data/app/assets/javascripts/ratchet/shim/object.assign.js +30 -0
  16. data/app/assets/javascripts/ratchet/utility/ajax.js +122 -0
  17. data/app/assets/javascripts/ratchet/utility/compile_data.js +40 -0
  18. data/app/assets/javascripts/ratchet/utility/from_top.js +14 -0
  19. data/app/assets/javascripts/ratchet/utility/full_stop.js +55 -0
  20. data/app/assets/javascripts/ratchet/utility/get_closest.js +20 -0
  21. data/app/assets/javascripts/ratchet/utility/get_next.js +17 -0
  22. data/app/assets/javascripts/ratchet/utility/matches.js +15 -0
  23. data/app/assets/javascripts/ratchet/utility/scroll_to.js +74 -0
  24. data/app/assets/javascripts/ratchet/utility/throttle.js +25 -0
  25. data/app/assets/javascripts/ratchet/utility/timeout.js +45 -0
  26. data/app/assets/javascripts/ratchet/utility/unhover.js +56 -0
  27. data/app/assets/javascripts/ratchet/utility/word_count.js +15 -0
  28. data/app/assets/stylesheets/ratchet/_core.scss +2 -4
  29. data/app/assets/stylesheets/ratchet/base/_button.scss +1 -1
  30. data/app/assets/stylesheets/ratchet/base/_form.scss +50 -61
  31. data/app/assets/stylesheets/ratchet/base/_text.scss +8 -8
  32. data/app/assets/stylesheets/ratchet/{utility → enhancement}/_loader.scss +1 -1
  33. data/app/assets/stylesheets/ratchet/enhancement/_tooltip.scss +1 -6
  34. data/app/assets/stylesheets/ratchet/utility/_global.scss +12 -2
  35. data/app/helpers/ratchet/application_helper.rb +2 -28
  36. data/app/views/layouts/ratchet/default.html.slim +4 -5
  37. data/app/views/shared/ratchet/_footer.html.slim +2 -3
  38. data/app/views/shared/ratchet/_header.html.slim +1 -1
  39. data/lib/ratchet_design/version.rb +1 -1
  40. data/lib/ratchet_design.rb +0 -1
  41. data/public/assets/ratchet/core-0.1.6.js +105 -0
  42. data/public/assets/ratchet/core-0.1.6.js.gz +0 -0
  43. data/public/assets/ratchet/core-0.1.6.map.json +1 -0
  44. data/public/assets/ratchet/{fonts-woff-0.1.5.css → fonts-woff-0.1.6.css} +0 -0
  45. data/public/assets/ratchet/{fonts-woff-0.1.5.css.gz → fonts-woff-0.1.6.css.gz} +0 -0
  46. data/public/assets/ratchet/{fonts-woff2-0.1.5.css → fonts-woff2-0.1.6.css} +0 -0
  47. data/public/assets/ratchet/{fonts-woff2-0.1.5.css.gz → fonts-woff2-0.1.6.css.gz} +0 -0
  48. metadata +28 -47
  49. data/app/assets/images/ratchet/safari-pinned-tab.svg +0 -1
  50. data/app/assets/javascripts/ratchet/base/sync-input-value.js +0 -30
  51. data/app/assets/javascripts/ratchet/enhancement/lightbox.js +0 -165
  52. data/app/assets/javascripts/ratchet/shim/scope.js +0 -94
  53. data/app/assets/stylesheets/ratchet/base/_multistep-form.scss +0 -64
  54. data/app/assets/stylesheets/ratchet/enhancement/_lightbox.scss +0 -98
  55. data/app/helpers/ratchet/form_helper.rb +0 -140
  56. data/public/assets/ratchet/core-0.1.5.js +0 -133
  57. data/public/assets/ratchet/core-0.1.5.js.gz +0 -0
  58. data/public/assets/ratchet/core-0.1.5.map.json +0 -1
@@ -1,165 +0,0 @@
1
- /**
2
- * Lightbox 0.0.1
3
- * A simple lightbox module
4
- * @author Kyle Foster (@hkfoster)
5
- * @license MIT
6
- **/
7
-
8
- // Dependencies
9
- var toolbox = require( 'compose-toolbox' ),
10
- Event = toolbox.event,
11
- delay = toolbox.delay,
12
- loader = require( '../utility/loader' );
13
-
14
- // Public API function
15
- var lightbox = function( element, settings ) {
16
-
17
- // Apply default element selector
18
- element = element || 'a[href$=jpg] ,a[href$=png], a[href$=gif], a[href$=svg]';
19
-
20
- // Overridable defaults
21
- var defaults = {
22
- initWidth : '700px'
23
- },
24
-
25
- // Main variables
26
- options = toolbox.merge( defaults, settings ),
27
- selector = document.querySelector( element ),
28
- widthQuery = window.matchMedia( '(max-width: ' + options.initWidth + ')' ),
29
- spinner = loader({ loadingMessage: 'Loading image', failureMessage : 'No image found' }),
30
- docBody = document.body,
31
- tempImg;
32
-
33
- // Only run when selectors exist
34
- if ( !selector ) return false;
35
-
36
- // Attach open lightbox click listener
37
- Event.on( document, 'click', 'a[href$=jpg], a[href$=png], a[href$=gif], a[href$=svg]', clickHandler );
38
-
39
- // Attach close lightbox click listener
40
- Event.on( document, 'click', '.lightbox', hideLightbox );
41
-
42
- // Initialize lightbox function
43
- function init() {
44
-
45
- // Insert lightbox container into body
46
- docBody.insertAdjacentHTML( 'afterbegin', '<aside class="lightbox"><figure><img src="" alt=""><button></button></figure></aside>' );
47
-
48
- // Cache temporary placeholder image
49
- tempImg = document.querySelector( '.lightbox img' );
50
-
51
- }
52
-
53
- // Hide lightbox function
54
- function hideLightbox( event ) {
55
-
56
- // Don’t apply when image is clicked
57
- if ( event && event.target.tagName === 'IMG' ) return false;
58
-
59
- // Hide the spinner
60
- spinner.hide();
61
-
62
- // Remove active lightbox class from body
63
- docBody.classList.remove( 'lightbox-active' );
64
-
65
- // Remove loaded class from lightbox image
66
- tempImg.classList.remove( 'loaded' );
67
-
68
- // Reset lightbox image source
69
- tempImg.src = '';
70
-
71
- }
72
-
73
- // Image load pending function
74
- function loadPending( target ) {
75
-
76
- // Show loading icon
77
- spinner.show( 'pending' );
78
-
79
- // Set temp image source appropriately
80
- tempImg.src = target.parentNode.href;
81
-
82
- // Add `lightbox-active` class to body
83
- docBody.classList.add( 'lightbox-active' );
84
-
85
- }
86
-
87
- // Image load success function
88
- function loadSuccess() {
89
-
90
- // Hide the spinner
91
- spinner.hide();
92
-
93
- // Bada bing, bada boom
94
- tempImg.classList.add( 'loaded' );
95
-
96
- }
97
-
98
- // Image load failure function
99
- function loadFailure( event ) {
100
-
101
- // Wait a second…
102
- delay( function() {
103
-
104
- // Show spinner failure state
105
- spinner.show( 'failure' );
106
-
107
- }, 1000 );
108
-
109
- // Wait a couple more seconds…
110
- delay( function() {
111
-
112
- // Hide the lightbox
113
- hideLightbox();
114
-
115
- }, 2500 );
116
-
117
- // Remove image load event listener
118
- Event.off( tempImg, 'load', loadSuccess );
119
-
120
- // Remove image error event listener
121
- Event.off( tempImg, 'error', loadFailure );
122
-
123
- }
124
-
125
- // Click handler function
126
- function clickHandler( event ) {
127
-
128
- // Prevent default behavior
129
- event.preventDefault();
130
-
131
- // If viewport is smaller than <initWidth>, abort
132
- if ( widthQuery.matches ) return false;
133
-
134
- // If lightbox hasn’t already been instantiated, :doit:
135
- if ( !document.querySelector( '.lightbox' ) ) init();
136
-
137
- // Allow escape to close lightbox
138
- Event.keyOne( 'esc', hideLightbox );
139
-
140
- // Load lightbox image
141
- loadPending( event.target );
142
-
143
- // If it has loaded successfully
144
- if ( tempImg.complete ) {
145
-
146
- // Kick off image load success function
147
- loadSuccess();
148
-
149
- // Otherwise
150
- } else {
151
-
152
- // Listen for image load event
153
- Event.on( tempImg, 'load', loadSuccess );
154
-
155
- // Listen for image error event
156
- Event.on( tempImg, 'error', loadFailure );
157
-
158
- }
159
-
160
- }
161
-
162
- };
163
-
164
- // Public API
165
- module.exports = lightbox;
@@ -1,94 +0,0 @@
1
- /**
2
- * Scoped QuerySelector polyfill
3
- * @source https://github.com/lazd/scopedQuerySelectorShim
4
- * @author Larry Davis ( @lazd )
5
- * @license BSD
6
- */
7
- ( function() {
8
-
9
- // Throw error on super old browsers
10
- if ( !HTMLElement.prototype.querySelectorAll ) {
11
- throw new Error( 'rootedQuerySelectorAll: This polyfill can only be used with browsers that support querySelectorAll' );
12
- }
13
-
14
- // Create temporary element to query against and test for :scope support
15
- var container = document.createElement( 'div' );
16
-
17
- // Check if the browser supports :scope
18
- try {
19
-
20
- // Browser supports :scope, do nothing
21
- container.querySelectorAll( ':scope *' );
22
-
23
- // Otherwise
24
- } catch ( e ) {
25
-
26
- // Match usage of scope
27
- var scopeRE = /^\s*:scope/gi;
28
-
29
- // Overrides
30
- function overrideNodeMethod( prototype, methodName ) {
31
-
32
- // Store the old method for use later
33
- var oldMethod = prototype[ methodName ];
34
-
35
- // Override the method
36
- prototype[ methodName ] = function( query ) {
37
-
38
- var gaveContainer = false,
39
- gaveId = false,
40
- nodeList;
41
-
42
- if ( query.match( scopeRE ) ) {
43
-
44
- // Remove :scope
45
- query = query.replace( scopeRE, '' );
46
-
47
- if ( !this.parentNode ) {
48
-
49
- // Add to temporary container
50
- container.appendChild( this );
51
- gaveContainer = true;
52
-
53
- }
54
-
55
- parentNode = this.parentNode;
56
-
57
- if ( !this.id ) {
58
-
59
- // Give temporary ID
60
- this.id = 'rootedQuerySelector_id_' + new Date().getTime();
61
- gaveId = true;
62
-
63
- }
64
-
65
- // Find elements against parent node
66
- nodeList = oldMethod.call( parentNode, '#' + this.id + ' ' + query );
67
-
68
- // Reset the ID
69
- if ( gaveId ) {
70
- this.id = '';
71
- }
72
-
73
- // Remove from temporary container
74
- if ( gaveContainer ) {
75
- container.removeChild( this );
76
- }
77
-
78
- return nodeList;
79
-
80
- } else {
81
-
82
- // No immediate child selector used
83
- return oldMethod.call( this, query );
84
-
85
- }
86
- };
87
- }
88
-
89
- // Browser doesnt support :scope, add polyfill
90
- overrideNodeMethod( HTMLElement.prototype, 'querySelector' );
91
- overrideNodeMethod( HTMLElement.prototype, 'querySelectorAll' );
92
-
93
- }
94
- })();
@@ -1,64 +0,0 @@
1
- fieldset.form-step {
2
- left: 0;
3
- right: 0;
4
-
5
- &[disabled] {
6
- position: absolute;
7
- left: -9999px;
8
- opacity: 0;
9
- }
10
-
11
-
12
- // Transition to form step
13
- &.arrived { animation: fade-in-right .5s forwards; }
14
-
15
- // Revisit form step
16
- &.revisted, &.step-visited.arrived { animation: .5s fade-in-left forwards; }
17
-
18
- // Transition away from form step
19
- &.departed { animation: fade-out-left .5s forwards; }
20
- }
21
-
22
- // Transition to form step
23
- @keyframes fade-in-right {
24
- 0% {
25
- opacity: 0;
26
- transform: perspective(1px) translate3d(200px, 0, 0);
27
- }
28
-
29
- 100% {
30
- opacity: 1;
31
- transform: perspective(1px) translate3d(0, 0, 0);
32
- }
33
- }
34
-
35
- // Transition away from form step
36
- @keyframes fade-out-left {
37
- 0% {
38
- opacity: 1;
39
- transform: perspective(1px) translate3d(0, 0, 0);
40
- }
41
-
42
- 99% {
43
- opacity: 0;
44
- transform: perspective(1px) translate3d(-200px, 0, 0);
45
- }
46
-
47
- 100% {
48
- opacity: 0;
49
- transform: perspective(1px) translate3d(-9999px, 0, 0);
50
- }
51
- }
52
-
53
- // Return to previous form step
54
- @keyframes fade-in-left {
55
- 0% {
56
- opacity: 0;
57
- transform: perspective(1px) translate3d(-200px, 0, 0);
58
- }
59
-
60
- 100% {
61
- opacity: 1;
62
- transform: perspective(1px) translate3d(0, 0, 0);
63
- }
64
- }
@@ -1,98 +0,0 @@
1
- /* ========================================================================== *
2
- * Lightbox module
3
- * -------------------------------------------------------------------------- */
4
-
5
- /* ===================================== *
6
- * a. Common
7
- * ------------------------------------- */
8
-
9
- // Main lightbox element
10
- .lightbox {
11
- @extend %hidden;
12
- display: flex;
13
- width: 100%;
14
- height: 100%;
15
- margin: 0;
16
- align-items: center;
17
- justify-content: center;
18
- background: rgba(0, 0, 0, .9);
19
- visibility: hidden; // Hidden by default
20
- cursor: pointer;
21
-
22
- // Container figure
23
- figure {
24
- position: relative;
25
- margin: 0;
26
- }
27
-
28
- // Main image
29
- img {
30
- max-width: 90vw;
31
- max-height: 90vh;
32
- cursor: default;
33
- visibility: hidden; // Hidden by default
34
-
35
- // Make visible once loaded
36
- &.loaded,
37
- &.loaded + button {
38
- visibility: visible;
39
- }
40
- }
41
-
42
- // Close button
43
- button {
44
- position: absolute;
45
- margin: 10px 0 0 10px;
46
- width: 20px;
47
- height: 20px;
48
- appearance: none;
49
- outline: none;
50
- border: 0;
51
- visibility: hidden; // Hidden by default
52
- background: url("data:image/svg+xml,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg' fill='#FFF'%3E%3Cpath d='M2.663.005c.176.021.349.045.519.095.316.091.613.249.868.455l.184.166 10.765 10.765 10.768-10.768.187-.164c.262-.21.559-.368.882-.46.279-.079.567-.106.856-.089.228.014.456.065.671.143.257.094.498.23.712.401.578.467.922 1.186.925 1.928.001.239-.033.478-.1.707-.093.316-.249.611-.456.867l-.165.184-10.766 10.765 10.768 10.768.165.187c.224.279.388.599.477.947.078.308.097.631.055.946-.041.301-.136.593-.282.859-.113.208-.256.399-.424.566-.152.153-.324.285-.511.393-.584.337-1.296.423-1.945.235-.316-.092-.612-.25-.868-.456l-.183-.166-10.766-10.765-10.768 10.768-.186.165c-.28.224-.599.388-.947.477-.316.08-.646.098-.968.052-.293-.042-.578-.137-.838-.279-.242-.132-.462-.306-.648-.511-.16-.177-.294-.377-.398-.592-.307-.636-.328-1.387-.054-2.039.091-.218.214-.422.362-.606l.166-.183 10.765-10.766-10.765-10.765-.111-.119c-.208-.245-.372-.521-.476-.826-.204-.594-.172-1.259.087-1.832.098-.217.229-.42.385-.601.174-.201.381-.374.61-.51.279-.166.594-.278.916-.323l.353-.025.179.006z'/%3E%3C/svg%3E") 0 0 / 16px 16px no-repeat;
53
- }
54
- }
55
-
56
- // Active state
57
- .lightbox-active {
58
-
59
- // Prevent scrolling
60
- overflow: hidden;
61
-
62
- // Reposition lightbox
63
- .lightbox {
64
- position: fixed;
65
- left: 0;
66
- top: 0;
67
- z-index: 13;
68
- visibility: visible; // Shown while active
69
- }
70
-
71
- // Default loader state
72
- .loader {
73
- z-index: 14;
74
- }
75
-
76
- // Loader failure state
77
- .loader.failure {
78
- &:before {
79
- border-color: transparent;
80
- background: rgba($white, .2)
81
- }
82
-
83
- &:after {
84
- content: '';
85
- background: url("data:image/svg+xml,%3Csvg viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='#FFF' d='M30.51 6.423l5.099-5.099.202-.16c.146-.09.313-.145.485-.16l.129-.004.128.011.126.026c.125.034.243.089.349.163.106.074.198.166.272.272.2.285.254.655.145.984-.041.123-.103.238-.183.339l-.086.096-35.284 35.285-.202.159c-.183.113-.398.171-.614.165-.347-.01-.676-.188-.876-.472l-.122-.227c-.047-.12-.074-.248-.078-.377-.003-.129.016-.258.056-.381.041-.122.103-.237.183-.339l.086-.096 3.989-3.989c-.337-.385-.538-.887-.538-1.424v-22.611c0-1.219.998-2.161 2.161-2.161h24.573zm3.857 26.933h-24.573l1.774-1.773h22.799c.222 0 .388-.166.333-.388v-1.884l-.166-.222-6.429-6.429c-.111-.11-.332-.11-.499 0l-2.937 2.439c-.831.72-2.106.665-2.882-.111l-1.832-1.792 1.295-1.295 1.867 1.812c.111.111.333.111.499 0l2.937-2.383c.832-.72 2.106-.665 2.882.111l5.32 5.32v-18.177l-.031-.158 1.267-1.266c.337.384.538.886.538 1.424v22.611c0 1.219-.998 2.161-2.162 2.161zm-17.556-13.234l-2.561-2.505c-.11-.111-.332-.111-.498 0l-8.202 7.703v5.875l.03.157 11.231-11.23zm1.284-1.284l10.642-10.642h-22.8c-.166 0-.332.166-.332.388v14.243l6.927-6.54c.832-.776 2.162-.776 2.993.056l2.57 2.495zm-8.089-8.465c1.101 0 1.995.894 1.995 1.996 0 1.101-.894 1.995-1.995 1.995s-1.995-.894-1.995-1.995c0-1.102.894-1.996 1.995-1.996z' /%3E%3C/svg%3E") 50% 50% / 28px 28px no-repeat;
86
- }
87
- }
88
- }
89
-
90
- // Deactivate anchor links under 700px
91
- @media (max-width: 700px) {
92
- a[href$=jpg],
93
- a[href$=png],
94
- a[href$=gif],
95
- a[href$=svg] {
96
- cursor: default;
97
- }
98
- }
@@ -1,140 +0,0 @@
1
- module Ratchet
2
- module FormHelper
3
-
4
- INPUT_OPTIONS = {
5
- email: {
6
- type: "email",
7
- placeholder: "Email address",
8
- pattern: "[^@]+@[^@]+\\.[a-zA-Z]{2,}",
9
- data: { message: "Please enter a valid email address." }
10
- },
11
-
12
- password: {
13
- type: "password",
14
- placeholder: "Password"
15
- },
16
-
17
- text: {
18
- type: "text"
19
- },
20
-
21
- card_number: {
22
- type: "text",
23
- required: true,
24
- pattern: "[0-9 -]{13,20}",
25
- placeholder: "Credit Card Number",
26
- data: {
27
- stripe: "number",
28
- message: "Please enter a valid credit card number."
29
- }
30
- },
31
-
32
- card_month: {
33
- type: "text",
34
- required: true,
35
- pattern: "0[1-9]|1[012]",
36
- placeholder: "MM",
37
- data: {
38
- stripe: "exp_month",
39
- message: "Please enter a valid expiration month."
40
- }
41
- },
42
-
43
- card_year: {
44
- type: "text",
45
- required: true,
46
- pattern: "[0-9]{4}",
47
- placeholder: "YYYY",
48
- data: {
49
- stripe: "exp_year",
50
- message: "Please enter a valid expiration year."
51
- }
52
- },
53
-
54
- card_cvc: {
55
- type: "text",
56
- required: true,
57
- pattern: "[0-9]{3,4}",
58
- data: {
59
- stripe: "cvc",
60
- message: "Please enter a valid security code."
61
- }
62
- },
63
-
64
- select_country: {
65
- country_options: {
66
- include_blank: "Select a country",
67
- priority_countries: ["US", "GB", "CA"],
68
- },
69
-
70
- html_options: {}
71
- }
72
- }
73
-
74
- # Country select
75
- def select_country_tag(name, options = {}, country_options = {})
76
- country_options.reverse_merge! INPUT_OPTIONS[:select_country][:country_options]
77
-
78
- options = INPUT_OPTIONS[:select_country][:html_options].deep_merge options
79
-
80
- content_tag(:label) do
81
- country_select :user, :country, country_options, options
82
- end
83
- end
84
-
85
- # Email inputs
86
- def email_input_tag(name, value = nil, options = {})
87
- base_input_tag(name, value, options, :email)
88
- end
89
-
90
- # Passowrd inputs
91
- def password_input_tag(name, value = nil, options = {})
92
- base_input_tag(name, value, options, :password)
93
- end
94
-
95
- def text_input_tag(name, value = nil, options = {})
96
- base_input_tag(name, value, options, :text)
97
- end
98
-
99
- def card_number_tag(name, value=nil, options={})
100
- base_input_tag(name, value, options, :card_number)
101
- end
102
-
103
- def card_month_tag(name, value=nil, options={})
104
- base_input_tag(name, value, options, :card_month)
105
- end
106
-
107
- def card_year_tag(name, value=nil, options={})
108
- base_input_tag(name, value, options, :card_year)
109
- end
110
-
111
- def card_cvc_tag(name, value=nil, options={})
112
- base_input_tag(name, value, options, :card_cvc)
113
- end
114
-
115
- private
116
-
117
- def base_input_tag(name, value, options, type)
118
- if value.is_a? Hash
119
- options = value
120
- value = nil
121
- end
122
-
123
- options = (INPUT_OPTIONS[type]||{}).deep_merge options
124
-
125
- label = options.delete(:label)
126
- tag = text_field_tag(name, value, options)
127
-
128
- if label
129
- options[:placeholder] = label
130
-
131
- content_tag(:label) do
132
- tag + content_tag(:span) { label }
133
- end
134
- else
135
- tag
136
- end
137
-
138
- end
139
- end
140
- end