Kirki - Version 3.0.26

Version Description

Download this release

Release Info

Developer aristath
Plugin Icon 128x128 Kirki
Version 3.0.26
Comparing to
See all releases

Code changes from version 3.0.25 to 3.0.26

Files changed (64) hide show
  1. controls/class-kirki-controls.php +1 -0
  2. controls/css/styles.css +3 -1
  3. controls/js/script.js +584 -479
  4. controls/js/script.min.js +1 -1
  5. controls/php/class-kirki-control-base.php +20 -7
  6. controls/php/class-kirki-control-checkbox.php +57 -0
  7. controls/php/class-kirki-control-dimension.php +1 -1
  8. controls/php/class-kirki-control-multicheck.php +1 -1
  9. controls/php/class-kirki-control-radio-buttonset.php +1 -1
  10. controls/php/class-kirki-control-repeater.php +19 -8
  11. controls/php/class-kirki-control-typography.php +13 -11
  12. controls/views/number.php +37 -0
  13. core/class-kirki-helper.php +37 -29
  14. core/class-kirki-init.php +4 -1
  15. core/class-kirki-modules.php +2 -0
  16. core/class-kirki-sanitize-values.php +2 -2
  17. core/class-kirki.php +5 -0
  18. field/class-kirki-field-dimension.php +1 -1
  19. field/class-kirki-field-dimensions.php +1 -1
  20. field/class-kirki-field-typography.php +8 -8
  21. kirki.php +1 -1
  22. modules/css/class-kirki-css-to-file.php +3 -1
  23. modules/css/class-kirki-modules-css.php +25 -1
  24. modules/css/class-kirki-output.php +3 -1
  25. modules/css/field/class-kirki-output-field-background.php +6 -0
  26. modules/css/field/class-kirki-output-field-dimensions.php +1 -1
  27. modules/css/property/class-kirki-output-property-background-position.php +2 -2
  28. modules/custom-sections/sections.js +31 -31
  29. modules/customizer-branding/branding.js +1 -1
  30. modules/field-dependencies/field-dependencies.js +117 -60
  31. modules/icons/icons.js +1 -1
  32. modules/postmessage/class-kirki-modules-postmessage.php +1 -1
  33. modules/preset/class-kirki-modules-preset.php +68 -0
  34. modules/preset/preset.js +32 -0
  35. modules/tooltips/tooltip.js +7 -7
  36. modules/webfont-loader/class-kirki-modules-webfont-loader.php +83 -0
  37. modules/webfont-loader/vendor-typekit/src/closure.js +2 -0
  38. modules/webfont-loader/vendor-typekit/src/core/cssclassname.js +46 -0
  39. modules/webfont-loader/vendor-typekit/src/core/domhelper.js +405 -0
  40. modules/webfont-loader/vendor-typekit/src/core/eventdispatcher.js +195 -0
  41. modules/webfont-loader/vendor-typekit/src/core/font.js +140 -0
  42. modules/webfont-loader/vendor-typekit/src/core/fontmodule.js +16 -0
  43. modules/webfont-loader/vendor-typekit/src/core/fontmoduleloader.js +47 -0
  44. modules/webfont-loader/vendor-typekit/src/core/fontruler.js +60 -0
  45. modules/webfont-loader/vendor-typekit/src/core/fontwatcher.js +171 -0
  46. modules/webfont-loader/vendor-typekit/src/core/fontwatchrunner.js +249 -0
  47. modules/webfont-loader/vendor-typekit/src/core/initialize.js +97 -0
  48. modules/webfont-loader/vendor-typekit/src/core/nativefontwatchrunner.js +69 -0
  49. modules/webfont-loader/vendor-typekit/src/core/stylesheetwaiter.js +48 -0
  50. modules/webfont-loader/vendor-typekit/src/core/webfont.js +97 -0
  51. modules/webfont-loader/vendor-typekit/src/modules.yml +34 -0
  52. modules/webfont-loader/vendor-typekit/src/modules/custom.js +63 -0
  53. modules/webfont-loader/vendor-typekit/src/modules/fontdeck.js +66 -0
  54. modules/webfont-loader/vendor-typekit/src/modules/google/fontapiparser.js +181 -0
  55. modules/webfont-loader/vendor-typekit/src/modules/google/fontapiurlbuilder.js +77 -0
  56. modules/webfont-loader/vendor-typekit/src/modules/google/googlefontapi.js +54 -0
  57. modules/webfont-loader/vendor-typekit/src/modules/monotype.js +110 -0
  58. modules/webfont-loader/vendor-typekit/src/modules/typekit.js +73 -0
  59. modules/webfont-loader/vendor-typekit/webfontloader.js +17 -0
  60. modules/webfonts/class-kirki-fonts-google.php +11 -11
  61. modules/webfonts/class-kirki-modules-webfonts-async.php +30 -10
  62. modules/webfonts/webfont-names.json +1 -0
  63. modules/webfonts/webfonts.json +1 -1
  64. readme.txt +28 -1
controls/class-kirki-controls.php CHANGED
@@ -25,6 +25,7 @@ class Kirki_Controls {
25
  'code',
26
  'color',
27
  'generic',
 
28
  'radio',
29
  'select',
30
  'textarea',
25
  'code',
26
  'color',
27
  'generic',
28
+ 'number',
29
  'radio',
30
  'select',
31
  'textarea',
controls/css/styles.css CHANGED
@@ -62,7 +62,7 @@
62
  position: relative;
63
  left: -25%;
64
  top: -25%;
65
- z-index: 99; }
66
  .customize-control-kirki-color-palette .colors-wrapper.with-margin label {
67
  margin: 3px; }
68
  .customize-control-kirki-color-palette .colors-wrapper input {
@@ -73,6 +73,8 @@
73
 
74
  .customize-control-kirki-color input[data-type="hue"] + .iris-strip-horiz .iris-slider {
75
  background-image: -webkit-linear-gradient(left, red, #ff7f00, yellow, #80ff00, lime, #00ff80, cyan, #007fff, blue, #7f00ff, magenta, #ff0080, red) !important; }
 
 
76
 
77
  .customize-control-kirki-dashicons {
78
  position: relative; }
62
  position: relative;
63
  left: -25%;
64
  top: -25%;
65
+ z-index: 1; }
66
  .customize-control-kirki-color-palette .colors-wrapper.with-margin label {
67
  margin: 3px; }
68
  .customize-control-kirki-color-palette .colors-wrapper input {
73
 
74
  .customize-control-kirki-color input[data-type="hue"] + .iris-strip-horiz .iris-slider {
75
  background-image: -webkit-linear-gradient(left, red, #ff7f00, yellow, #80ff00, lime, #00ff80, cyan, #007fff, blue, #7f00ff, magenta, #ff0080, red) !important; }
76
+ .customize-control-kirki-color .iris-picker .iris-square-handle {
77
+ z-index: 8; }
78
 
79
  .customize-control-kirki-dashicons {
80
  position: relative; }
controls/js/script.js CHANGED
@@ -1,7 +1,7 @@
1
  /* jshint -W079 */
2
  /* jshint unused:false */
3
  if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
4
- var kirkiSetSettingValue = { // jscs:ignore requireVarDeclFirst
5
 
6
  /**
7
  * Set the value of the control.
@@ -18,8 +18,8 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
18
  * and determine if we need to do any further work based on those.
19
  */
20
  var $this = this,
21
- subControl = wp.customize.settings.controls[ setting ],
22
- valueJSON;
23
 
24
  // If the control doesn't exist then return.
25
  if ( _.isUndefined( subControl ) ) {
@@ -37,14 +37,14 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
37
  $this.setColorPicker( $this.findElement( setting, '.kirki-color-control' ), value['background-color'] );
38
  }
39
  $this.findElement( setting, '.placeholder, .thumbnail' ).removeClass().addClass( 'placeholder' ).html( 'No file selected' );
40
- _.each( ['background-repeat', 'background-position'], function( subVal ) {
41
  if ( ! _.isUndefined( value[ subVal ] ) ) {
42
  $this.setSelectWoo( $this.findElement( setting, '.' + subVal + ' select' ), value[ subVal ] );
43
  }
44
- });
45
- _.each( ['background-size', 'background-attachment'], function( subVal ) {
46
  jQuery( $this.findElement( setting, '.' + subVal + ' input[value="' + value + '"]' ) ).prop( 'checked', true );
47
- });
48
  valueJSON = JSON.stringify( value ).replace( /'/g, '&#39' );
49
  jQuery( $this.findElement( setting, '.background-hidden-value' ).attr( 'value', valueJSON ) ).trigger( 'change' );
50
  break;
@@ -86,16 +86,16 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
86
  case 'kirki-multicheck':
87
  $this.findElement( setting, 'input' ).each( function() {
88
  jQuery( this ).prop( 'checked', false );
89
- });
90
  _.each( value, function( subValue, i ) {
91
  jQuery( $this.findElement( setting, 'input[value="' + value[ i ] + '"]' ) ).prop( 'checked', true );
92
- });
93
  break;
94
 
95
  case 'kirki-multicolor':
96
  _.each( value, function( subVal, index ) {
97
  $this.setColorPicker( $this.findElement( setting, '.multicolor-index-' + index ), subVal );
98
- });
99
  break;
100
 
101
  case 'kirki-radio-buttonset':
@@ -108,16 +108,16 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
108
  break;
109
 
110
  case 'kirki-typography':
111
- _.each( ['font-family', 'variant'], function( subVal ) {
112
  if ( ! _.isUndefined( value[ subVal ] ) ) {
113
  $this.setSelectWoo( $this.findElement( setting, '.' + subVal + ' select' ), value[ subVal ] );
114
  }
115
- });
116
- _.each( ['font-size', 'line-height', 'letter-spacing', 'word-spacing'], function( subVal ) {
117
  if ( ! _.isUndefined( value[ subVal ] ) ) {
118
  jQuery( $this.findElement( setting, '.' + subVal + ' input' ) ).prop( 'value', value[ subVal ] );
119
  }
120
- });
121
 
122
  if ( ! _.isUndefined( value.color ) ) {
123
  $this.setColorPicker( $this.findElement( setting, '.kirki-color-control' ), value.color );
@@ -129,7 +129,7 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
129
  case 'kirki-dimensions':
130
  _.each( value, function( subValue, id ) {
131
  jQuery( $this.findElement( setting, '.' + id + ' input' ) ).prop( 'value', subValue );
132
- });
133
  break;
134
 
135
  case 'kirki-repeater':
@@ -202,7 +202,7 @@ if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
202
  */
203
  setValue: function( setting, value, timeout ) {
204
  timeout = ( _.isUndefined( timeout ) ) ? 100 : parseInt( timeout, 10 );
205
- wp.customize.instance( setting ).set({});
206
  setTimeout( function() {
207
  wp.customize.instance( setting ).set( value );
208
  }, timeout );
@@ -295,7 +295,7 @@ kirki = jQuery.extend( kirki, {
295
  description: control.params.description,
296
  'data-id': control.id,
297
  inputAttrs: control.params.inputAttrs,
298
- 'default': control.params['default'],
299
  value: kirki.setting.get( control.id ),
300
  choices: control.params.choices
301
  } ) );
@@ -355,7 +355,7 @@ kirki = jQuery.extend( kirki, {
355
  mode: control.params.mode,
356
  inputAttrs: control.params.inputAttrs,
357
  'data-palette': control.params.palette,
358
- 'data-default-color': control.params['default'],
359
  'data-alpha': control.params.choices.alpha,
360
  value: kirki.setting.get( control.id )
361
  } ) );
@@ -416,8 +416,8 @@ kirki = jQuery.extend( kirki, {
416
  inputAttrs: control.params.inputAttrs,
417
  choices: control.params.choices,
418
  value: kirki.setting.get( control.id )
419
- },
420
- template;
421
 
422
  if ( ! _.isUndefined( control.params ) && ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.element ) && 'textarea' === control.params.choices.element ) {
423
  template = wp.template( 'kirki-input-textarea' );
@@ -429,6 +429,60 @@ kirki = jQuery.extend( kirki, {
429
  }
430
  },
431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  'kirki-select': {
433
 
434
  /**
@@ -474,7 +528,7 @@ kirki = jQuery.extend( kirki, {
474
  value: kirki.setting.get( control.id ),
475
  multiple: control.params.multiple || 1,
476
  placeholder: control.params.placeholder
477
- } ) );
478
  }
479
  }
480
  }
@@ -482,6 +536,7 @@ kirki = jQuery.extend( kirki, {
482
  /* global kirkiL10n */
483
  var kirki = kirki || {};
484
  kirki = jQuery.extend( kirki, {
 
485
  /**
486
  * An object containing definitions for input fields.
487
  *
@@ -510,7 +565,7 @@ kirki = jQuery.extend( kirki, {
510
  // Save the value
511
  input.on( 'change keyup paste click', function() {
512
  kirki.setting.set( control.id, jQuery( this ).val() );
513
- });
514
  }
515
  },
516
 
@@ -535,7 +590,7 @@ kirki = jQuery.extend( kirki, {
535
  */
536
  init: function( control ) {
537
  var picker = jQuery( '.kirki-color-control[data-id="' + control.id + '"]' ),
538
- clear;
539
 
540
  control.choices = control.choices || {};
541
  if ( _.isEmpty( control.choices ) && control.params.choices ) {
@@ -553,12 +608,12 @@ kirki = jQuery.extend( kirki, {
553
  if ( clear.length ) {
554
  clear.click( function() {
555
  kirki.setting.set( control.id, '' );
556
- });
557
  }
558
  }, 200 );
559
 
560
  // Saves our settings to the WP API
561
- picker.wpColorPicker({
562
  change: function() {
563
 
564
  // Small hack: the picker needs a small delay
@@ -566,7 +621,7 @@ kirki = jQuery.extend( kirki, {
566
  kirki.setting.set( control.id, picker.val() );
567
  }, 20 );
568
  }
569
- });
570
  }
571
  },
572
 
@@ -591,7 +646,7 @@ kirki = jQuery.extend( kirki, {
591
  // Save the value
592
  input.on( 'change keyup paste click', function() {
593
  kirki.setting.set( control.id, jQuery( this ).val() );
594
- });
595
  }
596
  },
597
 
@@ -616,7 +671,7 @@ kirki = jQuery.extend( kirki, {
616
  // Save the value
617
  textarea.on( 'change keyup paste click', function() {
618
  kirki.setting.set( control.id, jQuery( this ).val() );
619
- });
620
  }
621
  },
622
 
@@ -632,13 +687,13 @@ kirki = jQuery.extend( kirki, {
632
  */
633
  init: function( control ) {
634
  var element = jQuery( 'select[data-id="' + control.id + '"]' ),
635
- multiple = parseInt( element.data( 'multiple' ), 10 ),
636
- selectValue,
637
- selectWooOptions = {
638
  escapeMarkup: function( markup ) {
639
  return markup;
640
  }
641
- };
642
  if ( control.params.placeholder ) {
643
  selectWooOptions.placeholder = control.params.placeholder;
644
  selectWooOptions.allowClear = true;
@@ -651,10 +706,83 @@ kirki = jQuery.extend( kirki, {
651
  selectValue = jQuery( this ).val();
652
  selectValue = ( null === selectValue && 1 < multiple ) ? [] : selectValue;
653
  kirki.setting.set( control.id, selectValue );
654
- });
655
  }
656
  },
657
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
658
  image: {
659
 
660
  /**
@@ -666,8 +794,8 @@ kirki = jQuery.extend( kirki, {
666
  */
667
  getTemplate: function( data ) {
668
  var html = '',
669
- saveAs = 'url',
670
- url;
671
 
672
  data = _.defaults( data, {
673
  label: '',
@@ -702,12 +830,12 @@ kirki = jQuery.extend( kirki, {
702
  }
703
  html += '<div class="actions">';
704
  html += '<button class="button image-upload-remove-button' + ( '' === url ? ' hidden' : '' ) + '">' + kirkiL10n.remove + '</button>';
705
- if ( data['default'] && '' !== data['default'] ) {
706
  html += '<button type="button" class="button image-default-button"';
707
- if ( data['default'] === data.value || ( ! _.isUndefined( data.value.url ) && data['default'] === data.value.url ) ) {
708
  html += ' style="display:none;"';
709
  }
710
- html += '>' + kirkiL10n['default'] + '</button>';
711
  }
712
  html += '<button type="button" class="button image-upload-button">' + kirkiL10n.selectFile + '</button>';
713
  html += '</div></div>';
@@ -722,13 +850,14 @@ kirki = jQuery.extend( kirki, {
722
  * @param {Object} control - The control object.
723
  * @returns {null}
724
  */
725
- init: function( control ) { // jshint ignore:line
726
  }
727
  }
728
  }
729
  } );
730
  var kirki = kirki || {};
731
  kirki = jQuery.extend( kirki, {
 
732
  /**
733
  * An object containing definitions for settings.
734
  *
@@ -749,9 +878,9 @@ kirki = jQuery.extend( kirki, {
749
  */
750
  get: function( setting ) {
751
  var parts = setting.split( '[' ),
752
- foundSetting = '',
753
- foundInStep = 0,
754
- currentVal = '';
755
 
756
  _.each( parts, function( part, i ) {
757
  part = part.replace( ']', '' );
@@ -772,7 +901,7 @@ kirki = jQuery.extend( kirki, {
772
  currentVal = currentVal[ part ];
773
  }
774
  }
775
- });
776
 
777
  return currentVal;
778
  },
@@ -797,13 +926,13 @@ kirki = jQuery.extend( kirki, {
797
  */
798
  set: function( element, value, key ) {
799
  var setting,
800
- parts,
801
- currentNode = '',
802
- foundNode = '',
803
- subSettingObj = {},
804
- currentVal,
805
- subSetting,
806
- subSettingParts;
807
 
808
  // Get the setting from the element.
809
  setting = element;
@@ -820,7 +949,7 @@ kirki = jQuery.extend( kirki, {
820
  return;
821
  }
822
 
823
- parts = setting.split( '[' ),
824
 
825
  // Find the setting we're using in the control using the customizer API.
826
  _.each( parts, function( part, i ) {
@@ -882,6 +1011,7 @@ kirki = jQuery.extend( kirki, {
882
  /* global ajaxurl */
883
  var kirki = kirki || {};
884
  kirki = jQuery.extend( kirki, {
 
885
  /**
886
  * A collection of utility methods.
887
  *
@@ -955,7 +1085,7 @@ kirki = jQuery.extend( kirki, {
955
  */
956
  getFont: function( family ) {
957
  var self = this,
958
- fonts = self.getFonts();
959
 
960
  if ( 'undefined' === typeof fonts[ family ] ) {
961
  return false;
@@ -973,9 +1103,9 @@ kirki = jQuery.extend( kirki, {
973
  */
974
  getFonts: function( order, category, number ) {
975
  var self = this,
976
- ordered = {},
977
- categorized = {},
978
- plucked = {};
979
 
980
  // Make sure order is correct.
981
  order = order || 'alpha';
@@ -1025,7 +1155,7 @@ kirki = jQuery.extend( kirki, {
1025
  */
1026
  getVariants: function( family ) {
1027
  var self = this,
1028
- font = self.getFont( family );
1029
 
1030
  // Early exit if font was not found.
1031
  if ( ! font ) {
@@ -1098,8 +1228,8 @@ kirki = jQuery.extend( kirki, {
1098
  * @since 3.0.17
1099
  * @returns {Array}
1100
  */
1101
- getVariants: function( family ) { // jshint ignore: line
1102
- return ['regular', 'italic', '700', '700italic'];
1103
  }
1104
  },
1105
 
@@ -1131,6 +1261,39 @@ kirki = jQuery.extend( kirki, {
1131
  }
1132
  return false;
1133
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1134
  }
1135
  }
1136
  } );
@@ -1153,11 +1316,11 @@ kirki = jQuery.extend( kirki, {
1153
  * @augments wp.customize.Control
1154
  * @augments wp.customize.Class
1155
  */
1156
- wp.customize.kirkiDynamicControl = wp.customize.Control.extend({
1157
 
1158
  initialize: function( id, options ) {
1159
  var control = this,
1160
- args = options || {};
1161
 
1162
  args.params = args.params || {};
1163
  if ( ! args.params.type ) {
@@ -1184,7 +1347,7 @@ kirki = jQuery.extend( kirki, {
1184
  */
1185
  _setUpSettingRootLinks: function() {
1186
  var control = this,
1187
- nodes = control.container.find( '[data-customize-setting-link]' );
1188
 
1189
  nodes.each( function() {
1190
  var node = jQuery( this );
@@ -1206,7 +1369,7 @@ kirki = jQuery.extend( kirki, {
1206
  */
1207
  _setUpSettingPropertyLinks: function() {
1208
  var control = this,
1209
- nodes;
1210
 
1211
  if ( ! control.setting ) {
1212
  return;
@@ -1216,8 +1379,8 @@ kirki = jQuery.extend( kirki, {
1216
 
1217
  nodes.each( function() {
1218
  var node = jQuery( this ),
1219
- element,
1220
- propertyName = node.data( 'customizeSettingPropertyLink' );
1221
 
1222
  element = new wp.customize.Element( node );
1223
  control.propertyElements.push( element );
@@ -1267,7 +1430,7 @@ kirki = jQuery.extend( kirki, {
1267
  */
1268
  embed: function() {
1269
  var control = this,
1270
- sectionId = control.section();
1271
 
1272
  if ( ! sectionId ) {
1273
  return;
@@ -1331,42 +1494,14 @@ kirki = jQuery.extend( kirki, {
1331
  this.container.on( 'change keyup paste click', 'input', function() {
1332
  control.setting.set( jQuery( this ).val() );
1333
  } );
1334
- },
1335
-
1336
- kirkiValidateCSSValue: function( value ) {
1337
-
1338
- var validUnits = ['rem', 'em', 'ex', '%', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vh', 'vw', 'vmin', 'vmax'],
1339
- numericValue,
1340
- unit;
1341
-
1342
- // 0 is always a valid value, and we can't check calc() values effectively.
1343
- if ( '0' === value || ( 0 <= value.indexOf( 'calc(' ) && 0 <= value.indexOf( ')' ) ) ) {
1344
- return true;
1345
- }
1346
-
1347
- if ( 'auto' === value || 'inherit' === value || 'initial' === value ) {
1348
- return true;
1349
- }
1350
-
1351
- // Get the numeric value.
1352
- numericValue = parseFloat( value );
1353
-
1354
- // Get the unit
1355
- unit = value.replace( numericValue, '' );
1356
-
1357
- // Check the validity of the numeric value and units.
1358
- if ( isNaN( numericValue ) || -1 === jQuery.inArray( unit, validUnits ) ) {
1359
- return false;
1360
- }
1361
- return true;
1362
  }
1363
  } );
1364
  }() );
1365
  _.each( kirki.control, function( obj, type ) {
1366
- wp.customize.controlConstructor[ type ] = wp.customize.kirkiDynamicControl.extend({});
1367
  } );
1368
  /* global kirkiControlLoader */
1369
- wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.extend({
1370
 
1371
  // When we're finished loading continue processing
1372
  ready: function() {
@@ -1386,8 +1521,8 @@ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.exten
1386
  initKirkiControl: function() {
1387
 
1388
  var control = this,
1389
- value = control.setting._value,
1390
- picker = control.container.find( '.kirki-color-control' );
1391
 
1392
  // Hide unnecessary controls if the value doesn't have an image.
1393
  if ( _.isUndefined( value['background-image'] ) || '' === value['background-image'] ) {
@@ -1398,47 +1533,47 @@ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.exten
1398
  }
1399
 
1400
  // Color.
1401
- picker.wpColorPicker({
1402
  change: function() {
1403
  setTimeout( function() {
1404
  control.saveValue( 'background-color', picker.val() );
1405
  }, 100 );
1406
  }
1407
- });
1408
 
1409
  // Background-Repeat.
1410
  control.container.on( 'change', '.background-repeat select', function() {
1411
  control.saveValue( 'background-repeat', jQuery( this ).val() );
1412
- });
1413
 
1414
  // Background-Size.
1415
  control.container.on( 'change click', '.background-size input', function() {
1416
  control.saveValue( 'background-size', jQuery( this ).val() );
1417
- });
1418
 
1419
  // Background-Position.
1420
  control.container.on( 'change', '.background-position select', function() {
1421
  control.saveValue( 'background-position', jQuery( this ).val() );
1422
- });
1423
 
1424
  // Background-Attachment.
1425
  control.container.on( 'change click', '.background-attachment input', function() {
1426
  control.saveValue( 'background-attachment', jQuery( this ).val() );
1427
- });
1428
 
1429
  // Background-Image.
1430
  control.container.on( 'click', '.background-image-upload-button', function( e ) {
1431
- var image = wp.media({ multiple: false }).open().on( 'select', function() {
1432
 
1433
  // This will return the selected image from the Media Uploader, the result is an object.
1434
  var uploadedImage = image.state().get( 'selection' ).first(),
1435
- previewImage = uploadedImage.toJSON().sizes.full.url,
1436
- imageUrl,
1437
- imageID,
1438
- imageWidth,
1439
- imageHeight,
1440
- preview,
1441
- removeButton;
1442
 
1443
  if ( ! _.isUndefined( uploadedImage.toJSON().sizes.medium ) ) {
1444
  previewImage = uploadedImage.toJSON().sizes.medium.url;
@@ -1466,15 +1601,15 @@ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.exten
1466
  if ( removeButton.length ) {
1467
  removeButton.show();
1468
  }
1469
- });
1470
 
1471
  e.preventDefault();
1472
- });
1473
 
1474
  control.container.on( 'click', '.background-image-upload-remove-button', function( e ) {
1475
 
1476
  var preview,
1477
- removeButton;
1478
 
1479
  e.preventDefault();
1480
 
@@ -1495,7 +1630,7 @@ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.exten
1495
  if ( removeButton.length ) {
1496
  removeButton.hide();
1497
  }
1498
- });
1499
  },
1500
 
1501
  /**
@@ -1504,22 +1639,22 @@ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.exten
1504
  saveValue: function( property, value ) {
1505
 
1506
  var control = this,
1507
- input = jQuery( '#customize-control-' + control.id.replace( '[', '-' ).replace( ']', '' ) + ' .background-hidden-value' ),
1508
- val = control.setting._value;
1509
 
1510
  val[ property ] = value;
1511
 
1512
  jQuery( input ).attr( 'value', JSON.stringify( val ) ).trigger( 'change' );
1513
  control.setting.set( val );
1514
  }
1515
- });
1516
- wp.customize.controlConstructor['kirki-color-palette'] = wp.customize.kirkiDynamicControl.extend({});
1517
- wp.customize.controlConstructor['kirki-dashicons'] = wp.customize.kirkiDynamicControl.extend({});
1518
- wp.customize.controlConstructor['kirki-date'] = wp.customize.kirkiDynamicControl.extend({
1519
 
1520
  initKirkiControl: function() {
1521
  var control = this,
1522
- selector = control.selector + ' input.datepicker';
1523
 
1524
  // Init the datepicker
1525
  jQuery( selector ).datepicker( {
@@ -1535,12 +1670,12 @@ wp.customize.controlConstructor['kirki-date'] = wp.customize.kirkiDynamicControl
1535
  }
1536
  } );
1537
  /* global dimensionkirkiL10n */
1538
- wp.customize.controlConstructor['kirki-dimension'] = wp.customize.kirkiDynamicControl.extend({
1539
 
1540
  initKirkiControl: function() {
1541
 
1542
  var control = this,
1543
- value;
1544
 
1545
  // Notifications.
1546
  control.kirkiNotifications();
@@ -1550,7 +1685,7 @@ wp.customize.controlConstructor['kirki-dimension'] = wp.customize.kirkiDynamicCo
1550
 
1551
  value = jQuery( this ).val();
1552
  control.setting.set( value );
1553
- });
1554
  },
1555
 
1556
  /**
@@ -1564,7 +1699,7 @@ wp.customize.controlConstructor['kirki-dimension'] = wp.customize.kirkiDynamicCo
1564
  setting.bind( function( value ) {
1565
  var code = 'long_title';
1566
 
1567
- if ( false === control.kirkiValidateCSSValue( value ) ) {
1568
  setting.notifications.add( code, new wp.customize.Notification(
1569
  code,
1570
  {
@@ -1578,17 +1713,17 @@ wp.customize.controlConstructor['kirki-dimension'] = wp.customize.kirkiDynamicCo
1578
  } );
1579
  } );
1580
  }
1581
- });
1582
  /* global dimensionskirkiL10n */
1583
- wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicControl.extend({
1584
 
1585
  initKirkiControl: function() {
1586
 
1587
  var control = this,
1588
- subControls = control.params.choices.controls,
1589
- value = {},
1590
- subsArray = [],
1591
- i;
1592
 
1593
  _.each( subControls, function( v, i ) {
1594
  if ( true === v ) {
@@ -1617,7 +1752,7 @@ wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicC
1617
 
1618
  // Save the value
1619
  control.saveValue( value );
1620
- });
1621
  },
1622
 
1623
  /**
@@ -1626,11 +1761,11 @@ wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicC
1626
  saveValue: function( value ) {
1627
 
1628
  var control = this,
1629
- newValue = {};
1630
 
1631
  _.each( value, function( newSubValue, i ) {
1632
  newValue[ i ] = newSubValue;
1633
- });
1634
 
1635
  control.setting.set( newValue );
1636
  },
@@ -1645,13 +1780,13 @@ wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicC
1645
  wp.customize( control.id, function( setting ) {
1646
  setting.bind( function( value ) {
1647
  var code = 'long_title',
1648
- subs = {},
1649
- message;
1650
 
1651
  setting.notifications.remove( code );
1652
 
1653
  _.each( value, function( val, direction ) {
1654
- if ( false === control.kirkiValidateCSSValue( val ) ) {
1655
  subs[ direction ] = val;
1656
  } else {
1657
  delete subs[ direction ];
@@ -1670,16 +1805,16 @@ wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicC
1670
  } );
1671
  } );
1672
  }
1673
- });
1674
  /* global tinyMCE */
1675
- wp.customize.controlConstructor['kirki-editor'] = wp.customize.kirkiDynamicControl.extend({
1676
 
1677
  initKirkiControl: function() {
1678
 
1679
  var control = this,
1680
- element = control.container.find( 'textarea' ),
1681
- id = 'kirki-editor-' + control.id.replace( '[', '' ).replace( ']', '' ),
1682
- editor;
1683
 
1684
  wp.editor.initialize( id, {
1685
  tinymce: {
@@ -1687,7 +1822,7 @@ wp.customize.controlConstructor['kirki-editor'] = wp.customize.kirkiDynamicContr
1687
  },
1688
  quicktags: true,
1689
  mediaButtons: true
1690
- });
1691
 
1692
  editor = tinyMCE.get( id );
1693
 
@@ -1699,20 +1834,20 @@ wp.customize.controlConstructor['kirki-editor'] = wp.customize.kirkiDynamicContr
1699
  content = editor.getContent();
1700
  element.val( content ).trigger( 'change' );
1701
  wp.customize.instance( control.id ).set( content );
1702
- });
1703
  }
1704
  }
1705
- });
1706
  /* global fontAwesomeJSON */
1707
- wp.customize.controlConstructor['kirki-fontawesome'] = wp.customize.kirkiDynamicControl.extend({
1708
 
1709
  initKirkiControl: function() {
1710
 
1711
  var control = this,
1712
- element = this.container.find( 'select' ),
1713
- icons = jQuery.parseJSON( fontAwesomeJSON ),
1714
- selectValue,
1715
- selectWooOptions = {
1716
  data: [],
1717
  escapeMarkup: function( markup ) {
1718
  return markup;
@@ -1723,27 +1858,27 @@ wp.customize.controlConstructor['kirki-fontawesome'] = wp.customize.kirkiDynamic
1723
  templateSelection: function( val ) {
1724
  return '<i class="fa fa-lg fa-' + val.id + '" aria-hidden="true"></i>' + ' ' + val.text;
1725
  }
1726
- },
1727
- select;
1728
 
1729
  _.each( icons.icons, function( icon ) {
1730
- selectWooOptions.data.push({
1731
  id: icon.id,
1732
  text: icon.name
1733
- });
1734
- });
1735
 
1736
  select = jQuery( element ).selectWoo( selectWooOptions );
1737
 
1738
  select.on( 'change', function() {
1739
  selectValue = jQuery( this ).val();
1740
  control.setting.set( selectValue );
1741
- });
1742
  select.val( control.setting._value ).trigger( 'change' );
1743
  }
1744
- });
1745
  /* global kirkiControlLoader */
1746
- wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1747
 
1748
  // When we're finished loading continue processing
1749
  ready: function() {
@@ -1763,12 +1898,12 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1763
  initKirkiControl: function() {
1764
 
1765
  var control = this,
1766
- value = control.getValue(),
1767
- saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url',
1768
- preview = control.container.find( '.placeholder, .thumbnail' ),
1769
- previewImage = ( 'array' === saveAs ) ? value.url : value,
1770
- removeButton = control.container.find( '.image-upload-remove-button' ),
1771
- defaultButton = control.container.find( '.image-default-button' );
1772
 
1773
  control.container.find( '.kirki-controls-loading-spinner' ).hide();
1774
 
@@ -1793,7 +1928,7 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1793
  }
1794
 
1795
  // If value is default, hide the default button.
1796
- if ( value === control.params['default'] ) {
1797
  control.container.find( 'image-default-button' ).hide();
1798
  }
1799
 
@@ -1802,11 +1937,11 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1802
  }
1803
 
1804
  control.container.on( 'click', '.image-upload-button', function( e ) {
1805
- var image = wp.media({ multiple: false }).open().on( 'select', function() {
1806
 
1807
  // This will return the selected image from the Media Uploader, the result is an object.
1808
  var uploadedImage = image.state().get( 'selection' ).first(),
1809
- previewImage = uploadedImage.toJSON().sizes.full.url;
1810
 
1811
  if ( ! _.isUndefined( uploadedImage.toJSON().sizes.medium ) ) {
1812
  previewImage = uploadedImage.toJSON().sizes.medium.url;
@@ -1832,16 +1967,16 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1832
  removeButton.show();
1833
  defaultButton.hide();
1834
  }
1835
- });
1836
 
1837
  e.preventDefault();
1838
- });
1839
 
1840
  control.container.on( 'click', '.image-upload-remove-button', function( e ) {
1841
 
1842
  var preview,
1843
- removeButton,
1844
- defaultButton;
1845
 
1846
  e.preventDefault();
1847
 
@@ -1863,30 +1998,30 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1863
  defaultButton.show();
1864
  }
1865
  }
1866
- });
1867
 
1868
  control.container.on( 'click', '.image-default-button', function( e ) {
1869
 
1870
  var preview,
1871
- removeButton,
1872
- defaultButton;
1873
 
1874
  e.preventDefault();
1875
 
1876
- control.saveValue( 'url', control.params['default'] );
1877
 
1878
  preview = control.container.find( '.placeholder, .thumbnail' );
1879
  removeButton = control.container.find( '.image-upload-remove-button' );
1880
  defaultButton = control.container.find( '.image-default-button' );
1881
 
1882
  if ( preview.length ) {
1883
- preview.removeClass().addClass( 'thumbnail thumbnail-image' ).html( '<img src="' + control.params['default'] + '" alt="" />' );
1884
  }
1885
  if ( removeButton.length ) {
1886
  removeButton.show();
1887
  defaultButton.hide();
1888
  }
1889
- });
1890
  },
1891
 
1892
  /**
@@ -1894,8 +2029,8 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1894
  */
1895
  getValue: function() {
1896
  var control = this,
1897
- value = control.setting._value,
1898
- saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url';
1899
 
1900
  if ( 'array' === saveAs && _.isString( value ) ) {
1901
  value = {
@@ -1910,8 +2045,8 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1910
  */
1911
  saveValue: function( property, value ) {
1912
  var control = this,
1913
- valueOld = control.setting._value,
1914
- saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url';
1915
 
1916
  if ( 'array' === saveAs ) {
1917
  if ( _.isString( valueOld ) ) {
@@ -1925,8 +2060,8 @@ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend({
1925
  control.setting.set( value );
1926
  control.container.find( 'button' ).trigger( 'change' );
1927
  }
1928
- });
1929
- wp.customize.controlConstructor['kirki-multicheck'] = wp.customize.kirkiDynamicControl.extend({
1930
 
1931
  initKirkiControl: function() {
1932
 
@@ -1935,23 +2070,26 @@ wp.customize.controlConstructor['kirki-multicheck'] = wp.customize.kirkiDynamicC
1935
  // Save the value
1936
  control.container.on( 'change', 'input', function() {
1937
  var value = [],
1938
- i = 0;
1939
 
1940
  // Build the value as an object using the sub-values from individual checkboxes.
1941
  jQuery.each( control.params.choices, function( key ) {
1942
  if ( control.container.find( 'input[value="' + key + '"]' ).is( ':checked' ) ) {
 
1943
  value[ i ] = key;
1944
  i++;
 
 
1945
  }
1946
- });
1947
 
1948
  // Update the value in the customizer.
1949
  control.setting.set( value );
1950
- });
1951
  }
1952
- });
1953
  /* global kirkiControlLoader */
1954
- wp.customize.controlConstructor['kirki-multicolor'] = wp.customize.Control.extend({
1955
 
1956
  // When we're finished loading continue processing
1957
  ready: function() {
@@ -1973,16 +2111,16 @@ wp.customize.controlConstructor['kirki-multicolor'] = wp.customize.Control.exten
1973
  'use strict';
1974
 
1975
  var control = this,
1976
- colors = control.params.choices,
1977
- keys = Object.keys( colors ),
1978
- value = this.params.value,
1979
- i = 0;
1980
 
1981
  // Proxy function that handles changing the individual colors
1982
  function kirkiMulticolorChangeHandler( control, value, subSetting ) {
1983
 
1984
  var picker = control.container.find( '.multicolor-index-' + subSetting ),
1985
- args = {
1986
  change: function() {
1987
 
1988
  // Color controls require a small delay.
@@ -1995,12 +2133,12 @@ wp.customize.controlConstructor['kirki-multicolor'] = wp.customize.Control.exten
1995
  control.container.find( '.multicolor-index-' + subSetting ).trigger( 'change' );
1996
  }, 100 );
1997
  }
1998
- };
1999
 
2000
  if ( _.isObject( colors.irisArgs ) ) {
2001
  _.each( colors.irisArgs, function( irisValue, irisKey ) {
2002
  args[ irisKey ] = irisValue;
2003
- });
2004
  }
2005
 
2006
  // Did we change the value?
@@ -2020,101 +2158,23 @@ wp.customize.controlConstructor['kirki-multicolor'] = wp.customize.Control.exten
2020
  saveValue: function( property, value ) {
2021
 
2022
  var control = this,
2023
- input = control.container.find( '.multicolor-hidden-value' ),
2024
- val = control.setting._value;
2025
 
2026
  val[ property ] = value;
2027
 
2028
  jQuery( input ).attr( 'value', JSON.stringify( val ) ).trigger( 'change' );
2029
  control.setting.set( val );
2030
  }
2031
- });
2032
- wp.customize.controlConstructor['kirki-number'] = wp.customize.kirkiDynamicControl.extend({
2033
-
2034
- initKirkiControl: function() {
2035
-
2036
- var control = this,
2037
- value = control.setting._value,
2038
- html = '',
2039
- input,
2040
- up,
2041
- down;
2042
-
2043
- // Make sure we use default values if none are define for some arguments.
2044
- control.params.choices = _.defaults( control.params.choices, {
2045
- min: 0,
2046
- max: 100,
2047
- step: 1
2048
- } );
2049
-
2050
- // Make sure we have a valid value.
2051
- if ( isNaN( value ) || '' === value ) {
2052
- value = ( 0 > control.params.choices.min && 0 < control.params.choices.max ) ? 0 : control.params.choices.min;
2053
- }
2054
- value = parseFloat( value );
2055
-
2056
- // If step is 'any', set to 0.001.
2057
- control.params.choices.step = ( 'any' === control.params.choices.step ) ? 0.001 : control.params.choices.step;
2058
-
2059
- // Make sure choices are properly formtted as numbers.
2060
- control.params.choices.min = parseFloat( control.params.choices.min );
2061
- control.params.choices.max = parseFloat( control.params.choices.max );
2062
- control.params.choices.step = parseFloat( control.params.choices.step );
2063
-
2064
- // Build the HTML for the control.
2065
- html += '<label>';
2066
- if ( control.params.label ) {
2067
- html += '<span class="customize-control-title">' + control.params.label + '</span>';
2068
- }
2069
- if ( control.params.description ) {
2070
- html += '<span class="description customize-control-description">' + control.params.description + '</span>';
2071
- }
2072
- html += '<div class="customize-control-content">';
2073
- html += '<input ' + control.params.inputAttrs + ' type="text" ' + control.params.link + ' value="' + value + '" />';
2074
- html += '<div class="quantity button minus">-</div>';
2075
- html += '<div class="quantity button plus">+</div>';
2076
- html += '</div>';
2077
- html += '</label>';
2078
-
2079
- control.container.html( html );
2080
-
2081
- input = control.container.find( 'input' );
2082
- up = control.container.find( '.plus' );
2083
- down = control.container.find( '.minus' );
2084
-
2085
- up.click( function() {
2086
- var oldVal = parseFloat( input.val() ),
2087
- newVal;
2088
-
2089
- newVal = ( oldVal >= control.params.choices.max ) ? oldVal : oldVal + control.params.choices.step;
2090
-
2091
- input.val( newVal );
2092
- input.trigger( 'change' );
2093
- } );
2094
-
2095
- down.click( function() {
2096
- var oldVal = parseFloat( input.val() ),
2097
- newVal;
2098
-
2099
- newVal = ( oldVal <= control.params.choices.min ) ? oldVal : oldVal - control.params.choices.step;
2100
-
2101
- input.val( newVal );
2102
- input.trigger( 'change' );
2103
- } );
2104
-
2105
- this.container.on( 'change keyup paste click', 'input', function() {
2106
- control.setting.set( jQuery( this ).val() );
2107
- });
2108
- }
2109
- });
2110
- wp.customize.controlConstructor['kirki-palette'] = wp.customize.kirkiDynamicControl.extend({});
2111
  /* global kirkiSetSettingValue */
2112
- wp.customize.controlConstructor['kirki-preset'] = wp.customize.kirkiDynamicControl.extend({
2113
 
2114
  initKirkiControl: function() {
2115
 
2116
  var control = this,
2117
- selectValue;
2118
 
2119
  // Trigger a change
2120
  this.container.on( 'change', 'select', function() {
@@ -2137,15 +2197,15 @@ wp.customize.controlConstructor['kirki-preset'] = wp.customize.kirkiDynamicContr
2137
  // We'll have to loop through them all and apply the changes needed to them.
2138
  jQuery.each( value.settings, function( presetSetting, presetSettingValue ) {
2139
  kirkiSetSettingValue.set( presetSetting, presetSettingValue );
2140
- });
2141
  }
2142
- });
2143
  wp.customize.previewer.refresh();
2144
- });
2145
  }
2146
- });
2147
- wp.customize.controlConstructor['kirki-radio-buttonset'] = wp.customize.kirkiDynamicControl.extend({});
2148
- wp.customize.controlConstructor['kirki-radio-image'] = wp.customize.kirkiDynamicControl.extend({});
2149
  /* global kirkiControlLoader */
2150
  var RepeaterRow = function( rowIndex, container, label, control ) {
2151
 
@@ -2155,23 +2215,23 @@ var RepeaterRow = function( rowIndex, container, label, control ) {
2155
  this.rowIndex = rowIndex;
2156
  this.container = container;
2157
  this.label = label;
2158
- this.header = this.container.find( '.repeater-row-header' ),
2159
 
2160
  this.header.on( 'click', function() {
2161
  self.toggleMinimize();
2162
- });
2163
 
2164
  this.container.on( 'click', '.repeater-row-remove', function() {
2165
  self.remove();
2166
- });
2167
 
2168
  this.header.on( 'mousedown', function() {
2169
  self.container.trigger( 'row:start-dragging' );
2170
- });
2171
 
2172
  this.container.on( 'keyup change', 'input, select, textarea', function( e ) {
2173
  self.container.trigger( 'row:update', [ self.rowIndex, jQuery( e.target ).data( 'field' ), e.target ] );
2174
- });
2175
 
2176
  this.setRowIndex = function( rowIndex ) {
2177
  this.rowIndex = rowIndex;
@@ -2190,14 +2250,14 @@ var RepeaterRow = function( rowIndex, container, label, control ) {
2190
  this.remove = function() {
2191
  this.container.slideUp( 300, function() {
2192
  jQuery( this ).detach();
2193
- });
2194
  this.container.trigger( 'row:remove', [ this.rowIndex ] );
2195
  };
2196
 
2197
  this.updateLabel = function() {
2198
  var rowLabelField,
2199
- rowLabel,
2200
- rowLabelSelector;
2201
 
2202
  if ( 'field' === this.label.type ) {
2203
  rowLabelField = this.container.find( '.repeater-field [data-field="' + this.label.field + '"]' );
@@ -2226,7 +2286,7 @@ var RepeaterRow = function( rowIndex, container, label, control ) {
2226
  this.updateLabel();
2227
  };
2228
 
2229
- wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2230
 
2231
  // When we're finished loading continue processing
2232
  ready: function() {
@@ -2248,8 +2308,8 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2248
  'use strict';
2249
 
2250
  var control = this,
2251
- limit,
2252
- theNewRow;
2253
 
2254
  // The current value set in Control Class (set in Kirki_Customize_Repeater_Control::to_json() function)
2255
  var settingValue = this.params.value;
@@ -2287,56 +2347,57 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2287
  } else {
2288
  jQuery( control.selector + ' .limit' ).addClass( 'highlight' );
2289
  }
2290
- });
2291
 
2292
  this.container.on( 'click', '.repeater-row-remove', function() {
2293
  control.currentIndex--;
2294
  if ( ! limit || control.currentIndex < limit ) {
2295
  jQuery( control.selector + ' .limit' ).removeClass( 'highlight' );
2296
  }
2297
- });
2298
 
2299
  this.container.on( 'click keypress', '.repeater-field-image .upload-button,.repeater-field-cropped_image .upload-button,.repeater-field-upload .upload-button', function( e ) {
2300
  e.preventDefault();
2301
  control.$thisButton = jQuery( this );
2302
  control.openFrame( e );
2303
- });
2304
 
2305
  this.container.on( 'click keypress', '.repeater-field-image .remove-button,.repeater-field-cropped_image .remove-button', function( e ) {
2306
  e.preventDefault();
2307
  control.$thisButton = jQuery( this );
2308
  control.removeImage( e );
2309
- });
2310
 
2311
  this.container.on( 'click keypress', '.repeater-field-upload .remove-button', function( e ) {
2312
  e.preventDefault();
2313
  control.$thisButton = jQuery( this );
2314
  control.removeFile( e );
2315
- });
2316
 
2317
  /**
2318
  * Function that loads the Mustache template
2319
  */
2320
  this.repeaterTemplate = _.memoize( function() {
2321
  var compiled,
2322
- /*
2323
- * Underscore's default ERB-style templates are incompatible with PHP
2324
- * when asp_tags is enabled, so WordPress uses Mustache-inspired templating syntax.
2325
- *
2326
- * @see trac ticket #22344.
2327
- */
2328
- options = {
 
2329
  evaluate: /<#([\s\S]+?)#>/g,
2330
  interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
2331
  escape: /\{\{([^\}]+?)\}\}(?!\})/g,
2332
  variable: 'data'
2333
- };
2334
 
2335
  return function( data ) {
2336
  compiled = _.template( control.container.find( '.customize-control-repeater-content' ).first().html(), null, options );
2337
  return compiled( data );
2338
  };
2339
- });
2340
 
2341
  // When we load the control, the fields have not been filled up
2342
  // This is the first time that we create all the rows
@@ -2345,18 +2406,18 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2345
  theNewRow = control.addRow( subValue );
2346
  control.initColorPicker();
2347
  control.initSelect( theNewRow, subValue );
2348
- });
2349
  }
2350
 
2351
  // Once we have displayed the rows, we cleanup the values
2352
  this.setValue( settingValue, true, true );
2353
 
2354
- this.repeaterFieldsContainer.sortable({
2355
  handle: '.repeater-row-header',
2356
  update: function() {
2357
  control.sort();
2358
  }
2359
- });
2360
 
2361
  },
2362
 
@@ -2386,19 +2447,20 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2386
 
2387
  var libMediaType = this.getMimeType();
2388
 
2389
- this.frame = wp.media({
2390
  states: [
2391
- new wp.media.controller.Library({
2392
- library: wp.media.query({ type: libMediaType }),
2393
  multiple: false,
2394
- date: false
2395
- })
2396
  ]
2397
- });
2398
 
2399
  // When a file is selected, run a callback.
2400
  this.frame.on( 'select', this.onSelect, this );
2401
  },
 
2402
  /**
2403
  * Create a media modal select frame, and store it so the instance can be reused when needed.
2404
  * This is mostly a copy/paste of Core api.CroppedImageControl in /wp-admin/js/customize-control.js
@@ -2409,8 +2471,8 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2409
 
2410
  // We get the field id from which this was called
2411
  var currentFieldId = this.$thisButton.siblings( 'input.hidden-field' ).attr( 'data-field' ),
2412
- attrs = [ 'width', 'height', 'flex_width', 'flex_height' ], // A list of attributes to look for
2413
- libMediaType = this.getMimeType();
2414
 
2415
  // Make sure we got it
2416
  if ( _.isString( currentFieldId ) && '' !== currentFieldId ) {
@@ -2431,25 +2493,25 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2431
  }
2432
  }
2433
 
2434
- this.frame = wp.media({
2435
  button: {
2436
  text: 'Select and Crop',
2437
  close: false
2438
  },
2439
  states: [
2440
- new wp.media.controller.Library({
2441
- library: wp.media.query({ type: libMediaType }),
2442
- multiple: false,
2443
- date: false,
2444
- suggestedWidth: this.params.width,
2445
  suggestedHeight: this.params.height
2446
- }),
2447
- new wp.media.controller.CustomizeImageCropper({
2448
  imgSelectOptions: this.calculateImageSelectOptions,
2449
  control: this
2450
- })
2451
  ]
2452
- });
2453
 
2454
  this.frame.on( 'select', this.onSelectForCrop, this );
2455
  this.frame.on( 'cropped', this.onCropped, this );
@@ -2515,18 +2577,18 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2515
  'use strict';
2516
 
2517
  var control = controller.get( 'control' ),
2518
- flexWidth = !! parseInt( control.params.flex_width, 10 ),
2519
- flexHeight = !! parseInt( control.params.flex_height, 10 ),
2520
- realWidth = attachment.get( 'width' ),
2521
- realHeight = attachment.get( 'height' ),
2522
- xInit = parseInt( control.params.width, 10 ),
2523
- yInit = parseInt( control.params.height, 10 ),
2524
- ratio = xInit / yInit,
2525
- xImg = realWidth,
2526
- yImg = realHeight,
2527
- x1,
2528
- y1,
2529
- imgSelectOptions;
2530
 
2531
  controller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) );
2532
 
@@ -2542,16 +2604,16 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2542
  y1 = ( yImg - yInit ) / 2;
2543
 
2544
  imgSelectOptions = {
2545
- handles: true,
2546
- keys: true,
2547
- instance: true,
2548
- persistent: true,
2549
- imageWidth: realWidth,
2550
  imageHeight: realHeight,
2551
- x1: x1,
2552
- y1: y1,
2553
- x2: xInit + x1,
2554
- y2: yInit + y1
2555
  };
2556
 
2557
  if ( false === flexHeight && false === flexWidth ) {
@@ -2678,7 +2740,7 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2678
  'use strict';
2679
 
2680
  var $targetDiv,
2681
- $uploadButton;
2682
 
2683
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
2684
  return;
@@ -2689,7 +2751,7 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2689
 
2690
  $targetDiv.find( '.kirki-image-attachment' ).slideUp( 'fast', function() {
2691
  jQuery( this ).show().html( jQuery( this ).data( 'placeholder' ) );
2692
- });
2693
  $targetDiv.find( '.hidden-field' ).val( '' );
2694
  $uploadButton.text( $uploadButton.data( 'label' ) );
2695
  this.$thisButton.hide();
@@ -2703,7 +2765,7 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2703
  'use strict';
2704
 
2705
  var $targetDiv,
2706
- $uploadButton;
2707
 
2708
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
2709
  return;
@@ -2714,7 +2776,7 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2714
 
2715
  $targetDiv.find( '.kirki-file-attachment' ).slideUp( 'fast', function() {
2716
  jQuery( this ).show().html( jQuery( this ).data( 'placeholder' ) );
2717
- });
2718
  $targetDiv.find( '.hidden-field' ).val( '' );
2719
  $uploadButton.text( $uploadButton.data( 'label' ) );
2720
  this.$thisButton.hide();
@@ -2749,21 +2811,21 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2749
 
2750
  // We need to filter the values after the first load to remove data requrired for diplay but that we don't want to save in DB
2751
  var filteredValue = newValue,
2752
- filter = [];
2753
 
2754
  if ( filtering ) {
2755
  jQuery.each( this.params.fields, function( index, value ) {
2756
  if ( 'image' === value.type || 'cropped_image' === value.type || 'upload' === value.type ) {
2757
  filter.push( index );
2758
  }
2759
- });
2760
  jQuery.each( newValue, function( index, value ) {
2761
  jQuery.each( filter, function( ind, field ) {
2762
  if ( ! _.isUndefined( value[ field ] ) && ! _.isUndefined( value[ field ].id ) ) {
2763
  filteredValue[index][ field ] = value[ field ].id;
2764
  }
2765
- });
2766
- });
2767
  }
2768
 
2769
  this.setting.set( encodeURI( JSON.stringify( filteredValue ) ) );
@@ -2786,12 +2848,12 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2786
  'use strict';
2787
 
2788
  var control = this,
2789
- template = control.repeaterTemplate(), // The template for the new row (defined on Kirki_Customize_Repeater_Control::render_content() ).
2790
- settingValue = this.getValue(), // Get the current setting value.
2791
- newRowSetting = {}, // Saves the new setting data.
2792
- templateData, // Data to pass to the template
2793
- newRow,
2794
- i;
2795
 
2796
  if ( template ) {
2797
 
@@ -2804,7 +2866,7 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2804
  if ( data ) {
2805
  for ( i in data ) {
2806
  if ( data.hasOwnProperty( i ) && templateData.hasOwnProperty( i ) ) {
2807
- templateData[ i ]['default'] = data[ i ];
2808
  }
2809
  }
2810
  }
@@ -2824,19 +2886,19 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2824
 
2825
  newRow.container.on( 'row:remove', function( e, rowIndex ) {
2826
  control.deleteRow( rowIndex );
2827
- });
2828
 
2829
  newRow.container.on( 'row:update', function( e, rowIndex, fieldName, element ) {
2830
  control.updateField.call( control, e, rowIndex, fieldName, element );
2831
  newRow.updateLabel();
2832
- });
2833
 
2834
  // Add the row to rows collection
2835
  this.rows[ this.currentIndex ] = newRow;
2836
 
2837
  for ( i in templateData ) {
2838
  if ( templateData.hasOwnProperty( i ) ) {
2839
- newRowSetting[ i ] = templateData[ i ]['default'];
2840
  }
2841
  }
2842
 
@@ -2854,22 +2916,22 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2854
  'use strict';
2855
 
2856
  var control = this,
2857
- $rows = this.repeaterFieldsContainer.find( '.repeater-row' ),
2858
- newOrder = [],
2859
- settings = control.getValue(),
2860
- newRows = [],
2861
- newSettings = [];
2862
 
2863
  $rows.each( function( i, element ) {
2864
  newOrder.push( jQuery( element ).data( 'row' ) );
2865
- });
2866
 
2867
  jQuery.each( newOrder, function( newPosition, oldPosition ) {
2868
  newRows[ newPosition ] = control.rows[ oldPosition ];
2869
  newRows[ newPosition ].setRowIndex( newPosition );
2870
 
2871
  newSettings[ newPosition ] = settings[ oldPosition ];
2872
- });
2873
 
2874
  control.rows = newRows;
2875
  control.setValue( newSettings );
@@ -2886,9 +2948,9 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2886
  'use strict';
2887
 
2888
  var currentSettings = this.getValue(),
2889
- row,
2890
- i,
2891
- prop;
2892
 
2893
  if ( currentSettings[ index ] ) {
2894
 
@@ -2930,8 +2992,8 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2930
  'use strict';
2931
 
2932
  var type,
2933
- row,
2934
- currentSettings;
2935
 
2936
  if ( ! this.rows[ rowIndex ] ) {
2937
  return;
@@ -2971,9 +3033,9 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2971
  'use strict';
2972
 
2973
  var control = this,
2974
- colorPicker = control.container.find( '.color-picker-hex' ),
2975
- options = {},
2976
- fieldId = colorPicker.data( 'field' );
2977
 
2978
  // We check if the color palette parameter is defined.
2979
  if ( ! _.isUndefined( fieldId ) && ! _.isUndefined( control.params.fields[ fieldId ] ) && ! _.isUndefined( control.params.fields[ fieldId ].palettes ) && _.isObject( control.params.fields[ fieldId ].palettes ) ) {
@@ -2984,9 +3046,9 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
2984
  options.change = function( event, ui ) {
2985
 
2986
  var currentPicker = jQuery( event.target ),
2987
- row = currentPicker.closest( '.repeater-row' ),
2988
- rowIndex = row.data( 'row' ),
2989
- currentSettings = control.getValue();
2990
 
2991
  currentSettings[ rowIndex ][ currentPicker.data( 'field' ) ] = ui.color.toString();
2992
  control.setValue( currentSettings, true );
@@ -3012,11 +3074,11 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
3012
  'use strict';
3013
 
3014
  var control = this,
3015
- dropdown = theNewRow.container.find( '.repeater-field select' ),
3016
- $select,
3017
- dataField,
3018
- multiple,
3019
- selectWooOptions = {};
3020
 
3021
  if ( 0 === dropdown.length ) {
3022
  return;
@@ -3039,23 +3101,23 @@ wp.customize.controlConstructor.repeater = wp.customize.Control.extend({
3039
  this.container.on( 'change', '.repeater-field select', function( event ) {
3040
 
3041
  var currentDropdown = jQuery( event.target ),
3042
- row = currentDropdown.closest( '.repeater-row' ),
3043
- rowIndex = row.data( 'row' ),
3044
- currentSettings = control.getValue();
3045
 
3046
  currentSettings[ rowIndex ][ currentDropdown.data( 'field' ) ] = jQuery( this ).val();
3047
  control.setValue( currentSettings );
3048
- });
3049
  }
3050
- });
3051
- wp.customize.controlConstructor['kirki-slider'] = wp.customize.kirkiDynamicControl.extend({
3052
 
3053
  initKirkiControl: function() {
3054
  var control = this,
3055
- changeAction = ( 'postMessage' === control.setting.transport ) ? 'mousemove change' : 'change',
3056
  rangeInput = control.container.find( 'input[type="range"]' ),
3057
  textInput = control.container.find( 'input[type="text"]' ),
3058
- value = control.setting._value;
3059
 
3060
  // Set the initial value in the text input.
3061
  textInput.attr( 'value', value );
@@ -3086,14 +3148,14 @@ wp.customize.controlConstructor['kirki-slider'] = wp.customize.kirkiDynamicContr
3086
  // set slider and text input values to default
3087
  // and hen save.
3088
  control.container.find( '.slider-reset' ).on( 'click', function() {
3089
- textInput.attr( 'value', control.params['default'] );
3090
- rangeInput.attr( 'value', control.params['default'] );
3091
  control.setting.set( textInput.val() );
3092
  } );
3093
  }
3094
- });
3095
  /* global kirkiControlLoader */
3096
- wp.customize.controlConstructor['kirki-sortable'] = wp.customize.Control.extend({
3097
 
3098
  // When we're finished loading continue processing
3099
  ready: function() {
@@ -3122,23 +3184,23 @@ wp.customize.controlConstructor['kirki-sortable'] = wp.customize.Control.extend(
3122
  control.sortableContainer = control.container.find( 'ul.sortable' ).first();
3123
 
3124
  // Init sortable.
3125
- control.sortableContainer.sortable({
3126
 
3127
  // Update value when we stop sorting.
3128
  stop: function() {
3129
  control.updateValue();
3130
  }
3131
- }).disableSelection().find( 'li' ).each( function() {
3132
 
3133
  // Enable/disable options when we click on the eye of Thundera.
3134
  jQuery( this ).find( 'i.visibility' ).click( function() {
3135
  jQuery( this ).toggleClass( 'dashicons-visibility-faint' ).parents( 'li:eq(0)' ).toggleClass( 'invisible' );
3136
- });
3137
- }).click( function() {
3138
 
3139
  // Update value on click.
3140
  control.updateValue();
3141
- });
3142
  },
3143
 
3144
  /**
@@ -3149,91 +3211,91 @@ wp.customize.controlConstructor['kirki-sortable'] = wp.customize.Control.extend(
3149
  'use strict';
3150
 
3151
  var control = this,
3152
- newValue = [];
3153
 
3154
  this.sortableContainer.find( 'li' ).each( function() {
3155
  if ( ! jQuery( this ).is( '.invisible' ) ) {
3156
  newValue.push( jQuery( this ).data( 'value' ) );
3157
  }
3158
- });
3159
  control.setting.set( newValue );
3160
  }
3161
- });
3162
- wp.customize.controlConstructor['kirki-switch'] = wp.customize.kirkiDynamicControl.extend({
3163
 
3164
  initKirkiControl: function() {
3165
 
3166
  'use strict';
3167
 
3168
  var control = this,
3169
- checkboxValue = control.setting._value;
3170
 
3171
  // Save the value
3172
  this.container.on( 'change', 'input', function() {
3173
  checkboxValue = ( jQuery( this ).is( ':checked' ) ) ? true : false;
3174
  control.setting.set( checkboxValue );
3175
- });
3176
  }
3177
- });
3178
- wp.customize.controlConstructor['kirki-toggle'] = wp.customize.kirkiDynamicControl.extend({
3179
 
3180
  initKirkiControl: function() {
3181
 
3182
  var control = this,
3183
- checkboxValue = control.setting._value;
3184
 
3185
  // Save the value
3186
  this.container.on( 'change', 'input', function() {
3187
  checkboxValue = ( jQuery( this ).is( ':checked' ) ) ? true : false;
3188
  control.setting.set( checkboxValue );
3189
- });
3190
  }
3191
- });
3192
  /* global kirkiL10n, kirki */
3193
- wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicControl.extend({
3194
 
3195
  initKirkiControl: function() {
3196
 
3197
  'use strict';
3198
 
3199
  var control = this,
3200
- value = control.setting._value,
3201
- picker;
3202
 
3203
  control.renderFontSelector();
3204
  control.renderBackupFontSelector();
3205
  control.renderVariantSelector();
3206
 
3207
  // Font-size.
3208
- if ( control.params['default']['font-size'] ) {
3209
  this.container.on( 'change keyup paste', '.font-size input', function() {
3210
  control.saveValue( 'font-size', jQuery( this ).val() );
3211
  } );
3212
  }
3213
 
3214
  // Line-height.
3215
- if ( control.params['default']['line-height'] ) {
3216
  this.container.on( 'change keyup paste', '.line-height input', function() {
3217
  control.saveValue( 'line-height', jQuery( this ).val() );
3218
  } );
3219
  }
3220
 
3221
  // Margin-top.
3222
- if ( control.params['default']['margin-top'] ) {
3223
  this.container.on( 'change keyup paste', '.margin-top input', function() {
3224
  control.saveValue( 'margin-top', jQuery( this ).val() );
3225
  } );
3226
  }
3227
 
3228
  // Margin-bottom.
3229
- if ( control.params['default']['margin-bottom'] ) {
3230
  this.container.on( 'change keyup paste', '.margin-bottom input', function() {
3231
  control.saveValue( 'margin-bottom', jQuery( this ).val() );
3232
  } );
3233
  }
3234
 
3235
  // Letter-spacing.
3236
- if ( control.params['default']['letter-spacing'] ) {
3237
  value['letter-spacing'] = ( jQuery.isNumeric( value['letter-spacing'] ) ) ? value['letter-spacing'] + 'px' : value['letter-spacing'];
3238
  this.container.on( 'change keyup paste', '.letter-spacing input', function() {
3239
  value['letter-spacing'] = ( jQuery.isNumeric( jQuery( this ).val() ) ) ? jQuery( this ).val() + 'px' : jQuery( this ).val();
@@ -3242,37 +3304,37 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3242
  }
3243
 
3244
  // Word-spacing.
3245
- if ( control.params['default']['word-spacing'] ) {
3246
  this.container.on( 'change keyup paste', '.word-spacing input', function() {
3247
  control.saveValue( 'word-spacing', jQuery( this ).val() );
3248
  } );
3249
  }
3250
 
3251
  // Text-align.
3252
- if ( control.params['default']['text-align'] ) {
3253
  this.container.on( 'change', '.text-align input', function() {
3254
  control.saveValue( 'text-align', jQuery( this ).val() );
3255
  } );
3256
  }
3257
 
3258
  // Text-transform.
3259
- if ( control.params['default']['text-transform'] ) {
3260
  jQuery( control.selector + ' .text-transform select' ).selectWoo().on( 'change', function() {
3261
  control.saveValue( 'text-transform', jQuery( this ).val() );
3262
  } );
3263
  }
3264
 
3265
  // Text-decoration.
3266
- if ( control.params['default']['text-decoration'] ) {
3267
  jQuery( control.selector + ' .text-decoration select' ).selectWoo().on( 'change', function() {
3268
  control.saveValue( 'text-decoration', jQuery( this ).val() );
3269
  } );
3270
  }
3271
 
3272
  // Color.
3273
- if ( control.params['default'].color ) {
3274
  picker = this.container.find( '.kirki-color-control' );
3275
- picker.wpColorPicker({
3276
  change: function() {
3277
  setTimeout( function() {
3278
  control.saveValue( 'color', picker.val() );
@@ -3289,18 +3351,19 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3289
  renderFontSelector: function() {
3290
 
3291
  var control = this,
3292
- selector = control.selector + ' .font-family select',
3293
- data = [],
3294
- standardFonts = [],
3295
- googleFonts = [],
3296
- value = control.setting._value,
3297
- fonts = control.getFonts(),
3298
- fontSelect;
 
3299
 
3300
  // Format standard fonts as an array.
3301
  if ( ! _.isUndefined( fonts.standard ) ) {
3302
  _.each( fonts.standard, function( font ) {
3303
- standardFonts.push({
3304
  id: font.family.replace( /&quot;/g, '&#39' ),
3305
  text: font.label
3306
  } );
@@ -3310,22 +3373,48 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3310
  // Format google fonts as an array.
3311
  if ( ! _.isUndefined( fonts.google ) ) {
3312
  _.each( fonts.google, function( font ) {
3313
- googleFonts.push({
3314
  id: font.family,
3315
  text: font.family
3316
  } );
3317
  } );
3318
  }
3319
 
 
 
 
 
 
 
3320
  // Combine forces and build the final data.
3321
- data = [
3322
- { text: kirkiL10n.defaultCSSValues, children: [{ id: 'inherit', text: 'inherit' }] },
3323
- { text: kirkiL10n.standardFonts, children: standardFonts },
3324
- { text: kirkiL10n.googleFonts, children: googleFonts }
3325
- ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3326
 
3327
  // Instantiate selectWoo with the data.
3328
- fontSelect = jQuery( selector ).selectWoo({
3329
  data: data
3330
  } );
3331
 
@@ -3355,12 +3444,12 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3355
  renderBackupFontSelector: function() {
3356
 
3357
  var control = this,
3358
- selector = control.selector + ' .font-backup select',
3359
- standardFonts = [],
3360
- value = control.setting._value,
3361
- fontFamily = value['font-family'],
3362
- fonts = control.getFonts(),
3363
- fontSelect;
3364
 
3365
  if ( _.isUndefined( value['font-backup'] ) || null === value['font-backup'] ) {
3366
  value['font-backup'] = '';
@@ -3376,7 +3465,7 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3376
  // Format standard fonts as an array.
3377
  if ( ! _.isUndefined( fonts.standard ) ) {
3378
  _.each( fonts.standard, function( font ) {
3379
- standardFonts.push({
3380
  id: font.family.replace( /&quot;/g, '&#39' ),
3381
  text: font.label
3382
  } );
@@ -3384,7 +3473,7 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3384
  }
3385
 
3386
  // Instantiate selectWoo with the data.
3387
- fontSelect = jQuery( selector ).selectWoo({
3388
  data: standardFonts
3389
  } );
3390
 
@@ -3408,24 +3497,37 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3408
  renderVariantSelector: function() {
3409
 
3410
  var control = this,
3411
- value = control.setting._value,
3412
- fontFamily = value['font-family'],
3413
- selector = control.selector + ' .variant select',
3414
- data = [],
3415
- isValid = false,
3416
- fontType = kirki.util.webfonts.getFontType( fontFamily ),
3417
- variants = ['regular', 'italic', '700', '700italic'],
3418
- fontWeight,
3419
- variantSelector,
3420
- fontStyle;
3421
 
3422
  if ( 'google' === fontType ) {
3423
  variants = kirki.util.webfonts.google.getVariants( fontFamily );
3424
  }
3425
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3426
  if ( 'inherit' === fontFamily ) {
3427
  value.variant = 'inherit';
3428
- variants = [''];
3429
  jQuery( control.selector + ' .variant' ).hide();
3430
  }
3431
 
@@ -3436,7 +3538,7 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3436
 
3437
  control.saveValue( 'variant', value.variant );
3438
 
3439
- if ( '' === value.variant ) {
3440
  fontWeight = '';
3441
  fontStyle = '';
3442
  } else {
@@ -3458,7 +3560,7 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3458
  if ( value.variant === variant ) {
3459
  isValid = true;
3460
  }
3461
- data.push({
3462
  id: variant,
3463
  text: variant
3464
  } );
@@ -3473,12 +3575,15 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3473
  }
3474
 
3475
  // Instantiate selectWoo with the data.
3476
- variantSelector = jQuery( selector ).selectWoo({
3477
  data: data
3478
  } );
3479
  variantSelector.val( value.variant ).trigger( 'change' );
3480
  variantSelector.on( 'change', function() {
3481
  control.saveValue( 'variant', jQuery( this ).val() );
 
 
 
3482
 
3483
  fontWeight = ( ! _.isString( value.variant ) ) ? '400' : value.variant.match( /\d/g );
3484
  fontWeight = ( ! _.isObject( fontWeight ) ) ? '400' : fontWeight.join( '' );
@@ -3494,11 +3599,11 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3494
  */
3495
  getFonts: function() {
3496
  var control = this,
3497
- initialGoogleFonts = kirki.util.webfonts.google.getFonts(),
3498
- googleFonts = {},
3499
- googleFontsSort = 'alpha',
3500
  googleFontsNumber = 0,
3501
- standardFonts = {};
3502
 
3503
  // Get google fonts.
3504
  if ( ! _.isEmpty( control.params.choices.fonts.google ) ) {
@@ -3562,8 +3667,8 @@ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicC
3562
  saveValue: function( property, value ) {
3563
 
3564
  var control = this,
3565
- input = control.container.find( '.typography-hidden-value' ),
3566
- val = control.setting._value;
3567
 
3568
  val[ property ] = value;
3569
 
1
  /* jshint -W079 */
2
  /* jshint unused:false */
3
  if ( _.isUndefined( window.kirkiSetSettingValue ) ) {
4
+ var kirkiSetSettingValue = { // eslint-disable-line vars-on-top
5
 
6
  /**
7
  * Set the value of the control.
18
  * and determine if we need to do any further work based on those.
19
  */
20
  var $this = this,
21
+ subControl = wp.customize.settings.controls[ setting ],
22
+ valueJSON;
23
 
24
  // If the control doesn't exist then return.
25
  if ( _.isUndefined( subControl ) ) {
37
  $this.setColorPicker( $this.findElement( setting, '.kirki-color-control' ), value['background-color'] );
38
  }
39
  $this.findElement( setting, '.placeholder, .thumbnail' ).removeClass().addClass( 'placeholder' ).html( 'No file selected' );
40
+ _.each( [ 'background-repeat', 'background-position' ], function( subVal ) {
41
  if ( ! _.isUndefined( value[ subVal ] ) ) {
42
  $this.setSelectWoo( $this.findElement( setting, '.' + subVal + ' select' ), value[ subVal ] );
43
  }
44
+ } );
45
+ _.each( [ 'background-size', 'background-attachment' ], function( subVal ) {
46
  jQuery( $this.findElement( setting, '.' + subVal + ' input[value="' + value + '"]' ) ).prop( 'checked', true );
47
+ } );
48
  valueJSON = JSON.stringify( value ).replace( /'/g, '&#39' );
49
  jQuery( $this.findElement( setting, '.background-hidden-value' ).attr( 'value', valueJSON ) ).trigger( 'change' );
50
  break;
86
  case 'kirki-multicheck':
87
  $this.findElement( setting, 'input' ).each( function() {
88
  jQuery( this ).prop( 'checked', false );
89
+ } );
90
  _.each( value, function( subValue, i ) {
91
  jQuery( $this.findElement( setting, 'input[value="' + value[ i ] + '"]' ) ).prop( 'checked', true );
92
+ } );
93
  break;
94
 
95
  case 'kirki-multicolor':
96
  _.each( value, function( subVal, index ) {
97
  $this.setColorPicker( $this.findElement( setting, '.multicolor-index-' + index ), subVal );
98
+ } );
99
  break;
100
 
101
  case 'kirki-radio-buttonset':
108
  break;
109
 
110
  case 'kirki-typography':
111
+ _.each( [ 'font-family', 'variant' ], function( subVal ) {
112
  if ( ! _.isUndefined( value[ subVal ] ) ) {
113
  $this.setSelectWoo( $this.findElement( setting, '.' + subVal + ' select' ), value[ subVal ] );
114
  }
115
+ } );
116
+ _.each( [ 'font-size', 'line-height', 'letter-spacing', 'word-spacing' ], function( subVal ) {
117
  if ( ! _.isUndefined( value[ subVal ] ) ) {
118
  jQuery( $this.findElement( setting, '.' + subVal + ' input' ) ).prop( 'value', value[ subVal ] );
119
  }
120
+ } );
121
 
122
  if ( ! _.isUndefined( value.color ) ) {
123
  $this.setColorPicker( $this.findElement( setting, '.kirki-color-control' ), value.color );
129
  case 'kirki-dimensions':
130
  _.each( value, function( subValue, id ) {
131
  jQuery( $this.findElement( setting, '.' + id + ' input' ) ).prop( 'value', subValue );
132
+ } );
133
  break;
134
 
135
  case 'kirki-repeater':
202
  */
203
  setValue: function( setting, value, timeout ) {
204
  timeout = ( _.isUndefined( timeout ) ) ? 100 : parseInt( timeout, 10 );
205
+ wp.customize.instance( setting ).set( {} );
206
  setTimeout( function() {
207
  wp.customize.instance( setting ).set( value );
208
  }, timeout );
295
  description: control.params.description,
296
  'data-id': control.id,
297
  inputAttrs: control.params.inputAttrs,
298
+ 'default': control.params.default,
299
  value: kirki.setting.get( control.id ),
300
  choices: control.params.choices
301
  } ) );
355
  mode: control.params.mode,
356
  inputAttrs: control.params.inputAttrs,
357
  'data-palette': control.params.palette,
358
+ 'data-default-color': control.params.default,
359
  'data-alpha': control.params.choices.alpha,
360
  value: kirki.setting.get( control.id )
361
  } ) );
416
  inputAttrs: control.params.inputAttrs,
417
  choices: control.params.choices,
418
  value: kirki.setting.get( control.id )
419
+ },
420
+ template;
421
 
422
  if ( ! _.isUndefined( control.params ) && ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.element ) && 'textarea' === control.params.choices.element ) {
423
  template = wp.template( 'kirki-input-textarea' );
429
  }
430
  },
431
 
432
+ /**
433
+ * The number control.
434
+ *
435
+ * @since 3.0.26
436
+ */
437
+ 'kirki-number': {
438
+
439
+ /**
440
+ * Init the control.
441
+ *
442
+ * @since 3.0.26
443
+ * @param {Object} control - The customizer control object.
444
+ * @returns {null}
445
+ */
446
+ init: function( control ) {
447
+ var self = this;
448
+
449
+ // Render the template.
450
+ self.template( control );
451
+
452
+ // Init the control.
453
+ kirki.input.number.init( control );
454
+ },
455
+
456
+ /**
457
+ * Render the template.
458
+ *
459
+ * @since 3.0.27
460
+ * @param {Object} control - The customizer control object.
461
+ * @param {Object} control.params - The control parameters.
462
+ * @param {string} control.params.label - The control label.
463
+ * @param {string} control.params.description - The control description.
464
+ * @param {string} control.params.inputAttrs - extra input arguments.
465
+ * @param {string} control.params.default - The default value.
466
+ * @param {Object} control.params.choices - Any extra choices we may need.
467
+ * @param {string} control.id - The setting.
468
+ * @returns {null}
469
+ */
470
+ template: function( control ) {
471
+ var template = wp.template( 'kirki-input-number' );
472
+
473
+ control.container.html(
474
+ template( args = {
475
+ label: control.params.label,
476
+ description: control.params.description,
477
+ 'data-id': control.id,
478
+ inputAttrs: control.params.inputAttrs,
479
+ choices: control.params.choices,
480
+ value: kirki.setting.get( control.id )
481
+ } )
482
+ );
483
+ }
484
+ },
485
+
486
  'kirki-select': {
487
 
488
  /**
528
  value: kirki.setting.get( control.id ),
529
  multiple: control.params.multiple || 1,
530
  placeholder: control.params.placeholder
531
+ } ) );
532
  }
533
  }
534
  }
536
  /* global kirkiL10n */
537
  var kirki = kirki || {};
538
  kirki = jQuery.extend( kirki, {
539
+
540
  /**
541
  * An object containing definitions for input fields.
542
  *
565
  // Save the value
566
  input.on( 'change keyup paste click', function() {
567
  kirki.setting.set( control.id, jQuery( this ).val() );
568
+ } );
569
  }
570
  },
571
 
590
  */
591
  init: function( control ) {
592
  var picker = jQuery( '.kirki-color-control[data-id="' + control.id + '"]' ),
593
+ clear;
594
 
595
  control.choices = control.choices || {};
596
  if ( _.isEmpty( control.choices ) && control.params.choices ) {
608
  if ( clear.length ) {
609
  clear.click( function() {
610
  kirki.setting.set( control.id, '' );
611
+ } );
612
  }
613
  }, 200 );
614
 
615
  // Saves our settings to the WP API
616
+ picker.wpColorPicker( {
617
  change: function() {
618
 
619
  // Small hack: the picker needs a small delay
621
  kirki.setting.set( control.id, picker.val() );
622
  }, 20 );
623
  }
624
+ } );
625
  }
626
  },
627
 
646
  // Save the value
647
  input.on( 'change keyup paste click', function() {
648
  kirki.setting.set( control.id, jQuery( this ).val() );
649
+ } );
650
  }
651
  },
652
 
671
  // Save the value
672
  textarea.on( 'change keyup paste click', function() {
673
  kirki.setting.set( control.id, jQuery( this ).val() );
674
+ } );
675
  }
676
  },
677
 
687
  */
688
  init: function( control ) {
689
  var element = jQuery( 'select[data-id="' + control.id + '"]' ),
690
+ multiple = parseInt( element.data( 'multiple' ), 10 ),
691
+ selectValue,
692
+ selectWooOptions = {
693
  escapeMarkup: function( markup ) {
694
  return markup;
695
  }
696
+ };
697
  if ( control.params.placeholder ) {
698
  selectWooOptions.placeholder = control.params.placeholder;
699
  selectWooOptions.allowClear = true;
706
  selectValue = jQuery( this ).val();
707
  selectValue = ( null === selectValue && 1 < multiple ) ? [] : selectValue;
708
  kirki.setting.set( control.id, selectValue );
709
+ } );
710
  }
711
  },
712
 
713
+ /**
714
+ * Number fields.
715
+ *
716
+ * @since 3.0.26
717
+ */
718
+ number: {
719
+
720
+ /**
721
+ * Init the control.
722
+ *
723
+ * @since 3.0.17
724
+ * @param {Object} control - The control object.
725
+ * @param {Object} control.id - The setting.
726
+ * @returns {null}
727
+ */
728
+ init: function( control ) {
729
+
730
+ var element = jQuery( 'input[data-id="' + control.id + '"]' ),
731
+ value = control.setting._value,
732
+ up,
733
+ down;
734
+
735
+ // Make sure we use default values if none are define for some arguments.
736
+ control.params.choices = _.defaults( control.params.choices, {
737
+ min: 0,
738
+ max: 100,
739
+ step: 1
740
+ } );
741
+
742
+ // Make sure we have a valid value.
743
+ if ( isNaN( value ) || '' === value ) {
744
+ value = ( 0 > control.params.choices.min && 0 < control.params.choices.max ) ? 0 : control.params.choices.min;
745
+ }
746
+ value = parseFloat( value );
747
+
748
+ // If step is 'any', set to 0.001.
749
+ control.params.choices.step = ( 'any' === control.params.choices.step ) ? 0.001 : control.params.choices.step;
750
+
751
+ // Make sure choices are properly formtted as numbers.
752
+ control.params.choices.min = parseFloat( control.params.choices.min );
753
+ control.params.choices.max = parseFloat( control.params.choices.max );
754
+ control.params.choices.step = parseFloat( control.params.choices.step );
755
+
756
+ up = jQuery( '.kirki-input-container[data-id="' + control.id + '"] .plus' );
757
+ down = jQuery( '.kirki-input-container[data-id="' + control.id + '"] .minus' );
758
+
759
+ up.click( function() {
760
+ var oldVal = parseFloat( element.val() ),
761
+ newVal;
762
+
763
+ newVal = ( oldVal >= control.params.choices.max ) ? oldVal : oldVal + control.params.choices.step;
764
+
765
+ element.val( newVal );
766
+ element.trigger( 'change' );
767
+ } );
768
+
769
+ down.click( function() {
770
+ var oldVal = parseFloat( element.val() ),
771
+ newVal;
772
+
773
+ newVal = ( oldVal <= control.params.choices.min ) ? oldVal : oldVal - control.params.choices.step;
774
+
775
+ element.val( newVal );
776
+ element.trigger( 'change' );
777
+ } );
778
+
779
+ element.on( 'change keyup paste click', function() {
780
+ kirki.setting.set( control.id, jQuery( this ).val() );
781
+ } );
782
+ }
783
+
784
+ },
785
+
786
  image: {
787
 
788
  /**
794
  */
795
  getTemplate: function( data ) {
796
  var html = '',
797
+ saveAs = 'url',
798
+ url;
799
 
800
  data = _.defaults( data, {
801
  label: '',
830
  }
831
  html += '<div class="actions">';
832
  html += '<button class="button image-upload-remove-button' + ( '' === url ? ' hidden' : '' ) + '">' + kirkiL10n.remove + '</button>';
833
+ if ( data.default && '' !== data.default ) {
834
  html += '<button type="button" class="button image-default-button"';
835
+ if ( data.default === data.value || ( ! _.isUndefined( data.value.url ) && data.default === data.value.url ) ) {
836
  html += ' style="display:none;"';
837
  }
838
+ html += '>' + kirkiL10n.default + '</button>';
839
  }
840
  html += '<button type="button" class="button image-upload-button">' + kirkiL10n.selectFile + '</button>';
841
  html += '</div></div>';
850
  * @param {Object} control - The control object.
851
  * @returns {null}
852
  */
853
+ init: function( control ) {
854
  }
855
  }
856
  }
857
  } );
858
  var kirki = kirki || {};
859
  kirki = jQuery.extend( kirki, {
860
+
861
  /**
862
  * An object containing definitions for settings.
863
  *
878
  */
879
  get: function( setting ) {
880
  var parts = setting.split( '[' ),
881
+ foundSetting = '',
882
+ foundInStep = 0,
883
+ currentVal = '';
884
 
885
  _.each( parts, function( part, i ) {
886
  part = part.replace( ']', '' );
901
  currentVal = currentVal[ part ];
902
  }
903
  }
904
+ } );
905
 
906
  return currentVal;
907
  },
926
  */
927
  set: function( element, value, key ) {
928
  var setting,
929
+ parts,
930
+ currentNode = '',
931
+ foundNode = '',
932
+ subSettingObj = {},
933
+ currentVal,
934
+ subSetting,
935
+ subSettingParts;
936
 
937
  // Get the setting from the element.
938
  setting = element;
949
  return;
950
  }
951
 
952
+ parts = setting.split( '[' );
953
 
954
  // Find the setting we're using in the control using the customizer API.
955
  _.each( parts, function( part, i ) {
1011
  /* global ajaxurl */
1012
  var kirki = kirki || {};
1013
  kirki = jQuery.extend( kirki, {
1014
+
1015
  /**
1016
  * A collection of utility methods.
1017
  *
1085
  */
1086
  getFont: function( family ) {
1087
  var self = this,
1088
+ fonts = self.getFonts();
1089
 
1090
  if ( 'undefined' === typeof fonts[ family ] ) {
1091
  return false;
1103
  */
1104
  getFonts: function( order, category, number ) {
1105
  var self = this,
1106
+ ordered = {},
1107
+ categorized = {},
1108
+ plucked = {};
1109
 
1110
  // Make sure order is correct.
1111
  order = order || 'alpha';
1155
  */
1156
  getVariants: function( family ) {
1157
  var self = this,
1158
+ font = self.getFont( family );
1159
 
1160
  // Early exit if font was not found.
1161
  if ( ! font ) {
1228
  * @since 3.0.17
1229
  * @returns {Array}
1230
  */
1231
+ getVariants: function() {
1232
+ return [ 'regular', 'italic', '700', '700italic' ];
1233
  }
1234
  },
1235
 
1261
  }
1262
  return false;
1263
  }
1264
+ },
1265
+
1266
+ validate: {
1267
+ cssValue: function( value ) {
1268
+
1269
+ var validUnits = [ 'fr', 'rem', 'em', 'ex', '%', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vh', 'vw', 'vmin', 'vmax' ],
1270
+ numericValue,
1271
+ unit;
1272
+
1273
+ // Whitelist values.
1274
+ if ( 0 === value || '0' === value || 'auto' === value || 'inherit' === value || 'initial' === value ) {
1275
+ return true;
1276
+ }
1277
+
1278
+ // Skip checking if calc().
1279
+ if ( 0 <= value.indexOf( 'calc(' ) && 0 <= value.indexOf( ')' ) ) {
1280
+ return true;
1281
+ }
1282
+
1283
+ // Get the numeric value.
1284
+ numericValue = parseFloat( value );
1285
+
1286
+ // Get the unit
1287
+ unit = value.replace( numericValue, '' );
1288
+
1289
+ // Allow unitless.
1290
+ if ( ! value ) {
1291
+ return;
1292
+ }
1293
+
1294
+ // Check the validity of the numeric value and units.
1295
+ return ( ! isNaN( numericValue ) && -1 < jQuery.inArray( unit, validUnits ) );
1296
+ }
1297
  }
1298
  }
1299
  } );
1316
  * @augments wp.customize.Control
1317
  * @augments wp.customize.Class
1318
  */
1319
+ wp.customize.kirkiDynamicControl = wp.customize.Control.extend( {
1320
 
1321
  initialize: function( id, options ) {
1322
  var control = this,
1323
+ args = options || {};
1324
 
1325
  args.params = args.params || {};
1326
  if ( ! args.params.type ) {
1347
  */
1348
  _setUpSettingRootLinks: function() {
1349
  var control = this,
1350
+ nodes = control.container.find( '[data-customize-setting-link]' );
1351
 
1352
  nodes.each( function() {
1353
  var node = jQuery( this );
1369
  */
1370
  _setUpSettingPropertyLinks: function() {
1371
  var control = this,
1372
+ nodes;
1373
 
1374
  if ( ! control.setting ) {
1375
  return;
1379
 
1380
  nodes.each( function() {
1381
  var node = jQuery( this ),
1382
+ element,
1383
+ propertyName = node.data( 'customizeSettingPropertyLink' );
1384
 
1385
  element = new wp.customize.Element( node );
1386
  control.propertyElements.push( element );
1430
  */
1431
  embed: function() {
1432
  var control = this,
1433
+ sectionId = control.section();
1434
 
1435
  if ( ! sectionId ) {
1436
  return;
1494
  this.container.on( 'change keyup paste click', 'input', function() {
1495
  control.setting.set( jQuery( this ).val() );
1496
  } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1497
  }
1498
  } );
1499
  }() );
1500
  _.each( kirki.control, function( obj, type ) {
1501
+ wp.customize.controlConstructor[ type ] = wp.customize.kirkiDynamicControl.extend( {} );
1502
  } );
1503
  /* global kirkiControlLoader */
1504
+ wp.customize.controlConstructor['kirki-background'] = wp.customize.Control.extend( {
1505
 
1506
  // When we're finished loading continue processing
1507
  ready: function() {
1521
  initKirkiControl: function() {
1522
 
1523
  var control = this,
1524
+ value = control.setting._value,
1525
+ picker = control.container.find( '.kirki-color-control' );
1526
 
1527
  // Hide unnecessary controls if the value doesn't have an image.
1528
  if ( _.isUndefined( value['background-image'] ) || '' === value['background-image'] ) {
1533
  }
1534
 
1535
  // Color.
1536
+ picker.wpColorPicker( {
1537
  change: function() {
1538
  setTimeout( function() {
1539
  control.saveValue( 'background-color', picker.val() );
1540
  }, 100 );
1541
  }
1542
+ } );
1543
 
1544
  // Background-Repeat.
1545
  control.container.on( 'change', '.background-repeat select', function() {
1546
  control.saveValue( 'background-repeat', jQuery( this ).val() );
1547
+ } );
1548
 
1549
  // Background-Size.
1550
  control.container.on( 'change click', '.background-size input', function() {
1551
  control.saveValue( 'background-size', jQuery( this ).val() );
1552
+ } );
1553
 
1554
  // Background-Position.
1555
  control.container.on( 'change', '.background-position select', function() {
1556
  control.saveValue( 'background-position', jQuery( this ).val() );
1557
+ } );
1558
 
1559
  // Background-Attachment.
1560
  control.container.on( 'change click', '.background-attachment input', function() {
1561
  control.saveValue( 'background-attachment', jQuery( this ).val() );
1562
+ } );
1563
 
1564
  // Background-Image.
1565
  control.container.on( 'click', '.background-image-upload-button', function( e ) {
1566
+ var image = wp.media( { multiple: false } ).open().on( 'select', function() {
1567
 
1568
  // This will return the selected image from the Media Uploader, the result is an object.
1569
  var uploadedImage = image.state().get( 'selection' ).first(),
1570
+ previewImage = uploadedImage.toJSON().sizes.full.url,
1571
+ imageUrl,
1572
+ imageID,
1573
+ imageWidth,
1574
+ imageHeight,
1575
+ preview,
1576
+ removeButton;
1577
 
1578
  if ( ! _.isUndefined( uploadedImage.toJSON().sizes.medium ) ) {
1579
  previewImage = uploadedImage.toJSON().sizes.medium.url;
1601
  if ( removeButton.length ) {
1602
  removeButton.show();
1603
  }
1604
+ } );
1605
 
1606
  e.preventDefault();
1607
+ } );
1608
 
1609
  control.container.on( 'click', '.background-image-upload-remove-button', function( e ) {
1610
 
1611
  var preview,
1612
+ removeButton;
1613
 
1614
  e.preventDefault();
1615
 
1630
  if ( removeButton.length ) {
1631
  removeButton.hide();
1632
  }
1633
+ } );
1634
  },
1635
 
1636
  /**
1639
  saveValue: function( property, value ) {
1640
 
1641
  var control = this,
1642
+ input = jQuery( '#customize-control-' + control.id.replace( '[', '-' ).replace( ']', '' ) + ' .background-hidden-value' ),
1643
+ val = control.setting._value;
1644
 
1645
  val[ property ] = value;
1646
 
1647
  jQuery( input ).attr( 'value', JSON.stringify( val ) ).trigger( 'change' );
1648
  control.setting.set( val );
1649
  }
1650
+ } );
1651
+ wp.customize.controlConstructor['kirki-color-palette'] = wp.customize.kirkiDynamicControl.extend( {} );
1652
+ wp.customize.controlConstructor['kirki-dashicons'] = wp.customize.kirkiDynamicControl.extend( {} );
1653
+ wp.customize.controlConstructor['kirki-date'] = wp.customize.kirkiDynamicControl.extend( {
1654
 
1655
  initKirkiControl: function() {
1656
  var control = this,
1657
+ selector = control.selector + ' input.datepicker';
1658
 
1659
  // Init the datepicker
1660
  jQuery( selector ).datepicker( {
1670
  }
1671
  } );
1672
  /* global dimensionkirkiL10n */
1673
+ wp.customize.controlConstructor['kirki-dimension'] = wp.customize.kirkiDynamicControl.extend( {
1674
 
1675
  initKirkiControl: function() {
1676
 
1677
  var control = this,
1678
+ value;
1679
 
1680
  // Notifications.
1681
  control.kirkiNotifications();
1685
 
1686
  value = jQuery( this ).val();
1687
  control.setting.set( value );
1688
+ } );
1689
  },
1690
 
1691
  /**
1699
  setting.bind( function( value ) {
1700
  var code = 'long_title';
1701
 
1702
+ if ( false === kirki.util.validate.cssValue( value ) ) {
1703
  setting.notifications.add( code, new wp.customize.Notification(
1704
  code,
1705
  {
1713
  } );
1714
  } );
1715
  }
1716
+ } );
1717
  /* global dimensionskirkiL10n */
1718
+ wp.customize.controlConstructor['kirki-dimensions'] = wp.customize.kirkiDynamicControl.extend( {
1719
 
1720
  initKirkiControl: function() {
1721
 
1722
  var control = this,
1723
+ subControls = control.params.choices.controls,
1724
+ value = {},
1725
+ subsArray = [],
1726
+ i;
1727
 
1728
  _.each( subControls, function( v, i ) {
1729
  if ( true === v ) {
1752
 
1753
  // Save the value
1754
  control.saveValue( value );
1755
+ } );
1756
  },
1757
 
1758
  /**
1761
  saveValue: function( value ) {
1762
 
1763
  var control = this,
1764
+ newValue = {};
1765
 
1766
  _.each( value, function( newSubValue, i ) {
1767
  newValue[ i ] = newSubValue;
1768
+ } );
1769
 
1770
  control.setting.set( newValue );
1771
  },
1780
  wp.customize( control.id, function( setting ) {
1781
  setting.bind( function( value ) {
1782
  var code = 'long_title',
1783
+ subs = {},
1784
+ message;
1785
 
1786
  setting.notifications.remove( code );
1787
 
1788
  _.each( value, function( val, direction ) {
1789
+ if ( false === kirki.util.validate.cssValue( val ) ) {
1790
  subs[ direction ] = val;
1791
  } else {
1792
  delete subs[ direction ];
1805
  } );
1806
  } );
1807
  }
1808
+ } );
1809
  /* global tinyMCE */
1810
+ wp.customize.controlConstructor['kirki-editor'] = wp.customize.kirkiDynamicControl.extend( {
1811
 
1812
  initKirkiControl: function() {
1813
 
1814
  var control = this,
1815
+ element = control.container.find( 'textarea' ),
1816
+ id = 'kirki-editor-' + control.id.replace( '[', '' ).replace( ']', '' ),
1817
+ editor;
1818
 
1819
  wp.editor.initialize( id, {
1820
  tinymce: {
1822
  },
1823
  quicktags: true,
1824
  mediaButtons: true
1825
+ } );
1826
 
1827
  editor = tinyMCE.get( id );
1828
 
1834
  content = editor.getContent();
1835
  element.val( content ).trigger( 'change' );
1836
  wp.customize.instance( control.id ).set( content );
1837
+ } );
1838
  }
1839
  }
1840
+ } );
1841
  /* global fontAwesomeJSON */
1842
+ wp.customize.controlConstructor['kirki-fontawesome'] = wp.customize.kirkiDynamicControl.extend( {
1843
 
1844
  initKirkiControl: function() {
1845
 
1846
  var control = this,
1847
+ element = this.container.find( 'select' ),
1848
+ icons = jQuery.parseJSON( fontAwesomeJSON ),
1849
+ selectValue,
1850
+ selectWooOptions = {
1851
  data: [],
1852
  escapeMarkup: function( markup ) {
1853
  return markup;
1858
  templateSelection: function( val ) {
1859
  return '<i class="fa fa-lg fa-' + val.id + '" aria-hidden="true"></i>' + ' ' + val.text;
1860
  }
1861
+ },
1862
+ select;
1863
 
1864
  _.each( icons.icons, function( icon ) {
1865
+ selectWooOptions.data.push( {
1866
  id: icon.id,
1867
  text: icon.name
1868
+ } );
1869
+ } );
1870
 
1871
  select = jQuery( element ).selectWoo( selectWooOptions );
1872
 
1873
  select.on( 'change', function() {
1874
  selectValue = jQuery( this ).val();
1875
  control.setting.set( selectValue );
1876
+ } );
1877
  select.val( control.setting._value ).trigger( 'change' );
1878
  }
1879
+ } );
1880
  /* global kirkiControlLoader */
1881
+ wp.customize.controlConstructor['kirki-image'] = wp.customize.Control.extend( {
1882
 
1883
  // When we're finished loading continue processing
1884
  ready: function() {
1898
  initKirkiControl: function() {
1899
 
1900
  var control = this,
1901
+ value = control.getValue(),
1902
+ saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url',
1903
+ preview = control.container.find( '.placeholder, .thumbnail' ),
1904
+ previewImage = ( 'array' === saveAs ) ? value.url : value,
1905
+ removeButton = control.container.find( '.image-upload-remove-button' ),
1906
+ defaultButton = control.container.find( '.image-default-button' );
1907
 
1908
  control.container.find( '.kirki-controls-loading-spinner' ).hide();
1909
 
1928
  }
1929
 
1930
  // If value is default, hide the default button.
1931
+ if ( value === control.params.default ) {
1932
  control.container.find( 'image-default-button' ).hide();
1933
  }
1934
 
1937
  }
1938
 
1939
  control.container.on( 'click', '.image-upload-button', function( e ) {
1940
+ var image = wp.media( { multiple: false } ).open().on( 'select', function() {
1941
 
1942
  // This will return the selected image from the Media Uploader, the result is an object.
1943
  var uploadedImage = image.state().get( 'selection' ).first(),
1944
+ previewImage = uploadedImage.toJSON().sizes.full.url;
1945
 
1946
  if ( ! _.isUndefined( uploadedImage.toJSON().sizes.medium ) ) {
1947
  previewImage = uploadedImage.toJSON().sizes.medium.url;
1967
  removeButton.show();
1968
  defaultButton.hide();
1969
  }
1970
+ } );
1971
 
1972
  e.preventDefault();
1973
+ } );
1974
 
1975
  control.container.on( 'click', '.image-upload-remove-button', function( e ) {
1976
 
1977
  var preview,
1978
+ removeButton,
1979
+ defaultButton;
1980
 
1981
  e.preventDefault();
1982
 
1998
  defaultButton.show();
1999
  }
2000
  }
2001
+ } );
2002
 
2003
  control.container.on( 'click', '.image-default-button', function( e ) {
2004
 
2005
  var preview,
2006
+ removeButton,
2007
+ defaultButton;
2008
 
2009
  e.preventDefault();
2010
 
2011
+ control.saveValue( 'url', control.params.default );
2012
 
2013
  preview = control.container.find( '.placeholder, .thumbnail' );
2014
  removeButton = control.container.find( '.image-upload-remove-button' );
2015
  defaultButton = control.container.find( '.image-default-button' );
2016
 
2017
  if ( preview.length ) {
2018
+ preview.removeClass().addClass( 'thumbnail thumbnail-image' ).html( '<img src="' + control.params.default + '" alt="" />' );
2019
  }
2020
  if ( removeButton.length ) {
2021
  removeButton.show();
2022
  defaultButton.hide();
2023
  }
2024
+ } );
2025
  },
2026
 
2027
  /**
2029
  */
2030
  getValue: function() {
2031
  var control = this,
2032
+ value = control.setting._value,
2033
+ saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url';
2034
 
2035
  if ( 'array' === saveAs && _.isString( value ) ) {
2036
  value = {
2045
  */
2046
  saveValue: function( property, value ) {
2047
  var control = this,
2048
+ valueOld = control.setting._value,
2049
+ saveAs = ( ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.save_as ) ) ? control.params.choices.save_as : 'url';
2050
 
2051
  if ( 'array' === saveAs ) {
2052
  if ( _.isString( valueOld ) ) {
2060
  control.setting.set( value );
2061
  control.container.find( 'button' ).trigger( 'change' );
2062
  }
2063
+ } );
2064
+ wp.customize.controlConstructor['kirki-multicheck'] = wp.customize.kirkiDynamicControl.extend( {
2065
 
2066
  initKirkiControl: function() {
2067
 
2070
  // Save the value
2071
  control.container.on( 'change', 'input', function() {
2072
  var value = [],
2073
+ i = 0;
2074
 
2075
  // Build the value as an object using the sub-values from individual checkboxes.
2076
  jQuery.each( control.params.choices, function( key ) {
2077
  if ( control.container.find( 'input[value="' + key + '"]' ).is( ':checked' ) ) {
2078
+ control.container.find( 'input[value="' + key + '"]' ).parent().addClass( 'checked' );
2079
  value[ i ] = key;
2080
  i++;
2081
+ } else {
2082
+ control.container.find( 'input[value="' + key + '"]' ).parent().removeClass( 'checked' );
2083
  }
2084
+ } );
2085
 
2086
  // Update the value in the customizer.
2087
  control.setting.set( value );
2088
+ } );
2089
  }
2090
+ } );
2091
  /* global kirkiControlLoader */
2092
+ wp.customize.controlConstructor['kirki-multicolor'] = wp.customize.Control.extend( {
2093
 
2094
  // When we're finished loading continue processing
2095
  ready: function() {
2111
  'use strict';
2112
 
2113
  var control = this,
2114
+ colors = control.params.choices,
2115
+ keys = Object.keys( colors ),
2116
+ value = this.params.value,
2117
+ i = 0;
2118
 
2119
  // Proxy function that handles changing the individual colors
2120
  function kirkiMulticolorChangeHandler( control, value, subSetting ) {
2121
 
2122
  var picker = control.container.find( '.multicolor-index-' + subSetting ),
2123
+ args = {
2124
  change: function() {
2125
 
2126
  // Color controls require a small delay.
2133
  control.container.find( '.multicolor-index-' + subSetting ).trigger( 'change' );
2134
  }, 100 );
2135
  }
2136
+ };
2137
 
2138
  if ( _.isObject( colors.irisArgs ) ) {
2139
  _.each( colors.irisArgs, function( irisValue, irisKey ) {
2140
  args[ irisKey ] = irisValue;
2141
+ } );
2142
  }
2143
 
2144
  // Did we change the value?
2158
  saveValue: function( property, value ) {
2159
 
2160
  var control = this,
2161
+ input = control.container.find( '.multicolor-hidden-value' ),
2162
+ val = control.setting._value;
2163
 
2164
  val[ property ] = value;
2165
 
2166
  jQuery( input ).attr( 'value', JSON.stringify( val ) ).trigger( 'change' );
2167
  control.setting.set( val );
2168
  }
2169
+ } );
2170
+ wp.customize.controlConstructor['kirki-palette'] = wp.customize.kirkiDynamicControl.extend( {} );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2171
  /* global kirkiSetSettingValue */
2172
+ wp.customize.controlConstructor['kirki-preset'] = wp.customize.kirkiDynamicControl.extend( {
2173
 
2174
  initKirkiControl: function() {
2175
 
2176
  var control = this,
2177
+ selectValue;
2178
 
2179
  // Trigger a change
2180
  this.container.on( 'change', 'select', function() {
2197
  // We'll have to loop through them all and apply the changes needed to them.
2198
  jQuery.each( value.settings, function( presetSetting, presetSettingValue ) {
2199
  kirkiSetSettingValue.set( presetSetting, presetSettingValue );
2200
+ } );
2201
  }
2202
+ } );
2203
  wp.customize.previewer.refresh();
2204
+ } );
2205
  }
2206
+ } );
2207
+ wp.customize.controlConstructor['kirki-radio-buttonset'] = wp.customize.kirkiDynamicControl.extend( {} );
2208
+ wp.customize.controlConstructor['kirki-radio-image'] = wp.customize.kirkiDynamicControl.extend( {} );
2209
  /* global kirkiControlLoader */
2210
  var RepeaterRow = function( rowIndex, container, label, control ) {
2211
 
2215
  this.rowIndex = rowIndex;
2216
  this.container = container;
2217
  this.label = label;
2218
+ this.header = this.container.find( '.repeater-row-header' );
2219
 
2220
  this.header.on( 'click', function() {
2221
  self.toggleMinimize();
2222
+ } );
2223
 
2224
  this.container.on( 'click', '.repeater-row-remove', function() {
2225
  self.remove();
2226
+ } );
2227
 
2228
  this.header.on( 'mousedown', function() {
2229
  self.container.trigger( 'row:start-dragging' );
2230
+ } );
2231
 
2232
  this.container.on( 'keyup change', 'input, select, textarea', function( e ) {
2233
  self.container.trigger( 'row:update', [ self.rowIndex, jQuery( e.target ).data( 'field' ), e.target ] );
2234
+ } );
2235
 
2236
  this.setRowIndex = function( rowIndex ) {
2237
  this.rowIndex = rowIndex;
2250
  this.remove = function() {
2251
  this.container.slideUp( 300, function() {
2252
  jQuery( this ).detach();
2253
+ } );
2254
  this.container.trigger( 'row:remove', [ this.rowIndex ] );
2255
  };
2256
 
2257
  this.updateLabel = function() {
2258
  var rowLabelField,
2259
+ rowLabel,
2260
+ rowLabelSelector;
2261
 
2262
  if ( 'field' === this.label.type ) {
2263
  rowLabelField = this.container.find( '.repeater-field [data-field="' + this.label.field + '"]' );
2286
  this.updateLabel();
2287
  };
2288
 
2289
+ wp.customize.controlConstructor.repeater = wp.customize.Control.extend( {
2290
 
2291
  // When we're finished loading continue processing
2292
  ready: function() {
2308
  'use strict';
2309
 
2310
  var control = this,
2311
+ limit,
2312
+ theNewRow;
2313
 
2314
  // The current value set in Control Class (set in Kirki_Customize_Repeater_Control::to_json() function)
2315
  var settingValue = this.params.value;
2347
  } else {
2348
  jQuery( control.selector + ' .limit' ).addClass( 'highlight' );
2349
  }
2350
+ } );
2351
 
2352
  this.container.on( 'click', '.repeater-row-remove', function() {
2353
  control.currentIndex--;
2354
  if ( ! limit || control.currentIndex < limit ) {
2355
  jQuery( control.selector + ' .limit' ).removeClass( 'highlight' );
2356
  }
2357
+ } );
2358
 
2359
  this.container.on( 'click keypress', '.repeater-field-image .upload-button,.repeater-field-cropped_image .upload-button,.repeater-field-upload .upload-button', function( e ) {
2360
  e.preventDefault();
2361
  control.$thisButton = jQuery( this );
2362
  control.openFrame( e );
2363
+ } );
2364
 
2365
  this.container.on( 'click keypress', '.repeater-field-image .remove-button,.repeater-field-cropped_image .remove-button', function( e ) {
2366
  e.preventDefault();
2367
  control.$thisButton = jQuery( this );
2368
  control.removeImage( e );
2369
+ } );
2370
 
2371
  this.container.on( 'click keypress', '.repeater-field-upload .remove-button', function( e ) {
2372
  e.preventDefault();
2373
  control.$thisButton = jQuery( this );
2374
  control.removeFile( e );
2375
+ } );
2376
 
2377
  /**
2378
  * Function that loads the Mustache template
2379
  */
2380
  this.repeaterTemplate = _.memoize( function() {
2381
  var compiled,
2382
+
2383
+ /*
2384
+ * Underscore's default ERB-style templates are incompatible with PHP
2385
+ * when asp_tags is enabled, so WordPress uses Mustache-inspired templating syntax.
2386
+ *
2387
+ * @see trac ticket #22344.
2388
+ */
2389
+ options = {
2390
  evaluate: /<#([\s\S]+?)#>/g,
2391
  interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
2392
  escape: /\{\{([^\}]+?)\}\}(?!\})/g,
2393
  variable: 'data'
2394
+ };
2395
 
2396
  return function( data ) {
2397
  compiled = _.template( control.container.find( '.customize-control-repeater-content' ).first().html(), null, options );
2398
  return compiled( data );
2399
  };
2400
+ } );
2401
 
2402
  // When we load the control, the fields have not been filled up
2403
  // This is the first time that we create all the rows
2406
  theNewRow = control.addRow( subValue );
2407
  control.initColorPicker();
2408
  control.initSelect( theNewRow, subValue );
2409
+ } );
2410
  }
2411
 
2412
  // Once we have displayed the rows, we cleanup the values
2413
  this.setValue( settingValue, true, true );
2414
 
2415
+ this.repeaterFieldsContainer.sortable( {
2416
  handle: '.repeater-row-header',
2417
  update: function() {
2418
  control.sort();
2419
  }
2420
+ } );
2421
 
2422
  },
2423
 
2447
 
2448
  var libMediaType = this.getMimeType();
2449
 
2450
+ this.frame = wp.media( {
2451
  states: [
2452
+ new wp.media.controller.Library( {
2453
+ library: wp.media.query( { type: libMediaType } ),
2454
  multiple: false,
2455
+ date: false
2456
+ } )
2457
  ]
2458
+ } );
2459
 
2460
  // When a file is selected, run a callback.
2461
  this.frame.on( 'select', this.onSelect, this );
2462
  },
2463
+
2464
  /**
2465
  * Create a media modal select frame, and store it so the instance can be reused when needed.
2466
  * This is mostly a copy/paste of Core api.CroppedImageControl in /wp-admin/js/customize-control.js
2471
 
2472
  // We get the field id from which this was called
2473
  var currentFieldId = this.$thisButton.siblings( 'input.hidden-field' ).attr( 'data-field' ),
2474
+ attrs = [ 'width', 'height', 'flex_width', 'flex_height' ], // A list of attributes to look for
2475
+ libMediaType = this.getMimeType();
2476
 
2477
  // Make sure we got it
2478
  if ( _.isString( currentFieldId ) && '' !== currentFieldId ) {
2493
  }
2494
  }
2495
 
2496
+ this.frame = wp.media( {
2497
  button: {
2498
  text: 'Select and Crop',
2499
  close: false
2500
  },
2501
  states: [
2502
+ new wp.media.controller.Library( {
2503
+ library: wp.media.query( { type: libMediaType } ),
2504
+ multiple: false,
2505
+ date: false,
2506
+ suggestedWidth: this.params.width,
2507
  suggestedHeight: this.params.height
2508
+ } ),
2509
+ new wp.media.controller.CustomizeImageCropper( {
2510
  imgSelectOptions: this.calculateImageSelectOptions,
2511
  control: this
2512
+ } )
2513
  ]
2514
+ } );
2515
 
2516
  this.frame.on( 'select', this.onSelectForCrop, this );
2517
  this.frame.on( 'cropped', this.onCropped, this );
2577
  'use strict';
2578
 
2579
  var control = controller.get( 'control' ),
2580
+ flexWidth = !! parseInt( control.params.flex_width, 10 ),
2581
+ flexHeight = !! parseInt( control.params.flex_height, 10 ),
2582
+ realWidth = attachment.get( 'width' ),
2583
+ realHeight = attachment.get( 'height' ),
2584
+ xInit = parseInt( control.params.width, 10 ),
2585
+ yInit = parseInt( control.params.height, 10 ),
2586
+ ratio = xInit / yInit,
2587
+ xImg = realWidth,
2588
+ yImg = realHeight,
2589
+ x1,
2590
+ y1,
2591
+ imgSelectOptions;
2592
 
2593
  controller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) );
2594
 
2604
  y1 = ( yImg - yInit ) / 2;
2605
 
2606
  imgSelectOptions = {
2607
+ handles: true,
2608
+ keys: true,
2609
+ instance: true,
2610
+ persistent: true,
2611
+ imageWidth: realWidth,
2612
  imageHeight: realHeight,
2613
+ x1: x1,
2614
+ y1: y1,
2615
+ x2: xInit + x1,
2616
+ y2: yInit + y1
2617
  };
2618
 
2619
  if ( false === flexHeight && false === flexWidth ) {
2740
  'use strict';
2741
 
2742
  var $targetDiv,
2743
+ $uploadButton;
2744
 
2745
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
2746
  return;
2751
 
2752
  $targetDiv.find( '.kirki-image-attachment' ).slideUp( 'fast', function() {
2753
  jQuery( this ).show().html( jQuery( this ).data( 'placeholder' ) );
2754
+ } );
2755
  $targetDiv.find( '.hidden-field' ).val( '' );
2756
  $uploadButton.text( $uploadButton.data( 'label' ) );
2757
  this.$thisButton.hide();
2765
  'use strict';
2766
 
2767
  var $targetDiv,
2768
+ $uploadButton;
2769
 
2770
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
2771
  return;
2776
 
2777
  $targetDiv.find( '.kirki-file-attachment' ).slideUp( 'fast', function() {
2778
  jQuery( this ).show().html( jQuery( this ).data( 'placeholder' ) );
2779
+ } );
2780
  $targetDiv.find( '.hidden-field' ).val( '' );
2781
  $uploadButton.text( $uploadButton.data( 'label' ) );
2782
  this.$thisButton.hide();
2811
 
2812
  // We need to filter the values after the first load to remove data requrired for diplay but that we don't want to save in DB
2813
  var filteredValue = newValue,
2814
+ filter = [];
2815
 
2816
  if ( filtering ) {
2817
  jQuery.each( this.params.fields, function( index, value ) {
2818
  if ( 'image' === value.type || 'cropped_image' === value.type || 'upload' === value.type ) {
2819
  filter.push( index );
2820
  }
2821
+ } );
2822
  jQuery.each( newValue, function( index, value ) {
2823
  jQuery.each( filter, function( ind, field ) {
2824
  if ( ! _.isUndefined( value[ field ] ) && ! _.isUndefined( value[ field ].id ) ) {
2825
  filteredValue[index][ field ] = value[ field ].id;
2826
  }
2827
+ } );
2828
+ } );
2829
  }
2830
 
2831
  this.setting.set( encodeURI( JSON.stringify( filteredValue ) ) );
2848
  'use strict';
2849
 
2850
  var control = this,
2851
+ template = control.repeaterTemplate(), // The template for the new row (defined on Kirki_Customize_Repeater_Control::render_content() ).
2852
+ settingValue = this.getValue(), // Get the current setting value.
2853
+ newRowSetting = {}, // Saves the new setting data.
2854
+ templateData, // Data to pass to the template
2855
+ newRow,
2856
+ i;
2857
 
2858
  if ( template ) {
2859
 
2866
  if ( data ) {
2867
  for ( i in data ) {
2868
  if ( data.hasOwnProperty( i ) && templateData.hasOwnProperty( i ) ) {
2869
+ templateData[ i ].default = data[ i ];
2870
  }
2871
  }
2872
  }
2886
 
2887
  newRow.container.on( 'row:remove', function( e, rowIndex ) {
2888
  control.deleteRow( rowIndex );
2889
+ } );
2890
 
2891
  newRow.container.on( 'row:update', function( e, rowIndex, fieldName, element ) {
2892
  control.updateField.call( control, e, rowIndex, fieldName, element );
2893
  newRow.updateLabel();
2894
+ } );
2895
 
2896
  // Add the row to rows collection
2897
  this.rows[ this.currentIndex ] = newRow;
2898
 
2899
  for ( i in templateData ) {
2900
  if ( templateData.hasOwnProperty( i ) ) {
2901
+ newRowSetting[ i ] = templateData[ i ].default;
2902
  }
2903
  }
2904
 
2916
  'use strict';
2917
 
2918
  var control = this,
2919
+ $rows = this.repeaterFieldsContainer.find( '.repeater-row' ),
2920
+ newOrder = [],
2921
+ settings = control.getValue(),
2922
+ newRows = [],
2923
+ newSettings = [];
2924
 
2925
  $rows.each( function( i, element ) {
2926
  newOrder.push( jQuery( element ).data( 'row' ) );
2927
+ } );
2928
 
2929
  jQuery.each( newOrder, function( newPosition, oldPosition ) {
2930
  newRows[ newPosition ] = control.rows[ oldPosition ];
2931
  newRows[ newPosition ].setRowIndex( newPosition );
2932
 
2933
  newSettings[ newPosition ] = settings[ oldPosition ];
2934
+ } );
2935
 
2936
  control.rows = newRows;
2937
  control.setValue( newSettings );
2948
  'use strict';
2949
 
2950
  var currentSettings = this.getValue(),
2951
+ row,
2952
+ i,
2953
+ prop;
2954
 
2955
  if ( currentSettings[ index ] ) {
2956
 
2992
  'use strict';
2993
 
2994
  var type,
2995
+ row,
2996
+ currentSettings;
2997
 
2998
  if ( ! this.rows[ rowIndex ] ) {
2999
  return;
3033
  'use strict';
3034
 
3035
  var control = this,
3036
+ colorPicker = control.container.find( '.color-picker-hex' ),
3037
+ options = {},
3038
+ fieldId = colorPicker.data( 'field' );
3039
 
3040
  // We check if the color palette parameter is defined.
3041
  if ( ! _.isUndefined( fieldId ) && ! _.isUndefined( control.params.fields[ fieldId ] ) && ! _.isUndefined( control.params.fields[ fieldId ].palettes ) && _.isObject( control.params.fields[ fieldId ].palettes ) ) {
3046
  options.change = function( event, ui ) {
3047
 
3048
  var currentPicker = jQuery( event.target ),
3049
+ row = currentPicker.closest( '.repeater-row' ),
3050
+ rowIndex = row.data( 'row' ),
3051
+ currentSettings = control.getValue();
3052
 
3053
  currentSettings[ rowIndex ][ currentPicker.data( 'field' ) ] = ui.color.toString();
3054
  control.setValue( currentSettings, true );
3074
  'use strict';
3075
 
3076
  var control = this,
3077
+ dropdown = theNewRow.container.find( '.repeater-field select' ),
3078
+ $select,
3079
+ dataField,
3080
+ multiple,
3081
+ selectWooOptions = {};
3082
 
3083
  if ( 0 === dropdown.length ) {
3084
  return;
3101
  this.container.on( 'change', '.repeater-field select', function( event ) {
3102
 
3103
  var currentDropdown = jQuery( event.target ),
3104
+ row = currentDropdown.closest( '.repeater-row' ),
3105
+ rowIndex = row.data( 'row' ),
3106
+ currentSettings = control.getValue();
3107
 
3108
  currentSettings[ rowIndex ][ currentDropdown.data( 'field' ) ] = jQuery( this ).val();
3109
  control.setValue( currentSettings );
3110
+ } );
3111
  }
3112
+ } );
3113
+ wp.customize.controlConstructor['kirki-slider'] = wp.customize.kirkiDynamicControl.extend( {
3114
 
3115
  initKirkiControl: function() {
3116
  var control = this,
3117
+ changeAction = ( 'postMessage' === control.setting.transport ) ? 'mousemove change' : 'change',
3118
  rangeInput = control.container.find( 'input[type="range"]' ),
3119
  textInput = control.container.find( 'input[type="text"]' ),
3120
+ value = control.setting._value;
3121
 
3122
  // Set the initial value in the text input.
3123
  textInput.attr( 'value', value );
3148
  // set slider and text input values to default
3149
  // and hen save.
3150
  control.container.find( '.slider-reset' ).on( 'click', function() {
3151
+ textInput.attr( 'value', control.params.default );
3152
+ rangeInput.attr( 'value', control.params.default );
3153
  control.setting.set( textInput.val() );
3154
  } );
3155
  }
3156
+ } );
3157
  /* global kirkiControlLoader */
3158
+ wp.customize.controlConstructor['kirki-sortable'] = wp.customize.Control.extend( {
3159
 
3160
  // When we're finished loading continue processing
3161
  ready: function() {
3184
  control.sortableContainer = control.container.find( 'ul.sortable' ).first();
3185
 
3186
  // Init sortable.
3187
+ control.sortableContainer.sortable( {
3188
 
3189
  // Update value when we stop sorting.
3190
  stop: function() {
3191
  control.updateValue();
3192
  }
3193
+ } ).disableSelection().find( 'li' ).each( function() {
3194
 
3195
  // Enable/disable options when we click on the eye of Thundera.
3196
  jQuery( this ).find( 'i.visibility' ).click( function() {
3197
  jQuery( this ).toggleClass( 'dashicons-visibility-faint' ).parents( 'li:eq(0)' ).toggleClass( 'invisible' );
3198
+ } );
3199
+ } ).click( function() {
3200
 
3201
  // Update value on click.
3202
  control.updateValue();
3203
+ } );
3204
  },
3205
 
3206
  /**
3211
  'use strict';
3212
 
3213
  var control = this,
3214
+ newValue = [];
3215
 
3216
  this.sortableContainer.find( 'li' ).each( function() {
3217
  if ( ! jQuery( this ).is( '.invisible' ) ) {
3218
  newValue.push( jQuery( this ).data( 'value' ) );
3219
  }
3220
+ } );
3221
  control.setting.set( newValue );
3222
  }
3223
+ } );
3224
+ wp.customize.controlConstructor['kirki-switch'] = wp.customize.kirkiDynamicControl.extend( {
3225
 
3226
  initKirkiControl: function() {
3227
 
3228
  'use strict';
3229
 
3230
  var control = this,
3231
+ checkboxValue = control.setting._value;
3232
 
3233
  // Save the value
3234
  this.container.on( 'change', 'input', function() {
3235
  checkboxValue = ( jQuery( this ).is( ':checked' ) ) ? true : false;
3236
  control.setting.set( checkboxValue );
3237
+ } );
3238
  }
3239
+ } );
3240
+ wp.customize.controlConstructor['kirki-toggle'] = wp.customize.kirkiDynamicControl.extend( {
3241
 
3242
  initKirkiControl: function() {
3243
 
3244
  var control = this,
3245
+ checkboxValue = control.setting._value;
3246
 
3247
  // Save the value
3248
  this.container.on( 'change', 'input', function() {
3249
  checkboxValue = ( jQuery( this ).is( ':checked' ) ) ? true : false;
3250
  control.setting.set( checkboxValue );
3251
+ } );
3252
  }
3253
+ } );
3254
  /* global kirkiL10n, kirki */
3255
+ wp.customize.controlConstructor['kirki-typography'] = wp.customize.kirkiDynamicControl.extend( {
3256
 
3257
  initKirkiControl: function() {
3258
 
3259
  'use strict';
3260
 
3261
  var control = this,
3262
+ value = control.setting._value,
3263
+ picker;
3264
 
3265
  control.renderFontSelector();
3266
  control.renderBackupFontSelector();
3267
  control.renderVariantSelector();
3268
 
3269
  // Font-size.
3270
+ if ( control.params.default['font-size'] ) {
3271
  this.container.on( 'change keyup paste', '.font-size input', function() {
3272
  control.saveValue( 'font-size', jQuery( this ).val() );
3273
  } );
3274
  }
3275
 
3276
  // Line-height.
3277
+ if ( control.params.default['line-height'] ) {
3278
  this.container.on( 'change keyup paste', '.line-height input', function() {
3279
  control.saveValue( 'line-height', jQuery( this ).val() );
3280
  } );
3281
  }
3282
 
3283
  // Margin-top.
3284
+ if ( control.params.default['margin-top'] ) {
3285
  this.container.on( 'change keyup paste', '.margin-top input', function() {
3286
  control.saveValue( 'margin-top', jQuery( this ).val() );
3287
  } );
3288
  }
3289
 
3290
  // Margin-bottom.
3291
+ if ( control.params.default['margin-bottom'] ) {
3292
  this.container.on( 'change keyup paste', '.margin-bottom input', function() {
3293
  control.saveValue( 'margin-bottom', jQuery( this ).val() );
3294
  } );
3295
  }
3296
 
3297
  // Letter-spacing.
3298
+ if ( control.params.default['letter-spacing'] ) {
3299
  value['letter-spacing'] = ( jQuery.isNumeric( value['letter-spacing'] ) ) ? value['letter-spacing'] + 'px' : value['letter-spacing'];
3300
  this.container.on( 'change keyup paste', '.letter-spacing input', function() {
3301
  value['letter-spacing'] = ( jQuery.isNumeric( jQuery( this ).val() ) ) ? jQuery( this ).val() + 'px' : jQuery( this ).val();
3304
  }
3305
 
3306
  // Word-spacing.
3307
+ if ( control.params.default['word-spacing'] ) {
3308
  this.container.on( 'change keyup paste', '.word-spacing input', function() {
3309
  control.saveValue( 'word-spacing', jQuery( this ).val() );
3310
  } );
3311
  }
3312
 
3313
  // Text-align.
3314
+ if ( control.params.default['text-align'] ) {
3315
  this.container.on( 'change', '.text-align input', function() {
3316
  control.saveValue( 'text-align', jQuery( this ).val() );
3317
  } );
3318
  }
3319
 
3320
  // Text-transform.
3321
+ if ( control.params.default['text-transform'] ) {
3322
  jQuery( control.selector + ' .text-transform select' ).selectWoo().on( 'change', function() {
3323
  control.saveValue( 'text-transform', jQuery( this ).val() );
3324
  } );
3325
  }
3326
 
3327
  // Text-decoration.
3328
+ if ( control.params.default['text-decoration'] ) {
3329
  jQuery( control.selector + ' .text-decoration select' ).selectWoo().on( 'change', function() {
3330
  control.saveValue( 'text-decoration', jQuery( this ).val() );
3331
  } );
3332
  }
3333
 
3334
  // Color.
3335
+ if ( ! _.isUndefined( control.params.default.color ) ) {
3336
  picker = this.container.find( '.kirki-color-control' );
3337
+ picker.wpColorPicker( {
3338
  change: function() {
3339
  setTimeout( function() {
3340
  control.saveValue( 'color', picker.val() );
3351
  renderFontSelector: function() {
3352
 
3353
  var control = this,
3354
+ selector = control.selector + ' .font-family select',
3355
+ data = [],
3356
+ standardFonts = [],
3357
+ googleFonts = [],
3358
+ value = control.setting._value,
3359
+ fonts = control.getFonts(),
3360
+ fontSelect,
3361
+ controlFontFamilies;
3362
 
3363
  // Format standard fonts as an array.
3364
  if ( ! _.isUndefined( fonts.standard ) ) {
3365
  _.each( fonts.standard, function( font ) {
3366
+ standardFonts.push( {
3367
  id: font.family.replace( /&quot;/g, '&#39' ),
3368
  text: font.label
3369
  } );
3373
  // Format google fonts as an array.
3374
  if ( ! _.isUndefined( fonts.google ) ) {
3375
  _.each( fonts.google, function( font ) {
3376
+ googleFonts.push( {
3377
  id: font.family,
3378
  text: font.family
3379
  } );
3380
  } );
3381
  }
3382
 
3383
+ // Do we have custom fonts?
3384
+ controlFontFamilies = {};
3385
+ if ( ! _.isUndefined( control.params ) && ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.fonts ) && ! _.isUndefined( control.params.choices.fonts.families ) ) {
3386
+ controlFontFamilies = control.params.choices.fonts.families;
3387
+ }
3388
+
3389
  // Combine forces and build the final data.
3390
+ data = jQuery.extend( {}, controlFontFamilies, {
3391
+ default: {
3392
+ text: kirkiL10n.defaultCSSValues,
3393
+ children: [
3394
+ { id: '', text: kirkiL10n.defaultBrowserFamily },
3395
+ { id: 'inherit', text: 'initial' },
3396
+ { id: 'inherit', text: 'inherit' }
3397
+ ]
3398
+ },
3399
+ standard: {
3400
+ text: kirkiL10n.standardFonts,
3401
+ children: standardFonts
3402
+ },
3403
+ google: {
3404
+ text: kirkiL10n.googleFonts,
3405
+ children: googleFonts
3406
+ }
3407
+ } );
3408
+
3409
+ if ( kirkiL10n.isScriptDebug ) {
3410
+ console.info( 'Kirki Debug: Font families for control "' + control.id + '":' );
3411
+ console.info( data );
3412
+ }
3413
+
3414
+ data = _.values( data );
3415
 
3416
  // Instantiate selectWoo with the data.
3417
+ fontSelect = jQuery( selector ).selectWoo( {
3418
  data: data
3419
  } );
3420
 
3444
  renderBackupFontSelector: function() {
3445
 
3446
  var control = this,
3447
+ selector = control.selector + ' .font-backup select',
3448
+ standardFonts = [],
3449
+ value = control.setting._value,
3450
+ fontFamily = value['font-family'],
3451
+ fonts = control.getFonts(),
3452
+ fontSelect;
3453
 
3454
  if ( _.isUndefined( value['font-backup'] ) || null === value['font-backup'] ) {
3455
  value['font-backup'] = '';
3465
  // Format standard fonts as an array.
3466
  if ( ! _.isUndefined( fonts.standard ) ) {
3467
  _.each( fonts.standard, function( font ) {
3468
+ standardFonts.push( {
3469
  id: font.family.replace( /&quot;/g, '&#39' ),
3470
  text: font.label
3471
  } );
3473
  }
3474
 
3475
  // Instantiate selectWoo with the data.
3476
+ fontSelect = jQuery( selector ).selectWoo( {
3477
  data: standardFonts
3478
  } );
3479
 
3497
  renderVariantSelector: function() {
3498
 
3499
  var control = this,
3500
+ value = control.setting._value,
3501
+ fontFamily = value['font-family'],
3502
+ selector = control.selector + ' .variant select',
3503
+ data = [],
3504
+ isValid = false,
3505
+ fontType = kirki.util.webfonts.getFontType( fontFamily ),
3506
+ variants = [ '', 'regular', 'italic', '700', '700italic' ],
3507
+ fontWeight,
3508
+ variantSelector,
3509
+ fontStyle;
3510
 
3511
  if ( 'google' === fontType ) {
3512
  variants = kirki.util.webfonts.google.getVariants( fontFamily );
3513
  }
3514
 
3515
+ // Check if we've got custom variants defined for this font.
3516
+ if ( ! _.isUndefined( control.params ) && ! _.isUndefined( control.params.choices ) && ! _.isUndefined( control.params.choices.fonts ) && ! _.isUndefined( control.params.choices.fonts.variants ) ) {
3517
+
3518
+ // Check if we have variants for this font-family.
3519
+ if ( ! _.isUndefined( control.params.choices.fonts.variants[ fontFamily ] ) ) {
3520
+ variants = control.params.choices.fonts.variants[ fontFamily ];
3521
+ }
3522
+ }
3523
+ if ( kirkiL10n.isScriptDebug ) {
3524
+ console.info( 'Kirki Debug: Font variants for font-family "' + fontFamily + '":' );
3525
+ console.info( variants );
3526
+ }
3527
+
3528
  if ( 'inherit' === fontFamily ) {
3529
  value.variant = 'inherit';
3530
+ variants = [ '' ];
3531
  jQuery( control.selector + ' .variant' ).hide();
3532
  }
3533
 
3538
 
3539
  control.saveValue( 'variant', value.variant );
3540
 
3541
+ if ( '' === value.variant || ! value.variant ) {
3542
  fontWeight = '';
3543
  fontStyle = '';
3544
  } else {
3560
  if ( value.variant === variant ) {
3561
  isValid = true;
3562
  }
3563
+ data.push( {
3564
  id: variant,
3565
  text: variant
3566
  } );
3575
  }
3576
 
3577
  // Instantiate selectWoo with the data.
3578
+ variantSelector = jQuery( selector ).selectWoo( {
3579
  data: data
3580
  } );
3581
  variantSelector.val( value.variant ).trigger( 'change' );
3582
  variantSelector.on( 'change', function() {
3583
  control.saveValue( 'variant', jQuery( this ).val() );
3584
+ if ( 'string' !== typeof value.variant ) {
3585
+ value.variant = variants[0];
3586
+ }
3587
 
3588
  fontWeight = ( ! _.isString( value.variant ) ) ? '400' : value.variant.match( /\d/g );
3589
  fontWeight = ( ! _.isObject( fontWeight ) ) ? '400' : fontWeight.join( '' );
3599
  */
3600
  getFonts: function() {
3601
  var control = this,
3602
+ initialGoogleFonts = kirki.util.webfonts.google.getFonts(),
3603
+ googleFonts = {},
3604
+ googleFontsSort = 'alpha',
3605
  googleFontsNumber = 0,
3606
+ standardFonts = {};
3607
 
3608
  // Get google fonts.
3609
  if ( ! _.isEmpty( control.params.choices.fonts.google ) ) {
3667
  saveValue: function( property, value ) {
3668
 
3669
  var control = this,
3670
+ input = control.container.find( '.typography-hidden-value' ),
3671
+ val = control.setting._value;
3672
 
3673
  val[ property ] = value;
3674
 
controls/js/script.min.js CHANGED
@@ -1 +1 @@
1
- if(_.isUndefined(window.kirkiSetSettingValue))var kirkiSetSettingValue={set:function(e,t){var i,n=this,a=wp.customize.settings.controls[e];if(_.isUndefined(a))return!0;switch(n.setValue(e,t),a.type){case"kirki-background":_.isUndefined(t["background-color"])||n.setColorPicker(n.findElement(e,".kirki-color-control"),t["background-color"]),n.findElement(e,".placeholder, .thumbnail").removeClass().addClass("placeholder").html("No file selected"),_.each(["background-repeat","background-position"],function(i){_.isUndefined(t[i])||n.setSelectWoo(n.findElement(e,"."+i+" select"),t[i])}),_.each(["background-size","background-attachment"],function(i){jQuery(n.findElement(e,"."+i+' input[value="'+t+'"]')).prop("checked",!0)}),i=JSON.stringify(t).replace(/'/g,"&#39"),jQuery(n.findElement(e,".background-hidden-value").attr("value",i)).trigger("change");break;case"kirki-code":jQuery(n.findElement(e,".CodeMirror"))[0].CodeMirror.setValue(t);break;case"checkbox":case"kirki-switch":case"kirki-toggle":t=1===t||"1"===t||!0===t,jQuery(n.findElement(e,"input")).prop("checked",t),wp.customize.instance(e).set(t);break;case"kirki-select":case"kirki-preset":case"kirki-fontawesome":n.setSelectWoo(n.findElement(e,"select"),t);break;case"kirki-slider":jQuery(n.findElement(e,"input")).prop("value",t),jQuery(n.findElement(e,".kirki_range_value .value")).html(t);break;case"kirki-generic":(_.isUndefined(a.choices)||_.isUndefined(a.choices.element))&&(a.choices.element="input"),jQuery(n.findElement(e,a.choices.element)).prop("value",t);break;case"kirki-color":n.setColorPicker(n.findElement(e,".kirki-color-control"),t);break;case"kirki-multicheck":n.findElement(e,"input").each(function(){jQuery(this).prop("checked",!1)}),_.each(t,function(i,a){jQuery(n.findElement(e,'input[value="'+t[a]+'"]')).prop("checked",!0)});break;case"kirki-multicolor":_.each(t,function(t,i){n.setColorPicker(n.findElement(e,".multicolor-index-"+i),t)});break;case"kirki-radio-buttonset":case"kirki-radio-image":case"kirki-radio":case"kirki-dashicons":case"kirki-color-palette":case"kirki-palette":jQuery(n.findElement(e,'input[value="'+t+'"]')).prop("checked",!0);break;case"kirki-typography":_.each(["font-family","variant"],function(i){_.isUndefined(t[i])||n.setSelectWoo(n.findElement(e,"."+i+" select"),t[i])}),_.each(["font-size","line-height","letter-spacing","word-spacing"],function(i){_.isUndefined(t[i])||jQuery(n.findElement(e,"."+i+" input")).prop("value",t[i])}),_.isUndefined(t.color)||n.setColorPicker(n.findElement(e,".kirki-color-control"),t.color),i=JSON.stringify(t).replace(/'/g,"&#39"),jQuery(n.findElement(e,".typography-hidden-value").attr("value",i)).trigger("change");break;case"kirki-dimensions":_.each(t,function(t,i){jQuery(n.findElement(e,"."+i+" input")).prop("value",t)});break;case"kirki-repeater":case"kirki-custom":break;default:jQuery(n.findElement(e,"input")).prop("value",t)}},setColorPicker:function(e,t){e.attr("data-default-color",t).data("default-color",t).wpColorPicker("color",t)},setSelectWoo:function(e,t){jQuery(e).selectWoo().val(t).trigger("change")},setTextarea:function(e,t){jQuery(e).prop("value",t)},findElement:function(e,t){return wp.customize.control(e).container.find(t)},setValue:function(e,t,i){i=_.isUndefined(i)?100:parseInt(i,10),wp.customize.instance(e).set({}),setTimeout(function(){wp.customize.instance(e).set(t)},i)}};(kirki={initialized:!1,initialize:function(){this.initialized||(setTimeout(function(){kirki.util.webfonts.standard.initialize(),kirki.util.webfonts.google.initialize()},150),this.initialized=!0)}}).initialize();var kirki=kirki||{};kirki=(kirki=jQuery.extend(kirki,{control:{"kirki-radio":{init:function(e){this.template(e),kirki.input.radio.init(e)},template:function(e){var t=wp.template("kirki-input-radio");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,default:e.params.default,value:kirki.setting.get(e.id),choices:e.params.choices}))}},"kirki-color":{init:function(e){this.template(e),kirki.input.color.init(e)},template:function(e){var t=wp.template("kirki-input-color");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,mode:e.params.mode,inputAttrs:e.params.inputAttrs,"data-palette":e.params.palette,"data-default-color":e.params.default,"data-alpha":e.params.choices.alpha,value:kirki.setting.get(e.id)}))}},"kirki-generic":{init:function(e){this.template(e),_.isUndefined(e.params)||_.isUndefined(e.params.choices)||_.isUndefined(e.params.choices.element)||"textarea"!==e.params.choices.element?kirki.input.genericInput.init(e):kirki.input.textarea.init(e)},template:function(e){var t,i={label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,choices:e.params.choices,value:kirki.setting.get(e.id)};if(!_.isUndefined(e.params)&&!_.isUndefined(e.params.choices)&&!_.isUndefined(e.params.choices.element)&&"textarea"===e.params.choices.element)return t=wp.template("kirki-input-textarea"),void e.container.html(t(i));t=wp.template("kirki-input-generic"),e.container.html(t(i))}},"kirki-select":{init:function(e){this.template(e),kirki.input.select.init(e)},template:function(e){var t=wp.template("kirki-input-select");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,choices:e.params.choices,value:kirki.setting.get(e.id),multiple:e.params.multiple||1,placeholder:e.params.placeholder}))}}}}))||{},kirki=(kirki=jQuery.extend(kirki,{input:{radio:{init:function(e){jQuery('input[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},color:{init:function(e){var t,i=jQuery('.kirki-color-control[data-id="'+e.id+'"]');e.choices=e.choices||{},_.isEmpty(e.choices)&&e.params.choices&&(e.choices=e.params.choices),_.isEmpty(e.choices)||i.wpColorPicker(e.choices),setTimeout(function(){(t=jQuery('.kirki-input-container[data-id="'+e.id+'"] .wp-picker-clear')).length&&t.click(function(){kirki.setting.set(e.id,"")})},200),i.wpColorPicker({change:function(){setTimeout(function(){kirki.setting.set(e.id,i.val())},20)}})}},genericInput:{init:function(e){jQuery('input[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},textarea:{init:function(e){jQuery('textarea[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},select:{init:function(e){var t,i=jQuery('select[data-id="'+e.id+'"]'),n=parseInt(i.data("multiple"),10),a={escapeMarkup:function(e){return e}};e.params.placeholder&&(a.placeholder=e.params.placeholder,a.allowClear=!0),1<n&&(a.maximumSelectionLength=n),jQuery(i).selectWoo(a).on("change",function(){t=null===(t=jQuery(this).val())&&1<n?[]:t,kirki.setting.set(e.id,t)})}},image:{getTemplate:function(e){var t,i="";return e=_.defaults(e,{label:"",description:"",inputAttrs:"","data-id":"",choices:{},value:""}),_.isUndefined(e.choices)||_.isUndefined(e.choices.save_as)||e.choices.save_as,t=e.value,_.isObject(e.value)&&!_.isUndefined(e.value.url)&&(t=e.value.url),i+="<label>",e.label&&(i+='<span class="customize-control-title">'+e.label+"</span>"),e.description&&(i+='<span class="description customize-control-description">'+e.description+"</span>"),i+="</label>",i+='<div class="image-wrapper attachment-media-view image-upload">',e.value.url||""!==t?i+='<div class="thumbnail thumbnail-image"><img src="'+t+'" alt="" /></div>':i+='<div class="placeholder">'+kirkiL10n.noFileSelected+"</div>",i+='<div class="actions">',i+='<button class="button image-upload-remove-button'+(""===t?" hidden":"")+'">'+kirkiL10n.remove+"</button>",e.default&&""!==e.default&&(i+='<button type="button" class="button image-default-button"',(e.default===e.value||!_.isUndefined(e.value.url)&&e.default===e.value.url)&&(i+=' style="display:none;"'),i+=">"+kirkiL10n.default+"</button>"),i+='<button type="button" class="button image-upload-button">'+kirkiL10n.selectFile+"</button>",i+="</div></div>",'<div class="kirki-input-container" data-id="'+e.id+'">'+i+"</div>"},init:function(e){}}}}))||{},kirki=(kirki=jQuery.extend(kirki,{setting:{get:function(e){var t=e.split("["),i="",n=0,a="";return _.each(t,function(e,t){e=e.replace("]",""),0===t?i=e:i+="["+e+"]",_.isUndefined(wp.customize.instance(i))||(a=wp.customize.instance(i).get(),n=t),n<t&&_.isObject(a)&&!_.isUndefined(a[e])&&(a=a[e])}),a},set:function(e,t,i){var n,a,r,o,s,c="",l="",u={};n=e,_.isObject(e)&&(n=jQuery(e).attr("data-id")?e.attr("data-id"):e.parents("[data-id]").attr("data-id")),void 0===wp.customize.control(n)?(a=n.split("["),_.each(a,function(e,t){e=e.replace("]",""),c=0===t?e:"["+e+"]",_.isUndefined(wp.customize.instance(c))||(l=c,r=wp.customize.instance(l).get())}),""!==(o=n.replace(l,""))?(_.isObject(r)||(r={}),"["===o.charAt(0)&&(o=o.replace("[","")),s=o.split("["),_.each(s,function(e,t){s[t]=e.replace("]","")}),i&&s.push(i),u='{"'+s.join('":{"')+'":"'+t+'"'+"}".repeat(s.length),u=JSON.parse(u),jQuery.extend(!0,r,u),t=r):i&&((r=_.isObject(r)?r:{})[i]=t,t=r),wp.customize.control(l).setting.set(t)):wp.customize.control(n).setting.set(t)}}}))||{};kirki=jQuery.extend(kirki,{util:{webfonts:{google:{fonts:{},initialize:function(){this.setFonts()},setFonts:function(){var e=this;_.isEmpty(e.fonts)&&jQuery.post(ajaxurl,{action:"kirki_fonts_google_all_get"},function(t){e.fonts=JSON.parse(t)})},getFont:function(e){var t=this.getFonts();return void 0!==t[e]&&t[e]},getFonts:function(e,t,i){var n=this,a={},r={},o={};return e="alpha"!==(e=e||"alpha")&&"popularity"!==e&&"trending"!==e?"alpha":e,i=i||0,i=parseInt(i,10),"alpha"===e?a=jQuery.extend({},n.fonts.items):_.each(n.fonts.order[e],function(e){a[e]=n.fonts.items[e]}),""!==t&&t?_.each(a,function(e,i){t===e.category&&(r[i]=e)}):r=a,0<i?(_.each(_.first(_.keys(r),i),function(e){o[e]=r[e]}),o):r},getVariants:function(e){var t=this.getFont(e);return!!t&&(!_.isUndefined(t.variants)&&t.variants)}},standard:{fonts:{},initialize:function(){this.setFonts()},setFonts:function(){var e=this;_.isEmpty(e.fonts)&&jQuery.post(ajaxurl,{action:"kirki_fonts_standard_all_get"},function(t){e.fonts=JSON.parse(t)})},getVariants:function(e){return["regular","italic","700","700italic"]}},getFontType:function(e){return void 0!==this.standard.fonts[e]||void 0!==this.standard.fonts.stack&&void 0!==this.standard.fonts.stack[e]?"standard":void 0!==this.google.fonts.items[e]&&"google"}}}}),function(){"use strict";wp.customize.kirkiDynamicControl=wp.customize.Control.extend({initialize:function(e,t){var i=t||{};i.params=i.params||{},i.params.type||(i.params.type="kirki-generic"),i.params.content||(i.params.content=jQuery("<li></li>"),i.params.content.attr("id","customize-control-"+e.replace(/]/g,"").replace(/\[/g,"-")),i.params.content.attr("class","customize-control customize-control-"+i.params.type)),this.propertyElements=[],wp.customize.Control.prototype.initialize.call(this,e,i)},_setUpSettingRootLinks:function(){var e=this;e.container.find("[data-customize-setting-link]").each(function(){var t=jQuery(this);wp.customize(t.data("customizeSettingLink"),function(i){var n=new wp.customize.Element(t);e.elements.push(n),n.sync(i),n.set(i())})})},_setUpSettingPropertyLinks:function(){var e=this;e.setting&&e.container.find("[data-customize-setting-property-link]").each(function(){var t,i=jQuery(this),n=i.data("customizeSettingPropertyLink");t=new wp.customize.Element(i),e.propertyElements.push(t),t.set(e.setting()[n]),t.bind(function(t){var i=e.setting();t!==i[n]&&((i=_.clone(i))[n]=t,e.setting.set(i))}),e.setting.bind(function(e){e[n]!==t.get()&&t.set(e[n])})})},ready:function(){var e=this;e._setUpSettingRootLinks(),e._setUpSettingPropertyLinks(),wp.customize.Control.prototype.ready.call(e),e.deferred.embedded.done(function(){e.initKirkiControl(e)})},embed:function(){var e=this,t=e.section();t&&wp.customize.section(t,function(t){"kirki-expanded"===t.params.type||t.expanded()||wp.customize.settings.autofocus.control===e.id?e.actuallyEmbed():t.expanded.bind(function(t){t&&e.actuallyEmbed()})})},actuallyEmbed:function(){"resolved"!==this.deferred.embedded.state()&&(this.renderContent(),this.deferred.embedded.resolve())},focus:function(e){this.actuallyEmbed(),wp.customize.Control.prototype.focus.call(this,e)},initKirkiControl:function(e){void 0===kirki.control[e.params.type]?this.container.on("change keyup paste click","input",function(){e.setting.set(jQuery(this).val())}):kirki.control[e.params.type].init(e)},kirkiValidateCSSValue:function(e){var t,i;return"0"===e||0<=e.indexOf("calc(")&&0<=e.indexOf(")")||("auto"===e||"inherit"===e||"initial"===e||(t=parseFloat(e),i=e.replace(t,""),!isNaN(t)&&-1!==jQuery.inArray(i,["rem","em","ex","%","px","cm","mm","in","pt","pc","ch","vh","vw","vmin","vmax"])))}})}(),_.each(kirki.control,function(e,t){wp.customize.controlConstructor[t]=wp.customize.kirkiDynamicControl.extend({})}),wp.customize.controlConstructor["kirki-background"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){var e=this,t=e.setting._value,i=e.container.find(".kirki-color-control");(_.isUndefined(t["background-image"])||""===t["background-image"])&&(e.container.find(".background-wrapper > .background-repeat").hide(),e.container.find(".background-wrapper > .background-position").hide(),e.container.find(".background-wrapper > .background-size").hide(),e.container.find(".background-wrapper > .background-attachment").hide()),i.wpColorPicker({change:function(){setTimeout(function(){e.saveValue("background-color",i.val())},100)}}),e.container.on("change",".background-repeat select",function(){e.saveValue("background-repeat",jQuery(this).val())}),e.container.on("change click",".background-size input",function(){e.saveValue("background-size",jQuery(this).val())}),e.container.on("change",".background-position select",function(){e.saveValue("background-position",jQuery(this).val())}),e.container.on("change click",".background-attachment input",function(){e.saveValue("background-attachment",jQuery(this).val())}),e.container.on("click",".background-image-upload-button",function(t){var i=wp.media({multiple:!1}).open().on("select",function(){var t,n,a,r=i.state().get("selection").first(),o=r.toJSON().sizes.full.url;_.isUndefined(r.toJSON().sizes.medium)?_.isUndefined(r.toJSON().sizes.thumbnail)||(o=r.toJSON().sizes.thumbnail.url):o=r.toJSON().sizes.medium.url,t=r.toJSON().sizes.full.url,r.toJSON().id,r.toJSON().width,r.toJSON().height,""!==t&&e.container.find(".background-wrapper > .background-repeat, .background-wrapper > .background-position, .background-wrapper > .background-size, .background-wrapper > .background-attachment").show(),e.saveValue("background-image",t),n=e.container.find(".placeholder, .thumbnail"),a=e.container.find(".background-image-upload-remove-button"),n.length&&n.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+o+'" alt="" />'),a.length&&a.show()});t.preventDefault()}),e.container.on("click",".background-image-upload-remove-button",function(t){var i,n;t.preventDefault(),e.saveValue("background-image",""),i=e.container.find(".placeholder, .thumbnail"),n=e.container.find(".background-image-upload-remove-button"),e.container.find(".background-wrapper > .background-repeat").hide(),e.container.find(".background-wrapper > .background-position").hide(),e.container.find(".background-wrapper > .background-size").hide(),e.container.find(".background-wrapper > .background-attachment").hide(),i.length&&i.removeClass().addClass("placeholder").html("No file selected"),n.length&&n.hide()})},saveValue:function(e,t){var i=jQuery("#customize-control-"+this.id.replace("[","-").replace("]","")+" .background-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}}),wp.customize.controlConstructor["kirki-color-palette"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-dashicons"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-date"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t=e.selector+" input.datepicker";jQuery(t).datepicker({dateFormat:"yy-mm-dd"}),e.container.find(".kirki-controls-loading-spinner").hide(),this.container.on("change keyup paste","input.datepicker",function(){e.setting.set(jQuery(this).val())})}}),wp.customize.controlConstructor["kirki-dimension"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this;t.kirkiNotifications(),this.container.on("change keyup paste","input",function(){e=jQuery(this).val(),t.setting.set(e)})},kirkiNotifications:function(){var e=this;wp.customize(e.id,function(t){t.bind(function(i){var n="long_title";!1===e.kirkiValidateCSSValue(i)?t.notifications.add(n,new wp.customize.Notification(n,{type:"warning",message:dimensionkirkiL10n["invalid-value"]})):t.notifications.remove(n)})})}}),wp.customize.controlConstructor["kirki-dimensions"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this.params.choices.controls,i={},n=[];for(_.each(t,function(e,t){!0===e&&n.push(t)}),e=0;e<n.length;e++)i[n[e]]=this.setting._value[n[e]],this.updateDimensionsValue(n[e],i)},updateDimensionsValue:function(e,t){var i=this;i.container.on("change keyup paste","."+e+" input",function(){t[e]=jQuery(this).val(),i.kirkiNotifications(),i.saveValue(t)})},saveValue:function(e){var t={};_.each(e,function(e,i){t[i]=e}),this.setting.set(t)},kirkiNotifications:function(){var e=this;wp.customize(e.id,function(t){t.bind(function(i){var n,a="long_title",r={};if(t.notifications.remove(a),_.each(i,function(t,i){!1===e.kirkiValidateCSSValue(t)?r[i]=t:delete r[i]}),!_.isEmpty(r))return n=dimensionskirkiL10n["invalid-value"]+" ("+_.values(r).toString()+") ",void t.notifications.add(a,new wp.customize.Notification(a,{type:"warning",message:n}));t.notifications.remove(a)})})}}),wp.customize.controlConstructor["kirki-editor"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this,i=t.container.find("textarea"),n="kirki-editor-"+t.id.replace("[","").replace("]","");wp.editor.initialize(n,{tinymce:{wpautop:!0},quicktags:!0,mediaButtons:!0}),(e=tinyMCE.get(n))&&e.onChange.add(function(n){var a;n.save(),a=e.getContent(),i.val(a).trigger("change"),wp.customize.instance(t.id).set(a)})}}),wp.customize.controlConstructor["kirki-fontawesome"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t,i=this,n=this.container.find("select"),a=jQuery.parseJSON(fontAwesomeJSON),r={data:[],escapeMarkup:function(e){return e},templateResult:function(e){return'<i class="fa fa-lg fa-'+e.id+'" aria-hidden="true"></i> '+e.text},templateSelection:function(e){return'<i class="fa fa-lg fa-'+e.id+'" aria-hidden="true"></i> '+e.text}};_.each(a.icons,function(e){r.data.push({id:e.id,text:e.name})}),(t=jQuery(n).selectWoo(r)).on("change",function(){e=jQuery(this).val(),i.setting.set(e)}),t.val(i.setting._value).trigger("change")}}),wp.customize.controlConstructor["kirki-image"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){var e=this,t=e.getValue(),i=_.isUndefined(e.params.choices)||_.isUndefined(e.params.choices.save_as)?"url":e.params.choices.save_as,n=e.container.find(".placeholder, .thumbnail"),a="array"===i?t.url:t,r=e.container.find(".image-upload-remove-button"),o=e.container.find(".image-default-button");e.container.find(".kirki-controls-loading-spinner").hide(),"id"!==i&&"ID"!==i||""===t||wp.media.attachment(t).fetch().then(function(){setTimeout(function(){var e=wp.media.attachment(t).get("url");n.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+e+'" alt="" />')},700)}),("url"===i&&""!==t||"array"===i&&!_.isUndefined(t.url)&&""!==t.url)&&e.container.find("image-default-button").hide(),("url"===i&&""===t||"array"===i&&(_.isUndefined(t.url)||""===t.url))&&r.hide(),t===e.params.default&&e.container.find("image-default-button").hide(),""!==a&&n.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+a+'" alt="" />'),e.container.on("click",".image-upload-button",function(t){var a=wp.media({multiple:!1}).open().on("select",function(){var t=a.state().get("selection").first(),s=t.toJSON().sizes.full.url;_.isUndefined(t.toJSON().sizes.medium)?_.isUndefined(t.toJSON().sizes.thumbnail)||(s=t.toJSON().sizes.thumbnail.url):s=t.toJSON().sizes.medium.url,"array"===i?(e.saveValue("id",t.toJSON().id),e.saveValue("url",t.toJSON().sizes.full.url),e.saveValue("width",t.toJSON().width),e.saveValue("height",t.toJSON().height)):"id"===i?e.saveValue("id",t.toJSON().id):e.saveValue("url",t.toJSON().sizes.full.url),n.length&&n.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+s+'" alt="" />'),r.length&&(r.show(),o.hide())});t.preventDefault()}),e.container.on("click",".image-upload-remove-button",function(t){var i,n,a;t.preventDefault(),e.saveValue("id",""),e.saveValue("url",""),e.saveValue("width",""),e.saveValue("height",""),i=e.container.find(".placeholder, .thumbnail"),n=e.container.find(".image-upload-remove-button"),a=e.container.find(".image-default-button"),i.length&&i.removeClass().addClass("placeholder").html("No file selected"),n.length&&(n.hide(),jQuery(a).hasClass("button")&&a.show())}),e.container.on("click",".image-default-button",function(t){var i,n,a;t.preventDefault(),e.saveValue("url",e.params.default),i=e.container.find(".placeholder, .thumbnail"),n=e.container.find(".image-upload-remove-button"),a=e.container.find(".image-default-button"),i.length&&i.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+e.params.default+'" alt="" />'),n.length&&(n.show(),a.hide())})},getValue:function(){var e=this.setting._value;return"array"===(_.isUndefined(this.params.choices)||_.isUndefined(this.params.choices.save_as)?"url":this.params.choices.save_as)&&_.isString(e)&&(e={url:e}),e},saveValue:function(e,t){var i=this,n=i.setting._value;if("array"===(_.isUndefined(i.params.choices)||_.isUndefined(i.params.choices.save_as)?"url":i.params.choices.save_as))return _.isString(n)&&(n={}),n[e]=t,i.setting.set(n),void i.container.find("button").trigger("change");i.setting.set(t),i.container.find("button").trigger("change")}}),wp.customize.controlConstructor["kirki-multicheck"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this;e.container.on("change","input",function(){var t=[],i=0;jQuery.each(e.params.choices,function(n){e.container.find('input[value="'+n+'"]').is(":checked")&&(t[i]=n,i++)}),e.setting.set(t)})}}),wp.customize.controlConstructor["kirki-multicolor"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var e=this.params.choices,t=Object.keys(e),i=(this.params.value,0);function n(t,i,n){var a=t.container.find(".multicolor-index-"+n),r={change:function(){setTimeout(function(){t.saveValue(n,a.val()),t.container.find(".multicolor-index-"+n).trigger("change")},100)}};_.isObject(e.irisArgs)&&_.each(e.irisArgs,function(e,t){r[t]=e}),a.wpColorPicker(r)}for(;i<Object.keys(e).length;)n(this,0,t[i]),i++},saveValue:function(e,t){var i=this.container.find(".multicolor-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}}),wp.customize.controlConstructor["kirki-number"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t,i,n=this,a=n.setting._value,r="";n.params.choices=_.defaults(n.params.choices,{min:0,max:100,step:1}),(isNaN(a)||""===a)&&(a=0>n.params.choices.min&&0<n.params.choices.max?0:n.params.choices.min),a=parseFloat(a),n.params.choices.step="any"===n.params.choices.step?.001:n.params.choices.step,n.params.choices.min=parseFloat(n.params.choices.min),n.params.choices.max=parseFloat(n.params.choices.max),n.params.choices.step=parseFloat(n.params.choices.step),r+="<label>",n.params.label&&(r+='<span class="customize-control-title">'+n.params.label+"</span>"),n.params.description&&(r+='<span class="description customize-control-description">'+n.params.description+"</span>"),r+='<div class="customize-control-content">',r+="<input "+n.params.inputAttrs+' type="text" '+n.params.link+' value="'+a+'" />',r+='<div class="quantity button minus">-</div>',r+='<div class="quantity button plus">+</div>',r+="</div>",r+="</label>",n.container.html(r),e=n.container.find("input"),t=n.container.find(".plus"),i=n.container.find(".minus"),t.click(function(){var t,i=parseFloat(e.val());t=i>=n.params.choices.max?i:i+n.params.choices.step,e.val(t),e.trigger("change")}),i.click(function(){var t,i=parseFloat(e.val());t=i<=n.params.choices.min?i:i-n.params.choices.step,e.val(t),e.trigger("change")}),this.container.on("change keyup paste click","input",function(){n.setting.set(jQuery(this).val())})}}),wp.customize.controlConstructor["kirki-palette"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-preset"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this;this.container.on("change","select",function(){e=jQuery(this).val(),t.setting.set(e),jQuery.each(t.params.choices,function(t,i){e===t&&jQuery.each(i.settings,function(e,t){kirkiSetSettingValue.set(e,t)})}),wp.customize.previewer.refresh()})}}),wp.customize.controlConstructor["kirki-radio-buttonset"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-radio-image"]=wp.customize.kirkiDynamicControl.extend({});var RepeaterRow=function(e,t,i,n){"use strict";var a=this;this.rowIndex=e,this.container=t,this.label=i,this.header=this.container.find(".repeater-row-header"),this.header.on("click",function(){a.toggleMinimize()}),this.container.on("click",".repeater-row-remove",function(){a.remove()}),this.header.on("mousedown",function(){a.container.trigger("row:start-dragging")}),this.container.on("keyup change","input, select, textarea",function(e){a.container.trigger("row:update",[a.rowIndex,jQuery(e.target).data("field"),e.target])}),this.setRowIndex=function(e){this.rowIndex=e,this.container.attr("data-row",e),this.container.data("row",e),this.updateLabel()},this.toggleMinimize=function(){this.container.toggleClass("minimized"),this.header.find(".dashicons").toggleClass("dashicons-arrow-up").toggleClass("dashicons-arrow-down")},this.remove=function(){this.container.slideUp(300,function(){jQuery(this).detach()}),this.container.trigger("row:remove",[this.rowIndex])},this.updateLabel=function(){var e,t,i;if("field"===this.label.type&&(e=this.container.find('.repeater-field [data-field="'+this.label.field+'"]'),_.isFunction(e.val)&&""!==(t=e.val())))return _.isUndefined(n.params.fields[this.label.field])||_.isUndefined(n.params.fields[this.label.field].type)||("select"===n.params.fields[this.label.field].type?_.isUndefined(n.params.fields[this.label.field].choices)||_.isUndefined(n.params.fields[this.label.field].choices[e.val()])||(t=n.params.fields[this.label.field].choices[e.val()]):"radio"!==n.params.fields[this.label.field].type&&"radio-image"!==n.params.fields[this.label.field].type||(i=n.selector+' [data-row="'+this.rowIndex+'"] .repeater-field [data-field="'+this.label.field+'"]:checked',t=jQuery(i).val())),void this.header.find(".repeater-row-label").text(t);this.header.find(".repeater-row-label").text(this.label.value+" "+(this.rowIndex+1))},this.updateLabel()};wp.customize.controlConstructor.repeater=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var e,t,i=this,n=this.params.value;i.container.find(".kirki-controls-loading-spinner").hide(),this.settingField=this.container.find("[data-customize-setting-link]").first(),this.setValue([],!1),this.repeaterFieldsContainer=this.container.find(".repeater-fields").first(),this.currentIndex=0,this.rows=[],e=!1,_.isUndefined(this.params.choices.limit)||(e=!(0>=this.params.choices.limit)&&parseInt(this.params.choices.limit,10)),this.container.on("click","button.repeater-add",function(n){n.preventDefault(),!e||i.currentIndex<e?((t=i.addRow()).toggleMinimize(),i.initColorPicker(),i.initSelect(t)):jQuery(i.selector+" .limit").addClass("highlight")}),this.container.on("click",".repeater-row-remove",function(){i.currentIndex--,(!e||i.currentIndex<e)&&jQuery(i.selector+" .limit").removeClass("highlight")}),this.container.on("click keypress",".repeater-field-image .upload-button,.repeater-field-cropped_image .upload-button,.repeater-field-upload .upload-button",function(e){e.preventDefault(),i.$thisButton=jQuery(this),i.openFrame(e)}),this.container.on("click keypress",".repeater-field-image .remove-button,.repeater-field-cropped_image .remove-button",function(e){e.preventDefault(),i.$thisButton=jQuery(this),i.removeImage(e)}),this.container.on("click keypress",".repeater-field-upload .remove-button",function(e){e.preventDefault(),i.$thisButton=jQuery(this),i.removeFile(e)}),this.repeaterTemplate=_.memoize(function(){var e={evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"};return function(t){return _.template(i.container.find(".customize-control-repeater-content").first().html(),null,e)(t)}}),n.length&&_.each(n,function(e){t=i.addRow(e),i.initColorPicker(),i.initSelect(t,e)}),this.setValue(n,!0,!0),this.repeaterFieldsContainer.sortable({handle:".repeater-row-header",update:function(){i.sort()}})},openFrame:function(e){"use strict";wp.customize.utils.isKeydownButNotEnterEvent(e)||(this.$thisButton.closest(".repeater-field").hasClass("repeater-field-cropped_image")?this.initCropperFrame():this.initFrame(),this.frame.open())},initFrame:function(){"use strict";var e=this.getMimeType();this.frame=wp.media({states:[new wp.media.controller.Library({library:wp.media.query({type:e}),multiple:!1,date:!1})]}),this.frame.on("select",this.onSelect,this)},initCropperFrame:function(){"use strict";var e=this.$thisButton.siblings("input.hidden-field").attr("data-field"),t=this.getMimeType();_.isString(e)&&""!==e&&_.isObject(this.params.fields[e])&&"cropped_image"===this.params.fields[e].type&&["width","height","flex_width","flex_height"].forEach(function(t){_.isUndefined(this.params.fields[e][t])||(this.params[t]=this.params.fields[e][t])}.bind(this)),this.frame=wp.media({button:{text:"Select and Crop",close:!1},states:[new wp.media.controller.Library({library:wp.media.query({type:t}),multiple:!1,date:!1,suggestedWidth:this.params.width,suggestedHeight:this.params.height}),new wp.media.controller.CustomizeImageCropper({imgSelectOptions:this.calculateImageSelectOptions,control:this})]}),this.frame.on("select",this.onSelectForCrop,this),this.frame.on("cropped",this.onCropped,this),this.frame.on("skippedcrop",this.onSkippedCrop,this)},onSelect:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.$thisButton.closest(".repeater-field").hasClass("repeater-field-upload")?this.setFileInRepeaterField(e):this.setImageInRepeaterField(e)},onSelectForCrop:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.params.width!==e.width||this.params.height!==e.height||this.params.flex_width||this.params.flex_height?this.frame.setState("cropper"):this.setImageInRepeaterField(e)},onCropped:function(e){"use strict";this.setImageInRepeaterField(e)},calculateImageSelectOptions:function(e,t){"use strict";var i,n,a,r=t.get("control"),o=!!parseInt(r.params.flex_width,10),s=!!parseInt(r.params.flex_height,10),c=e.get("width"),l=e.get("height"),u=parseInt(r.params.width,10),d=parseInt(r.params.height,10),p=u/d,h=c,f=l;return t.set("canSkipCrop",!r.mustBeCropped(o,s,u,d,c,l)),h/f>p?u=(d=f)*p:d=(u=h)/p,a={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:c,imageHeight:l,x1:i=(h-u)/2,y1:n=(f-d)/2,x2:u+i,y2:d+n},!1===s&&!1===o&&(a.aspectRatio=u+":"+d),!1===s&&(a.maxHeight=d),!1===o&&(a.maxWidth=u),a},mustBeCropped:function(e,t,i,n,a,r){"use strict";return!(!0===e&&!0===t||!0===e&&n===r||!0===t&&i===a||i===a&&n===r||a<=i)},onSkippedCrop:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.setImageInRepeaterField(e)},setImageInRepeaterField:function(e){"use strict";var t=this.$thisButton.closest(".repeater-field-image,.repeater-field-cropped_image");t.find(".kirki-image-attachment").html('<img src="'+e.url+'">').hide().slideDown("slow"),t.find(".hidden-field").val(e.id),this.$thisButton.text(this.$thisButton.data("alt-label")),t.find(".remove-button").show(),t.find("input, textarea, select").trigger("change"),this.frame.close()},setFileInRepeaterField:function(e){"use strict";var t=this.$thisButton.closest(".repeater-field-upload");t.find(".kirki-file-attachment").html('<span class="file"><span class="dashicons dashicons-media-default"></span> '+e.filename+"</span>").hide().slideDown("slow"),t.find(".hidden-field").val(e.id),this.$thisButton.text(this.$thisButton.data("alt-label")),t.find(".upload-button").show(),t.find(".remove-button").show(),t.find("input, textarea, select").trigger("change"),this.frame.close()},getMimeType:function(){"use strict";var e=this.$thisButton.siblings("input.hidden-field").attr("data-field");return _.isString(e)&&""!==e&&_.isObject(this.params.fields[e])&&"upload"===this.params.fields[e].type&&!_.isUndefined(this.params.fields[e].mime_type)?this.params.fields[e].mime_type:"image"},removeImage:function(e){"use strict";var t,i;wp.customize.utils.isKeydownButNotEnterEvent(e)||(i=(t=this.$thisButton.closest(".repeater-field-image,.repeater-field-cropped_image,.repeater-field-upload")).find(".upload-button"),t.find(".kirki-image-attachment").slideUp("fast",function(){jQuery(this).show().html(jQuery(this).data("placeholder"))}),t.find(".hidden-field").val(""),i.text(i.data("label")),this.$thisButton.hide(),t.find("input, textarea, select").trigger("change"))},removeFile:function(e){"use strict";var t,i;wp.customize.utils.isKeydownButNotEnterEvent(e)||(i=(t=this.$thisButton.closest(".repeater-field-upload")).find(".upload-button"),t.find(".kirki-file-attachment").slideUp("fast",function(){jQuery(this).show().html(jQuery(this).data("placeholder"))}),t.find(".hidden-field").val(""),i.text(i.data("label")),this.$thisButton.hide(),t.find("input, textarea, select").trigger("change"))},getValue:function(){"use strict";return JSON.parse(decodeURI(this.setting.get()))},setValue:function(e,t,i){"use strict";var n=e,a=[];i&&(jQuery.each(this.params.fields,function(e,t){"image"!==t.type&&"cropped_image"!==t.type&&"upload"!==t.type||a.push(e)}),jQuery.each(e,function(e,t){jQuery.each(a,function(i,a){_.isUndefined(t[a])||_.isUndefined(t[a].id)||(n[e][a]=t[a].id)})})),this.setting.set(encodeURI(JSON.stringify(n))),t&&this.settingField.trigger("change")},addRow:function(e){"use strict";var t,i,n,a=this,r=a.repeaterTemplate(),o=this.getValue(),s={};if(r){if(t=jQuery.extend(!0,{},a.params.fields),e)for(n in e)e.hasOwnProperty(n)&&t.hasOwnProperty(n)&&(t[n].default=e[n]);for(n in t.index=this.currentIndex,r=r(t),(i=new RepeaterRow(a.currentIndex,jQuery(r).appendTo(a.repeaterFieldsContainer),a.params.row_label,a)).container.on("row:remove",function(e,t){a.deleteRow(t)}),i.container.on("row:update",function(e,t,n,r){a.updateField.call(a,e,t,n,r),i.updateLabel()}),this.rows[this.currentIndex]=i,t)t.hasOwnProperty(n)&&(s[n]=t[n].default);return o[this.currentIndex]=s,this.setValue(o,!0),this.currentIndex++,i}},sort:function(){"use strict";var e=this,t=this.repeaterFieldsContainer.find(".repeater-row"),i=[],n=e.getValue(),a=[],r=[];t.each(function(e,t){i.push(jQuery(t).data("row"))}),jQuery.each(i,function(t,i){a[t]=e.rows[i],a[t].setRowIndex(t),r[t]=n[i]}),e.rows=a,e.setValue(r)},deleteRow:function(e){"use strict";var t,i=this.getValue();for(t in i[e]&&this.rows[e]&&(delete i[e],delete this.rows[e],this.setValue(i,!0)),1,this.rows)this.rows.hasOwnProperty(t)&&this.rows[t]&&(this.rows[t].updateLabel(),0)},updateField:function(e,t,i,n){"use strict";var a,r,o;this.rows[t]&&this.params.fields[i]&&(a=this.params.fields[i].type,r=this.rows[t],o=this.getValue(),n=jQuery(n),_.isUndefined(o[r.rowIndex][i])||(o[r.rowIndex][i]="checkbox"===a?n.is(":checked"):n.val(),this.setValue(o,!0)))},initColorPicker:function(){"use strict";var e=this,t=e.container.find(".color-picker-hex"),i={},n=t.data("field");_.isUndefined(n)||_.isUndefined(e.params.fields[n])||_.isUndefined(e.params.fields[n].palettes)||!_.isObject(e.params.fields[n].palettes)||(i.palettes=e.params.fields[n].palettes),i.change=function(t,i){var n=jQuery(t.target),a=n.closest(".repeater-row").data("row"),r=e.getValue();r[a][n.data("field")]=i.color.toString(),e.setValue(r,!0)},0!==t.length&&t.wpColorPicker(i)},initSelect:function(e,t){"use strict";var i,n,a=this,r=e.container.find(".repeater-field select"),o={};0!==r.length&&(i=r.data("field"),"undefed"!==(n=jQuery(r).data("multiple"))&&jQuery.isNumeric(n)&&1<(n=parseInt(n,10))&&(o.maximumSelectionLength=n),(t=t||{})[i]=t[i]||"",jQuery(r).selectWoo(o).val(t[i]),this.container.on("change",".repeater-field select",function(e){var t=jQuery(e.target),i=t.closest(".repeater-row").data("row"),n=a.getValue();n[i][t.data("field")]=jQuery(this).val(),a.setValue(n)}))}}),wp.customize.controlConstructor["kirki-slider"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t="postMessage"===e.setting.transport?"mousemove change":"change",i=e.container.find('input[type="range"]'),n=e.container.find('input[type="text"]'),a=e.setting._value;n.attr("value",a),i.on("mousemove change",function(){n.attr("value",i.val())}),i.on(t,function(){e.setting.set(i.val())}),n.on("input paste change",function(){i.attr("value",n.val()),e.setting.set(n.val())}),e.container.find(".slider-reset").on("click",function(){n.attr("value",e.params.default),i.attr("value",e.params.default),e.setting.set(n.val())})}}),wp.customize.controlConstructor["kirki-sortable"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var e=this;e.container.find(".kirki-controls-loading-spinner").hide(),e.sortableContainer=e.container.find("ul.sortable").first(),e.sortableContainer.sortable({stop:function(){e.updateValue()}}).disableSelection().find("li").each(function(){jQuery(this).find("i.visibility").click(function(){jQuery(this).toggleClass("dashicons-visibility-faint").parents("li:eq(0)").toggleClass("invisible")})}).click(function(){e.updateValue()})},updateValue:function(){"use strict";var e=[];this.sortableContainer.find("li").each(function(){jQuery(this).is(".invisible")||e.push(jQuery(this).data("value"))}),this.setting.set(e)}}),wp.customize.controlConstructor["kirki-switch"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){"use strict";var e=this,t=e.setting._value;this.container.on("change","input",function(){t=!!jQuery(this).is(":checked"),e.setting.set(t)})}}),wp.customize.controlConstructor["kirki-toggle"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t=e.setting._value;this.container.on("change","input",function(){t=!!jQuery(this).is(":checked"),e.setting.set(t)})}}),wp.customize.controlConstructor["kirki-typography"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){"use strict";var e,t=this,i=t.setting._value;t.renderFontSelector(),t.renderBackupFontSelector(),t.renderVariantSelector(),t.params.default["font-size"]&&this.container.on("change keyup paste",".font-size input",function(){t.saveValue("font-size",jQuery(this).val())}),t.params.default["line-height"]&&this.container.on("change keyup paste",".line-height input",function(){t.saveValue("line-height",jQuery(this).val())}),t.params.default["margin-top"]&&this.container.on("change keyup paste",".margin-top input",function(){t.saveValue("margin-top",jQuery(this).val())}),t.params.default["margin-bottom"]&&this.container.on("change keyup paste",".margin-bottom input",function(){t.saveValue("margin-bottom",jQuery(this).val())}),t.params.default["letter-spacing"]&&(i["letter-spacing"]=jQuery.isNumeric(i["letter-spacing"])?i["letter-spacing"]+"px":i["letter-spacing"],this.container.on("change keyup paste",".letter-spacing input",function(){i["letter-spacing"]=jQuery.isNumeric(jQuery(this).val())?jQuery(this).val()+"px":jQuery(this).val(),t.saveValue("letter-spacing",i["letter-spacing"])})),t.params.default["word-spacing"]&&this.container.on("change keyup paste",".word-spacing input",function(){t.saveValue("word-spacing",jQuery(this).val())}),t.params.default["text-align"]&&this.container.on("change",".text-align input",function(){t.saveValue("text-align",jQuery(this).val())}),t.params.default["text-transform"]&&jQuery(t.selector+" .text-transform select").selectWoo().on("change",function(){t.saveValue("text-transform",jQuery(this).val())}),t.params.default["text-decoration"]&&jQuery(t.selector+" .text-decoration select").selectWoo().on("change",function(){t.saveValue("text-decoration",jQuery(this).val())}),t.params.default.color&&(e=this.container.find(".kirki-color-control")).wpColorPicker({change:function(){setTimeout(function(){t.saveValue("color",e.val())},100)}})},renderFontSelector:function(){var e,t,i=this,n=i.selector+" .font-family select",a=[],r=[],o=i.setting._value,s=i.getFonts();_.isUndefined(s.standard)||_.each(s.standard,function(e){a.push({id:e.family.replace(/&quot;/g,"&#39"),text:e.label})}),_.isUndefined(s.google)||_.each(s.google,function(e){r.push({id:e.family,text:e.family})}),e=[{text:kirkiL10n.defaultCSSValues,children:[{id:"inherit",text:"inherit"}]},{text:kirkiL10n.standardFonts,children:a},{text:kirkiL10n.googleFonts,children:r}],t=jQuery(n).selectWoo({data:e}),o["font-family"]&&t.val(o["font-family"].replace(/'/g,'"')).trigger("change"),t.on("change",function(){i.saveValue("font-family",jQuery(this).val()),i.renderBackupFontSelector(),i.renderVariantSelector()})},renderBackupFontSelector:function(){var e,t=this,i=t.selector+" .font-backup select",n=[],a=t.setting._value,r=a["font-family"],o=t.getFonts();(_.isUndefined(a["font-backup"])||null===a["font-backup"])&&(a["font-backup"]=""),"inherit"!==r&&"google"===kirki.util.webfonts.getFontType(r)?(jQuery(t.selector+" .font-backup").show(),_.isUndefined(o.standard)||_.each(o.standard,function(e){n.push({id:e.family.replace(/&quot;/g,"&#39"),text:e.label})}),e=jQuery(i).selectWoo({data:n}),void 0!==a["font-backup"]&&e.val(a["font-backup"].replace(/'/g,'"')).trigger("change"),e.on("change",function(){t.saveValue("font-backup",jQuery(this).val())})):jQuery(t.selector+" .font-backup").hide()},renderVariantSelector:function(){var e,t,i,n=this,a=n.setting._value,r=a["font-family"],o=n.selector+" .variant select",s=[],c=!1,l=["regular","italic","700","700italic"];if("google"===kirki.util.webfonts.getFontType(r)&&(l=kirki.util.webfonts.google.getVariants(r)),"inherit"===r&&(a.variant="inherit",l=[""],jQuery(n.selector+" .variant").hide()),1>=l.length)return jQuery(n.selector+" .variant").hide(),a.variant=l[0],n.saveValue("variant",a.variant),""===a.variant?(e="",i=""):(e=_.isString(a.variant)?a.variant.match(/\d/g):"400",e=_.isObject(e)?e.join(""):"400",i=-1!==a.variant.indexOf("italic")?"italic":"normal"),n.saveValue("font-weight",e),void n.saveValue("font-style",i);jQuery(n.selector+" .font-backup").show(),jQuery(n.selector+" .variant").show(),_.each(l,function(e){a.variant===e&&(c=!0),s.push({id:e,text:e})}),c||(a.variant="regular"),jQuery(o).hasClass("select2-hidden-accessible")&&(jQuery(o).selectWoo("destroy"),jQuery(o).empty()),(t=jQuery(o).selectWoo({data:s})).val(a.variant).trigger("change"),t.on("change",function(){n.saveValue("variant",jQuery(this).val()),e=_.isString(a.variant)?a.variant.match(/\d/g):"400",e=_.isObject(e)?e.join(""):"400",i=-1!==a.variant.indexOf("italic")?"italic":"normal",n.saveValue("font-weight",e),n.saveValue("font-style",i)})},getFonts:function(){var e=this,t=kirki.util.webfonts.google.getFonts(),i={},n="alpha",a=0,r={};return _.isEmpty(e.params.choices.fonts.google)?i=kirki.util.webfonts.google.getFonts(n,"",a):"alpha"===e.params.choices.fonts.google[0]||"popularity"===e.params.choices.fonts.google[0]||"trending"===e.params.choices.fonts.google[0]?(n=e.params.choices.fonts.google[0],isNaN(e.params.choices.fonts.google[1])||(a=parseInt(e.params.choices.fonts.google[1],10)),i=kirki.util.webfonts.google.getFonts(n,"",a)):_.each(e.params.choices.fonts.google,function(e){void 0===t[e]||_.isEmpty(t[e])||(i[e]=t[e])}),_.isEmpty(e.params.choices.fonts.standard)?_.each(kirki.util.webfonts.standard.fonts,function(e,t){r[t]={family:e.stack,label:e.label}}):_.each(e.params.choices.fonts.standard,function(e){void 0===kirki.util.webfonts.standard.fonts[e]||_.isEmpty(kirki.util.webfonts.standard.fonts[e])?r[e]={family:e,label:e}:(r[e]={},"undefined"===kirki.util.webfonts.standard.fonts[e].stack||_.isEmpty(kirki.util.webfonts.standard.fonts[e].stack)?r[e].family=i[e]:r[e].family=kirki.util.webfonts.standard.fonts[e].stack,"undefined"===kirki.util.webfonts.standard.fonts[e].label||_.isEmpty(kirki.util.webfonts.standard.fonts[e].label)?_.isEmpty(r[e])||(r[e].label=r[e]):r[e].label=kirki.util.webfonts.standard.fonts[e].label)}),{google:i,standard:r}},saveValue:function(e,t){var i=this.container.find(".typography-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}});
1
+ if(_.isUndefined(window.kirkiSetSettingValue))var kirkiSetSettingValue={set:function(i,n){var e,a=this,t=wp.customize.settings.controls[i];if(_.isUndefined(t))return!0;switch(a.setValue(i,n),t.type){case"kirki-background":_.isUndefined(n["background-color"])||a.setColorPicker(a.findElement(i,".kirki-color-control"),n["background-color"]),a.findElement(i,".placeholder, .thumbnail").removeClass().addClass("placeholder").html("No file selected"),_.each(["background-repeat","background-position"],function(e){_.isUndefined(n[e])||a.setSelectWoo(a.findElement(i,"."+e+" select"),n[e])}),_.each(["background-size","background-attachment"],function(e){jQuery(a.findElement(i,"."+e+' input[value="'+n+'"]')).prop("checked",!0)}),e=JSON.stringify(n).replace(/'/g,"&#39"),jQuery(a.findElement(i,".background-hidden-value").attr("value",e)).trigger("change");break;case"kirki-code":jQuery(a.findElement(i,".CodeMirror"))[0].CodeMirror.setValue(n);break;case"checkbox":case"kirki-switch":case"kirki-toggle":n=1===n||"1"===n||!0===n,jQuery(a.findElement(i,"input")).prop("checked",n),wp.customize.instance(i).set(n);break;case"kirki-select":case"kirki-preset":case"kirki-fontawesome":a.setSelectWoo(a.findElement(i,"select"),n);break;case"kirki-slider":jQuery(a.findElement(i,"input")).prop("value",n),jQuery(a.findElement(i,".kirki_range_value .value")).html(n);break;case"kirki-generic":(_.isUndefined(t.choices)||_.isUndefined(t.choices.element))&&(t.choices.element="input"),jQuery(a.findElement(i,t.choices.element)).prop("value",n);break;case"kirki-color":a.setColorPicker(a.findElement(i,".kirki-color-control"),n);break;case"kirki-multicheck":a.findElement(i,"input").each(function(){jQuery(this).prop("checked",!1)}),_.each(n,function(e,t){jQuery(a.findElement(i,'input[value="'+n[t]+'"]')).prop("checked",!0)});break;case"kirki-multicolor":_.each(n,function(e,t){a.setColorPicker(a.findElement(i,".multicolor-index-"+t),e)});break;case"kirki-radio-buttonset":case"kirki-radio-image":case"kirki-radio":case"kirki-dashicons":case"kirki-color-palette":case"kirki-palette":jQuery(a.findElement(i,'input[value="'+n+'"]')).prop("checked",!0);break;case"kirki-typography":_.each(["font-family","variant"],function(e){_.isUndefined(n[e])||a.setSelectWoo(a.findElement(i,"."+e+" select"),n[e])}),_.each(["font-size","line-height","letter-spacing","word-spacing"],function(e){_.isUndefined(n[e])||jQuery(a.findElement(i,"."+e+" input")).prop("value",n[e])}),_.isUndefined(n.color)||a.setColorPicker(a.findElement(i,".kirki-color-control"),n.color),e=JSON.stringify(n).replace(/'/g,"&#39"),jQuery(a.findElement(i,".typography-hidden-value").attr("value",e)).trigger("change");break;case"kirki-dimensions":_.each(n,function(e,t){jQuery(a.findElement(i,"."+t+" input")).prop("value",e)});break;case"kirki-repeater":case"kirki-custom":break;default:jQuery(a.findElement(i,"input")).prop("value",n)}},setColorPicker:function(e,t){e.attr("data-default-color",t).data("default-color",t).wpColorPicker("color",t)},setSelectWoo:function(e,t){jQuery(e).selectWoo().val(t).trigger("change")},setTextarea:function(e,t){jQuery(e).prop("value",t)},findElement:function(e,t){return wp.customize.control(e).container.find(t)},setValue:function(e,t,i){i=_.isUndefined(i)?100:parseInt(i,10),wp.customize.instance(e).set({}),setTimeout(function(){wp.customize.instance(e).set(t)},i)}};(kirki={initialized:!1,initialize:function(){this.initialized||(setTimeout(function(){kirki.util.webfonts.standard.initialize(),kirki.util.webfonts.google.initialize()},150),this.initialized=!0)}}).initialize();var kirki=kirki||{};kirki=(kirki=jQuery.extend(kirki,{control:{"kirki-radio":{init:function(e){this.template(e),kirki.input.radio.init(e)},template:function(e){var t=wp.template("kirki-input-radio");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,default:e.params.default,value:kirki.setting.get(e.id),choices:e.params.choices}))}},"kirki-color":{init:function(e){this.template(e),kirki.input.color.init(e)},template:function(e){var t=wp.template("kirki-input-color");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,mode:e.params.mode,inputAttrs:e.params.inputAttrs,"data-palette":e.params.palette,"data-default-color":e.params.default,"data-alpha":e.params.choices.alpha,value:kirki.setting.get(e.id)}))}},"kirki-generic":{init:function(e){this.template(e),_.isUndefined(e.params)||_.isUndefined(e.params.choices)||_.isUndefined(e.params.choices.element)||"textarea"!==e.params.choices.element?kirki.input.genericInput.init(e):kirki.input.textarea.init(e)},template:function(e){var t,i={label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,choices:e.params.choices,value:kirki.setting.get(e.id)};if(!_.isUndefined(e.params)&&!_.isUndefined(e.params.choices)&&!_.isUndefined(e.params.choices.element)&&"textarea"===e.params.choices.element)return t=wp.template("kirki-input-textarea"),void e.container.html(t(i));t=wp.template("kirki-input-generic"),e.container.html(t(i))}},"kirki-number":{init:function(e){this.template(e),kirki.input.number.init(e)},template:function(e){var t=wp.template("kirki-input-number");e.container.html(t(args={label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,choices:e.params.choices,value:kirki.setting.get(e.id)}))}},"kirki-select":{init:function(e){this.template(e),kirki.input.select.init(e)},template:function(e){var t=wp.template("kirki-input-select");e.container.html(t({label:e.params.label,description:e.params.description,"data-id":e.id,inputAttrs:e.params.inputAttrs,choices:e.params.choices,value:kirki.setting.get(e.id),multiple:e.params.multiple||1,placeholder:e.params.placeholder}))}}}}))||{},kirki=(kirki=jQuery.extend(kirki,{input:{radio:{init:function(e){jQuery('input[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},color:{init:function(e){var t,i=jQuery('.kirki-color-control[data-id="'+e.id+'"]');e.choices=e.choices||{},_.isEmpty(e.choices)&&e.params.choices&&(e.choices=e.params.choices),_.isEmpty(e.choices)||i.wpColorPicker(e.choices),setTimeout(function(){(t=jQuery('.kirki-input-container[data-id="'+e.id+'"] .wp-picker-clear')).length&&t.click(function(){kirki.setting.set(e.id,"")})},200),i.wpColorPicker({change:function(){setTimeout(function(){kirki.setting.set(e.id,i.val())},20)}})}},genericInput:{init:function(e){jQuery('input[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},textarea:{init:function(e){jQuery('textarea[data-id="'+e.id+'"]').on("change keyup paste click",function(){kirki.setting.set(e.id,jQuery(this).val())})}},select:{init:function(e){var t,i=jQuery('select[data-id="'+e.id+'"]'),n=parseInt(i.data("multiple"),10),a={escapeMarkup:function(e){return e}};e.params.placeholder&&(a.placeholder=e.params.placeholder,a.allowClear=!0),1<n&&(a.maximumSelectionLength=n),jQuery(i).selectWoo(a).on("change",function(){t=null===(t=jQuery(this).val())&&1<n?[]:t,kirki.setting.set(e.id,t)})}},number:{init:function(i){var e,t,n=jQuery('input[data-id="'+i.id+'"]'),a=i.setting._value;i.params.choices=_.defaults(i.params.choices,{min:0,max:100,step:1}),(isNaN(a)||""===a)&&(a=i.params.choices.min<0&&0<i.params.choices.max?0:i.params.choices.min),a=parseFloat(a),i.params.choices.step="any"===i.params.choices.step?.001:i.params.choices.step,i.params.choices.min=parseFloat(i.params.choices.min),i.params.choices.max=parseFloat(i.params.choices.max),i.params.choices.step=parseFloat(i.params.choices.step),e=jQuery('.kirki-input-container[data-id="'+i.id+'"] .plus'),t=jQuery('.kirki-input-container[data-id="'+i.id+'"] .minus'),e.click(function(){var e,t=parseFloat(n.val());e=t>=i.params.choices.max?t:t+i.params.choices.step,n.val(e),n.trigger("change")}),t.click(function(){var e,t=parseFloat(n.val());e=t<=i.params.choices.min?t:t-i.params.choices.step,n.val(e),n.trigger("change")}),n.on("change keyup paste click",function(){kirki.setting.set(i.id,jQuery(this).val())})}},image:{getTemplate:function(e){var t,i="";return e=_.defaults(e,{label:"",description:"",inputAttrs:"","data-id":"",choices:{},value:""}),_.isUndefined(e.choices)||_.isUndefined(e.choices.save_as)||e.choices.save_as,t=e.value,_.isObject(e.value)&&!_.isUndefined(e.value.url)&&(t=e.value.url),i+="<label>",e.label&&(i+='<span class="customize-control-title">'+e.label+"</span>"),e.description&&(i+='<span class="description customize-control-description">'+e.description+"</span>"),i+="</label>",i+='<div class="image-wrapper attachment-media-view image-upload">',e.value.url||""!==t?i+='<div class="thumbnail thumbnail-image"><img src="'+t+'" alt="" /></div>':i+='<div class="placeholder">'+kirkiL10n.noFileSelected+"</div>",i+='<div class="actions">',i+='<button class="button image-upload-remove-button'+(""===t?" hidden":"")+'">'+kirkiL10n.remove+"</button>",e.default&&""!==e.default&&(i+='<button type="button" class="button image-default-button"',(e.default===e.value||!_.isUndefined(e.value.url)&&e.default===e.value.url)&&(i+=' style="display:none;"'),i+=">"+kirkiL10n.default+"</button>"),i+='<button type="button" class="button image-upload-button">'+kirkiL10n.selectFile+"</button>",i+="</div></div>",'<div class="kirki-input-container" data-id="'+e.id+'">'+i+"</div>"},init:function(e){}}}}))||{},kirki=(kirki=jQuery.extend(kirki,{setting:{get:function(e){var t=e.split("["),i="",n=0,a="";return _.each(t,function(e,t){e=e.replace("]",""),0===t?i=e:i+="["+e+"]",_.isUndefined(wp.customize.instance(i))||(a=wp.customize.instance(i).get(),n=t),n<t&&_.isObject(a)&&!_.isUndefined(a[e])&&(a=a[e])}),a},set:function(e,t,i){var n,a,r,o,s,c="",l="",u={};n=e,_.isObject(e)&&(n=jQuery(e).attr("data-id")?e.attr("data-id"):e.parents("[data-id]").attr("data-id")),void 0===wp.customize.control(n)?(a=n.split("["),_.each(a,function(e,t){e=e.replace("]",""),c=0===t?e:"["+e+"]",_.isUndefined(wp.customize.instance(c))||(l=c,r=wp.customize.instance(l).get())}),""!==(o=n.replace(l,""))?(_.isObject(r)||(r={}),"["===o.charAt(0)&&(o=o.replace("[","")),s=o.split("["),_.each(s,function(e,t){s[t]=e.replace("]","")}),i&&s.push(i),u='{"'+s.join('":{"')+'":"'+t+'"'+"}".repeat(s.length),u=JSON.parse(u),jQuery.extend(!0,r,u),t=r):i&&((r=_.isObject(r)?r:{})[i]=t,t=r),wp.customize.control(l).setting.set(t)):wp.customize.control(n).setting.set(t)}}}))||{};kirki=jQuery.extend(kirki,{util:{webfonts:{google:{fonts:{},initialize:function(){this.setFonts()},setFonts:function(){var t=this;_.isEmpty(t.fonts)&&jQuery.post(ajaxurl,{action:"kirki_fonts_google_all_get"},function(e){t.fonts=JSON.parse(e)})},getFont:function(e){var t=this.getFonts();return void 0!==t[e]&&t[e]},getFonts:function(e,i,t){var n=this,a={},r={},o={};return e="alpha"!==(e=e||"alpha")&&"popularity"!==e&&"trending"!==e?"alpha":e,t=t||0,t=parseInt(t,10),"alpha"===e?a=jQuery.extend({},n.fonts.items):_.each(n.fonts.order[e],function(e){a[e]=n.fonts.items[e]}),""!==i&&i?_.each(a,function(e,t){i===e.category&&(r[t]=e)}):r=a,0<t?(_.each(_.first(_.keys(r),t),function(e){o[e]=r[e]}),o):r},getVariants:function(e){var t=this.getFont(e);return!!t&&(!_.isUndefined(t.variants)&&t.variants)}},standard:{fonts:{},initialize:function(){this.setFonts()},setFonts:function(){var t=this;_.isEmpty(t.fonts)&&jQuery.post(ajaxurl,{action:"kirki_fonts_standard_all_get"},function(e){t.fonts=JSON.parse(e)})},getVariants:function(){return["regular","italic","700","700italic"]}},getFontType:function(e){return void 0!==this.standard.fonts[e]||void 0!==this.standard.fonts.stack&&void 0!==this.standard.fonts.stack[e]?"standard":void 0!==this.google.fonts.items[e]&&"google"}},validate:{cssValue:function(e){var t,i;return 0===e||"0"===e||"auto"===e||"inherit"===e||"initial"===e||(0<=e.indexOf("calc(")&&0<=e.indexOf(")")||(t=parseFloat(e),i=e.replace(t,""),e?!isNaN(t)&&-1<jQuery.inArray(i,["fr","rem","em","ex","%","px","cm","mm","in","pt","pc","ch","vh","vw","vmin","vmax"]):void 0))}}}}),function(){"use strict";wp.customize.kirkiDynamicControl=wp.customize.Control.extend({initialize:function(e,t){var i=t||{};i.params=i.params||{},i.params.type||(i.params.type="kirki-generic"),i.params.content||(i.params.content=jQuery("<li></li>"),i.params.content.attr("id","customize-control-"+e.replace(/]/g,"").replace(/\[/g,"-")),i.params.content.attr("class","customize-control customize-control-"+i.params.type)),this.propertyElements=[],wp.customize.Control.prototype.initialize.call(this,e,i)},_setUpSettingRootLinks:function(){var n=this;n.container.find("[data-customize-setting-link]").each(function(){var i=jQuery(this);wp.customize(i.data("customizeSettingLink"),function(e){var t=new wp.customize.Element(i);n.elements.push(t),t.sync(e),t.set(e())})})},_setUpSettingPropertyLinks:function(){var n=this;n.setting&&n.container.find("[data-customize-setting-property-link]").each(function(){var t,e=jQuery(this),i=e.data("customizeSettingPropertyLink");t=new wp.customize.Element(e),n.propertyElements.push(t),t.set(n.setting()[i]),t.bind(function(e){var t=n.setting();e!==t[i]&&((t=_.clone(t))[i]=e,n.setting.set(t))}),n.setting.bind(function(e){e[i]!==t.get()&&t.set(e[i])})})},ready:function(){var e=this;e._setUpSettingRootLinks(),e._setUpSettingPropertyLinks(),wp.customize.Control.prototype.ready.call(e),e.deferred.embedded.done(function(){e.initKirkiControl(e)})},embed:function(){var t=this,e=t.section();e&&wp.customize.section(e,function(e){"kirki-expanded"===e.params.type||e.expanded()||wp.customize.settings.autofocus.control===t.id?t.actuallyEmbed():e.expanded.bind(function(e){e&&t.actuallyEmbed()})})},actuallyEmbed:function(){"resolved"!==this.deferred.embedded.state()&&(this.renderContent(),this.deferred.embedded.resolve())},focus:function(e){this.actuallyEmbed(),wp.customize.Control.prototype.focus.call(this,e)},initKirkiControl:function(e){void 0===kirki.control[e.params.type]?this.container.on("change keyup paste click","input",function(){e.setting.set(jQuery(this).val())}):kirki.control[e.params.type].init(e)}})}(),_.each(kirki.control,function(e,t){wp.customize.controlConstructor[t]=wp.customize.kirkiDynamicControl.extend({})}),wp.customize.controlConstructor["kirki-background"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){var o=this,e=o.setting._value,t=o.container.find(".kirki-color-control");(_.isUndefined(e["background-image"])||""===e["background-image"])&&(o.container.find(".background-wrapper > .background-repeat").hide(),o.container.find(".background-wrapper > .background-position").hide(),o.container.find(".background-wrapper > .background-size").hide(),o.container.find(".background-wrapper > .background-attachment").hide()),t.wpColorPicker({change:function(){setTimeout(function(){o.saveValue("background-color",t.val())},100)}}),o.container.on("change",".background-repeat select",function(){o.saveValue("background-repeat",jQuery(this).val())}),o.container.on("change click",".background-size input",function(){o.saveValue("background-size",jQuery(this).val())}),o.container.on("change",".background-position select",function(){o.saveValue("background-position",jQuery(this).val())}),o.container.on("change click",".background-attachment input",function(){o.saveValue("background-attachment",jQuery(this).val())}),o.container.on("click",".background-image-upload-button",function(e){var r=wp.media({multiple:!1}).open().on("select",function(){var e,t,i,n=r.state().get("selection").first(),a=n.toJSON().sizes.full.url;_.isUndefined(n.toJSON().sizes.medium)?_.isUndefined(n.toJSON().sizes.thumbnail)||(a=n.toJSON().sizes.thumbnail.url):a=n.toJSON().sizes.medium.url,e=n.toJSON().sizes.full.url,n.toJSON().id,n.toJSON().width,n.toJSON().height,""!==e&&o.container.find(".background-wrapper > .background-repeat, .background-wrapper > .background-position, .background-wrapper > .background-size, .background-wrapper > .background-attachment").show(),o.saveValue("background-image",e),t=o.container.find(".placeholder, .thumbnail"),i=o.container.find(".background-image-upload-remove-button"),t.length&&t.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+a+'" alt="" />'),i.length&&i.show()});e.preventDefault()}),o.container.on("click",".background-image-upload-remove-button",function(e){var t,i;e.preventDefault(),o.saveValue("background-image",""),t=o.container.find(".placeholder, .thumbnail"),i=o.container.find(".background-image-upload-remove-button"),o.container.find(".background-wrapper > .background-repeat").hide(),o.container.find(".background-wrapper > .background-position").hide(),o.container.find(".background-wrapper > .background-size").hide(),o.container.find(".background-wrapper > .background-attachment").hide(),t.length&&t.removeClass().addClass("placeholder").html("No file selected"),i.length&&i.hide()})},saveValue:function(e,t){var i=jQuery("#customize-control-"+this.id.replace("[","-").replace("]","")+" .background-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}}),wp.customize.controlConstructor["kirki-color-palette"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-dashicons"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-date"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t=e.selector+" input.datepicker";jQuery(t).datepicker({dateFormat:"yy-mm-dd"}),e.container.find(".kirki-controls-loading-spinner").hide(),this.container.on("change keyup paste","input.datepicker",function(){e.setting.set(jQuery(this).val())})}}),wp.customize.controlConstructor["kirki-dimension"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this;t.kirkiNotifications(),this.container.on("change keyup paste","input",function(){e=jQuery(this).val(),t.setting.set(e)})},kirkiNotifications:function(){wp.customize(this.id,function(i){i.bind(function(e){var t="long_title";!1===kirki.util.validate.cssValue(e)?i.notifications.add(t,new wp.customize.Notification(t,{type:"warning",message:dimensionkirkiL10n["invalid-value"]})):i.notifications.remove(t)})})}}),wp.customize.controlConstructor["kirki-dimensions"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t=this.params.choices.controls,i={},n=[];for(_.each(t,function(e,t){!0===e&&n.push(t)}),e=0;e<n.length;e++)i[n[e]]=this.setting._value[n[e]],this.updateDimensionsValue(n[e],i)},updateDimensionsValue:function(e,t){var i=this;i.container.on("change keyup paste","."+e+" input",function(){t[e]=jQuery(this).val(),i.kirkiNotifications(),i.saveValue(t)})},saveValue:function(e){var i={};_.each(e,function(e,t){i[t]=e}),this.setting.set(i)},kirkiNotifications:function(){wp.customize(this.id,function(a){a.bind(function(e){var t,i="long_title",n={};if(a.notifications.remove(i),_.each(e,function(e,t){!1===kirki.util.validate.cssValue(e)?n[t]=e:delete n[t]}),!_.isEmpty(n))return t=dimensionskirkiL10n["invalid-value"]+" ("+_.values(n).toString()+") ",void a.notifications.add(i,new wp.customize.Notification(i,{type:"warning",message:t}));a.notifications.remove(i)})})}}),wp.customize.controlConstructor["kirki-editor"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var i,n=this,a=n.container.find("textarea"),e="kirki-editor-"+n.id.replace("[","").replace("]","");wp.editor.initialize(e,{tinymce:{wpautop:!0},quicktags:!0,mediaButtons:!0}),(i=tinyMCE.get(e))&&i.onChange.add(function(e){var t;e.save(),t=i.getContent(),a.val(t).trigger("change"),wp.customize.instance(n.id).set(t)})}}),wp.customize.controlConstructor["kirki-fontawesome"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e,t,i=this,n=this.container.find("select"),a=jQuery.parseJSON(fontAwesomeJSON),r={data:[],escapeMarkup:function(e){return e},templateResult:function(e){return'<i class="fa fa-lg fa-'+e.id+'" aria-hidden="true"></i> '+e.text},templateSelection:function(e){return'<i class="fa fa-lg fa-'+e.id+'" aria-hidden="true"></i> '+e.text}};_.each(a.icons,function(e){r.data.push({id:e.id,text:e.name})}),(t=jQuery(n).selectWoo(r)).on("change",function(){e=jQuery(this).val(),i.setting.set(e)}),t.val(i.setting._value).trigger("change")}}),wp.customize.controlConstructor["kirki-image"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){var a=this,t=a.getValue(),n=_.isUndefined(a.params.choices)||_.isUndefined(a.params.choices.save_as)?"url":a.params.choices.save_as,r=a.container.find(".placeholder, .thumbnail"),e="array"===n?t.url:t,o=a.container.find(".image-upload-remove-button"),s=a.container.find(".image-default-button");a.container.find(".kirki-controls-loading-spinner").hide(),"id"!==n&&"ID"!==n||""===t||wp.media.attachment(t).fetch().then(function(){setTimeout(function(){var e=wp.media.attachment(t).get("url");r.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+e+'" alt="" />')},700)}),("url"===n&&""!==t||"array"===n&&!_.isUndefined(t.url)&&""!==t.url)&&a.container.find("image-default-button").hide(),("url"===n&&""===t||"array"===n&&(_.isUndefined(t.url)||""===t.url))&&o.hide(),t===a.params.default&&a.container.find("image-default-button").hide(),""!==e&&r.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+e+'" alt="" />'),a.container.on("click",".image-upload-button",function(e){var i=wp.media({multiple:!1}).open().on("select",function(){var e=i.state().get("selection").first(),t=e.toJSON().sizes.full.url;_.isUndefined(e.toJSON().sizes.medium)?_.isUndefined(e.toJSON().sizes.thumbnail)||(t=e.toJSON().sizes.thumbnail.url):t=e.toJSON().sizes.medium.url,"array"===n?(a.saveValue("id",e.toJSON().id),a.saveValue("url",e.toJSON().sizes.full.url),a.saveValue("width",e.toJSON().width),a.saveValue("height",e.toJSON().height)):"id"===n?a.saveValue("id",e.toJSON().id):a.saveValue("url",e.toJSON().sizes.full.url),r.length&&r.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+t+'" alt="" />'),o.length&&(o.show(),s.hide())});e.preventDefault()}),a.container.on("click",".image-upload-remove-button",function(e){var t,i,n;e.preventDefault(),a.saveValue("id",""),a.saveValue("url",""),a.saveValue("width",""),a.saveValue("height",""),t=a.container.find(".placeholder, .thumbnail"),i=a.container.find(".image-upload-remove-button"),n=a.container.find(".image-default-button"),t.length&&t.removeClass().addClass("placeholder").html("No file selected"),i.length&&(i.hide(),jQuery(n).hasClass("button")&&n.show())}),a.container.on("click",".image-default-button",function(e){var t,i,n;e.preventDefault(),a.saveValue("url",a.params.default),t=a.container.find(".placeholder, .thumbnail"),i=a.container.find(".image-upload-remove-button"),n=a.container.find(".image-default-button"),t.length&&t.removeClass().addClass("thumbnail thumbnail-image").html('<img src="'+a.params.default+'" alt="" />'),i.length&&(i.show(),n.hide())})},getValue:function(){var e=this.setting._value;return"array"===(_.isUndefined(this.params.choices)||_.isUndefined(this.params.choices.save_as)?"url":this.params.choices.save_as)&&_.isString(e)&&(e={url:e}),e},saveValue:function(e,t){var i=this,n=i.setting._value;if("array"===(_.isUndefined(i.params.choices)||_.isUndefined(i.params.choices.save_as)?"url":i.params.choices.save_as))return _.isString(n)&&(n={}),n[e]=t,i.setting.set(n),void i.container.find("button").trigger("change");i.setting.set(t),i.container.find("button").trigger("change")}}),wp.customize.controlConstructor["kirki-multicheck"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var n=this;n.container.on("change","input",function(){var t=[],i=0;jQuery.each(n.params.choices,function(e){n.container.find('input[value="'+e+'"]').is(":checked")?(n.container.find('input[value="'+e+'"]').parent().addClass("checked"),t[i]=e,i++):n.container.find('input[value="'+e+'"]').parent().removeClass("checked")}),n.setting.set(t)})}}),wp.customize.controlConstructor["kirki-multicolor"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var r=this.params.choices,e=Object.keys(r),t=(this.params.value,0);function i(e,t,i){var n=e.container.find(".multicolor-index-"+i),a={change:function(){setTimeout(function(){e.saveValue(i,n.val()),e.container.find(".multicolor-index-"+i).trigger("change")},100)}};_.isObject(r.irisArgs)&&_.each(r.irisArgs,function(e,t){a[t]=e}),n.wpColorPicker(a)}for(;t<Object.keys(r).length;)i(this,0,e[t]),t++},saveValue:function(e,t){var i=this.container.find(".multicolor-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}}),wp.customize.controlConstructor["kirki-palette"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-preset"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var i,e=this;this.container.on("change","select",function(){i=jQuery(this).val(),e.setting.set(i),jQuery.each(e.params.choices,function(e,t){i===e&&jQuery.each(t.settings,function(e,t){kirkiSetSettingValue.set(e,t)})}),wp.customize.previewer.refresh()})}}),wp.customize.controlConstructor["kirki-radio-buttonset"]=wp.customize.kirkiDynamicControl.extend({}),wp.customize.controlConstructor["kirki-radio-image"]=wp.customize.kirkiDynamicControl.extend({});var RepeaterRow=function(e,t,i,n){"use strict";var a=this;this.rowIndex=e,this.container=t,this.label=i,this.header=this.container.find(".repeater-row-header"),this.header.on("click",function(){a.toggleMinimize()}),this.container.on("click",".repeater-row-remove",function(){a.remove()}),this.header.on("mousedown",function(){a.container.trigger("row:start-dragging")}),this.container.on("keyup change","input, select, textarea",function(e){a.container.trigger("row:update",[a.rowIndex,jQuery(e.target).data("field"),e.target])}),this.setRowIndex=function(e){this.rowIndex=e,this.container.attr("data-row",e),this.container.data("row",e),this.updateLabel()},this.toggleMinimize=function(){this.container.toggleClass("minimized"),this.header.find(".dashicons").toggleClass("dashicons-arrow-up").toggleClass("dashicons-arrow-down")},this.remove=function(){this.container.slideUp(300,function(){jQuery(this).detach()}),this.container.trigger("row:remove",[this.rowIndex])},this.updateLabel=function(){var e,t,i;if("field"===this.label.type&&(e=this.container.find('.repeater-field [data-field="'+this.label.field+'"]'),_.isFunction(e.val)&&""!==(t=e.val())))return _.isUndefined(n.params.fields[this.label.field])||_.isUndefined(n.params.fields[this.label.field].type)||("select"===n.params.fields[this.label.field].type?_.isUndefined(n.params.fields[this.label.field].choices)||_.isUndefined(n.params.fields[this.label.field].choices[e.val()])||(t=n.params.fields[this.label.field].choices[e.val()]):"radio"!==n.params.fields[this.label.field].type&&"radio-image"!==n.params.fields[this.label.field].type||(i=n.selector+' [data-row="'+this.rowIndex+'"] .repeater-field [data-field="'+this.label.field+'"]:checked',t=jQuery(i).val())),void this.header.find(".repeater-row-label").text(t);this.header.find(".repeater-row-label").text(this.label.value+" "+(this.rowIndex+1))},this.updateLabel()};wp.customize.controlConstructor.repeater=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var t,i,n=this,e=this.params.value;n.container.find(".kirki-controls-loading-spinner").hide(),this.settingField=this.container.find("[data-customize-setting-link]").first(),this.setValue([],!1),this.repeaterFieldsContainer=this.container.find(".repeater-fields").first(),this.currentIndex=0,this.rows=[],t=!1,_.isUndefined(this.params.choices.limit)||(t=!(this.params.choices.limit<=0)&&parseInt(this.params.choices.limit,10)),this.container.on("click","button.repeater-add",function(e){e.preventDefault(),!t||n.currentIndex<t?((i=n.addRow()).toggleMinimize(),n.initColorPicker(),n.initSelect(i)):jQuery(n.selector+" .limit").addClass("highlight")}),this.container.on("click",".repeater-row-remove",function(){n.currentIndex--,(!t||n.currentIndex<t)&&jQuery(n.selector+" .limit").removeClass("highlight")}),this.container.on("click keypress",".repeater-field-image .upload-button,.repeater-field-cropped_image .upload-button,.repeater-field-upload .upload-button",function(e){e.preventDefault(),n.$thisButton=jQuery(this),n.openFrame(e)}),this.container.on("click keypress",".repeater-field-image .remove-button,.repeater-field-cropped_image .remove-button",function(e){e.preventDefault(),n.$thisButton=jQuery(this),n.removeImage(e)}),this.container.on("click keypress",".repeater-field-upload .remove-button",function(e){e.preventDefault(),n.$thisButton=jQuery(this),n.removeFile(e)}),this.repeaterTemplate=_.memoize(function(){var t={evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"};return function(e){return _.template(n.container.find(".customize-control-repeater-content").first().html(),null,t)(e)}}),e.length&&_.each(e,function(e){i=n.addRow(e),n.initColorPicker(),n.initSelect(i,e)}),this.setValue(e,!0,!0),this.repeaterFieldsContainer.sortable({handle:".repeater-row-header",update:function(){n.sort()}})},openFrame:function(e){"use strict";wp.customize.utils.isKeydownButNotEnterEvent(e)||(this.$thisButton.closest(".repeater-field").hasClass("repeater-field-cropped_image")?this.initCropperFrame():this.initFrame(),this.frame.open())},initFrame:function(){"use strict";var e=this.getMimeType();this.frame=wp.media({states:[new wp.media.controller.Library({library:wp.media.query({type:e}),multiple:!1,date:!1})]}),this.frame.on("select",this.onSelect,this)},initCropperFrame:function(){"use strict";var t=this.$thisButton.siblings("input.hidden-field").attr("data-field"),e=this.getMimeType();_.isString(t)&&""!==t&&_.isObject(this.params.fields[t])&&"cropped_image"===this.params.fields[t].type&&["width","height","flex_width","flex_height"].forEach(function(e){_.isUndefined(this.params.fields[t][e])||(this.params[e]=this.params.fields[t][e])}.bind(this)),this.frame=wp.media({button:{text:"Select and Crop",close:!1},states:[new wp.media.controller.Library({library:wp.media.query({type:e}),multiple:!1,date:!1,suggestedWidth:this.params.width,suggestedHeight:this.params.height}),new wp.media.controller.CustomizeImageCropper({imgSelectOptions:this.calculateImageSelectOptions,control:this})]}),this.frame.on("select",this.onSelectForCrop,this),this.frame.on("cropped",this.onCropped,this),this.frame.on("skippedcrop",this.onSkippedCrop,this)},onSelect:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.$thisButton.closest(".repeater-field").hasClass("repeater-field-upload")?this.setFileInRepeaterField(e):this.setImageInRepeaterField(e)},onSelectForCrop:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.params.width!==e.width||this.params.height!==e.height||this.params.flex_width||this.params.flex_height?this.frame.setState("cropper"):this.setImageInRepeaterField(e)},onCropped:function(e){"use strict";this.setImageInRepeaterField(e)},calculateImageSelectOptions:function(e,t){"use strict";var i,n,a,r=t.get("control"),o=!!parseInt(r.params.flex_width,10),s=!!parseInt(r.params.flex_height,10),c=e.get("width"),l=e.get("height"),u=parseInt(r.params.width,10),d=parseInt(r.params.height,10),p=u/d,h=c,f=l;return t.set("canSkipCrop",!r.mustBeCropped(o,s,u,d,c,l)),p<h/f?u=(d=f)*p:d=(u=h)/p,a={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:c,imageHeight:l,x1:i=(h-u)/2,y1:n=(f-d)/2,x2:u+i,y2:d+n},!1===s&&!1===o&&(a.aspectRatio=u+":"+d),!1===s&&(a.maxHeight=d),!1===o&&(a.maxWidth=u),a},mustBeCropped:function(e,t,i,n,a,r){"use strict";return!(!0===e&&!0===t||!0===e&&n===r||!0===t&&i===a||i===a&&n===r||a<=i)},onSkippedCrop:function(){"use strict";var e=this.frame.state().get("selection").first().toJSON();this.setImageInRepeaterField(e)},setImageInRepeaterField:function(e){"use strict";var t=this.$thisButton.closest(".repeater-field-image,.repeater-field-cropped_image");t.find(".kirki-image-attachment").html('<img src="'+e.url+'">').hide().slideDown("slow"),t.find(".hidden-field").val(e.id),this.$thisButton.text(this.$thisButton.data("alt-label")),t.find(".remove-button").show(),t.find("input, textarea, select").trigger("change"),this.frame.close()},setFileInRepeaterField:function(e){"use strict";var t=this.$thisButton.closest(".repeater-field-upload");t.find(".kirki-file-attachment").html('<span class="file"><span class="dashicons dashicons-media-default"></span> '+e.filename+"</span>").hide().slideDown("slow"),t.find(".hidden-field").val(e.id),this.$thisButton.text(this.$thisButton.data("alt-label")),t.find(".upload-button").show(),t.find(".remove-button").show(),t.find("input, textarea, select").trigger("change"),this.frame.close()},getMimeType:function(){"use strict";var e=this.$thisButton.siblings("input.hidden-field").attr("data-field");return _.isString(e)&&""!==e&&_.isObject(this.params.fields[e])&&"upload"===this.params.fields[e].type&&!_.isUndefined(this.params.fields[e].mime_type)?this.params.fields[e].mime_type:"image"},removeImage:function(e){"use strict";var t,i;wp.customize.utils.isKeydownButNotEnterEvent(e)||(i=(t=this.$thisButton.closest(".repeater-field-image,.repeater-field-cropped_image,.repeater-field-upload")).find(".upload-button"),t.find(".kirki-image-attachment").slideUp("fast",function(){jQuery(this).show().html(jQuery(this).data("placeholder"))}),t.find(".hidden-field").val(""),i.text(i.data("label")),this.$thisButton.hide(),t.find("input, textarea, select").trigger("change"))},removeFile:function(e){"use strict";var t,i;wp.customize.utils.isKeydownButNotEnterEvent(e)||(i=(t=this.$thisButton.closest(".repeater-field-upload")).find(".upload-button"),t.find(".kirki-file-attachment").slideUp("fast",function(){jQuery(this).show().html(jQuery(this).data("placeholder"))}),t.find(".hidden-field").val(""),i.text(i.data("label")),this.$thisButton.hide(),t.find("input, textarea, select").trigger("change"))},getValue:function(){"use strict";return JSON.parse(decodeURI(this.setting.get()))},setValue:function(e,t,i){"use strict";var a=e,r=[];i&&(jQuery.each(this.params.fields,function(e,t){"image"!==t.type&&"cropped_image"!==t.type&&"upload"!==t.type||r.push(e)}),jQuery.each(e,function(i,n){jQuery.each(r,function(e,t){_.isUndefined(n[t])||_.isUndefined(n[t].id)||(a[i][t]=n[t].id)})})),this.setting.set(encodeURI(JSON.stringify(a))),t&&this.settingField.trigger("change")},addRow:function(e){"use strict";var t,a,i,r=this,n=r.repeaterTemplate(),o=this.getValue(),s={};if(n){if(t=jQuery.extend(!0,{},r.params.fields),e)for(i in e)e.hasOwnProperty(i)&&t.hasOwnProperty(i)&&(t[i].default=e[i]);for(i in t.index=this.currentIndex,n=n(t),(a=new RepeaterRow(r.currentIndex,jQuery(n).appendTo(r.repeaterFieldsContainer),r.params.row_label,r)).container.on("row:remove",function(e,t){r.deleteRow(t)}),a.container.on("row:update",function(e,t,i,n){r.updateField.call(r,e,t,i,n),a.updateLabel()}),this.rows[this.currentIndex]=a,t)t.hasOwnProperty(i)&&(s[i]=t[i].default);return o[this.currentIndex]=s,this.setValue(o,!0),this.currentIndex++,a}},sort:function(){"use strict";var i=this,e=this.repeaterFieldsContainer.find(".repeater-row"),n=[],a=i.getValue(),r=[],o=[];e.each(function(e,t){n.push(jQuery(t).data("row"))}),jQuery.each(n,function(e,t){r[e]=i.rows[t],r[e].setRowIndex(e),o[e]=a[t]}),i.rows=r,i.setValue(o)},deleteRow:function(e){"use strict";var t,i=this.getValue();for(t in i[e]&&this.rows[e]&&(delete i[e],delete this.rows[e],this.setValue(i,!0)),1,this.rows)this.rows.hasOwnProperty(t)&&this.rows[t]&&(this.rows[t].updateLabel(),0)},updateField:function(e,t,i,n){"use strict";var a,r,o;this.rows[t]&&this.params.fields[i]&&(a=this.params.fields[i].type,r=this.rows[t],o=this.getValue(),n=jQuery(n),_.isUndefined(o[r.rowIndex][i])||(o[r.rowIndex][i]="checkbox"===a?n.is(":checked"):n.val(),this.setValue(o,!0)))},initColorPicker:function(){"use strict";var r=this,e=r.container.find(".color-picker-hex"),t={},i=e.data("field");_.isUndefined(i)||_.isUndefined(r.params.fields[i])||_.isUndefined(r.params.fields[i].palettes)||!_.isObject(r.params.fields[i].palettes)||(t.palettes=r.params.fields[i].palettes),t.change=function(e,t){var i=jQuery(e.target),n=i.closest(".repeater-row").data("row"),a=r.getValue();a[n][i.data("field")]=t.color.toString(),r.setValue(a,!0)},0!==e.length&&e.wpColorPicker(t)},initSelect:function(e,t){"use strict";var i,n,a=this,r=e.container.find(".repeater-field select"),o={};0!==r.length&&(i=r.data("field"),"undefed"!==(n=jQuery(r).data("multiple"))&&jQuery.isNumeric(n)&&1<(n=parseInt(n,10))&&(o.maximumSelectionLength=n),(t=t||{})[i]=t[i]||"",jQuery(r).selectWoo(o).val(t[i]),this.container.on("change",".repeater-field select",function(e){var t=jQuery(e.target),i=t.closest(".repeater-row").data("row"),n=a.getValue();n[i][t.data("field")]=jQuery(this).val(),a.setValue(n)}))}}),wp.customize.controlConstructor["kirki-slider"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t="postMessage"===e.setting.transport?"mousemove change":"change",i=e.container.find('input[type="range"]'),n=e.container.find('input[type="text"]'),a=e.setting._value;n.attr("value",a),i.on("mousemove change",function(){n.attr("value",i.val())}),i.on(t,function(){e.setting.set(i.val())}),n.on("input paste change",function(){i.attr("value",n.val()),e.setting.set(n.val())}),e.container.find(".slider-reset").on("click",function(){n.attr("value",e.params.default),i.attr("value",e.params.default),e.setting.set(n.val())})}}),wp.customize.controlConstructor["kirki-sortable"]=wp.customize.Control.extend({ready:function(){"use strict";!_.isUndefined(window.kirkiControlLoader)&&_.isFunction(kirkiControlLoader)?kirkiControlLoader(this):this.initKirkiControl()},initKirkiControl:function(){"use strict";var e=this;e.container.find(".kirki-controls-loading-spinner").hide(),e.sortableContainer=e.container.find("ul.sortable").first(),e.sortableContainer.sortable({stop:function(){e.updateValue()}}).disableSelection().find("li").each(function(){jQuery(this).find("i.visibility").click(function(){jQuery(this).toggleClass("dashicons-visibility-faint").parents("li:eq(0)").toggleClass("invisible")})}).click(function(){e.updateValue()})},updateValue:function(){"use strict";var e=[];this.sortableContainer.find("li").each(function(){jQuery(this).is(".invisible")||e.push(jQuery(this).data("value"))}),this.setting.set(e)}}),wp.customize.controlConstructor["kirki-switch"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){"use strict";var e=this,t=e.setting._value;this.container.on("change","input",function(){t=!!jQuery(this).is(":checked"),e.setting.set(t)})}}),wp.customize.controlConstructor["kirki-toggle"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){var e=this,t=e.setting._value;this.container.on("change","input",function(){t=!!jQuery(this).is(":checked"),e.setting.set(t)})}}),wp.customize.controlConstructor["kirki-typography"]=wp.customize.kirkiDynamicControl.extend({initKirkiControl:function(){"use strict";var e,t=this,i=t.setting._value;t.renderFontSelector(),t.renderBackupFontSelector(),t.renderVariantSelector(),t.params.default["font-size"]&&this.container.on("change keyup paste",".font-size input",function(){t.saveValue("font-size",jQuery(this).val())}),t.params.default["line-height"]&&this.container.on("change keyup paste",".line-height input",function(){t.saveValue("line-height",jQuery(this).val())}),t.params.default["margin-top"]&&this.container.on("change keyup paste",".margin-top input",function(){t.saveValue("margin-top",jQuery(this).val())}),t.params.default["margin-bottom"]&&this.container.on("change keyup paste",".margin-bottom input",function(){t.saveValue("margin-bottom",jQuery(this).val())}),t.params.default["letter-spacing"]&&(i["letter-spacing"]=jQuery.isNumeric(i["letter-spacing"])?i["letter-spacing"]+"px":i["letter-spacing"],this.container.on("change keyup paste",".letter-spacing input",function(){i["letter-spacing"]=jQuery.isNumeric(jQuery(this).val())?jQuery(this).val()+"px":jQuery(this).val(),t.saveValue("letter-spacing",i["letter-spacing"])})),t.params.default["word-spacing"]&&this.container.on("change keyup paste",".word-spacing input",function(){t.saveValue("word-spacing",jQuery(this).val())}),t.params.default["text-align"]&&this.container.on("change",".text-align input",function(){t.saveValue("text-align",jQuery(this).val())}),t.params.default["text-transform"]&&jQuery(t.selector+" .text-transform select").selectWoo().on("change",function(){t.saveValue("text-transform",jQuery(this).val())}),t.params.default["text-decoration"]&&jQuery(t.selector+" .text-decoration select").selectWoo().on("change",function(){t.saveValue("text-decoration",jQuery(this).val())}),_.isUndefined(t.params.default.color)||(e=this.container.find(".kirki-color-control")).wpColorPicker({change:function(){setTimeout(function(){t.saveValue("color",e.val())},100)}})},renderFontSelector:function(){var e,t,i=this,n=i.selector+" .font-family select",a=[],r=[],o=[],s=i.setting._value,c=i.getFonts();_.isUndefined(c.standard)||_.each(c.standard,function(e){r.push({id:e.family.replace(/&quot;/g,"&#39"),text:e.label})}),_.isUndefined(c.google)||_.each(c.google,function(e){o.push({id:e.family,text:e.family})}),t={},_.isUndefined(i.params)||_.isUndefined(i.params.choices)||_.isUndefined(i.params.choices.fonts)||_.isUndefined(i.params.choices.fonts.families)||(t=i.params.choices.fonts.families),a=jQuery.extend({},t,{default:{text:kirkiL10n.defaultCSSValues,children:[{id:"",text:kirkiL10n.defaultBrowserFamily},{id:"inherit",text:"initial"},{id:"inherit",text:"inherit"}]},standard:{text:kirkiL10n.standardFonts,children:r},google:{text:kirkiL10n.googleFonts,children:o}}),kirkiL10n.isScriptDebug&&(console.info('Kirki Debug: Font families for control "'+i.id+'":'),console.info(a)),a=_.values(a),e=jQuery(n).selectWoo({data:a}),s["font-family"]&&e.val(s["font-family"].replace(/'/g,'"')).trigger("change"),e.on("change",function(){i.saveValue("font-family",jQuery(this).val()),i.renderBackupFontSelector(),i.renderVariantSelector()})},renderBackupFontSelector:function(){var e,t=this,i=t.selector+" .font-backup select",n=[],a=t.setting._value,r=a["font-family"],o=t.getFonts();(_.isUndefined(a["font-backup"])||null===a["font-backup"])&&(a["font-backup"]=""),"inherit"!==r&&"google"===kirki.util.webfonts.getFontType(r)?(jQuery(t.selector+" .font-backup").show(),_.isUndefined(o.standard)||_.each(o.standard,function(e){n.push({id:e.family.replace(/&quot;/g,"&#39"),text:e.label})}),e=jQuery(i).selectWoo({data:n}),void 0!==a["font-backup"]&&e.val(a["font-backup"].replace(/'/g,'"')).trigger("change"),e.on("change",function(){t.saveValue("font-backup",jQuery(this).val())})):jQuery(t.selector+" .font-backup").hide()},renderVariantSelector:function(){var e,t,i,n=this,a=n.setting._value,r=a["font-family"],o=n.selector+" .variant select",s=[],c=!1,l=kirki.util.webfonts.getFontType(r),u=["","regular","italic","700","700italic"];if("google"===l&&(u=kirki.util.webfonts.google.getVariants(r)),_.isUndefined(n.params)||_.isUndefined(n.params.choices)||_.isUndefined(n.params.choices.fonts)||_.isUndefined(n.params.choices.fonts.variants)||_.isUndefined(n.params.choices.fonts.variants[r])||(u=n.params.choices.fonts.variants[r]),kirkiL10n.isScriptDebug&&(console.info('Kirki Debug: Font variants for font-family "'+r+'":'),console.info(u)),"inherit"===r&&(a.variant="inherit",u=[""],jQuery(n.selector+" .variant").hide()),u.length<=1)return jQuery(n.selector+" .variant").hide(),a.variant=u[0],n.saveValue("variant",a.variant),""!==a.variant&&a.variant?(e=_.isString(a.variant)?a.variant.match(/\d/g):"400",e=_.isObject(e)?e.join(""):"400",i=-1!==a.variant.indexOf("italic")?"italic":"normal"):i=e="",n.saveValue("font-weight",e),void n.saveValue("font-style",i);jQuery(n.selector+" .font-backup").show(),jQuery(n.selector+" .variant").show(),_.each(u,function(e){a.variant===e&&(c=!0),s.push({id:e,text:e})}),c||(a.variant="regular"),jQuery(o).hasClass("select2-hidden-accessible")&&(jQuery(o).selectWoo("destroy"),jQuery(o).empty()),(t=jQuery(o).selectWoo({data:s})).val(a.variant).trigger("change"),t.on("change",function(){n.saveValue("variant",jQuery(this).val()),"string"!=typeof a.variant&&(a.variant=u[0]),e=_.isString(a.variant)?a.variant.match(/\d/g):"400",e=_.isObject(e)?e.join(""):"400",i=-1!==a.variant.indexOf("italic")?"italic":"normal",n.saveValue("font-weight",e),n.saveValue("font-style",i)})},getFonts:function(){var e=this,t=kirki.util.webfonts.google.getFonts(),i={},n="alpha",a=0,r={};return _.isEmpty(e.params.choices.fonts.google)?i=kirki.util.webfonts.google.getFonts(n,"",a):"alpha"===e.params.choices.fonts.google[0]||"popularity"===e.params.choices.fonts.google[0]||"trending"===e.params.choices.fonts.google[0]?(n=e.params.choices.fonts.google[0],isNaN(e.params.choices.fonts.google[1])||(a=parseInt(e.params.choices.fonts.google[1],10)),i=kirki.util.webfonts.google.getFonts(n,"",a)):_.each(e.params.choices.fonts.google,function(e){void 0===t[e]||_.isEmpty(t[e])||(i[e]=t[e])}),_.isEmpty(e.params.choices.fonts.standard)?_.each(kirki.util.webfonts.standard.fonts,function(e,t){r[t]={family:e.stack,label:e.label}}):_.each(e.params.choices.fonts.standard,function(e){void 0===kirki.util.webfonts.standard.fonts[e]||_.isEmpty(kirki.util.webfonts.standard.fonts[e])?r[e]={family:e,label:e}:(r[e]={},"undefined"===kirki.util.webfonts.standard.fonts[e].stack||_.isEmpty(kirki.util.webfonts.standard.fonts[e].stack)?r[e].family=i[e]:r[e].family=kirki.util.webfonts.standard.fonts[e].stack,"undefined"===kirki.util.webfonts.standard.fonts[e].label||_.isEmpty(kirki.util.webfonts.standard.fonts[e].label)?_.isEmpty(r[e])||(r[e].label=r[e]):r[e].label=kirki.util.webfonts.standard.fonts[e].label)}),{google:i,standard:r}},saveValue:function(e,t){var i=this.container.find(".typography-hidden-value"),n=this.setting._value;n[e]=t,jQuery(i).attr("value",JSON.stringify(n)).trigger("change"),this.setting.set(n)}});
controls/php/class-kirki-control-base.php CHANGED
@@ -57,6 +57,15 @@ class Kirki_Control_Base extends WP_Customize_Control {
57
  */
58
  public $required = array();
59
 
 
 
 
 
 
 
 
 
 
60
  /**
61
  * Extra script dependencies.
62
  *
@@ -109,13 +118,15 @@ class Kirki_Control_Base extends WP_Customize_Control {
109
  'kirki-script',
110
  'kirkiL10n',
111
  array(
112
- 'noFileSelected' => esc_attr__( 'No File Selected', 'kirki' ),
113
- 'remove' => esc_attr__( 'Remove', 'kirki' ),
114
- 'default' => esc_attr__( 'Default', 'kirki' ),
115
- 'selectFile' => esc_attr__( 'Select File', 'kirki' ),
116
- 'standardFonts' => esc_attr__( 'Standard Fonts', 'kirki' ),
117
- 'googleFonts' => esc_attr__( 'Google Fonts', 'kirki' ),
118
- 'defaultCSSValues' => esc_attr__( 'Default CSS Values', 'kirki' ),
 
 
119
  )
120
  );
121
 
@@ -169,6 +180,8 @@ class Kirki_Control_Base extends WP_Customize_Control {
169
  $this->json['kirkiOptionType'] = $this->option_type;
170
  // The option-name.
171
  $this->json['kirkiOptionName'] = $this->option_name;
 
 
172
  }
173
 
174
  /**
57
  */
58
  public $required = array();
59
 
60
+ /**
61
+ * Whitelisting the "preset" argument.
62
+ *
63
+ * @since 3.0.26
64
+ * @access public
65
+ * @var array
66
+ */
67
+ public $preset = array();
68
+
69
  /**
70
  * Extra script dependencies.
71
  *
118
  'kirki-script',
119
  'kirkiL10n',
120
  array(
121
+ 'isScriptDebug' => ( defined( 'SCRIPT_DEBUG' ) && true === SCRIPT_DEBUG ),
122
+ 'noFileSelected' => esc_attr__( 'No File Selected', 'kirki' ),
123
+ 'remove' => esc_attr__( 'Remove', 'kirki' ),
124
+ 'default' => esc_attr__( 'Default', 'kirki' ),
125
+ 'selectFile' => esc_attr__( 'Select File', 'kirki' ),
126
+ 'standardFonts' => esc_attr__( 'Standard Fonts', 'kirki' ),
127
+ 'googleFonts' => esc_attr__( 'Google Fonts', 'kirki' ),
128
+ 'defaultCSSValues' => esc_attr__( 'CSS Defaults', 'kirki' ),
129
+ 'defaultBrowserFamily' => esc_attr__( 'Default Browser Font-Family', 'kirki' ),
130
  )
131
  );
132
 
180
  $this->json['kirkiOptionType'] = $this->option_type;
181
  // The option-name.
182
  $this->json['kirkiOptionName'] = $this->option_name;
183
+ // The preset.
184
+ $this->json['preset'] = $this->preset;
185
  }
186
 
187
  /**
controls/php/class-kirki-control-checkbox.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Customizer Control: checkbox.
4
+ *
5
+ * Creates a new custom control.
6
+ * Custom controls contains all background-related options.
7
+ *
8
+ * @package Kirki
9
+ * @subpackage Controls
10
+ * @copyright Copyright (c) 2017, Aristeides Stathopoulos
11
+ * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT
12
+ * @since 3.0.26
13
+ */
14
+
15
+ /**
16
+ * Adds a checkbox control.
17
+ *
18
+ * @since 3.0.26
19
+ */
20
+ class Kirki_Control_Checkbox extends Kirki_Control_Base {
21
+
22
+ /**
23
+ * The control type.
24
+ *
25
+ * @access public
26
+ * @var string
27
+ */
28
+ public $type = 'kirki-checkbox';
29
+
30
+ /**
31
+ * Render the control's content.
32
+ * Verbatim copy from WP_Customize_Control->render_content.
33
+ *
34
+ * @since 3.0.26
35
+ */
36
+ protected function render_content() {
37
+ $input_id = '_customize-input-' . $this->id;
38
+ $description_id = '_customize-description-' . $this->id;
39
+ $describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : '';
40
+ ?>
41
+ <span class="customize-inside-control-row">
42
+ <input
43
+ id="<?php echo esc_attr( $input_id ); ?>"
44
+ <?php echo $describedby_attr; ?>
45
+ type="checkbox"
46
+ value="<?php echo esc_attr( $this->value() ); ?>"
47
+ <?php $this->link(); ?>
48
+ <?php checked( $this->value() ); ?>
49
+ />
50
+ <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label>
51
+ <?php if ( ! empty( $this->description ) ) : ?>
52
+ <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span>
53
+ <?php endif; ?>
54
+ </span>
55
+ <?php
56
+ }
57
+ }
controls/php/class-kirki-control-dimension.php CHANGED
@@ -56,7 +56,7 @@ class Kirki_Control_Dimension extends Kirki_Control_Base {
56
  <# if ( data.label ) { #><span class="customize-control-title">{{{ data.label }}}</span><# } #>
57
  <# if ( data.description ) { #><span class="description customize-control-description">{{{ data.description }}}</span><# } #>
58
  <div class="input-wrapper">
59
- <# var val = ( ! _.isUndefined( data.value ) ) ? data.value.replace( '%%', '%' ) : ''; #>
60
  <input {{{ data.inputAttrs }}} type="text" value="{{ val }}"/>
61
  </div>
62
  </label>
56
  <# if ( data.label ) { #><span class="customize-control-title">{{{ data.label }}}</span><# } #>
57
  <# if ( data.description ) { #><span class="description customize-control-description">{{{ data.description }}}</span><# } #>
58
  <div class="input-wrapper">
59
+ <# var val = ( data.value && _.isString( data.value ) ) ? data.value.replace( '%%', '%' ) : ''; #>
60
  <input {{{ data.inputAttrs }}} type="text" value="{{ val }}"/>
61
  </div>
62
  </label>
controls/php/class-kirki-control-multicheck.php CHANGED
@@ -49,7 +49,7 @@ class Kirki_Control_MultiCheck extends Kirki_Control_Base {
49
 
50
  <ul>
51
  <# for ( key in data.choices ) { #>
52
- <li><label><input {{{ data.inputAttrs }}} type="checkbox" value="{{ key }}"<# if ( _.contains( data.value, key ) ) { #> checked<# } #> />{{ data.choices[ key ] }}</label></li>
53
  <# } #>
54
  </ul>
55
  <?php
49
 
50
  <ul>
51
  <# for ( key in data.choices ) { #>
52
+ <li><label<# if ( _.contains( data.value, key ) ) { #> class="checked"<# } #>><input {{{ data.inputAttrs }}} type="checkbox" value="{{ key }}"<# if ( _.contains( data.value, key ) ) { #> checked<# } #> />{{ data.choices[ key ] }}</label></li>
53
  <# } #>
54
  </ul>
55
  <?php
controls/php/class-kirki-control-radio-buttonset.php CHANGED
@@ -44,7 +44,7 @@ class Kirki_Control_Radio_Buttonset extends Kirki_Control_Base {
44
  <div id="input_{{ data.id }}" class="buttonset">
45
  <# for ( key in data.choices ) { #>
46
  <input {{{ data.inputAttrs }}} class="switch-input screen-reader-text" type="radio" value="{{ key }}" name="_customize-radio-{{{ data.id }}}" id="{{ data.id }}{{ key }}" {{{ data.link }}}<# if ( key === data.value ) { #> checked="checked" <# } #>>
47
- <label class="switch-label switch-label-<# if ( key === data.value ) { #>on <# } else { #>off<# } #>" for="{{ data.id }}{{ key }}">{{ data.choices[ key ] }}</label>
48
  </input>
49
  <# } #>
50
  </div>
44
  <div id="input_{{ data.id }}" class="buttonset">
45
  <# for ( key in data.choices ) { #>
46
  <input {{{ data.inputAttrs }}} class="switch-input screen-reader-text" type="radio" value="{{ key }}" name="_customize-radio-{{{ data.id }}}" id="{{ data.id }}{{ key }}" {{{ data.link }}}<# if ( key === data.value ) { #> checked="checked" <# } #>>
47
+ <label class="switch-label switch-label-<# if ( key === data.value ) { #>on <# } else { #>off<# } #>" for="{{ data.id }}{{ key }}">{{{ data.choices[ key ] }}}</label>
48
  </input>
49
  <# } #>
50
  </div>
controls/php/class-kirki-control-repeater.php CHANGED
@@ -51,6 +51,14 @@ class Kirki_Control_Repeater extends Kirki_Control_Base {
51
  */
52
  public $row_label = array();
53
 
 
 
 
 
 
 
 
 
54
  /**
55
  * Constructor.
56
  * Supplied `$args` override class property defaults.
@@ -247,7 +255,7 @@ class Kirki_Control_Repeater extends Kirki_Control_Base {
247
  <div class="repeater-row-content">
248
  <# _.each( data, function( field, i ) { #>
249
 
250
- <div class="repeater-field repeater-field-{{{ field.type }}}">
251
 
252
  <# if ( 'text' === field.type || 'url' === field.type || 'link' === field.type || 'email' === field.type || 'tel' === field.type || 'date' === field.type || 'number' === field.type ) { #>
253
  <# var fieldExtras = ''; #>
@@ -338,17 +346,20 @@ class Kirki_Control_Repeater extends Kirki_Control_Base {
338
 
339
  <# } else if ( 'color' === field.type ) { #>
340
 
341
- <# var defaultValue = '';
342
- if ( field.default ) {
343
- defaultValue = ( '#' !== field.default.substring( 0, 1 ) ) ? '#' + field.default : field.default;
344
- defaultValue = ' data-default-color=' + defaultValue; // Quotes added automatically.
345
- } #>
346
  <label>
347
  <# if ( field.label ) { #><span class="customize-control-title">{{{ field.label }}}</span><# } #>
348
  <# if ( field.description ) { #><span class="description customize-control-description">{{{ field.description }}}</span><# } #>
349
- <input class="color-picker-hex" type="text" maxlength="7" placeholder="<?php esc_attr_e( 'Hex Value', 'kirki' ); ?>" value="{{{ field.default }}}" data-field="{{{ field.id }}}" {{ defaultValue }} />
350
-
351
  </label>
 
 
 
 
 
 
 
 
 
 
352
 
353
  <# } else if ( 'textarea' === field.type ) { #>
354
 
51
  */
52
  public $row_label = array();
53
 
54
+ /**
55
+ * The button label
56
+ *
57
+ * @access public
58
+ * @var string
59
+ */
60
+ public $button_label = '';
61
+
62
  /**
63
  * Constructor.
64
  * Supplied `$args` override class property defaults.
255
  <div class="repeater-row-content">
256
  <# _.each( data, function( field, i ) { #>
257
 
258
+ <div class="repeater-field repeater-field-{{{ field.type }}} repeater-field-{{ field.id }}">
259
 
260
  <# if ( 'text' === field.type || 'url' === field.type || 'link' === field.type || 'email' === field.type || 'tel' === field.type || 'date' === field.type || 'number' === field.type ) { #>
261
  <# var fieldExtras = ''; #>
346
 
347
  <# } else if ( 'color' === field.type ) { #>
348
 
 
 
 
 
 
349
  <label>
350
  <# if ( field.label ) { #><span class="customize-control-title">{{{ field.label }}}</span><# } #>
351
  <# if ( field.description ) { #><span class="description customize-control-description">{{{ field.description }}}</span><# } #>
 
 
352
  </label>
353
+ <# var defaultValue = '';
354
+ if ( field.default ) {
355
+ if ( -1 === field.default.indexOf( 'rgba' ) ) {
356
+ defaultValue = ( '#' !== field.default.substring( 0, 1 ) ) ? '#' + field.default : field.default;
357
+ defaultValue = ' data-default-color=' + defaultValue; // Quotes added automatically.
358
+ } else {
359
+ defaultValue = ' data-default-color="' + defaultValue + '" data-alpha="true"';
360
+ }
361
+ } #>
362
+ <input class="color-picker-hex" type="text" maxlength="7" placeholder="<?php esc_attr_e( 'Hex Value', 'kirki' ); ?>" value="{{{ field.default }}}" data-field="{{{ field.id }}}" {{ defaultValue }} />
363
 
364
  <# } else if ( 'textarea' === field.type ) { #>
365
 
controls/php/class-kirki-control-typography.php CHANGED
@@ -73,7 +73,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
73
 
74
  <div class="wrapper">
75
 
76
- <# if ( data.default['font-family'] ) { #>
77
  <# data.value['font-family'] = data.value['font-family'] || data['default']['font-family']; #>
78
  <# if ( data.choices['fonts'] ) { data.fonts = data.choices['fonts']; } #>
79
  <div class="font-family">
@@ -94,7 +94,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
94
  <# } #>
95
  <# } #>
96
 
97
- <# if ( data.default['font-size'] ) { #>
98
  <# data.value['font-size'] = data.value['font-size'] || data['default']['font-size']; #>
99
  <div class="font-size">
100
  <h5><?php esc_attr_e( 'Font Size', 'kirki' ); ?></h5>
@@ -102,7 +102,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
102
  </div>
103
  <# } #>
104
 
105
- <# if ( data.default['line-height'] ) { #>
106
  <# data.value['line-height'] = data.value['line-height'] || data['default']['line-height']; #>
107
  <div class="line-height">
108
  <h5><?php esc_attr_e( 'Line Height', 'kirki' ); ?></h5>
@@ -110,7 +110,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
110
  </div>
111
  <# } #>
112
 
113
- <# if ( data.default['letter-spacing'] ) { #>
114
  <# data.value['letter-spacing'] = data.value['letter-spacing'] || data['default']['letter-spacing']; #>
115
  <div class="letter-spacing">
116
  <h5><?php esc_attr_e( 'Letter Spacing', 'kirki' ); ?></h5>
@@ -118,7 +118,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
118
  </div>
119
  <# } #>
120
 
121
- <# if ( data.default['word-spacing'] ) { #>
122
  <# data.value['word-spacing'] = data.value['word-spacing'] || data['default']['word-spacing']; #>
123
  <div class="word-spacing">
124
  <h5><?php esc_attr_e( 'Word Spacing', 'kirki' ); ?></h5>
@@ -126,7 +126,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
126
  </div>
127
  <# } #>
128
 
129
- <# if ( data.default['text-align'] ) { #>
130
  <# data.value['text-align'] = data.value['text-align'] || data['default']['text-align']; #>
131
  <div class="text-align">
132
  <h5><?php esc_attr_e( 'Text Align', 'kirki' ); ?></h5>
@@ -165,11 +165,12 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
165
  </div>
166
  <# } #>
167
 
168
- <# if ( data.default['text-transform'] ) { #>
169
  <# data.value['text-transform'] = data.value['text-transform'] || data['default']['text-transform']; #>
170
  <div class="text-transform">
171
  <h5><?php esc_attr_e( 'Text Transform', 'kirki' ); ?></h5>
172
  <select {{{ data.inputAttrs }}} id="kirki-typography-text-transform-{{{ data.id }}}">
 
173
  <option value="none"<# if ( 'none' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'None', 'kirki' ); ?></option>
174
  <option value="capitalize"<# if ( 'capitalize' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'Capitalize', 'kirki' ); ?></option>
175
  <option value="uppercase"<# if ( 'uppercase' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'Uppercase', 'kirki' ); ?></option>
@@ -180,11 +181,12 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
180
  </div>
181
  <# } #>
182
 
183
- <# if ( data.default['text-decoration'] ) { #>
184
  <# data.value['text-decoration'] = data.value['text-decoration'] || data['default']['text-decoration']; #>
185
  <div class="text-decoration">
186
  <h5><?php esc_attr_e( 'Text Decoration', 'kirki' ); ?></h5>
187
  <select {{{ data.inputAttrs }}} id="kirki-typography-text-decoration-{{{ data.id }}}">
 
188
  <option value="none"<# if ( 'none' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'None', 'kirki' ); ?></option>
189
  <option value="underline"<# if ( 'underline' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'Underline', 'kirki' ); ?></option>
190
  <option value="overline"<# if ( 'overline' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'Overline', 'kirki' ); ?></option>
@@ -195,7 +197,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
195
  </div>
196
  <# } #>
197
 
198
- <# if ( data.default['margin-top'] ) { #>
199
  <# data.value['margin-top'] = data.value['margin-top'] || data['default']['margin-top']; #>
200
  <div class="margin-top">
201
  <h5><?php esc_attr_e( 'Margin Top', 'kirki' ); ?></h5>
@@ -203,7 +205,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
203
  </div>
204
  <# } #>
205
 
206
- <# if ( data.default['margin-bottom'] ) { #>
207
  <# data.value['margin-bottom'] = data.value['margin-bottom'] || data['default']['margin-bottom']; #>
208
  <div class="margin-bottom">
209
  <h5><?php esc_attr_e( 'Margin Bottom', 'kirki' ); ?></h5>
@@ -211,7 +213,7 @@ class Kirki_Control_Typography extends Kirki_Control_Base {
211
  </div>
212
  <# } #>
213
 
214
- <# if ( false !== data.default['color'] && data.default['color'] ) { #>
215
  <# data.value['color'] = data.value['color'] || data['default']['color']; #>
216
  <div class="color">
217
  <h5><?php esc_attr_e( 'Color', 'kirki' ); ?></h5>
73
 
74
  <div class="wrapper">
75
 
76
+ <# if ( ! _.isUndefined( data.default['font-family'] ) ) { #>
77
  <# data.value['font-family'] = data.value['font-family'] || data['default']['font-family']; #>
78
  <# if ( data.choices['fonts'] ) { data.fonts = data.choices['fonts']; } #>
79
  <div class="font-family">
94
  <# } #>
95
  <# } #>
96
 
97
+ <# if ( ! _.isUndefined( data.default['font-size'] ) ) { #>
98
  <# data.value['font-size'] = data.value['font-size'] || data['default']['font-size']; #>
99
  <div class="font-size">
100
  <h5><?php esc_attr_e( 'Font Size', 'kirki' ); ?></h5>
102
  </div>
103
  <# } #>
104
 
105
+ <# if ( ! _.isUndefined( data.default['line-height'] ) ) { #>
106
  <# data.value['line-height'] = data.value['line-height'] || data['default']['line-height']; #>
107
  <div class="line-height">
108
  <h5><?php esc_attr_e( 'Line Height', 'kirki' ); ?></h5>
110
  </div>
111
  <# } #>
112
 
113
+ <# if ( ! _.isUndefined( data.default['letter-spacing'] ) ) { #>
114
  <# data.value['letter-spacing'] = data.value['letter-spacing'] || data['default']['letter-spacing']; #>
115
  <div class="letter-spacing">
116
  <h5><?php esc_attr_e( 'Letter Spacing', 'kirki' ); ?></h5>
118
  </div>
119
  <# } #>
120
 
121
+ <# if ( ! _.isUndefined( data.default['word-spacing'] ) ) { #>
122
  <# data.value['word-spacing'] = data.value['word-spacing'] || data['default']['word-spacing']; #>
123
  <div class="word-spacing">
124
  <h5><?php esc_attr_e( 'Word Spacing', 'kirki' ); ?></h5>
126
  </div>
127
  <# } #>
128
 
129
+ <# if ( ! _.isUndefined( data.default['text-align'] ) ) { #>
130
  <# data.value['text-align'] = data.value['text-align'] || data['default']['text-align']; #>
131
  <div class="text-align">
132
  <h5><?php esc_attr_e( 'Text Align', 'kirki' ); ?></h5>
165
  </div>
166
  <# } #>
167
 
168
+ <# if ( ! _.isUndefined( data.default['text-transform'] ) ) { #>
169
  <# data.value['text-transform'] = data.value['text-transform'] || data['default']['text-transform']; #>
170
  <div class="text-transform">
171
  <h5><?php esc_attr_e( 'Text Transform', 'kirki' ); ?></h5>
172
  <select {{{ data.inputAttrs }}} id="kirki-typography-text-transform-{{{ data.id }}}">
173
+ <option value=""<# if ( '' === data.value['text-transform'] ) { #>selected<# } #>></option>
174
  <option value="none"<# if ( 'none' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'None', 'kirki' ); ?></option>
175
  <option value="capitalize"<# if ( 'capitalize' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'Capitalize', 'kirki' ); ?></option>
176
  <option value="uppercase"<# if ( 'uppercase' === data.value['text-transform'] ) { #>selected<# } #>><?php esc_attr_e( 'Uppercase', 'kirki' ); ?></option>
181
  </div>
182
  <# } #>
183
 
184
+ <# if ( ! _.isUndefined( data.default['text-decoration'] ) ) { #>
185
  <# data.value['text-decoration'] = data.value['text-decoration'] || data['default']['text-decoration']; #>
186
  <div class="text-decoration">
187
  <h5><?php esc_attr_e( 'Text Decoration', 'kirki' ); ?></h5>
188
  <select {{{ data.inputAttrs }}} id="kirki-typography-text-decoration-{{{ data.id }}}">
189
+ <option value=""<# if ( '' === data.value['text-decoration'] ) { #>selected<# } #>></option>
190
  <option value="none"<# if ( 'none' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'None', 'kirki' ); ?></option>
191
  <option value="underline"<# if ( 'underline' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'Underline', 'kirki' ); ?></option>
192
  <option value="overline"<# if ( 'overline' === data.value['text-decoration'] ) { #>selected<# } #>><?php esc_attr_e( 'Overline', 'kirki' ); ?></option>
197
  </div>
198
  <# } #>
199
 
200
+ <# if ( ! _.isUndefined( data.default['margin-top'] ) ) { #>
201
  <# data.value['margin-top'] = data.value['margin-top'] || data['default']['margin-top']; #>
202
  <div class="margin-top">
203
  <h5><?php esc_attr_e( 'Margin Top', 'kirki' ); ?></h5>
205
  </div>
206
  <# } #>
207
 
208
+ <# if ( ! _.isUndefined( data.default['margin-bottom'] ) ) { #>
209
  <# data.value['margin-bottom'] = data.value['margin-bottom'] || data['default']['margin-bottom']; #>
210
  <div class="margin-bottom">
211
  <h5><?php esc_attr_e( 'Margin Bottom', 'kirki' ); ?></h5>
213
  </div>
214
  <# } #>
215
 
216
+ <# if ( ! _.isUndefined( data.default['color'] ) && false !== data.default['color'] ) { #>
217
  <# data.value['color'] = data.value['color'] || data['default']['color']; #>
218
  <div class="color">
219
  <h5><?php esc_attr_e( 'Color', 'kirki' ); ?></h5>
controls/views/number.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Customizer controls underscore.js template.
4
+ *
5
+ * @package Kirki
6
+ * @subpackage Controls
7
+ * @copyright Copyright (c) 2017, Aristeides Stathopoulos
8
+ * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT
9
+ * @since 3.0.27
10
+ */
11
+
12
+ ?>
13
+ <#
14
+ data = _.defaults( data, {
15
+ label: '',
16
+ description: '',
17
+ inputAttrs: '',
18
+ value: '',
19
+ 'data-id': ''
20
+ } );
21
+ #>
22
+
23
+ <div class="kirki-input-container" data-id="{{ data['data-id'] }}">
24
+ <label>
25
+ <# if ( data.label ) { #>
26
+ <span class="customize-control-title">{{{ data.label }}}</span>
27
+ <# } #>
28
+ <# if ( data.description ) { #>
29
+ <span class="description customize-control-description">{{{ data.description }}}</span>
30
+ <# } #>
31
+ <div class="customize-control-content">
32
+ <input {{{ data.inputAttrs }}} type="text" value="{{ data.value }}" data-id="{{ data['data-id'] }}"/>
33
+ <div class="quantity button minus">-</div>
34
+ <div class="quantity button plus">+</div>
35
+ </div>
36
+ </label>
37
+ </div>
core/class-kirki-helper.php CHANGED
@@ -272,7 +272,7 @@ class Kirki_Helper {
272
  'deep-purple' => array( '#EDE7F6', '#D1C4E9', '#B39DDB', '#9575CD', '#7E57C2', '#673AB7', '#5E35B1', '#512DA8', '#4527A0', '#311B92', '#B388FF', '#7C4DFF', '#651FFF', '#6200EA' ),
273
  'indigo' => array( '#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E', '#8C9EFF', '#536DFE', '#3D5AFE', '#304FFE' ),
274
  'blue' => array( '#E3F2FD', '#BBDEFB', '#90CAF9', '#64B5F6', '#42A5F5', '#2196F3', '#1E88E5', '#1976D2', '#1565C0', '#0D47A1', '#82B1FF', '#448AFF', '#2979FF', '#2962FF' ),
275
- 'light_blue' => array( '#E1F5FE', '#B3E5FC', '#81D4fA', '#4fC3F7', '#29B6FC', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B', '#80D8FF', '#40C4FF', '#00B0FF', '#0091EA' ),
276
  'cyan' => array( '#E0F7FA', '#B2EBF2', '#80DEEA', '#4DD0E1', '#26C6DA', '#00BCD4', '#00ACC1', '#0097A7', '#00838F', '#006064', '#84FFFF', '#18FFFF', '#00E5FF', '#00B8D4' ),
277
  'teal' => array( '#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40', '#A7FFEB', '#64FFDA', '#1DE9B6', '#00BFA5' ),
278
  'green' => array( '#E8F5E9', '#C8E6C9', '#A5D6A7', '#81C784', '#66BB6A', '#4CAF50', '#43A047', '#388E3C', '#2E7D32', '#1B5E20', '#B9F6CA', '#69F0AE', '#00E676', '#00C853' ),
@@ -382,36 +382,44 @@ class Kirki_Helper {
382
  * @return boolean whether The comparison has succeded (true) or failed (false).
383
  */
384
  public static function compare_values( $value1, $value2, $operator ) {
385
- $return = false;
386
- if ( '===' === $operator && $value1 === $value2 ) {
387
- $return = true;
388
- } elseif ( '!==' === $operator && $value1 !== $value2 ) {
389
- $return = true;
390
- // @codingStandardsIgnoreLine WordPress.PHP.StrictComparisons.LooseComparison
391
- } elseif ( ( '!=' === $operator || 'not equal' === $operator ) && $value1 != $value2 ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
392
- $return = true;
393
- } elseif ( ( '>=' === $operator || 'greater or equal' === $operator || 'equal or greater' === $operator ) && $value2 >= $value1 ) {
394
- $return = true;
395
- } elseif ( ( '<=' === $operator || 'smaller or equal' === $operator || 'equal or smaller' === $operator ) && $value2 <= $value1 ) {
396
- $return = true;
397
- } elseif ( ( '>' === $operator || 'greater' === $operator ) && $value2 > $value1 ) {
398
- $return = true;
399
- } elseif ( ( '<' === $operator || 'smaller' === $operator ) && $value2 < $value1 ) {
400
- $return = true;
401
- } elseif ( 'contains' === $operator || 'in' === $operator ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
402
  if ( is_array( $value1 ) && ! is_array( $value2 ) ) {
403
- // @codingStandardsIgnoreLine
404
- $return = ( in_array( $value2, $value1 ) );
405
- } elseif ( is_array( $value2 ) && ! is_array( $value1 ) ) {
406
- // @codingStandardsIgnoreLine
407
- $return = ( in_array( $value1, $value2 ) );
408
- } elseif ( false === strrpos( $value1, $value2 ) && false === strpos( $value2, $value1 ) ) {
409
- $return = false;
410
  }
411
- } else {
412
- // @codingStandardsIgnoreLine WordPress.PHP.StrictComparisons.LooseComparison
413
- $return = ( $value1 == $value2 ) ? true : false; // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
414
  }
415
- return (bool) $return;
416
  }
417
  }
272
  'deep-purple' => array( '#EDE7F6', '#D1C4E9', '#B39DDB', '#9575CD', '#7E57C2', '#673AB7', '#5E35B1', '#512DA8', '#4527A0', '#311B92', '#B388FF', '#7C4DFF', '#651FFF', '#6200EA' ),
273
  'indigo' => array( '#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E', '#8C9EFF', '#536DFE', '#3D5AFE', '#304FFE' ),
274
  'blue' => array( '#E3F2FD', '#BBDEFB', '#90CAF9', '#64B5F6', '#42A5F5', '#2196F3', '#1E88E5', '#1976D2', '#1565C0', '#0D47A1', '#82B1FF', '#448AFF', '#2979FF', '#2962FF' ),
275
+ 'light-blue' => array( '#E1F5FE', '#B3E5FC', '#81D4fA', '#4fC3F7', '#29B6FC', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B', '#80D8FF', '#40C4FF', '#00B0FF', '#0091EA' ),
276
  'cyan' => array( '#E0F7FA', '#B2EBF2', '#80DEEA', '#4DD0E1', '#26C6DA', '#00BCD4', '#00ACC1', '#0097A7', '#00838F', '#006064', '#84FFFF', '#18FFFF', '#00E5FF', '#00B8D4' ),
277
  'teal' => array( '#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40', '#A7FFEB', '#64FFDA', '#1DE9B6', '#00BFA5' ),
278
  'green' => array( '#E8F5E9', '#C8E6C9', '#A5D6A7', '#81C784', '#66BB6A', '#4CAF50', '#43A047', '#388E3C', '#2E7D32', '#1B5E20', '#B9F6CA', '#69F0AE', '#00E676', '#00C853' ),
382
  * @return boolean whether The comparison has succeded (true) or failed (false).
383
  */
384
  public static function compare_values( $value1, $value2, $operator ) {
385
+ if ( '===' === $operator ) {
386
+ return $value1 === $value2;
387
+ }
388
+ if ( '!==' === $operator ) {
389
+ return $value1 !== $value2;
390
+ }
391
+ if ( ( '!=' === $operator || 'not equal' === $operator ) ) {
392
+ return $value1 != $value2;
393
+ }
394
+ if ( ( '>=' === $operator || 'greater or equal' === $operator || 'equal or greater' === $operator ) ) {
395
+ return $value2 >= $value1;
396
+ }
397
+ if ( ( '<=' === $operator || 'smaller or equal' === $operator || 'equal or smaller' === $operator ) ) {
398
+ return $value2 <= $value1;
399
+ }
400
+ if ( ( '>' === $operator || 'greater' === $operator ) ) {
401
+ return $value2 > $value1;
402
+ }
403
+ if ( ( '<' === $operator || 'smaller' === $operator ) ) {
404
+ return $value2 < $value1;
405
+ }
406
+ if ( 'contains' === $operator || 'in' === $operator ) {
407
+ if ( is_array( $value1 ) && is_array( $value2 ) ) {
408
+ foreach ( $value2 as $val ) {
409
+ if ( in_array( $val, $value1 ) ) {
410
+ return true;
411
+ }
412
+ }
413
+ return false;
414
+ }
415
  if ( is_array( $value1 ) && ! is_array( $value2 ) ) {
416
+ return in_array( $value2, $value1 );
417
+ }
418
+ if ( is_array( $value2 ) && ! is_array( $value1 ) ) {
419
+ return in_array( $value1, $value2 );
 
 
 
420
  }
421
+ return ( false !== strrpos( $value1, $value2 ) || false !== strpos( $value2, $value1 ) );
 
 
422
  }
423
+ return $value1 == $value2;
424
  }
425
  }
core/class-kirki-init.php CHANGED
@@ -81,7 +81,7 @@ class Kirki_Init {
81
  public function default_control_types( $control_types = array() ) {
82
 
83
  $this->control_types = array(
84
- 'checkbox' => 'WP_Customize_Control',
85
  'kirki-background' => 'Kirki_Control_Background',
86
  'code_editor' => 'Kirki_Control_Code',
87
  'kirki-color' => 'Kirki_Control_Color',
@@ -142,6 +142,9 @@ class Kirki_Init {
142
  }
143
 
144
  $this->control_types = $this->default_control_types();
 
 
 
145
  foreach ( $this->control_types as $key => $classname ) {
146
  if ( ! class_exists( $classname ) ) {
147
  unset( $this->control_types[ $key ] );
81
  public function default_control_types( $control_types = array() ) {
82
 
83
  $this->control_types = array(
84
+ 'checkbox' => 'Kirki_Control_Checkbox',
85
  'kirki-background' => 'Kirki_Control_Background',
86
  'code_editor' => 'Kirki_Control_Code',
87
  'kirki-color' => 'Kirki_Control_Color',
142
  }
143
 
144
  $this->control_types = $this->default_control_types();
145
+ if ( ! class_exists( 'WP_Customize_Code_Editor_Control' ) ) {
146
+ unset( $this->control_types['code_editor'] );
147
+ }
148
  foreach ( $this->control_types as $key => $classname ) {
149
  if ( ! class_exists( $classname ) ) {
150
  unset( $this->control_types[ $key ] );
core/class-kirki-modules.php CHANGED
@@ -69,6 +69,8 @@ class Kirki_Modules {
69
  'field-dependencies' => 'Kirki_Modules_Field_Dependencies',
70
  'custom-sections' => 'Kirki_Modules_Custom_Sections',
71
  'webfonts' => 'Kirki_Modules_Webfonts',
 
 
72
  )
73
  );
74
 
69
  'field-dependencies' => 'Kirki_Modules_Field_Dependencies',
70
  'custom-sections' => 'Kirki_Modules_Custom_Sections',
71
  'webfonts' => 'Kirki_Modules_Webfonts',
72
+ 'webfont-loader' => 'Kirki_Modules_Webfont_Loader',
73
+ 'preset' => 'Kirki_Modules_Preset',
74
  )
75
  );
76
 
core/class-kirki-sanitize-values.php CHANGED
@@ -102,7 +102,7 @@ class Kirki_Sanitize_Values {
102
  }
103
 
104
  // If auto, inherit or initial, return the value.
105
- if ( 'auto' === $value || 'initial' === $value || 'inherit' === $value ) {
106
  return $value;
107
  }
108
 
@@ -121,7 +121,7 @@ class Kirki_Sanitize_Values {
121
  $unit_used = '';
122
 
123
  // An array of all valid CSS units. Their order was carefully chosen for this evaluation, don't mix it up!!!
124
- $units = array( 'rem', 'em', 'ex', '%', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vh', 'vw', 'vmin', 'vmax' );
125
  foreach ( $units as $unit ) {
126
  if ( false !== strpos( $value, $unit ) ) {
127
  $unit_used = $unit;
102
  }
103
 
104
  // If auto, inherit or initial, return the value.
105
+ if ( 'auto' === $value || 'initial' === $value || 'inherit' === $value || 'normal' === $value ) {
106
  return $value;
107
  }
108
 
121
  $unit_used = '';
122
 
123
  // An array of all valid CSS units. Their order was carefully chosen for this evaluation, don't mix it up!!!
124
+ $units = array( 'fr', 'rem', 'em', 'ex', '%', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vh', 'vw', 'vmin', 'vmax' );
125
  foreach ( $units as $unit ) {
126
  if ( false !== strpos( $value, $unit ) ) {
127
  $unit_used = $unit;
core/class-kirki.php CHANGED
@@ -233,6 +233,11 @@ class Kirki extends Kirki_Init {
233
  return;
234
  }
235
 
 
 
 
 
 
236
  $str = str_replace( array( '-', '_' ), ' ', $args['type'] );
237
  $classname = 'Kirki_Field_' . str_replace( ' ', '_', ucwords( $str ) );
238
  if ( class_exists( $classname ) ) {
233
  return;
234
  }
235
 
236
+ // If the field is font-awesome, enqueue the icons on the frontend.
237
+ if ( class_exists( 'Kirki_Modules_CSS' ) && ( 'fontawesome' === $args['type'] || 'kirki-fontawesome' === $args['type'] ) ) {
238
+ Kirki_Modules_CSS::add_fontawesome_script();
239
+ }
240
+
241
  $str = str_replace( array( '-', '_' ), ' ', $args['type'] );
242
  $classname = 'Kirki_Field_' . str_replace( ' ', '_', ucwords( $str ) );
243
  if ( class_exists( $classname ) ) {
field/class-kirki-field-dimension.php CHANGED
@@ -33,6 +33,6 @@ class Kirki_Field_Dimension extends Kirki_Field {
33
  * @return string
34
  */
35
  public function sanitize( $value ) {
36
- return Kirki_Sanitize_Values::css_dimension( $value );
37
  }
38
  }
33
  * @return string
34
  */
35
  public function sanitize( $value ) {
36
+ return sanitize_text_field( $value );
37
  }
38
  }
field/class-kirki-field-dimensions.php CHANGED
@@ -52,7 +52,7 @@ class Kirki_Field_Dimensions extends Kirki_Field {
52
 
53
  // Sanitize each sub-value separately.
54
  foreach ( $value as $key => $sub_value ) {
55
- $value[ $key ] = Kirki_Sanitize_Values::css_dimension( $sub_value );
56
  }
57
  return $value;
58
 
52
 
53
  // Sanitize each sub-value separately.
54
  foreach ( $value as $key => $sub_value ) {
55
+ $value[ $key ] = sanitize_text_field( $sub_value );
56
  }
57
  return $value;
58
 
field/class-kirki-field-typography.php CHANGED
@@ -172,25 +172,25 @@ class Kirki_Field_Typography extends Kirki_Field {
172
  case 'letter-spacing':
173
  case 'word-spacing':
174
  case 'line-height':
175
- $value[ $key ] = Kirki_Sanitize_Values::css_dimension( $val );
176
  break;
177
  case 'text-align':
178
- if ( ! in_array( $val, array( 'inherit', 'left', 'center', 'right', 'justify' ), true ) ) {
179
- $value['text-align'] = 'inherit';
180
  }
181
  break;
182
  case 'text-transform':
183
- if ( ! in_array( $val, array( 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ), true ) ) {
184
- $value['text-transform'] = 'none';
185
  }
186
  break;
187
  case 'text-decoration':
188
- if ( ! in_array( $val, array( 'none', 'underline', 'overline', 'line-through', 'initial', 'inherit' ), true ) ) {
189
- $value['text-transform'] = 'none';
190
  }
191
  break;
192
  case 'color':
193
- $value['color'] = ariColor::newColor( $val )->toCSS( 'hex' );
194
  break;
195
  } // End switch().
196
  } // End foreach().
172
  case 'letter-spacing':
173
  case 'word-spacing':
174
  case 'line-height':
175
+ $value[ $key ] = '' === trim( $value[ $key ] ) ? '' : sanitize_text_field( $val );
176
  break;
177
  case 'text-align':
178
+ if ( ! in_array( $val, array( '', 'inherit', 'left', 'center', 'right', 'justify' ), true ) ) {
179
+ $value['text-align'] = '';
180
  }
181
  break;
182
  case 'text-transform':
183
+ if ( ! in_array( $val, array( '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ), true ) ) {
184
+ $value['text-transform'] = '';
185
  }
186
  break;
187
  case 'text-decoration':
188
+ if ( ! in_array( $val, array( ''. 'none', 'underline', 'overline', 'line-through', 'initial', 'inherit' ), true ) ) {
189
+ $value['text-transform'] = '';
190
  }
191
  break;
192
  case 'color':
193
+ $value['color'] = '' === $value['color'] ? '' : ariColor::newColor( $val )->toCSS( 'hex' );
194
  break;
195
  } // End switch().
196
  } // End foreach().
kirki.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: The ultimate WordPress Customizer Toolkit
6
  * Author: Aristeides Stathopoulos
7
  * Author URI: http://aristath.github.io
8
- * Version: 3.0.25
9
  * Text Domain: kirki
10
  *
11
  * GitHub Plugin URI: aristath/kirki
5
  * Description: The ultimate WordPress Customizer Toolkit
6
  * Author: Aristeides Stathopoulos
7
  * Author URI: http://aristath.github.io
8
+ * Version: 3.0.26
9
  * Text Domain: kirki
10
  *
11
  * GitHub Plugin URI: aristath/kirki
modules/css/class-kirki-css-to-file.php CHANGED
@@ -114,7 +114,8 @@ class Kirki_CSS_To_File {
114
  }
115
  $css = implode( $css, '' );
116
 
117
- // Minimize the CSS a bit.
 
118
  $css = str_replace( array( "\n", "\t", "\r\n" ), '', $css );
119
  $css = str_replace( array( '{ ', '{ ', '{ ' ), '{', $css );
120
  $css = str_replace( ': ', ':', $css );
@@ -122,6 +123,7 @@ class Kirki_CSS_To_File {
122
  $css = explode( '}', $css );
123
  $css = array_unique( $css );
124
  $css = implode( $css, '}' );
 
125
 
126
  // If the folder doesn't exist, create it.
127
  if ( ! file_exists( $this->get_path( 'folder' ) ) ) {
114
  }
115
  $css = implode( $css, '' );
116
 
117
+ /*
118
+ WIP: Minimize the CSS a bit. Commented-out because of https://github.com/aristath/kirki/issues/1787
119
  $css = str_replace( array( "\n", "\t", "\r\n" ), '', $css );
120
  $css = str_replace( array( '{ ', '{ ', '{ ' ), '{', $css );
121
  $css = str_replace( ': ', ':', $css );
123
  $css = explode( '}', $css );
124
  $css = array_unique( $css );
125
  $css = implode( $css, '}' );
126
+ */
127
 
128
  // If the folder doesn't exist, create it.
129
  if ( ! file_exists( $this->get_path( 'folder' ) ) ) {
modules/css/class-kirki-modules-css.php CHANGED
@@ -58,6 +58,16 @@ class Kirki_Modules_CSS {
58
  */
59
  protected $css_to_file;
60
 
 
 
 
 
 
 
 
 
 
 
61
  /**
62
  * Constructor
63
  *
@@ -203,7 +213,8 @@ class Kirki_Modules_CSS {
203
  }
204
  $this->processed = true;
205
  }
206
- if ( apply_filters( 'kirki_load_fontawesome', true ) ) {
 
207
  wp_enqueue_script( 'kirki-fontawesome-font', 'https://use.fontawesome.com/30858dc40a.js', array(), '4.0.7', true );
208
  }
209
  }
@@ -292,4 +303,17 @@ class Kirki_Modules_CSS {
292
  return Kirki_Modules_CSS_Generator::styles_parse( Kirki_Modules_CSS_Generator::add_prefixes( $css ) );
293
  }
294
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  }
58
  */
59
  protected $css_to_file;
60
 
61
+ /**
62
+ * Should we enqueue font-awesome?
63
+ *
64
+ * @static
65
+ * @access protected
66
+ * @since 3.0.26
67
+ * @var bool
68
+ */
69
+ protected static $enqueue_fa = false;
70
+
71
  /**
72
  * Constructor
73
  *
213
  }
214
  $this->processed = true;
215
  }
216
+
217
+ if ( self::$enqueue_fa && apply_filters( 'kirki_load_fontawesome', true ) ) {
218
  wp_enqueue_script( 'kirki-fontawesome-font', 'https://use.fontawesome.com/30858dc40a.js', array(), '4.0.7', true );
219
  }
220
  }
303
  return Kirki_Modules_CSS_Generator::styles_parse( Kirki_Modules_CSS_Generator::add_prefixes( $css ) );
304
  }
305
  }
306
+
307
+ /**
308
+ * Runs when we're adding a font-awesome field to allow enqueueing the
309
+ * fontawesome script on the frontend.
310
+ *
311
+ * @static
312
+ * @since 3.0.26
313
+ * @access public
314
+ * @return void
315
+ */
316
+ public static function add_fontawesome_script() {
317
+ self::$enqueue_fa = true;
318
+ }
319
  }
modules/css/class-kirki-output.php CHANGED
@@ -282,7 +282,9 @@ class Kirki_Output {
282
  $this->styles[ $output['media_query'] ][ $output['element'] ][ $output['property'] ][] = $output['prefix'] . $value . $output['units'] . $output['suffix'];
283
  return;
284
  }
285
- $this->styles[ $output['media_query'] ][ $output['element'] ][ $output['property'] ] = $output['prefix'] . $this->process_property_value( $output['property'], $value ) . $output['units'] . $output['suffix'];
 
 
286
  }
287
 
288
  /**
282
  $this->styles[ $output['media_query'] ][ $output['element'] ][ $output['property'] ][] = $output['prefix'] . $value . $output['units'] . $output['suffix'];
283
  return;
284
  }
285
+ if ( is_string( $value ) ) {
286
+ $this->styles[ $output['media_query'] ][ $output['element'] ][ $output['property'] ] = $output['prefix'] . $this->process_property_value( $output['property'], $value ) . $output['units'] . $output['suffix'];
287
+ }
288
  }
289
 
290
  /**
modules/css/field/class-kirki-output-field-background.php CHANGED
@@ -34,6 +34,12 @@ class Kirki_Output_Field_Background extends Kirki_Output {
34
  );
35
 
36
  foreach ( array( 'background-image', 'background-color', 'background-repeat', 'background-position', 'background-size', 'background-attachment' ) as $property ) {
 
 
 
 
 
 
37
  if ( isset( $value[ $property ] ) && ! empty( $value[ $property ] ) ) {
38
  $this->styles[ $output['media_query'] ][ $output['element'] ][ $property ] = $output['prefix'] . $this->process_property_value( $property, $value[ $property ] ) . $output['suffix'];
39
  }
34
  );
35
 
36
  foreach ( array( 'background-image', 'background-color', 'background-repeat', 'background-position', 'background-size', 'background-attachment' ) as $property ) {
37
+
38
+ // See https://github.com/aristath/kirki/issues/1808.
39
+ if ( 'background-color' === $property && ( ! isset( $value['background-image'] ) || empty( $value['background-image'] ) ) ) {
40
+ $this->styles[ $output['media_query'] ][ $output['element'] ]['background'] = $output['prefix'] . $this->process_property_value( $property, $value[ $property ] ) . $output['suffix'];
41
+ }
42
+
43
  if ( isset( $value[ $property ] ) && ! empty( $value[ $property ] ) ) {
44
  $this->styles[ $output['media_query'] ][ $output['element'] ][ $property ] = $output['prefix'] . $this->process_property_value( $property, $value[ $property ] ) . $output['suffix'];
45
  }
modules/css/field/class-kirki-output-field-dimensions.php CHANGED
@@ -37,7 +37,7 @@ class Kirki_Output_Field_Dimensions extends Kirki_Output {
37
  return;
38
  }
39
 
40
- foreach ( $value as $key => $sub_value ) {
41
 
42
  $property = ( empty( $output['property'] ) ) ? $key : $output['property'] . '-' . $key;
43
  if ( isset( $output['choice'] ) && $output['property'] ) {
37
  return;
38
  }
39
 
40
+ foreach ( array_keys( $value ) as $key ) {
41
 
42
  $property = ( empty( $output['property'] ) ) ? $key : $output['property'] . '-' . $key;
43
  if ( isset( $output['choice'] ) && $output['property'] ) {
modules/css/property/class-kirki-output-property-background-position.php CHANGED
@@ -47,10 +47,10 @@ class Kirki_Output_Property_Background_Position extends Kirki_Output_Property {
47
 
48
  // If x is not left/center/right, we need to sanitize it.
49
  if ( ! in_array( $x, $x_dimensions, true ) ) {
50
- $x = Kirki_Sanitize_Values::css_dimension( $x );
51
  }
52
  if ( ! in_array( $y, $y_dimensions, true ) ) {
53
- $y = Kirki_Sanitize_Values::css_dimension( $y );
54
  }
55
  $this->value = $x . ' ' . $y;
56
  return;
47
 
48
  // If x is not left/center/right, we need to sanitize it.
49
  if ( ! in_array( $x, $x_dimensions, true ) ) {
50
+ $x = sanitize_text_field( $x );
51
  }
52
  if ( ! in_array( $y, $y_dimensions, true ) ) {
53
+ $y = sanitize_text_field( $y );
54
  }
55
  $this->value = $x . ' ' . $y;
56
  return;
modules/custom-sections/sections.js CHANGED
@@ -4,7 +4,7 @@ jQuery( document ).ready( function() {
4
 
5
  // Get the pane element.
6
  var pane = jQuery( '#sub-accordion-section-' + section.id ),
7
- sectionLi = jQuery( '#accordion-section-' + section.id );
8
 
9
  // Check if the section is expanded.
10
  if ( sectionLi.hasClass( 'control-section-kirki-expanded' ) ) {
@@ -24,16 +24,16 @@ jQuery( document ).ready( function() {
24
  ( function() {
25
 
26
  var _panelEmbed,
27
- _panelIsContextuallyActive,
28
- _panelAttachEvents,
29
- _sectionEmbed,
30
- _sectionIsContextuallyActive,
31
- _sectionAttachEvents;
32
 
33
  wp.customize.bind( 'pane-contents-reflowed', function() {
34
 
35
  var panels = [],
36
- sections = [];
37
 
38
  // Reflow Sections.
39
  wp.customize.section.each( function( section ) {
@@ -42,7 +42,7 @@ jQuery( document ).ready( function() {
42
  return;
43
  }
44
  sections.push( section );
45
- });
46
 
47
  sections.sort( wp.customize.utils.prioritySort ).reverse();
48
 
@@ -50,7 +50,7 @@ jQuery( document ).ready( function() {
50
  var parentContainer = jQuery( '#sub-accordion-section-' + section.params.section );
51
 
52
  parentContainer.children( '.section-meta' ).after( section.headContainer );
53
- });
54
 
55
  // Reflow Panels.
56
  wp.customize.panel.each( function( panel ) {
@@ -58,7 +58,7 @@ jQuery( document ).ready( function() {
58
  return;
59
  }
60
  panels.push( panel );
61
- });
62
 
63
  panels.sort( wp.customize.utils.prioritySort ).reverse();
64
 
@@ -66,15 +66,15 @@ jQuery( document ).ready( function() {
66
  var parentContainer = jQuery( '#sub-accordion-panel-' + panel.params.panel );
67
 
68
  parentContainer.children( '.panel-meta' ).after( panel.headContainer );
69
- });
70
- });
71
 
72
  // Extend Panel.
73
  _panelEmbed = wp.customize.Panel.prototype.embed;
74
  _panelIsContextuallyActive = wp.customize.Panel.prototype.isContextuallyActive;
75
  _panelAttachEvents = wp.customize.Panel.prototype.attachEvents;
76
 
77
- wp.customize.Panel = wp.customize.Panel.extend({
78
  attachEvents: function() {
79
  var panel;
80
 
@@ -95,7 +95,7 @@ jQuery( document ).ready( function() {
95
  } else {
96
  parent.contentContainer.removeClass( 'current-panel-parent' );
97
  }
98
- });
99
 
100
  panel.container.find( '.customize-panel-back' ).off( 'click keydown' ).on( 'click keydown', function( event ) {
101
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
@@ -106,13 +106,13 @@ jQuery( document ).ready( function() {
106
  if ( panel.expanded() ) {
107
  wp.customize.panel( panel.params.panel ).expand();
108
  }
109
- });
110
  },
111
 
112
  embed: function() {
113
 
114
  var panel = this,
115
- parentContainer;
116
  if ( 'kirki-nested' !== this.params.type || _.isUndefined( this.params.panel ) ) {
117
  _panelEmbed.call( this );
118
  return;
@@ -128,8 +128,8 @@ jQuery( document ).ready( function() {
128
  isContextuallyActive: function() {
129
 
130
  var panel = this,
131
- children,
132
- activeCount = 0;
133
 
134
  if ( 'kirki-nested' !== this.params.type ) {
135
  return _panelIsContextuallyActive.call( this );
@@ -147,7 +147,7 @@ jQuery( document ).ready( function() {
147
  }
148
 
149
  children.push( child );
150
- });
151
 
152
  children.sort( wp.customize.utils.prioritySort );
153
 
@@ -155,17 +155,17 @@ jQuery( document ).ready( function() {
155
  if ( child.active() && child.isContextuallyActive() ) {
156
  activeCount += 1;
157
  }
158
- });
159
  return ( 0 !== activeCount );
160
  }
161
- });
162
 
163
  // Extend Section.
164
  _sectionEmbed = wp.customize.Section.prototype.embed;
165
  _sectionIsContextuallyActive = wp.customize.Section.prototype.isContextuallyActive;
166
  _sectionAttachEvents = wp.customize.Section.prototype.attachEvents;
167
 
168
- wp.customize.Section = wp.customize.Section.extend({
169
  attachEvents: function() {
170
 
171
  var section = this;
@@ -185,7 +185,7 @@ jQuery( document ).ready( function() {
185
  } else {
186
  parent.contentContainer.removeClass( 'current-section-parent' );
187
  }
188
- });
189
 
190
  section.container.find( '.customize-section-back' ).off( 'click keydown' ).on( 'click keydown', function( event ) {
191
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
@@ -195,13 +195,13 @@ jQuery( document ).ready( function() {
195
  if ( section.expanded() ) {
196
  wp.customize.section( section.params.section ).expand();
197
  }
198
- });
199
  },
200
 
201
  embed: function() {
202
 
203
  var section = this,
204
- parentContainer;
205
 
206
  if ( 'kirki-nested' !== this.params.type || _.isUndefined( this.params.section ) ) {
207
  _sectionEmbed.call( section );
@@ -217,8 +217,8 @@ jQuery( document ).ready( function() {
217
 
218
  isContextuallyActive: function() {
219
  var section = this,
220
- children,
221
- activeCount = 0;
222
  if ( 'kirki-nested' !== this.params.type ) {
223
  return _sectionIsContextuallyActive.call( this );
224
  }
@@ -234,7 +234,7 @@ jQuery( document ).ready( function() {
234
  return;
235
  }
236
  children.push( child );
237
- });
238
 
239
  children.sort( wp.customize.utils.prioritySort );
240
 
@@ -248,9 +248,9 @@ jQuery( document ).ready( function() {
248
  activeCount += 1;
249
  }
250
  }
251
- });
252
 
253
  return ( 0 !== activeCount );
254
  }
255
- });
256
- })( jQuery );
4
 
5
  // Get the pane element.
6
  var pane = jQuery( '#sub-accordion-section-' + section.id ),
7
+ sectionLi = jQuery( '#accordion-section-' + section.id );
8
 
9
  // Check if the section is expanded.
10
  if ( sectionLi.hasClass( 'control-section-kirki-expanded' ) ) {
24
  ( function() {
25
 
26
  var _panelEmbed,
27
+ _panelIsContextuallyActive,
28
+ _panelAttachEvents,
29
+ _sectionEmbed,
30
+ _sectionIsContextuallyActive,
31
+ _sectionAttachEvents;
32
 
33
  wp.customize.bind( 'pane-contents-reflowed', function() {
34
 
35
  var panels = [],
36
+ sections = [];
37
 
38
  // Reflow Sections.
39
  wp.customize.section.each( function( section ) {
42
  return;
43
  }
44
  sections.push( section );
45
+ } );
46
 
47
  sections.sort( wp.customize.utils.prioritySort ).reverse();
48
 
50
  var parentContainer = jQuery( '#sub-accordion-section-' + section.params.section );
51
 
52
  parentContainer.children( '.section-meta' ).after( section.headContainer );
53
+ } );
54
 
55
  // Reflow Panels.
56
  wp.customize.panel.each( function( panel ) {
58
  return;
59
  }
60
  panels.push( panel );
61
+ } );
62
 
63
  panels.sort( wp.customize.utils.prioritySort ).reverse();
64
 
66
  var parentContainer = jQuery( '#sub-accordion-panel-' + panel.params.panel );
67
 
68
  parentContainer.children( '.panel-meta' ).after( panel.headContainer );
69
+ } );
70
+ } );
71
 
72
  // Extend Panel.
73
  _panelEmbed = wp.customize.Panel.prototype.embed;
74
  _panelIsContextuallyActive = wp.customize.Panel.prototype.isContextuallyActive;
75
  _panelAttachEvents = wp.customize.Panel.prototype.attachEvents;
76
 
77
+ wp.customize.Panel = wp.customize.Panel.extend( {
78
  attachEvents: function() {
79
  var panel;
80
 
95
  } else {
96
  parent.contentContainer.removeClass( 'current-panel-parent' );
97
  }
98
+ } );
99
 
100
  panel.container.find( '.customize-panel-back' ).off( 'click keydown' ).on( 'click keydown', function( event ) {
101
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
106
  if ( panel.expanded() ) {
107
  wp.customize.panel( panel.params.panel ).expand();
108
  }
109
+ } );
110
  },
111
 
112
  embed: function() {
113
 
114
  var panel = this,
115
+ parentContainer;
116
  if ( 'kirki-nested' !== this.params.type || _.isUndefined( this.params.panel ) ) {
117
  _panelEmbed.call( this );
118
  return;
128
  isContextuallyActive: function() {
129
 
130
  var panel = this,
131
+ children,
132
+ activeCount = 0;
133
 
134
  if ( 'kirki-nested' !== this.params.type ) {
135
  return _panelIsContextuallyActive.call( this );
147
  }
148
 
149
  children.push( child );
150
+ } );
151
 
152
  children.sort( wp.customize.utils.prioritySort );
153
 
155
  if ( child.active() && child.isContextuallyActive() ) {
156
  activeCount += 1;
157
  }
158
+ } );
159
  return ( 0 !== activeCount );
160
  }
161
+ } );
162
 
163
  // Extend Section.
164
  _sectionEmbed = wp.customize.Section.prototype.embed;
165
  _sectionIsContextuallyActive = wp.customize.Section.prototype.isContextuallyActive;
166
  _sectionAttachEvents = wp.customize.Section.prototype.attachEvents;
167
 
168
+ wp.customize.Section = wp.customize.Section.extend( {
169
  attachEvents: function() {
170
 
171
  var section = this;
185
  } else {
186
  parent.contentContainer.removeClass( 'current-section-parent' );
187
  }
188
+ } );
189
 
190
  section.container.find( '.customize-section-back' ).off( 'click keydown' ).on( 'click keydown', function( event ) {
191
  if ( wp.customize.utils.isKeydownButNotEnterEvent( event ) ) {
195
  if ( section.expanded() ) {
196
  wp.customize.section( section.params.section ).expand();
197
  }
198
+ } );
199
  },
200
 
201
  embed: function() {
202
 
203
  var section = this,
204
+ parentContainer;
205
 
206
  if ( 'kirki-nested' !== this.params.type || _.isUndefined( this.params.section ) ) {
207
  _sectionEmbed.call( section );
217
 
218
  isContextuallyActive: function() {
219
  var section = this,
220
+ children,
221
+ activeCount = 0;
222
  if ( 'kirki-nested' !== this.params.type ) {
223
  return _sectionIsContextuallyActive.call( this );
224
  }
234
  return;
235
  }
236
  children.push( child );
237
+ } );
238
 
239
  children.sort( wp.customize.utils.prioritySort );
240
 
248
  activeCount += 1;
249
  }
250
  }
251
+ } );
252
 
253
  return ( 0 !== activeCount );
254
  }
255
+ } );
256
+ }( jQuery ) );
modules/customizer-branding/branding.js CHANGED
@@ -11,4 +11,4 @@ jQuery( document ).ready( function() {
11
  jQuery( 'div#customize-info > .customize-panel-description' ).replaceWith( '<div class="customize-panel-description">' + kirkiBranding.description + '</div>' );
12
  }
13
 
14
- });
11
  jQuery( 'div#customize-info > .customize-panel-description' ).replaceWith( '<div class="customize-panel-description">' + kirkiBranding.description + '</div>' );
12
  }
13
 
14
+ } );
modules/field-dependencies/field-dependencies.js CHANGED
@@ -12,9 +12,9 @@ var kirkiDependencies = {
12
  _.each( self.listenTo, function( slaves, master ) {
13
  _.each( slaves, function( slave ) {
14
  wp.customize( master, function( setting ) {
15
- var setupControl = function( control ) {
16
- var setActiveState,
17
- isDisplayed;
18
 
19
  isDisplayed = function() {
20
  return self.showKirkiControl( wp.customize.control( slave ) );
@@ -26,11 +26,11 @@ var kirkiDependencies = {
26
  setActiveState();
27
  setting.bind( setActiveState );
28
  control.active.validate = isDisplayed;
29
- };
30
- wp.customize.control( slave, setupControl );
31
  } );
32
- });
33
- });
34
  },
35
 
36
  /**
@@ -41,8 +41,17 @@ var kirkiDependencies = {
41
  * @returns {bool}
42
  */
43
  showKirkiControl: function( control ) {
44
- var self = this,
45
- show = true;
 
 
 
 
 
 
 
 
 
46
 
47
  if ( _.isString( control ) ) {
48
  control = wp.customize.control( control );
@@ -54,39 +63,70 @@ var kirkiDependencies = {
54
  }
55
 
56
  // Loop control requirements.
57
- _.each( control.params.required, function( requirement ) {
58
- let requirementShow;
59
-
60
- // Tweak for using active callbacks with serialized options instead of theme_mods.
61
- if (
62
- control.params && // Check if control.params exists.
63
- control.params.kirkiOptionType && // Check if option_type exists.
64
- 'option' === control.params.kirkiOptionType && // We're using options.
65
- control.params.kirkiOptionName && // Check if option_name exists.
66
- ! _.isEmpty( control.params.kirkiOptionName ) && // Check if option_name is not empty.
67
- -1 === requirement.setting.indexOf( control.params.kirkiOptionName + '[' ) // Make sure we don't already have the option_name in there.
68
- ) {
69
- requirement.setting = control.params.kirkiOptionName + '[' + requirement.setting + ']';
70
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
- // Early exit if setting is not defined.
73
- if ( 'undefined' === typeof wp.customize.control( requirement.setting ) ) {
74
- show = true;
75
- return;
76
  }
 
77
 
78
- requirementShow = self.evaluate( requirement.value, wp.customize.control( requirement.setting ).setting._value, requirement.operator );
 
 
79
 
80
- self.listenTo[ requirement.setting ] = self.listenTo[ requirement.setting ] || [];
81
- if ( -1 === self.listenTo[ requirement.setting ].indexOf( control.id ) ) {
82
- self.listenTo[ requirement.setting ].push( control.id );
83
  }
84
 
85
- if ( ! requirementShow ) {
86
- show = false;
 
87
  }
88
- } );
89
- return show;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  },
91
 
92
  /**
@@ -99,26 +139,42 @@ var kirkiDependencies = {
99
  * @returns {bool}
100
  */
101
  evaluate: function( value1, value2, operator ) {
102
- var found = false,
103
- result = null;
104
 
105
  if ( '===' === operator ) {
106
- result = value1 === value2;
107
- } else if ( '==' === operator || '=' === operator || 'equals' === operator || 'equal' === operator ) {
108
- result = value1 == value2; // jshint ignore:line
109
- } else if ( '!==' === operator ) {
110
- result = value1 !== value2;
111
- } else if ( '!=' === operator || 'not equal' === operator ) {
112
- result = value1 != value2; // jshint ignore:line
113
- } else if ( '>=' === operator || 'greater or equal' === operator || 'equal or greater' === operator ) {
114
- result = value2 >= value1;
115
- } else if ( '<=' === operator || 'smaller or equal' === operator || 'equal or smaller' === operator ) {
116
- result = value2 <= value1;
117
- } else if ( '>' === operator || 'greater' === operator ) {
118
- result = value2 > value1;
119
- } else if ( '<' === operator || 'smaller' === operator ) {
120
- result = value2 < value1;
121
- } else if ( 'contains' === operator || 'in' === operator ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  if ( _.isArray( value2 ) ) {
123
  _.each( value2, function( value ) {
124
  if ( value == value1 ) { // jshint ignore:line
@@ -126,25 +182,26 @@ var kirkiDependencies = {
126
  }
127
  } );
128
  return found;
129
- } else if ( _.isObject( value2 ) ) {
 
130
  if ( ! _.isUndefined( value2[ value1 ] ) ) {
131
  found = true;
132
  }
133
-
134
  _.each( value2, function( subValue ) {
135
  if ( value1 === subValue ) {
136
  found = true;
137
  }
138
  } );
139
  return found;
140
- } else if ( _.isString( value2 ) ) {
141
- return value1.indexOf( value2 ) > -1;
 
 
 
 
142
  }
143
  }
144
- if ( null === result ) {
145
- return true;
146
- }
147
- return result;
148
  }
149
  };
150
 
12
  _.each( self.listenTo, function( slaves, master ) {
13
  _.each( slaves, function( slave ) {
14
  wp.customize( master, function( setting ) {
15
+ var setupControl = function( control ) {
16
+ var setActiveState,
17
+ isDisplayed;
18
 
19
  isDisplayed = function() {
20
  return self.showKirkiControl( wp.customize.control( slave ) );
26
  setActiveState();
27
  setting.bind( setActiveState );
28
  control.active.validate = isDisplayed;
29
+ };
30
+ wp.customize.control( slave, setupControl );
31
  } );
32
+ } );
33
+ } );
34
  },
35
 
36
  /**
41
  * @returns {bool}
42
  */
43
  showKirkiControl: function( control ) {
44
+ var self = this,
45
+ show = true,
46
+ isOption = (
47
+ control.params && // Check if control.params exists.
48
+ control.params.kirkiOptionType && // Check if option_type exists.
49
+ 'option' === control.params.kirkiOptionType && // We're using options.
50
+ control.params.kirkiOptionName && // Check if option_name exists.
51
+ ! _.isEmpty( control.params.kirkiOptionName ) // Check if option_name is not empty.
52
+ ),
53
+ i;
54
+
55
 
56
  if ( _.isString( control ) ) {
57
  control = wp.customize.control( control );
63
  }
64
 
65
  // Loop control requirements.
66
+ for ( i = 0; i < control.params.required.length; i++ ) {
67
+ if ( ! self.checkCondition( control.params.required[ i ], control, isOption, 'AND' ) ) {
68
+ show = false;
 
 
 
 
 
 
 
 
 
 
69
  }
70
+ }
71
+ return show;
72
+ },
73
+
74
+ /**
75
+ * Check a condition.
76
+ *
77
+ * @param {Object} requirement - The requirement, inherited from showKirkiControl.
78
+ * @param {Object} control - The control object.
79
+ * @param {bool} isOption - Whether it's an option or not.
80
+ * @param {string} relation - Can be one of 'AND' or 'OR'.
81
+ */
82
+ checkCondition: function( requirement, control, isOption, relation ) {
83
+ var self = this,
84
+ childRelation = ( 'AND' === relation ) ? 'OR' : 'AND',
85
+ nestedItems,
86
+ i;
87
+
88
+ // Tweak for using active callbacks with serialized options instead of theme_mods.
89
+ if ( isOption && requirement.setting ) {
90
 
91
+ // Make sure we don't already have the option_name in there.
92
+ if ( -1 === requirement.setting.indexOf( control.params.kirkiOptionName + '[' ) ) {
93
+ requirement.setting = control.params.kirkiOptionName + '[' + requirement.setting + ']';
 
94
  }
95
+ }
96
 
97
+ // If an array of other requirements nested, we need to process them separately.
98
+ if ( 'undefined' !== typeof requirement[0] && 'undefined' === typeof requirement.setting ) {
99
+ nestedItems = [];
100
 
101
+ // Loop sub-requirements.
102
+ for ( i = 0; i < requirement.length; i++ ) {
103
+ nestedItems.push( self.checkCondition( requirement[ i ], control, isOption, childRelation ) );
104
  }
105
 
106
+ // OR relation. Check that true is part of the array.
107
+ if ( 'OR' === childRelation ) {
108
+ return ( -1 !== nestedItems.indexOf( true ) );
109
  }
110
+
111
+ // AND relation. Check that false is not part of the array.
112
+ return ( -1 === nestedItems.indexOf( false ) );
113
+ }
114
+
115
+ // Early exit if setting is not defined.
116
+ if ( 'undefined' === typeof wp.customize.control( requirement.setting ) ) {
117
+ return true;
118
+ }
119
+
120
+ self.listenTo[ requirement.setting ] = self.listenTo[ requirement.setting ] || [];
121
+ if ( -1 === self.listenTo[ requirement.setting ].indexOf( control.id ) ) {
122
+ self.listenTo[ requirement.setting ].push( control.id );
123
+ }
124
+
125
+ return self.evaluate(
126
+ requirement.value,
127
+ wp.customize.control( requirement.setting ).setting._value,
128
+ requirement.operator
129
+ );
130
  },
131
 
132
  /**
139
  * @returns {bool}
140
  */
141
  evaluate: function( value1, value2, operator ) {
142
+ var found = false;
 
143
 
144
  if ( '===' === operator ) {
145
+ return value1 === value2;
146
+ }
147
+ if ( '==' === operator || '=' === operator || 'equals' === operator || 'equal' === operator ) {
148
+ return value1 == value2;
149
+ }
150
+ if ( '!==' === operator ) {
151
+ return value1 !== value2;
152
+ }
153
+ if ( '!=' === operator || 'not equal' === operator ) {
154
+ return value1 != value2;
155
+ }
156
+ if ( '>=' === operator || 'greater or equal' === operator || 'equal or greater' === operator ) {
157
+ return value2 >= value1;
158
+ }
159
+ if ( '<=' === operator || 'smaller or equal' === operator || 'equal or smaller' === operator ) {
160
+ return value2 <= value1;
161
+ }
162
+ if ( '>' === operator || 'greater' === operator ) {
163
+ return value2 > value1;
164
+ }
165
+ if ( '<' === operator || 'smaller' === operator ) {
166
+ return value2 < value1;
167
+ }
168
+ if ( 'contains' === operator || 'in' === operator ) {
169
+ if ( _.isArray( value1 ) && _.isArray( value2 ) ) {
170
+ _.each( value2, function( value ) {
171
+ if ( value1.includes( value ) ) {
172
+ found = true;
173
+ return false;
174
+ }
175
+ } );
176
+ return found;
177
+ }
178
  if ( _.isArray( value2 ) ) {
179
  _.each( value2, function( value ) {
180
  if ( value == value1 ) { // jshint ignore:line
182
  }
183
  } );
184
  return found;
185
+ }
186
+ if ( _.isObject( value2 ) ) {
187
  if ( ! _.isUndefined( value2[ value1 ] ) ) {
188
  found = true;
189
  }
 
190
  _.each( value2, function( subValue ) {
191
  if ( value1 === subValue ) {
192
  found = true;
193
  }
194
  } );
195
  return found;
196
+ }
197
+ if ( _.isString( value2 ) ) {
198
+ if ( _.isString( value1 ) ) {
199
+ return ( -1 < value1.indexOf( value2 ) && -1 < value2.indexOf( value1 ) );
200
+ }
201
+ return -1 < value1.indexOf( value2 );
202
  }
203
  }
204
+ return value1 == value2;
 
 
 
205
  }
206
  };
207
 
modules/icons/icons.js CHANGED
@@ -27,4 +27,4 @@ jQuery( document ).ready( function() {
27
 
28
  }
29
 
30
- });
27
 
28
  }
29
 
30
+ } );
modules/postmessage/class-kirki-modules-postmessage.php CHANGED
@@ -411,7 +411,7 @@ class Kirki_Modules_PostMessage {
411
  if ( isset( $args['type'] ) ) {
412
  switch ( $args['type'] ) {
413
  case 'kirki-typography':
414
- $script .= 'fontFamily=(_.isUndefined(newval[\'font-family\']))?\'\':newval[\'font-family\'];variant=(_.isUndefined(newval.variant))?\'400\':newval.variant;fontSize=(_.isUndefined(newval[\'font-size\']))?\'\':newval[\'font-size\'];lineHeight=(_.isUndefined(newval[\'line-height\']))?\'\':newval[\'line-height\'];letterSpacing=(_.isUndefined(newval[\'letter-spacing\']))?\'\':newval[\'letter-spacing\'];wordSpacing=(_.isUndefined(newval[\'word-spacing\']))?\'\':newval[\'word-spacing\'];textAlign=(_.isUndefined(newval[\'text-align\']))?\'\':newval[\'text-align\'];textTransform=(_.isUndefined(newval[\'text-transform\']))?\'\':newval[\'text-transform\'];textDecoration=(_.isUndefined(newval[\'text-decoration\']))?\'\':newval[\'text-decoration\'];color=(_.isUndefined(newval.color))?\'\':newval.color;fw=(!_.isString(newval.variant))?\'400\':newval.variant.match(/\d/g);fontWeight=(!_.isObject(fw))?400:fw.join(\'\');fontStyle=(-1!==variant.indexOf(\'italic\'))?\'italic\':\'normal\';css=\'\';';
415
  break;
416
  }
417
  }
411
  if ( isset( $args['type'] ) ) {
412
  switch ( $args['type'] ) {
413
  case 'kirki-typography':
414
+ $script .= 'fontFamily=(_.isUndefined(newval[\'font-family\']))?\'\':newval[\'font-family\'];variant=(_.isUndefined(newval.variant))?\'400\':newval.variant;fontSize=(_.isUndefined(newval[\'font-size\']))?\'\':newval[\'font-size\'];lineHeight=(_.isUndefined(newval[\'line-height\']))?\'\':newval[\'line-height\'];letterSpacing=(_.isUndefined(newval[\'letter-spacing\']))?\'\':newval[\'letter-spacing\'];wordSpacing=(_.isUndefined(newval[\'word-spacing\']))?\'\':newval[\'word-spacing\'];textAlign=(_.isUndefined(newval[\'text-align\']))?\'\':newval[\'text-align\'];textTransform=(_.isUndefined(newval[\'text-transform\']))?\'\':newval[\'text-transform\'];textDecoration=(_.isUndefined(newval[\'text-decoration\']))?\'\':newval[\'text-decoration\'];color=(_.isUndefined(newval.color))?\'\':newval.color;fw=(!_.isString(newval.variant))?\'400\':newval.variant.match(/\d/g);fontWeight=(!_.isObject(fw))?400:fw.join(\'\');fontStyle=(variant&&-1!==variant.indexOf(\'italic\'))?\'italic\':\'normal\';css=\'\';';
415
  break;
416
  }
417
  }
modules/preset/class-kirki-modules-preset.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Automatic preset scripts calculation for Kirki controls.
4
+ *
5
+ * @package Kirki
6
+ * @category Modules
7
+ * @author Aristeides Stathopoulos
8
+ * @copyright Copyright (c) 2017, Aristeides Stathopoulos
9
+ * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT
10
+ * @since 3.0.26
11
+ */
12
+
13
+ // Exit if accessed directly.
14
+ if ( ! defined( 'ABSPATH' ) ) {
15
+ exit;
16
+ }
17
+
18
+ /**
19
+ * Adds styles to the customizer.
20
+ */
21
+ class Kirki_Modules_Preset {
22
+
23
+ /**
24
+ * The object instance.
25
+ *
26
+ * @static
27
+ * @access private
28
+ * @since 3.0.26
29
+ * @var object
30
+ */
31
+ private static $instance;
32
+
33
+ /**
34
+ * Constructor.
35
+ *
36
+ * @access protected
37
+ * @since 3.0.26
38
+ */
39
+ protected function __construct() {
40
+ add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_controls_print_footer_scripts' ) );
41
+ }
42
+
43
+ /**
44
+ * Gets an instance of this object.
45
+ * Prevents duplicate instances which avoid artefacts and improves performance.
46
+ *
47
+ * @static
48
+ * @access public
49
+ * @since 3.0.26
50
+ * @return object
51
+ */
52
+ public static function get_instance() {
53
+ if ( ! self::$instance ) {
54
+ self::$instance = new self();
55
+ }
56
+ return self::$instance;
57
+ }
58
+
59
+ /**
60
+ * Enqueue scripts.
61
+ *
62
+ * @access public
63
+ * @since 3.0.26
64
+ */
65
+ public function customize_controls_print_footer_scripts() {
66
+ wp_enqueue_script( 'kirki-preset', trailingslashit( Kirki::$url ) . 'modules/preset/preset.js', array( 'jquery' ), KIRKI_VERSION );
67
+ }
68
+ }
modules/preset/preset.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* global kirkiSetSettingValue */
2
+ jQuery( document ).ready( function() {
3
+
4
+ // Loop Controls.
5
+ wp.customize.control.each( function( control ) {
6
+
7
+ // Check if we have a preset defined.
8
+ if ( control.params && control.params.preset && ! _.isEmpty( control.params.preset ) ) {
9
+ wp.customize( control.id, function( value ) {
10
+
11
+ // Listen to value changes.
12
+ value.bind( function( to ) {
13
+
14
+ // Loop preset definitions.
15
+ _.each( control.params.preset, function( preset, valueToListen ) {
16
+
17
+ // Check if the value set want is the same as the one we're looking for.
18
+ if ( valueToListen === to ) {
19
+
20
+ // Loop settings defined inside the preset.
21
+ _.each( preset.settings, function( controlValue, controlID ) {
22
+
23
+ // Set the value.
24
+ kirkiSetSettingValue.set( controlID, controlValue );
25
+ } );
26
+ }
27
+ } );
28
+ } );
29
+ } );
30
+ }
31
+ } );
32
+ } );
modules/tooltips/tooltip.js CHANGED
@@ -4,8 +4,8 @@ jQuery( document ).ready( function() {
4
  function kirkiTooltipAdd( control ) {
5
  _.each( kirkiTooltips, function( tooltip ) {
6
  let trigger,
7
- controlID,
8
- content;
9
 
10
  if ( tooltip.id !== control.id ) {
11
  return;
@@ -25,8 +25,8 @@ jQuery( document ).ready( function() {
25
  // Handle onclick events.
26
  jQuery( '.tooltip-trigger[data-setting="' + tooltip.id + '"]' ).on( 'click', function() {
27
  jQuery( '.tooltip-content[data-setting="' + tooltip.id + '"]' ).toggleClass( 'hidden' );
28
- });
29
- });
30
 
31
  // Close tooltips if we click anywhere else.
32
  jQuery( document ).mouseup( function( e ) {
@@ -35,8 +35,8 @@ jQuery( document ).ready( function() {
35
  if ( ! jQuery( '.tooltip-content' ).hasClass( 'hidden' ) ) {
36
  jQuery( '.tooltip-content' ).addClass( 'hidden' );
37
  }
38
- }
39
- });
40
  }
41
 
42
  wp.customize.control.each( function( control ) {
@@ -51,5 +51,5 @@ jQuery( document ).ready( function() {
51
  } );
52
  }
53
  } );
54
- });
55
  } );
4
  function kirkiTooltipAdd( control ) {
5
  _.each( kirkiTooltips, function( tooltip ) {
6
  let trigger,
7
+ controlID,
8
+ content;
9
 
10
  if ( tooltip.id !== control.id ) {
11
  return;
25
  // Handle onclick events.
26
  jQuery( '.tooltip-trigger[data-setting="' + tooltip.id + '"]' ).on( 'click', function() {
27
  jQuery( '.tooltip-content[data-setting="' + tooltip.id + '"]' ).toggleClass( 'hidden' );
28
+ } );
29
+ } );
30
 
31
  // Close tooltips if we click anywhere else.
32
  jQuery( document ).mouseup( function( e ) {
35
  if ( ! jQuery( '.tooltip-content' ).hasClass( 'hidden' ) ) {
36
  jQuery( '.tooltip-content' ).addClass( 'hidden' );
37
  }
38
+ }
39
+ } );
40
  }
41
 
42
  wp.customize.control.each( function( control ) {
51
  } );
52
  }
53
  } );
54
+ } );
55
  } );
modules/webfont-loader/class-kirki-modules-webfont-loader.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WebFont-Loader Module.
4
+ *
5
+ * @see https://github.com/typekit/webfontloader
6
+ * @package Kirki
7
+ * @category Modules
8
+ * @author Aristeides Stathopoulos
9
+ * @copyright Copyright (c) 2017, Aristeides Stathopoulos
10
+ * @license http://opensource.org/licenses/https://opensource.org/licenses/MIT
11
+ * @since 3.0.26
12
+ */
13
+
14
+ // Exit if accessed directly.
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+
19
+ /**
20
+ * Adds script for tooltips.
21
+ */
22
+ class Kirki_Modules_Webfont_Loader {
23
+
24
+ /**
25
+ * The object instance.
26
+ *
27
+ * @static
28
+ * @access private
29
+ * @since 3.0.26
30
+ * @var object
31
+ */
32
+ private static $instance;
33
+
34
+ /**
35
+ * Only load the webfont script if this is true.
36
+ *
37
+ * @static
38
+ * @access public
39
+ * @since 3.0.26
40
+ * @var bool
41
+ */
42
+ public static $load = false;
43
+
44
+ /**
45
+ * The class constructor
46
+ *
47
+ * @access protected
48
+ * @since 3.0.26
49
+ */
50
+ protected function __construct() {
51
+ add_action( 'wp_head', array( $this, 'enqueue_scripts' ), 20 );
52
+ }
53
+
54
+ /**
55
+ * Gets an instance of this object.
56
+ * Prevents duplicate instances which avoid artefacts and improves performance.
57
+ *
58
+ * @static
59
+ * @access public
60
+ * @since 3.0.26
61
+ * @return object
62
+ */
63
+ public static function get_instance() {
64
+ if ( ! self::$instance ) {
65
+ self::$instance = new self();
66
+ }
67
+ return self::$instance;
68
+ }
69
+
70
+ /**
71
+ * Enqueue scripts.
72
+ *
73
+ * @access public
74
+ * @since 3.0.26
75
+ * @return void
76
+ */
77
+ public function enqueue_scripts() {
78
+ global $wp_customize;
79
+ if ( self::$load || $wp_customize || is_customize_preview() ) {
80
+ wp_enqueue_script( 'webfont-loader', trailingslashit( Kirki::$url ) . 'modules/webfont-loader/vendor-typekit/webfontloader.js', array(), '3.0.28', true );
81
+ }
82
+ }
83
+ }
modules/webfont-loader/vendor-typekit/src/closure.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ /* Web Font Loader v{{version}} - (c) Adobe Systems, Google. License: Apache 2.0 */
2
+ (function(){{{source}}}());
modules/webfont-loader/vendor-typekit/src/core/cssclassname.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.CssClassName');
2
+
3
+ /**
4
+ * Handles sanitization and construction of css class names.
5
+ * @param {string=} opt_joinChar The character to join parts of the name on.
6
+ * Defaults to '-'.
7
+ * @constructor
8
+ */
9
+ webfont.CssClassName = function(opt_joinChar) {
10
+ /** @type {string} */
11
+ this.joinChar_ = opt_joinChar || webfont.CssClassName.DEFAULT_JOIN_CHAR;
12
+ };
13
+
14
+ /**
15
+ * @const
16
+ * @type {string}
17
+ */
18
+ webfont.CssClassName.DEFAULT_JOIN_CHAR = '-';
19
+
20
+ goog.scope(function () {
21
+ var CssClassName = webfont.CssClassName;
22
+
23
+ /**
24
+ * Sanitizes a string for use as a css class name. Removes non-word and
25
+ * underscore characters.
26
+ * @param {string} name The string.
27
+ * @return {string} The sanitized string.
28
+ */
29
+ CssClassName.prototype.sanitize = function(name) {
30
+ return name.replace(/[\W_]+/g, '').toLowerCase();
31
+ };
32
+
33
+ /**
34
+ * Builds a complete css class name given a variable number of parts.
35
+ * Sanitizes, then joins the parts together.
36
+ * @param {...string} var_args The parts to join.
37
+ * @return {string} The sanitized and joined string.
38
+ */
39
+ CssClassName.prototype.build = function(var_args) {
40
+ var parts = []
41
+ for (var i = 0; i < arguments.length; i++) {
42
+ parts.push(this.sanitize(arguments[i]));
43
+ }
44
+ return parts.join(this.joinChar_);
45
+ };
46
+ });
modules/webfont-loader/vendor-typekit/src/core/domhelper.js ADDED
@@ -0,0 +1,405 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.DomHelper');
2
+
3
+ /**
4
+ * Handles common DOM manipulation tasks. The aim of this library is to cover
5
+ * the needs of typical font loading. Not more, not less.
6
+ * @param {Window} mainWindow The main window webfontloader.js is loaded in.
7
+ * @param {Window=} opt_loadWindow The window we'll load the font into. By
8
+ * default, the main window is used.
9
+ * @constructor
10
+ */
11
+ webfont.DomHelper = function(mainWindow, opt_loadWindow) {
12
+ this.mainWindow_ = mainWindow;
13
+ this.loadWindow_ = opt_loadWindow || mainWindow;
14
+
15
+ /** @type {string} */
16
+ this.protocol_;
17
+
18
+ /** @type {Document} */
19
+ this.document_ = this.loadWindow_.document;
20
+ };
21
+
22
+ goog.scope(function () {
23
+ var DomHelper = webfont.DomHelper;
24
+
25
+ /**
26
+ * The NativeFontWatchRunnner depends on the correct and reliable
27
+ * |onload| event, and browsers with the native font loading API
28
+ * have reliable @onload support as far as we know. So we use the
29
+ * event for such a case and unconditionally invokes the callback
30
+ * otherwise.
31
+ *
32
+ * @const
33
+ * @type {boolean}
34
+ */
35
+ DomHelper.CAN_WAIT_STYLESHEET = !!window['FontFace'];
36
+
37
+ /**
38
+ * Creates an element.
39
+ * @param {string} elem The element type.
40
+ * @param {Object=} opt_attr A hash of attribute key/value pairs.
41
+ * @param {string=} opt_innerHtml Contents of the element.
42
+ * @return {Element} the new element.
43
+ */
44
+ DomHelper.prototype.createElement = function(elem, opt_attr,
45
+ opt_innerHtml) {
46
+ var domElement = this.document_.createElement(elem);
47
+
48
+ if (opt_attr) {
49
+ for (var attr in opt_attr) {
50
+ // protect against native prototype augmentations
51
+ if (opt_attr.hasOwnProperty(attr)) {
52
+ if (attr == "style") {
53
+ this.setStyle(domElement, opt_attr[attr]);
54
+ } else {
55
+ domElement.setAttribute(attr, opt_attr[attr]);
56
+ }
57
+ }
58
+ }
59
+ }
60
+ if (opt_innerHtml) {
61
+ domElement.appendChild(this.document_.createTextNode(opt_innerHtml));
62
+ }
63
+ return domElement;
64
+ };
65
+
66
+ /**
67
+ * Inserts an element into the document. This is intended for unambiguous
68
+ * elements such as html, body, head.
69
+ * @param {string} tagName The element name.
70
+ * @param {Element} e The element to append.
71
+ * @return {boolean} True if the element was inserted.
72
+ */
73
+ DomHelper.prototype.insertInto = function(tagName, e) {
74
+ var t = this.document_.getElementsByTagName(tagName)[0];
75
+
76
+ if (!t) { // opera allows documents without a head
77
+ t = document.documentElement;
78
+ }
79
+
80
+ // This is safer than appendChild in IE. appendChild causes random
81
+ // JS errors in IE. Sometimes errors in other JS exectution, sometimes
82
+ // complete 'This page cannot be displayed' errors. For our purposes,
83
+ // it's equivalent because we don't need to insert at any specific
84
+ // location.
85
+ t.insertBefore(e, t.lastChild);
86
+ return true;
87
+ };
88
+
89
+ /**
90
+ * Calls a function when the body tag exists.
91
+ * @param {function()} callback The function to call.
92
+ */
93
+ DomHelper.prototype.whenBodyExists = function(callback) {
94
+ var that = this;
95
+
96
+ if (that.document_.body) {
97
+ callback();
98
+ } else {
99
+ if (that.document_.addEventListener) {
100
+ that.document_.addEventListener('DOMContentLoaded', callback);
101
+ } else {
102
+ that.document_.attachEvent('onreadystatechange', function () {
103
+ if (that.document_.readyState == 'interactive' || that.document_.readyState == 'complete') {
104
+ callback();
105
+ }
106
+ });
107
+ }
108
+ }
109
+ };
110
+
111
+ /**
112
+ * Removes an element from the DOM.
113
+ * @param {Element} node The element to remove.
114
+ * @return {boolean} True if the element was removed.
115
+ */
116
+ DomHelper.prototype.removeElement = function(node) {
117
+ if (node.parentNode) {
118
+ node.parentNode.removeChild(node);
119
+ return true;
120
+ }
121
+ return false;
122
+ };
123
+
124
+ /**
125
+ * @deprecated Use updateClassName().
126
+ *
127
+ * Appends a name to an element's class attribute.
128
+ * @param {Element} e The element.
129
+ * @param {string} name The class name to add.
130
+ */
131
+ DomHelper.prototype.appendClassName = function(e, name) {
132
+ this.updateClassName(e, [name]);
133
+ };
134
+
135
+ /**
136
+ * @deprecated Use updateClassName().
137
+ *
138
+ * Removes a name to an element's class attribute.
139
+ * @param {Element} e The element.
140
+ * @param {string} name The class name to remove.
141
+ */
142
+ DomHelper.prototype.removeClassName = function(e, name) {
143
+ this.updateClassName(e, null, [name]);
144
+ };
145
+
146
+ /**
147
+ * Updates an element's class attribute in a single change. This
148
+ * allows multiple updates in a single class name change so there
149
+ * is no chance for a browser to relayout in between changes.
150
+ *
151
+ * @param {Element} e The element.
152
+ * @param {Array.<string>=} opt_add List of class names to add.
153
+ * @param {Array.<string>=} opt_remove List of class names to remove.
154
+ */
155
+ DomHelper.prototype.updateClassName = function (e, opt_add, opt_remove) {
156
+ var add = opt_add || [],
157
+ remove = opt_remove || [];
158
+
159
+ var classes = e.className.split(/\s+/);
160
+
161
+ for (var i = 0; i < add.length; i += 1) {
162
+ var found = false;
163
+
164
+ for (var j = 0; j < classes.length; j += 1) {
165
+ if (add[i] === classes[j]) {
166
+ found = true;
167
+ break;
168
+ }
169
+ }
170
+
171
+ if (!found) {
172
+ classes.push(add[i]);
173
+ }
174
+ }
175
+
176
+ var remainingClasses = [];
177
+
178
+ for (var i = 0; i < classes.length; i += 1) {
179
+ var found = false;
180
+
181
+ for (var j = 0; j < remove.length; j += 1) {
182
+ if (classes[i] === remove[j]) {
183
+ found = true;
184
+ break;
185
+ }
186
+ }
187
+
188
+ if (!found) {
189
+ remainingClasses.push(classes[i]);
190
+ }
191
+ }
192
+
193
+ e.className = remainingClasses.join(' ')
194
+ .replace(/\s+/g, ' ')
195
+ .replace(/^\s+|\s+$/, '');
196
+ };
197
+
198
+ /**
199
+ * Returns true if an element has a given class name and false otherwise.
200
+ * @param {Element} e The element.
201
+ * @param {string} name The class name to check for.
202
+ * @return {boolean} Whether or not the element has this class name.
203
+ */
204
+ DomHelper.prototype.hasClassName = function(e, name) {
205
+ var classes = e.className.split(/\s+/);
206
+ for (var i = 0, len = classes.length; i < len; i++) {
207
+ if (classes[i] == name) {
208
+ return true;
209
+ }
210
+ }
211
+ return false;
212
+ };
213
+
214
+ /**
215
+ * Sets the style attribute on an element.
216
+ * @param {Element} e The element.
217
+ * @param {string} styleString The style string.
218
+ */
219
+ DomHelper.prototype.setStyle = function(e, styleString) {
220
+ e.style.cssText = styleString;
221
+ };
222
+
223
+ /**
224
+ * @return {Window} The main window webfontloader.js is loaded in (for config).
225
+ */
226
+ DomHelper.prototype.getMainWindow = function() {
227
+ return this.mainWindow_;
228
+ };
229
+
230
+ /**
231
+ * @return {Window} The window that we're loading the font(s) into.
232
+ */
233
+ DomHelper.prototype.getLoadWindow = function() {
234
+ return this.loadWindow_;
235
+ };
236
+
237
+ /**
238
+ * Returns the hostname of the current document.
239
+ * @return {string} hostname.
240
+ */
241
+ DomHelper.prototype.getHostName = function() {
242
+ return this.getLoadWindow().location.hostname || this.getMainWindow().location.hostname;
243
+ };
244
+
245
+ /**
246
+ * Creates a style element.
247
+ * @param {string} css Contents of the style element.
248
+ * @return {Element} a DOM element.
249
+ */
250
+ DomHelper.prototype.createStyle = function(css) {
251
+ var e = this.createElement('style');
252
+
253
+ e.setAttribute('type', 'text/css');
254
+ if (e.styleSheet) { // IE
255
+ e.styleSheet.cssText = css;
256
+ } else {
257
+ e.appendChild(document.createTextNode(css));
258
+ }
259
+ return e;
260
+ };
261
+
262
+ /**
263
+ * Loads an external stylesheet.
264
+ *
265
+ * @param {string} href the URL of the stylesheet
266
+ * @param {function(Error)=} opt_callback Called when the stylesheet has loaded or failed to
267
+ * load. Note that the callback is *NOT* guaranteed to be called in all browsers. The first
268
+ * argument to the callback is an error object that is falsy when there are no errors and
269
+ * truthy when there are.
270
+ * @param {boolean=} opt_async True if the stylesheet should be loaded asynchronously. Defaults to false.
271
+ * @return {Element} The link element
272
+ */
273
+ DomHelper.prototype.loadStylesheet = function (href, opt_callback, opt_async) {
274
+ var link = this.createElement('link', {
275
+ 'rel': 'stylesheet',
276
+ 'href': href,
277
+ 'media': (opt_async ? 'only x' : 'all')
278
+ });
279
+
280
+ var sheets = this.document_.styleSheets,
281
+ eventFired = false,
282
+ asyncResolved = !opt_async,
283
+ callbackArg = null,
284
+ callback = opt_callback || null;
285
+
286
+ function mayInvokeCallback() {
287
+ if (callback && eventFired && asyncResolved) {
288
+ callback(callbackArg);
289
+ callback = null;
290
+ }
291
+ }
292
+
293
+ if (DomHelper.CAN_WAIT_STYLESHEET) {
294
+ link.onload = function () {
295
+ eventFired = true;
296
+ mayInvokeCallback();
297
+ };
298
+
299
+ link.onerror = function () {
300
+ eventFired = true;
301
+ callbackArg = new Error('Stylesheet failed to load');
302
+ mayInvokeCallback();
303
+ };
304
+ } else {
305
+ // Some callers expect opt_callback being called asynchronously.
306
+ setTimeout(function () {
307
+ eventFired = true;
308
+ mayInvokeCallback();
309
+ }, 0);
310
+ }
311
+
312
+ function onStylesheetAvailable(callback) {
313
+ for (var i = 0; i < sheets.length; i++) {
314
+ if (sheets[i].href && sheets[i].href.indexOf(href) !== -1) {
315
+ return callback();
316
+ }
317
+ }
318
+
319
+ setTimeout(function () {
320
+ onStylesheetAvailable(callback);
321
+ }, 0);
322
+ }
323
+
324
+ function onMediaAvailable(callback) {
325
+ for (var i = 0; i < sheets.length; i++) {
326
+ if (sheets[i].href && sheets[i].href.indexOf(href) !== -1 && sheets[i].media) {
327
+ /**
328
+ * @type {string|MediaList|null}
329
+ */
330
+ var media = sheets[i].media;
331
+
332
+ if (media === "all" || (media.mediaText && media.mediaText === "all")) {
333
+ return callback();
334
+ }
335
+ }
336
+ }
337
+
338
+ setTimeout(function () {
339
+ onMediaAvailable(callback);
340
+ }, 0);
341
+ }
342
+
343
+ this.insertInto('head', link);
344
+
345
+ if (opt_async) {
346
+ onStylesheetAvailable(function () {
347
+ link.media = "all";
348
+ // The media type change doesn't take effect immediately on Chrome, so
349
+ // we'll query the media attribute on the stylesheet until it changes
350
+ // to "all".
351
+ onMediaAvailable(function () {
352
+ asyncResolved = true;
353
+ mayInvokeCallback();
354
+ });
355
+ });
356
+ }
357
+
358
+ return link;
359
+ };
360
+
361
+ /**
362
+ * Loads an external script file.
363
+ * @param {string} src URL of the script.
364
+ * @param {function(Error)=} opt_callback callback when the script has loaded. The first argument to
365
+ * the callback is an error object that is falsy when there are no errors and truthy when there are.
366
+ * @param {number=} opt_timeout The number of milliseconds after which the callback will be called
367
+ * with a timeout error. Defaults to 5 seconds.
368
+ * @return {Element} The script element
369
+ */
370
+ DomHelper.prototype.loadScript = function(src, opt_callback, opt_timeout) {
371
+ var head = this.document_.getElementsByTagName('head')[0];
372
+
373
+ if (head) {
374
+ var script = this.createElement('script', {
375
+ 'src': src
376
+ });
377
+ var done = false;
378
+ script.onload = script.onreadystatechange = function() {
379
+ if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
380
+ done = true;
381
+ if (opt_callback) {
382
+ opt_callback(null);
383
+ }
384
+ script.onload = script.onreadystatechange = null;
385
+ // Avoid a bizarre issue with unclosed <base> tag in IE6 - http://blog.dotsmart.net/2008/04/
386
+ if (script.parentNode.tagName == 'HEAD') head.removeChild(script);
387
+ }
388
+ };
389
+ head.appendChild(script);
390
+
391
+ setTimeout(function () {
392
+ if (!done) {
393
+ done = true;
394
+ if (opt_callback) {
395
+ opt_callback(new Error('Script load timeout'));
396
+ }
397
+ }
398
+ }, opt_timeout || 5000);
399
+
400
+ return script;
401
+ }
402
+
403
+ return null;
404
+ };
405
+ });
modules/webfont-loader/vendor-typekit/src/core/eventdispatcher.js ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.EventDispatcher');
2
+
3
+ goog.require('webfont.CssClassName');
4
+
5
+ /**
6
+ * A class to dispatch events and manage the event class names on an html
7
+ * element that represent the current state of fonts on the page. Active class
8
+ * names always overwrite inactive class names of the same type, while loading
9
+ * class names may be present whenever a font is loading (regardless of if an
10
+ * associated active or inactive class name is also present).
11
+ *
12
+ * @param {webfont.DomHelper} domHelper
13
+ * @param {Object} config
14
+ * @constructor
15
+ */
16
+ webfont.EventDispatcher = function(domHelper, config) {
17
+ this.domHelper_ = domHelper;
18
+ this.htmlElement_ = domHelper.getLoadWindow().document.documentElement;
19
+ this.callbacks_ = config;
20
+ this.namespace_ = webfont.EventDispatcher.DEFAULT_NAMESPACE;
21
+ this.cssClassName_ = new webfont.CssClassName('-');
22
+ this.dispatchEvents_ = config['events'] !== false;
23
+ this.setClasses_ = config['classes'] !== false;
24
+ };
25
+
26
+ /**
27
+ * @const
28
+ * @type {string}
29
+ */
30
+ webfont.EventDispatcher.DEFAULT_NAMESPACE = 'wf';
31
+
32
+ /**
33
+ * @const
34
+ * @type {string}
35
+ */
36
+ webfont.EventDispatcher.LOADING = 'loading';
37
+
38
+ /**
39
+ * @const
40
+ * @type {string}
41
+ */
42
+ webfont.EventDispatcher.ACTIVE = 'active';
43
+
44
+ /**
45
+ * @const
46
+ * @type {string}
47
+ */
48
+ webfont.EventDispatcher.INACTIVE = 'inactive';
49
+
50
+ /**
51
+ * @const
52
+ * @type {string}
53
+ */
54
+ webfont.EventDispatcher.FONT = 'font';
55
+
56
+ goog.scope(function () {
57
+ var EventDispatcher = webfont.EventDispatcher;
58
+
59
+ /**
60
+ * Dispatch the loading event and append the loading class name.
61
+ */
62
+ EventDispatcher.prototype.dispatchLoading = function() {
63
+ if (this.setClasses_) {
64
+ this.domHelper_.updateClassName(this.htmlElement_,
65
+ [
66
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.LOADING)
67
+ ]
68
+ );
69
+ }
70
+
71
+ this.dispatch_(webfont.EventDispatcher.LOADING);
72
+ };
73
+
74
+ /**
75
+ * Dispatch the font loading event and append the font loading class name.
76
+ * @param {webfont.Font} font
77
+ */
78
+ EventDispatcher.prototype.dispatchFontLoading = function(font) {
79
+ if (this.setClasses_) {
80
+ this.domHelper_.updateClassName(this.htmlElement_,
81
+ [
82
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.LOADING)
83
+ ]
84
+ );
85
+ }
86
+
87
+ this.dispatch_(webfont.EventDispatcher.FONT + webfont.EventDispatcher.LOADING, font);
88
+ };
89
+
90
+ /**
91
+ * Dispatch the font active event, remove the font loading class name, remove
92
+ * the font inactive class name, and append the font active class name.
93
+ * @param {webfont.Font} font
94
+ */
95
+ EventDispatcher.prototype.dispatchFontActive = function(font) {
96
+ if (this.setClasses_) {
97
+ this.domHelper_.updateClassName(
98
+ this.htmlElement_,
99
+ [
100
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.ACTIVE)
101
+ ],
102
+ [
103
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.LOADING),
104
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.INACTIVE)
105
+ ]
106
+ );
107
+ }
108
+
109
+ this.dispatch_(webfont.EventDispatcher.FONT + webfont.EventDispatcher.ACTIVE, font);
110
+ };
111
+
112
+ /**
113
+ * Dispatch the font inactive event, remove the font loading class name, and
114
+ * append the font inactive class name (unless the font active class name is
115
+ * already present).
116
+ * @param {webfont.Font} font
117
+ */
118
+ EventDispatcher.prototype.dispatchFontInactive = function(font) {
119
+ if (this.setClasses_) {
120
+ var hasFontActive = this.domHelper_.hasClassName(this.htmlElement_,
121
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.ACTIVE)
122
+ ),
123
+ add = [],
124
+ remove = [
125
+ this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.LOADING)
126
+ ];
127
+
128
+ if (!hasFontActive) {
129
+ add.push(this.cssClassName_.build(this.namespace_, font.getName(), font.getVariation().toString(), webfont.EventDispatcher.INACTIVE));
130
+ }
131
+
132
+ this.domHelper_.updateClassName(this.htmlElement_, add, remove);
133
+ }
134
+
135
+ this.dispatch_(webfont.EventDispatcher.FONT + webfont.EventDispatcher.INACTIVE, font);
136
+ };
137
+
138
+ /**
139
+ * Dispatch the inactive event, remove the loading class name, and append the
140
+ * inactive class name (unless the active class name is already present).
141
+ */
142
+ EventDispatcher.prototype.dispatchInactive = function() {
143
+ if (this.setClasses_) {
144
+ var hasActive = this.domHelper_.hasClassName(this.htmlElement_,
145
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.ACTIVE)
146
+ ),
147
+ add = [],
148
+ remove = [
149
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.LOADING)
150
+ ];
151
+
152
+ if (!hasActive) {
153
+ add.push(this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.INACTIVE));
154
+ }
155
+
156
+ this.domHelper_.updateClassName(this.htmlElement_, add, remove);
157
+ }
158
+
159
+ this.dispatch_(webfont.EventDispatcher.INACTIVE);
160
+ };
161
+
162
+ /**
163
+ * Dispatch the active event, remove the loading class name, remove the inactive
164
+ * class name, and append the active class name.
165
+ */
166
+ EventDispatcher.prototype.dispatchActive = function() {
167
+ if (this.setClasses_) {
168
+ this.domHelper_.updateClassName(this.htmlElement_,
169
+ [
170
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.ACTIVE)
171
+ ],
172
+ [
173
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.LOADING),
174
+ this.cssClassName_.build(this.namespace_, webfont.EventDispatcher.INACTIVE)
175
+ ]
176
+ );
177
+ }
178
+
179
+ this.dispatch_(webfont.EventDispatcher.ACTIVE);
180
+ };
181
+
182
+ /**
183
+ * @param {string} event
184
+ * @param {webfont.Font=} opt_font
185
+ */
186
+ EventDispatcher.prototype.dispatch_ = function(event, opt_font) {
187
+ if (this.dispatchEvents_ && this.callbacks_[event]) {
188
+ if (opt_font) {
189
+ this.callbacks_[event](opt_font.getName(), opt_font.getVariation());
190
+ } else {
191
+ this.callbacks_[event]();
192
+ }
193
+ }
194
+ };
195
+ });
modules/webfont-loader/vendor-typekit/src/core/font.js ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.Font');
2
+
3
+ /**
4
+ * This class is an abstraction for a single font or typeface.
5
+ * It contains the font name and the variation (i.e. style
6
+ * and weight.) A collection Font instances can represent a
7
+ * font family.
8
+ *
9
+ * @constructor
10
+ * @param {string} name The font family name
11
+ * @param {string=} opt_variation A font variation description
12
+ */
13
+ webfont.Font = function (name, opt_variation) {
14
+ this.name_ = name;
15
+ this.weight_ = 4;
16
+ this.style_ = 'n'
17
+
18
+ var variation = opt_variation || 'n4',
19
+ match = variation.match(/^([nio])([1-9])$/i);
20
+
21
+ if (match) {
22
+ this.style_ = match[1];
23
+ this.weight_ = parseInt(match[2], 10);
24
+ }
25
+ };
26
+
27
+ goog.scope(function () {
28
+ var Font = webfont.Font;
29
+
30
+ /**
31
+ * @return {string}
32
+ */
33
+ Font.prototype.getName = function () {
34
+ return this.name_;
35
+ };
36
+
37
+ /**
38
+ * @return {string}
39
+ */
40
+ Font.prototype.getCssName = function () {
41
+ return this.quote_(this.name_);
42
+ };
43
+
44
+ /**
45
+ * Returns a CSS string representation of the font that
46
+ * can be used as the CSS font property shorthand.
47
+ *
48
+ * @return {string}
49
+ */
50
+ Font.prototype.toCssString = function () {
51
+ return this.getCssStyle() + ' ' + this.getCssWeight() + ' 300px ' + this.getCssName();
52
+ };
53
+
54
+ /**
55
+ * @private
56
+ * @param {string} name
57
+ * @return {string}
58
+ */
59
+ Font.prototype.quote_ = function (name) {
60
+ var quoted = [];
61
+ var split = name.split(/,\s*/);
62
+ for (var i = 0; i < split.length; i++) {
63
+ var part = split[i].replace(/['"]/g, '');
64
+ if (part.indexOf(' ') == -1 && !(/^\d/.test(part))) {
65
+ quoted.push(part);
66
+ } else {
67
+ quoted.push("'" + part + "'");
68
+ }
69
+ }
70
+ return quoted.join(',');
71
+ };
72
+
73
+ /**
74
+ * @return {string}
75
+ */
76
+ Font.prototype.getVariation = function () {
77
+ return this.style_ + this.weight_;
78
+ };
79
+
80
+ /**
81
+ * @return {string}
82
+ */
83
+ Font.prototype.getCssVariation = function () {
84
+ return 'font-style:' + this.getCssStyle() + ';font-weight:' + this.getCssWeight() + ';';
85
+ };
86
+
87
+ /**
88
+ * @return {string}
89
+ */
90
+ Font.prototype.getCssWeight = function () {
91
+ return this.weight_ + '00';
92
+ };
93
+
94
+ /**
95
+ * @return {string}
96
+ */
97
+ Font.prototype.getCssStyle = function () {
98
+ var style = 'normal';
99
+
100
+ if (this.style_ === 'o') {
101
+ style = 'oblique';
102
+ } else if (this.style_ === 'i') {
103
+ style = 'italic';
104
+ }
105
+
106
+ return style;
107
+ };
108
+
109
+ /**
110
+ * Parses a CSS font declaration and returns a font
111
+ * variation description.
112
+ *
113
+ * @param {string} css
114
+ * @return {string}
115
+ */
116
+ Font.parseCssVariation = function (css) {
117
+ var weight = 4,
118
+ style = 'n',
119
+ m = null;
120
+
121
+ if (css) {
122
+ m = css.match(/(normal|oblique|italic)/i);
123
+
124
+ if (m && m[1]) {
125
+ style = m[1].substr(0, 1).toLowerCase();
126
+ }
127
+
128
+ m = css.match(/([1-9]00|normal|bold)/i);
129
+
130
+ if (m && m[1]) {
131
+ if (/bold/i.test(m[1])) {
132
+ weight = 7;
133
+ } else if (/[1-9]00/.test(m[1])) {
134
+ weight = parseInt(m[1].substr(0, 1), 10);
135
+ }
136
+ }
137
+ }
138
+ return style + weight;
139
+ }
140
+ });
modules/webfont-loader/vendor-typekit/src/core/fontmodule.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.FontModule');
2
+
3
+ /**
4
+ * @interface
5
+ */
6
+ webfont.FontModule = function () {};
7
+
8
+ goog.scope(function () {
9
+ var FontModule = webfont.FontModule;
10
+
11
+ /**
12
+ * @param {function(Array.<webfont.Font>, webfont.FontTestStrings=, Object.<string, boolean>=)} onReady
13
+ */
14
+ FontModule.prototype.load = function (onReady) {};
15
+ });
16
+
modules/webfont-loader/vendor-typekit/src/core/fontmoduleloader.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.FontModuleLoader');
2
+ goog.provide('webfont.FontModuleFactory');
3
+
4
+ /** @typedef {function(Object, webfont.DomHelper): webfont.FontModule} */
5
+ webfont.FontModuleFactory;
6
+
7
+ /**
8
+ * @constructor
9
+ */
10
+ webfont.FontModuleLoader = function() {
11
+ /**
12
+ * @type {Object.<string, webfont.FontModuleFactory>}
13
+ */
14
+ this.modules_ = {};
15
+ };
16
+
17
+ goog.scope(function () {
18
+ var FontModuleLoader = webfont.FontModuleLoader;
19
+
20
+ /**
21
+ * @param {string} name
22
+ * @param {webfont.FontModuleFactory} factory
23
+ */
24
+ FontModuleLoader.prototype.addModuleFactory = function(name, factory) {
25
+ this.modules_[name] = factory;
26
+ };
27
+
28
+ /**
29
+ * @param {Object} configuration
30
+ * @param {webfont.DomHelper} domHelper
31
+ * @return {Array.<webfont.FontModule>}
32
+ */
33
+ FontModuleLoader.prototype.getModules = function(configuration, domHelper) {
34
+ var modules = [];
35
+
36
+ for (var key in configuration) {
37
+ if (configuration.hasOwnProperty(key)) {
38
+ var moduleFactory = this.modules_[key];
39
+
40
+ if (moduleFactory) {
41
+ modules.push(moduleFactory(configuration[key], domHelper));
42
+ }
43
+ }
44
+ }
45
+ return modules;
46
+ };
47
+ });
modules/webfont-loader/vendor-typekit/src/core/fontruler.js ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.FontRuler');
2
+
3
+ /**
4
+ * An element that can be used to measure the metrics
5
+ * of a given font and string.
6
+ * @constructor
7
+ * @param {webfont.DomHelper} domHelper
8
+ * @param {string} fontTestString
9
+ */
10
+ webfont.FontRuler = function (domHelper, fontTestString) {
11
+ this.domHelper_ = domHelper;
12
+ this.fontTestString_ = fontTestString;
13
+ this.el_ = this.domHelper_.createElement('span', {
14
+ "aria-hidden": "true"
15
+ }, this.fontTestString_);
16
+ };
17
+
18
+ goog.scope(function () {
19
+ var FontRuler = webfont.FontRuler;
20
+
21
+ /**
22
+ * @param {webfont.Font} font
23
+ */
24
+ FontRuler.prototype.setFont = function(font) {
25
+ this.domHelper_.setStyle(this.el_, this.computeStyleString_(font));
26
+ };
27
+
28
+ /**
29
+ * Inserts the ruler into the DOM.
30
+ */
31
+ FontRuler.prototype.insert = function() {
32
+ this.domHelper_.insertInto('body', this.el_);
33
+ };
34
+
35
+ /**
36
+ * @private
37
+ * @param {webfont.Font} font
38
+ * @return {string}
39
+ */
40
+ FontRuler.prototype.computeStyleString_ = function(font) {
41
+ return "display:block;position:absolute;top:-9999px;left:-9999px;" +
42
+ "font-size:300px;width:auto;height:auto;line-height:normal;margin:0;" +
43
+ "padding:0;font-variant:normal;white-space:nowrap;font-family:" +
44
+ font.getCssName() + ";" + font.getCssVariation();
45
+ };
46
+
47
+ /**
48
+ * @return {number}
49
+ */
50
+ FontRuler.prototype.getWidth = function() {
51
+ return this.el_.offsetWidth;
52
+ };
53
+
54
+ /**
55
+ * Removes the ruler element from the DOM.
56
+ */
57
+ FontRuler.prototype.remove = function() {
58
+ this.domHelper_.removeElement(this.el_);
59
+ };
60
+ });
modules/webfont-loader/vendor-typekit/src/core/fontwatcher.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.FontWatcher');
2
+
3
+ goog.require('webfont.FontWatchRunner');
4
+ goog.require('webfont.NativeFontWatchRunner');
5
+
6
+ /**
7
+ * @typedef {Object.<string, Array.<string>>}
8
+ */
9
+ webfont.FontTestStrings;
10
+
11
+ /**
12
+ * @constructor
13
+ * @param {webfont.DomHelper} domHelper
14
+ * @param {webfont.EventDispatcher} eventDispatcher
15
+ * @param {number=} opt_timeout
16
+ */
17
+ webfont.FontWatcher = function(domHelper, eventDispatcher, opt_timeout) {
18
+ this.domHelper_ = domHelper;
19
+ this.eventDispatcher_ = eventDispatcher;
20
+ this.currentlyWatched_ = 0;
21
+ this.last_ = false;
22
+ this.success_ = false;
23
+ this.timeout_ = opt_timeout;
24
+ };
25
+
26
+ goog.scope(function () {
27
+ var FontWatcher = webfont.FontWatcher,
28
+ FontWatchRunner = webfont.FontWatchRunner,
29
+ NativeFontWatchRunner = webfont.NativeFontWatchRunner;
30
+
31
+ /**
32
+ * @type {null|boolean}
33
+ */
34
+ FontWatcher.SHOULD_USE_NATIVE_LOADER = null;
35
+
36
+ /**
37
+ * @return {string}
38
+ */
39
+ FontWatcher.getUserAgent = function () {
40
+ return window.navigator.userAgent;
41
+ };
42
+
43
+ /**
44
+ * @return {string}
45
+ */
46
+ FontWatcher.getVendor = function () {
47
+ return window.navigator.vendor;
48
+ };
49
+
50
+ /**
51
+ * Returns true if this browser has support for
52
+ * the CSS font loading API.
53
+ *
54
+ * @return {boolean}
55
+ */
56
+ FontWatcher.shouldUseNativeLoader = function () {
57
+ if (FontWatcher.SHOULD_USE_NATIVE_LOADER === null) {
58
+ if (!!window.FontFace) {
59
+ var match = /Gecko.*Firefox\/(\d+)/.exec(FontWatcher.getUserAgent());
60
+ var safari10Match = /OS X.*Version\/10\..*Safari/.exec(FontWatcher.getUserAgent()) && /Apple/.exec(FontWatcher.getVendor());
61
+
62
+ if (match) {
63
+ FontWatcher.SHOULD_USE_NATIVE_LOADER = parseInt(match[1], 10) > 42;
64
+ } else if (safari10Match) {
65
+ FontWatcher.SHOULD_USE_NATIVE_LOADER = false;
66
+ } else {
67
+ FontWatcher.SHOULD_USE_NATIVE_LOADER = true;
68
+ }
69
+ } else {
70
+ FontWatcher.SHOULD_USE_NATIVE_LOADER = false;
71
+ }
72
+ }
73
+ return FontWatcher.SHOULD_USE_NATIVE_LOADER;
74
+ };
75
+
76
+ /**
77
+ * Watches a set of font families.
78
+ * @param {Array.<webfont.Font>} fonts The fonts to watch.
79
+ * @param {webfont.FontTestStrings} fontTestStrings The font test strings for
80
+ * each family.
81
+ * @param {Object.<String, boolean>} metricCompatibleFonts
82
+ * @param {boolean} last True if this is the last set of fonts to watch.
83
+ */
84
+ FontWatcher.prototype.watchFonts = function(fonts,
85
+ fontTestStrings, metricCompatibleFonts, last) {
86
+ var length = fonts.length,
87
+ testStrings = fontTestStrings || {};
88
+
89
+ if (length === 0 && last) {
90
+ this.eventDispatcher_.dispatchInactive();
91
+ return;
92
+ }
93
+
94
+ this.currentlyWatched_ += fonts.length;
95
+
96
+ if (last) {
97
+ this.last_ = last;
98
+ }
99
+
100
+ var i, fontWatchRunners = [];
101
+ for (i = 0; i < fonts.length; i++) {
102
+ var font = fonts[i],
103
+ testString = testStrings[font.getName()];
104
+
105
+ this.eventDispatcher_.dispatchFontLoading(font);
106
+
107
+ var fontWatchRunner = null;
108
+
109
+ if (FontWatcher.shouldUseNativeLoader()) {
110
+ fontWatchRunner = new NativeFontWatchRunner(
111
+ goog.bind(this.fontActive_, this),
112
+ goog.bind(this.fontInactive_, this),
113
+ this.domHelper_,
114
+ font,
115
+ this.timeout_,
116
+ testString
117
+ );
118
+ } else {
119
+ fontWatchRunner = new FontWatchRunner(
120
+ goog.bind(this.fontActive_, this),
121
+ goog.bind(this.fontInactive_, this),
122
+ this.domHelper_,
123
+ font,
124
+ this.timeout_,
125
+ metricCompatibleFonts,
126
+ testString
127
+ );
128
+ }
129
+
130
+ fontWatchRunners.push(fontWatchRunner);
131
+ }
132
+
133
+ for (i = 0; i < fontWatchRunners.length; i++) {
134
+ fontWatchRunners[i].start();
135
+ }
136
+ };
137
+
138
+ /**
139
+ * Called by a FontWatchRunner when a font has been detected as active.
140
+ * @param {webfont.Font} font
141
+ * @private
142
+ */
143
+ FontWatcher.prototype.fontActive_ = function(font) {
144
+ this.eventDispatcher_.dispatchFontActive(font);
145
+ this.success_ = true;
146
+ this.decreaseCurrentlyWatched_();
147
+ };
148
+
149
+ /**
150
+ * Called by a FontWatchRunner when a font has been detected as inactive.
151
+ * @param {webfont.Font} font
152
+ * @private
153
+ */
154
+ FontWatcher.prototype.fontInactive_ = function(font) {
155
+ this.eventDispatcher_.dispatchFontInactive(font);
156
+ this.decreaseCurrentlyWatched_();
157
+ };
158
+
159
+ /**
160
+ * @private
161
+ */
162
+ FontWatcher.prototype.decreaseCurrentlyWatched_ = function() {
163
+ if (--this.currentlyWatched_ == 0 && this.last_) {
164
+ if (this.success_) {
165
+ this.eventDispatcher_.dispatchActive();
166
+ } else {
167
+ this.eventDispatcher_.dispatchInactive();
168
+ }
169
+ }
170
+ };
171
+ });
modules/webfont-loader/vendor-typekit/src/core/fontwatchrunner.js ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.FontWatchRunner');
2
+
3
+ goog.require('webfont.Font');
4
+ goog.require('webfont.FontRuler');
5
+
6
+ /**
7
+ * @constructor
8
+ * @param {function(webfont.Font)} activeCallback
9
+ * @param {function(webfont.Font)} inactiveCallback
10
+ * @param {webfont.DomHelper} domHelper
11
+ * @param {webfont.Font} font
12
+ * @param {number=} opt_timeout
13
+ * @param {Object.<string, boolean>=} opt_metricCompatibleFonts
14
+ * @param {string=} opt_fontTestString
15
+ */
16
+ webfont.FontWatchRunner = function(activeCallback, inactiveCallback, domHelper,
17
+ font, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
18
+ this.activeCallback_ = activeCallback;
19
+ this.inactiveCallback_ = inactiveCallback;
20
+ this.domHelper_ = domHelper;
21
+ this.font_ = font;
22
+ this.fontTestString_ = opt_fontTestString || webfont.FontWatchRunner.DEFAULT_TEST_STRING;
23
+ this.lastResortWidths_ = {};
24
+ this.timeout_ = opt_timeout || 3000;
25
+
26
+ this.metricCompatibleFonts_ = opt_metricCompatibleFonts || null;
27
+
28
+ this.fontRulerA_ = null;
29
+ this.fontRulerB_ = null;
30
+ this.lastResortRulerA_ = null;
31
+ this.lastResortRulerB_ = null;
32
+
33
+ this.setupRulers_();
34
+ };
35
+
36
+ /**
37
+ * @enum {string}
38
+ * @const
39
+ */
40
+ webfont.FontWatchRunner.LastResortFonts = {
41
+ SERIF: 'serif',
42
+ SANS_SERIF: 'sans-serif'
43
+ };
44
+
45
+ /**
46
+ * Default test string. Characters are chosen so that their widths vary a lot
47
+ * between the fonts in the default stacks. We want each fallback stack
48
+ * to always start out at a different width than the other.
49
+ * @type {string}
50
+ * @const
51
+ */
52
+ webfont.FontWatchRunner.DEFAULT_TEST_STRING = 'BESbswy';
53
+
54
+ goog.scope(function () {
55
+ var FontWatchRunner = webfont.FontWatchRunner,
56
+ Font = webfont.Font,
57
+ FontRuler = webfont.FontRuler;
58
+
59
+ /**
60
+ * @type {null|boolean}
61
+ */
62
+ FontWatchRunner.HAS_WEBKIT_FALLBACK_BUG = null;
63
+
64
+ /**
65
+ * @return {string}
66
+ */
67
+ FontWatchRunner.getUserAgent = function () {
68
+ return window.navigator.userAgent;
69
+ };
70
+
71
+ /**
72
+ * Returns true if this browser is WebKit and it has the fallback bug
73
+ * which is present in WebKit 536.11 and earlier.
74
+ *
75
+ * @return {boolean}
76
+ */
77
+ FontWatchRunner.hasWebKitFallbackBug = function () {
78
+ if (FontWatchRunner.HAS_WEBKIT_FALLBACK_BUG === null) {
79
+ var match = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(FontWatchRunner.getUserAgent());
80
+
81
+ FontWatchRunner.HAS_WEBKIT_FALLBACK_BUG = !!match &&
82
+ (parseInt(match[1], 10) < 536 ||
83
+ (parseInt(match[1], 10) === 536 &&
84
+ parseInt(match[2], 10) <= 11));
85
+ }
86
+ return FontWatchRunner.HAS_WEBKIT_FALLBACK_BUG;
87
+ };
88
+
89
+ /**
90
+ * @private
91
+ */
92
+ FontWatchRunner.prototype.setupRulers_ = function() {
93
+ this.fontRulerA_ = new FontRuler(this.domHelper_, this.fontTestString_);
94
+ this.fontRulerB_ = new FontRuler(this.domHelper_, this.fontTestString_);
95
+ this.lastResortRulerA_ = new FontRuler(this.domHelper_, this.fontTestString_);
96
+ this.lastResortRulerB_ = new FontRuler(this.domHelper_, this.fontTestString_);
97
+
98
+ this.fontRulerA_.setFont(new Font(this.font_.getName() + ',' + FontWatchRunner.LastResortFonts.SERIF, this.font_.getVariation()));
99
+ this.fontRulerB_.setFont(new Font(this.font_.getName() + ',' + FontWatchRunner.LastResortFonts.SANS_SERIF, this.font_.getVariation()));
100
+ this.lastResortRulerA_.setFont(new Font(FontWatchRunner.LastResortFonts.SERIF, this.font_.getVariation()));
101
+ this.lastResortRulerB_.setFont(new Font(FontWatchRunner.LastResortFonts.SANS_SERIF, this.font_.getVariation()));
102
+
103
+ this.fontRulerA_.insert();
104
+ this.fontRulerB_.insert();
105
+ this.lastResortRulerA_.insert();
106
+ this.lastResortRulerB_.insert();
107
+ };
108
+
109
+ FontWatchRunner.prototype.start = function() {
110
+ this.lastResortWidths_[FontWatchRunner.LastResortFonts.SERIF] = this.lastResortRulerA_.getWidth();
111
+ this.lastResortWidths_[FontWatchRunner.LastResortFonts.SANS_SERIF] = this.lastResortRulerB_.getWidth();
112
+
113
+ this.started_ = goog.now();
114
+
115
+ this.check_();
116
+ };
117
+
118
+ /**
119
+ * Returns true if the given width matches the generic font family width.
120
+ *
121
+ * @private
122
+ * @param {number} width
123
+ * @param {string} lastResortFont
124
+ * @return {boolean}
125
+ */
126
+ FontWatchRunner.prototype.widthMatches_ = function(width, lastResortFont) {
127
+ return width === this.lastResortWidths_[lastResortFont];
128
+ };
129
+
130
+ /**
131
+ * Return true if the given widths match any of the generic font family
132
+ * widths.
133
+ *
134
+ * @private
135
+ * @param {number} a
136
+ * @param {number} b
137
+ * @return {boolean}
138
+ */
139
+ FontWatchRunner.prototype.widthsMatchLastResortWidths_ = function(a, b) {
140
+ for (var font in FontWatchRunner.LastResortFonts) {
141
+ if (FontWatchRunner.LastResortFonts.hasOwnProperty(font)) {
142
+ if (this.widthMatches_(a, FontWatchRunner.LastResortFonts[font]) &&
143
+ this.widthMatches_(b, FontWatchRunner.LastResortFonts[font])) {
144
+ return true;
145
+ }
146
+ }
147
+ }
148
+ return false;
149
+ };
150
+
151
+ /**
152
+ * @private
153
+ * Returns true if the loading has timed out.
154
+ * @return {boolean}
155
+ */
156
+ FontWatchRunner.prototype.hasTimedOut_ = function() {
157
+ return goog.now() - this.started_ >= this.timeout_;
158
+ };
159
+
160
+ /**
161
+ * Returns true if both fonts match the normal fallback fonts.
162
+ *
163
+ * @private
164
+ * @param {number} a
165
+ * @param {number} b
166
+ * @return {boolean}
167
+ */
168
+ FontWatchRunner.prototype.isFallbackFont_ = function (a, b) {
169
+ return this.widthMatches_(a, FontWatchRunner.LastResortFonts.SERIF) &&
170
+ this.widthMatches_(b, FontWatchRunner.LastResortFonts.SANS_SERIF);
171
+ };
172
+
173
+ /**
174
+ * Returns true if the WebKit bug is present and both widths match a last resort font.
175
+ *
176
+ * @private
177
+ * @param {number} a
178
+ * @param {number} b
179
+ * @return {boolean}
180
+ */
181
+ FontWatchRunner.prototype.isLastResortFont_ = function (a, b) {
182
+ return FontWatchRunner.hasWebKitFallbackBug() && this.widthsMatchLastResortWidths_(a, b);
183
+ };
184
+
185
+ /**
186
+ * Returns true if the current font is metric compatible. Also returns true
187
+ * if we do not have a list of metric compatible fonts.
188
+ *
189
+ * @private
190
+ * @return {boolean}
191
+ */
192
+ FontWatchRunner.prototype.isMetricCompatibleFont_ = function () {
193
+ return this.metricCompatibleFonts_ === null || this.metricCompatibleFonts_.hasOwnProperty(this.font_.getName());
194
+ };
195
+
196
+ /**
197
+ * Checks the width of the two spans against their original widths during each
198
+ * async loop. If the width of one of the spans is different than the original
199
+ * width, then we know that the font is rendering and finish with the active
200
+ * callback. If we wait more than 5 seconds and nothing has changed, we finish
201
+ * with the inactive callback.
202
+ *
203
+ * @private
204
+ */
205
+ FontWatchRunner.prototype.check_ = function() {
206
+ var widthA = this.fontRulerA_.getWidth();
207
+ var widthB = this.fontRulerB_.getWidth();
208
+
209
+ if (this.isFallbackFont_(widthA, widthB) || this.isLastResortFont_(widthA, widthB)) {
210
+ if (this.hasTimedOut_()) {
211
+ if (this.isLastResortFont_(widthA, widthB) && this.isMetricCompatibleFont_()) {
212
+ this.finish_(this.activeCallback_);
213
+ } else {
214
+ this.finish_(this.inactiveCallback_);
215
+ }
216
+ } else {
217
+ this.asyncCheck_();
218
+ }
219
+ } else {
220
+ this.finish_(this.activeCallback_);
221
+ }
222
+ };
223
+
224
+ /**
225
+ * @private
226
+ */
227
+ FontWatchRunner.prototype.asyncCheck_ = function() {
228
+ setTimeout(goog.bind(function () {
229
+ this.check_();
230
+ }, this), 50);
231
+ };
232
+
233
+ /**
234
+ * @private
235
+ * @param {function(webfont.Font)} callback
236
+ */
237
+ FontWatchRunner.prototype.finish_ = function(callback) {
238
+ // Remove elements and trigger callback (which adds active/inactive class) asynchronously to avoid reflow chain if
239
+ // several fonts are finished loading right after each other
240
+ setTimeout(goog.bind(function () {
241
+ this.fontRulerA_.remove();
242
+ this.fontRulerB_.remove();
243
+ this.lastResortRulerA_.remove();
244
+ this.lastResortRulerB_.remove();
245
+ callback(this.font_);
246
+ }, this), 0);
247
+ };
248
+
249
+ });
modules/webfont-loader/vendor-typekit/src/core/initialize.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont');
2
+
3
+ goog.require('webfont.WebFont');
4
+
5
+ goog.require('webfont.modules.Typekit');
6
+ goog.require('webfont.modules.Fontdeck');
7
+ goog.require('webfont.modules.Monotype');
8
+ goog.require('webfont.modules.Custom');
9
+ goog.require('webfont.modules.google.GoogleFontApi');
10
+
11
+ /**
12
+ * @define {boolean}
13
+ */
14
+ var INCLUDE_CUSTOM_MODULE = false;
15
+
16
+ /**
17
+ * @define {boolean}
18
+ */
19
+ var INCLUDE_FONTDECK_MODULE = false;
20
+
21
+ /**
22
+ * @define {boolean}
23
+ */
24
+ var INCLUDE_MONOTYPE_MODULE = false;
25
+
26
+ /**
27
+ * @define {boolean}
28
+ */
29
+ var INCLUDE_TYPEKIT_MODULE = false;
30
+
31
+ /**
32
+ * @define {boolean}
33
+ */
34
+ var INCLUDE_GOOGLE_MODULE = false;
35
+
36
+ /**
37
+ * @define {string}
38
+ */
39
+ var WEBFONT = 'WebFont';
40
+
41
+ /**
42
+ * @define {string}
43
+ */
44
+ var WEBFONT_CONFIG = 'WebFontConfig';
45
+
46
+ /**
47
+ * @type {webfont.WebFont}
48
+ */
49
+ var webFontLoader = new webfont.WebFont(window);
50
+
51
+ if (INCLUDE_CUSTOM_MODULE) {
52
+ webFontLoader.addModule(webfont.modules.Custom.NAME, function (configuration, domHelper) {
53
+ return new webfont.modules.Custom(domHelper, configuration);
54
+ });
55
+ }
56
+
57
+ if (INCLUDE_FONTDECK_MODULE) {
58
+ webFontLoader.addModule(webfont.modules.Fontdeck.NAME, function (configuration, domHelper) {
59
+ return new webfont.modules.Fontdeck(domHelper, configuration);
60
+ });
61
+ }
62
+
63
+ if (INCLUDE_MONOTYPE_MODULE) {
64
+ webFontLoader.addModule(webfont.modules.Monotype.NAME, function (configuration, domHelper) {
65
+ return new webfont.modules.Monotype(domHelper, configuration);
66
+ });
67
+ }
68
+
69
+ if (INCLUDE_TYPEKIT_MODULE) {
70
+ webFontLoader.addModule(webfont.modules.Typekit.NAME, function (configuration, domHelper) {
71
+ return new webfont.modules.Typekit(domHelper, configuration);
72
+ });
73
+ }
74
+
75
+ if (INCLUDE_GOOGLE_MODULE) {
76
+ webFontLoader.addModule(webfont.modules.google.GoogleFontApi.NAME, function (configuration, domHelper) {
77
+ return new webfont.modules.google.GoogleFontApi(domHelper, configuration);
78
+ });
79
+ }
80
+
81
+ var exports = {
82
+ 'load': goog.bind(webFontLoader.load, webFontLoader)
83
+ };
84
+
85
+ if (typeof define === "function" && define.amd) {
86
+ define(function () {
87
+ return exports;
88
+ });
89
+ } else if (typeof module !== "undefined" && module.exports) {
90
+ module.exports = exports;
91
+ } else {
92
+ window[WEBFONT] = exports;
93
+
94
+ if (window[WEBFONT_CONFIG]) {
95
+ webFontLoader.load(window[WEBFONT_CONFIG]);
96
+ }
97
+ }
modules/webfont-loader/vendor-typekit/src/core/nativefontwatchrunner.js ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.NativeFontWatchRunner');
2
+
3
+ goog.require('webfont.Font');
4
+
5
+ goog.scope(function () {
6
+ /**
7
+ * @constructor
8
+ * @param {function(webfont.Font)} activeCallback
9
+ * @param {function(webfont.Font)} inactiveCallback
10
+ * @param {webfont.DomHelper} domHelper
11
+ * @param {webfont.Font} font
12
+ * @param {number=} opt_timeout
13
+ * @param {string=} opt_fontTestString
14
+ */
15
+ webfont.NativeFontWatchRunner = function(activeCallback, inactiveCallback, domHelper, font, opt_timeout, opt_fontTestString) {
16
+ this.activeCallback_ = activeCallback;
17
+ this.inactiveCallback_ = inactiveCallback;
18
+ this.font_ = font;
19
+ this.domHelper_ = domHelper;
20
+ this.timeout_ = opt_timeout || 3000;
21
+ this.fontTestString_ = opt_fontTestString || undefined;
22
+ };
23
+
24
+ var NativeFontWatchRunner = webfont.NativeFontWatchRunner;
25
+
26
+ NativeFontWatchRunner.prototype.start = function () {
27
+ var doc = this.domHelper_.getLoadWindow().document,
28
+ that = this;
29
+
30
+ var start = goog.now();
31
+
32
+ var loader = new Promise(function (resolve, reject) {
33
+ var check = function () {
34
+ var now = goog.now();
35
+
36
+ if (now - start >= that.timeout_) {
37
+ reject();
38
+ } else {
39
+ doc.fonts.load(that.font_.toCssString(), that.fontTestString_).then(function (fonts) {
40
+ if (fonts.length >= 1) {
41
+ resolve();
42
+ } else {
43
+ setTimeout(check, 25);
44
+ }
45
+ }, function () {
46
+ reject();
47
+ });
48
+ }
49
+ };
50
+
51
+ check();
52
+ });
53
+
54
+ var timeoutId = null,
55
+ timer = new Promise(function (resolve, reject) {
56
+ timeoutId = setTimeout(reject, that.timeout_);
57
+ });
58
+
59
+ Promise.race([timer, loader]).then(function () {
60
+ if (timeoutId) {
61
+ clearTimeout(timeoutId);
62
+ timeoutId = null;
63
+ }
64
+ that.activeCallback_(that.font_);
65
+ }, function () {
66
+ that.inactiveCallback_(that.font_);
67
+ });
68
+ };
69
+ });
modules/webfont-loader/vendor-typekit/src/core/stylesheetwaiter.js ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.StyleSheetWaiter');
2
+
3
+ /**
4
+ * A utility class for handling callback from DomHelper.loadStylesheet().
5
+ *
6
+ * @constructor
7
+ */
8
+ webfont.StyleSheetWaiter = function() {
9
+ /** @private @type {number} */
10
+ this.waitingCount_ = 0;
11
+ /** @private @type {Function} */
12
+ this.onReady_ = null;
13
+ };
14
+
15
+ goog.scope(function () {
16
+ var StyleSheetWaiter = webfont.StyleSheetWaiter;
17
+
18
+ /**
19
+ * @return {function(Error)}
20
+ */
21
+ StyleSheetWaiter.prototype.startWaitingLoad = function() {
22
+ var self = this;
23
+ self.waitingCount_++;
24
+ return function(error) {
25
+ self.waitingCount_--;
26
+ self.fireIfReady_();
27
+ };
28
+ };
29
+
30
+ /**
31
+ * @param {Function} fn
32
+ */
33
+ StyleSheetWaiter.prototype.waitWhileNeededThen = function(fn) {
34
+ this.onReady_ = fn;
35
+ this.fireIfReady_();
36
+ };
37
+
38
+ /**
39
+ * @private
40
+ */
41
+ StyleSheetWaiter.prototype.fireIfReady_ = function() {
42
+ var isReady = 0 == this.waitingCount_;
43
+ if (isReady && this.onReady_) {
44
+ this.onReady_();
45
+ this.onReady_ = null;
46
+ }
47
+ };
48
+ });
modules/webfont-loader/vendor-typekit/src/core/webfont.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.WebFont');
2
+
3
+ goog.require('webfont.DomHelper');
4
+ goog.require('webfont.EventDispatcher');
5
+ goog.require('webfont.FontWatcher');
6
+ goog.require('webfont.FontModuleLoader');
7
+
8
+ /**
9
+ * @param {Window} mainWindow The main application window containing
10
+ * webfontloader.js.
11
+ * @constructor
12
+ */
13
+ webfont.WebFont = function(mainWindow) {
14
+ this.mainWindow_ = mainWindow;
15
+ this.fontModuleLoader_ = new webfont.FontModuleLoader();
16
+ this.moduleLoading_ = 0;
17
+ this.events_ = true;
18
+ this.classes_ = true;
19
+ };
20
+
21
+ goog.scope(function () {
22
+ var WebFont = webfont.WebFont,
23
+ DomHelper = webfont.DomHelper,
24
+ EventDispatcher = webfont.EventDispatcher,
25
+ FontWatcher = webfont.FontWatcher;
26
+
27
+ /**
28
+ * @param {string} name
29
+ * @param {webfont.FontModuleFactory} factory
30
+ */
31
+ WebFont.prototype.addModule = function(name, factory) {
32
+ this.fontModuleLoader_.addModuleFactory(name, factory);
33
+ };
34
+
35
+ /**
36
+ * @param {Object} configuration
37
+ */
38
+ WebFont.prototype.load = function(configuration) {
39
+ var context = configuration['context'] || this.mainWindow_;
40
+ this.domHelper_ = new DomHelper(this.mainWindow_, context);
41
+
42
+ this.events_ = configuration['events'] !== false;
43
+ this.classes_ = configuration['classes'] !== false;
44
+
45
+ var eventDispatcher = new EventDispatcher(
46
+ this.domHelper_,
47
+ configuration
48
+ );
49
+
50
+ this.load_(eventDispatcher, configuration);
51
+ };
52
+
53
+ /**
54
+ * @param {webfont.EventDispatcher} eventDispatcher
55
+ * @param {webfont.FontWatcher} fontWatcher
56
+ * @param {Array.<webfont.Font>} fonts
57
+ * @param {webfont.FontTestStrings=} opt_fontTestStrings
58
+ * @param {Object.<string, boolean>=} opt_metricCompatibleFonts
59
+ */
60
+ WebFont.prototype.onModuleReady_ = function(eventDispatcher, fontWatcher, fonts, opt_fontTestStrings, opt_metricCompatibleFonts) {
61
+ var allModulesLoaded = --this.moduleLoading_ == 0;
62
+
63
+ if (this.classes_ || this.events_) {
64
+ setTimeout(function () {
65
+ fontWatcher.watchFonts(fonts, opt_fontTestStrings || null, opt_metricCompatibleFonts || null, allModulesLoaded);
66
+ }, 0);
67
+ }
68
+ };
69
+
70
+ /**
71
+ * @param {webfont.EventDispatcher} eventDispatcher
72
+ * @param {Object} configuration
73
+ */
74
+ WebFont.prototype.load_ = function(eventDispatcher, configuration) {
75
+ var modules = [],
76
+ timeout = configuration['timeout'],
77
+ self = this;
78
+
79
+ // Immediately dispatch the loading event before initializing the modules
80
+ // so we know for sure that the loading event is synchronous.
81
+ eventDispatcher.dispatchLoading();
82
+
83
+ modules = this.fontModuleLoader_.getModules(configuration, this.domHelper_);
84
+
85
+ var fontWatcher = new webfont.FontWatcher(this.domHelper_, eventDispatcher, timeout);
86
+
87
+ this.moduleLoading_ = modules.length;
88
+
89
+ for (var i = 0, len = modules.length; i < len; i++) {
90
+ var module = modules[i];
91
+
92
+ module.load(function (fonts, opt_fontTestStrings, opt_metricCompatibleFonts) {
93
+ self.onModuleReady_(eventDispatcher, fontWatcher, fonts, opt_fontTestStrings, opt_metricCompatibleFonts);
94
+ });
95
+ }
96
+ };
97
+ });
modules/webfont-loader/vendor-typekit/src/modules.yml ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ core:
2
+ - ../tools/compiler/base.js
3
+ - core/domhelper.js
4
+ - core/stylesheetwaiter.js
5
+ - core/cssclassname.js
6
+ - core/font.js
7
+ - core/eventdispatcher.js
8
+ - core/fontmodule.js
9
+ - core/fontmoduleloader.js
10
+ - core/fontruler.js
11
+ - core/nativefontwatchrunner.js
12
+ - core/fontwatchrunner.js
13
+ - core/fontwatcher.js
14
+ - core/webfont.js
15
+ - core/initialize.js
16
+
17
+
18
+
19
+ google:
20
+ - modules/google/fontapiurlbuilder.js
21
+ - modules/google/fontapiparser.js
22
+ - modules/google/googlefontapi.js
23
+
24
+ fontdeck:
25
+ - modules/fontdeck.js
26
+
27
+ typekit:
28
+ - modules/typekit.js
29
+
30
+ monotype:
31
+ - modules/monotype.js
32
+
33
+ custom:
34
+ - modules/custom.js
modules/webfont-loader/vendor-typekit/src/modules/custom.js ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.Custom');
2
+
3
+ goog.require('webfont.Font');
4
+ goog.require('webfont.StyleSheetWaiter');
5
+
6
+ /**
7
+ *
8
+ * WebFont.load({
9
+ * custom: {
10
+ * families: ['Font1', 'Font2'],
11
+ * urls: [ 'https://moo', 'https://meuh' ] }
12
+ * });
13
+ *
14
+ * @constructor
15
+ * @implements {webfont.FontModule}
16
+ */
17
+ webfont.modules.Custom = function(domHelper, configuration) {
18
+ this.domHelper_ = domHelper;
19
+ this.configuration_ = configuration;
20
+ };
21
+
22
+ /**
23
+ * @const
24
+ * @type {string}
25
+ */
26
+ webfont.modules.Custom.NAME = 'custom';
27
+
28
+ goog.scope(function () {
29
+ var Custom = webfont.modules.Custom,
30
+ Font = webfont.Font,
31
+ StyleSheetWaiter = webfont.StyleSheetWaiter;
32
+
33
+ Custom.prototype.load = function(onReady) {
34
+ var i, len;
35
+ var urls = this.configuration_['urls'] || [];
36
+ var familiesConfiguration = this.configuration_['families'] || [];
37
+ var fontTestStrings = this.configuration_['testStrings'] || {};
38
+ var waiter = new StyleSheetWaiter();
39
+ for (i = 0, len = urls.length; i < len; i++) {
40
+ this.domHelper_.loadStylesheet(urls[i], waiter.startWaitingLoad());
41
+ }
42
+
43
+ var fonts = [];
44
+
45
+ for (i = 0, len = familiesConfiguration.length; i < len; i++) {
46
+ var components = familiesConfiguration[i].split(":");
47
+
48
+ if (components[1]) {
49
+ var variations = components[1].split(",");
50
+
51
+ for (var j = 0; j < variations.length; j += 1) {
52
+ fonts.push(new Font(components[0], variations[j]));
53
+ }
54
+ } else {
55
+ fonts.push(new Font(components[0]));
56
+ }
57
+ }
58
+
59
+ waiter.waitWhileNeededThen(function() {
60
+ onReady(fonts, fontTestStrings);
61
+ });
62
+ };
63
+ });
modules/webfont-loader/vendor-typekit/src/modules/fontdeck.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.Fontdeck');
2
+
3
+ goog.require('webfont.Font');
4
+
5
+ /**
6
+ * @constructor
7
+ * @implements {webfont.FontModule}
8
+ */
9
+ webfont.modules.Fontdeck = function(domHelper, configuration) {
10
+ this.domHelper_ = domHelper;
11
+ this.configuration_ = configuration;
12
+ this.fonts_ = [];
13
+ };
14
+
15
+ /**
16
+ * @const
17
+ * @type {string}
18
+ */
19
+ webfont.modules.Fontdeck.NAME = 'fontdeck';
20
+ webfont.modules.Fontdeck.HOOK = '__webfontfontdeckmodule__';
21
+ webfont.modules.Fontdeck.API = 'https://f.fontdeck.com/s/css/js/';
22
+
23
+ goog.scope(function () {
24
+ var Fontdeck = webfont.modules.Fontdeck,
25
+ Font = webfont.Font,
26
+ FontVariationDescription = webfont.FontVariationDescription;
27
+
28
+ Fontdeck.prototype.getScriptSrc = function(projectId) {
29
+ // For empty iframes, fall back to main window's hostname.
30
+ var hostname = this.domHelper_.getHostName();
31
+ var api = this.configuration_['api'] || webfont.modules.Fontdeck.API;
32
+ return api + hostname + '/' + projectId + '.js';
33
+ };
34
+
35
+ Fontdeck.prototype.load = function(onReady) {
36
+ var projectId = this.configuration_['id'];
37
+ var loadWindow = this.domHelper_.getLoadWindow();
38
+ var self = this;
39
+
40
+ if (projectId) {
41
+ // Provide data to Fontdeck for processing.
42
+ if (!loadWindow[webfont.modules.Fontdeck.HOOK]) {
43
+ loadWindow[webfont.modules.Fontdeck.HOOK] = {};
44
+ }
45
+
46
+ // Fontdeck will call this function to indicate support status
47
+ // and what fonts are provided.
48
+ loadWindow[webfont.modules.Fontdeck.HOOK][projectId] = function(fontdeckSupports, data) {
49
+ for (var i = 0, j = data['fonts'].length; i<j; ++i) {
50
+ var font = data['fonts'][i];
51
+ self.fonts_.push(new Font(font['name'], Font.parseCssVariation('font-weight:' + font['weight'] + ';font-style:' + font['style'])));
52
+ }
53
+ onReady(self.fonts_);
54
+ };
55
+
56
+ // Call the Fontdeck API.
57
+ this.domHelper_.loadScript(this.getScriptSrc(projectId), function (err) {
58
+ if (err) {
59
+ onReady([]);
60
+ }
61
+ });
62
+ } else {
63
+ onReady([]);
64
+ }
65
+ };
66
+ });
modules/webfont-loader/vendor-typekit/src/modules/google/fontapiparser.js ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.google.FontApiParser');
2
+
3
+ goog.require('webfont.Font');
4
+
5
+ /**
6
+ * @constructor
7
+ */
8
+ webfont.modules.google.FontApiParser = function(fontFamilies) {
9
+ this.fontFamilies_ = fontFamilies;
10
+ this.parsedFonts_ = [];
11
+ this.fontTestStrings_ = {};
12
+ };
13
+
14
+ webfont.modules.google.FontApiParser.INT_FONTS = {
15
+ 'latin': webfont.FontWatchRunner.DEFAULT_TEST_STRING,
16
+ 'latin-ext': '\u00E7\u00F6\u00FC\u011F\u015F',
17
+ 'cyrillic': '\u0439\u044f\u0416',
18
+ 'greek': '\u03b1\u03b2\u03a3',
19
+ 'khmer': '\u1780\u1781\u1782',
20
+ 'Hanuman': '\u1780\u1781\u1782' // For backward compatibility
21
+ };
22
+
23
+ webfont.modules.google.FontApiParser.WEIGHTS = {
24
+ 'thin': '1',
25
+ 'extralight': '2',
26
+ 'extra-light': '2',
27
+ 'ultralight': '2',
28
+ 'ultra-light': '2',
29
+ 'light': '3',
30
+ 'regular': '4',
31
+ 'book': '4',
32
+ 'medium': '5',
33
+ 'semi-bold': '6',
34
+ 'semibold': '6',
35
+ 'demi-bold': '6',
36
+ 'demibold': '6',
37
+ 'bold': '7',
38
+ 'extra-bold': '8',
39
+ 'extrabold': '8',
40
+ 'ultra-bold': '8',
41
+ 'ultrabold': '8',
42
+ 'black': '9',
43
+ 'heavy': '9',
44
+ 'l': '3',
45
+ 'r': '4',
46
+ 'b': '7'
47
+ };
48
+
49
+ webfont.modules.google.FontApiParser.STYLES = {
50
+ 'i': 'i',
51
+ 'italic': 'i',
52
+ 'n': 'n',
53
+ 'normal': 'n'
54
+ };
55
+
56
+ webfont.modules.google.FontApiParser.VARIATION_MATCH =
57
+ new RegExp("^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|" +
58
+ "(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i" +
59
+ "|normal|italic)?$");
60
+
61
+ goog.scope(function () {
62
+ var FontApiParser = webfont.modules.google.FontApiParser,
63
+ Font = webfont.Font;
64
+
65
+ FontApiParser.prototype.parse = function() {
66
+ var length = this.fontFamilies_.length;
67
+
68
+ for (var i = 0; i < length; i++) {
69
+ var elements = this.fontFamilies_[i].split(":");
70
+ var fontFamily = elements[0].replace(/\+/g, " ");
71
+ var variations = ['n4'];
72
+
73
+ if (elements.length >= 2) {
74
+ var fvds = this.parseVariations_(elements[1]);
75
+
76
+ if (fvds.length > 0) {
77
+ variations = fvds;
78
+ }
79
+ if (elements.length == 3) {
80
+ var subsets = this.parseSubsets_(elements[2]);
81
+ if (subsets.length > 0) {
82
+ var fontTestString = FontApiParser.INT_FONTS[subsets[0]];
83
+
84
+ if (fontTestString) {
85
+ this.fontTestStrings_[fontFamily] = fontTestString;
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ // For backward compatibility
92
+ if (!this.fontTestStrings_[fontFamily]) {
93
+ var hanumanTestString = FontApiParser.INT_FONTS[fontFamily];
94
+ if (hanumanTestString) {
95
+ this.fontTestStrings_[fontFamily] = hanumanTestString;
96
+ }
97
+ }
98
+
99
+ for (var j = 0; j < variations.length; j += 1) {
100
+ this.parsedFonts_.push(new Font(fontFamily, variations[j]));
101
+ }
102
+ }
103
+ };
104
+
105
+ FontApiParser.prototype.generateFontVariationDescription_ = function(variation) {
106
+ if (!variation.match(/^[\w-]+$/)) {
107
+ return '';
108
+ }
109
+ var normalizedVariation = variation.toLowerCase();
110
+ var groups = FontApiParser.VARIATION_MATCH.exec(normalizedVariation);
111
+ if (groups == null) {
112
+ return '';
113
+ }
114
+ var styleMatch = this.normalizeStyle_(groups[2]);
115
+ var weightMatch = this.normalizeWeight_(groups[1]);
116
+ return [styleMatch, weightMatch].join('');
117
+ };
118
+
119
+
120
+ FontApiParser.prototype.normalizeStyle_ = function(parsedStyle) {
121
+ if (parsedStyle == null || parsedStyle == '') {
122
+ return 'n';
123
+ }
124
+ return FontApiParser.STYLES[parsedStyle];
125
+ };
126
+
127
+
128
+ FontApiParser.prototype.normalizeWeight_ = function(parsedWeight) {
129
+ if (parsedWeight == null || parsedWeight == '') {
130
+ return '4';
131
+ }
132
+ var weight = FontApiParser.WEIGHTS[parsedWeight];
133
+ if (weight) {
134
+ return weight;
135
+ }
136
+ if (isNaN(parsedWeight)) {
137
+ return '4';
138
+ }
139
+ return parsedWeight.substr(0, 1);
140
+ };
141
+
142
+
143
+ FontApiParser.prototype.parseVariations_ = function(variations) {
144
+ var finalVariations = [];
145
+
146
+ if (!variations) {
147
+ return finalVariations;
148
+ }
149
+ var providedVariations = variations.split(",");
150
+ var length = providedVariations.length;
151
+
152
+ for (var i = 0; i < length; i++) {
153
+ var variation = providedVariations[i];
154
+ var fvd = this.generateFontVariationDescription_(variation);
155
+
156
+ if (fvd) {
157
+ finalVariations.push(fvd);
158
+ }
159
+ }
160
+ return finalVariations;
161
+ };
162
+
163
+
164
+ FontApiParser.prototype.parseSubsets_ = function(subsets) {
165
+ var finalSubsets = [];
166
+
167
+ if (!subsets) {
168
+ return finalSubsets;
169
+ }
170
+ return subsets.split(",");
171
+ };
172
+
173
+
174
+ FontApiParser.prototype.getFonts = function() {
175
+ return this.parsedFonts_;
176
+ };
177
+
178
+ FontApiParser.prototype.getFontTestStrings = function() {
179
+ return this.fontTestStrings_;
180
+ };
181
+ });
modules/webfont-loader/vendor-typekit/src/modules/google/fontapiurlbuilder.js ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.google.FontApiUrlBuilder');
2
+
3
+ /**
4
+ * @constructor
5
+ */
6
+ webfont.modules.google.FontApiUrlBuilder = function(apiUrl, text) {
7
+ if (apiUrl) {
8
+ this.apiUrl_ = apiUrl;
9
+ } else {
10
+ this.apiUrl_ = webfont.modules.google.FontApiUrlBuilder.DEFAULT_API_URL;
11
+ }
12
+ this.fontFamilies_ = [];
13
+ this.subsets_ = [];
14
+ this.text_ = text || '';
15
+ };
16
+
17
+
18
+ webfont.modules.google.FontApiUrlBuilder.DEFAULT_API_URL = 'https://fonts.googleapis.com/css';
19
+
20
+ goog.scope(function () {
21
+ var FontApiUrlBuilder = webfont.modules.google.FontApiUrlBuilder;
22
+
23
+ FontApiUrlBuilder.prototype.setFontFamilies = function(fontFamilies) {
24
+ this.parseFontFamilies_(fontFamilies);
25
+ };
26
+
27
+
28
+ FontApiUrlBuilder.prototype.parseFontFamilies_ =
29
+ function(fontFamilies) {
30
+ var length = fontFamilies.length;
31
+
32
+ for (var i = 0; i < length; i++) {
33
+ var elements = fontFamilies[i].split(':');
34
+
35
+ if (elements.length == 3) {
36
+ this.subsets_.push(elements.pop());
37
+ }
38
+ var joinCharacter = '';
39
+ if (elements.length == 2 && elements[1] != ''){
40
+ joinCharacter = ':';
41
+ }
42
+ this.fontFamilies_.push(elements.join(joinCharacter));
43
+ }
44
+ };
45
+
46
+
47
+ FontApiUrlBuilder.prototype.webSafe = function(string) {
48
+ return string.replace(/ /g, '+');
49
+ };
50
+
51
+
52
+ FontApiUrlBuilder.prototype.build = function() {
53
+ if (this.fontFamilies_.length == 0) {
54
+ throw new Error('No fonts to load!');
55
+ }
56
+ if (this.apiUrl_.indexOf("kit=") != -1) {
57
+ return this.apiUrl_;
58
+ }
59
+ var length = this.fontFamilies_.length;
60
+ var sb = [];
61
+
62
+ for (var i = 0; i < length; i++) {
63
+ sb.push(this.webSafe(this.fontFamilies_[i]));
64
+ }
65
+ var url = this.apiUrl_ + '?family=' + sb.join('%7C'); // '|' escaped.
66
+
67
+ if (this.subsets_.length > 0) {
68
+ url += '&subset=' + this.subsets_.join(',');
69
+ }
70
+
71
+ if (this.text_.length > 0) {
72
+ url += '&text=' + encodeURIComponent(this.text_);
73
+ }
74
+
75
+ return url;
76
+ };
77
+ });
modules/webfont-loader/vendor-typekit/src/modules/google/googlefontapi.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.google.GoogleFontApi');
2
+
3
+ goog.require('webfont.modules.google.FontApiUrlBuilder');
4
+ goog.require('webfont.modules.google.FontApiParser');
5
+ goog.require('webfont.FontWatchRunner');
6
+ goog.require('webfont.StyleSheetWaiter');
7
+
8
+ /**
9
+ * @constructor
10
+ * @implements {webfont.FontModule}
11
+ */
12
+ webfont.modules.google.GoogleFontApi = function(domHelper, configuration) {
13
+ this.domHelper_ = domHelper;
14
+ this.configuration_ = configuration;
15
+ };
16
+
17
+ /**
18
+ * @const
19
+ * @type {string}
20
+ */
21
+ webfont.modules.google.GoogleFontApi.NAME = 'google';
22
+
23
+ goog.scope(function () {
24
+ var GoogleFontApi = webfont.modules.google.GoogleFontApi,
25
+ FontWatchRunner = webfont.FontWatchRunner,
26
+ StyleSheetWaiter = webfont.StyleSheetWaiter,
27
+ FontApiUrlBuilder = webfont.modules.google.FontApiUrlBuilder,
28
+ FontApiParser = webfont.modules.google.FontApiParser;
29
+
30
+ GoogleFontApi.METRICS_COMPATIBLE_FONTS = {
31
+ "Arimo": true,
32
+ "Cousine": true,
33
+ "Tinos": true
34
+ };
35
+
36
+ GoogleFontApi.prototype.load = function(onReady) {
37
+ var waiter = new StyleSheetWaiter();
38
+ var domHelper = this.domHelper_;
39
+ var fontApiUrlBuilder = new FontApiUrlBuilder(
40
+ this.configuration_['api'],
41
+ this.configuration_['text']
42
+ );
43
+ var fontFamilies = this.configuration_['families'];
44
+ fontApiUrlBuilder.setFontFamilies(fontFamilies);
45
+
46
+ var fontApiParser = new FontApiParser(fontFamilies);
47
+ fontApiParser.parse();
48
+
49
+ domHelper.loadStylesheet(fontApiUrlBuilder.build(), waiter.startWaitingLoad());
50
+ waiter.waitWhileNeededThen(function() {
51
+ onReady(fontApiParser.getFonts(), fontApiParser.getFontTestStrings(), GoogleFontApi.METRICS_COMPATIBLE_FONTS);
52
+ });
53
+ };
54
+ });
modules/webfont-loader/vendor-typekit/src/modules/monotype.js ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.Monotype');
2
+
3
+ goog.require('webfont.Font');
4
+
5
+ /**
6
+ webfont.load({
7
+ monotype: {
8
+ projectId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'//this is your Fonts.com Web fonts projectId
9
+ }
10
+ });
11
+ */
12
+
13
+ /**
14
+ * @constructor
15
+ * @implements {webfont.FontModule}
16
+ */
17
+ webfont.modules.Monotype = function(domHelper, configuration) {
18
+ this.domHelper_ = domHelper;
19
+ this.configuration_ = configuration;
20
+ };
21
+
22
+ /**
23
+ * name of the module through which external API is supposed to call the MonotypeFontAPI.
24
+ *
25
+ * @const
26
+ * @type {string}
27
+ */
28
+ webfont.modules.Monotype.NAME = 'monotype';
29
+
30
+ /**
31
+ * __mti_fntLst is the name of function that exposes Monotype's font list.
32
+ * @const
33
+ */
34
+ webfont.modules.Monotype.HOOK = '__mti_fntLst';
35
+
36
+ /**
37
+ * __MonotypeAPIScript__ is the id of script added by google API. Currently 'fonts.com' supports only one script in a page.
38
+ * This may require change in future if 'fonts.com' begins supporting multiple scripts per page.
39
+ * @const
40
+ */
41
+ webfont.modules.Monotype.SCRIPTID = '__MonotypeAPIScript__';
42
+
43
+ /**
44
+ * __MonotypeConfiguration__ is function exposed to fonts.com. fonts.com will use this function to get webfontloader configuration
45
+ * @const
46
+ */
47
+ webfont.modules.Monotype.CONFIGURATION = '__MonotypeConfiguration__';
48
+
49
+ goog.scope(function() {
50
+ var Monotype = webfont.modules.Monotype,
51
+ Font = webfont.Font;
52
+
53
+
54
+ Monotype.prototype.getScriptSrc = function(projectId, version) {
55
+ var api = (this.configuration_['api'] || 'https://fast.fonts.net/jsapi')
56
+ return api + '/' + projectId + '.js' + (version ? '?v=' + version : '');
57
+ };
58
+
59
+ Monotype.prototype.load = function(onReady) {
60
+ var self = this;
61
+ var projectId = self.configuration_['projectId'];
62
+ var version = self.configuration_['version'];
63
+
64
+
65
+ function checkAndLoadIfDownloaded() {
66
+ if (loadWindow[Monotype.HOOK + projectId]) {
67
+ var mti_fnts = loadWindow[Monotype.HOOK + projectId](),
68
+ fonts = [],
69
+ fntVariation;
70
+
71
+ if (mti_fnts) {
72
+ for (var i = 0; i < mti_fnts.length; i++) {
73
+ var fnt = mti_fnts[i]["fontfamily"];
74
+
75
+ //Check if font-style and font-weight is available
76
+ if (mti_fnts[i]["fontStyle"] != undefined && mti_fnts[i]["fontWeight"] != undefined) {
77
+ fntVariation = mti_fnts[i]["fontStyle"] + mti_fnts[i]["fontWeight"];
78
+ fonts.push(new Font(fnt, fntVariation));
79
+ } else {
80
+ fonts.push(new Font(fnt));
81
+ }
82
+ }
83
+ }
84
+ onReady(fonts);
85
+ } else {
86
+ setTimeout(function() {
87
+ checkAndLoadIfDownloaded();
88
+ }, 50);
89
+ }
90
+ }
91
+ if (projectId) {
92
+ var loadWindow = self.domHelper_.getLoadWindow();
93
+
94
+ var script = this.domHelper_.loadScript(self.getScriptSrc(projectId, version), function(err) {
95
+ if (err) {
96
+ onReady([]);
97
+ } else {
98
+ loadWindow[Monotype.CONFIGURATION+ projectId] = function() {
99
+ return self.configuration_;
100
+ };
101
+
102
+ checkAndLoadIfDownloaded();
103
+ }
104
+ });
105
+ script["id"] = Monotype.SCRIPTID + projectId;
106
+ } else {
107
+ onReady([]);
108
+ }
109
+ };
110
+ });
modules/webfont-loader/vendor-typekit/src/modules/typekit.js ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ goog.provide('webfont.modules.Typekit');
2
+
3
+ goog.require('webfont.Font');
4
+
5
+ /**
6
+ * @constructor
7
+ * @implements {webfont.FontModule}
8
+ */
9
+ webfont.modules.Typekit = function(domHelper, configuration) {
10
+ this.domHelper_ = domHelper;
11
+ this.configuration_ = configuration;
12
+ };
13
+
14
+ /**
15
+ * @const
16
+ * @type {string}
17
+ */
18
+ webfont.modules.Typekit.NAME = 'typekit';
19
+
20
+ goog.scope(function () {
21
+ var Typekit = webfont.modules.Typekit,
22
+ Font = webfont.Font;
23
+
24
+ Typekit.prototype.getScriptSrc = function(kitId) {
25
+ var api = this.configuration_['api'] || 'https://use.typekit.net';
26
+ return api + '/' + kitId + '.js';
27
+ };
28
+
29
+ Typekit.prototype.load = function(onReady) {
30
+ var kitId = this.configuration_['id'];
31
+ var configuration = this.configuration_;
32
+ var loadWindow = this.domHelper_.getLoadWindow();
33
+ var that = this;
34
+
35
+ if (kitId) {
36
+ // Load the Typekit script. Once it is done loading we grab its configuration
37
+ // and use that to populate the fonts we should watch.
38
+ this.domHelper_.loadScript(this.getScriptSrc(kitId), function (err) {
39
+ if (err) {
40
+ onReady([]);
41
+ } else {
42
+ if (loadWindow['Typekit'] && loadWindow['Typekit']['config'] && loadWindow['Typekit']['config']['fn']) {
43
+ var fn = loadWindow['Typekit']['config']['fn'],
44
+ fonts = [];
45
+
46
+ for (var i = 0; i < fn.length; i += 2) {
47
+ var font = fn[i],
48
+ variations = fn[i + 1];
49
+
50
+ for (var j = 0; j < variations.length; j++) {
51
+ fonts.push(new Font(font, variations[j]));
52
+ }
53
+ }
54
+
55
+ // Kick off font loading but disable font events so
56
+ // we don't duplicate font watching.
57
+ try {
58
+ loadWindow['Typekit']['load']({
59
+ 'events': false,
60
+ 'classes': false,
61
+ 'async': true
62
+ });
63
+ } catch (e) {}
64
+
65
+ onReady(fonts);
66
+ }
67
+ }
68
+ }, 2000);
69
+ } else {
70
+ onReady([]);
71
+ }
72
+ };
73
+ });
modules/webfont-loader/vendor-typekit/webfontloader.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Web Font Loader v1.6.28 - (c) Adobe Systems, Google. License: Apache 2.0 */(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}function p(a,b,c){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.o=b||a;this.c=this.o.document}var da=!!window.FontFace;function t(a,b,c,d){b=a.c.createElement(b);if(c)for(var e in c)c.hasOwnProperty(e)&&("style"==e?b.style.cssText=c[e]:b.setAttribute(e,c[e]));d&&b.appendChild(a.c.createTextNode(d));return b}function u(a,b,c){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(c,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
2
+ function w(a,b,c){b=b||[];c=c||[];for(var d=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<d.length;g+=1)if(b[e]===d[g]){f=!0;break}f||d.push(b[e])}b=[];for(e=0;e<d.length;e+=1){f=!1;for(g=0;g<c.length;g+=1)if(d[e]===c[g]){f=!0;break}f||b.push(d[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var c=a.className.split(/\s+/),d=0,e=c.length;d<e;d++)if(c[d]==b)return!0;return!1}
3
+ function ea(a){return a.o.location.hostname||a.a.location.hostname}function z(a,b,c){function d(){m&&e&&f&&(m(g),m=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,m=c||null;da?(b.onload=function(){e=!0;d()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");d()}):setTimeout(function(){e=!0;d()},0);u(a,"head",b)}
4
+ function A(a,b,c,d){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,c&&c(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,c&&c(Error("Script load timeout")))},d||5E3);return f}return null};function B(){this.a=0;this.c=null}function C(a){a.a++;return function(){a.a--;D(a)}}function E(a,b){a.c=b;D(a)}function D(a){0==a.a&&a.c&&(a.c(),a.c=null)};function F(a){this.a=a||"-"}F.prototype.c=function(a){for(var b=[],c=0;c<arguments.length;c++)b.push(arguments[c].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function G(a,b){this.c=a;this.f=4;this.a="n";var c=(b||"n4").match(/^([nio])([1-9])$/i);c&&(this.a=c[1],this.f=parseInt(c[2],10))}function fa(a){return H(a)+" "+(a.f+"00")+" 300px "+I(a.c)}function I(a){var b=[];a=a.split(/,\s*/);for(var c=0;c<a.length;c++){var d=a[c].replace(/['"]/g,"");-1!=d.indexOf(" ")||/^\d/.test(d)?b.push("'"+d+"'"):b.push(d)}return b.join(",")}function J(a){return a.a+a.f}function H(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
5
+ function ga(a){var b=4,c="n",d=null;a&&((d=a.match(/(normal|oblique|italic)/i))&&d[1]&&(c=d[1].substr(0,1).toLowerCase()),(d=a.match(/([1-9]00|normal|bold)/i))&&d[1]&&(/bold/i.test(d[1])?b=7:/[1-9]00/.test(d[1])&&(b=parseInt(d[1].substr(0,1),10))));return c+b};function ha(a,b){this.c=a;this.f=a.o.document.documentElement;this.h=b;this.a=new F("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);K(a,"loading")}function L(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),c=[],d=[a.a.c("wf","loading")];b||c.push(a.a.c("wf","inactive"));w(a.f,c,d)}K(a,"inactive")}function K(a,b,c){if(a.j&&a.h[b])if(c)a.h[b](c.c,J(c));else a.h[b]()};function ja(){this.c={}}function ka(a,b,c){var d=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&d.push(f(b[e],c))}return d};function M(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function N(a){u(a.c,"body",a.a)}function O(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+I(a.c)+";"+("font-style:"+H(a)+";font-weight:"+(a.f+"00")+";")};function P(a,b,c,d,e,f){this.g=a;this.j=b;this.a=d;this.c=c;this.f=e||3E3;this.h=f||void 0}P.prototype.start=function(){var a=this.c.o.document,b=this,c=q(),d=new Promise(function(d,e){function f(){q()-c>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(f,25)},function(){e()})}f()}),e=null,f=new Promise(function(a,d){e=setTimeout(d,b.f)});Promise.race([f,d]).then(function(){e&&(clearTimeout(e),e=null);b.g(b.a)},function(){b.j(b.a)})};function Q(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.m=this.j=this.h=this.g=null;this.g=new M(this.c,this.s);this.h=new M(this.c,this.s);this.j=new M(this.c,this.s);this.m=new M(this.c,this.s);a=new G(this.a.c+",serif",J(this.a));a=O(a);this.g.a.style.cssText=a;a=new G(this.a.c+",sans-serif",J(this.a));a=O(a);this.h.a.style.cssText=a;a=new G("serif",J(this.a));a=O(a);this.j.a.style.cssText=a;a=new G("sans-serif",J(this.a));a=
6
+ O(a);this.m.a.style.cssText=a;N(this.g);N(this.h);N(this.j);N(this.m)}var R={D:"serif",C:"sans-serif"},S=null;function T(){if(null===S){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);S=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return S}Q.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.m.a.offsetWidth;this.A=q();U(this)};
7
+ function la(a,b,c){for(var d in R)if(R.hasOwnProperty(d)&&b===a.f[R[d]]&&c===a.f[R[d]])return!0;return!1}function U(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=T()&&la(a,b,c));d?q()-a.A>=a.w?T()&&la(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):ma(a):V(a,a.v)}function ma(a){setTimeout(p(function(){U(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.m.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.m=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,J(a).toString(),"active")],[b.a.c("wf",a.c,J(a).toString(),"loading"),b.a.c("wf",a.c,J(a).toString(),"inactive")]);K(b,"fontactive",a);this.m=!0;na(this)};
8
+ W.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,J(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,J(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,J(a).toString(),"inactive"));w(b.f,d,e)}K(b,"fontinactive",a);na(this)};function na(a){0==--a.f&&a.j&&(a.m?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),K(a,"active")):L(a.a))};function oa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}oa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;pa(this,new ha(this.c,a),a)};
9
+ function qa(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,m=d||null||{};if(0===c.length&&f)L(b.a);else{b.f+=c.length;f&&(b.j=f);var h,l=[];for(h=0;h<c.length;h++){var k=c[h],n=m[k.c],r=b.a,x=k;r.g&&w(r.f,[r.a.c("wf",x.c,J(x).toString(),"loading")]);K(r,"fontloading",x);r=null;if(null===X)if(window.FontFace){var x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent),xa=/OS X.*Version\/10\..*Safari/.exec(window.navigator.userAgent)&&/Apple/.exec(window.navigator.vendor);
10
+ X=x?42<parseInt(x[1],10):xa?!1:!0}else X=!1;X?r=new P(p(b.g,b),p(b.h,b),b.c,k,b.s,n):r=new Q(p(b.g,b),p(b.h,b),b.c,k,b.s,a,n);l.push(r)}for(h=0;h<l.length;h++)l[h].start()}},0)}function pa(a,b,c){var d=[],e=c.timeout;ia(b);var d=ka(a.a,c,a.c),f=new W(a.c,b,e);a.h=d.length;b=0;for(c=d.length;b<c;b++)d[b].load(function(b,d,c){qa(a,f,b,d,c)})};function ra(a,b){this.c=a;this.a=b}
11
+ ra.prototype.load=function(a){function b(){if(f["__mti_fntLst"+d]){var c=f["__mti_fntLst"+d](),e=[],h;if(c)for(var l=0;l<c.length;l++){var k=c[l].fontfamily;void 0!=c[l].fontStyle&&void 0!=c[l].fontWeight?(h=c[l].fontStyle+c[l].fontWeight,e.push(new G(k,h))):e.push(new G(k))}a(e)}else setTimeout(function(){b()},50)}var c=this,d=c.a.projectId,e=c.a.version;if(d){var f=c.c.o;A(this.c,(c.a.api||"https://fast.fonts.net/jsapi")+"/"+d+".js"+(e?"?v="+e:""),function(e){e?a([]):(f["__MonotypeConfiguration__"+
12
+ d]=function(){return c.a},b())}).id="__MonotypeAPIScript__"+d}else a([])};function sa(a,b){this.c=a;this.a=b}sa.prototype.load=function(a){var b,c,d=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new B;b=0;for(c=d.length;b<c;b++)z(this.c,d[b],C(g));var m=[];b=0;for(c=e.length;b<c;b++)if(d=e[b].split(":"),d[1])for(var h=d[1].split(","),l=0;l<h.length;l+=1)m.push(new G(d[0],h[l]));else m.push(new G(d[0]));E(g,function(){a(m,f)})};function ta(a,b){a?this.c=a:this.c=ua;this.a=[];this.f=[];this.g=b||""}var ua="https://fonts.googleapis.com/css";function va(a,b){for(var c=b.length,d=0;d<c;d++){var e=b[d].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
13
+ function wa(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,c=[],d=0;d<b;d++)c.push(a.a[d].replace(/ /g,"+"));b=a.c+"?family="+c.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function ya(a){this.f=a;this.a=[];this.c={}}
14
+ var za={latin:"BESbswy","latin-ext":"\u00e7\u00f6\u00fc\u011f\u015f",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Aa={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ba={i:"i",italic:"i",n:"n",normal:"n"},
15
+ Ca=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
16
+ function Da(a){for(var b=a.f.length,c=0;c<b;c++){var d=a.f[c].split(":"),e=d[0].replace(/\+/g," "),f=["n4"];if(2<=d.length){var g;var m=d[1];g=[];if(m)for(var m=m.split(","),h=m.length,l=0;l<h;l++){var k;k=m[l];if(k.match(/^[\w-]+$/)){var n=Ca.exec(k.toLowerCase());if(null==n)k="";else{k=n[2];k=null==k||""==k?"n":Ba[k];n=n[1];if(null==n||""==n)n="4";else var r=Aa[n],n=r?r:isNaN(n)?"4":n.substr(0,1);k=[k,n].join("")}}else k="";k&&g.push(k)}0<g.length&&(f=g);3==d.length&&(d=d[2],g=[],d=d?d.split(","):
17
+ g,0<d.length&&(d=za[d[0]])&&(a.c[e]=d))}a.c[e]||(d=za[e])&&(a.c[e]=d);for(d=0;d<f.length;d+=1)a.a.push(new G(e,f[d]))}};function Ea(a,b){this.c=a;this.a=b}var Fa={Arimo:!0,Cousine:!0,Tinos:!0};Ea.prototype.load=function(a){var b=new B,c=this.c,d=new ta(this.a.api,this.a.text),e=this.a.families;va(d,e);var f=new ya(e);Da(f);z(c,wa(d),C(b));E(b,function(){a(f.a,f.c,Fa)})};function Ga(a,b){this.c=a;this.a=b}Ga.prototype.load=function(a){var b=this.a.id,c=this.c.o;b?A(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(c.Typekit&&c.Typekit.config&&c.Typekit.config.fn){b=c.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],m=b[f+1],h=0;h<m.length;h++)e.push(new G(g,m[h]));try{c.Typekit.load({events:!1,classes:!1,async:!0})}catch(l){}a(e)}},2E3):a([])};function Ha(a,b){this.c=a;this.f=b;this.a=[]}Ha.prototype.load=function(a){var b=this.f.id,c=this.c.o,d=this;b?(c.__webfontfontdeckmodule__||(c.__webfontfontdeckmodule__={}),c.__webfontfontdeckmodule__[b]=function(b,c){for(var g=0,m=c.fonts.length;g<m;++g){var h=c.fonts[g];d.a.push(new G(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(d.a)},A(this.c,(this.f.api||"https://f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new oa(window);Y.a.c.custom=function(a,b){return new sa(b,a)};Y.a.c.fontdeck=function(a,b){return new Ha(b,a)};Y.a.c.monotype=function(a,b){return new ra(b,a)};Y.a.c.typekit=function(a,b){return new Ga(b,a)};Y.a.c.google=function(a,b){return new Ea(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());
modules/webfonts/class-kirki-fonts-google.php CHANGED
@@ -27,13 +27,13 @@ final class Kirki_Fonts_Google {
27
  private static $instance = null;
28
 
29
  /**
30
- * DUMMY. DOESN'T DO ANYTHING, SIMPLY BACKWARDS-COMPATIBILITY.
31
- *
32
- * @static
33
- * @access public
34
- * @var bool
35
- */
36
- public static $force_load_all_subsets = false;
37
 
38
  /**
39
  * If set to true, forces loading ALL variants.
@@ -73,9 +73,9 @@ final class Kirki_Fonts_Google {
73
  }
74
 
75
  add_action( 'wp_ajax_kirki_fonts_google_all_get', array( $this, 'get_googlefonts_json' ) );
76
- add_action( 'wp_ajax_noprinv_kirki_fonts_google_all_get', array( $this, 'get_googlefonts_json' ) );
77
- add_action( 'wp_ajax_kirki_fonts_standard_all_get', array( $this, 'get_strandardfonts_json' ) );
78
- add_action( 'wp_ajax_noprinv_kirki_fonts_standard_all_get', array( $this, 'get_strandardfonts_json' ) );
79
 
80
  // Populate the array of google fonts.
81
  $this->google_fonts = Kirki_Fonts::get_google_fonts();
@@ -230,7 +230,7 @@ final class Kirki_Fonts_Google {
230
  * @since 3.0.17
231
  * @return void
232
  */
233
- public function get_strandardfonts_json() {
234
  echo wp_json_encode( Kirki_Fonts::get_standard_fonts() ); // WPCS: XSS ok.
235
  wp_die();
236
  }
27
  private static $instance = null;
28
 
29
  /**
30
+ * DUMMY. DOESN'T DO ANYTHING, SIMPLY BACKWARDS-COMPATIBILITY.
31
+ *
32
+ * @static
33
+ * @access public
34
+ * @var bool
35
+ */
36
+ public static $force_load_all_subsets = false;
37
 
38
  /**
39
  * If set to true, forces loading ALL variants.
73
  }
74
 
75
  add_action( 'wp_ajax_kirki_fonts_google_all_get', array( $this, 'get_googlefonts_json' ) );
76
+ add_action( 'wp_ajax_nopriv_kirki_fonts_google_all_get', array( $this, 'get_googlefonts_json' ) );
77
+ add_action( 'wp_ajax_kirki_fonts_standard_all_get', array( $this, 'get_standardfonts_json' ) );
78
+ add_action( 'wp_ajax_nopriv_kirki_fonts_standard_all_get', array( $this, 'get_standardfonts_json' ) );
79
 
80
  // Populate the array of google fonts.
81
  $this->google_fonts = Kirki_Fonts::get_google_fonts();
230
  * @since 3.0.17
231
  * @return void
232
  */
233
+ public function get_standardfonts_json() {
234
  echo wp_json_encode( Kirki_Fonts::get_standard_fonts() ); // WPCS: XSS ok.
235
  wp_die();
236
  }
modules/webfonts/class-kirki-modules-webfonts-async.php CHANGED
@@ -42,6 +42,15 @@ final class Kirki_Modules_Webfonts_Async {
42
  */
43
  protected $googlefonts;
44
 
 
 
 
 
 
 
 
 
 
45
  /**
46
  * Constructor.
47
  *
@@ -59,6 +68,7 @@ final class Kirki_Modules_Webfonts_Async {
59
  $this->googlefonts = $googlefonts;
60
 
61
  add_action( 'wp_head', array( $this, 'webfont_loader' ) );
 
62
 
63
  add_filter( 'wp_resource_hints', array( $this, 'resource_hints' ), 10, 2 );
64
 
@@ -102,7 +112,6 @@ final class Kirki_Modules_Webfonts_Async {
102
  // Goes through $this->fonts and adds or removes things as needed.
103
  $this->googlefonts->process_fonts();
104
 
105
- $fonts_to_load = array();
106
  foreach ( $this->googlefonts->fonts as $font => $weights ) {
107
  foreach ( $weights as $key => $value ) {
108
  if ( 'italic' === $value ) {
@@ -111,16 +120,27 @@ final class Kirki_Modules_Webfonts_Async {
111
  $weights[ $key ] = str_replace( array( 'regular', 'bold', 'italic' ), array( '400', '', 'i' ), $value );
112
  }
113
  }
114
- $fonts_to_load[] = $font . ':' . join( ',', $weights ) . ':cyrillic,cyrillic-ext,devanagari,greek,greek-ext,khmer,latin,latin-ext,vietnamese,hebrew,arabic,bengali,gujarati,tamil,telugu,thai';
 
 
 
115
  }
116
- wp_enqueue_script( 'webfont-loader', 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js', array(), KIRKI_VERSION );
117
- if ( empty( $fonts_to_load ) ) {
118
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  }
120
- wp_add_inline_script(
121
- 'webfont-loader',
122
- 'WebFont.load({google:{families:[\'' . join( '\', \'', $fonts_to_load ) . '\']}});',
123
- 'after'
124
- );
125
  }
126
  }
42
  */
43
  protected $googlefonts;
44
 
45
+ /**
46
+ * Fonts to load.
47
+ *
48
+ * @access protected
49
+ * @since 3.0.26
50
+ * @var array
51
+ */
52
+ protected $fonts_to_load = array();
53
+
54
  /**
55
  * Constructor.
56
  *
68
  $this->googlefonts = $googlefonts;
69
 
70
  add_action( 'wp_head', array( $this, 'webfont_loader' ) );
71
+ add_action( 'wp_head', array( $this, 'webfont_loader_script' ), 30 );
72
 
73
  add_filter( 'wp_resource_hints', array( $this, 'resource_hints' ), 10, 2 );
74
 
112
  // Goes through $this->fonts and adds or removes things as needed.
113
  $this->googlefonts->process_fonts();
114
 
 
115
  foreach ( $this->googlefonts->fonts as $font => $weights ) {
116
  foreach ( $weights as $key => $value ) {
117
  if ( 'italic' === $value ) {
120
  $weights[ $key ] = str_replace( array( 'regular', 'bold', 'italic' ), array( '400', '', 'i' ), $value );
121
  }
122
  }
123
+ $this->fonts_to_load[] = $font . ':' . join( ',', $weights ) . ':cyrillic,cyrillic-ext,devanagari,greek,greek-ext,khmer,latin,latin-ext,vietnamese,hebrew,arabic,bengali,gujarati,tamil,telugu,thai';
124
+ }
125
+ if ( ! empty( $this->fonts_to_load ) ) {
126
+ Kirki_Modules_Webfont_Loader::$load = true;
127
  }
128
+ }
129
+
130
+ /**
131
+ * Webfont Loader script for Google Fonts.
132
+ *
133
+ * @access public
134
+ * @since 3.0.0
135
+ */
136
+ public function webfont_loader_script() {
137
+
138
+ if ( ! empty( $this->fonts_to_load ) ) {
139
+ wp_add_inline_script(
140
+ 'webfont-loader',
141
+ 'WebFont.load({google:{families:[\'' . join( '\', \'', $this->fonts_to_load ) . '\']}});',
142
+ 'after'
143
+ );
144
  }
 
 
 
 
 
145
  }
146
  }
modules/webfonts/webfont-names.json ADDED
@@ -0,0 +1 @@
 
1
+ ["Roboto","Open Sans","Lato","Montserrat","Roboto Condensed","Oswald","Source Sans Pro","Slabo 27px","Raleway","PT Sans","Roboto Slab","Merriweather","Open Sans Condensed","Ubuntu","Playfair Display","Noto Sans","Poppins","Lora","Roboto Mono","PT Serif","Titillium Web","Arimo","Muli","PT Sans Narrow","Noto Serif","Fira Sans","Nunito","Inconsolata","Indie Flower","Anton","Dosis","Bitter","Crimson Text","Oxygen","Nanum Gothic","Cabin","Arvo","Fjalla One","Libre Baskerville","Work Sans","Quicksand","Josefin Sans","Exo 2","Hind","Lobster","Yanone Kaffeesatz","Rubik","Abel","Karla","Abril Fatface","Pacifico","Nunito Sans","Libre Franklin","Merriweather Sans","Varela Round","Ubuntu Condensed","Shadows Into Light","Asap","Exo","Cormorant Garamond","Gloria Hallelujah","Bree Serif","Dancing Script","Questrial","Signika","Source Serif Pro","Archivo Narrow","Source Code Pro","Play","Amatic SC","Acme","Kanit","Maven Pro","EB Garamond","Hind Siliguri","Rajdhani","Rokkitt","Francois One","Patua One","Comfortaa","Berkshire Swash","PT Sans Caption","Crete Round","Cuprum","Cairo","Cinzel","Shrikhand","Vollkorn","Catamaran","Ropa Sans","Heebo","Passion One","Righteous","Pathway Gothic One","Philosopher","Poiret One","Alegreya","Permanent Marker","Noticia Text","Satisfy","Yantramanav","Teko","Old Standard TT","Courgette","Great Vibes","Russo One","Prompt","ABeeZee","Archivo Black","Alegreya Sans","Monda","Domine","Orbitron","Cookie","Kaushan Script","Quattrocento Sans","News Cycle","Tinos","Lobster Two","Concert One","Istok Web","Josefin Slab","Assistant","Cardo","Alfa Slab One","Fredoka One","Gudea","Titan One","Handlee","Quattrocento","Economica","Fira Sans Condensed","Playfair Display SC","Didact Gothic","Pontano Sans","Sanchez","Kalam","Sacramento","Cabin Condensed","Caveat","Amiri","Marck Script","Hammersmith One","Arapey","Jura","BenchNine","Neuton","Khand","Nanum Myeongjo","Ruda","Tangerine","Volkhov","Monoton","Audiowide","Boogaloo","Armata","Fira Sans Extra Condensed","Shadows Into Light Two","VT323","Khula","Chivo","Cantarell","Antic","Aldrich","Hind Madurai","Glegoo","Architects Daughter","Pragati Narrow","Prosto One","Bangers","Gentium Basic","Hind Vadodara","Antic Slab","Unica One","Amaranth","Vidaloka","Enriqueta","Frank Ruhl Libre","Luckiest Guy","Patrick Hand","Bevan","Caveat Brush","Barlow Condensed","Forum","Ultra","PT Mono","Kreon","Sintony","Sorts Mill Goudy","Yrsa","Scada","Homemade Apple","Arsenal","Prata","Basic","Neucha","Covered By Your Grace","Merienda","Julius Sans One","Changa","Gentium Book Basic","Contrail One","Cabin Sketch","Actor","Yellowtail","Alegreya Sans SC","Alice","Sigmar One","Signika Negative","Rufina","Martel","Adamina","Magra","Fugaz One","Bad Script","Lusitana","Nothing You Could Do","Playball","Varela","Damion","Special Elite","Barlow","Overpass","Press Start 2P","Advent Pro","Alex Brush","Arbutus Slab","Paytone One","Arima Madurai","Barlow Semi Condensed","Chewy","Share","Rancho","Slabo 13px","Ubuntu Mono","Rock Salt","Coustard","Allura","Viga","Coda","Montserrat Alternates","Syncopate","Oleo Script","Rambla","Cantata One","PT Serif Caption","Cinzel Decorative","Sarala","Ovo","Gochi Hand","Spinnaker","Just Another Hand","Michroma","Marcellus","Overlock","Love Ya Like A Sister","Carter One","Electrolize","Cousine","Eczar","Lustria","Marmelad","Candal","Niconne","Coming Soon","Saira Condensed","Black Ops One","Molengo","Saira","Nobile","Carme","Squada One","Karma","Cormorant","Marcellus SC","Radley","Kameron","Ceviche One","Parisienne","Zilla Slab","Marvel","Copse","Oranienbaum","Reenie Beanie","Freckle Face","Saira Extra Condensed","Pinyon Script","Unna","Hind Guntur","Mr Dafoe","IM Fell DW Pica","Jockey One","Voltaire","Goudy Bookletter 1911","Leckerli One","Fauna One","Quantico","Alef","Itim","Telex","Lateef","Days One","Baloo","Allerta","Pridi","Average","Norican","Grand Hotel","Rochester","Italianno","Changa One","Saira Semi Condensed","Reem Kufi","Limelight","Carrois Gothic","Skranji","Halant","Nixie One","Fredericka the Great","Anonymous Pro","Spirax","Martel Sans","Palanquin","Space Mono","Alegreya SC","Taviraj","Nanum Gothic Coding","Bungee","Tauri","Rasa","Londrina Solid","Bubblegum Sans","El Messiri","Yesteryear","Aclonica","Archivo","Allerta Stencil","Puritan","Metrophobic","Annie Use Your Telescope","Kelly Slab","Caudex","Tenor Sans","Cutive","Fanwood Text","Bungee Inline","Homenaje","Doppio One","Rosario","Biryani","Calligraffitti","Kurale","Average Sans","Nanum Pen Script","Faster One","Inder","Nanum Brush Script","Share Tech Mono","Judson","Abhaya Libre","Jaldi","GFS Didot","Racing Sans One","Graduate","Rozha One","Convergence","Mukta Vaani","Lalezar","Sue Ellen Francisco","Petit Formal Script","Mada","Artifika","Schoolbell","Lilita One","Mukta","Aladin","Yeseva One","Miriam Libre","Six Caps","Gilda Display","Encode Sans Condensed","Mitr","Scheherazade","Happy Monkey","Gruppo","Andada","Delius","Give You Glory","Quando","Spectral","Trocchi","Herr Von Muellerhoff","Bowlby One SC","Trirong","The Girl Next Door","Allan","Pompiere","Belleza","Cambay","Gravitas One","Balthazar","Merienda One","Andika","Montez","Cambo","Fontdiner Swanky","Alike","Strait","Arizonia","Secular One","Lekton","Zeyada","Chelsea Market","Oxygen Mono","Mr De Haviland","Buenard","Fjord One","Mako","Hanuman","Capriola","Cutive Mono","Knewave","IM Fell Double Pica","Mate","Qwigley","Oregano","Wire One","Megrim","Anaheim","Vesper Libre","Walter Turncoat","Federo","Poly","La Belle Aurore","Averia Serif Libre","Short Stack","Belgrano","Carrois Gothic SC","Kristi","Proza Libre","Baloo Paaji","Bowlby One","Gafata","Chau Philomene One","Duru Sans","Vast Shadow","Mouse Memoirs","Baumans","Lemon","Stalemate","Seaweed Script","Gabriela","IM Fell English","Athiti","Fondamento","Maitree","Palanquin Dark","Fira Mono","Baloo Bhaina","Pangolin","Expletus Sans","Brawler","Waiting for the Sunrise","Orienta","Imprima","Emilys Candy","Rouge Script","UnifrakturMaguntia","Creepster","Oleo Script Swash Caps","Cherry Swash","Stardos Stencil","Crafty Girls","Amiko","Bilbo Swash Caps","Shojumaru","Voces","Podkova","Suez One","Rye","Yatra One","Meddon","Clicker Script","NTR","Denk One","Lemonada","Holtwood One SC","Patrick Hand SC","Pattaya","Rammetto One","Cedarville Cursive","Unkempt","Delius Swash Caps","Iceland","Gurajada","IM Fell English SC","Just Me Again Down Here","Lily Script One","Laila","Englebert","Wallpoet","Loved by the King","Crushed","Tulpen One","Rubik Mono One","Harmattan","Port Lligat Slab","Dawning of a New Day","Amethysta","Frijole","Encode Sans","Raleway Dots","Euphoria Script","Poller One","Ledger","Tienne","Asap Condensed","Bentham","Italiana","Krona One","Baloo Chettan","Mukta Malar","Salsa","Sansita","Battambang","Nova Mono","Suranna","Corben","Baloo Tamma","Sofia","Londrina Outline","Over the Rainbow","Metamorphous","Cherry Cream Soda","Headland One","Sriracha","Cormorant Infant","Sniglet","Geo","Vampiro One","Padauk","Prociono","Life Savers","Cantora One","Do Hyeon","Finger Paint","Share Tech","Ranchers","Kotta One","McLaren","Medula One","Arya","Aguafina Script","Codystar","David Libre","Gothic A1","Mirza","Engagement","Shanti","Cormorant SC","Nova Square","Sumana","Bungee Shade","Vibur","Sarpanch","Nosifer","Mallanna","Khmer","Scope One","Averia Sans Libre","Simonetta","Nova Slim","IBM Plex Sans","Dorsa","Princess Sofia","Amarante","Fenix","Ramabhadra","Coda Caption","Habibi","Flamenco","Bilbo","Slackey","Katibeh","Mogra","Port Lligat Sans","Koulen","Bubbler One","Stint Ultra Expanded","Pavanam","Dynalight","Mate SC","Donegal One","Sail","Mandali","Encode Sans Semi Condensed","Quintessential","Elsie","Averia Libre","League Script","Mountains of Christmas","Mystery Quest","Rosarivo","Kranky","Condiment","Rakkas","Kite One","Germania One","Mrs Saint Delafield","Miniver","Junge","Aref Ruqaa","Numans","Bellefair","Sarina","Alike Angular","Hi Melody","Maiden Orange","Dekko","Antic Didone","Delius Unicase","Kadwa","Ruslan Display","Milonga","Inika","Sura","Rhodium Libre","Stoke","Sancreek","Montserrat Subrayada","Pirata One","Kavoon","Wendy One","Rationale","Almendra","Fascinate Inline","Cagliostro","Chonburi","Trade Winds","Jim Nightshade","Ruluko","Peralta","Asul","Nova Round","IM Fell French Canon","Buda","IBM Plex Serif","Amita","Esteban","BioRhyme","Spectral SC","Ribeye","IM Fell DW Pica SC","Joti One","IBM Plex Sans Condensed","Paprika","Baloo Bhai","Overlock SC","Swanky and Moo Moo","Sonsie One","Text Me One","UnifrakturCook","Croissant One","Stint Ultra Condensed","Linden Hill","Baloo Thambi","Sedgwick Ave","Flavors","Fresca","IM Fell Great Primer","Angkor","Revalia","Montaga","Mina","New Rocker","Nova Flat","Ramaraja","Offside","Encode Sans Expanded","Glass Antiqua","Monsieur La Doulaise","Diplomata","Lovers Quarrel","Mukta Mahee","Timmana","Redressed","Griffy","Wellfleet","Tajawal","Risque","Julee","Content","Manuale","Sunshiney","Plaster","Asset","Galindo","Akronim","MedievalSharp","Atma","Marko One","Cormorant Upright","Eagle Lake","Averia Gruesa Libre","Snippet","Della Respira","Henny Penny","Gugi","Baloo Bhaijaan","Autour One","Lancelot","Ruthie","Bigshot One","Monofett","IBM Plex Mono","Sree Krushnadevaraya","Nokora","Purple Purse","Oldenburg","Snowburst One","Farsan","Inknut Antiqua","Spicy Rice","Jolly Lodger","Iceberg","Smythe","Petrona","Uncial Antiqua","Underdog","Cormorant Unicase","IM Fell Double Pica SC","Ewert","Goblin One","Irish Grover","Bayon","Chango","Macondo","Overpass Mono","Arbutus","Caesar Dressing","Trykker","Faustina","Margarine","Ravi Prakash","Metal Mania","Barrio","Butcherman","Elsie Swash Caps","Kantumruy","Coiny","Diplomata SC","Atomic Age","Molle","Mrs Sheppards","Eater","Meie Script","Miltonian Tattoo","Dr Sugiyama","Modern Antiqua","Rum Raisin","IM Fell French Canon SC","Original Surfer","Lakki Reddy","Galdeano","Jomhuria","Seymour One","Keania One","Astloch","Siemreap","Modak","Almendra SC","Zilla Slab Highlight","Galada","Piedra","Jacques Francois Shadow","Sahitya","Ribeye Marrow","Sirin Stencil","Chicle","Jacques Francois","Londrina Shadow","Ruge Boogie","Tillana","IM Fell Great Primer SC","Odor Mean Chey","Smokum","Felipa","Almendra Display","Kenia","Miltonian","Nova Oval","GFS Neohellenic","Devonshire","Warnes","Nova Script","Bokor","Meera Inimai","Geostar Fill","Freehand","Asar","Ranga","Fascinate","Bonbon","Passero One","Kavivanar","Metal","Suwannaphum","Combo","Romanesco","Encode Sans Semi Expanded","Black Han Sans","Trochut","Nova Cut","Fruktur","Kdam Thmor","Miss Fajardose","Bahiana","Londrina Sketch","Butterfly Kids","Chathura","Moul","Dangrek","Bigelow Rules","Libre Barcode 39 Text","Sedgwick Ave Display","Stalinist One","Baloo Da","Supermercado One","Vollkorn SC","Macondo Swash Caps","Sofadi One","Kumar One","Bungee Outline","Emblema One","Taprom","Sevillana","Federant","Erica One","Gorditas","Tenali Ramakrishna","Geostar","Aubrey","Hanalei","Hanalei Fill","Chela One","Chenla","Cute Font","Mr Bedfort","Baloo Tammudu","Gamja Flower","Gidugu","Unlock","Preahvihear","Peddana","Gaegu","Bungee Hairline","Libre Barcode 39 Extended Text","Moulpali","Fasthand","Jua","Libre Barcode 39 Extended","Dhurjati","Suravaram","BioRhyme Expanded","Libre Barcode 128 Text","Libre Barcode 39","Libre Barcode 128","Poor Story","Stylish","Black And White Picture","Song Myung","Kumar One Outline","Yeon Sung","East Sea Dokdo","Kirang Haerang","Dokdo","Sunflower"]
modules/webfonts/webfonts.json CHANGED
@@ -1 +1 @@
1
- {"items":{"ABeeZee":{"family":"ABeeZee","category":"sans-serif","variants":["italic","regular"]},"Abel":{"family":"Abel","category":"sans-serif","variants":["regular"]},"Abhaya Libre":{"family":"Abhaya Libre","category":"serif","variants":["500","600","700","800","regular"]},"Abril Fatface":{"family":"Abril Fatface","category":"display","variants":["regular"]},"Aclonica":{"family":"Aclonica","category":"sans-serif","variants":["regular"]},"Acme":{"family":"Acme","category":"sans-serif","variants":["regular"]},"Actor":{"family":"Actor","category":"sans-serif","variants":["regular"]},"Adamina":{"family":"Adamina","category":"serif","variants":["regular"]},"Advent Pro":{"family":"Advent Pro","category":"sans-serif","variants":["100","200","300","500","600","700","regular"]},"Aguafina Script":{"family":"Aguafina Script","category":"handwriting","variants":["regular"]},"Akronim":{"family":"Akronim","category":"display","variants":["regular"]},"Aladin":{"family":"Aladin","category":"handwriting","variants":["regular"]},"Aldrich":{"family":"Aldrich","category":"sans-serif","variants":["regular"]},"Alef":{"family":"Alef","category":"sans-serif","variants":["700","regular"]},"Alegreya":{"family":"Alegreya","category":"serif","variants":["500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya SC":{"family":"Alegreya SC","category":"serif","variants":["500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya Sans":{"family":"Alegreya Sans","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya Sans SC":{"family":"Alegreya Sans SC","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alex Brush":{"family":"Alex Brush","category":"handwriting","variants":["regular"]},"Alfa Slab One":{"family":"Alfa Slab One","category":"display","variants":["regular"]},"Alice":{"family":"Alice","category":"serif","variants":["regular"]},"Alike":{"family":"Alike","category":"serif","variants":["regular"]},"Alike Angular":{"family":"Alike Angular","category":"serif","variants":["regular"]},"Allan":{"family":"Allan","category":"display","variants":["700","regular"]},"Allerta":{"family":"Allerta","category":"sans-serif","variants":["regular"]},"Allerta Stencil":{"family":"Allerta Stencil","category":"sans-serif","variants":["regular"]},"Allura":{"family":"Allura","category":"handwriting","variants":["regular"]},"Almendra":{"family":"Almendra","category":"serif","variants":["700","700italic","italic","regular"]},"Almendra Display":{"family":"Almendra Display","category":"display","variants":["regular"]},"Almendra SC":{"family":"Almendra SC","category":"serif","variants":["regular"]},"Amarante":{"family":"Amarante","category":"display","variants":["regular"]},"Amaranth":{"family":"Amaranth","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Amatic SC":{"family":"Amatic SC","category":"handwriting","variants":["700","regular"]},"Amethysta":{"family":"Amethysta","category":"serif","variants":["regular"]},"Amiko":{"family":"Amiko","category":"sans-serif","variants":["600","700","regular"]},"Amiri":{"family":"Amiri","category":"serif","variants":["700","700italic","italic","regular"]},"Amita":{"family":"Amita","category":"handwriting","variants":["700","regular"]},"Anaheim":{"family":"Anaheim","category":"sans-serif","variants":["regular"]},"Andada":{"family":"Andada","category":"serif","variants":["regular"]},"Andika":{"family":"Andika","category":"sans-serif","variants":["regular"]},"Angkor":{"family":"Angkor","category":"display","variants":["regular"]},"Annie Use Your Telescope":{"family":"Annie Use Your Telescope","category":"handwriting","variants":["regular"]},"Anonymous Pro":{"family":"Anonymous Pro","category":"monospace","variants":["700","700italic","italic","regular"]},"Antic":{"family":"Antic","category":"sans-serif","variants":["regular"]},"Antic Didone":{"family":"Antic Didone","category":"serif","variants":["regular"]},"Antic Slab":{"family":"Antic Slab","category":"serif","variants":["regular"]},"Anton":{"family":"Anton","category":"sans-serif","variants":["regular"]},"Arapey":{"family":"Arapey","category":"serif","variants":["italic","regular"]},"Arbutus":{"family":"Arbutus","category":"display","variants":["regular"]},"Arbutus Slab":{"family":"Arbutus Slab","category":"serif","variants":["regular"]},"Architects Daughter":{"family":"Architects Daughter","category":"handwriting","variants":["regular"]},"Archivo":{"family":"Archivo","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Archivo Black":{"family":"Archivo Black","category":"sans-serif","variants":["regular"]},"Archivo Narrow":{"family":"Archivo Narrow","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Aref Ruqaa":{"family":"Aref Ruqaa","category":"serif","variants":["700","regular"]},"Arima Madurai":{"family":"Arima Madurai","category":"display","variants":["100","200","300","500","700","800","900","regular"]},"Arimo":{"family":"Arimo","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Arizonia":{"family":"Arizonia","category":"handwriting","variants":["regular"]},"Armata":{"family":"Armata","category":"sans-serif","variants":["regular"]},"Arsenal":{"family":"Arsenal","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Artifika":{"family":"Artifika","category":"serif","variants":["regular"]},"Arvo":{"family":"Arvo","category":"serif","variants":["700","700italic","italic","regular"]},"Arya":{"family":"Arya","category":"sans-serif","variants":["700","regular"]},"Asap":{"family":"Asap","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Asap Condensed":{"family":"Asap Condensed","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Asar":{"family":"Asar","category":"serif","variants":["regular"]},"Asset":{"family":"Asset","category":"display","variants":["regular"]},"Assistant":{"family":"Assistant","category":"sans-serif","variants":["200","300","600","700","800","regular"]},"Astloch":{"family":"Astloch","category":"display","variants":["700","regular"]},"Asul":{"family":"Asul","category":"sans-serif","variants":["700","regular"]},"Athiti":{"family":"Athiti","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Atma":{"family":"Atma","category":"display","variants":["300","500","600","700","regular"]},"Atomic Age":{"family":"Atomic Age","category":"display","variants":["regular"]},"Aubrey":{"family":"Aubrey","category":"display","variants":["regular"]},"Audiowide":{"family":"Audiowide","category":"display","variants":["regular"]},"Autour One":{"family":"Autour One","category":"display","variants":["regular"]},"Average":{"family":"Average","category":"serif","variants":["regular"]},"Average Sans":{"family":"Average Sans","category":"sans-serif","variants":["regular"]},"Averia Gruesa Libre":{"family":"Averia Gruesa Libre","category":"display","variants":["regular"]},"Averia Libre":{"family":"Averia Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Averia Sans Libre":{"family":"Averia Sans Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Averia Serif Libre":{"family":"Averia Serif Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Bad Script":{"family":"Bad Script","category":"handwriting","variants":["regular"]},"Bahiana":{"family":"Bahiana","category":"display","variants":["regular"]},"Baloo":{"family":"Baloo","category":"display","variants":["regular"]},"Baloo Bhai":{"family":"Baloo Bhai","category":"display","variants":["regular"]},"Baloo Bhaijaan":{"family":"Baloo Bhaijaan","category":"display","variants":["regular"]},"Baloo Bhaina":{"family":"Baloo Bhaina","category":"display","variants":["regular"]},"Baloo Chettan":{"family":"Baloo Chettan","category":"display","variants":["regular"]},"Baloo Da":{"family":"Baloo Da","category":"display","variants":["regular"]},"Baloo Paaji":{"family":"Baloo Paaji","category":"display","variants":["regular"]},"Baloo Tamma":{"family":"Baloo Tamma","category":"display","variants":["regular"]},"Baloo Tammudu":{"family":"Baloo Tammudu","category":"display","variants":["regular"]},"Baloo Thambi":{"family":"Baloo Thambi","category":"display","variants":["regular"]},"Balthazar":{"family":"Balthazar","category":"serif","variants":["regular"]},"Bangers":{"family":"Bangers","category":"display","variants":["regular"]},"Barlow":{"family":"Barlow","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barlow Condensed":{"family":"Barlow Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barlow Semi Condensed":{"family":"Barlow Semi Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barrio":{"family":"Barrio","category":"display","variants":["regular"]},"Basic":{"family":"Basic","category":"sans-serif","variants":["regular"]},"Battambang":{"family":"Battambang","category":"display","variants":["700","regular"]},"Baumans":{"family":"Baumans","category":"display","variants":["regular"]},"Bayon":{"family":"Bayon","category":"display","variants":["regular"]},"Belgrano":{"family":"Belgrano","category":"serif","variants":["regular"]},"Bellefair":{"family":"Bellefair","category":"serif","variants":["regular"]},"Belleza":{"family":"Belleza","category":"sans-serif","variants":["regular"]},"BenchNine":{"family":"BenchNine","category":"sans-serif","variants":["300","700","regular"]},"Bentham":{"family":"Bentham","category":"serif","variants":["regular"]},"Berkshire Swash":{"family":"Berkshire Swash","category":"handwriting","variants":["regular"]},"Bevan":{"family":"Bevan","category":"display","variants":["regular"]},"Bigelow Rules":{"family":"Bigelow Rules","category":"display","variants":["regular"]},"Bigshot One":{"family":"Bigshot One","category":"display","variants":["regular"]},"Bilbo":{"family":"Bilbo","category":"handwriting","variants":["regular"]},"Bilbo Swash Caps":{"family":"Bilbo Swash Caps","category":"handwriting","variants":["regular"]},"BioRhyme":{"family":"BioRhyme","category":"serif","variants":["200","300","700","800","regular"]},"BioRhyme Expanded":{"family":"BioRhyme Expanded","category":"serif","variants":["200","300","700","800","regular"]},"Biryani":{"family":"Biryani","category":"sans-serif","variants":["200","300","600","700","800","900","regular"]},"Bitter":{"family":"Bitter","category":"serif","variants":["700","italic","regular"]},"Black Ops One":{"family":"Black Ops One","category":"display","variants":["regular"]},"Bokor":{"family":"Bokor","category":"display","variants":["regular"]},"Bonbon":{"family":"Bonbon","category":"handwriting","variants":["regular"]},"Boogaloo":{"family":"Boogaloo","category":"display","variants":["regular"]},"Bowlby One":{"family":"Bowlby One","category":"display","variants":["regular"]},"Bowlby One SC":{"family":"Bowlby One SC","category":"display","variants":["regular"]},"Brawler":{"family":"Brawler","category":"serif","variants":["regular"]},"Bree Serif":{"family":"Bree Serif","category":"serif","variants":["regular"]},"Bubblegum Sans":{"family":"Bubblegum Sans","category":"display","variants":["regular"]},"Bubbler One":{"family":"Bubbler One","category":"sans-serif","variants":["regular"]},"Buda":{"family":"Buda","category":"display","variants":["300"]},"Buenard":{"family":"Buenard","category":"serif","variants":["700","regular"]},"Bungee":{"family":"Bungee","category":"display","variants":["regular"]},"Bungee Hairline":{"family":"Bungee Hairline","category":"display","variants":["regular"]},"Bungee Inline":{"family":"Bungee Inline","category":"display","variants":["regular"]},"Bungee Outline":{"family":"Bungee Outline","category":"display","variants":["regular"]},"Bungee Shade":{"family":"Bungee Shade","category":"display","variants":["regular"]},"Butcherman":{"family":"Butcherman","category":"display","variants":["regular"]},"Butterfly Kids":{"family":"Butterfly Kids","category":"handwriting","variants":["regular"]},"Cabin":{"family":"Cabin","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Cabin Condensed":{"family":"Cabin Condensed","category":"sans-serif","variants":["500","600","700","regular"]},"Cabin Sketch":{"family":"Cabin Sketch","category":"display","variants":["700","regular"]},"Caesar Dressing":{"family":"Caesar Dressing","category":"display","variants":["regular"]},"Cagliostro":{"family":"Cagliostro","category":"sans-serif","variants":["regular"]},"Cairo":{"family":"Cairo","category":"sans-serif","variants":["200","300","600","700","900","regular"]},"Calligraffitti":{"family":"Calligraffitti","category":"handwriting","variants":["regular"]},"Cambay":{"family":"Cambay","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cambo":{"family":"Cambo","category":"serif","variants":["regular"]},"Candal":{"family":"Candal","category":"sans-serif","variants":["regular"]},"Cantarell":{"family":"Cantarell","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cantata One":{"family":"Cantata One","category":"serif","variants":["regular"]},"Cantora One":{"family":"Cantora One","category":"sans-serif","variants":["regular"]},"Capriola":{"family":"Capriola","category":"sans-serif","variants":["regular"]},"Cardo":{"family":"Cardo","category":"serif","variants":["700","italic","regular"]},"Carme":{"family":"Carme","category":"sans-serif","variants":["regular"]},"Carrois Gothic":{"family":"Carrois Gothic","category":"sans-serif","variants":["regular"]},"Carrois Gothic SC":{"family":"Carrois Gothic SC","category":"sans-serif","variants":["regular"]},"Carter One":{"family":"Carter One","category":"display","variants":["regular"]},"Catamaran":{"family":"Catamaran","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Caudex":{"family":"Caudex","category":"serif","variants":["700","700italic","italic","regular"]},"Caveat":{"family":"Caveat","category":"handwriting","variants":["700","regular"]},"Caveat Brush":{"family":"Caveat Brush","category":"handwriting","variants":["regular"]},"Cedarville Cursive":{"family":"Cedarville Cursive","category":"handwriting","variants":["regular"]},"Ceviche One":{"family":"Ceviche One","category":"display","variants":["regular"]},"Changa":{"family":"Changa","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Changa One":{"family":"Changa One","category":"display","variants":["italic","regular"]},"Chango":{"family":"Chango","category":"display","variants":["regular"]},"Chathura":{"family":"Chathura","category":"sans-serif","variants":["100","300","700","800","regular"]},"Chau Philomene One":{"family":"Chau Philomene One","category":"sans-serif","variants":["italic","regular"]},"Chela One":{"family":"Chela One","category":"display","variants":["regular"]},"Chelsea Market":{"family":"Chelsea Market","category":"display","variants":["regular"]},"Chenla":{"family":"Chenla","category":"display","variants":["regular"]},"Cherry Cream Soda":{"family":"Cherry Cream Soda","category":"display","variants":["regular"]},"Cherry Swash":{"family":"Cherry Swash","category":"display","variants":["700","regular"]},"Chewy":{"family":"Chewy","category":"display","variants":["regular"]},"Chicle":{"family":"Chicle","category":"display","variants":["regular"]},"Chivo":{"family":"Chivo","category":"sans-serif","variants":["300","300italic","700","700italic","900","900italic","italic","regular"]},"Chonburi":{"family":"Chonburi","category":"display","variants":["regular"]},"Cinzel":{"family":"Cinzel","category":"serif","variants":["700","900","regular"]},"Cinzel Decorative":{"family":"Cinzel Decorative","category":"display","variants":["700","900","regular"]},"Clicker Script":{"family":"Clicker Script","category":"handwriting","variants":["regular"]},"Coda":{"family":"Coda","category":"display","variants":["800","regular"]},"Coda Caption":{"family":"Coda Caption","category":"sans-serif","variants":["800"]},"Codystar":{"family":"Codystar","category":"display","variants":["300","regular"]},"Coiny":{"family":"Coiny","category":"display","variants":["regular"]},"Combo":{"family":"Combo","category":"display","variants":["regular"]},"Comfortaa":{"family":"Comfortaa","category":"display","variants":["300","700","regular"]},"Coming Soon":{"family":"Coming Soon","category":"handwriting","variants":["regular"]},"Concert One":{"family":"Concert One","category":"display","variants":["regular"]},"Condiment":{"family":"Condiment","category":"handwriting","variants":["regular"]},"Content":{"family":"Content","category":"display","variants":["700","regular"]},"Contrail One":{"family":"Contrail One","category":"display","variants":["regular"]},"Convergence":{"family":"Convergence","category":"sans-serif","variants":["regular"]},"Cookie":{"family":"Cookie","category":"handwriting","variants":["regular"]},"Copse":{"family":"Copse","category":"serif","variants":["regular"]},"Corben":{"family":"Corben","category":"display","variants":["700","regular"]},"Cormorant":{"family":"Cormorant","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant Garamond":{"family":"Cormorant Garamond","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant Infant":{"family":"Cormorant Infant","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant SC":{"family":"Cormorant SC","category":"serif","variants":["300","500","600","700","regular"]},"Cormorant Unicase":{"family":"Cormorant Unicase","category":"serif","variants":["300","500","600","700","regular"]},"Cormorant Upright":{"family":"Cormorant Upright","category":"serif","variants":["300","500","600","700","regular"]},"Courgette":{"family":"Courgette","category":"handwriting","variants":["regular"]},"Cousine":{"family":"Cousine","category":"monospace","variants":["700","700italic","italic","regular"]},"Coustard":{"family":"Coustard","category":"serif","variants":["900","regular"]},"Covered By Your Grace":{"family":"Covered By Your Grace","category":"handwriting","variants":["regular"]},"Crafty Girls":{"family":"Crafty Girls","category":"handwriting","variants":["regular"]},"Creepster":{"family":"Creepster","category":"display","variants":["regular"]},"Crete Round":{"family":"Crete Round","category":"serif","variants":["italic","regular"]},"Crimson Text":{"family":"Crimson Text","category":"serif","variants":["600","600italic","700","700italic","italic","regular"]},"Croissant One":{"family":"Croissant One","category":"display","variants":["regular"]},"Crushed":{"family":"Crushed","category":"display","variants":["regular"]},"Cuprum":{"family":"Cuprum","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cutive":{"family":"Cutive","category":"serif","variants":["regular"]},"Cutive Mono":{"family":"Cutive Mono","category":"monospace","variants":["regular"]},"Damion":{"family":"Damion","category":"handwriting","variants":["regular"]},"Dancing Script":{"family":"Dancing Script","category":"handwriting","variants":["700","regular"]},"Dangrek":{"family":"Dangrek","category":"display","variants":["regular"]},"David Libre":{"family":"David Libre","category":"serif","variants":["500","700","regular"]},"Dawning of a New Day":{"family":"Dawning of a New Day","category":"handwriting","variants":["regular"]},"Days One":{"family":"Days One","category":"sans-serif","variants":["regular"]},"Dekko":{"family":"Dekko","category":"handwriting","variants":["regular"]},"Delius":{"family":"Delius","category":"handwriting","variants":["regular"]},"Delius Swash Caps":{"family":"Delius Swash Caps","category":"handwriting","variants":["regular"]},"Delius Unicase":{"family":"Delius Unicase","category":"handwriting","variants":["700","regular"]},"Della Respira":{"family":"Della Respira","category":"serif","variants":["regular"]},"Denk One":{"family":"Denk One","category":"sans-serif","variants":["regular"]},"Devonshire":{"family":"Devonshire","category":"handwriting","variants":["regular"]},"Dhurjati":{"family":"Dhurjati","category":"sans-serif","variants":["regular"]},"Didact Gothic":{"family":"Didact Gothic","category":"sans-serif","variants":["regular"]},"Diplomata":{"family":"Diplomata","category":"display","variants":["regular"]},"Diplomata SC":{"family":"Diplomata SC","category":"display","variants":["regular"]},"Domine":{"family":"Domine","category":"serif","variants":["700","regular"]},"Donegal One":{"family":"Donegal One","category":"serif","variants":["regular"]},"Doppio One":{"family":"Doppio One","category":"sans-serif","variants":["regular"]},"Dorsa":{"family":"Dorsa","category":"sans-serif","variants":["regular"]},"Dosis":{"family":"Dosis","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Dr Sugiyama":{"family":"Dr Sugiyama","category":"handwriting","variants":["regular"]},"Duru Sans":{"family":"Duru Sans","category":"sans-serif","variants":["regular"]},"Dynalight":{"family":"Dynalight","category":"display","variants":["regular"]},"EB Garamond":{"family":"EB Garamond","category":"serif","variants":["500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Eagle Lake":{"family":"Eagle Lake","category":"handwriting","variants":["regular"]},"Eater":{"family":"Eater","category":"display","variants":["regular"]},"Economica":{"family":"Economica","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Eczar":{"family":"Eczar","category":"serif","variants":["500","600","700","800","regular"]},"El Messiri":{"family":"El Messiri","category":"sans-serif","variants":["500","600","700","regular"]},"Electrolize":{"family":"Electrolize","category":"sans-serif","variants":["regular"]},"Elsie":{"family":"Elsie","category":"display","variants":["900","regular"]},"Elsie Swash Caps":{"family":"Elsie Swash Caps","category":"display","variants":["900","regular"]},"Emblema One":{"family":"Emblema One","category":"display","variants":["regular"]},"Emilys Candy":{"family":"Emilys Candy","category":"display","variants":["regular"]},"Encode Sans":{"family":"Encode Sans","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Condensed":{"family":"Encode Sans Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Expanded":{"family":"Encode Sans Expanded","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Semi Condensed":{"family":"Encode Sans Semi Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Semi Expanded":{"family":"Encode Sans Semi Expanded","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Engagement":{"family":"Engagement","category":"handwriting","variants":["regular"]},"Englebert":{"family":"Englebert","category":"sans-serif","variants":["regular"]},"Enriqueta":{"family":"Enriqueta","category":"serif","variants":["700","regular"]},"Erica One":{"family":"Erica One","category":"display","variants":["regular"]},"Esteban":{"family":"Esteban","category":"serif","variants":["regular"]},"Euphoria Script":{"family":"Euphoria Script","category":"handwriting","variants":["regular"]},"Ewert":{"family":"Ewert","category":"display","variants":["regular"]},"Exo":{"family":"Exo","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Exo 2":{"family":"Exo 2","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Expletus Sans":{"family":"Expletus Sans","category":"display","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Fanwood Text":{"family":"Fanwood Text","category":"serif","variants":["italic","regular"]},"Farsan":{"family":"Farsan","category":"display","variants":["regular"]},"Fascinate":{"family":"Fascinate","category":"display","variants":["regular"]},"Fascinate Inline":{"family":"Fascinate Inline","category":"display","variants":["regular"]},"Faster One":{"family":"Faster One","category":"display","variants":["regular"]},"Fasthand":{"family":"Fasthand","category":"serif","variants":["regular"]},"Fauna One":{"family":"Fauna One","category":"serif","variants":["regular"]},"Faustina":{"family":"Faustina","category":"serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Federant":{"family":"Federant","category":"display","variants":["regular"]},"Federo":{"family":"Federo","category":"sans-serif","variants":["regular"]},"Felipa":{"family":"Felipa","category":"handwriting","variants":["regular"]},"Fenix":{"family":"Fenix","category":"serif","variants":["regular"]},"Finger Paint":{"family":"Finger Paint","category":"display","variants":["regular"]},"Fira Mono":{"family":"Fira Mono","category":"monospace","variants":["500","700","regular"]},"Fira Sans":{"family":"Fira Sans","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fira Sans Condensed":{"family":"Fira Sans Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fira Sans Extra Condensed":{"family":"Fira Sans Extra Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fjalla One":{"family":"Fjalla One","category":"sans-serif","variants":["regular"]},"Fjord One":{"family":"Fjord One","category":"serif","variants":["regular"]},"Flamenco":{"family":"Flamenco","category":"display","variants":["300","regular"]},"Flavors":{"family":"Flavors","category":"display","variants":["regular"]},"Fondamento":{"family":"Fondamento","category":"handwriting","variants":["italic","regular"]},"Fontdiner Swanky":{"family":"Fontdiner Swanky","category":"display","variants":["regular"]},"Forum":{"family":"Forum","category":"display","variants":["regular"]},"Francois One":{"family":"Francois One","category":"sans-serif","variants":["regular"]},"Frank Ruhl Libre":{"family":"Frank Ruhl Libre","category":"serif","variants":["300","500","700","900","regular"]},"Freckle Face":{"family":"Freckle Face","category":"display","variants":["regular"]},"Fredericka the Great":{"family":"Fredericka the Great","category":"display","variants":["regular"]},"Fredoka One":{"family":"Fredoka One","category":"display","variants":["regular"]},"Freehand":{"family":"Freehand","category":"display","variants":["regular"]},"Fresca":{"family":"Fresca","category":"sans-serif","variants":["regular"]},"Frijole":{"family":"Frijole","category":"display","variants":["regular"]},"Fruktur":{"family":"Fruktur","category":"display","variants":["regular"]},"Fugaz One":{"family":"Fugaz One","category":"display","variants":["regular"]},"GFS Didot":{"family":"GFS Didot","category":"serif","variants":["regular"]},"GFS Neohellenic":{"family":"GFS Neohellenic","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Gabriela":{"family":"Gabriela","category":"serif","variants":["regular"]},"Gafata":{"family":"Gafata","category":"sans-serif","variants":["regular"]},"Galada":{"family":"Galada","category":"display","variants":["regular"]},"Galdeano":{"family":"Galdeano","category":"sans-serif","variants":["regular"]},"Galindo":{"family":"Galindo","category":"display","variants":["regular"]},"Gentium Basic":{"family":"Gentium Basic","category":"serif","variants":["700","700italic","italic","regular"]},"Gentium Book Basic":{"family":"Gentium Book Basic","category":"serif","variants":["700","700italic","italic","regular"]},"Geo":{"family":"Geo","category":"sans-serif","variants":["italic","regular"]},"Geostar":{"family":"Geostar","category":"display","variants":["regular"]},"Geostar Fill":{"family":"Geostar Fill","category":"display","variants":["regular"]},"Germania One":{"family":"Germania One","category":"display","variants":["regular"]},"Gidugu":{"family":"Gidugu","category":"sans-serif","variants":["regular"]},"Gilda Display":{"family":"Gilda Display","category":"serif","variants":["regular"]},"Give You Glory":{"family":"Give You Glory","category":"handwriting","variants":["regular"]},"Glass Antiqua":{"family":"Glass Antiqua","category":"display","variants":["regular"]},"Glegoo":{"family":"Glegoo","category":"serif","variants":["700","regular"]},"Gloria Hallelujah":{"family":"Gloria Hallelujah","category":"handwriting","variants":["regular"]},"Goblin One":{"family":"Goblin One","category":"display","variants":["regular"]},"Gochi Hand":{"family":"Gochi Hand","category":"handwriting","variants":["regular"]},"Gorditas":{"family":"Gorditas","category":"display","variants":["700","regular"]},"Goudy Bookletter 1911":{"family":"Goudy Bookletter 1911","category":"serif","variants":["regular"]},"Graduate":{"family":"Graduate","category":"display","variants":["regular"]},"Grand Hotel":{"family":"Grand Hotel","category":"handwriting","variants":["regular"]},"Gravitas One":{"family":"Gravitas One","category":"display","variants":["regular"]},"Great Vibes":{"family":"Great Vibes","category":"handwriting","variants":["regular"]},"Griffy":{"family":"Griffy","category":"display","variants":["regular"]},"Gruppo":{"family":"Gruppo","category":"display","variants":["regular"]},"Gudea":{"family":"Gudea","category":"sans-serif","variants":["700","italic","regular"]},"Gurajada":{"family":"Gurajada","category":"serif","variants":["regular"]},"Habibi":{"family":"Habibi","category":"serif","variants":["regular"]},"Halant":{"family":"Halant","category":"serif","variants":["300","500","600","700","regular"]},"Hammersmith One":{"family":"Hammersmith One","category":"sans-serif","variants":["regular"]},"Hanalei":{"family":"Hanalei","category":"display","variants":["regular"]},"Hanalei Fill":{"family":"Hanalei Fill","category":"display","variants":["regular"]},"Handlee":{"family":"Handlee","category":"handwriting","variants":["regular"]},"Hanuman":{"family":"Hanuman","category":"serif","variants":["700","regular"]},"Happy Monkey":{"family":"Happy Monkey","category":"display","variants":["regular"]},"Harmattan":{"family":"Harmattan","category":"sans-serif","variants":["regular"]},"Headland One":{"family":"Headland One","category":"serif","variants":["regular"]},"Heebo":{"family":"Heebo","category":"sans-serif","variants":["100","300","500","700","800","900","regular"]},"Henny Penny":{"family":"Henny Penny","category":"display","variants":["regular"]},"Herr Von Muellerhoff":{"family":"Herr Von Muellerhoff","category":"handwriting","variants":["regular"]},"Hind":{"family":"Hind","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Guntur":{"family":"Hind Guntur","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Madurai":{"family":"Hind Madurai","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Siliguri":{"family":"Hind Siliguri","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Vadodara":{"family":"Hind Vadodara","category":"sans-serif","variants":["300","500","600","700","regular"]},"Holtwood One SC":{"family":"Holtwood One SC","category":"serif","variants":["regular"]},"Homemade Apple":{"family":"Homemade Apple","category":"handwriting","variants":["regular"]},"Homenaje":{"family":"Homenaje","category":"sans-serif","variants":["regular"]},"IM Fell DW Pica":{"family":"IM Fell DW Pica","category":"serif","variants":["italic","regular"]},"IM Fell DW Pica SC":{"family":"IM Fell DW Pica SC","category":"serif","variants":["regular"]},"IM Fell Double Pica":{"family":"IM Fell Double Pica","category":"serif","variants":["italic","regular"]},"IM Fell Double Pica SC":{"family":"IM Fell Double Pica SC","category":"serif","variants":["regular"]},"IM Fell English":{"family":"IM Fell English","category":"serif","variants":["italic","regular"]},"IM Fell English SC":{"family":"IM Fell English SC","category":"serif","variants":["regular"]},"IM Fell French Canon":{"family":"IM Fell French Canon","category":"serif","variants":["italic","regular"]},"IM Fell French Canon SC":{"family":"IM Fell French Canon SC","category":"serif","variants":["regular"]},"IM Fell Great Primer":{"family":"IM Fell Great Primer","category":"serif","variants":["italic","regular"]},"IM Fell Great Primer SC":{"family":"IM Fell Great Primer SC","category":"serif","variants":["regular"]},"Iceberg":{"family":"Iceberg","category":"display","variants":["regular"]},"Iceland":{"family":"Iceland","category":"display","variants":["regular"]},"Imprima":{"family":"Imprima","category":"sans-serif","variants":["regular"]},"Inconsolata":{"family":"Inconsolata","category":"monospace","variants":["700","regular"]},"Inder":{"family":"Inder","category":"sans-serif","variants":["regular"]},"Indie Flower":{"family":"Indie Flower","category":"handwriting","variants":["regular"]},"Inika":{"family":"Inika","category":"serif","variants":["700","regular"]},"Inknut Antiqua":{"family":"Inknut Antiqua","category":"serif","variants":["300","500","600","700","800","900","regular"]},"Irish Grover":{"family":"Irish Grover","category":"display","variants":["regular"]},"Istok Web":{"family":"Istok Web","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Italiana":{"family":"Italiana","category":"serif","variants":["regular"]},"Italianno":{"family":"Italianno","category":"handwriting","variants":["regular"]},"Itim":{"family":"Itim","category":"handwriting","variants":["regular"]},"Jacques Francois":{"family":"Jacques Francois","category":"serif","variants":["regular"]},"Jacques Francois Shadow":{"family":"Jacques Francois Shadow","category":"display","variants":["regular"]},"Jaldi":{"family":"Jaldi","category":"sans-serif","variants":["700","regular"]},"Jim Nightshade":{"family":"Jim Nightshade","category":"handwriting","variants":["regular"]},"Jockey One":{"family":"Jockey One","category":"sans-serif","variants":["regular"]},"Jolly Lodger":{"family":"Jolly Lodger","category":"display","variants":["regular"]},"Jomhuria":{"family":"Jomhuria","category":"display","variants":["regular"]},"Josefin Sans":{"family":"Josefin Sans","category":"sans-serif","variants":["100","100italic","300","300italic","600","600italic","700","700italic","italic","regular"]},"Josefin Slab":{"family":"Josefin Slab","category":"serif","variants":["100","100italic","300","300italic","600","600italic","700","700italic","italic","regular"]},"Joti One":{"family":"Joti One","category":"display","variants":["regular"]},"Judson":{"family":"Judson","category":"serif","variants":["700","italic","regular"]},"Julee":{"family":"Julee","category":"handwriting","variants":["regular"]},"Julius Sans One":{"family":"Julius Sans One","category":"sans-serif","variants":["regular"]},"Junge":{"family":"Junge","category":"serif","variants":["regular"]},"Jura":{"family":"Jura","category":"sans-serif","variants":["300","500","600","700","regular"]},"Just Another Hand":{"family":"Just Another Hand","category":"handwriting","variants":["regular"]},"Just Me Again Down Here":{"family":"Just Me Again Down Here","category":"handwriting","variants":["regular"]},"Kadwa":{"family":"Kadwa","category":"serif","variants":["700","regular"]},"Kalam":{"family":"Kalam","category":"handwriting","variants":["300","700","regular"]},"Kameron":{"family":"Kameron","category":"serif","variants":["700","regular"]},"Kanit":{"family":"Kanit","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Kantumruy":{"family":"Kantumruy","category":"sans-serif","variants":["300","700","regular"]},"Karla":{"family":"Karla","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Karma":{"family":"Karma","category":"serif","variants":["300","500","600","700","regular"]},"Katibeh":{"family":"Katibeh","category":"display","variants":["regular"]},"Kaushan Script":{"family":"Kaushan Script","category":"handwriting","variants":["regular"]},"Kavivanar":{"family":"Kavivanar","category":"handwriting","variants":["regular"]},"Kavoon":{"family":"Kavoon","category":"display","variants":["regular"]},"Kdam Thmor":{"family":"Kdam Thmor","category":"display","variants":["regular"]},"Keania One":{"family":"Keania One","category":"display","variants":["regular"]},"Kelly Slab":{"family":"Kelly Slab","category":"display","variants":["regular"]},"Kenia":{"family":"Kenia","category":"display","variants":["regular"]},"Khand":{"family":"Khand","category":"sans-serif","variants":["300","500","600","700","regular"]},"Khmer":{"family":"Khmer","category":"display","variants":["regular"]},"Khula":{"family":"Khula","category":"sans-serif","variants":["300","600","700","800","regular"]},"Kite One":{"family":"Kite One","category":"sans-serif","variants":["regular"]},"Knewave":{"family":"Knewave","category":"display","variants":["regular"]},"Kotta One":{"family":"Kotta One","category":"serif","variants":["regular"]},"Koulen":{"family":"Koulen","category":"display","variants":["regular"]},"Kranky":{"family":"Kranky","category":"display","variants":["regular"]},"Kreon":{"family":"Kreon","category":"serif","variants":["300","700","regular"]},"Kristi":{"family":"Kristi","category":"handwriting","variants":["regular"]},"Krona One":{"family":"Krona One","category":"sans-serif","variants":["regular"]},"Kumar One":{"family":"Kumar One","category":"display","variants":["regular"]},"Kumar One Outline":{"family":"Kumar One Outline","category":"display","variants":["regular"]},"Kurale":{"family":"Kurale","category":"serif","variants":["regular"]},"La Belle Aurore":{"family":"La Belle Aurore","category":"handwriting","variants":["regular"]},"Laila":{"family":"Laila","category":"serif","variants":["300","500","600","700","regular"]},"Lakki Reddy":{"family":"Lakki Reddy","category":"handwriting","variants":["regular"]},"Lalezar":{"family":"Lalezar","category":"display","variants":["regular"]},"Lancelot":{"family":"Lancelot","category":"display","variants":["regular"]},"Lateef":{"family":"Lateef","category":"handwriting","variants":["regular"]},"Lato":{"family":"Lato","category":"sans-serif","variants":["100","100italic","300","300italic","700","700italic","900","900italic","italic","regular"]},"League Script":{"family":"League Script","category":"handwriting","variants":["regular"]},"Leckerli One":{"family":"Leckerli One","category":"handwriting","variants":["regular"]},"Ledger":{"family":"Ledger","category":"serif","variants":["regular"]},"Lekton":{"family":"Lekton","category":"sans-serif","variants":["700","italic","regular"]},"Lemon":{"family":"Lemon","category":"display","variants":["regular"]},"Lemonada":{"family":"Lemonada","category":"display","variants":["300","600","700","regular"]},"Libre Barcode 128":{"family":"Libre Barcode 128","category":"display","variants":["regular"]},"Libre Barcode 128 Text":{"family":"Libre Barcode 128 Text","category":"display","variants":["regular"]},"Libre Barcode 39":{"family":"Libre Barcode 39","category":"display","variants":["regular"]},"Libre Barcode 39 Extended":{"family":"Libre Barcode 39 Extended","category":"display","variants":["regular"]},"Libre Barcode 39 Extended Text":{"family":"Libre Barcode 39 Extended Text","category":"display","variants":["regular"]},"Libre Barcode 39 Text":{"family":"Libre Barcode 39 Text","category":"display","variants":["regular"]},"Libre Baskerville":{"family":"Libre Baskerville","category":"serif","variants":["700","italic","regular"]},"Libre Franklin":{"family":"Libre Franklin","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Life Savers":{"family":"Life Savers","category":"display","variants":["700","regular"]},"Lilita One":{"family":"Lilita One","category":"display","variants":["regular"]},"Lily Script One":{"family":"Lily Script One","category":"display","variants":["regular"]},"Limelight":{"family":"Limelight","category":"display","variants":["regular"]},"Linden Hill":{"family":"Linden Hill","category":"serif","variants":["italic","regular"]},"Lobster":{"family":"Lobster","category":"display","variants":["regular"]},"Lobster Two":{"family":"Lobster Two","category":"display","variants":["700","700italic","italic","regular"]},"Londrina Outline":{"family":"Londrina Outline","category":"display","variants":["regular"]},"Londrina Shadow":{"family":"Londrina Shadow","category":"display","variants":["regular"]},"Londrina Sketch":{"family":"Londrina Sketch","category":"display","variants":["regular"]},"Londrina Solid":{"family":"Londrina Solid","category":"display","variants":["100","300","900","regular"]},"Lora":{"family":"Lora","category":"serif","variants":["700","700italic","italic","regular"]},"Love Ya Like A Sister":{"family":"Love Ya Like A Sister","category":"display","variants":["regular"]},"Loved by the King":{"family":"Loved by the King","category":"handwriting","variants":["regular"]},"Lovers Quarrel":{"family":"Lovers Quarrel","category":"handwriting","variants":["regular"]},"Luckiest Guy":{"family":"Luckiest Guy","category":"display","variants":["regular"]},"Lusitana":{"family":"Lusitana","category":"serif","variants":["700","regular"]},"Lustria":{"family":"Lustria","category":"serif","variants":["regular"]},"Macondo":{"family":"Macondo","category":"display","variants":["regular"]},"Macondo Swash Caps":{"family":"Macondo Swash Caps","category":"display","variants":["regular"]},"Mada":{"family":"Mada","category":"sans-serif","variants":["200","300","500","600","700","900","regular"]},"Magra":{"family":"Magra","category":"sans-serif","variants":["700","regular"]},"Maiden Orange":{"family":"Maiden Orange","category":"display","variants":["regular"]},"Maitree":{"family":"Maitree","category":"serif","variants":["200","300","500","600","700","regular"]},"Mako":{"family":"Mako","category":"sans-serif","variants":["regular"]},"Mallanna":{"family":"Mallanna","category":"sans-serif","variants":["regular"]},"Mandali":{"family":"Mandali","category":"sans-serif","variants":["regular"]},"Manuale":{"family":"Manuale","category":"serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Marcellus":{"family":"Marcellus","category":"serif","variants":["regular"]},"Marcellus SC":{"family":"Marcellus SC","category":"serif","variants":["regular"]},"Marck Script":{"family":"Marck Script","category":"handwriting","variants":["regular"]},"Margarine":{"family":"Margarine","category":"display","variants":["regular"]},"Marko One":{"family":"Marko One","category":"serif","variants":["regular"]},"Marmelad":{"family":"Marmelad","category":"sans-serif","variants":["regular"]},"Martel":{"family":"Martel","category":"serif","variants":["200","300","600","700","800","900","regular"]},"Martel Sans":{"family":"Martel Sans","category":"sans-serif","variants":["200","300","600","700","800","900","regular"]},"Marvel":{"family":"Marvel","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Mate":{"family":"Mate","category":"serif","variants":["italic","regular"]},"Mate SC":{"family":"Mate SC","category":"serif","variants":["regular"]},"Maven Pro":{"family":"Maven Pro","category":"sans-serif","variants":["500","700","900","regular"]},"McLaren":{"family":"McLaren","category":"display","variants":["regular"]},"Meddon":{"family":"Meddon","category":"handwriting","variants":["regular"]},"MedievalSharp":{"family":"MedievalSharp","category":"display","variants":["regular"]},"Medula One":{"family":"Medula One","category":"display","variants":["regular"]},"Meera Inimai":{"family":"Meera Inimai","category":"sans-serif","variants":["regular"]},"Megrim":{"family":"Megrim","category":"display","variants":["regular"]},"Meie Script":{"family":"Meie Script","category":"handwriting","variants":["regular"]},"Merienda":{"family":"Merienda","category":"handwriting","variants":["700","regular"]},"Merienda One":{"family":"Merienda One","category":"handwriting","variants":["regular"]},"Merriweather":{"family":"Merriweather","category":"serif","variants":["300","300italic","700","700italic","900","900italic","italic","regular"]},"Merriweather Sans":{"family":"Merriweather Sans","category":"sans-serif","variants":["300","300italic","700","700italic","800","800italic","italic","regular"]},"Metal":{"family":"Metal","category":"display","variants":["regular"]},"Metal Mania":{"family":"Metal Mania","category":"display","variants":["regular"]},"Metamorphous":{"family":"Metamorphous","category":"display","variants":["regular"]},"Metrophobic":{"family":"Metrophobic","category":"sans-serif","variants":["regular"]},"Michroma":{"family":"Michroma","category":"sans-serif","variants":["regular"]},"Milonga":{"family":"Milonga","category":"display","variants":["regular"]},"Miltonian":{"family":"Miltonian","category":"display","variants":["regular"]},"Miltonian Tattoo":{"family":"Miltonian Tattoo","category":"display","variants":["regular"]},"Miniver":{"family":"Miniver","category":"display","variants":["regular"]},"Miriam Libre":{"family":"Miriam Libre","category":"sans-serif","variants":["700","regular"]},"Mirza":{"family":"Mirza","category":"display","variants":["500","600","700","regular"]},"Miss Fajardose":{"family":"Miss Fajardose","category":"handwriting","variants":["regular"]},"Mitr":{"family":"Mitr","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Modak":{"family":"Modak","category":"display","variants":["regular"]},"Modern Antiqua":{"family":"Modern Antiqua","category":"display","variants":["regular"]},"Mogra":{"family":"Mogra","category":"display","variants":["regular"]},"Molengo":{"family":"Molengo","category":"sans-serif","variants":["regular"]},"Molle":{"family":"Molle","category":"handwriting","variants":["italic"]},"Monda":{"family":"Monda","category":"sans-serif","variants":["700","regular"]},"Monofett":{"family":"Monofett","category":"display","variants":["regular"]},"Monoton":{"family":"Monoton","category":"display","variants":["regular"]},"Monsieur La Doulaise":{"family":"Monsieur La Doulaise","category":"handwriting","variants":["regular"]},"Montaga":{"family":"Montaga","category":"serif","variants":["regular"]},"Montez":{"family":"Montez","category":"handwriting","variants":["regular"]},"Montserrat":{"family":"Montserrat","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Montserrat Alternates":{"family":"Montserrat Alternates","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Montserrat Subrayada":{"family":"Montserrat Subrayada","category":"sans-serif","variants":["700","regular"]},"Moul":{"family":"Moul","category":"display","variants":["regular"]},"Moulpali":{"family":"Moulpali","category":"display","variants":["regular"]},"Mountains of Christmas":{"family":"Mountains of Christmas","category":"display","variants":["700","regular"]},"Mouse Memoirs":{"family":"Mouse Memoirs","category":"sans-serif","variants":["regular"]},"Mr Bedfort":{"family":"Mr Bedfort","category":"handwriting","variants":["regular"]},"Mr Dafoe":{"family":"Mr Dafoe","category":"handwriting","variants":["regular"]},"Mr De Haviland":{"family":"Mr De Haviland","category":"handwriting","variants":["regular"]},"Mrs Saint Delafield":{"family":"Mrs Saint Delafield","category":"handwriting","variants":["regular"]},"Mrs Sheppards":{"family":"Mrs Sheppards","category":"handwriting","variants":["regular"]},"Mukta":{"family":"Mukta","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Mahee":{"family":"Mukta Mahee","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Malar":{"family":"Mukta Malar","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Vaani":{"family":"Mukta Vaani","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Muli":{"family":"Muli","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Mystery Quest":{"family":"Mystery Quest","category":"display","variants":["regular"]},"NTR":{"family":"NTR","category":"sans-serif","variants":["regular"]},"Neucha":{"family":"Neucha","category":"handwriting","variants":["regular"]},"Neuton":{"family":"Neuton","category":"serif","variants":["200","300","700","800","italic","regular"]},"New Rocker":{"family":"New Rocker","category":"display","variants":["regular"]},"News Cycle":{"family":"News Cycle","category":"sans-serif","variants":["700","regular"]},"Niconne":{"family":"Niconne","category":"handwriting","variants":["regular"]},"Nixie One":{"family":"Nixie One","category":"display","variants":["regular"]},"Nobile":{"family":"Nobile","category":"sans-serif","variants":["500","500italic","700","700italic","italic","regular"]},"Nokora":{"family":"Nokora","category":"serif","variants":["700","regular"]},"Norican":{"family":"Norican","category":"handwriting","variants":["regular"]},"Nosifer":{"family":"Nosifer","category":"display","variants":["regular"]},"Nothing You Could Do":{"family":"Nothing You Could Do","category":"handwriting","variants":["regular"]},"Noticia Text":{"family":"Noticia Text","category":"serif","variants":["700","700italic","italic","regular"]},"Noto Sans":{"family":"Noto Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Noto Serif":{"family":"Noto Serif","category":"serif","variants":["700","700italic","italic","regular"]},"Nova Cut":{"family":"Nova Cut","category":"display","variants":["regular"]},"Nova Flat":{"family":"Nova Flat","category":"display","variants":["regular"]},"Nova Mono":{"family":"Nova Mono","category":"monospace","variants":["regular"]},"Nova Oval":{"family":"Nova Oval","category":"display","variants":["regular"]},"Nova Round":{"family":"Nova Round","category":"display","variants":["regular"]},"Nova Script":{"family":"Nova Script","category":"display","variants":["regular"]},"Nova Slim":{"family":"Nova Slim","category":"display","variants":["regular"]},"Nova Square":{"family":"Nova Square","category":"display","variants":["regular"]},"Numans":{"family":"Numans","category":"sans-serif","variants":["regular"]},"Nunito":{"family":"Nunito","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Nunito Sans":{"family":"Nunito Sans","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Odor Mean Chey":{"family":"Odor Mean Chey","category":"display","variants":["regular"]},"Offside":{"family":"Offside","category":"display","variants":["regular"]},"Old Standard TT":{"family":"Old Standard TT","category":"serif","variants":["700","italic","regular"]},"Oldenburg":{"family":"Oldenburg","category":"display","variants":["regular"]},"Oleo Script":{"family":"Oleo Script","category":"display","variants":["700","regular"]},"Oleo Script Swash Caps":{"family":"Oleo Script Swash Caps","category":"display","variants":["700","regular"]},"Open Sans":{"family":"Open Sans","category":"sans-serif","variants":["300","300italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Open Sans Condensed":{"family":"Open Sans Condensed","category":"sans-serif","variants":["300","300italic","700"]},"Oranienbaum":{"family":"Oranienbaum","category":"serif","variants":["regular"]},"Orbitron":{"family":"Orbitron","category":"sans-serif","variants":["500","700","900","regular"]},"Oregano":{"family":"Oregano","category":"display","variants":["italic","regular"]},"Orienta":{"family":"Orienta","category":"sans-serif","variants":["regular"]},"Original Surfer":{"family":"Original Surfer","category":"display","variants":["regular"]},"Oswald":{"family":"Oswald","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Over the Rainbow":{"family":"Over the Rainbow","category":"handwriting","variants":["regular"]},"Overlock":{"family":"Overlock","category":"display","variants":["700","700italic","900","900italic","italic","regular"]},"Overlock SC":{"family":"Overlock SC","category":"display","variants":["regular"]},"Overpass":{"family":"Overpass","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Overpass Mono":{"family":"Overpass Mono","category":"monospace","variants":["300","600","700","regular"]},"Ovo":{"family":"Ovo","category":"serif","variants":["regular"]},"Oxygen":{"family":"Oxygen","category":"sans-serif","variants":["300","700","regular"]},"Oxygen Mono":{"family":"Oxygen Mono","category":"monospace","variants":["regular"]},"PT Mono":{"family":"PT Mono","category":"monospace","variants":["regular"]},"PT Sans":{"family":"PT Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"PT Sans Caption":{"family":"PT Sans Caption","category":"sans-serif","variants":["700","regular"]},"PT Sans Narrow":{"family":"PT Sans Narrow","category":"sans-serif","variants":["700","regular"]},"PT Serif":{"family":"PT Serif","category":"serif","variants":["700","700italic","italic","regular"]},"PT Serif Caption":{"family":"PT Serif Caption","category":"serif","variants":["italic","regular"]},"Pacifico":{"family":"Pacifico","category":"handwriting","variants":["regular"]},"Padauk":{"family":"Padauk","category":"sans-serif","variants":["700","regular"]},"Palanquin":{"family":"Palanquin","category":"sans-serif","variants":["100","200","300","500","600","700","regular"]},"Palanquin Dark":{"family":"Palanquin Dark","category":"sans-serif","variants":["500","600","700","regular"]},"Pangolin":{"family":"Pangolin","category":"handwriting","variants":["regular"]},"Paprika":{"family":"Paprika","category":"display","variants":["regular"]},"Parisienne":{"family":"Parisienne","category":"handwriting","variants":["regular"]},"Passero One":{"family":"Passero One","category":"display","variants":["regular"]},"Passion One":{"family":"Passion One","category":"display","variants":["700","900","regular"]},"Pathway Gothic One":{"family":"Pathway Gothic One","category":"sans-serif","variants":["regular"]},"Patrick Hand":{"family":"Patrick Hand","category":"handwriting","variants":["regular"]},"Patrick Hand SC":{"family":"Patrick Hand SC","category":"handwriting","variants":["regular"]},"Pattaya":{"family":"Pattaya","category":"sans-serif","variants":["regular"]},"Patua One":{"family":"Patua One","category":"display","variants":["regular"]},"Pavanam":{"family":"Pavanam","category":"sans-serif","variants":["regular"]},"Paytone One":{"family":"Paytone One","category":"sans-serif","variants":["regular"]},"Peddana":{"family":"Peddana","category":"serif","variants":["regular"]},"Peralta":{"family":"Peralta","category":"display","variants":["regular"]},"Permanent Marker":{"family":"Permanent Marker","category":"handwriting","variants":["regular"]},"Petit Formal Script":{"family":"Petit Formal Script","category":"handwriting","variants":["regular"]},"Petrona":{"family":"Petrona","category":"serif","variants":["regular"]},"Philosopher":{"family":"Philosopher","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Piedra":{"family":"Piedra","category":"display","variants":["regular"]},"Pinyon Script":{"family":"Pinyon Script","category":"handwriting","variants":["regular"]},"Pirata One":{"family":"Pirata One","category":"display","variants":["regular"]},"Plaster":{"family":"Plaster","category":"display","variants":["regular"]},"Play":{"family":"Play","category":"sans-serif","variants":["700","regular"]},"Playball":{"family":"Playball","category":"display","variants":["regular"]},"Playfair Display":{"family":"Playfair Display","category":"serif","variants":["700","700italic","900","900italic","italic","regular"]},"Playfair Display SC":{"family":"Playfair Display SC","category":"serif","variants":["700","700italic","900","900italic","italic","regular"]},"Podkova":{"family":"Podkova","category":"serif","variants":["500","600","700","800","regular"]},"Poiret One":{"family":"Poiret One","category":"display","variants":["regular"]},"Poller One":{"family":"Poller One","category":"display","variants":["regular"]},"Poly":{"family":"Poly","category":"serif","variants":["italic","regular"]},"Pompiere":{"family":"Pompiere","category":"display","variants":["regular"]},"Pontano Sans":{"family":"Pontano Sans","category":"sans-serif","variants":["regular"]},"Poppins":{"family":"Poppins","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Port Lligat Sans":{"family":"Port Lligat Sans","category":"sans-serif","variants":["regular"]},"Port Lligat Slab":{"family":"Port Lligat Slab","category":"serif","variants":["regular"]},"Pragati Narrow":{"family":"Pragati Narrow","category":"sans-serif","variants":["700","regular"]},"Prata":{"family":"Prata","category":"serif","variants":["regular"]},"Preahvihear":{"family":"Preahvihear","category":"display","variants":["regular"]},"Press Start 2P":{"family":"Press Start 2P","category":"display","variants":["regular"]},"Pridi":{"family":"Pridi","category":"serif","variants":["200","300","500","600","700","regular"]},"Princess Sofia":{"family":"Princess Sofia","category":"handwriting","variants":["regular"]},"Prociono":{"family":"Prociono","category":"serif","variants":["regular"]},"Prompt":{"family":"Prompt","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Prosto One":{"family":"Prosto One","category":"display","variants":["regular"]},"Proza Libre":{"family":"Proza Libre","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Puritan":{"family":"Puritan","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Purple Purse":{"family":"Purple Purse","category":"display","variants":["regular"]},"Quando":{"family":"Quando","category":"serif","variants":["regular"]},"Quantico":{"family":"Quantico","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Quattrocento":{"family":"Quattrocento","category":"serif","variants":["700","regular"]},"Quattrocento Sans":{"family":"Quattrocento Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Questrial":{"family":"Questrial","category":"sans-serif","variants":["regular"]},"Quicksand":{"family":"Quicksand","category":"sans-serif","variants":["300","500","700","regular"]},"Quintessential":{"family":"Quintessential","category":"handwriting","variants":["regular"]},"Qwigley":{"family":"Qwigley","category":"handwriting","variants":["regular"]},"Racing Sans One":{"family":"Racing Sans One","category":"display","variants":["regular"]},"Radley":{"family":"Radley","category":"serif","variants":["italic","regular"]},"Rajdhani":{"family":"Rajdhani","category":"sans-serif","variants":["300","500","600","700","regular"]},"Rakkas":{"family":"Rakkas","category":"display","variants":["regular"]},"Raleway":{"family":"Raleway","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Raleway Dots":{"family":"Raleway Dots","category":"display","variants":["regular"]},"Ramabhadra":{"family":"Ramabhadra","category":"sans-serif","variants":["regular"]},"Ramaraja":{"family":"Ramaraja","category":"serif","variants":["regular"]},"Rambla":{"family":"Rambla","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Rammetto One":{"family":"Rammetto One","category":"display","variants":["regular"]},"Ranchers":{"family":"Ranchers","category":"display","variants":["regular"]},"Rancho":{"family":"Rancho","category":"handwriting","variants":["regular"]},"Ranga":{"family":"Ranga","category":"display","variants":["700","regular"]},"Rasa":{"family":"Rasa","category":"serif","variants":["300","500","600","700","regular"]},"Rationale":{"family":"Rationale","category":"sans-serif","variants":["regular"]},"Ravi Prakash":{"family":"Ravi Prakash","category":"display","variants":["regular"]},"Redressed":{"family":"Redressed","category":"handwriting","variants":["regular"]},"Reem Kufi":{"family":"Reem Kufi","category":"sans-serif","variants":["regular"]},"Reenie Beanie":{"family":"Reenie Beanie","category":"handwriting","variants":["regular"]},"Revalia":{"family":"Revalia","category":"display","variants":["regular"]},"Rhodium Libre":{"family":"Rhodium Libre","category":"serif","variants":["regular"]},"Ribeye":{"family":"Ribeye","category":"display","variants":["regular"]},"Ribeye Marrow":{"family":"Ribeye Marrow","category":"display","variants":["regular"]},"Righteous":{"family":"Righteous","category":"display","variants":["regular"]},"Risque":{"family":"Risque","category":"display","variants":["regular"]},"Roboto":{"family":"Roboto","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","900","900italic","italic","regular"]},"Roboto Condensed":{"family":"Roboto Condensed","category":"sans-serif","variants":["300","300italic","700","700italic","italic","regular"]},"Roboto Mono":{"family":"Roboto Mono","category":"monospace","variants":["100","100italic","300","300italic","500","500italic","700","700italic","italic","regular"]},"Roboto Slab":{"family":"Roboto Slab","category":"serif","variants":["100","300","700","regular"]},"Rochester":{"family":"Rochester","category":"handwriting","variants":["regular"]},"Rock Salt":{"family":"Rock Salt","category":"handwriting","variants":["regular"]},"Rokkitt":{"family":"Rokkitt","category":"serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Romanesco":{"family":"Romanesco","category":"handwriting","variants":["regular"]},"Ropa Sans":{"family":"Ropa Sans","category":"sans-serif","variants":["italic","regular"]},"Rosario":{"family":"Rosario","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Rosarivo":{"family":"Rosarivo","category":"serif","variants":["italic","regular"]},"Rouge Script":{"family":"Rouge Script","category":"handwriting","variants":["regular"]},"Rozha One":{"family":"Rozha One","category":"serif","variants":["regular"]},"Rubik":{"family":"Rubik","category":"sans-serif","variants":["300","300italic","500","500italic","700","700italic","900","900italic","italic","regular"]},"Rubik Mono One":{"family":"Rubik Mono One","category":"sans-serif","variants":["regular"]},"Ruda":{"family":"Ruda","category":"sans-serif","variants":["700","900","regular"]},"Rufina":{"family":"Rufina","category":"serif","variants":["700","regular"]},"Ruge Boogie":{"family":"Ruge Boogie","category":"handwriting","variants":["regular"]},"Ruluko":{"family":"Ruluko","category":"sans-serif","variants":["regular"]},"Rum Raisin":{"family":"Rum Raisin","category":"sans-serif","variants":["regular"]},"Ruslan Display":{"family":"Ruslan Display","category":"display","variants":["regular"]},"Russo One":{"family":"Russo One","category":"sans-serif","variants":["regular"]},"Ruthie":{"family":"Ruthie","category":"handwriting","variants":["regular"]},"Rye":{"family":"Rye","category":"display","variants":["regular"]},"Sacramento":{"family":"Sacramento","category":"handwriting","variants":["regular"]},"Sahitya":{"family":"Sahitya","category":"serif","variants":["700","regular"]},"Sail":{"family":"Sail","category":"display","variants":["regular"]},"Saira":{"family":"Saira","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Condensed":{"family":"Saira Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Extra Condensed":{"family":"Saira Extra Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Semi Condensed":{"family":"Saira Semi Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Salsa":{"family":"Salsa","category":"display","variants":["regular"]},"Sanchez":{"family":"Sanchez","category":"serif","variants":["italic","regular"]},"Sancreek":{"family":"Sancreek","category":"display","variants":["regular"]},"Sansita":{"family":"Sansita","category":"sans-serif","variants":["700","700italic","800","800italic","900","900italic","italic","regular"]},"Sarala":{"family":"Sarala","category":"sans-serif","variants":["700","regular"]},"Sarina":{"family":"Sarina","category":"display","variants":["regular"]},"Sarpanch":{"family":"Sarpanch","category":"sans-serif","variants":["500","600","700","800","900","regular"]},"Satisfy":{"family":"Satisfy","category":"handwriting","variants":["regular"]},"Scada":{"family":"Scada","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Scheherazade":{"family":"Scheherazade","category":"serif","variants":["700","regular"]},"Schoolbell":{"family":"Schoolbell","category":"handwriting","variants":["regular"]},"Scope One":{"family":"Scope One","category":"serif","variants":["regular"]},"Seaweed Script":{"family":"Seaweed Script","category":"display","variants":["regular"]},"Secular One":{"family":"Secular One","category":"sans-serif","variants":["regular"]},"Sedgwick Ave":{"family":"Sedgwick Ave","category":"handwriting","variants":["regular"]},"Sedgwick Ave Display":{"family":"Sedgwick Ave Display","category":"handwriting","variants":["regular"]},"Sevillana":{"family":"Sevillana","category":"display","variants":["regular"]},"Seymour One":{"family":"Seymour One","category":"sans-serif","variants":["regular"]},"Shadows Into Light":{"family":"Shadows Into Light","category":"handwriting","variants":["regular"]},"Shadows Into Light Two":{"family":"Shadows Into Light Two","category":"handwriting","variants":["regular"]},"Shanti":{"family":"Shanti","category":"sans-serif","variants":["regular"]},"Share":{"family":"Share","category":"display","variants":["700","700italic","italic","regular"]},"Share Tech":{"family":"Share Tech","category":"sans-serif","variants":["regular"]},"Share Tech Mono":{"family":"Share Tech Mono","category":"monospace","variants":["regular"]},"Shojumaru":{"family":"Shojumaru","category":"display","variants":["regular"]},"Short Stack":{"family":"Short Stack","category":"handwriting","variants":["regular"]},"Shrikhand":{"family":"Shrikhand","category":"display","variants":["regular"]},"Siemreap":{"family":"Siemreap","category":"display","variants":["regular"]},"Sigmar One":{"family":"Sigmar One","category":"display","variants":["regular"]},"Signika":{"family":"Signika","category":"sans-serif","variants":["300","600","700","regular"]},"Signika Negative":{"family":"Signika Negative","category":"sans-serif","variants":["300","600","700","regular"]},"Simonetta":{"family":"Simonetta","category":"display","variants":["900","900italic","italic","regular"]},"Sintony":{"family":"Sintony","category":"sans-serif","variants":["700","regular"]},"Sirin Stencil":{"family":"Sirin Stencil","category":"display","variants":["regular"]},"Six Caps":{"family":"Six Caps","category":"sans-serif","variants":["regular"]},"Skranji":{"family":"Skranji","category":"display","variants":["700","regular"]},"Slabo 13px":{"family":"Slabo 13px","category":"serif","variants":["regular"]},"Slabo 27px":{"family":"Slabo 27px","category":"serif","variants":["regular"]},"Slackey":{"family":"Slackey","category":"display","variants":["regular"]},"Smokum":{"family":"Smokum","category":"display","variants":["regular"]},"Smythe":{"family":"Smythe","category":"display","variants":["regular"]},"Sniglet":{"family":"Sniglet","category":"display","variants":["800","regular"]},"Snippet":{"family":"Snippet","category":"sans-serif","variants":["regular"]},"Snowburst One":{"family":"Snowburst One","category":"display","variants":["regular"]},"Sofadi One":{"family":"Sofadi One","category":"display","variants":["regular"]},"Sofia":{"family":"Sofia","category":"handwriting","variants":["regular"]},"Sonsie One":{"family":"Sonsie One","category":"display","variants":["regular"]},"Sorts Mill Goudy":{"family":"Sorts Mill Goudy","category":"serif","variants":["italic","regular"]},"Source Code Pro":{"family":"Source Code Pro","category":"monospace","variants":["200","300","500","600","700","900","regular"]},"Source Sans Pro":{"family":"Source Sans Pro","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","900","900italic","italic","regular"]},"Source Serif Pro":{"family":"Source Serif Pro","category":"serif","variants":["600","700","regular"]},"Space Mono":{"family":"Space Mono","category":"monospace","variants":["700","700italic","italic","regular"]},"Special Elite":{"family":"Special Elite","category":"display","variants":["regular"]},"Spectral":{"family":"Spectral","category":"serif","variants":["200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Spectral SC":{"family":"Spectral SC","category":"serif","variants":["200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Spicy Rice":{"family":"Spicy Rice","category":"display","variants":["regular"]},"Spinnaker":{"family":"Spinnaker","category":"sans-serif","variants":["regular"]},"Spirax":{"family":"Spirax","category":"display","variants":["regular"]},"Squada One":{"family":"Squada One","category":"display","variants":["regular"]},"Sree Krushnadevaraya":{"family":"Sree Krushnadevaraya","category":"serif","variants":["regular"]},"Sriracha":{"family":"Sriracha","category":"handwriting","variants":["regular"]},"Stalemate":{"family":"Stalemate","category":"handwriting","variants":["regular"]},"Stalinist One":{"family":"Stalinist One","category":"display","variants":["regular"]},"Stardos Stencil":{"family":"Stardos Stencil","category":"display","variants":["700","regular"]},"Stint Ultra Condensed":{"family":"Stint Ultra Condensed","category":"display","variants":["regular"]},"Stint Ultra Expanded":{"family":"Stint Ultra Expanded","category":"display","variants":["regular"]},"Stoke":{"family":"Stoke","category":"serif","variants":["300","regular"]},"Strait":{"family":"Strait","category":"sans-serif","variants":["regular"]},"Sue Ellen Francisco":{"family":"Sue Ellen Francisco","category":"handwriting","variants":["regular"]},"Suez One":{"family":"Suez One","category":"serif","variants":["regular"]},"Sumana":{"family":"Sumana","category":"serif","variants":["700","regular"]},"Sunshiney":{"family":"Sunshiney","category":"handwriting","variants":["regular"]},"Supermercado One":{"family":"Supermercado One","category":"display","variants":["regular"]},"Sura":{"family":"Sura","category":"serif","variants":["700","regular"]},"Suranna":{"family":"Suranna","category":"serif","variants":["regular"]},"Suravaram":{"family":"Suravaram","category":"serif","variants":["regular"]},"Suwannaphum":{"family":"Suwannaphum","category":"display","variants":["regular"]},"Swanky and Moo Moo":{"family":"Swanky and Moo Moo","category":"handwriting","variants":["regular"]},"Syncopate":{"family":"Syncopate","category":"sans-serif","variants":["700","regular"]},"Tangerine":{"family":"Tangerine","category":"handwriting","variants":["700","regular"]},"Taprom":{"family":"Taprom","category":"display","variants":["regular"]},"Tauri":{"family":"Tauri","category":"sans-serif","variants":["regular"]},"Taviraj":{"family":"Taviraj","category":"serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Teko":{"family":"Teko","category":"sans-serif","variants":["300","500","600","700","regular"]},"Telex":{"family":"Telex","category":"sans-serif","variants":["regular"]},"Tenali Ramakrishna":{"family":"Tenali Ramakrishna","category":"sans-serif","variants":["regular"]},"Tenor Sans":{"family":"Tenor Sans","category":"sans-serif","variants":["regular"]},"Text Me One":{"family":"Text Me One","category":"sans-serif","variants":["regular"]},"The Girl Next Door":{"family":"The Girl Next Door","category":"handwriting","variants":["regular"]},"Tienne":{"family":"Tienne","category":"serif","variants":["700","900","regular"]},"Tillana":{"family":"Tillana","category":"handwriting","variants":["500","600","700","800","regular"]},"Timmana":{"family":"Timmana","category":"sans-serif","variants":["regular"]},"Tinos":{"family":"Tinos","category":"serif","variants":["700","700italic","italic","regular"]},"Titan One":{"family":"Titan One","category":"display","variants":["regular"]},"Titillium Web":{"family":"Titillium Web","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","900","italic","regular"]},"Trade Winds":{"family":"Trade Winds","category":"display","variants":["regular"]},"Trirong":{"family":"Trirong","category":"serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Trocchi":{"family":"Trocchi","category":"serif","variants":["regular"]},"Trochut":{"family":"Trochut","category":"display","variants":["700","italic","regular"]},"Trykker":{"family":"Trykker","category":"serif","variants":["regular"]},"Tulpen One":{"family":"Tulpen One","category":"display","variants":["regular"]},"Ubuntu":{"family":"Ubuntu","category":"sans-serif","variants":["300","300italic","500","500italic","700","700italic","italic","regular"]},"Ubuntu Condensed":{"family":"Ubuntu Condensed","category":"sans-serif","variants":["regular"]},"Ubuntu Mono":{"family":"Ubuntu Mono","category":"monospace","variants":["700","700italic","italic","regular"]},"Ultra":{"family":"Ultra","category":"serif","variants":["regular"]},"Uncial Antiqua":{"family":"Uncial Antiqua","category":"display","variants":["regular"]},"Underdog":{"family":"Underdog","category":"display","variants":["regular"]},"Unica One":{"family":"Unica One","category":"display","variants":["regular"]},"UnifrakturCook":{"family":"UnifrakturCook","category":"display","variants":["700"]},"UnifrakturMaguntia":{"family":"UnifrakturMaguntia","category":"display","variants":["regular"]},"Unkempt":{"family":"Unkempt","category":"display","variants":["700","regular"]},"Unlock":{"family":"Unlock","category":"display","variants":["regular"]},"Unna":{"family":"Unna","category":"serif","variants":["700","700italic","italic","regular"]},"VT323":{"family":"VT323","category":"monospace","variants":["regular"]},"Vampiro One":{"family":"Vampiro One","category":"display","variants":["regular"]},"Varela":{"family":"Varela","category":"sans-serif","variants":["regular"]},"Varela Round":{"family":"Varela Round","category":"sans-serif","variants":["regular"]},"Vast Shadow":{"family":"Vast Shadow","category":"display","variants":["regular"]},"Vesper Libre":{"family":"Vesper Libre","category":"serif","variants":["500","700","900","regular"]},"Vibur":{"family":"Vibur","category":"handwriting","variants":["regular"]},"Vidaloka":{"family":"Vidaloka","category":"serif","variants":["regular"]},"Viga":{"family":"Viga","category":"sans-serif","variants":["regular"]},"Voces":{"family":"Voces","category":"display","variants":["regular"]},"Volkhov":{"family":"Volkhov","category":"serif","variants":["700","700italic","italic","regular"]},"Vollkorn":{"family":"Vollkorn","category":"serif","variants":["600","600italic","700","700italic","900","900italic","italic","regular"]},"Vollkorn SC":{"family":"Vollkorn SC","category":"serif","variants":["600","700","900","regular"]},"Voltaire":{"family":"Voltaire","category":"sans-serif","variants":["regular"]},"Waiting for the Sunrise":{"family":"Waiting for the Sunrise","category":"handwriting","variants":["regular"]},"Wallpoet":{"family":"Wallpoet","category":"display","variants":["regular"]},"Walter Turncoat":{"family":"Walter Turncoat","category":"handwriting","variants":["regular"]},"Warnes":{"family":"Warnes","category":"display","variants":["regular"]},"Wellfleet":{"family":"Wellfleet","category":"display","variants":["regular"]},"Wendy One":{"family":"Wendy One","category":"sans-serif","variants":["regular"]},"Wire One":{"family":"Wire One","category":"sans-serif","variants":["regular"]},"Work Sans":{"family":"Work Sans","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Yanone Kaffeesatz":{"family":"Yanone Kaffeesatz","category":"sans-serif","variants":["200","300","700","regular"]},"Yantramanav":{"family":"Yantramanav","category":"sans-serif","variants":["100","300","500","700","900","regular"]},"Yatra One":{"family":"Yatra One","category":"display","variants":["regular"]},"Yellowtail":{"family":"Yellowtail","category":"handwriting","variants":["regular"]},"Yeseva One":{"family":"Yeseva One","category":"display","variants":["regular"]},"Yesteryear":{"family":"Yesteryear","category":"handwriting","variants":["regular"]},"Yrsa":{"family":"Yrsa","category":"serif","variants":["300","500","600","700","regular"]},"Zeyada":{"family":"Zeyada","category":"handwriting","variants":["regular"]},"Zilla Slab":{"family":"Zilla Slab","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Zilla Slab Highlight":{"family":"Zilla Slab Highlight","category":"display","variants":["700","regular"]}},"order":{"popularity":["Roboto","Open Sans","Lato","Roboto Condensed","Montserrat","Slabo 27px","Oswald","Source Sans Pro","Raleway","PT Sans","Roboto Slab","Merriweather","Open Sans Condensed","Lora","Ubuntu","Playfair Display","Noto Sans","Titillium Web","Poppins","PT Serif","Arimo","Muli","PT Sans Narrow","Noto Serif","Indie Flower","Inconsolata","Dosis","Nunito","Anton","Bitter","Fira Sans","Oxygen","Crimson Text","Josefin Sans","Cabin","Work Sans","Libre Baskerville","Fjalla One","Arvo","Lobster","Quicksand","Exo 2","Hind","Abril Fatface","Roboto Mono","Rubik","Catamaran","Yanone Kaffeesatz","Abel","Karla","Pacifico","Bree Serif","Varela Round","Acme","Shadows Into Light","Asap","Merriweather Sans","Libre Franklin","Ubuntu Condensed","Gloria Hallelujah","Signika","Archivo Narrow","Dancing Script","Cormorant Garamond","Questrial","Source Code Pro","Nunito Sans","Play","Rajdhani","Maven Pro","Source Serif Pro","Cairo","Crete Round","Francois One","Archivo Black","Berkshire Swash","EB Garamond","Amatic SC","PT Sans Caption","Rokkitt","Comfortaa","Cuprum","Patua One","Exo","Vollkorn","Ropa Sans","Shrikhand","Kanit","Poiret One","Domine","Cinzel","Courgette","Pathway Gothic One","Righteous","Old Standard TT","Satisfy","Josefin Slab","Heebo","Orbitron","Alegreya","Alegreya Sans","Quattrocento Sans","News Cycle","Russo One","Passion One","Hind Siliguri","Cookie","Noticia Text","Permanent Marker","Great Vibes","Istok Web","Kaushan Script","Teko","Monda","Lobster Two","ABeeZee","Cardo","Gudea","Yantramanav","Philosopher","Amaranth","Sanchez","Quattrocento","Tinos","Cabin Condensed","Economica","Kalam","Pontano Sans","Playfair Display SC","Sacramento","Alfa Slab One","Handlee","Arapey","Amiri","Bangers","Didact Gothic","Volkhov","Hammersmith One","Prompt","Audiowide","Concert One","Fredoka One","BenchNine","Jura","Tangerine","Adamina","Neuton","Armata","Sarala","Vidaloka","Caveat","Marck Script","Boogaloo","Shadows Into Light Two","Cantarell","Khand","Assistant","Ruda","Monoton","Arima Madurai","Rock Salt","Overpass","Architects Daughter","Gentium Book Basic","Caveat Brush","Glegoo","Antic Slab","Scada","Unica One","VT323","Yellowtail","Changa","Sorts Mill Goudy","Julius Sans One","Kreon","Coustard","Fira Sans Condensed","Hind Madurai","Luckiest Guy","Chewy","Gentium Basic","Patrick Hand","PT Mono","Pragati Narrow","Bad Script","Prata","Forum","Aldrich","Yrsa","Neucha","Homemade Apple","Special Elite","Alice","Playball","Paytone One","Bevan","Sintony","Magra","Actor","Contrail One","Signika Negative","Ovo","Enriqueta","Varela","Arsenal","Gochi Hand","Damion","Sigmar One","Cabin Sketch","Basic","Martel","Oleo Script","Alegreya Sans SC","Arbutus Slab","Rufina","Nothing You Could Do","Lusitana","Advent Pro","Kameron","Rambla","Covered By Your Grace","Hind Vadodara","Fira Sans Extra Condensed","PT Serif Caption","Alex Brush","Rancho","Fugaz One","Prosto One","Merienda","Montserrat Alternates","Press Start 2P","Share","Just Another Hand","Marmelad","Ubuntu Mono","Cantata One","Chivo","Frank Ruhl Libre","Coda","Allura","Nobile","Barlow Condensed","Lustria","Carme","Convergence","Ceviche One","Marcellus","Bungee","Spinnaker","Electrolize","Michroma","Coming Soon","Overlock","Reenie Beanie","Slabo 13px","Alef","Pinyon Script","Niconne","Copse","Voltaire","Cousine","Khula","Radley","Oranienbaum","Marcellus SC","Ultra","Carter One","Syncopate","Viga","Telex","Archivo","Molengo","Parisienne","Freckle Face","Bubblegum Sans","Jaldi","Quantico","Average","Grand Hotel","Fauna One","Limelight","Leckerli One","Changa One","Metrophobic","Cutive Mono","Days One","Fredericka the Great","Black Ops One","Karma","Lateef","Goudy Bookletter 1911","Carrois Gothic","Space Mono","Annie Use Your Telescope","Alegreya SC","Aladin","Rosario","Love Ya Like A Sister","Marvel","Andada","Rochester","Squada One","Candal","Baloo","Cinzel Decorative","Jockey One","Nixie One","Aclonica","Homenaje","Hind Guntur","Yesteryear","Martel Sans","Italianno","Norican","Bowlby One SC","Rasa","Allerta","Kurale","Antic","Reem Kufi","Palanquin","Tauri","Cutive","Puritan","Cambay","Anonymous Pro","Lalezar","Pompiere","Itim","Average Sans","Kelly Slab","Allerta Stencil","Pridi","Calligraffitti","Voces","Mr Dafoe","Fanwood Text","Racing Sans One","Tenor Sans","Graduate","Biryani","Halant","Inder","Barlow","Gravitas One","Cormorant","Scheherazade","Mitr","El Messiri","Doppio One","Six Caps","Short Stack","The Girl Next Door","Give You Glory","Lilita One","Capriola","Taviraj","Yeseva One","Risque","Happy Monkey","Mr De Haviland","Trocchi","Petit Formal Script","Gilda Display","Schoolbell","Caudex","Delius","Judson","Zilla Slab","Artifika","Fontdiner Swanky","Saira Semi Condensed","GFS Didot","Bungee Inline","Quando","Abhaya Libre","Andika","Londrina Solid","Balthazar","Unna","Baloo Paaji","Lekton","Herr Von Muellerhoff","IM Fell Double Pica","Belleza","Wire One","Merienda One","Mada","Zeyada","Sue Ellen Francisco","Share Tech Mono","Montez","Trirong","Macondo","Baumans","Allan","Alike","Encode Sans Condensed","Arizonia","Gabriela","Rozha One","Chelsea Market","Vast Shadow","Eczar","Duru Sans","Mate","Mako","Megrim","Knewave","Bowlby One","IM Fell English","Clicker Script","Poly","Cambo","Oregano","Saira Extra Condensed","Rouge Script","Athiti","Gruppo","Qwigley","Imprima","Strait","La Belle Aurore","Barlow Semi Condensed","Saira","Kristi","Brawler","NTR","Crafty Girls","Rammetto One","Federo","Walter Turncoat","Frijole","Lemon","Miriam Libre","Gafata","Hanuman","Bilbo Swash Caps","Belgrano","Kranky","Emilys Candy","Oxygen Mono","Waiting for the Sunrise","Anaheim","Loved by the King","Quintessential","Euphoria Script","Fondamento","Iceland","Secular One","Fira Mono","Seaweed Script","Unkempt","Denk One","Palanquin Dark","Baloo Bhaina","Spectral","Mouse Memoirs","Dawning of a New Day","Creepster","Cherry Swash","Lily Script One","Saira Condensed","Shojumaru","Carrois Gothic SC","Port Lligat Slab","Maitree","Just Me Again Down Here","Orienta","Averia Serif Libre","Titan One","Oleo Script Swash Caps","Podkova","Patrick Hand SC","Expletus Sans","Stalemate","Cedarville Cursive","Crushed","Italiana","Delius Swash Caps","IM Fell English SC","UnifrakturMaguntia","Corben","Metamorphous","Sofia","Raleway Dots","Tienne","Buenard","Harmattan","Over the Rainbow","Pangolin","Sniglet","Vesper Libre","Meddon","Mukta","Gurajada","Engagement","Mukta Vaani","Stardos Stencil","Ledger","Nova Mono","David Libre","Amethysta","Aguafina Script","Rye","Prociono","Life Savers","Numans","Salsa","Spirax","Bentham","Headland One","Joti One","Finger Paint","Vampiro One","Cantora One","Sriracha","Holtwood One SC","Kotta One","Sancreek","Lemonada","Geo","Cherry Cream Soda","Skranji","Codystar","Shanti","Amiko","Proza Libre","Baloo Tamma","Ranchers","Ramabhadra","Chau Philomene One","Simonetta","IM Fell DW Pica","Englebert","Condiment","Suranna","Mirza","Nova Square","Laila","Medula One","Wallpoet","Nova Slim","Bungee Shade","Poller One","Pattaya","Rubik Mono One","Suez One","McLaren","Share Tech","Faster One","Asap Condensed","Spectral SC","Supermercado One","Mystery Quest","Mallanna","Aref Ruqaa","Fjord One","Wendy One","Jim Nightshade","Amarante","Dorsa","Averia Sans Libre","Dynalight","Baloo Chettan","Maiden Orange","Tulpen One","Rosarivo","Kite One","Habibi","Germania One","Sarpanch","Londrina Outline","Port Lligat Sans","League Script","Mate SC","Katibeh","Slackey","Antic Didone","Almendra","Averia Libre","Stint Ultra Condensed","Fenix","Mountains of Christmas","Inika","Pirata One","Ruslan Display","Asul","Sumana","Khmer","Nosifer","Flamenco","Sail","Stint Ultra Expanded","Rationale","Cormorant Infant","Vibur","Fascinate Inline","Henny Penny","Encode Sans","Mandali","Dekko","Mrs Saint Delafield","Delius Unicase","Montserrat Subrayada","Donegal One","Milonga","Ruluko","Krona One","Alike Angular","Mogra","Elsie","Ruthie","Stoke","Esteban","Princess Sofia","Bilbo","Chonburi","IM Fell French Canon","Kadwa","Junge","Lovers Quarrel","Rakkas","Cormorant SC","Ravi Prakash","Trade Winds","Kavoon","Ribeye","Cagliostro","Faustina","Nova Flat","Coda Caption","Swanky and Moo Moo","Bellefair","UnifrakturCook","Sonsie One","Sarina","Sansita","Akronim","Croissant One","Nova Round","Paprika","Fresca","Arya","Griffy","Pavanam","Peralta","Miniver","Sedgwick Ave","Scope One","Buda","Text Me One","Amita","Battambang","Plaster","Bubbler One","Monsieur La Doulaise","Chicle","Rhodium Libre","IM Fell DW Pica SC","Monofett","IM Fell Great Primer","Linden Hill","Baloo Thambi","Asset","Glass Antiqua","Offside","Julee","Londrina Shadow","Diplomata SC","Overlock SC","Spicy Rice","Ranga","Angkor","Margarine","Ramaraja","BioRhyme","Autour One","Eagle Lake","IM Fell Double Pica SC","New Rocker","Redressed","Revalia","MedievalSharp","Trykker","Galindo","Della Respira","Snippet","Iceberg","Macondo Swash Caps","Baloo Bhai","Bigelow Rules","Fascinate","Molle","Snowburst One","Yatra One","Wellfleet","Uncial Antiqua","Underdog","Averia Gruesa Libre","Ribeye Marrow","Montaga","Petrona","Bigshot One","Sunshiney","Ewert","Original Surfer","Cormorant Upright","Geostar Fill","Encode Sans Semi Condensed","Caesar Dressing","Meie Script","Marko One","Inknut Antiqua","Modern Antiqua","Sahitya","Lancelot","Irish Grover","Goblin One","Purple Purse","Oldenburg","Baloo Bhaijaan","Keania One","Dr Sugiyama","Content","Encode Sans Expanded","Jacques Francois Shadow","GFS Neohellenic","IM Fell French Canon SC","Jomhuria","Atomic Age","Chango","Metal Mania","Sura","Almendra SC","Rum Raisin","Smythe","Mukta Malar","Astloch","Atma","Miltonian Tattoo","Jolly Lodger","Flavors","Farsan","Elsie Swash Caps","Diplomata","Tillana","Romanesco","Galada","Sree Krushnadevaraya","Nokora","Arbutus","Ruge Boogie","Piedra","Jacques Francois","Warnes","Seymour One","IM Fell Great Primer SC","Galdeano","Miltonian","Smokum","Lakki Reddy","Passero One","Devonshire","Trochut","Nova Oval","Gorditas","Mrs Sheppards","Kenia","Manuale","Koulen","Overpass Mono","Coiny","Miss Fajardose","Freehand","Asar","Barrio","Bonbon","Odor Mean Chey","Bayon","Felipa","Meera Inimai","Bokor","Padauk","Modak","Suwannaphum","Londrina Sketch","Almendra Display","Nova Script","Butcherman","Stalinist One","Dangrek","Timmana","Eater","Moul","Metal","Fruktur","Combo","Erica One","Butterfly Kids","Vollkorn SC","Sofadi One","Sedgwick Ave Display","Sirin Stencil","Kavivanar","Nova Cut","Cormorant Unicase","Kantumruy","Emblema One","Chathura","Siemreap","Aubrey","Kumar One","Geostar","Hanalei Fill","Baloo Da","Sevillana","Hanalei","Zilla Slab Highlight","Federant","Chela One","Taprom","Bungee Hairline","Bahiana","Bungee Outline","Tenali Ramakrishna","Baloo Tammudu","Mr Bedfort","Preahvihear","Libre Barcode 39 Text","Chenla","Peddana","Suravaram","Fasthand","Gidugu","Moulpali","Libre Barcode 39 Extended Text","Mukta Mahee","Encode Sans Semi Expanded","Kdam Thmor","Unlock","Dhurjati","Kumar One Outline","Libre Barcode 39 Extended","Libre Barcode 128 Text","Libre Barcode 39","BioRhyme Expanded","Libre Barcode 128"],"trending":["Supermercado One","Risque","Kavivanar","VT323","Sedgwick Ave","Macondo","Saira Condensed","Miriam Libre","Libre Barcode 39","Bungee Hairline","Encode Sans Semi Expanded","Baloo Bhai","Caveat Brush","Ranchers","Libre Barcode 39 Extended","Archivo","Libre Barcode 128","Titan One","Andada","Rasa","Emblema One","GFS Neohellenic","Cambo","Port Lligat Sans","BioRhyme Expanded","Kumar One Outline","Lemon","Suravaram","Bangers","Voces","Miniver","Harmattan","Poly","Dekko","Scada","Biryani","Bowlby One","Ceviche One","Baloo Chettan","Source Code Pro","Sedgwick Ave Display","Libre Barcode 128 Text","Mirza","Bubblegum Sans","Rakkas","Sigmar One","Dangrek","IM Fell English SC","Manuale","Basic","Hanalei Fill","Sriracha","Marmelad","Suez One","Pridi","Kavoon","Aref Ruqaa","Englebert","Jolly Lodger","Hind Madurai","Rock Salt","Trocchi","Meera Inimai","Voltaire","Marck Script","Encode Sans","Metrophobic","Baloo Da","Seymour One","Astloch","Economica","Arima Madurai","Cherry Cream Soda","Cormorant Upright","Barlow","Arsenal","Fascinate Inline","Jacques Francois Shadow","Share Tech","Montez","Nunito Sans","Space Mono","Just Me Again Down Here","Nova Flat","Joti One","Barlow Semi Condensed","Gentium Book Basic","Love Ya Like A Sister","Smokum","Cormorant Garamond","Nosifer","Aclonica","Kurale","Federant","Bigshot One","Londrina Shadow","Felipa","Podkova","Shrikhand","Cormorant Unicase","Jacques Francois","Gidugu","Butcherman","Freehand","Dorsa","Jura","Atomic Age","Londrina Sketch","Arbutus","Kelly Slab","Caesar Dressing","Sunshiney","Gravitas One","Carter One","Palanquin","Chango","Forum","Ruge Boogie","Kite One","Raleway Dots","Fontdiner Swanky","Rubik Mono One","Mr De Haviland","Goblin One","Coming Soon","Fruktur","Geo","Kantumruy","Ravi Prakash","Neuton","Palanquin Dark","Simonetta","Molle","Carme","IM Fell French Canon SC","Asset","Croissant One","Eater","Aubrey","Tillana","Chewy","Kalam","Gurajada","Pompiere","David Libre","Angkor","Kenia","Bonbon","Geostar","Laila","Swanky and Moo Moo","Modern Antiqua","Marko One","IM Fell English","Give You Glory","Sofadi One","Jomhuria","Padauk","Orienta","Philosopher","Ruluko","Over the Rainbow","Engagement","Andika","Gentium Basic","Gilda Display","Galdeano","IM Fell DW Pica SC","Encode Sans Condensed","Macondo Swash Caps","Lateef","Copse","Baloo Tamma","Anton","Qwigley","Rosarivo","Comfortaa","Fira Sans Extra Condensed","Anaheim","Schoolbell","Taprom","Volkhov","Fjord One","Donegal One","Saira","Gruppo","Jockey One","Buenard","Cantarell","Homemade Apple","Delius","Cinzel","Iceberg","Battambang","Gochi Hand","Diplomata SC","Libre Baskerville","Mate SC","Oleo Script","Finger Paint","Farsan","Sancreek","Belgrano","Skranji","Moul","Flavors","McLaren","Taviraj","Telex","Bilbo","Petit Formal Script","Lekton","Content","Yrsa","Paytone One","Fira Sans","Orbitron","Oregano","Fauna One","Gafata","Megrim","Eczar","Overpass Mono","Lustria","Roboto Mono","Prompt","Sonsie One","Mr Dafoe","Almendra SC","Kaushan Script","Esteban","Cagliostro","Mate","Delius Swash Caps","Judson","Poller One","El Messiri","Inconsolata","Zilla Slab","Offside","Acme","Mako","Suwannaphum","Rubik","Nova Mono","Tinos","Mitr","Autour One","Zeyada","Italianno","Katibeh","Smythe","IM Fell Double Pica","Meddon","Allan","Archivo Narrow","Noto Sans","Graduate","UnifrakturMaguntia","Sacramento","Ledger","Poppins","Sura","Satisfy","Changa One","Signika","Underdog","Audiowide","Averia Libre","Nova Cut","Tangerine","Allura","Proza Libre","Cutive","Titillium Web","Seaweed Script","Oxygen Mono","Special Elite","Condiment","Wellfleet","Butterfly Kids","Indie Flower","Nobile","Griffy","Wallpoet","Exo 2","Kranky","Lobster","Spinnaker","Bentham","EB Garamond","Arizonia","Fira Sans Condensed","Abril Fatface","Metal Mania","Glegoo","Nothing You Could Do","Cousine","Dhurjati","Barrio","Martel Sans","Alex Brush","Noticia Text","Luckiest Guy","Barlow Condensed","Eagle Lake","Hanalei","Kumar One","Italiana","Short Stack","Salsa","Amarante","Antic Slab","Fugaz One","Federo","Miltonian","Loved by the King","Princess Sofia","Bitter","Atma","Molengo","Lusitana","Fredericka the Great","Brawler","Almendra Display","Lemonada","Wendy One","Nixie One","Sarina","PT Sans Caption","Timmana","Elsie Swash Caps","Martel","The Girl Next Door","Karla","Architects Daughter","Unica One","Cherry Swash","Gudea","Rosario","Montserrat Alternates","Stoke","Strait","Aladin","Oranienbaum","Racing Sans One","Athiti","Actor","Expletus Sans","Imprima","Maitree","Cormorant Infant","Parisienne","Erica One","Hammersmith One","Allerta Stencil","Maiden Orange","Permanent Marker","Domine","Medula One","Noto Serif","Nokora","Josefin Sans","Pontano Sans","Bevan","Fredoka One","Happy Monkey","Gloria Hallelujah","Ubuntu Mono","Francois One","Bad Script","Emilys Candy","Kristi","Monoton","Akronim","Dosis","Tienne","Puritan","Petrona","Marcellus SC","Rajdhani","Abhaya Libre","Spectral","Sree Krushnadevaraya","Bahiana","Ubuntu Condensed","Fanwood Text","Just Another Hand","Goudy Bookletter 1911","Ropa Sans","Alegreya SC","Port Lligat Slab","Mrs Saint Delafield","Nova Oval","Arimo","Righteous","Allerta","PT Serif","Headland One","Cedarville Cursive","Asap","Fresca","Hind Guntur","Sintony","Stint Ultra Expanded","Playfair Display SC","Linden Hill","Varela Round","Encode Sans Semi Condensed","Lovers Quarrel","Poiret One","Piedra","Purple Purse","Libre Franklin","Chela One","Fasthand","Paprika","Bayon","Asul","ABeeZee","Uncial Antiqua","Creepster","Kanit","Slabo 13px","Codystar","Source Sans Pro","Numans","Amethysta","Antic Didone","Montaga","Shojumaru","Knewave","Oxygen","Enriqueta","Merienda One","Ramabhadra","Peddana","Ribeye","Almendra","Geostar Fill","Ribeye Marrow","Galada","Inder","Bilbo Swash Caps","Marcellus","Bokor","Fondamento","Kreon","Hind","Reem Kufi","Roboto Slab","Signika Negative","Maven Pro","Metal","Capriola","Josefin Slab","Neucha","Asap Condensed","Share Tech Mono","Chenla","Rancho","Mystery Quest","Magra","Leckerli One","Scheherazade","Didact Gothic","Playfair Display","Original Surfer","Yanone Kaffeesatz","Sue Ellen Francisco","Jim Nightshade","Baumans","Moulpali","Shadows Into Light Two","Arya","Russo One","Norican","Saira Semi Condensed","IM Fell Great Primer","Shanti","Montserrat","Average Sans","Dancing Script","Kameron","Alice","Ranga","Freckle Face","Alfa Slab One","Revalia","Walter Turncoat","Tulpen One","Unlock","Homenaje","Quattrocento Sans","MedievalSharp","Combo","Six Caps","Flamenco","Herr Von Muellerhoff","Cabin Condensed","Rye","Roboto Condensed","Amaranth","Doppio One","Habibi","Stardos Stencil","Caudex","Modak","News Cycle","PT Sans Narrow","Zilla Slab Highlight","Ruslan Display","Sofia","Open Sans","PT Mono","Trochut","Yatra One","Ruda","Nova Round","Handlee","Lakki Reddy","Bubbler One","Merriweather Sans","Raleway","Glass Antiqua","Lancelot","Quando","Dawning of a New Day","Days One","Hanuman","Questrial","Slackey","Rammetto One","Crimson Text","Duru Sans","Junge","IM Fell DW Pica","Karma","Annie Use Your Telescope","Secular One","Crafty Girls","Squada One","Black Ops One","Stalemate","Lato","Stint Ultra Condensed","Alike Angular","PT Sans","Patrick Hand SC","Old Standard TT","Alegreya","Passero One","Pattaya","Cutive Mono","Sail","Kotta One","Waiting for the Sunrise","Arbutus Slab","Nova Script","Mr Bedfort","Sevillana","Sorts Mill Goudy","Pathway Gothic One","Yellowtail","PT Serif Caption","Quintessential","Armata","Amiri","Michroma","Margarine","Artifika","Cormorant","La Belle Aurore","Calligraffitti","Vampiro One","Rokkitt","Merienda","Cairo","Rambla","Spicy Rice","Rochester","Pinyon Script","Oldenburg","Sarpanch","Niconne","Fira Mono","Alike","Koulen","Elsie","Cabin","Cuprum","Julee","Galindo","Kdam Thmor","Anonymous Pro","Coda Caption","Unkempt","Vibur","Henny Penny","Sahitya","Alegreya Sans SC","Peralta","Wire One","Keania One","BenchNine","Work Sans","Playball","Bungee Inline","Monda","Tenor Sans","Ubuntu","Amita","Lora","Pirata One","Vidaloka","Arapey","Belleza","Bungee Outline","Abel","Merriweather","Marvel","Coda","Snippet","Nova Square","Fjalla One","Carrois Gothic","Oswald","Clicker Script","Play","Miss Fajardose","Press Start 2P","Mrs Sheppards","Mallanna","Averia Gruesa Libre","Irish Grover","Bigelow Rules","Warnes","Text Me One","Delius Unicase","Halant","Bree Serif","Cardo","Quattrocento","Tauri","Rationale","Pacifico","Dynalight","Open Sans Condensed","Suranna","Yesteryear","Teko","IM Fell Double Pica SC","Boogaloo","Monsieur La Doulaise","Baloo Paaji","Ruthie","Cormorant SC","Mukta Vaani","Cookie","Vast Shadow","Yeseva One","Asar","Assistant","Lobster Two","Plaster","Istok Web","Khand","Trade Winds","IM Fell French Canon","Alegreya Sans","Prata","Crushed","Vollkorn","Arvo","Advent Pro","Varela","Rouge Script","Damion","Covered By Your Grace","Life Savers","Ewert","Aldrich","Nova Slim","Prociono","Romanesco","Sanchez","BioRhyme","Tenali Ramakrishna","Lily Script One","Buda","Averia Serif Libre","Viga","Preahvihear","Miltonian Tattoo","Bungee Shade","Chivo","Scope One","Heebo","Amatic SC","Trykker","GFS Didot","Mandali","Reenie Beanie","Sniglet","Source Serif Pro","Overlock","Carrois Gothic SC","Quantico","Quicksand","Redressed","Syncopate","Gorditas","Sansita","NTR","Patrick Hand","Passion One","Libre Barcode 39 Extended Text","Khmer","Antic","Baloo","Exo","Aguafina Script","Chonburi","Electrolize","Muli","Catamaran","Rhodium Libre","Ultra","Londrina Solid","Cabin Sketch","Mouse Memoirs","Rum Raisin","Corben","Nunito","Siemreap","Overlock SC","Baloo Bhaijaan","Averia Sans Libre","Mogra","Radley","Cinzel Decorative","Mukta","Coiny","Yantramanav","Faustina","Faster One","New Rocker","Alef","Fenix","League Script","Trirong","Gabriela","Fascinate","Diplomata","Chicle","Kadwa","Bowlby One SC","Roboto","Balthazar","Chathura","Metamorphous","Hind Siliguri","Monofett","Hind Vadodara","Amiko","Inknut Antiqua","Convergence","Frank Ruhl Libre","Meie Script","Crete Round","Libre Barcode 39 Text","Baloo Tammudu","Iceland","Mada","Archivo Black","Chau Philomene One","Julius Sans One","Devonshire","Shadows Into Light","Great Vibes","Denk One","Pragati Narrow","Londrina Outline","Krona One","Share","Oleo Script Swash Caps","Chelsea Market","Berkshire Swash","Euphoria Script","Slabo 27px","Caveat","Unna","Pavanam","Adamina","Rufina","Milonga","Grand Hotel","Baloo Thambi","Vollkorn SC","Inika","Della Respira","Germania One","Overpass","Sarala","Holtwood One SC","Patua One","Cambay","Candal","Vesper Libre","IM Fell Great Primer SC","Odor Mean Chey","Changa","Saira Extra Condensed","Coustard","Frijole","Cantata One","Ramaraja","Ovo","Stalinist One","Dr Sugiyama","Concert One","Sirin Stencil","Montserrat Subrayada","Baloo Bhaina","UnifrakturCook","Average","Prosto One","Cantora One","Snowburst One","Jaldi","Contrail One","Rozha One","Limelight","Mukta Malar","Mountains of Christmas","Lilita One","Spectral SC","Courgette","Lalezar","Bellefair","Sumana","Pangolin","Spirax","Bungee","Itim","Mukta Mahee","Encode Sans Expanded","Khula"]}}
1
+ {"items":{"ABeeZee":{"family":"ABeeZee","category":"sans-serif","variants":["italic","regular"]},"Abel":{"family":"Abel","category":"sans-serif","variants":["regular"]},"Abhaya Libre":{"family":"Abhaya Libre","category":"serif","variants":["500","600","700","800","regular"]},"Abril Fatface":{"family":"Abril Fatface","category":"display","variants":["regular"]},"Aclonica":{"family":"Aclonica","category":"sans-serif","variants":["regular"]},"Acme":{"family":"Acme","category":"sans-serif","variants":["regular"]},"Actor":{"family":"Actor","category":"sans-serif","variants":["regular"]},"Adamina":{"family":"Adamina","category":"serif","variants":["regular"]},"Advent Pro":{"family":"Advent Pro","category":"sans-serif","variants":["100","200","300","500","600","700","regular"]},"Aguafina Script":{"family":"Aguafina Script","category":"handwriting","variants":["regular"]},"Akronim":{"family":"Akronim","category":"display","variants":["regular"]},"Aladin":{"family":"Aladin","category":"handwriting","variants":["regular"]},"Aldrich":{"family":"Aldrich","category":"sans-serif","variants":["regular"]},"Alef":{"family":"Alef","category":"sans-serif","variants":["700","regular"]},"Alegreya":{"family":"Alegreya","category":"serif","variants":["500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya SC":{"family":"Alegreya SC","category":"serif","variants":["500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya Sans":{"family":"Alegreya Sans","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alegreya Sans SC":{"family":"Alegreya Sans SC","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Alex Brush":{"family":"Alex Brush","category":"handwriting","variants":["regular"]},"Alfa Slab One":{"family":"Alfa Slab One","category":"display","variants":["regular"]},"Alice":{"family":"Alice","category":"serif","variants":["regular"]},"Alike":{"family":"Alike","category":"serif","variants":["regular"]},"Alike Angular":{"family":"Alike Angular","category":"serif","variants":["regular"]},"Allan":{"family":"Allan","category":"display","variants":["700","regular"]},"Allerta":{"family":"Allerta","category":"sans-serif","variants":["regular"]},"Allerta Stencil":{"family":"Allerta Stencil","category":"sans-serif","variants":["regular"]},"Allura":{"family":"Allura","category":"handwriting","variants":["regular"]},"Almendra":{"family":"Almendra","category":"serif","variants":["700","700italic","italic","regular"]},"Almendra Display":{"family":"Almendra Display","category":"display","variants":["regular"]},"Almendra SC":{"family":"Almendra SC","category":"serif","variants":["regular"]},"Amarante":{"family":"Amarante","category":"display","variants":["regular"]},"Amaranth":{"family":"Amaranth","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Amatic SC":{"family":"Amatic SC","category":"handwriting","variants":["700","regular"]},"Amethysta":{"family":"Amethysta","category":"serif","variants":["regular"]},"Amiko":{"family":"Amiko","category":"sans-serif","variants":["600","700","regular"]},"Amiri":{"family":"Amiri","category":"serif","variants":["700","700italic","italic","regular"]},"Amita":{"family":"Amita","category":"handwriting","variants":["700","regular"]},"Anaheim":{"family":"Anaheim","category":"sans-serif","variants":["regular"]},"Andada":{"family":"Andada","category":"serif","variants":["regular"]},"Andika":{"family":"Andika","category":"sans-serif","variants":["regular"]},"Angkor":{"family":"Angkor","category":"display","variants":["regular"]},"Annie Use Your Telescope":{"family":"Annie Use Your Telescope","category":"handwriting","variants":["regular"]},"Anonymous Pro":{"family":"Anonymous Pro","category":"monospace","variants":["700","700italic","italic","regular"]},"Antic":{"family":"Antic","category":"sans-serif","variants":["regular"]},"Antic Didone":{"family":"Antic Didone","category":"serif","variants":["regular"]},"Antic Slab":{"family":"Antic Slab","category":"serif","variants":["regular"]},"Anton":{"family":"Anton","category":"sans-serif","variants":["regular"]},"Arapey":{"family":"Arapey","category":"serif","variants":["italic","regular"]},"Arbutus":{"family":"Arbutus","category":"display","variants":["regular"]},"Arbutus Slab":{"family":"Arbutus Slab","category":"serif","variants":["regular"]},"Architects Daughter":{"family":"Architects Daughter","category":"handwriting","variants":["regular"]},"Archivo":{"family":"Archivo","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Archivo Black":{"family":"Archivo Black","category":"sans-serif","variants":["regular"]},"Archivo Narrow":{"family":"Archivo Narrow","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Aref Ruqaa":{"family":"Aref Ruqaa","category":"serif","variants":["700","regular"]},"Arima Madurai":{"family":"Arima Madurai","category":"display","variants":["100","200","300","500","700","800","900","regular"]},"Arimo":{"family":"Arimo","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Arizonia":{"family":"Arizonia","category":"handwriting","variants":["regular"]},"Armata":{"family":"Armata","category":"sans-serif","variants":["regular"]},"Arsenal":{"family":"Arsenal","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Artifika":{"family":"Artifika","category":"serif","variants":["regular"]},"Arvo":{"family":"Arvo","category":"serif","variants":["700","700italic","italic","regular"]},"Arya":{"family":"Arya","category":"sans-serif","variants":["700","regular"]},"Asap":{"family":"Asap","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Asap Condensed":{"family":"Asap Condensed","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Asar":{"family":"Asar","category":"serif","variants":["regular"]},"Asset":{"family":"Asset","category":"display","variants":["regular"]},"Assistant":{"family":"Assistant","category":"sans-serif","variants":["200","300","600","700","800","regular"]},"Astloch":{"family":"Astloch","category":"display","variants":["700","regular"]},"Asul":{"family":"Asul","category":"sans-serif","variants":["700","regular"]},"Athiti":{"family":"Athiti","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Atma":{"family":"Atma","category":"display","variants":["300","500","600","700","regular"]},"Atomic Age":{"family":"Atomic Age","category":"display","variants":["regular"]},"Aubrey":{"family":"Aubrey","category":"display","variants":["regular"]},"Audiowide":{"family":"Audiowide","category":"display","variants":["regular"]},"Autour One":{"family":"Autour One","category":"display","variants":["regular"]},"Average":{"family":"Average","category":"serif","variants":["regular"]},"Average Sans":{"family":"Average Sans","category":"sans-serif","variants":["regular"]},"Averia Gruesa Libre":{"family":"Averia Gruesa Libre","category":"display","variants":["regular"]},"Averia Libre":{"family":"Averia Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Averia Sans Libre":{"family":"Averia Sans Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Averia Serif Libre":{"family":"Averia Serif Libre","category":"display","variants":["300","300italic","700","700italic","italic","regular"]},"Bad Script":{"family":"Bad Script","category":"handwriting","variants":["regular"]},"Bahiana":{"family":"Bahiana","category":"display","variants":["regular"]},"Baloo":{"family":"Baloo","category":"display","variants":["regular"]},"Baloo Bhai":{"family":"Baloo Bhai","category":"display","variants":["regular"]},"Baloo Bhaijaan":{"family":"Baloo Bhaijaan","category":"display","variants":["regular"]},"Baloo Bhaina":{"family":"Baloo Bhaina","category":"display","variants":["regular"]},"Baloo Chettan":{"family":"Baloo Chettan","category":"display","variants":["regular"]},"Baloo Da":{"family":"Baloo Da","category":"display","variants":["regular"]},"Baloo Paaji":{"family":"Baloo Paaji","category":"display","variants":["regular"]},"Baloo Tamma":{"family":"Baloo Tamma","category":"display","variants":["regular"]},"Baloo Tammudu":{"family":"Baloo Tammudu","category":"display","variants":["regular"]},"Baloo Thambi":{"family":"Baloo Thambi","category":"display","variants":["regular"]},"Balthazar":{"family":"Balthazar","category":"serif","variants":["regular"]},"Bangers":{"family":"Bangers","category":"display","variants":["regular"]},"Barlow":{"family":"Barlow","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barlow Condensed":{"family":"Barlow Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barlow Semi Condensed":{"family":"Barlow Semi Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Barrio":{"family":"Barrio","category":"display","variants":["regular"]},"Basic":{"family":"Basic","category":"sans-serif","variants":["regular"]},"Battambang":{"family":"Battambang","category":"display","variants":["700","regular"]},"Baumans":{"family":"Baumans","category":"display","variants":["regular"]},"Bayon":{"family":"Bayon","category":"display","variants":["regular"]},"Belgrano":{"family":"Belgrano","category":"serif","variants":["regular"]},"Bellefair":{"family":"Bellefair","category":"serif","variants":["regular"]},"Belleza":{"family":"Belleza","category":"sans-serif","variants":["regular"]},"BenchNine":{"family":"BenchNine","category":"sans-serif","variants":["300","700","regular"]},"Bentham":{"family":"Bentham","category":"serif","variants":["regular"]},"Berkshire Swash":{"family":"Berkshire Swash","category":"handwriting","variants":["regular"]},"Bevan":{"family":"Bevan","category":"display","variants":["regular"]},"Bigelow Rules":{"family":"Bigelow Rules","category":"display","variants":["regular"]},"Bigshot One":{"family":"Bigshot One","category":"display","variants":["regular"]},"Bilbo":{"family":"Bilbo","category":"handwriting","variants":["regular"]},"Bilbo Swash Caps":{"family":"Bilbo Swash Caps","category":"handwriting","variants":["regular"]},"BioRhyme":{"family":"BioRhyme","category":"serif","variants":["200","300","700","800","regular"]},"BioRhyme Expanded":{"family":"BioRhyme Expanded","category":"serif","variants":["200","300","700","800","regular"]},"Biryani":{"family":"Biryani","category":"sans-serif","variants":["200","300","600","700","800","900","regular"]},"Bitter":{"family":"Bitter","category":"serif","variants":["700","italic","regular"]},"Black And White Picture":{"family":"Black And White Picture","category":"sans-serif","variants":["regular"]},"Black Han Sans":{"family":"Black Han Sans","category":"sans-serif","variants":["regular"]},"Black Ops One":{"family":"Black Ops One","category":"display","variants":["regular"]},"Bokor":{"family":"Bokor","category":"display","variants":["regular"]},"Bonbon":{"family":"Bonbon","category":"handwriting","variants":["regular"]},"Boogaloo":{"family":"Boogaloo","category":"display","variants":["regular"]},"Bowlby One":{"family":"Bowlby One","category":"display","variants":["regular"]},"Bowlby One SC":{"family":"Bowlby One SC","category":"display","variants":["regular"]},"Brawler":{"family":"Brawler","category":"serif","variants":["regular"]},"Bree Serif":{"family":"Bree Serif","category":"serif","variants":["regular"]},"Bubblegum Sans":{"family":"Bubblegum Sans","category":"display","variants":["regular"]},"Bubbler One":{"family":"Bubbler One","category":"sans-serif","variants":["regular"]},"Buda":{"family":"Buda","category":"display","variants":["300"]},"Buenard":{"family":"Buenard","category":"serif","variants":["700","regular"]},"Bungee":{"family":"Bungee","category":"display","variants":["regular"]},"Bungee Hairline":{"family":"Bungee Hairline","category":"display","variants":["regular"]},"Bungee Inline":{"family":"Bungee Inline","category":"display","variants":["regular"]},"Bungee Outline":{"family":"Bungee Outline","category":"display","variants":["regular"]},"Bungee Shade":{"family":"Bungee Shade","category":"display","variants":["regular"]},"Butcherman":{"family":"Butcherman","category":"display","variants":["regular"]},"Butterfly Kids":{"family":"Butterfly Kids","category":"handwriting","variants":["regular"]},"Cabin":{"family":"Cabin","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Cabin Condensed":{"family":"Cabin Condensed","category":"sans-serif","variants":["500","600","700","regular"]},"Cabin Sketch":{"family":"Cabin Sketch","category":"display","variants":["700","regular"]},"Caesar Dressing":{"family":"Caesar Dressing","category":"display","variants":["regular"]},"Cagliostro":{"family":"Cagliostro","category":"sans-serif","variants":["regular"]},"Cairo":{"family":"Cairo","category":"sans-serif","variants":["200","300","600","700","900","regular"]},"Calligraffitti":{"family":"Calligraffitti","category":"handwriting","variants":["regular"]},"Cambay":{"family":"Cambay","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cambo":{"family":"Cambo","category":"serif","variants":["regular"]},"Candal":{"family":"Candal","category":"sans-serif","variants":["regular"]},"Cantarell":{"family":"Cantarell","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cantata One":{"family":"Cantata One","category":"serif","variants":["regular"]},"Cantora One":{"family":"Cantora One","category":"sans-serif","variants":["regular"]},"Capriola":{"family":"Capriola","category":"sans-serif","variants":["regular"]},"Cardo":{"family":"Cardo","category":"serif","variants":["700","italic","regular"]},"Carme":{"family":"Carme","category":"sans-serif","variants":["regular"]},"Carrois Gothic":{"family":"Carrois Gothic","category":"sans-serif","variants":["regular"]},"Carrois Gothic SC":{"family":"Carrois Gothic SC","category":"sans-serif","variants":["regular"]},"Carter One":{"family":"Carter One","category":"display","variants":["regular"]},"Catamaran":{"family":"Catamaran","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Caudex":{"family":"Caudex","category":"serif","variants":["700","700italic","italic","regular"]},"Caveat":{"family":"Caveat","category":"handwriting","variants":["700","regular"]},"Caveat Brush":{"family":"Caveat Brush","category":"handwriting","variants":["regular"]},"Cedarville Cursive":{"family":"Cedarville Cursive","category":"handwriting","variants":["regular"]},"Ceviche One":{"family":"Ceviche One","category":"display","variants":["regular"]},"Changa":{"family":"Changa","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Changa One":{"family":"Changa One","category":"display","variants":["italic","regular"]},"Chango":{"family":"Chango","category":"display","variants":["regular"]},"Chathura":{"family":"Chathura","category":"sans-serif","variants":["100","300","700","800","regular"]},"Chau Philomene One":{"family":"Chau Philomene One","category":"sans-serif","variants":["italic","regular"]},"Chela One":{"family":"Chela One","category":"display","variants":["regular"]},"Chelsea Market":{"family":"Chelsea Market","category":"display","variants":["regular"]},"Chenla":{"family":"Chenla","category":"display","variants":["regular"]},"Cherry Cream Soda":{"family":"Cherry Cream Soda","category":"display","variants":["regular"]},"Cherry Swash":{"family":"Cherry Swash","category":"display","variants":["700","regular"]},"Chewy":{"family":"Chewy","category":"display","variants":["regular"]},"Chicle":{"family":"Chicle","category":"display","variants":["regular"]},"Chivo":{"family":"Chivo","category":"sans-serif","variants":["300","300italic","700","700italic","900","900italic","italic","regular"]},"Chonburi":{"family":"Chonburi","category":"display","variants":["regular"]},"Cinzel":{"family":"Cinzel","category":"serif","variants":["700","900","regular"]},"Cinzel Decorative":{"family":"Cinzel Decorative","category":"display","variants":["700","900","regular"]},"Clicker Script":{"family":"Clicker Script","category":"handwriting","variants":["regular"]},"Coda":{"family":"Coda","category":"display","variants":["800","regular"]},"Coda Caption":{"family":"Coda Caption","category":"sans-serif","variants":["800"]},"Codystar":{"family":"Codystar","category":"display","variants":["300","regular"]},"Coiny":{"family":"Coiny","category":"display","variants":["regular"]},"Combo":{"family":"Combo","category":"display","variants":["regular"]},"Comfortaa":{"family":"Comfortaa","category":"display","variants":["300","700","regular"]},"Coming Soon":{"family":"Coming Soon","category":"handwriting","variants":["regular"]},"Concert One":{"family":"Concert One","category":"display","variants":["regular"]},"Condiment":{"family":"Condiment","category":"handwriting","variants":["regular"]},"Content":{"family":"Content","category":"display","variants":["700","regular"]},"Contrail One":{"family":"Contrail One","category":"display","variants":["regular"]},"Convergence":{"family":"Convergence","category":"sans-serif","variants":["regular"]},"Cookie":{"family":"Cookie","category":"handwriting","variants":["regular"]},"Copse":{"family":"Copse","category":"serif","variants":["regular"]},"Corben":{"family":"Corben","category":"display","variants":["700","regular"]},"Cormorant":{"family":"Cormorant","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant Garamond":{"family":"Cormorant Garamond","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant Infant":{"family":"Cormorant Infant","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Cormorant SC":{"family":"Cormorant SC","category":"serif","variants":["300","500","600","700","regular"]},"Cormorant Unicase":{"family":"Cormorant Unicase","category":"serif","variants":["300","500","600","700","regular"]},"Cormorant Upright":{"family":"Cormorant Upright","category":"serif","variants":["300","500","600","700","regular"]},"Courgette":{"family":"Courgette","category":"handwriting","variants":["regular"]},"Cousine":{"family":"Cousine","category":"monospace","variants":["700","700italic","italic","regular"]},"Coustard":{"family":"Coustard","category":"serif","variants":["900","regular"]},"Covered By Your Grace":{"family":"Covered By Your Grace","category":"handwriting","variants":["regular"]},"Crafty Girls":{"family":"Crafty Girls","category":"handwriting","variants":["regular"]},"Creepster":{"family":"Creepster","category":"display","variants":["regular"]},"Crete Round":{"family":"Crete Round","category":"serif","variants":["italic","regular"]},"Crimson Text":{"family":"Crimson Text","category":"serif","variants":["600","600italic","700","700italic","italic","regular"]},"Croissant One":{"family":"Croissant One","category":"display","variants":["regular"]},"Crushed":{"family":"Crushed","category":"display","variants":["regular"]},"Cuprum":{"family":"Cuprum","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Cute Font":{"family":"Cute Font","category":"display","variants":["regular"]},"Cutive":{"family":"Cutive","category":"serif","variants":["regular"]},"Cutive Mono":{"family":"Cutive Mono","category":"monospace","variants":["regular"]},"Damion":{"family":"Damion","category":"handwriting","variants":["regular"]},"Dancing Script":{"family":"Dancing Script","category":"handwriting","variants":["700","regular"]},"Dangrek":{"family":"Dangrek","category":"display","variants":["regular"]},"David Libre":{"family":"David Libre","category":"serif","variants":["500","700","regular"]},"Dawning of a New Day":{"family":"Dawning of a New Day","category":"handwriting","variants":["regular"]},"Days One":{"family":"Days One","category":"sans-serif","variants":["regular"]},"Dekko":{"family":"Dekko","category":"handwriting","variants":["regular"]},"Delius":{"family":"Delius","category":"handwriting","variants":["regular"]},"Delius Swash Caps":{"family":"Delius Swash Caps","category":"handwriting","variants":["regular"]},"Delius Unicase":{"family":"Delius Unicase","category":"handwriting","variants":["700","regular"]},"Della Respira":{"family":"Della Respira","category":"serif","variants":["regular"]},"Denk One":{"family":"Denk One","category":"sans-serif","variants":["regular"]},"Devonshire":{"family":"Devonshire","category":"handwriting","variants":["regular"]},"Dhurjati":{"family":"Dhurjati","category":"sans-serif","variants":["regular"]},"Didact Gothic":{"family":"Didact Gothic","category":"sans-serif","variants":["regular"]},"Diplomata":{"family":"Diplomata","category":"display","variants":["regular"]},"Diplomata SC":{"family":"Diplomata SC","category":"display","variants":["regular"]},"Do Hyeon":{"family":"Do Hyeon","category":"sans-serif","variants":["regular"]},"Dokdo":{"family":"Dokdo","category":"handwriting","variants":["regular"]},"Domine":{"family":"Domine","category":"serif","variants":["700","regular"]},"Donegal One":{"family":"Donegal One","category":"serif","variants":["regular"]},"Doppio One":{"family":"Doppio One","category":"sans-serif","variants":["regular"]},"Dorsa":{"family":"Dorsa","category":"sans-serif","variants":["regular"]},"Dosis":{"family":"Dosis","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Dr Sugiyama":{"family":"Dr Sugiyama","category":"handwriting","variants":["regular"]},"Duru Sans":{"family":"Duru Sans","category":"sans-serif","variants":["regular"]},"Dynalight":{"family":"Dynalight","category":"display","variants":["regular"]},"EB Garamond":{"family":"EB Garamond","category":"serif","variants":["500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Eagle Lake":{"family":"Eagle Lake","category":"handwriting","variants":["regular"]},"East Sea Dokdo":{"family":"East Sea Dokdo","category":"handwriting","variants":["regular"]},"Eater":{"family":"Eater","category":"display","variants":["regular"]},"Economica":{"family":"Economica","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Eczar":{"family":"Eczar","category":"serif","variants":["500","600","700","800","regular"]},"El Messiri":{"family":"El Messiri","category":"sans-serif","variants":["500","600","700","regular"]},"Electrolize":{"family":"Electrolize","category":"sans-serif","variants":["regular"]},"Elsie":{"family":"Elsie","category":"display","variants":["900","regular"]},"Elsie Swash Caps":{"family":"Elsie Swash Caps","category":"display","variants":["900","regular"]},"Emblema One":{"family":"Emblema One","category":"display","variants":["regular"]},"Emilys Candy":{"family":"Emilys Candy","category":"display","variants":["regular"]},"Encode Sans":{"family":"Encode Sans","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Condensed":{"family":"Encode Sans Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Expanded":{"family":"Encode Sans Expanded","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Semi Condensed":{"family":"Encode Sans Semi Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Encode Sans Semi Expanded":{"family":"Encode Sans Semi Expanded","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Engagement":{"family":"Engagement","category":"handwriting","variants":["regular"]},"Englebert":{"family":"Englebert","category":"sans-serif","variants":["regular"]},"Enriqueta":{"family":"Enriqueta","category":"serif","variants":["700","regular"]},"Erica One":{"family":"Erica One","category":"display","variants":["regular"]},"Esteban":{"family":"Esteban","category":"serif","variants":["regular"]},"Euphoria Script":{"family":"Euphoria Script","category":"handwriting","variants":["regular"]},"Ewert":{"family":"Ewert","category":"display","variants":["regular"]},"Exo":{"family":"Exo","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Exo 2":{"family":"Exo 2","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Expletus Sans":{"family":"Expletus Sans","category":"display","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Fanwood Text":{"family":"Fanwood Text","category":"serif","variants":["italic","regular"]},"Farsan":{"family":"Farsan","category":"display","variants":["regular"]},"Fascinate":{"family":"Fascinate","category":"display","variants":["regular"]},"Fascinate Inline":{"family":"Fascinate Inline","category":"display","variants":["regular"]},"Faster One":{"family":"Faster One","category":"display","variants":["regular"]},"Fasthand":{"family":"Fasthand","category":"serif","variants":["regular"]},"Fauna One":{"family":"Fauna One","category":"serif","variants":["regular"]},"Faustina":{"family":"Faustina","category":"serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Federant":{"family":"Federant","category":"display","variants":["regular"]},"Federo":{"family":"Federo","category":"sans-serif","variants":["regular"]},"Felipa":{"family":"Felipa","category":"handwriting","variants":["regular"]},"Fenix":{"family":"Fenix","category":"serif","variants":["regular"]},"Finger Paint":{"family":"Finger Paint","category":"display","variants":["regular"]},"Fira Mono":{"family":"Fira Mono","category":"monospace","variants":["500","700","regular"]},"Fira Sans":{"family":"Fira Sans","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fira Sans Condensed":{"family":"Fira Sans Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fira Sans Extra Condensed":{"family":"Fira Sans Extra Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Fjalla One":{"family":"Fjalla One","category":"sans-serif","variants":["regular"]},"Fjord One":{"family":"Fjord One","category":"serif","variants":["regular"]},"Flamenco":{"family":"Flamenco","category":"display","variants":["300","regular"]},"Flavors":{"family":"Flavors","category":"display","variants":["regular"]},"Fondamento":{"family":"Fondamento","category":"handwriting","variants":["italic","regular"]},"Fontdiner Swanky":{"family":"Fontdiner Swanky","category":"display","variants":["regular"]},"Forum":{"family":"Forum","category":"display","variants":["regular"]},"Francois One":{"family":"Francois One","category":"sans-serif","variants":["regular"]},"Frank Ruhl Libre":{"family":"Frank Ruhl Libre","category":"serif","variants":["300","500","700","900","regular"]},"Freckle Face":{"family":"Freckle Face","category":"display","variants":["regular"]},"Fredericka the Great":{"family":"Fredericka the Great","category":"display","variants":["regular"]},"Fredoka One":{"family":"Fredoka One","category":"display","variants":["regular"]},"Freehand":{"family":"Freehand","category":"display","variants":["regular"]},"Fresca":{"family":"Fresca","category":"sans-serif","variants":["regular"]},"Frijole":{"family":"Frijole","category":"display","variants":["regular"]},"Fruktur":{"family":"Fruktur","category":"display","variants":["regular"]},"Fugaz One":{"family":"Fugaz One","category":"display","variants":["regular"]},"GFS Didot":{"family":"GFS Didot","category":"serif","variants":["regular"]},"GFS Neohellenic":{"family":"GFS Neohellenic","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Gabriela":{"family":"Gabriela","category":"serif","variants":["regular"]},"Gaegu":{"family":"Gaegu","category":"handwriting","variants":["300","700","regular"]},"Gafata":{"family":"Gafata","category":"sans-serif","variants":["regular"]},"Galada":{"family":"Galada","category":"display","variants":["regular"]},"Galdeano":{"family":"Galdeano","category":"sans-serif","variants":["regular"]},"Galindo":{"family":"Galindo","category":"display","variants":["regular"]},"Gamja Flower":{"family":"Gamja Flower","category":"handwriting","variants":["regular"]},"Gentium Basic":{"family":"Gentium Basic","category":"serif","variants":["700","700italic","italic","regular"]},"Gentium Book Basic":{"family":"Gentium Book Basic","category":"serif","variants":["700","700italic","italic","regular"]},"Geo":{"family":"Geo","category":"sans-serif","variants":["italic","regular"]},"Geostar":{"family":"Geostar","category":"display","variants":["regular"]},"Geostar Fill":{"family":"Geostar Fill","category":"display","variants":["regular"]},"Germania One":{"family":"Germania One","category":"display","variants":["regular"]},"Gidugu":{"family":"Gidugu","category":"sans-serif","variants":["regular"]},"Gilda Display":{"family":"Gilda Display","category":"serif","variants":["regular"]},"Give You Glory":{"family":"Give You Glory","category":"handwriting","variants":["regular"]},"Glass Antiqua":{"family":"Glass Antiqua","category":"display","variants":["regular"]},"Glegoo":{"family":"Glegoo","category":"serif","variants":["700","regular"]},"Gloria Hallelujah":{"family":"Gloria Hallelujah","category":"handwriting","variants":["regular"]},"Goblin One":{"family":"Goblin One","category":"display","variants":["regular"]},"Gochi Hand":{"family":"Gochi Hand","category":"handwriting","variants":["regular"]},"Gorditas":{"family":"Gorditas","category":"display","variants":["700","regular"]},"Gothic A1":{"family":"Gothic A1","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Goudy Bookletter 1911":{"family":"Goudy Bookletter 1911","category":"serif","variants":["regular"]},"Graduate":{"family":"Graduate","category":"display","variants":["regular"]},"Grand Hotel":{"family":"Grand Hotel","category":"handwriting","variants":["regular"]},"Gravitas One":{"family":"Gravitas One","category":"display","variants":["regular"]},"Great Vibes":{"family":"Great Vibes","category":"handwriting","variants":["regular"]},"Griffy":{"family":"Griffy","category":"display","variants":["regular"]},"Gruppo":{"family":"Gruppo","category":"display","variants":["regular"]},"Gudea":{"family":"Gudea","category":"sans-serif","variants":["700","italic","regular"]},"Gugi":{"family":"Gugi","category":"display","variants":["regular"]},"Gurajada":{"family":"Gurajada","category":"serif","variants":["regular"]},"Habibi":{"family":"Habibi","category":"serif","variants":["regular"]},"Halant":{"family":"Halant","category":"serif","variants":["300","500","600","700","regular"]},"Hammersmith One":{"family":"Hammersmith One","category":"sans-serif","variants":["regular"]},"Hanalei":{"family":"Hanalei","category":"display","variants":["regular"]},"Hanalei Fill":{"family":"Hanalei Fill","category":"display","variants":["regular"]},"Handlee":{"family":"Handlee","category":"handwriting","variants":["regular"]},"Hanuman":{"family":"Hanuman","category":"serif","variants":["700","regular"]},"Happy Monkey":{"family":"Happy Monkey","category":"display","variants":["regular"]},"Harmattan":{"family":"Harmattan","category":"sans-serif","variants":["regular"]},"Headland One":{"family":"Headland One","category":"serif","variants":["regular"]},"Heebo":{"family":"Heebo","category":"sans-serif","variants":["100","300","500","700","800","900","regular"]},"Henny Penny":{"family":"Henny Penny","category":"display","variants":["regular"]},"Herr Von Muellerhoff":{"family":"Herr Von Muellerhoff","category":"handwriting","variants":["regular"]},"Hi Melody":{"family":"Hi Melody","category":"handwriting","variants":["regular"]},"Hind":{"family":"Hind","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Guntur":{"family":"Hind Guntur","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Madurai":{"family":"Hind Madurai","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Siliguri":{"family":"Hind Siliguri","category":"sans-serif","variants":["300","500","600","700","regular"]},"Hind Vadodara":{"family":"Hind Vadodara","category":"sans-serif","variants":["300","500","600","700","regular"]},"Holtwood One SC":{"family":"Holtwood One SC","category":"serif","variants":["regular"]},"Homemade Apple":{"family":"Homemade Apple","category":"handwriting","variants":["regular"]},"Homenaje":{"family":"Homenaje","category":"sans-serif","variants":["regular"]},"IBM Plex Mono":{"family":"IBM Plex Mono","category":"monospace","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"IBM Plex Sans":{"family":"IBM Plex Sans","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"IBM Plex Sans Condensed":{"family":"IBM Plex Sans Condensed","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"IBM Plex Serif":{"family":"IBM Plex Serif","category":"serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"IM Fell DW Pica":{"family":"IM Fell DW Pica","category":"serif","variants":["italic","regular"]},"IM Fell DW Pica SC":{"family":"IM Fell DW Pica SC","category":"serif","variants":["regular"]},"IM Fell Double Pica":{"family":"IM Fell Double Pica","category":"serif","variants":["italic","regular"]},"IM Fell Double Pica SC":{"family":"IM Fell Double Pica SC","category":"serif","variants":["regular"]},"IM Fell English":{"family":"IM Fell English","category":"serif","variants":["italic","regular"]},"IM Fell English SC":{"family":"IM Fell English SC","category":"serif","variants":["regular"]},"IM Fell French Canon":{"family":"IM Fell French Canon","category":"serif","variants":["italic","regular"]},"IM Fell French Canon SC":{"family":"IM Fell French Canon SC","category":"serif","variants":["regular"]},"IM Fell Great Primer":{"family":"IM Fell Great Primer","category":"serif","variants":["italic","regular"]},"IM Fell Great Primer SC":{"family":"IM Fell Great Primer SC","category":"serif","variants":["regular"]},"Iceberg":{"family":"Iceberg","category":"display","variants":["regular"]},"Iceland":{"family":"Iceland","category":"display","variants":["regular"]},"Imprima":{"family":"Imprima","category":"sans-serif","variants":["regular"]},"Inconsolata":{"family":"Inconsolata","category":"monospace","variants":["700","regular"]},"Inder":{"family":"Inder","category":"sans-serif","variants":["regular"]},"Indie Flower":{"family":"Indie Flower","category":"handwriting","variants":["regular"]},"Inika":{"family":"Inika","category":"serif","variants":["700","regular"]},"Inknut Antiqua":{"family":"Inknut Antiqua","category":"serif","variants":["300","500","600","700","800","900","regular"]},"Irish Grover":{"family":"Irish Grover","category":"display","variants":["regular"]},"Istok Web":{"family":"Istok Web","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Italiana":{"family":"Italiana","category":"serif","variants":["regular"]},"Italianno":{"family":"Italianno","category":"handwriting","variants":["regular"]},"Itim":{"family":"Itim","category":"handwriting","variants":["regular"]},"Jacques Francois":{"family":"Jacques Francois","category":"serif","variants":["regular"]},"Jacques Francois Shadow":{"family":"Jacques Francois Shadow","category":"display","variants":["regular"]},"Jaldi":{"family":"Jaldi","category":"sans-serif","variants":["700","regular"]},"Jim Nightshade":{"family":"Jim Nightshade","category":"handwriting","variants":["regular"]},"Jockey One":{"family":"Jockey One","category":"sans-serif","variants":["regular"]},"Jolly Lodger":{"family":"Jolly Lodger","category":"display","variants":["regular"]},"Jomhuria":{"family":"Jomhuria","category":"display","variants":["regular"]},"Josefin Sans":{"family":"Josefin Sans","category":"sans-serif","variants":["100","100italic","300","300italic","600","600italic","700","700italic","italic","regular"]},"Josefin Slab":{"family":"Josefin Slab","category":"serif","variants":["100","100italic","300","300italic","600","600italic","700","700italic","italic","regular"]},"Joti One":{"family":"Joti One","category":"display","variants":["regular"]},"Jua":{"family":"Jua","category":"sans-serif","variants":["regular"]},"Judson":{"family":"Judson","category":"serif","variants":["700","italic","regular"]},"Julee":{"family":"Julee","category":"handwriting","variants":["regular"]},"Julius Sans One":{"family":"Julius Sans One","category":"sans-serif","variants":["regular"]},"Junge":{"family":"Junge","category":"serif","variants":["regular"]},"Jura":{"family":"Jura","category":"sans-serif","variants":["300","500","600","700","regular"]},"Just Another Hand":{"family":"Just Another Hand","category":"handwriting","variants":["regular"]},"Just Me Again Down Here":{"family":"Just Me Again Down Here","category":"handwriting","variants":["regular"]},"Kadwa":{"family":"Kadwa","category":"serif","variants":["700","regular"]},"Kalam":{"family":"Kalam","category":"handwriting","variants":["300","700","regular"]},"Kameron":{"family":"Kameron","category":"serif","variants":["700","regular"]},"Kanit":{"family":"Kanit","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Kantumruy":{"family":"Kantumruy","category":"sans-serif","variants":["300","700","regular"]},"Karla":{"family":"Karla","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Karma":{"family":"Karma","category":"serif","variants":["300","500","600","700","regular"]},"Katibeh":{"family":"Katibeh","category":"display","variants":["regular"]},"Kaushan Script":{"family":"Kaushan Script","category":"handwriting","variants":["regular"]},"Kavivanar":{"family":"Kavivanar","category":"handwriting","variants":["regular"]},"Kavoon":{"family":"Kavoon","category":"display","variants":["regular"]},"Kdam Thmor":{"family":"Kdam Thmor","category":"display","variants":["regular"]},"Keania One":{"family":"Keania One","category":"display","variants":["regular"]},"Kelly Slab":{"family":"Kelly Slab","category":"display","variants":["regular"]},"Kenia":{"family":"Kenia","category":"display","variants":["regular"]},"Khand":{"family":"Khand","category":"sans-serif","variants":["300","500","600","700","regular"]},"Khmer":{"family":"Khmer","category":"display","variants":["regular"]},"Khula":{"family":"Khula","category":"sans-serif","variants":["300","600","700","800","regular"]},"Kirang Haerang":{"family":"Kirang Haerang","category":"display","variants":["regular"]},"Kite One":{"family":"Kite One","category":"sans-serif","variants":["regular"]},"Knewave":{"family":"Knewave","category":"display","variants":["regular"]},"Kotta One":{"family":"Kotta One","category":"serif","variants":["regular"]},"Koulen":{"family":"Koulen","category":"display","variants":["regular"]},"Kranky":{"family":"Kranky","category":"display","variants":["regular"]},"Kreon":{"family":"Kreon","category":"serif","variants":["300","700","regular"]},"Kristi":{"family":"Kristi","category":"handwriting","variants":["regular"]},"Krona One":{"family":"Krona One","category":"sans-serif","variants":["regular"]},"Kumar One":{"family":"Kumar One","category":"display","variants":["regular"]},"Kumar One Outline":{"family":"Kumar One Outline","category":"display","variants":["regular"]},"Kurale":{"family":"Kurale","category":"serif","variants":["regular"]},"La Belle Aurore":{"family":"La Belle Aurore","category":"handwriting","variants":["regular"]},"Laila":{"family":"Laila","category":"serif","variants":["300","500","600","700","regular"]},"Lakki Reddy":{"family":"Lakki Reddy","category":"handwriting","variants":["regular"]},"Lalezar":{"family":"Lalezar","category":"display","variants":["regular"]},"Lancelot":{"family":"Lancelot","category":"display","variants":["regular"]},"Lateef":{"family":"Lateef","category":"handwriting","variants":["regular"]},"Lato":{"family":"Lato","category":"sans-serif","variants":["100","100italic","300","300italic","700","700italic","900","900italic","italic","regular"]},"League Script":{"family":"League Script","category":"handwriting","variants":["regular"]},"Leckerli One":{"family":"Leckerli One","category":"handwriting","variants":["regular"]},"Ledger":{"family":"Ledger","category":"serif","variants":["regular"]},"Lekton":{"family":"Lekton","category":"sans-serif","variants":["700","italic","regular"]},"Lemon":{"family":"Lemon","category":"display","variants":["regular"]},"Lemonada":{"family":"Lemonada","category":"display","variants":["300","600","700","regular"]},"Libre Barcode 128":{"family":"Libre Barcode 128","category":"display","variants":["regular"]},"Libre Barcode 128 Text":{"family":"Libre Barcode 128 Text","category":"display","variants":["regular"]},"Libre Barcode 39":{"family":"Libre Barcode 39","category":"display","variants":["regular"]},"Libre Barcode 39 Extended":{"family":"Libre Barcode 39 Extended","category":"display","variants":["regular"]},"Libre Barcode 39 Extended Text":{"family":"Libre Barcode 39 Extended Text","category":"display","variants":["regular"]},"Libre Barcode 39 Text":{"family":"Libre Barcode 39 Text","category":"display","variants":["regular"]},"Libre Baskerville":{"family":"Libre Baskerville","category":"serif","variants":["700","italic","regular"]},"Libre Franklin":{"family":"Libre Franklin","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Life Savers":{"family":"Life Savers","category":"display","variants":["700","regular"]},"Lilita One":{"family":"Lilita One","category":"display","variants":["regular"]},"Lily Script One":{"family":"Lily Script One","category":"display","variants":["regular"]},"Limelight":{"family":"Limelight","category":"display","variants":["regular"]},"Linden Hill":{"family":"Linden Hill","category":"serif","variants":["italic","regular"]},"Lobster":{"family":"Lobster","category":"display","variants":["regular"]},"Lobster Two":{"family":"Lobster Two","category":"display","variants":["700","700italic","italic","regular"]},"Londrina Outline":{"family":"Londrina Outline","category":"display","variants":["regular"]},"Londrina Shadow":{"family":"Londrina Shadow","category":"display","variants":["regular"]},"Londrina Sketch":{"family":"Londrina Sketch","category":"display","variants":["regular"]},"Londrina Solid":{"family":"Londrina Solid","category":"display","variants":["100","300","900","regular"]},"Lora":{"family":"Lora","category":"serif","variants":["700","700italic","italic","regular"]},"Love Ya Like A Sister":{"family":"Love Ya Like A Sister","category":"display","variants":["regular"]},"Loved by the King":{"family":"Loved by the King","category":"handwriting","variants":["regular"]},"Lovers Quarrel":{"family":"Lovers Quarrel","category":"handwriting","variants":["regular"]},"Luckiest Guy":{"family":"Luckiest Guy","category":"display","variants":["regular"]},"Lusitana":{"family":"Lusitana","category":"serif","variants":["700","regular"]},"Lustria":{"family":"Lustria","category":"serif","variants":["regular"]},"Macondo":{"family":"Macondo","category":"display","variants":["regular"]},"Macondo Swash Caps":{"family":"Macondo Swash Caps","category":"display","variants":["regular"]},"Mada":{"family":"Mada","category":"sans-serif","variants":["200","300","500","600","700","900","regular"]},"Magra":{"family":"Magra","category":"sans-serif","variants":["700","regular"]},"Maiden Orange":{"family":"Maiden Orange","category":"display","variants":["regular"]},"Maitree":{"family":"Maitree","category":"serif","variants":["200","300","500","600","700","regular"]},"Mako":{"family":"Mako","category":"sans-serif","variants":["regular"]},"Mallanna":{"family":"Mallanna","category":"sans-serif","variants":["regular"]},"Mandali":{"family":"Mandali","category":"sans-serif","variants":["regular"]},"Manuale":{"family":"Manuale","category":"serif","variants":["500","500italic","600","600italic","700","700italic","italic","regular"]},"Marcellus":{"family":"Marcellus","category":"serif","variants":["regular"]},"Marcellus SC":{"family":"Marcellus SC","category":"serif","variants":["regular"]},"Marck Script":{"family":"Marck Script","category":"handwriting","variants":["regular"]},"Margarine":{"family":"Margarine","category":"display","variants":["regular"]},"Marko One":{"family":"Marko One","category":"serif","variants":["regular"]},"Marmelad":{"family":"Marmelad","category":"sans-serif","variants":["regular"]},"Martel":{"family":"Martel","category":"serif","variants":["200","300","600","700","800","900","regular"]},"Martel Sans":{"family":"Martel Sans","category":"sans-serif","variants":["200","300","600","700","800","900","regular"]},"Marvel":{"family":"Marvel","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Mate":{"family":"Mate","category":"serif","variants":["italic","regular"]},"Mate SC":{"family":"Mate SC","category":"serif","variants":["regular"]},"Maven Pro":{"family":"Maven Pro","category":"sans-serif","variants":["500","700","900","regular"]},"McLaren":{"family":"McLaren","category":"display","variants":["regular"]},"Meddon":{"family":"Meddon","category":"handwriting","variants":["regular"]},"MedievalSharp":{"family":"MedievalSharp","category":"display","variants":["regular"]},"Medula One":{"family":"Medula One","category":"display","variants":["regular"]},"Meera Inimai":{"family":"Meera Inimai","category":"sans-serif","variants":["regular"]},"Megrim":{"family":"Megrim","category":"display","variants":["regular"]},"Meie Script":{"family":"Meie Script","category":"handwriting","variants":["regular"]},"Merienda":{"family":"Merienda","category":"handwriting","variants":["700","regular"]},"Merienda One":{"family":"Merienda One","category":"handwriting","variants":["regular"]},"Merriweather":{"family":"Merriweather","category":"serif","variants":["300","300italic","700","700italic","900","900italic","italic","regular"]},"Merriweather Sans":{"family":"Merriweather Sans","category":"sans-serif","variants":["300","300italic","700","700italic","800","800italic","italic","regular"]},"Metal":{"family":"Metal","category":"display","variants":["regular"]},"Metal Mania":{"family":"Metal Mania","category":"display","variants":["regular"]},"Metamorphous":{"family":"Metamorphous","category":"display","variants":["regular"]},"Metrophobic":{"family":"Metrophobic","category":"sans-serif","variants":["regular"]},"Michroma":{"family":"Michroma","category":"sans-serif","variants":["regular"]},"Milonga":{"family":"Milonga","category":"display","variants":["regular"]},"Miltonian":{"family":"Miltonian","category":"display","variants":["regular"]},"Miltonian Tattoo":{"family":"Miltonian Tattoo","category":"display","variants":["regular"]},"Mina":{"family":"Mina","category":"sans-serif","variants":["700","regular"]},"Miniver":{"family":"Miniver","category":"display","variants":["regular"]},"Miriam Libre":{"family":"Miriam Libre","category":"sans-serif","variants":["700","regular"]},"Mirza":{"family":"Mirza","category":"display","variants":["500","600","700","regular"]},"Miss Fajardose":{"family":"Miss Fajardose","category":"handwriting","variants":["regular"]},"Mitr":{"family":"Mitr","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Modak":{"family":"Modak","category":"display","variants":["regular"]},"Modern Antiqua":{"family":"Modern Antiqua","category":"display","variants":["regular"]},"Mogra":{"family":"Mogra","category":"display","variants":["regular"]},"Molengo":{"family":"Molengo","category":"sans-serif","variants":["regular"]},"Molle":{"family":"Molle","category":"handwriting","variants":["italic"]},"Monda":{"family":"Monda","category":"sans-serif","variants":["700","regular"]},"Monofett":{"family":"Monofett","category":"display","variants":["regular"]},"Monoton":{"family":"Monoton","category":"display","variants":["regular"]},"Monsieur La Doulaise":{"family":"Monsieur La Doulaise","category":"handwriting","variants":["regular"]},"Montaga":{"family":"Montaga","category":"serif","variants":["regular"]},"Montez":{"family":"Montez","category":"handwriting","variants":["regular"]},"Montserrat":{"family":"Montserrat","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Montserrat Alternates":{"family":"Montserrat Alternates","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Montserrat Subrayada":{"family":"Montserrat Subrayada","category":"sans-serif","variants":["700","regular"]},"Moul":{"family":"Moul","category":"display","variants":["regular"]},"Moulpali":{"family":"Moulpali","category":"display","variants":["regular"]},"Mountains of Christmas":{"family":"Mountains of Christmas","category":"display","variants":["700","regular"]},"Mouse Memoirs":{"family":"Mouse Memoirs","category":"sans-serif","variants":["regular"]},"Mr Bedfort":{"family":"Mr Bedfort","category":"handwriting","variants":["regular"]},"Mr Dafoe":{"family":"Mr Dafoe","category":"handwriting","variants":["regular"]},"Mr De Haviland":{"family":"Mr De Haviland","category":"handwriting","variants":["regular"]},"Mrs Saint Delafield":{"family":"Mrs Saint Delafield","category":"handwriting","variants":["regular"]},"Mrs Sheppards":{"family":"Mrs Sheppards","category":"handwriting","variants":["regular"]},"Mukta":{"family":"Mukta","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Mahee":{"family":"Mukta Mahee","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Malar":{"family":"Mukta Malar","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Mukta Vaani":{"family":"Mukta Vaani","category":"sans-serif","variants":["200","300","500","600","700","800","regular"]},"Muli":{"family":"Muli","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Mystery Quest":{"family":"Mystery Quest","category":"display","variants":["regular"]},"NTR":{"family":"NTR","category":"sans-serif","variants":["regular"]},"Nanum Brush Script":{"family":"Nanum Brush Script","category":"handwriting","variants":["regular"]},"Nanum Gothic":{"family":"Nanum Gothic","category":"sans-serif","variants":["700","800","regular"]},"Nanum Gothic Coding":{"family":"Nanum Gothic Coding","category":"monospace","variants":["700","regular"]},"Nanum Myeongjo":{"family":"Nanum Myeongjo","category":"serif","variants":["700","800","regular"]},"Nanum Pen Script":{"family":"Nanum Pen Script","category":"handwriting","variants":["regular"]},"Neucha":{"family":"Neucha","category":"handwriting","variants":["regular"]},"Neuton":{"family":"Neuton","category":"serif","variants":["200","300","700","800","italic","regular"]},"New Rocker":{"family":"New Rocker","category":"display","variants":["regular"]},"News Cycle":{"family":"News Cycle","category":"sans-serif","variants":["700","regular"]},"Niconne":{"family":"Niconne","category":"handwriting","variants":["regular"]},"Nixie One":{"family":"Nixie One","category":"display","variants":["regular"]},"Nobile":{"family":"Nobile","category":"sans-serif","variants":["500","500italic","700","700italic","italic","regular"]},"Nokora":{"family":"Nokora","category":"serif","variants":["700","regular"]},"Norican":{"family":"Norican","category":"handwriting","variants":["regular"]},"Nosifer":{"family":"Nosifer","category":"display","variants":["regular"]},"Nothing You Could Do":{"family":"Nothing You Could Do","category":"handwriting","variants":["regular"]},"Noticia Text":{"family":"Noticia Text","category":"serif","variants":["700","700italic","italic","regular"]},"Noto Sans":{"family":"Noto Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Noto Serif":{"family":"Noto Serif","category":"serif","variants":["700","700italic","italic","regular"]},"Nova Cut":{"family":"Nova Cut","category":"display","variants":["regular"]},"Nova Flat":{"family":"Nova Flat","category":"display","variants":["regular"]},"Nova Mono":{"family":"Nova Mono","category":"monospace","variants":["regular"]},"Nova Oval":{"family":"Nova Oval","category":"display","variants":["regular"]},"Nova Round":{"family":"Nova Round","category":"display","variants":["regular"]},"Nova Script":{"family":"Nova Script","category":"display","variants":["regular"]},"Nova Slim":{"family":"Nova Slim","category":"display","variants":["regular"]},"Nova Square":{"family":"Nova Square","category":"display","variants":["regular"]},"Numans":{"family":"Numans","category":"sans-serif","variants":["regular"]},"Nunito":{"family":"Nunito","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Nunito Sans":{"family":"Nunito Sans","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Odor Mean Chey":{"family":"Odor Mean Chey","category":"display","variants":["regular"]},"Offside":{"family":"Offside","category":"display","variants":["regular"]},"Old Standard TT":{"family":"Old Standard TT","category":"serif","variants":["700","italic","regular"]},"Oldenburg":{"family":"Oldenburg","category":"display","variants":["regular"]},"Oleo Script":{"family":"Oleo Script","category":"display","variants":["700","regular"]},"Oleo Script Swash Caps":{"family":"Oleo Script Swash Caps","category":"display","variants":["700","regular"]},"Open Sans":{"family":"Open Sans","category":"sans-serif","variants":["300","300italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Open Sans Condensed":{"family":"Open Sans Condensed","category":"sans-serif","variants":["300","300italic","700"]},"Oranienbaum":{"family":"Oranienbaum","category":"serif","variants":["regular"]},"Orbitron":{"family":"Orbitron","category":"sans-serif","variants":["500","700","900","regular"]},"Oregano":{"family":"Oregano","category":"display","variants":["italic","regular"]},"Orienta":{"family":"Orienta","category":"sans-serif","variants":["regular"]},"Original Surfer":{"family":"Original Surfer","category":"display","variants":["regular"]},"Oswald":{"family":"Oswald","category":"sans-serif","variants":["200","300","500","600","700","regular"]},"Over the Rainbow":{"family":"Over the Rainbow","category":"handwriting","variants":["regular"]},"Overlock":{"family":"Overlock","category":"display","variants":["700","700italic","900","900italic","italic","regular"]},"Overlock SC":{"family":"Overlock SC","category":"display","variants":["regular"]},"Overpass":{"family":"Overpass","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Overpass Mono":{"family":"Overpass Mono","category":"monospace","variants":["300","600","700","regular"]},"Ovo":{"family":"Ovo","category":"serif","variants":["regular"]},"Oxygen":{"family":"Oxygen","category":"sans-serif","variants":["300","700","regular"]},"Oxygen Mono":{"family":"Oxygen Mono","category":"monospace","variants":["regular"]},"PT Mono":{"family":"PT Mono","category":"monospace","variants":["regular"]},"PT Sans":{"family":"PT Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"PT Sans Caption":{"family":"PT Sans Caption","category":"sans-serif","variants":["700","regular"]},"PT Sans Narrow":{"family":"PT Sans Narrow","category":"sans-serif","variants":["700","regular"]},"PT Serif":{"family":"PT Serif","category":"serif","variants":["700","700italic","italic","regular"]},"PT Serif Caption":{"family":"PT Serif Caption","category":"serif","variants":["italic","regular"]},"Pacifico":{"family":"Pacifico","category":"handwriting","variants":["regular"]},"Padauk":{"family":"Padauk","category":"sans-serif","variants":["700","regular"]},"Palanquin":{"family":"Palanquin","category":"sans-serif","variants":["100","200","300","500","600","700","regular"]},"Palanquin Dark":{"family":"Palanquin Dark","category":"sans-serif","variants":["500","600","700","regular"]},"Pangolin":{"family":"Pangolin","category":"handwriting","variants":["regular"]},"Paprika":{"family":"Paprika","category":"display","variants":["regular"]},"Parisienne":{"family":"Parisienne","category":"handwriting","variants":["regular"]},"Passero One":{"family":"Passero One","category":"display","variants":["regular"]},"Passion One":{"family":"Passion One","category":"display","variants":["700","900","regular"]},"Pathway Gothic One":{"family":"Pathway Gothic One","category":"sans-serif","variants":["regular"]},"Patrick Hand":{"family":"Patrick Hand","category":"handwriting","variants":["regular"]},"Patrick Hand SC":{"family":"Patrick Hand SC","category":"handwriting","variants":["regular"]},"Pattaya":{"family":"Pattaya","category":"sans-serif","variants":["regular"]},"Patua One":{"family":"Patua One","category":"display","variants":["regular"]},"Pavanam":{"family":"Pavanam","category":"sans-serif","variants":["regular"]},"Paytone One":{"family":"Paytone One","category":"sans-serif","variants":["regular"]},"Peddana":{"family":"Peddana","category":"serif","variants":["regular"]},"Peralta":{"family":"Peralta","category":"display","variants":["regular"]},"Permanent Marker":{"family":"Permanent Marker","category":"handwriting","variants":["regular"]},"Petit Formal Script":{"family":"Petit Formal Script","category":"handwriting","variants":["regular"]},"Petrona":{"family":"Petrona","category":"serif","variants":["regular"]},"Philosopher":{"family":"Philosopher","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Piedra":{"family":"Piedra","category":"display","variants":["regular"]},"Pinyon Script":{"family":"Pinyon Script","category":"handwriting","variants":["regular"]},"Pirata One":{"family":"Pirata One","category":"display","variants":["regular"]},"Plaster":{"family":"Plaster","category":"display","variants":["regular"]},"Play":{"family":"Play","category":"sans-serif","variants":["700","regular"]},"Playball":{"family":"Playball","category":"display","variants":["regular"]},"Playfair Display":{"family":"Playfair Display","category":"serif","variants":["700","700italic","900","900italic","italic","regular"]},"Playfair Display SC":{"family":"Playfair Display SC","category":"serif","variants":["700","700italic","900","900italic","italic","regular"]},"Podkova":{"family":"Podkova","category":"serif","variants":["500","600","700","800","regular"]},"Poiret One":{"family":"Poiret One","category":"display","variants":["regular"]},"Poller One":{"family":"Poller One","category":"display","variants":["regular"]},"Poly":{"family":"Poly","category":"serif","variants":["italic","regular"]},"Pompiere":{"family":"Pompiere","category":"display","variants":["regular"]},"Pontano Sans":{"family":"Pontano Sans","category":"sans-serif","variants":["regular"]},"Poor Story":{"family":"Poor Story","category":"display","variants":["regular"]},"Poppins":{"family":"Poppins","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Port Lligat Sans":{"family":"Port Lligat Sans","category":"sans-serif","variants":["regular"]},"Port Lligat Slab":{"family":"Port Lligat Slab","category":"serif","variants":["regular"]},"Pragati Narrow":{"family":"Pragati Narrow","category":"sans-serif","variants":["700","regular"]},"Prata":{"family":"Prata","category":"serif","variants":["regular"]},"Preahvihear":{"family":"Preahvihear","category":"display","variants":["regular"]},"Press Start 2P":{"family":"Press Start 2P","category":"display","variants":["regular"]},"Pridi":{"family":"Pridi","category":"serif","variants":["200","300","500","600","700","regular"]},"Princess Sofia":{"family":"Princess Sofia","category":"handwriting","variants":["regular"]},"Prociono":{"family":"Prociono","category":"serif","variants":["regular"]},"Prompt":{"family":"Prompt","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Prosto One":{"family":"Prosto One","category":"display","variants":["regular"]},"Proza Libre":{"family":"Proza Libre","category":"sans-serif","variants":["500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Puritan":{"family":"Puritan","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Purple Purse":{"family":"Purple Purse","category":"display","variants":["regular"]},"Quando":{"family":"Quando","category":"serif","variants":["regular"]},"Quantico":{"family":"Quantico","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Quattrocento":{"family":"Quattrocento","category":"serif","variants":["700","regular"]},"Quattrocento Sans":{"family":"Quattrocento Sans","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Questrial":{"family":"Questrial","category":"sans-serif","variants":["regular"]},"Quicksand":{"family":"Quicksand","category":"sans-serif","variants":["300","500","700","regular"]},"Quintessential":{"family":"Quintessential","category":"handwriting","variants":["regular"]},"Qwigley":{"family":"Qwigley","category":"handwriting","variants":["regular"]},"Racing Sans One":{"family":"Racing Sans One","category":"display","variants":["regular"]},"Radley":{"family":"Radley","category":"serif","variants":["italic","regular"]},"Rajdhani":{"family":"Rajdhani","category":"sans-serif","variants":["300","500","600","700","regular"]},"Rakkas":{"family":"Rakkas","category":"display","variants":["regular"]},"Raleway":{"family":"Raleway","category":"sans-serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Raleway Dots":{"family":"Raleway Dots","category":"display","variants":["regular"]},"Ramabhadra":{"family":"Ramabhadra","category":"sans-serif","variants":["regular"]},"Ramaraja":{"family":"Ramaraja","category":"serif","variants":["regular"]},"Rambla":{"family":"Rambla","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Rammetto One":{"family":"Rammetto One","category":"display","variants":["regular"]},"Ranchers":{"family":"Ranchers","category":"display","variants":["regular"]},"Rancho":{"family":"Rancho","category":"handwriting","variants":["regular"]},"Ranga":{"family":"Ranga","category":"display","variants":["700","regular"]},"Rasa":{"family":"Rasa","category":"serif","variants":["300","500","600","700","regular"]},"Rationale":{"family":"Rationale","category":"sans-serif","variants":["regular"]},"Ravi Prakash":{"family":"Ravi Prakash","category":"display","variants":["regular"]},"Redressed":{"family":"Redressed","category":"handwriting","variants":["regular"]},"Reem Kufi":{"family":"Reem Kufi","category":"sans-serif","variants":["regular"]},"Reenie Beanie":{"family":"Reenie Beanie","category":"handwriting","variants":["regular"]},"Revalia":{"family":"Revalia","category":"display","variants":["regular"]},"Rhodium Libre":{"family":"Rhodium Libre","category":"serif","variants":["regular"]},"Ribeye":{"family":"Ribeye","category":"display","variants":["regular"]},"Ribeye Marrow":{"family":"Ribeye Marrow","category":"display","variants":["regular"]},"Righteous":{"family":"Righteous","category":"display","variants":["regular"]},"Risque":{"family":"Risque","category":"display","variants":["regular"]},"Roboto":{"family":"Roboto","category":"sans-serif","variants":["100","100italic","300","300italic","500","500italic","700","700italic","900","900italic","italic","regular"]},"Roboto Condensed":{"family":"Roboto Condensed","category":"sans-serif","variants":["300","300italic","700","700italic","italic","regular"]},"Roboto Mono":{"family":"Roboto Mono","category":"monospace","variants":["100","100italic","300","300italic","500","500italic","700","700italic","italic","regular"]},"Roboto Slab":{"family":"Roboto Slab","category":"serif","variants":["100","300","700","regular"]},"Rochester":{"family":"Rochester","category":"handwriting","variants":["regular"]},"Rock Salt":{"family":"Rock Salt","category":"handwriting","variants":["regular"]},"Rokkitt":{"family":"Rokkitt","category":"serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Romanesco":{"family":"Romanesco","category":"handwriting","variants":["regular"]},"Ropa Sans":{"family":"Ropa Sans","category":"sans-serif","variants":["italic","regular"]},"Rosario":{"family":"Rosario","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Rosarivo":{"family":"Rosarivo","category":"serif","variants":["italic","regular"]},"Rouge Script":{"family":"Rouge Script","category":"handwriting","variants":["regular"]},"Rozha One":{"family":"Rozha One","category":"serif","variants":["regular"]},"Rubik":{"family":"Rubik","category":"sans-serif","variants":["300","300italic","500","500italic","700","700italic","900","900italic","italic","regular"]},"Rubik Mono One":{"family":"Rubik Mono One","category":"sans-serif","variants":["regular"]},"Ruda":{"family":"Ruda","category":"sans-serif","variants":["700","900","regular"]},"Rufina":{"family":"Rufina","category":"serif","variants":["700","regular"]},"Ruge Boogie":{"family":"Ruge Boogie","category":"handwriting","variants":["regular"]},"Ruluko":{"family":"Ruluko","category":"sans-serif","variants":["regular"]},"Rum Raisin":{"family":"Rum Raisin","category":"sans-serif","variants":["regular"]},"Ruslan Display":{"family":"Ruslan Display","category":"display","variants":["regular"]},"Russo One":{"family":"Russo One","category":"sans-serif","variants":["regular"]},"Ruthie":{"family":"Ruthie","category":"handwriting","variants":["regular"]},"Rye":{"family":"Rye","category":"display","variants":["regular"]},"Sacramento":{"family":"Sacramento","category":"handwriting","variants":["regular"]},"Sahitya":{"family":"Sahitya","category":"serif","variants":["700","regular"]},"Sail":{"family":"Sail","category":"display","variants":["regular"]},"Saira":{"family":"Saira","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Condensed":{"family":"Saira Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Extra Condensed":{"family":"Saira Extra Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Saira Semi Condensed":{"family":"Saira Semi Condensed","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Salsa":{"family":"Salsa","category":"display","variants":["regular"]},"Sanchez":{"family":"Sanchez","category":"serif","variants":["italic","regular"]},"Sancreek":{"family":"Sancreek","category":"display","variants":["regular"]},"Sansita":{"family":"Sansita","category":"sans-serif","variants":["700","700italic","800","800italic","900","900italic","italic","regular"]},"Sarala":{"family":"Sarala","category":"sans-serif","variants":["700","regular"]},"Sarina":{"family":"Sarina","category":"display","variants":["regular"]},"Sarpanch":{"family":"Sarpanch","category":"sans-serif","variants":["500","600","700","800","900","regular"]},"Satisfy":{"family":"Satisfy","category":"handwriting","variants":["regular"]},"Scada":{"family":"Scada","category":"sans-serif","variants":["700","700italic","italic","regular"]},"Scheherazade":{"family":"Scheherazade","category":"serif","variants":["700","regular"]},"Schoolbell":{"family":"Schoolbell","category":"handwriting","variants":["regular"]},"Scope One":{"family":"Scope One","category":"serif","variants":["regular"]},"Seaweed Script":{"family":"Seaweed Script","category":"display","variants":["regular"]},"Secular One":{"family":"Secular One","category":"sans-serif","variants":["regular"]},"Sedgwick Ave":{"family":"Sedgwick Ave","category":"handwriting","variants":["regular"]},"Sedgwick Ave Display":{"family":"Sedgwick Ave Display","category":"handwriting","variants":["regular"]},"Sevillana":{"family":"Sevillana","category":"display","variants":["regular"]},"Seymour One":{"family":"Seymour One","category":"sans-serif","variants":["regular"]},"Shadows Into Light":{"family":"Shadows Into Light","category":"handwriting","variants":["regular"]},"Shadows Into Light Two":{"family":"Shadows Into Light Two","category":"handwriting","variants":["regular"]},"Shanti":{"family":"Shanti","category":"sans-serif","variants":["regular"]},"Share":{"family":"Share","category":"display","variants":["700","700italic","italic","regular"]},"Share Tech":{"family":"Share Tech","category":"sans-serif","variants":["regular"]},"Share Tech Mono":{"family":"Share Tech Mono","category":"monospace","variants":["regular"]},"Shojumaru":{"family":"Shojumaru","category":"display","variants":["regular"]},"Short Stack":{"family":"Short Stack","category":"handwriting","variants":["regular"]},"Shrikhand":{"family":"Shrikhand","category":"display","variants":["regular"]},"Siemreap":{"family":"Siemreap","category":"display","variants":["regular"]},"Sigmar One":{"family":"Sigmar One","category":"display","variants":["regular"]},"Signika":{"family":"Signika","category":"sans-serif","variants":["300","600","700","regular"]},"Signika Negative":{"family":"Signika Negative","category":"sans-serif","variants":["300","600","700","regular"]},"Simonetta":{"family":"Simonetta","category":"display","variants":["900","900italic","italic","regular"]},"Sintony":{"family":"Sintony","category":"sans-serif","variants":["700","regular"]},"Sirin Stencil":{"family":"Sirin Stencil","category":"display","variants":["regular"]},"Six Caps":{"family":"Six Caps","category":"sans-serif","variants":["regular"]},"Skranji":{"family":"Skranji","category":"display","variants":["700","regular"]},"Slabo 13px":{"family":"Slabo 13px","category":"serif","variants":["regular"]},"Slabo 27px":{"family":"Slabo 27px","category":"serif","variants":["regular"]},"Slackey":{"family":"Slackey","category":"display","variants":["regular"]},"Smokum":{"family":"Smokum","category":"display","variants":["regular"]},"Smythe":{"family":"Smythe","category":"display","variants":["regular"]},"Sniglet":{"family":"Sniglet","category":"display","variants":["800","regular"]},"Snippet":{"family":"Snippet","category":"sans-serif","variants":["regular"]},"Snowburst One":{"family":"Snowburst One","category":"display","variants":["regular"]},"Sofadi One":{"family":"Sofadi One","category":"display","variants":["regular"]},"Sofia":{"family":"Sofia","category":"handwriting","variants":["regular"]},"Song Myung":{"family":"Song Myung","category":"serif","variants":["regular"]},"Sonsie One":{"family":"Sonsie One","category":"display","variants":["regular"]},"Sorts Mill Goudy":{"family":"Sorts Mill Goudy","category":"serif","variants":["italic","regular"]},"Source Code Pro":{"family":"Source Code Pro","category":"monospace","variants":["200","300","500","600","700","900","regular"]},"Source Sans Pro":{"family":"Source Sans Pro","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","900","900italic","italic","regular"]},"Source Serif Pro":{"family":"Source Serif Pro","category":"serif","variants":["600","700","regular"]},"Space Mono":{"family":"Space Mono","category":"monospace","variants":["700","700italic","italic","regular"]},"Special Elite":{"family":"Special Elite","category":"display","variants":["regular"]},"Spectral":{"family":"Spectral","category":"serif","variants":["200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Spectral SC":{"family":"Spectral SC","category":"serif","variants":["200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","italic","regular"]},"Spicy Rice":{"family":"Spicy Rice","category":"display","variants":["regular"]},"Spinnaker":{"family":"Spinnaker","category":"sans-serif","variants":["regular"]},"Spirax":{"family":"Spirax","category":"display","variants":["regular"]},"Squada One":{"family":"Squada One","category":"display","variants":["regular"]},"Sree Krushnadevaraya":{"family":"Sree Krushnadevaraya","category":"serif","variants":["regular"]},"Sriracha":{"family":"Sriracha","category":"handwriting","variants":["regular"]},"Stalemate":{"family":"Stalemate","category":"handwriting","variants":["regular"]},"Stalinist One":{"family":"Stalinist One","category":"display","variants":["regular"]},"Stardos Stencil":{"family":"Stardos Stencil","category":"display","variants":["700","regular"]},"Stint Ultra Condensed":{"family":"Stint Ultra Condensed","category":"display","variants":["regular"]},"Stint Ultra Expanded":{"family":"Stint Ultra Expanded","category":"display","variants":["regular"]},"Stoke":{"family":"Stoke","category":"serif","variants":["300","regular"]},"Strait":{"family":"Strait","category":"sans-serif","variants":["regular"]},"Stylish":{"family":"Stylish","category":"sans-serif","variants":["regular"]},"Sue Ellen Francisco":{"family":"Sue Ellen Francisco","category":"handwriting","variants":["regular"]},"Suez One":{"family":"Suez One","category":"serif","variants":["regular"]},"Sumana":{"family":"Sumana","category":"serif","variants":["700","regular"]},"Sunflower":{"family":"Sunflower","category":"sans-serif","variants":["300","500","700"]},"Sunshiney":{"family":"Sunshiney","category":"handwriting","variants":["regular"]},"Supermercado One":{"family":"Supermercado One","category":"display","variants":["regular"]},"Sura":{"family":"Sura","category":"serif","variants":["700","regular"]},"Suranna":{"family":"Suranna","category":"serif","variants":["regular"]},"Suravaram":{"family":"Suravaram","category":"serif","variants":["regular"]},"Suwannaphum":{"family":"Suwannaphum","category":"display","variants":["regular"]},"Swanky and Moo Moo":{"family":"Swanky and Moo Moo","category":"handwriting","variants":["regular"]},"Syncopate":{"family":"Syncopate","category":"sans-serif","variants":["700","regular"]},"Tajawal":{"family":"Tajawal","category":"sans-serif","variants":["200","300","500","700","800","900","regular"]},"Tangerine":{"family":"Tangerine","category":"handwriting","variants":["700","regular"]},"Taprom":{"family":"Taprom","category":"display","variants":["regular"]},"Tauri":{"family":"Tauri","category":"sans-serif","variants":["regular"]},"Taviraj":{"family":"Taviraj","category":"serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Teko":{"family":"Teko","category":"sans-serif","variants":["300","500","600","700","regular"]},"Telex":{"family":"Telex","category":"sans-serif","variants":["regular"]},"Tenali Ramakrishna":{"family":"Tenali Ramakrishna","category":"sans-serif","variants":["regular"]},"Tenor Sans":{"family":"Tenor Sans","category":"sans-serif","variants":["regular"]},"Text Me One":{"family":"Text Me One","category":"sans-serif","variants":["regular"]},"The Girl Next Door":{"family":"The Girl Next Door","category":"handwriting","variants":["regular"]},"Tienne":{"family":"Tienne","category":"serif","variants":["700","900","regular"]},"Tillana":{"family":"Tillana","category":"handwriting","variants":["500","600","700","800","regular"]},"Timmana":{"family":"Timmana","category":"sans-serif","variants":["regular"]},"Tinos":{"family":"Tinos","category":"serif","variants":["700","700italic","italic","regular"]},"Titan One":{"family":"Titan One","category":"display","variants":["regular"]},"Titillium Web":{"family":"Titillium Web","category":"sans-serif","variants":["200","200italic","300","300italic","600","600italic","700","700italic","900","italic","regular"]},"Trade Winds":{"family":"Trade Winds","category":"display","variants":["regular"]},"Trirong":{"family":"Trirong","category":"serif","variants":["100","100italic","200","200italic","300","300italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic","italic","regular"]},"Trocchi":{"family":"Trocchi","category":"serif","variants":["regular"]},"Trochut":{"family":"Trochut","category":"display","variants":["700","italic","regular"]},"Trykker":{"family":"Trykker","category":"serif","variants":["regular"]},"Tulpen One":{"family":"Tulpen One","category":"display","variants":["regular"]},"Ubuntu":{"family":"Ubuntu","category":"sans-serif","variants":["300","300italic","500","500italic","700","700italic","italic","regular"]},"Ubuntu Condensed":{"family":"Ubuntu Condensed","category":"sans-serif","variants":["regular"]},"Ubuntu Mono":{"family":"Ubuntu Mono","category":"monospace","variants":["700","700italic","italic","regular"]},"Ultra":{"family":"Ultra","category":"serif","variants":["regular"]},"Uncial Antiqua":{"family":"Uncial Antiqua","category":"display","variants":["regular"]},"Underdog":{"family":"Underdog","category":"display","variants":["regular"]},"Unica One":{"family":"Unica One","category":"display","variants":["regular"]},"UnifrakturCook":{"family":"UnifrakturCook","category":"display","variants":["700"]},"UnifrakturMaguntia":{"family":"UnifrakturMaguntia","category":"display","variants":["regular"]},"Unkempt":{"family":"Unkempt","category":"display","variants":["700","regular"]},"Unlock":{"family":"Unlock","category":"display","variants":["regular"]},"Unna":{"family":"Unna","category":"serif","variants":["700","700italic","italic","regular"]},"VT323":{"family":"VT323","category":"monospace","variants":["regular"]},"Vampiro One":{"family":"Vampiro One","category":"display","variants":["regular"]},"Varela":{"family":"Varela","category":"sans-serif","variants":["regular"]},"Varela Round":{"family":"Varela Round","category":"sans-serif","variants":["regular"]},"Vast Shadow":{"family":"Vast Shadow","category":"display","variants":["regular"]},"Vesper Libre":{"family":"Vesper Libre","category":"serif","variants":["500","700","900","regular"]},"Vibur":{"family":"Vibur","category":"handwriting","variants":["regular"]},"Vidaloka":{"family":"Vidaloka","category":"serif","variants":["regular"]},"Viga":{"family":"Viga","category":"sans-serif","variants":["regular"]},"Voces":{"family":"Voces","category":"display","variants":["regular"]},"Volkhov":{"family":"Volkhov","category":"serif","variants":["700","700italic","italic","regular"]},"Vollkorn":{"family":"Vollkorn","category":"serif","variants":["600","600italic","700","700italic","900","900italic","italic","regular"]},"Vollkorn SC":{"family":"Vollkorn SC","category":"serif","variants":["600","700","900","regular"]},"Voltaire":{"family":"Voltaire","category":"sans-serif","variants":["regular"]},"Waiting for the Sunrise":{"family":"Waiting for the Sunrise","category":"handwriting","variants":["regular"]},"Wallpoet":{"family":"Wallpoet","category":"display","variants":["regular"]},"Walter Turncoat":{"family":"Walter Turncoat","category":"handwriting","variants":["regular"]},"Warnes":{"family":"Warnes","category":"display","variants":["regular"]},"Wellfleet":{"family":"Wellfleet","category":"display","variants":["regular"]},"Wendy One":{"family":"Wendy One","category":"sans-serif","variants":["regular"]},"Wire One":{"family":"Wire One","category":"sans-serif","variants":["regular"]},"Work Sans":{"family":"Work Sans","category":"sans-serif","variants":["100","200","300","500","600","700","800","900","regular"]},"Yanone Kaffeesatz":{"family":"Yanone Kaffeesatz","category":"sans-serif","variants":["200","300","700","regular"]},"Yantramanav":{"family":"Yantramanav","category":"sans-serif","variants":["100","300","500","700","900","regular"]},"Yatra One":{"family":"Yatra One","category":"display","variants":["regular"]},"Yellowtail":{"family":"Yellowtail","category":"handwriting","variants":["regular"]},"Yeon Sung":{"family":"Yeon Sung","category":"display","variants":["regular"]},"Yeseva One":{"family":"Yeseva One","category":"display","variants":["regular"]},"Yesteryear":{"family":"Yesteryear","category":"handwriting","variants":["regular"]},"Yrsa":{"family":"Yrsa","category":"serif","variants":["300","500","600","700","regular"]},"Zeyada":{"family":"Zeyada","category":"handwriting","variants":["regular"]},"Zilla Slab":{"family":"Zilla Slab","category":"serif","variants":["300","300italic","500","500italic","600","600italic","700","700italic","italic","regular"]},"Zilla Slab Highlight":{"family":"Zilla Slab Highlight","category":"display","variants":["700","regular"]}},"order":{"popularity":["Roboto","Open Sans","Lato","Montserrat","Roboto Condensed","Oswald","Source Sans Pro","Slabo 27px","Raleway","PT Sans","Roboto Slab","Merriweather","Open Sans Condensed","Ubuntu","Playfair Display","Noto Sans","Poppins","Lora","Roboto Mono","PT Serif","Titillium Web","Arimo","Muli","PT Sans Narrow","Noto Serif","Fira Sans","Nunito","Inconsolata","Indie Flower","Anton","Dosis","Bitter","Crimson Text","Oxygen","Nanum Gothic","Cabin","Arvo","Fjalla One","Libre Baskerville","Work Sans","Quicksand","Josefin Sans","Exo 2","Hind","Lobster","Yanone Kaffeesatz","Rubik","Abel","Karla","Abril Fatface","Pacifico","Nunito Sans","Libre Franklin","Merriweather Sans","Varela Round","Ubuntu Condensed","Shadows Into Light","Asap","Exo","Cormorant Garamond","Gloria Hallelujah","Bree Serif","Dancing Script","Questrial","Signika","Source Serif Pro","Archivo Narrow","Source Code Pro","Play","Amatic SC","Acme","Kanit","Maven Pro","EB Garamond","Hind Siliguri","Rajdhani","Rokkitt","Francois One","Patua One","Comfortaa","Berkshire Swash","PT Sans Caption","Crete Round","Cuprum","Cairo","Cinzel","Shrikhand","Vollkorn","Catamaran","Ropa Sans","Heebo","Passion One","Righteous","Pathway Gothic One","Philosopher","Poiret One","Alegreya","Permanent Marker","Noticia Text","Satisfy","Yantramanav","Teko","Old Standard TT","Courgette","Great Vibes","Russo One","Prompt","ABeeZee","Archivo Black","Alegreya Sans","Monda","Domine","Orbitron","Cookie","Kaushan Script","Quattrocento Sans","News Cycle","Tinos","Lobster Two","Concert One","Istok Web","Josefin Slab","Assistant","Cardo","Alfa Slab One","Fredoka One","Gudea","Titan One","Handlee","Quattrocento","Economica","Fira Sans Condensed","Playfair Display SC","Didact Gothic","Pontano Sans","Sanchez","Kalam","Sacramento","Cabin Condensed","Caveat","Amiri","Marck Script","Hammersmith One","Arapey","Jura","BenchNine","Neuton","Khand","Nanum Myeongjo","Ruda","Tangerine","Volkhov","Monoton","Audiowide","Boogaloo","Armata","Fira Sans Extra Condensed","Shadows Into Light Two","VT323","Khula","Chivo","Cantarell","Antic","Aldrich","Hind Madurai","Glegoo","Architects Daughter","Pragati Narrow","Prosto One","Bangers","Gentium Basic","Hind Vadodara","Antic Slab","Unica One","Amaranth","Vidaloka","Enriqueta","Frank Ruhl Libre","Luckiest Guy","Patrick Hand","Bevan","Caveat Brush","Barlow Condensed","Forum","Ultra","PT Mono","Kreon","Sintony","Sorts Mill Goudy","Yrsa","Scada","Homemade Apple","Arsenal","Prata","Basic","Neucha","Covered By Your Grace","Merienda","Julius Sans One","Changa","Gentium Book Basic","Contrail One","Cabin Sketch","Actor","Yellowtail","Alegreya Sans SC","Alice","Sigmar One","Signika Negative","Rufina","Martel","Adamina","Magra","Fugaz One","Bad Script","Lusitana","Nothing You Could Do","Playball","Varela","Damion","Special Elite","Barlow","Overpass","Press Start 2P","Advent Pro","Alex Brush","Arbutus Slab","Paytone One","Arima Madurai","Barlow Semi Condensed","Chewy","Share","Rancho","Slabo 13px","Ubuntu Mono","Rock Salt","Coustard","Allura","Viga","Coda","Montserrat Alternates","Syncopate","Oleo Script","Rambla","Cantata One","PT Serif Caption","Cinzel Decorative","Sarala","Ovo","Gochi Hand","Spinnaker","Just Another Hand","Michroma","Marcellus","Overlock","Love Ya Like A Sister","Carter One","Electrolize","Cousine","Eczar","Lustria","Marmelad","Candal","Niconne","Coming Soon","Saira Condensed","Black Ops One","Molengo","Saira","Nobile","Carme","Squada One","Karma","Cormorant","Marcellus SC","Radley","Kameron","Ceviche One","Parisienne","Zilla Slab","Marvel","Copse","Oranienbaum","Reenie Beanie","Freckle Face","Saira Extra Condensed","Pinyon Script","Unna","Hind Guntur","Mr Dafoe","IM Fell DW Pica","Jockey One","Voltaire","Goudy Bookletter 1911","Leckerli One","Fauna One","Quantico","Alef","Itim","Telex","Lateef","Days One","Baloo","Allerta","Pridi","Average","Norican","Grand Hotel","Rochester","Italianno","Changa One","Saira Semi Condensed","Reem Kufi","Limelight","Carrois Gothic","Skranji","Halant","Nixie One","Fredericka the Great","Anonymous Pro","Spirax","Martel Sans","Palanquin","Space Mono","Alegreya SC","Taviraj","Nanum Gothic Coding","Bungee","Tauri","Rasa","Londrina Solid","Bubblegum Sans","El Messiri","Yesteryear","Aclonica","Archivo","Allerta Stencil","Puritan","Metrophobic","Annie Use Your Telescope","Kelly Slab","Caudex","Tenor Sans","Cutive","Fanwood Text","Bungee Inline","Homenaje","Doppio One","Rosario","Biryani","Calligraffitti","Kurale","Average Sans","Nanum Pen Script","Faster One","Inder","Nanum Brush Script","Share Tech Mono","Judson","Abhaya Libre","Jaldi","GFS Didot","Racing Sans One","Graduate","Rozha One","Convergence","Mukta Vaani","Lalezar","Sue Ellen Francisco","Petit Formal Script","Mada","Artifika","Schoolbell","Lilita One","Mukta","Aladin","Yeseva One","Miriam Libre","Six Caps","Gilda Display","Encode Sans Condensed","Mitr","Scheherazade","Happy Monkey","Gruppo","Andada","Delius","Give You Glory","Quando","Spectral","Trocchi","Herr Von Muellerhoff","Bowlby One SC","Trirong","The Girl Next Door","Allan","Pompiere","Belleza","Cambay","Gravitas One","Balthazar","Merienda One","Andika","Montez","Cambo","Fontdiner Swanky","Alike","Strait","Arizonia","Secular One","Lekton","Zeyada","Chelsea Market","Oxygen Mono","Mr De Haviland","Buenard","Fjord One","Mako","Hanuman","Capriola","Cutive Mono","Knewave","IM Fell Double Pica","Mate","Qwigley","Oregano","Wire One","Megrim","Anaheim","Vesper Libre","Walter Turncoat","Federo","Poly","La Belle Aurore","Averia Serif Libre","Short Stack","Belgrano","Carrois Gothic SC","Kristi","Proza Libre","Baloo Paaji","Bowlby One","Gafata","Chau Philomene One","Duru Sans","Vast Shadow","Mouse Memoirs","Baumans","Lemon","Stalemate","Seaweed Script","Gabriela","IM Fell English","Athiti","Fondamento","Maitree","Palanquin Dark","Fira Mono","Baloo Bhaina","Pangolin","Expletus Sans","Brawler","Waiting for the Sunrise","Orienta","Imprima","Emilys Candy","Rouge Script","UnifrakturMaguntia","Creepster","Oleo Script Swash Caps","Cherry Swash","Stardos Stencil","Crafty Girls","Amiko","Bilbo Swash Caps","Shojumaru","Voces","Podkova","Suez One","Rye","Yatra One","Meddon","Clicker Script","NTR","Denk One","Lemonada","Holtwood One SC","Patrick Hand SC","Pattaya","Rammetto One","Cedarville Cursive","Unkempt","Delius Swash Caps","Iceland","Gurajada","IM Fell English SC","Just Me Again Down Here","Lily Script One","Laila","Englebert","Wallpoet","Loved by the King","Crushed","Tulpen One","Rubik Mono One","Harmattan","Port Lligat Slab","Dawning of a New Day","Amethysta","Frijole","Encode Sans","Raleway Dots","Euphoria Script","Poller One","Ledger","Tienne","Asap Condensed","Bentham","Italiana","Krona One","Baloo Chettan","Mukta Malar","Salsa","Sansita","Battambang","Nova Mono","Suranna","Corben","Baloo Tamma","Sofia","Londrina Outline","Over the Rainbow","Metamorphous","Cherry Cream Soda","Headland One","Sriracha","Cormorant Infant","Sniglet","Geo","Vampiro One","Padauk","Prociono","Life Savers","Cantora One","Do Hyeon","Finger Paint","Share Tech","Ranchers","Kotta One","McLaren","Medula One","Arya","Aguafina Script","Codystar","David Libre","Gothic A1","Mirza","Engagement","Shanti","Cormorant SC","Nova Square","Sumana","Bungee Shade","Vibur","Sarpanch","Nosifer","Mallanna","Khmer","Scope One","Averia Sans Libre","Simonetta","Nova Slim","IBM Plex Sans","Dorsa","Princess Sofia","Amarante","Fenix","Ramabhadra","Coda Caption","Habibi","Flamenco","Bilbo","Slackey","Katibeh","Mogra","Port Lligat Sans","Koulen","Bubbler One","Stint Ultra Expanded","Pavanam","Dynalight","Mate SC","Donegal One","Sail","Mandali","Encode Sans Semi Condensed","Quintessential","Elsie","Averia Libre","League Script","Mountains of Christmas","Mystery Quest","Rosarivo","Kranky","Condiment","Rakkas","Kite One","Germania One","Mrs Saint Delafield","Miniver","Junge","Aref Ruqaa","Numans","Bellefair","Sarina","Alike Angular","Hi Melody","Maiden Orange","Dekko","Antic Didone","Delius Unicase","Kadwa","Ruslan Display","Milonga","Inika","Sura","Rhodium Libre","Stoke","Sancreek","Montserrat Subrayada","Pirata One","Kavoon","Wendy One","Rationale","Almendra","Fascinate Inline","Cagliostro","Chonburi","Trade Winds","Jim Nightshade","Ruluko","Peralta","Asul","Nova Round","IM Fell French Canon","Buda","IBM Plex Serif","Amita","Esteban","BioRhyme","Spectral SC","Ribeye","IM Fell DW Pica SC","Joti One","IBM Plex Sans Condensed","Paprika","Baloo Bhai","Overlock SC","Swanky and Moo Moo","Sonsie One","Text Me One","UnifrakturCook","Croissant One","Stint Ultra Condensed","Linden Hill","Baloo Thambi","Sedgwick Ave","Flavors","Fresca","IM Fell Great Primer","Angkor","Revalia","Montaga","Mina","New Rocker","Nova Flat","Ramaraja","Offside","Encode Sans Expanded","Glass Antiqua","Monsieur La Doulaise","Diplomata","Lovers Quarrel","Mukta Mahee","Timmana","Redressed","Griffy","Wellfleet","Tajawal","Risque","Julee","Content","Manuale","Sunshiney","Plaster","Asset","Galindo","Akronim","MedievalSharp","Atma","Marko One","Cormorant Upright","Eagle Lake","Averia Gruesa Libre","Snippet","Della Respira","Henny Penny","Gugi","Baloo Bhaijaan","Autour One","Lancelot","Ruthie","Bigshot One","Monofett","IBM Plex Mono","Sree Krushnadevaraya","Nokora","Purple Purse","Oldenburg","Snowburst One","Farsan","Inknut Antiqua","Spicy Rice","Jolly Lodger","Iceberg","Smythe","Petrona","Uncial Antiqua","Underdog","Cormorant Unicase","IM Fell Double Pica SC","Ewert","Goblin One","Irish Grover","Bayon","Chango","Macondo","Overpass Mono","Arbutus","Caesar Dressing","Trykker","Faustina","Margarine","Ravi Prakash","Metal Mania","Barrio","Butcherman","Elsie Swash Caps","Kantumruy","Coiny","Diplomata SC","Atomic Age","Molle","Mrs Sheppards","Eater","Meie Script","Miltonian Tattoo","Dr Sugiyama","Modern Antiqua","Rum Raisin","IM Fell French Canon SC","Original Surfer","Lakki Reddy","Galdeano","Jomhuria","Seymour One","Keania One","Astloch","Siemreap","Modak","Almendra SC","Zilla Slab Highlight","Galada","Piedra","Jacques Francois Shadow","Sahitya","Ribeye Marrow","Sirin Stencil","Chicle","Jacques Francois","Londrina Shadow","Ruge Boogie","Tillana","IM Fell Great Primer SC","Odor Mean Chey","Smokum","Felipa","Almendra Display","Kenia","Miltonian","Nova Oval","GFS Neohellenic","Devonshire","Warnes","Nova Script","Bokor","Meera Inimai","Geostar Fill","Freehand","Asar","Ranga","Fascinate","Bonbon","Passero One","Kavivanar","Metal","Suwannaphum","Combo","Romanesco","Encode Sans Semi Expanded","Black Han Sans","Trochut","Nova Cut","Fruktur","Kdam Thmor","Miss Fajardose","Bahiana","Londrina Sketch","Butterfly Kids","Chathura","Moul","Dangrek","Bigelow Rules","Libre Barcode 39 Text","Sedgwick Ave Display","Stalinist One","Baloo Da","Supermercado One","Vollkorn SC","Macondo Swash Caps","Sofadi One","Kumar One","Bungee Outline","Emblema One","Taprom","Sevillana","Federant","Erica One","Gorditas","Tenali Ramakrishna","Geostar","Aubrey","Hanalei","Hanalei Fill","Chela One","Chenla","Cute Font","Mr Bedfort","Baloo Tammudu","Gamja Flower","Gidugu","Unlock","Preahvihear","Peddana","Gaegu","Bungee Hairline","Libre Barcode 39 Extended Text","Moulpali","Fasthand","Jua","Libre Barcode 39 Extended","Dhurjati","Suravaram","BioRhyme Expanded","Libre Barcode 128 Text","Libre Barcode 39","Libre Barcode 128","Poor Story","Stylish","Black And White Picture","Song Myung","Kumar One Outline","Yeon Sung","East Sea Dokdo","Kirang Haerang","Dokdo","Sunflower"],"trending":["Gothic A1","Do Hyeon","Tajawal","Gugi","Black Han Sans","Titan One","Gamja Flower","Gaegu","Cute Font","IBM Plex Mono","IBM Plex Sans","Jua","Encode Sans Semi Expanded","Black And White Picture","IBM Plex Serif","Hi Melody","Eczar","Song Myung","Spirax","Sura","Mukta Malar","IM Fell DW Pica","Suez One","Unna","Koulen","Vesper Libre","Chivo","Skranji","Stylish","Cambay","VT323","Libre Barcode 39 Text","Englebert","Fjord One","Ranchers","BioRhyme","Yeon Sung","Dokdo","New Rocker","Gruppo","Cinzel Decorative","Saira Semi Condensed","Cormorant Unicase","Battambang","IBM Plex Sans Condensed","Kdam Thmor","Libre Barcode 128 Text","Siemreap","IM Fell French Canon SC","Mukta Vaani","Scope One","Creepster","Manuale","Miriam Libre","Norican","Laila","Kirang Haerang","East Sea Dokdo","Denk One","Gilda Display","Barrio","Poor Story","Pathway Gothic One","Khula","Carrois Gothic SC","Oxygen Mono","Antic","Bungee","Butterfly Kids","Jolly Lodger","Hind Madurai","Flavors","Secular One","Ramaraja","Eater","Khmer","Faster One","Goudy Bookletter 1911","Suravaram","Unlock","Aldrich","Sree Krushnadevaraya","Kantumruy","Oldenburg","Mukta","Rhodium Libre","Anaheim","Mada","Cormorant SC","Elsie Swash Caps","Prompt","Miniver","Saira Extra Condensed","Taprom","Love Ya Like A Sister","Encode Sans Condensed","Angkor","Artifika","Wallpoet","Bubbler One","Rajdhani","Lemon","Lancelot","Barlow Condensed","Exo 2","Warnes","Slabo 13px","Donegal One","Margarine","Encode Sans","Buenard","Moulpali","Athiti","Exo","Squada One","Saira","Federo","Barlow","Prosto One","Faustina","Shrikhand","Londrina Outline","Padauk","Monofett","Port Lligat Sans","Source Code Pro","Flamenco","Federant","Metamorphous","Hind Guntur","Keania One","Almendra","Yantramanav","Carter One","Wellfleet","Megrim","Nova Round","Milonga","Cormorant Garamond","Almendra Display","Cormorant Upright","Dhurjati","Allerta","Meera Inimai","Tenali Ramakrishna","Hind Siliguri","McLaren","Baloo Bhaina","Alef","Heebo","Nunito Sans","Proza Libre","Monda","Voces","Cormorant","Arbutus","Roboto Mono","Unkempt","Orienta","Oleo Script Swash Caps","Diplomata SC","Bungee Outline","Diplomata","Emblema One","Pavanam","Lusitana","Libre Barcode 39 Extended","Nokora","Rokkitt","Strait","Sansita","Timmana","Mr Dafoe","Devonshire","Allura","Fascinate","Teko","Sriracha","Sunshiney","Viga","Miltonian","GFS Neohellenic","Paprika","Geostar","Indie Flower","Dangrek","Yeseva One","Chango","Overlock","Copse","Freehand","Kavoon","Questrial","Nanum Myeongjo","Inconsolata","Jim Nightshade","Crushed","Martel","Peralta","Space Mono","Poppins","Allan","Bayon","Economica","Bevan","Smythe","Fauna One","Fira Sans","Libre Barcode 128","Share Tech Mono","Enriqueta","Galdeano","Cambo","Noto Serif","Miltonian Tattoo","Ewert","Mr Bedfort","Revalia","Biryani","Russo One","Nothing You Could Do","Cantora One","Bokor","Carrois Gothic","Snowburst One","Boogaloo","Philosopher","Metrophobic","Junge","Homemade Apple","Syncopate","Bigshot One","Fruktur","Swanky and Moo Moo","Pattaya","Peddana","Basic","Sail","Average Sans","Halant","Contrail One","Convergence","Pirata One","Shadows Into Light Two","Kelly Slab","Chathura","Piedra","Crafty Girls","Elsie","Overpass Mono","Italianno","Mate","PT Sans Narrow","Spicy Rice","Cabin Condensed","Dawning of a New Day","Palanquin Dark","Purple Purse","Ruda","Gentium Basic","Domine","Sigmar One","Bungee Inline","Assistant","Puritan","Gravitas One","Petit Formal Script","Stalemate","Stint Ultra Expanded","Combo","IM Fell French Canon","Alex Brush","Alegreya SC","Neuton","Asap","Stoke","Varela Round","Actor","Alegreya Sans SC","Satisfy","Gloria Hallelujah","Tinos","Source Serif Pro","Istok Web","Jomhuria","Open Sans Condensed","Coming Soon","Stalinist One","Tienne","Averia Libre","Nova Square","Playfair Display","Marck Script","Bentham","UnifrakturMaguntia","Advent Pro","Pompiere","Palanquin","Ubuntu Mono","Kite One","Snippet","Gidugu","Anton","Allerta Stencil","Baloo Tamma","Meddon","Kalam","Cinzel","Suranna","Karla","Nova Mono","Jacques Francois","Baloo Bhai","Nova Slim","Black Ops One","Lovers Quarrel","Fira Sans Condensed","Poiret One","Felipa","Alfa Slab One","Cherry Cream Soda","Metal","Spinnaker","Patrick Hand","IM Fell DW Pica SC","Emilys Candy","Nova Script","Architects Daughter","Asap Condensed","Schoolbell","Amiko","Almendra SC","Calligraffitti","Handlee","Amarante","Cantarell","Shojumaru","La Belle Aurore","Belleza","Titillium Web","Montserrat","Merriweather Sans","Delius","BenchNine","Aubrey","Rouge Script","Cabin","Rum Raisin","Rosario","Cousine","Source Sans Pro","Mrs Saint Delafield","Arizonia","Sedgwick Ave","Bitter","Overpass","Reenie Beanie","Happy Monkey","Berkshire Swash","Trochut","Nanum Gothic","Catamaran","Pontano Sans","Fontdiner Swanky","Sintony","Lato","Irish Grover","Noticia Text","Rock Salt","Ropa Sans","Jaldi","ABeeZee","Fondamento","Odor Mean Chey","Fasthand","Zeyada","Karma","Trirong","Encode Sans Expanded","Modern Antiqua","Amatic SC","Varela","Archivo","Glegoo","Play","Ruluko","Corben","Princess Sofia","Text Me One","Sofadi One","Sonsie One","Baumans","Ubuntu","Aclonica","Erica One","Sarala","Life Savers","Arsenal","Belgrano","IM Fell Great Primer SC","Goblin One","Brawler","Gurajada","Duru Sans","Nunito","Spectral","Habibi","Marvel","Sanchez","Fjalla One","Poly","Dekko","Prociono","Judson","Raleway","Dancing Script","Quattrocento Sans","Rubik","Forum","Supermercado One","Cutive","Cherry Swash","Voltaire","Herr Von Muellerhoff","Asar","Ledger","Work Sans","News Cycle","Marcellus","Nixie One","Unica One","Vollkorn SC","Sirin Stencil","Bungee Hairline","Ubuntu Condensed","Lateef","Smokum","Akronim","Medula One","Iceberg","Bungee Shade","Stint Ultra Condensed","Caveat","Croissant One","Alegreya Sans","Didact Gothic","Rambla","Antic Slab","Give You Glory","Yrsa","Paytone One","Comfortaa","Trocchi","Vollkorn","NTR","Headland One","Oleo Script","Content","Roboto Slab","Abril Fatface","Parisienne","Rancho","Kavivanar","Cuprum","Scada","Marmelad","Asul","Gentium Book Basic","Fira Mono","Barlow Semi Condensed","Muli","Merriweather","Fanwood Text","Dynalight","Fredoka One","Moul","EB Garamond","Racing Sans One","Michroma","Bangers","Abhaya Libre","IM Fell Great Primer","Trykker","Engagement","Coda","Oxygen","Passero One","Londrina Sketch","Tauri","Lora","Nova Cut","Quantico","Bree Serif","Monsieur La Doulaise","Maven Pro","Dr Sugiyama","Oranienbaum","Coiny","Molengo","Signika Negative","Geostar Fill","Kurale","Open Sans","Carme","Rasa","Mandali","Underdog","Slackey","Gochi Hand","Audiowide","Walter Turncoat","Trade Winds","Cormorant Infant","Arvo","Salsa","Cedarville Cursive","Hammersmith One","Bahiana","Libre Baskerville","Sarina","Port Lligat Slab","Vast Shadow","Doppio One","Atma","Galindo","Kreon","GFS Didot","Mako","Miss Fajardose","Inder","Permanent Marker","Astloch","Vampiro One","Mallanna","Mouse Memoirs","Share","Mina","Londrina Shadow","Asset","Hanuman","Italiana","Cabin Sketch","Anonymous Pro","Sue Ellen Francisco","Londrina Solid","IM Fell English","Fredericka the Great","PT Sans","Kristi","Crimson Text","Pridi","Righteous","Galada","Lakki Reddy","Metal Mania","Tillana","Playball","Abel","Finger Paint","Codystar","Waiting for the Sunrise","Covered By Your Grace","Roboto Condensed","Knewave","Nanum Pen Script","Just Me Again Down Here","Aguafina Script","Mr De Haviland","Gafata","Rationale","Armata","Rochester","PT Serif","Tangerine","Amita","Quattrocento","Amethysta","Alice","Capriola","Mogra","Qwigley","Suwannaphum","Bigelow Rules","PT Sans Caption","PT Mono","Damion","Lekton","Prata","Martel Sans","Redressed","Quicksand","Yellowtail","Buda","Kanit","Ruthie","Ruslan Display","Baloo Tammudu","Sedgwick Ave Display","Six Caps","Dosis","Inknut Antiqua","Zilla Slab Highlight","Fira Sans Extra Condensed","Zilla Slab","Short Stack","Monoton","Atomic Age","Nanum Gothic Coding","Candal","Rufina","Petrona","Lobster Two","Marko One","Sevillana","Scheherazade","Changa One","Electrolize","Julius Sans One","Magra","Amiri","Freckle Face","Noto Sans","Numans","Antic Didone","Nova Oval","Sniglet","Iceland","Euphoria Script","Bilbo Swash Caps","Delius Unicase","Chonburi","Averia Sans Libre","Arimo","Cantata One","Frank Ruhl Libre","Montez","Josefin Sans","Kameron","Telex","Over the Rainbow","Julee","Modak","Sarpanch","Alike","Alegreya","Bubblegum Sans","Condiment","IM Fell Double Pica SC","Orbitron","Kenia","Loved by the King","Oswald","Rosarivo","Patua One","Mate SC","Saira Condensed","Pinyon Script","League Script","Averia Serif Libre","IM Fell Double Pica","Roboto","Linden Hill","Tenor Sans","Bad Script","Seymour One","Yesteryear","Sumana","Leckerli One","Montserrat Subrayada","Kumar One Outline","Lilita One","Homenaje","Niconne","Just Another Hand","Clicker Script","Ribeye Marrow","Kranky","Jacques Francois Shadow","Griffy","Gorditas","Hanalei Fill","Mukta Mahee","Acme","Simonetta","Maiden Orange","Arapey","Dorsa","Geo","Stardos Stencil","Balthazar","Baloo Thambi","Holtwood One SC","Passion One","Slabo 27px","Sacramento","Arbutus Slab","Sofia","Hanalei","Hind Vadodara","Nobile","Lustria","Francois One","Volkhov","Taviraj","Pacifico","Wire One","Delius Swash Caps","Chelsea Market","Radley","Quintessential","Gabriela","Pragati Narrow","Ravi Prakash","Fenix","UnifrakturCook","Jura","Mountains of Christmas","Marcellus SC","Days One","PT Serif Caption","Eagle Lake","Esteban","IM Fell English SC","Vibur","Maitree","Caesar Dressing","Crete Round","Cookie","Sorts Mill Goudy","Imprima","Gudea","The Girl Next Door","Chenla","Chewy","Ultra","Reem Kufi","Shadows Into Light","Adamina","Andada","Libre Franklin","Andika","Encode Sans Semi Condensed","Fascinate Inline","Chela One","Playfair Display SC","Baloo Da","Bilbo","Cairo","Montaga","Hind","Changa","Lily Script One","Inika","Harmattan","Tulpen One","Rye","Fresca","Bonbon","Grand Hotel","Archivo Black","Oregano","Khand","Yanone Kaffeesatz","Neucha","Lemonada","Butcherman","Signika","Glass Antiqua","Spectral SC","Cardo","Old Standard TT","Aref Ruqaa","Montserrat Alternates","Patrick Hand SC","Sancreek","Kadwa","Josefin Slab","Merienda One","Ceviche One","Joti One","Ribeye","Podkova","Ruge Boogie","Fugaz One","Average","Alike Angular","Courgette","Autour One","Kotta One","Risque","Great Vibes","Nanum Brush Script","Della Respira","MedievalSharp","Archivo Narrow","Ramabhadra","Bellefair","Kaushan Script","Sunflower","Expletus Sans","Frijole","Seaweed Script","Wendy One","Sahitya","Raleway Dots","El Messiri","Quando","Caveat Brush","Mrs Sheppards","Uncial Antiqua","Coustard","Germania One","Averia Gruesa Libre","Farsan","Molle","Lobster","Jockey One","Shanti","Graduate","Baloo Paaji","Annie Use Your Telescope","Preahvihear","Luckiest Guy","Kumar One","Original Surfer","Romanesco","David Libre","Bowlby One SC","Arima Madurai","Caudex","Offside","Mirza","Limelight","Cagliostro","BioRhyme Expanded","Ovo","Katibeh","Mystery Quest","Vidaloka","Mitr","Plaster","Chicle","Rakkas","Nosifer","Macondo Swash Caps","Rozha One","Poller One","Concert One","Libre Barcode 39","Baloo Chettan","Special Elite","Yatra One","Overlock SC","Baloo Bhaijaan","Rubik Mono One","Lalezar","Krona One","Merienda","Coda Caption","Cutive Mono","Nova Flat","Pangolin","Aladin","Bowlby One","Henny Penny","Itim","Meie Script","Libre Barcode 39 Extended Text","Macondo","Baloo","Chau Philomene One","Amaranth","Arya","Ranga","Share Tech","Press Start 2P","Rammetto One"]}}
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: customizer,options framework, theme, mods, toolkit
4
  Donate link: https://aristath.github.io/donate
5
  Requires at least: 4.9
6
  Tested up to: 4.9.2
7
- Stable tag: 3.0.25
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -33,6 +33,33 @@ If you want to integrate Kirki in your theme or plugin, please read the instruct
33
 
34
  == Changelog ==
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  = 3.0.25 =
37
 
38
  January 23 2018, dev time: 1 hour.
4
  Donate link: https://aristath.github.io/donate
5
  Requires at least: 4.9
6
  Tested up to: 4.9.2
7
+ Stable tag: 3.0.26
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
33
 
34
  == Changelog ==
35
 
36
+ = 3.0.26
37
+
38
+ April 27 2018, dev time: 43 hours.
39
+
40
+ * Fix: Color Palette: material colors 'light-blue' doesn't work [#1783](https://github.com/aristath/kirki/issues/1783).
41
+ * Fix: Google Fonts switch error [#1791](https://github.com/aristath/kirki/issues/1791).
42
+ * Fix: FontAwesome JS is being loaded even if you don't need it on front end [#1786](https://github.com/aristath/kirki/issues/1786).
43
+ * Fix: Color Palette: Active color before section title [#1782](https://github.com/aristath/kirki/issues/1782).
44
+ * Fix: Removed version from the webfont script.
45
+ * Fix: Validation error for dimension fields.
46
+ * Fix: `button_label` argument for repeater fields (props @felipeelia).
47
+ * Fix: Allow html on radio-buttonset choices [#1818](https://github.com/aristath/kirki/issues/1818).
48
+ * Fix: `Kirki_Helper::compare_values` vs. `field-dependencies.js` boolean issue (props @CaptJiggly) [#1825](https://github.com/aristath/kirki/issues/1825).
49
+ * Fix: `active_callback` not working for checkboxes [#1809](https://github.com/aristath/kirki/issues/1809).
50
+ * Fix: Nested `active_callback` args not working properly (AND|OR relations) [#1809](https://github.com/aristath/kirki/issues/1809).
51
+ * Fix: Updated google-fonts.
52
+ * Fix: Display typography with no default values [#1797](https://github.com/aristath/kirki/issues/1797).
53
+ * Fix: Define "normal" as a valid css-value for sanitizations [#1814](https://github.com/aristath/kirki/issues/1814).
54
+ * Fix: `background` controls now output `background-color` as simply `background` if no `background-image` is defined in the value [#1808](https://github.com/aristath/kirki/issues/1808).
55
+ * Fix: @media-queries fix due to minimized CSS. [#1787](https://github.com/aristath/kirki/issues/1787).
56
+ * Fix: `Kirki_Helper::compare_values` contains/in PHP warning if value doesn't exist in array [#1828](https://github.com/aristath/kirki/issues/1828).
57
+ * Fix: Invalid Value in the Dimension control [#1844](https://github.com/aristath/kirki/issues/1844).
58
+ * Fix: Add `fr` to the array of valid units used in validations [
59
+ 86adedb](https://github.com/aristath/kirki/pull/1784/commits/86adedb8cd4c06c7e6538c3087233a6840dee562)
60
+ * Fix: Updated webfonts.
61
+ * New: Migrated `number` control to new structure.
62
+
63
  = 3.0.25 =
64
 
65
  January 23 2018, dev time: 1 hour.