lanes 0.5.0 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/client/fonts/fontawesome-webfont.woff +0 -0
  3. data/client/fonts/fontawesome-webfont.woff2 +0 -0
  4. data/client/lanes/Boot.cjsx +1 -6
  5. data/client/lanes/components/grid/Body.cjsx +14 -1
  6. data/client/lanes/components/grid/Grid.cjsx +20 -19
  7. data/client/lanes/components/grid/Toolbar.cjsx +7 -4
  8. data/client/lanes/components/grid/editors.scss +1 -1
  9. data/client/lanes/components/grid/styles.scss +16 -5
  10. data/client/lanes/components/modal/Modal.cjsx +9 -11
  11. data/client/lanes/components/record-finder/RecordFinder.cjsx +2 -2
  12. data/client/lanes/components/record-finder/styles.scss +7 -5
  13. data/client/lanes/components/shared/FormGroup.cjsx +1 -1
  14. data/client/lanes/components/shared/Icon.cjsx +3 -2
  15. data/client/lanes/components/shared/Input.cjsx +1 -0
  16. data/client/lanes/components/shared/PanelHeader.cjsx +8 -0
  17. data/client/lanes/components/shared/fields.scss +5 -4
  18. data/client/lanes/components/shared/styles.scss +18 -0
  19. data/client/lanes/index.js +0 -1
  20. data/client/lanes/{plugins → lib}/ResizeSensor.js +0 -0
  21. data/client/lanes/lib/all.js +13 -0
  22. data/client/lanes/lib/dom.coffee +1 -1
  23. data/client/lanes/lib/format.coffee +2 -2
  24. data/client/lanes/lib/index.js.erb +1 -13
  25. data/client/lanes/lib/loader.coffee +2 -2
  26. data/client/lanes/lib/utilFunctions.coffee +12 -0
  27. data/client/lanes/models/AssociationMap.coffee +27 -18
  28. data/client/lanes/models/Base.coffee +12 -4
  29. data/client/lanes/models/Collection.coffee +5 -3
  30. data/client/lanes/models/PubSub.coffee +1 -1
  31. data/client/lanes/models/Query.coffee +0 -1
  32. data/client/lanes/models/State.coffee +5 -1
  33. data/client/lanes/models/Sync.coffee +5 -9
  34. data/client/lanes/models/query/ArrayResult.coffee +27 -7
  35. data/client/lanes/models/query/Result.coffee +2 -0
  36. data/client/lanes/react/Component.coffee +3 -3
  37. data/client/lanes/react/Viewport.coffee +17 -5
  38. data/client/lanes/react/mixins/Access.coffee +2 -2
  39. data/client/lanes/react/mixins/FieldErrors.coffee +3 -3
  40. data/client/lanes/remote/BaseClasses.coffee +0 -0
  41. data/client/lanes/remote/api.coffee +8 -0
  42. data/client/lanes/styles/fonts/_icons.scss +139 -2
  43. data/client/lanes/styles/fonts/_variables.scss +142 -4
  44. data/client/lanes/styles/global/mixins.scss +5 -0
  45. data/client/lanes/styles/global/styles.scss +5 -2
  46. data/client/lanes/styles/global.scss +1 -0
  47. data/client/lanes/vendor/base.js.erb +4 -2
  48. data/client/lanes/vendor/development/calendar.js +65 -65
  49. data/client/lanes/vendor/development/commons.js +34530 -34719
  50. data/client/lanes/vendor/development/data.js +30832 -0
  51. data/client/lanes/vendor/development/helpers.js +26 -26
  52. data/client/lanes/vendor/development/toggle.js +19 -19
  53. data/client/lanes/vendor/development/ui.js +22568 -0
  54. data/client/lanes/vendor/development/widgets.js +362 -362
  55. data/client/lanes/vendor/production/calendar.js +65 -65
  56. data/client/lanes/vendor/production/commons.js +34360 -34549
  57. data/client/lanes/vendor/production/data.js +30829 -0
  58. data/client/lanes/vendor/production/toggle.js +19 -19
  59. data/client/lanes/vendor/production/ui.js +22564 -0
  60. data/client/lanes/vendor/production/widgets.js +362 -362
  61. data/client/lanes/vendor/{production/base.js → standalone/index.js} +43836 -53602
  62. data/client/lanes/workspace/Modal.cjsx +1 -1
  63. data/client/lanes/workspace/styles/header.scss +1 -0
  64. data/client/lanes/workspace/styles/layout.scss +12 -0
  65. data/lanes.gemspec +1 -0
  66. data/lib/lanes/access/authentication_provider.rb +4 -3
  67. data/lib/lanes/api/coffeescript_processor.rb +9 -3
  68. data/lib/lanes/api/{controller.rb → controller_base.rb} +3 -35
  69. data/lib/lanes/api/formatted_reply.rb +2 -2
  70. data/lib/lanes/api/generic_controller.rb +42 -0
  71. data/lib/lanes/api/helper_methods.rb +1 -1
  72. data/lib/lanes/api/null_authentication_provider.rb +3 -0
  73. data/lib/lanes/api/request_wrapper.rb +32 -18
  74. data/lib/lanes/api/root.rb +25 -3
  75. data/lib/lanes/api/routing.rb +41 -22
  76. data/lib/lanes/api/sprockets_extension.rb +3 -1
  77. data/lib/lanes/api.rb +2 -1
  78. data/lib/lanes/configuration.rb +0 -1
  79. data/lib/lanes/extension/definition.rb +5 -1
  80. data/lib/lanes/hot_reload_plugin.rb +0 -1
  81. data/lib/lanes/version.rb +1 -1
  82. data/npm-build/build +3 -0
  83. data/npm-build/{base.js → data.js} +16 -16
  84. data/npm-build/package.json +3 -1
  85. data/npm-build/standalone.js +4 -0
  86. data/npm-build/ui.js +8 -0
  87. data/npm-build/webpack-standalone.config.js +16 -0
  88. data/npm-build/webpack.config.js +4 -3
  89. data/templates/config/lanes.rb +3 -3
  90. metadata +34 -10
  91. data/client/lanes/lib/noConflict.coffee +0 -15
  92. data/client/lanes/plugins/index.js +0 -1
  93. data/client/lanes/vendor/development/base.js +0 -61239
@@ -9,7 +9,7 @@ class ModelConfig
9
9
  add: (model) ->
10
10
  if @count is 0
11
11
  Lanes.log.info "[pubsub] subscribe to: #{@channel}"
12
- Lanes.Models.PubSub.mb.subscribe(@channel, @mbCallBack(@models))
12
+ Lanes.Models.PubSub.mb?.subscribe(@channel, @mbCallBack(@models))
13
13
  @count += 1
14
14
  config = @modelConfig(model)
15
15
  config.count += 1
@@ -265,7 +265,6 @@ class Lanes.Models.Query extends Lanes.Models.Base
265
265
  this.fields.findWhere(id: "visibleId") ||
266
266
  this.fields.first()
267
267
 
268
- @reset()
269
268
  this
270
269
 
271
270
  reset: ->
@@ -52,7 +52,11 @@ class State
52
52
 
53
53
  integer:
54
54
  set: (newVal) ->
55
- val = parseInt(newVal, 10) unless _.isBlank(newVal)
55
+ val = switch
56
+ when _.isInteger(newVal) then newVal
57
+ when ! _.isBlank(newVal) then parseInt(newVal, 10)
58
+ else
59
+ undefined
56
60
  {val, type: 'integer'}
57
61
  file:
58
62
  set: (val) ->
@@ -52,7 +52,7 @@ Lanes.Models.Sync = {
52
52
  Lanes.Models.Sync.perform(method, options).then (reply) ->
53
53
  handler(reply)
54
54
  , (err) ->
55
- reply = { errors: { http: err.error.message } }
55
+ reply = { errors: { http: err?.error?.message or 'unknown' } }
56
56
  try
57
57
  reply = JSON.parse(err.body) unless _.isEmpty(err?.body)
58
58
  finally
@@ -78,19 +78,15 @@ Lanes.Models.Sync = {
78
78
  unless _.isEmpty(query)
79
79
  options.url += '?' + Lanes.lib.objToParam(query)
80
80
 
81
- # if options.data and !_.isString(options.data)
82
- # options.originalData = options.data
83
- # options.json = options.data
84
81
  options.headers ||= {}
85
- # options.json = true
86
- options.headers['X_CSRF_TOKEN'] = Lanes.config.csrf_token
82
+
83
+ if Lanes.config.csrf_token
84
+ options.headers['X_CSRF_TOKEN'] = Lanes.config.csrf_token
87
85
  options.contentType = "application/json"
88
86
 
89
- # Make the request, allowing the user to override any Ajax options.
90
- # xhr = options.xhr = Lanes.$.ajax(_.extend(params, options))
91
87
  new _.Promise( (resolve, reject) ->
92
88
  options.xhr = Lanes.Vendor.xhr(options, (err, resp, body) ->
93
- if err
89
+ if err or resp.statusCode >= 400
94
90
  reject(error:err, body:options.xhr.responseText)
95
91
  else
96
92
  resolve(body)
@@ -1,10 +1,12 @@
1
1
  class Page
2
2
 
3
3
  constructor: (@pageNum, @result, options = {}) ->
4
- query = {}
5
- @rows = options.rows || []
6
- return if options.rows
4
+ @rows = options.rows
5
+ @_load() unless @rows or options.noLoad is true
7
6
 
7
+ _load: ->
8
+ @rows = []
9
+ query = {}
8
10
  @result.query.clauses.each (clause) ->
9
11
  _.extend( query, clause.toParam() ) if clause.isValid
10
12
 
@@ -25,13 +27,18 @@ class Page
25
27
  options.order[field_name] = if @result.query.sortAscending then 'asc' else 'desc'
26
28
 
27
29
  _.extend(options, _.omit(@result.query.syncOptions, 'include'))
28
- @result.query.trigger('request', @result.query, 'GET', {})
29
- @result.requestInProgress = options
30
+ # defer trigger in case we were called from render() and triggering
31
+ # would cause a loop that it's not in the render
32
+ _.defer => @result.query.trigger('request', @result.query, 'GET', {})
33
+ @result.requestInProgress = @requestInProgress = options
30
34
  Lanes.Models.Sync.perform('GET', options).then (resp) =>
31
35
  @result.total = resp.total
32
36
  @rows = resp.data
33
37
  delete @result.requestInProgress
34
- @result.onPageLoad(@)
38
+ delete @requestInProgress
39
+ _.defer => @result.onPageLoad(@)
40
+
41
+ isLoaded: -> not _.isUndefined(@rows)
35
42
 
36
43
  _normalizedIndex: (index) ->
37
44
  index = index % @result.pageSize
@@ -92,7 +99,7 @@ class Lanes.Models.Query.ArrayResult extends Lanes.Models.Query.Result
92
99
  @total = 0
93
100
  @pages = {}
94
101
 
95
- pageForIndex: (index) ->
102
+ pageForIndex: (index, options = {}) ->
96
103
  pageNum = Math.floor(index / @pageSize)
97
104
  @pages[pageNum] ||= new Page(pageNum, this)
98
105
 
@@ -152,6 +159,19 @@ class Lanes.Models.Query.ArrayResult extends Lanes.Models.Query.Result
152
159
  ensureLoaded: (options = {}) ->
153
160
  @pageForIndex(options.page || 0).pendingLoad or _.Promise.resolve(@)
154
161
 
162
+ loadFully: ->
163
+ len = @length
164
+ console.log "Loading 0 ... #{len}, ps: #{pageSize}"
165
+ loading = []
166
+
167
+ for pageIndex in [0...len - 1] by @pageSize
168
+ page = @pageForIndex(pageIndex, noLoad: true)
169
+ loading.push page._load() unless page.isLoaded()
170
+ null
171
+
172
+ _.Promise.all(loading)
173
+
174
+
155
175
  reload: (options = {}) ->
156
176
  @pages = []
157
177
  @total = 0
@@ -7,3 +7,5 @@ class Lanes.Models.Query.Result
7
7
  field = @query.sortField
8
8
  return false unless field
9
9
  if _.isFunction field.sortBy then field.sortBy else false
10
+
11
+ loadFully: -> _.Promise.resolve(@)
@@ -25,11 +25,11 @@ Lanes.React.Component = {
25
25
  klass::mixins = _.uniq(klass::mixins.concat(mixins))
26
26
  comp = React.createClass(klass.prototype)
27
27
  extendComponent(comp)
28
- return Lanes.lib.HotReload.remember(comp)
28
+ return Lanes.lib.HotReload?.remember(comp) or comp
29
29
  }
30
30
 
31
31
  Lanes.React.BaseComponent = {
32
- extend: (klass, mixins = @defaultMixins) ->
32
+ extend: (klass) ->
33
33
  comp = React.createClass(klass.prototype)
34
- return Lanes.lib.HotReload.remember(comp)
34
+ return Lanes.lib.HotReload?.remember(comp) or comp
35
35
  }
@@ -14,6 +14,9 @@ class Lanes.React.Viewport extends Lanes.Models.State
14
14
  reactRoot: 'object'
15
15
  lanes: 'element'
16
16
  modalProps: 'object'
17
+ pubSubDisabled: 'boolean'
18
+ rootComponent: 'any'
19
+ rootProps: 'object'
17
20
 
18
21
  constructor: ->
19
22
  super
@@ -21,7 +24,7 @@ class Lanes.React.Viewport extends Lanes.Models.State
21
24
  return unless @selector
22
25
  @domRoot = document.body.querySelector(@selector)
23
26
  _.dom(@domRoot).addClass('lanes-root')
24
- Lanes.fatal("Root selector #{@selector} not found") unless root
27
+ Lanes.fatal("Root selector #{@selector} not found") unless @domRoot
25
28
  _.dom(@domRoot).html = "<div class='lanes'/>"
26
29
  this.lanes = @domRoot.querySelector('.lanes')
27
30
  Lanes.lib.ResizeSensor(@domRoot, _.debounce( =>
@@ -29,6 +32,13 @@ class Lanes.React.Viewport extends Lanes.Models.State
29
32
  , 250))
30
33
  this._updateDimensions()
31
34
 
35
+ Lanes.Models.PubSub.initialize() unless @pubSubDisabled
36
+ Lanes.Extensions.fireOnInitialized(@)
37
+ @renderRoot()
38
+ Lanes.Extensions.fireOnAvailable(@)
39
+ @onBoot()
40
+
41
+
32
42
  onBoot: ->
33
43
  prev = _.dom(this.domRoot.previousElementSibling)
34
44
  prev.addClass('complete') if prev.hasClass('loading')
@@ -55,10 +65,12 @@ class Lanes.React.Viewport extends Lanes.Models.State
55
65
  @modalProps = _.extend(props, show: true)
56
66
 
57
67
  renderRoot: ->
58
- cntrl = Lanes.Extensions.controlling()
59
- component = cntrl?.rootComponent?(this) ||
60
- Lanes.React.Root.DefaultComponentNotFound
68
+ component = @rootComponent || (
69
+ cntrl = Lanes.Extensions.controlling()
70
+ component = cntrl?.rootComponent?(this) ||
71
+ Lanes.React.Root.DefaultComponentNotFound
72
+ )
61
73
  root = React.createElement(Lanes.React.Root, {viewport: @},
62
- React.createElement(component, extension: cntrl)
74
+ React.createElement(component, _.extend(@rootProps, extension: cntrl))
63
75
  )
64
76
  @reactRoot = Lanes.Vendor.ReactDOM.render(root, @lanes)
@@ -1,8 +1,8 @@
1
1
  calculateAccess = (comp, props) ->
2
2
 
3
3
  model = _.result(comp, 'modelForAccess') ||
4
- comp.commands?.getModel()?.modelForAccess() ||
5
- comp.model?.modelForAccess()
4
+ comp.commands?.getModel()?.modelForAccess?() ||
5
+ comp.model?.modelForAccess?()
6
6
 
7
7
  accessRight = if props.readonly or comp.context?.readonly
8
8
  'r'
@@ -5,7 +5,7 @@ Lanes.React.Mixins.FieldErrors = {
5
5
  ]
6
6
 
7
7
  componentWillMount: ->
8
- @getInvalidModel()?.maskInvalidFields()
8
+ @getInvalidModel()?.maskInvalidFields?()
9
9
 
10
10
  getInvalidFieldName: ->
11
11
  @props.validity_attribute || @props.name
@@ -18,10 +18,10 @@ Lanes.React.Mixins.FieldErrors = {
18
18
 
19
19
  fieldInvalidValueMessage: ->
20
20
  return '' unless @isEditingRecord()
21
- @getInvalidModel()?.invalidMessageFor(
21
+ @getInvalidModel()?.invalidMessageFor?(
22
22
  @getInvalidFieldName()
23
23
  )
24
24
 
25
25
  onFieldInteraction: ->
26
- @getInvalidModel()?.unmaskInvalidField( @getInvalidFieldName() )
26
+ @getInvalidModel()?.unmaskInvalidField?( @getInvalidFieldName() )
27
27
  }
File without changes
@@ -0,0 +1,8 @@
1
+ ##=require ../vendor/standalone
2
+ ##=require ../lib/all
3
+ ##=require ../models
4
+ ##=require ../extension
5
+ ##=require ../react
6
+ ##=require_self
7
+
8
+ Lanes.config = {api_path: null}
@@ -163,6 +163,7 @@
163
163
  .#{$fa-css-prefix}-github:before { content: $fa-var-github; }
164
164
  .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
165
165
  .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
166
+ .#{$fa-css-prefix}-feed:before,
166
167
  .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
167
168
  .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
168
169
  .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
@@ -437,7 +438,7 @@
437
438
  .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
438
439
  .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
439
440
  .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
440
- .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
441
+ .#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }
441
442
  .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
442
443
  .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
443
444
  .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
@@ -487,11 +488,14 @@
487
488
  .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
488
489
  .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
489
490
  .#{$fa-css-prefix}-ra:before,
491
+ .#{$fa-css-prefix}-resistance:before,
490
492
  .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
491
493
  .#{$fa-css-prefix}-ge:before,
492
494
  .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
493
495
  .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
494
496
  .#{$fa-css-prefix}-git:before { content: $fa-var-git; }
497
+ .#{$fa-css-prefix}-y-combinator-square:before,
498
+ .#{$fa-css-prefix}-yc-square:before,
495
499
  .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
496
500
  .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
497
501
  .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
@@ -502,7 +506,6 @@
502
506
  .#{$fa-css-prefix}-send-o:before,
503
507
  .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
504
508
  .#{$fa-css-prefix}-history:before { content: $fa-var-history; }
505
- .#{$fa-css-prefix}-genderless:before,
506
509
  .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
507
510
  .#{$fa-css-prefix}-header:before { content: $fa-var-header; }
508
511
  .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
@@ -573,6 +576,7 @@
573
576
  .#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
574
577
  .#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
575
578
  .#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
579
+ .#{$fa-css-prefix}-intersex:before,
576
580
  .#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
577
581
  .#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
578
582
  .#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
@@ -582,6 +586,7 @@
582
586
  .#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
583
587
  .#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
584
588
  .#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
589
+ .#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
585
590
  .#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
586
591
  .#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
587
592
  .#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
@@ -594,3 +599,135 @@
594
599
  .#{$fa-css-prefix}-train:before { content: $fa-var-train; }
595
600
  .#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
596
601
  .#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
602
+ .#{$fa-css-prefix}-yc:before,
603
+ .#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
604
+ .#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
605
+ .#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
606
+ .#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
607
+ .#{$fa-css-prefix}-battery-4:before,
608
+ .#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
609
+ .#{$fa-css-prefix}-battery-3:before,
610
+ .#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
611
+ .#{$fa-css-prefix}-battery-2:before,
612
+ .#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
613
+ .#{$fa-css-prefix}-battery-1:before,
614
+ .#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
615
+ .#{$fa-css-prefix}-battery-0:before,
616
+ .#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
617
+ .#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
618
+ .#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
619
+ .#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
620
+ .#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
621
+ .#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
622
+ .#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
623
+ .#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
624
+ .#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
625
+ .#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
626
+ .#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
627
+ .#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
628
+ .#{$fa-css-prefix}-hourglass-1:before,
629
+ .#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
630
+ .#{$fa-css-prefix}-hourglass-2:before,
631
+ .#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
632
+ .#{$fa-css-prefix}-hourglass-3:before,
633
+ .#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
634
+ .#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
635
+ .#{$fa-css-prefix}-hand-grab-o:before,
636
+ .#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
637
+ .#{$fa-css-prefix}-hand-stop-o:before,
638
+ .#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
639
+ .#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
640
+ .#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
641
+ .#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
642
+ .#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
643
+ .#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
644
+ .#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
645
+ .#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
646
+ .#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
647
+ .#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
648
+ .#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
649
+ .#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
650
+ .#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
651
+ .#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
652
+ .#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
653
+ .#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
654
+ .#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
655
+ .#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
656
+ .#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
657
+ .#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
658
+ .#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
659
+ .#{$fa-css-prefix}-tv:before,
660
+ .#{$fa-css-prefix}-television:before { content: $fa-var-television; }
661
+ .#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
662
+ .#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
663
+ .#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
664
+ .#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
665
+ .#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
666
+ .#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
667
+ .#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
668
+ .#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
669
+ .#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
670
+ .#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
671
+ .#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
672
+ .#{$fa-css-prefix}-map:before { content: $fa-var-map; }
673
+ .#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
674
+ .#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
675
+ .#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
676
+ .#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
677
+ .#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
678
+ .#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
679
+ .#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
680
+ .#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
681
+ .#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
682
+ .#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
683
+ .#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
684
+ .#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
685
+ .#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
686
+ .#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
687
+ .#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
688
+ .#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
689
+ .#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
690
+ .#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
691
+ .#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
692
+ .#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
693
+ .#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
694
+ .#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
695
+ .#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
696
+ .#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
697
+ .#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
698
+ .#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
699
+ .#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }
700
+ .#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }
701
+ .#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }
702
+ .#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }
703
+ .#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }
704
+ .#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }
705
+ .#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }
706
+ .#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }
707
+ .#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }
708
+ .#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }
709
+ .#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }
710
+ .#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }
711
+ .#{$fa-css-prefix}-asl-interpreting:before,
712
+ .#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }
713
+ .#{$fa-css-prefix}-deafness:before,
714
+ .#{$fa-css-prefix}-hard-of-hearing:before,
715
+ .#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }
716
+ .#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }
717
+ .#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }
718
+ .#{$fa-css-prefix}-signing:before,
719
+ .#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }
720
+ .#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }
721
+ .#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }
722
+ .#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }
723
+ .#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }
724
+ .#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }
725
+ .#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }
726
+ .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
727
+ .#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }
728
+ .#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }
729
+ .#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }
730
+ .#{$fa-css-prefix}-google-plus-circle:before,
731
+ .#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }
732
+ .#{$fa-css-prefix}-fa:before,
733
+ .#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }