Kirki - Version 0.5

Version Description

= * New: Automatic output of styles for generic controls. * New: Automatic output of styles + scripts for fonts (including googlefonts ) * New: The 'output' argument on background controls is now an array for consistency with other controls. Older syntax is still compatible though. :) * New: Add the ability to auto-generate styles for colors. * Fix: Add a blank stylesheet if we need one and no stylesheet_id has been defined in the config options. * Fix: CSS-only tooltips. Fixes issue with tooltips now showing up on WP >

Download this release

Release Info

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

Code changes from version 0.3 to 0.5

Files changed (37) hide show
  1. LICENSE +0 -0
  2. README.md +0 -0
  3. assets/css/customizer.css +25 -41
  4. assets/css/hint.css +293 -0
  5. assets/css/jquery-ui-1.10.0.custom.css +0 -0
  6. assets/css/kirki-styles.css +0 -0
  7. assets/images/ui-icons_f6cf3b_256x240.png +0 -0
  8. assets/js/customizer.js +2 -22
  9. assets/js/tooltipsy.min.js +0 -20
  10. includes/class-Kirki_Color.php +121 -0
  11. includes/class-Kirki_Controls.php +302 -0
  12. includes/class-Kirki_Fonts.php +7201 -0
  13. includes/class-Kirki_Scripts.php +296 -0
  14. includes/class-Kirki_Settings.php +232 -0
  15. includes/class-Kirki_Style_Background.php +79 -0
  16. includes/class-Kirki_Style_Color.php +47 -0
  17. includes/class-Kirki_Style_Fonts.php +135 -0
  18. includes/class-Kirki_Style_Generic.php +67 -0
  19. includes/controls/class-Kirki_Customize_Checkbox_Control.php +2 -39
  20. includes/controls/class-Kirki_Customize_Color_Control.php +12 -40
  21. includes/controls/class-Kirki_Customize_Group_Title_Control.php +26 -0
  22. includes/controls/class-Kirki_Customize_Image_Control.php +7 -44
  23. includes/controls/class-Kirki_Customize_Multicheck_Control.php +2 -37
  24. includes/controls/class-Kirki_Customize_Number_Control.php +2 -7
  25. includes/controls/class-Kirki_Customize_Radio_Control.php +5 -44
  26. includes/controls/class-Kirki_Customize_Sliderui_Control.php +5 -44
  27. includes/controls/class-Kirki_Customize_Text_Control.php +2 -38
  28. includes/controls/class-Kirki_Customize_Textarea_Control.php +2 -38
  29. includes/controls/class-Kirki_Customize_Upload_Control.php +4 -40
  30. includes/controls/class-Kirki_Select_Control.php +2 -38
  31. includes/controls/controls-init.php +0 -385
  32. includes/deprecated.php +21 -0
  33. includes/functions/background-css.php +0 -62
  34. includes/functions/color-functions.php +0 -126
  35. includes/required.php +55 -0
  36. kirki.php +72 -128
  37. readme.txt +45 -10
LICENSE CHANGED
File without changes
README.md CHANGED
File without changes
assets/css/customizer.css CHANGED
@@ -1,12 +1,3 @@
1
- body {
2
- font-family: 'Roboto', sans-serif;
3
- }
4
-
5
- h3,
6
- .customize-control-title {
7
- font-family: 'Roboto Slab', serif;
8
- }
9
-
10
  li.customize-control.customize-control-slider input[type=text] {
11
  width: 20%;
12
  float: left;
@@ -54,38 +45,10 @@ li .image.ui-buttonset label.ui-button {
54
  }
55
 
56
  .customizer-subtitle {
57
- color: #999;
58
  font-size: 0.9em;
59
  margin-bottom: 5px;
60
  }
61
 
62
- #customize-info .accordion-section-title,
63
- #customize-info .accordion-section-title:hover {
64
- color: #fff;
65
- }
66
-
67
- #customize-theme-controls .accordion-section-title {
68
- color: #fff;
69
- }
70
-
71
- #customize-theme-controls .control-section .accordion-section-title {
72
- color: #fff;
73
- }
74
-
75
- #customize-theme-controls .control-section .accordion-section-title:focus,
76
- #customize-theme-controls .control-section .accordion-section-title:hover,
77
- #customize-theme-controls .control-section.open .accordion-section-title,
78
- #customize-theme-controls .control-section:hover .accordion-section-title {
79
- color: #fff;
80
- }
81
-
82
- #customize-theme-controls .control-section .accordion-section-title:focus::after,
83
- #customize-theme-controls .control-section .accordion-section-title:hover::after,
84
- #customize-theme-controls .control-section.open .accordion-section-title::after,
85
- #customize-theme-controls .control-section:hover .accordion-section-title::after {
86
- color: #fff;
87
- }
88
-
89
  div.kirki-customizer {
90
  height: 80px;
91
  }
@@ -115,10 +78,6 @@ div.kirki-customizer {
115
  border: 0px !important;
116
  }
117
 
118
- .customize-control-title {
119
- color: #555;
120
- }
121
-
122
  li.customize-control {
123
  margin: 5px 0;
124
  }
@@ -130,3 +89,28 @@ li.customize-control {
130
  div.kirki-customizer {
131
  border-bottom: 1px solid rgba( 255, 255, 255, 0.2 );
132
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  li.customize-control.customize-control-slider input[type=text] {
2
  width: 20%;
3
  float: left;
45
  }
46
 
47
  .customizer-subtitle {
 
48
  font-size: 0.9em;
49
  margin-bottom: 5px;
50
  }
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  div.kirki-customizer {
53
  height: 80px;
54
  }
78
  border: 0px !important;
79
  }
80
 
 
 
 
 
81
  li.customize-control {
82
  margin: 5px 0;
83
  }
89
  div.kirki-customizer {
90
  border-bottom: 1px solid rgba( 255, 255, 255, 0.2 );
91
  }
92
+
93
+ .hide {
94
+ display: none;
95
+ }
96
+
97
+ li.customize-control.customize-control-group_title {
98
+ background: #f7f7f7;
99
+ margin: 20px -20px;
100
+ padding: 5px 20px 0;
101
+ border-bottom: 1px solid #dedede;
102
+ border-top: 1px solid #dedede;
103
+ }
104
+
105
+ a.hint--left:after {
106
+ height: auto;
107
+ margin-bottom: -14px;
108
+ width: 250px;
109
+ max-width: 250px;
110
+ display: block;
111
+ white-space: normal;
112
+ text-align: right;
113
+ position: relative;
114
+ top: -22px;
115
+ left: -270px;
116
+ }
assets/css/hint.css ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! Hint.css - v1.3.3 - 2014-07-06
2
+ * http://kushagragour.in/lab/hint/
3
+ * Copyright (c) 2014 Kushagra Gour; Licensed MIT */
4
+
5
+ /*-------------------------------------*\
6
+ HINT.css - A CSS tooltip library
7
+ \*-------------------------------------*/
8
+ /**
9
+ * HINT.css is a tooltip library made in pure CSS.
10
+ *
11
+ * Source: https://github.com/chinchang/hint.css
12
+ * Demo: http://kushagragour.in/lab/hint/
13
+ *
14
+ * Release under The MIT License
15
+ *
16
+ */
17
+ /**
18
+ * source: hint-core.scss
19
+ *
20
+ * Defines the basic styling for the tooltip.
21
+ * Each tooltip is made of 2 parts:
22
+ * 1) body (:after)
23
+ * 2) arrow (:before)
24
+ *
25
+ * Classes added:
26
+ * 1) hint
27
+ */
28
+ .hint, [data-hint] {
29
+ position: relative;
30
+ display: inline-block;
31
+ /**
32
+ * tooltip arrow
33
+ */
34
+ /**
35
+ * tooltip body
36
+ */ }
37
+ .hint:before, .hint:after, [data-hint]:before, [data-hint]:after {
38
+ position: absolute;
39
+ -webkit-transform: translate3d(0, 0, 0);
40
+ -moz-transform: translate3d(0, 0, 0);
41
+ transform: translate3d(0, 0, 0);
42
+ visibility: hidden;
43
+ opacity: 0;
44
+ z-index: 1000000;
45
+ pointer-events: none;
46
+ -webkit-transition: 0.3s ease;
47
+ -moz-transition: 0.3s ease;
48
+ transition: 0.3s ease;
49
+ -webkit-transition-delay: 0ms;
50
+ -moz-transition-delay: 0ms;
51
+ transition-delay: 0ms; }
52
+ .hint:hover:before, .hint:hover:after, .hint:focus:before, .hint:focus:after, [data-hint]:hover:before, [data-hint]:hover:after, [data-hint]:focus:before, [data-hint]:focus:after {
53
+ visibility: visible;
54
+ opacity: 1; }
55
+ .hint:hover:before, .hint:hover:after, [data-hint]:hover:before, [data-hint]:hover:after {
56
+ -webkit-transition-delay: 100ms;
57
+ -moz-transition-delay: 100ms;
58
+ transition-delay: 100ms; }
59
+ .hint:before, [data-hint]:before {
60
+ content: '';
61
+ position: absolute;
62
+ background: transparent;
63
+ border: 6px solid transparent;
64
+ z-index: 1000001; }
65
+ .hint:after, [data-hint]:after {
66
+ content: attr(data-hint);
67
+ background: #383838;
68
+ color: white;
69
+ padding: 8px 10px;
70
+ font-size: 12px;
71
+ line-height: 12px;
72
+ white-space: nowrap; }
73
+
74
+ /**
75
+ * source: hint-position.scss
76
+ *
77
+ * Defines the positoning logic for the tooltips.
78
+ *
79
+ * Classes added:
80
+ * 1) hint--top
81
+ * 2) hint--bottom
82
+ * 3) hint--left
83
+ * 4) hint--right
84
+ */
85
+ /**
86
+ * set default color for tooltip arrows
87
+ */
88
+ .hint--top:before {
89
+ border-top-color: #383838; }
90
+
91
+ .hint--bottom:before {
92
+ border-bottom-color: #383838; }
93
+
94
+ .hint--left:before {
95
+ border-left-color: #383838; }
96
+
97
+ .hint--right:before {
98
+ border-right-color: #383838; }
99
+
100
+ /**
101
+ * top tooltip
102
+ */
103
+ .hint--top:before {
104
+ margin-bottom: -12px; }
105
+ .hint--top:after {
106
+ margin-left: -18px; }
107
+ .hint--top:before, .hint--top:after {
108
+ bottom: 100%;
109
+ left: 50%; }
110
+ .hint--top:hover:after, .hint--top:hover:before, .hint--top:focus:after, .hint--top:focus:before {
111
+ -webkit-transform: translateY(-8px);
112
+ -moz-transform: translateY(-8px);
113
+ transform: translateY(-8px); }
114
+
115
+ /**
116
+ * bottom tooltip
117
+ */
118
+ .hint--bottom:before {
119
+ margin-top: -12px; }
120
+ .hint--bottom:after {
121
+ margin-left: -18px; }
122
+ .hint--bottom:before, .hint--bottom:after {
123
+ top: 100%;
124
+ left: 50%; }
125
+ .hint--bottom:hover:after, .hint--bottom:hover:before, .hint--bottom:focus:after, .hint--bottom:focus:before {
126
+ -webkit-transform: translateY(8px);
127
+ -moz-transform: translateY(8px);
128
+ transform: translateY(8px); }
129
+
130
+ /**
131
+ * right tooltip
132
+ */
133
+ .hint--right:before {
134
+ margin-left: -12px;
135
+ margin-bottom: -6px; }
136
+ .hint--right:after {
137
+ margin-bottom: -14px; }
138
+ .hint--right:before, .hint--right:after {
139
+ left: 100%;
140
+ bottom: 50%; }
141
+ .hint--right:hover:after, .hint--right:hover:before, .hint--right:focus:after, .hint--right:focus:before {
142
+ -webkit-transform: translateX(8px);
143
+ -moz-transform: translateX(8px);
144
+ transform: translateX(8px); }
145
+
146
+ /**
147
+ * left tooltip
148
+ */
149
+ .hint--left:before {
150
+ margin-right: -12px;
151
+ margin-bottom: -6px; }
152
+ .hint--left:after {
153
+ margin-bottom: -14px; }
154
+ .hint--left:before, .hint--left:after {
155
+ right: 100%;
156
+ bottom: 50%; }
157
+ .hint--left:hover:after, .hint--left:hover:before, .hint--left:focus:after, .hint--left:focus:before {
158
+ -webkit-transform: translateX(-8px);
159
+ -moz-transform: translateX(-8px);
160
+ transform: translateX(-8px); }
161
+
162
+ /**
163
+ * source: hint-color-types.scss
164
+ *
165
+ * Contains tooltips of various types based on color differences.
166
+ *
167
+ * Classes added:
168
+ * 1) hint--error
169
+ * 2) hint--warning
170
+ * 3) hint--info
171
+ * 4) hint--success
172
+ *
173
+ */
174
+ /**
175
+ * Error
176
+ */
177
+ .hint--error:after {
178
+ background-color: #b34e4d;
179
+ text-shadow: 0 -1px 0px #592726; }
180
+ .hint--error.hint--top:before {
181
+ border-top-color: #b34e4d; }
182
+ .hint--error.hint--bottom:before {
183
+ border-bottom-color: #b34e4d; }
184
+ .hint--error.hint--left:before {
185
+ border-left-color: #b34e4d; }
186
+ .hint--error.hint--right:before {
187
+ border-right-color: #b34e4d; }
188
+
189
+ /**
190
+ * Warning
191
+ */
192
+ .hint--warning:after {
193
+ background-color: #c09854;
194
+ text-shadow: 0 -1px 0px #6c5328; }
195
+ .hint--warning.hint--top:before {
196
+ border-top-color: #c09854; }
197
+ .hint--warning.hint--bottom:before {
198
+ border-bottom-color: #c09854; }
199
+ .hint--warning.hint--left:before {
200
+ border-left-color: #c09854; }
201
+ .hint--warning.hint--right:before {
202
+ border-right-color: #c09854; }
203
+
204
+ /**
205
+ * Info
206
+ */
207
+ .hint--info:after {
208
+ background-color: #3986ac;
209
+ text-shadow: 0 -1px 0px #193b4d; }
210
+ .hint--info.hint--top:before {
211
+ border-top-color: #3986ac; }
212
+ .hint--info.hint--bottom:before {
213
+ border-bottom-color: #3986ac; }
214
+ .hint--info.hint--left:before {
215
+ border-left-color: #3986ac; }
216
+ .hint--info.hint--right:before {
217
+ border-right-color: #3986ac; }
218
+
219
+ /**
220
+ * Success
221
+ */
222
+ .hint--success:after {
223
+ background-color: #458746;
224
+ text-shadow: 0 -1px 0px #1a321a; }
225
+ .hint--success.hint--top:before {
226
+ border-top-color: #458746; }
227
+ .hint--success.hint--bottom:before {
228
+ border-bottom-color: #458746; }
229
+ .hint--success.hint--left:before {
230
+ border-left-color: #458746; }
231
+ .hint--success.hint--right:before {
232
+ border-right-color: #458746; }
233
+
234
+ /**
235
+ * source: hint-always.scss
236
+ *
237
+ * Defines a persisted tooltip which shows always.
238
+ *
239
+ * Classes added:
240
+ * 1) hint--always
241
+ *
242
+ */
243
+ .hint--always:after, .hint--always:before {
244
+ opacity: 1;
245
+ visibility: visible; }
246
+ .hint--always.hint--top:after, .hint--always.hint--top:before {
247
+ -webkit-transform: translateY(-8px);
248
+ -moz-transform: translateY(-8px);
249
+ transform: translateY(-8px); }
250
+ .hint--always.hint--bottom:after, .hint--always.hint--bottom:before {
251
+ -webkit-transform: translateY(8px);
252
+ -moz-transform: translateY(8px);
253
+ transform: translateY(8px); }
254
+ .hint--always.hint--left:after, .hint--always.hint--left:before {
255
+ -webkit-transform: translateX(-8px);
256
+ -moz-transform: translateX(-8px);
257
+ transform: translateX(-8px); }
258
+ .hint--always.hint--right:after, .hint--always.hint--right:before {
259
+ -webkit-transform: translateX(8px);
260
+ -moz-transform: translateX(8px);
261
+ transform: translateX(8px); }
262
+
263
+ /**
264
+ * source: hint-rounded.scss
265
+ *
266
+ * Defines rounded corner tooltips.
267
+ *
268
+ * Classes added:
269
+ * 1) hint--rounded
270
+ *
271
+ */
272
+ .hint--rounded:after {
273
+ border-radius: 4px; }
274
+
275
+ /**
276
+ * source: hint-effects.scss
277
+ *
278
+ * Defines various transition effects for the tooltips.
279
+ *
280
+ * Classes added:
281
+ * 1) hint--no-animate
282
+ * 2) hint--bounce
283
+ *
284
+ */
285
+ .hint--no-animate:before, .hint--no-animate:after {
286
+ -webkit-transition-duration: 0ms;
287
+ -moz-transition-duration: 0ms;
288
+ transition-duration: 0ms; }
289
+
290
+ .hint--bounce:before, .hint--bounce:after {
291
+ -webkit-transition: opacity 0.3s ease, visibility 0.3s ease, -webkit-transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24);
292
+ -moz-transition: opacity 0.3s ease, visibility 0.3s ease, -moz-transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24);
293
+ transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24); }
assets/css/jquery-ui-1.10.0.custom.css CHANGED
File without changes
assets/css/kirki-styles.css ADDED
File without changes
assets/images/ui-icons_f6cf3b_256x240.png CHANGED
File without changes
assets/js/customizer.js CHANGED
@@ -1,25 +1,5 @@
1
  jQuery.noConflict();
2
-
3
- /** Fire up jQuery - let's dance!
4
- */
5
  jQuery(document).ready(function($){
6
-
7
- $('a.tooltip').tooltipsy({
8
- offset: [10, 0],
9
- css: {
10
- 'padding': '6px 15px',
11
- 'max-width': '200px',
12
- 'color': '#f7f7f7',
13
- 'background-color': '#222222',
14
- 'border': '1px solid #333333',
15
- '-moz-box-shadow': '0 0 10px rgba(0, 0, 0, .5)',
16
- '-webkit-box-shadow': '0 0 10px rgba(0, 0, 0, .5)',
17
- 'box-shadow': '0 0 10px rgba(0, 0, 0, .5)',
18
- 'text-shadow': 'none',
19
- 'border-radius' : '3px'
20
- }
21
- });
22
-
23
  });
24
-
25
-
1
  jQuery.noConflict();
2
+ /** Fire up jQuery - let's dance! */
 
 
3
  jQuery(document).ready(function($){
4
+ $("a.tooltip").tooltip();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  });
 
 
assets/js/tooltipsy.min.js DELETED
@@ -1,20 +0,0 @@
1
- /* tooltipsy by Brian Cray
2
- * Lincensed under GPL2 - http://www.gnu.org/licenses/gpl-2.0.html
3
- * Option quick reference:
4
- * - alignTo: "element" or "cursor" (Defaults to "element")
5
- * - offset: Tooltipsy distance from element or mouse cursor, dependent on alignTo setting. Set as array [x, y] (Defaults to [0, -1])
6
- * - content: HTML or text content of tooltip. Defaults to "" (empty string), which pulls content from target element's title attribute
7
- * - show: function(event, tooltip) to show the tooltip. Defaults to a show(100) effect
8
- * - hide: function(event, tooltip) to hide the tooltip. Defaults to a fadeOut(100) effect
9
- * - delay: A delay in milliseconds before showing a tooltip. Set to 0 for no delay. Defaults to 200
10
- * - css: object containing CSS properties and values. Defaults to {} to use stylesheet for styles
11
- * - className: DOM class for styling tooltips with CSS. Defaults to "tooltipsy"
12
- * - showEvent: Set a custom event to bind the show function. Defaults to mouseenter
13
- * - hideEvent: Set a custom event to bind the show function. Defaults to mouseleave
14
- * Method quick reference:
15
- * - $('element').data('tooltipsy').show(): Force the tooltip to show
16
- * - $('element').data('tooltipsy').hide(): Force the tooltip to hide
17
- * - $('element').data('tooltipsy').destroy(): Remove tooltip from DOM
18
- * More information visit http://tooltipsy.com/
19
- */
20
- ;(function(a){a.tooltipsy=function(c,b){this.options=b;this.$el=a(c);this.title=this.$el.attr("title")||"";this.$el.attr("title","");this.random=parseInt(Math.random()*10000);this.ready=false;this.shown=false;this.width=0;this.height=0;this.delaytimer=null;this.$el.data("tooltipsy",this);this.init()};a.tooltipsy.prototype={init:function(){var e=this,d,b=e.$el,c=b[0];e.settings=d=a.extend({},e.defaults,e.options);d.delay=+d.delay;if(typeof d.content==="function"){e.readify()}if(d.showEvent===d.hideEvent&&d.showEvent==="click"){b.toggle(function(f){if(d.showEvent==="click"&&c.tagName=="A"){f.preventDefault()}if(d.delay>0){e.delaytimer=window.setTimeout(function(){e.show(f)},d.delay)}else{e.show(f)}},function(f){if(d.showEvent==="click"&&c.tagName=="A"){f.preventDefault()}window.clearTimeout(e.delaytimer);e.delaytimer=null;e.hide(f)})}else{b.bind(d.showEvent,function(f){if(d.showEvent==="click"&&c.tagName=="A"){f.preventDefault()}e.delaytimer=window.setTimeout(function(){e.show(f)},d.delay||0)}).bind(d.hideEvent,function(f){if(d.showEvent==="click"&&c.tagName=="A"){f.preventDefault()}window.clearTimeout(e.delaytimer);e.delaytimer=null;e.hide(f)})}},show:function(i){if(this.ready===false){this.readify()}var b=this,f=b.settings,h=b.$tipsy,k=b.$el,d=k[0],g=b.offset(d);if(b.shown===false){if((function(m){var l=0,e;for(e in m){if(m.hasOwnProperty(e)){l++}}return l})(f.css)>0){b.$tip.css(f.css)}b.width=h.outerWidth();b.height=h.outerHeight()}if(f.alignTo==="cursor"&&i){var j=[i.clientX+f.offset[0],i.clientY+f.offset[1]];if(j[0]+b.width>a(window).width()){var c={top:j[1]+"px",right:j[0]+"px",left:"auto"}}else{var c={top:j[1]+"px",left:j[0]+"px",right:"auto"}}}else{var j=[(function(){if(f.offset[0]<0){return g.left-Math.abs(f.offset[0])-b.width}else{if(f.offset[0]===0){return g.left-((b.width-k.outerWidth())/2)}else{return g.left+k.outerWidth()+f.offset[0]}}})(),(function(){if(f.offset[1]<0){return g.top-Math.abs(f.offset[1])-b.height}else{if(f.offset[1]===0){return g.top-((b.height-b.$el.outerHeight())/2)}else{return g.top+b.$el.outerHeight()+f.offset[1]}}})()]}h.css({top:j[1]+"px",left:j[0]+"px"});b.settings.show(i,h.stop(true,true))},hide:function(c){var b=this;if(b.ready===false){return}if(c&&c.relatedTarget===b.$tip[0]){b.$tip.bind("mouseleave",function(d){if(d.relatedTarget===b.$el[0]){return}b.settings.hide(d,b.$tipsy.stop(true,true))});return}b.settings.hide(c,b.$tipsy.stop(true,true))},readify:function(){this.ready=true;this.$tipsy=a('<div id="tooltipsy'+this.random+'" style="position:fixed;z-index:2147483647;display:none">').appendTo("body");this.$tip=a('<div class="'+this.settings.className+'">').appendTo(this.$tipsy);this.$tip.data("rootel",this.$el);var c=this.$el;var b=this.$tip;this.$tip.html(this.settings.content!=""?(typeof this.settings.content=="string"?this.settings.content:this.settings.content(c,b)):this.title)},offset:function(b){return this.$el[0].getBoundingClientRect()},destroy:function(){if(this.$tipsy){this.$tipsy.remove();a.removeData(this.$el,"tooltipsy")}},defaults:{alignTo:"element",offset:[0,-1],content:"",show:function(c,b){b.fadeIn(100)},hide:function(c,b){b.fadeOut(100)},css:{},className:"tooltipsy",delay:200,showEvent:"mouseenter",hideEvent:"mouseleave"}};a.fn.tooltipsy=function(b){return this.each(function(){new a.tooltipsy(this,b)})}})(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-Kirki_Color.php ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Color {
4
+
5
+ /**
6
+ * Sanitize hex colors
7
+ */
8
+ public static function sanitize_hex( $color ) {
9
+
10
+ // Remove any spaces and special characters before and after the string
11
+ $color = trim( $color. ' \t\n\r\0\x0B' );
12
+ // Remove any trailing '#' symbols from the color value
13
+ $color = str_replace( '#', '', $color );
14
+ // If there are more than 6 characters, only keep the first 6.
15
+ $color = ( strlen( $color ) > 6 ) ? substr( $color, 0, 6 ) : $color;
16
+
17
+ if ( strlen( $color ) == 6 ) {
18
+
19
+ $hex = $color; // If string consists of 6 characters, then this is our color
20
+
21
+ } else {
22
+
23
+ // String is shorter than 6 characters.
24
+ // We will have to do some calculations below to get the actual 6-digit hex value.
25
+
26
+ // If the string is longer than 3 characters, only keep the first 3.
27
+ $color = ( strlen( $color ) > 3 ) ? substr( $color, 0, 3 ) : $color;
28
+
29
+ // If this is a 3-character string, format it to 6 characters.
30
+ if ( 3 == strlen( $color ) ) {
31
+
32
+ $red = substr( $color, 0, 1 ) . substr( $color, 0, 1 );
33
+ $green = substr( $color, 1, 1 ) . substr( $color, 1, 1 );
34
+ $blue = substr( $color, 2, 1 ) . substr( $color, 2, 1 );
35
+
36
+ $hex = $red . $green . $blue;
37
+
38
+ }
39
+
40
+ // If this is shorter than 3 characters, do some voodoo.
41
+ if ( 2 == strlen( $color ) ) {
42
+ $hex = $color . $color . $color;
43
+ } else if ( 1 == strlen( $color ) ) {
44
+ $hex = $color . $color . $color . $color . $color . $color;
45
+ }
46
+
47
+ }
48
+
49
+ return '#' . $hex;
50
+
51
+ }
52
+
53
+ /*
54
+ * Gets the rgb value of the $hex color.
55
+ * Returns an array.
56
+ */
57
+ public static function get_rgb( $hex, $implode = false ) {
58
+
59
+ // Remove any trailing '#' symbols from the color value
60
+ $hex = str_replace( '#', '', self::sanitize_hex( $hex ) );
61
+
62
+ $red = hexdec( substr( $hex, 0, 2 ) );
63
+ $green = hexdec( substr( $hex, 2, 2 ) );
64
+ $blue = hexdec( substr( $hex, 4, 2 ) );
65
+
66
+ // rgb is an array
67
+ $rgb = array( $red, $green, $blue );
68
+ if ( $implode ) {
69
+ return implode( ',', $rgb );
70
+ } else {
71
+ return $rgb;
72
+ }
73
+
74
+ }
75
+
76
+ /*
77
+ * Gets the rgba value of a color.
78
+ */
79
+ public static function get_rgba( $hex = '#fff', $opacity = 100 ) {
80
+
81
+ $hex = self::sanitize_hex( $hex );
82
+
83
+ if ( 100 <= $opacity ) { // Set the opacity to 100 if a larger value has been entered by mistake.
84
+ $opacity = 100;
85
+ } elseif ( 0 > $opacity ) { // If a negative value is used, then set to 0.
86
+ $opacity = 0;
87
+ } elseif ( $opacity < 1 && $opacity != 0 ) { // If an opacity value is entered in a decimal form (for example 0.25), then multiply by 100.
88
+ $opacity = ( $opacity * 100 );
89
+ } else { // Normal value has been entered
90
+ $opacity = $opacity;
91
+ }
92
+
93
+ // Divide the opacity by 100 to end-up with a CSS value for the opacity
94
+ $opacity = ( $opacity / 100 );
95
+
96
+ $color = 'rgba(' . self::get_rgb( $hex, true ) . ', ' . $opacity . ')';
97
+
98
+ return $color;
99
+
100
+ }
101
+
102
+ /*
103
+ * Gets the brightness of the $hex color.
104
+ * Returns a value between 0 and 255
105
+ */
106
+ public static function get_brightness( $hex ) {
107
+
108
+ $hex = self::sanitize_hex( $hex );
109
+ // returns brightness value from 0 to 255
110
+ // strip off any leading #
111
+ $hex = str_replace( '#', '', $hex );
112
+
113
+ $red = hexdec( substr( $hex, 0, 2 ) );
114
+ $green = hexdec( substr( $hex, 2, 2 ) );
115
+ $blue = hexdec( substr( $hex, 4, 2 ) );
116
+
117
+ return ( ( $red * 299 ) + ( $green * 587 ) + ( $blue * 114 ) ) / 1000;
118
+
119
+ }
120
+
121
+ }
includes/class-Kirki_Controls.php ADDED
@@ -0,0 +1,302 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class Kirki_Controls extends Kirki {
5
+
6
+ function add_control( $wp_customize, $control ) {
7
+
8
+ // Checkbox control
9
+ if ( 'checkbox' == $control['type'] ) {
10
+
11
+ $wp_customize->add_control( new Kirki_Customize_Checkbox_Control( $wp_customize, $control['setting'], array(
12
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
13
+ 'section' => $control['section'],
14
+ 'settings' => $control['setting'],
15
+ 'priority' => $control['priority'],
16
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
17
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
18
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
19
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
20
+ ) ) );
21
+
22
+ // Background Control
23
+ } elseif ( 'background' == $control['type'] ) {
24
+
25
+ $wp_customize->add_control( new Kirki_Customize_Color_Control( $wp_customize, $control['setting'] . '_color', array(
26
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
27
+ 'section' => $control['section'],
28
+ 'settings' => $control['setting'] . '_color',
29
+ 'priority' => $control['priority'],
30
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
31
+ 'subtitle' => __( 'Background Color', 'kirki' ),
32
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
33
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
34
+ ) ) );
35
+
36
+ $wp_customize->add_control( new Kirki_Customize_Image_Control( $wp_customize, $control['setting'] . '_image', array(
37
+ 'label' => null,
38
+ 'section' => $control['section'],
39
+ 'settings' => $control['setting'] . '_image',
40
+ 'priority' => $control['priority'] + 1,
41
+ 'description' => null,
42
+ 'subtitle' => __( 'Background Image', 'kirki' ),
43
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
44
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
45
+ ) ) );
46
+
47
+ $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'] . '_repeat', array(
48
+ 'label' => null,
49
+ 'section' => $control['section'],
50
+ 'settings' => $control['setting'] . '_repeat',
51
+ 'priority' => $control['priority'] + 2,
52
+ 'choices' => array(
53
+ 'no-repeat' => __( 'No Repeat', 'kirki' ),
54
+ 'repeat' => __( 'Repeat All', 'kirki' ),
55
+ 'repeat-x' => __( 'Repeat Horizontally', 'kirki' ),
56
+ 'repeat-y' => __( 'Repeat Vertically', 'kirki' ),
57
+ 'inherit' => __( 'Inherit', 'kirki' )
58
+ ),
59
+ 'description' => null,
60
+ 'subtitle' => __( 'Background Repeat', 'kirki' ),
61
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
62
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
63
+ ) ) );
64
+
65
+ $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'] . '_size', array(
66
+ 'label' => null,
67
+ 'section' => $control['section'],
68
+ 'settings' => $control['setting'] . '_size',
69
+ 'priority' => $control['priority'] + 3,
70
+ 'choices' => array(
71
+ 'inherit' => __( 'Inherit', 'kirki' ),
72
+ 'cover' => __( 'Cover', 'kirki' ),
73
+ 'contain' => __( 'Contain', 'kirki' ),
74
+ ),
75
+ 'description' => null,
76
+ 'mode' => 'buttonset',
77
+ 'subtitle' => __( 'Background Size', 'kirki' ),
78
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
79
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
80
+ ) ) );
81
+
82
+ $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'] . '_attach', array(
83
+ 'label' => null,
84
+ 'section' => $control['section'],
85
+ 'settings' => $control['setting'] . '_attach',
86
+ 'priority' => $control['priority'] + 4,
87
+ 'choices' => array(
88
+ 'inherit' => __( 'Inherit', 'kirki' ),
89
+ 'fixed' => __( 'Fixed', 'kirki' ),
90
+ 'scroll' => __( 'Scroll', 'kirki' ),
91
+ ),
92
+ 'description' => null,
93
+ 'mode' => 'buttonset',
94
+ 'subtitle' => __( 'Background Attachment', 'kirki' ),
95
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
96
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
97
+ ) ) );
98
+
99
+ $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'] . '_position', array(
100
+ 'label' => null,
101
+ 'section' => $control['section'],
102
+ 'settings' => $control['setting'] . '_position',
103
+ 'priority' => $control['priority'] + 5,
104
+ 'choices' => array(
105
+ 'left-top' => __( 'Left Top', 'kirki' ),
106
+ 'left-center' => __( 'Left Center', 'kirki' ),
107
+ 'left-bottom' => __( 'Left Bottom', 'kirki' ),
108
+ 'right-top' => __( 'Right Top', 'kirki' ),
109
+ 'right-center' => __( 'Right Center', 'kirki' ),
110
+ 'right-bottom' => __( 'Right Bottom', 'kirki' ),
111
+ 'center-top' => __( 'Center Top', 'kirki' ),
112
+ 'center-center' => __( 'Center Center', 'kirki' ),
113
+ 'center-bottom' => __( 'Center Bottom', 'kirki' ),
114
+ ),
115
+ 'description' => null,
116
+ 'subtitle' => __( 'Background Position', 'kirki' ),
117
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
118
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
119
+ ) ) );
120
+
121
+ if ( false != $control['default']['opacity'] ) {
122
+ $wp_customize->add_control( new Kirki_Customize_Sliderui_Control( $wp_customize, $control['setting'] . '_opacity', array(
123
+ 'label' => null,
124
+ 'section' => $control['section'],
125
+ 'settings' => $control['setting'] . '_opacity',
126
+ 'priority' => $control['priority'] + 6,
127
+ 'choices' => array(
128
+ 'min' => 0,
129
+ 'max' => 100,
130
+ 'step' => 1,
131
+ ),
132
+ 'description' => null,
133
+ 'subtitle' => __( 'Background Opacity', 'kirki' ),
134
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
135
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
136
+ ) ) );
137
+ }
138
+
139
+ // Color Control
140
+ } elseif ( 'color' == $control['type'] ) {
141
+
142
+ $wp_customize->add_control( new Kirki_Customize_Color_Control( $wp_customize, $control['setting'], array(
143
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
144
+ 'section' => $control['section'],
145
+ 'settings' => $control['setting'],
146
+ 'priority' => isset( $control['priority'] ) ? $control['priority'] : '',
147
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
148
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
149
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
150
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
151
+ ) ) );
152
+
153
+ // Image Control
154
+ } elseif ( 'image' == $control['type'] ) {
155
+
156
+ $wp_customize->add_control( new Kirki_Customize_Image_Control( $wp_customize, $control['setting'], array(
157
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
158
+ 'section' => $control['section'],
159
+ 'settings' => $control['setting'],
160
+ 'priority' => $control['priority'],
161
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
162
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
163
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
164
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
165
+ ) ) );
166
+
167
+ // Radio Control
168
+ } elseif ( 'radio' == $control['type'] ) {
169
+
170
+ $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'], array(
171
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
172
+ 'section' => $control['section'],
173
+ 'settings' => $control['setting'],
174
+ 'priority' => $control['priority'],
175
+ 'choices' => $control['choices'],
176
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
177
+ 'mode' => isset( $control['mode'] ) ? $control['mode'] : 'radio', // Can be 'radio', 'image' or 'buttonset'.
178
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
179
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
180
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
181
+ ) ) );
182
+
183
+ // Select Control
184
+ } elseif ( 'select' == $control['type'] ) {
185
+
186
+ $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'], array(
187
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
188
+ 'section' => $control['section'],
189
+ 'settings' => $control['setting'],
190
+ 'priority' => $control['priority'],
191
+ 'choices' => $control['choices'],
192
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
193
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
194
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
195
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
196
+ ) ) );
197
+
198
+ // Slider Control
199
+ } elseif ( 'slider' == $control['type'] ) {
200
+
201
+ $wp_customize->add_control( new Kirki_Customize_Sliderui_Control( $wp_customize, $control['setting'], array(
202
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
203
+ 'section' => $control['section'],
204
+ 'settings' => $control['setting'],
205
+ 'priority' => $control['priority'],
206
+ 'choices' => $control['choices'],
207
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
208
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
209
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
210
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
211
+ ) ) );
212
+
213
+ // Text Control
214
+ } elseif ( 'text' == $control['type'] ) {
215
+
216
+ $wp_customize->add_control( new Kirki_Customize_Text_Control( $wp_customize, $control['setting'], array(
217
+ 'label' => isset( $control['label'] ) ? $control['label'] : '',
218
+ 'section' => $control['section'],
219
+ 'settings' => $control['setting'],
220
+ 'priority' => $control['priority'],
221
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
222
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
223
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
224
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
225
+ ) ) );
226
+
227
+ // Text Control
228
+ } elseif ( 'textarea' == $control['type'] ) {
229
+
230
+ $wp_customize->add_control( new Kirki_Customize_Textarea_Control( $wp_customize, $control['setting'], array(
231
+ 'label' => $control['label'],
232
+ 'section' => $control['section'],
233
+ 'settings' => $control['setting'],
234
+ 'priority' => $control['priority'],
235
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
236
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
237
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
238
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
239
+ ) ) );
240
+
241
+ // Upload Control
242
+ } elseif ( 'upload' == $control['type'] ) {
243
+
244
+ $wp_customize->add_control( new Kirki_Customize_Upload_Control( $wp_customize, $control['setting'], array(
245
+ 'label' => $control['label'],
246
+ 'section' => $control['section'],
247
+ 'settings' => $control['setting'],
248
+ 'priority' => $control['priority'],
249
+ 'choices' => $control['choices'],
250
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
251
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
252
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
253
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
254
+ ) ) );
255
+
256
+ // Number Control
257
+ } elseif ( 'number' == $control['type'] ) {
258
+
259
+ $wp_customize->add_control( new Kirki_Customize_Number_Control( $wp_customize, $control['setting'], array(
260
+ 'label' => $control['label'],
261
+ 'section' => $control['section'],
262
+ 'settings' => $control['setting'],
263
+ 'priority' => $control['priority'],
264
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
265
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
266
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
267
+ ) ) );
268
+
269
+ // Multicheck Control
270
+ } elseif ( 'multicheck' == $control['type'] ) {
271
+
272
+ $wp_customize->add_control( new Kirki_Customize_Multicheck_Control( $wp_customize, $control['setting'], array(
273
+ 'label' => $control['label'],
274
+ 'section' => $control['section'],
275
+ 'settings' => $control['setting'],
276
+ 'priority' => $control['priority'],
277
+ 'choices' => $control['choices'],
278
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
279
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
280
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
281
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
282
+ ) ) );
283
+
284
+ // Separator Controls
285
+ } elseif ( 'group_title' == $control['type'] ) {
286
+
287
+ $wp_customize->add_control( new Kirki_Customize_Group_Title_Control( $wp_customize, $control['setting'], array(
288
+ 'label' => $control['label'],
289
+ 'section' => $control['section'],
290
+ 'settings' => $control['setting'],
291
+ 'priority' => $control['priority'],
292
+ 'description' => isset( $control['description'] ) ? $control['description'] : null,
293
+ 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
294
+ 'required' => isset( $control['required'] ) ? $control['required'] : array(),
295
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'refresh',
296
+ ) ) );
297
+
298
+ }
299
+
300
+ }
301
+
302
+ }
includes/class-Kirki_Fonts.php ADDED
@@ -0,0 +1,7201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Theme Customizer Fonts
4
+ *
5
+ * @package Customizer_Library
6
+ * @author The Theme Foundry
7
+ */
8
+
9
+
10
+ class Kirki_Fonts {
11
+
12
+ /**
13
+ * Compile font options from different sources.
14
+ *
15
+ * @return array All available fonts.
16
+ */
17
+ public static function get_all_fonts() {
18
+
19
+ $standard_fonts = self::get_standard_fonts();
20
+ $google_fonts = self::get_google_fonts();
21
+
22
+ return apply_filters( 'kirki/fonts/all', array_merge( $standard_fonts, $google_fonts ) );
23
+
24
+ }
25
+
26
+ /**
27
+ * Packages the font choices into value/label pairs for use with the customizer.
28
+ *
29
+ * @return array The fonts in value/label pairs.
30
+ */
31
+ public static function get_font_choices() {
32
+
33
+ $fonts = self::get_all_fonts();
34
+ $choices = array();
35
+
36
+ // Repackage the fonts into value/label pairs
37
+ foreach ( $fonts as $key => $font ) {
38
+
39
+ $choices[ $key ] = $font['label'];
40
+
41
+ }
42
+
43
+ return $choices;
44
+
45
+ }
46
+
47
+ /**
48
+ * Detect if this is a google font or not.
49
+ *
50
+ * @return boolean
51
+ */
52
+ public static function is_google_font( $font ) {
53
+
54
+ $allowed_fonts = self::get_google_fonts();
55
+ return ( array_key_exists( $font, $allowed_fonts ) ) ? true : false;
56
+
57
+ }
58
+
59
+
60
+ /**
61
+ * Build the HTTP request URL for Google Fonts.
62
+ *
63
+ * @return string The URL for including Google Fonts.
64
+ */
65
+ public static function get_google_font_uri( $fonts, $weight = 400, $subset = 'all' ) {
66
+
67
+ // De-dupe the fonts
68
+ $fonts = array_unique( $fonts );
69
+ $allowed_fonts = self::get_google_fonts();
70
+ $family = array();
71
+
72
+ // Validate each font and convert to URL format
73
+ foreach ( $fonts as $font ) {
74
+
75
+ $font = trim( $font );
76
+
77
+ // Verify that the font exists
78
+ if ( self::is_google_font( $font ) ) {
79
+ // Build the family name and variant string (e.g., "Open+Sans:regular,italic,700")
80
+ $family[] = urlencode( $font . ':' . join( ',', self::choose_google_font_variants( $font, $allowed_fonts[ $font ]['variants'] ) ) );
81
+ }
82
+ }
83
+
84
+ // Convert from array to string
85
+ if ( empty( $family ) ) {
86
+
87
+ return '';
88
+
89
+ } else {
90
+
91
+ $request = '//fonts.googleapis.com/css?family=' . implode( '|', $family );
92
+
93
+ }
94
+
95
+ // load the font weight
96
+ if ( is_array( $weight ) ) {
97
+
98
+ $weight = implode( ',', $weight );
99
+
100
+ }
101
+
102
+ $request .= ':' . $weight;
103
+
104
+ // Load the font subset
105
+ if ( 'all' === $subset ) {
106
+
107
+ $subsets_available = self::get_google_font_subsets();
108
+
109
+ // Remove the all set
110
+ unset( $subsets_available['all'] );
111
+
112
+ // Build the array
113
+ $subsets = array_keys( $subsets_available );
114
+
115
+ } else {
116
+
117
+ $subsets = array(
118
+ 'latin',
119
+ $subset,
120
+
121
+ );
122
+
123
+ }
124
+
125
+ // Append the subset string
126
+ if ( ! empty( $subsets ) ) {
127
+
128
+ $request .= urlencode( '&subset=' . join( ',', $subsets ) );
129
+
130
+ }
131
+
132
+ return esc_url( $request );
133
+
134
+ }
135
+
136
+ /**
137
+ * Retrieve the list of available Google font subsets.
138
+ *
139
+ * @return array The available subsets.
140
+ */
141
+ public static function get_google_font_subsets() {
142
+
143
+ return array(
144
+ 'all' => __( 'All', 'kirki' ),
145
+ 'cyrillic' => __( 'Cyrillic', 'kirki' ),
146
+ 'cyrillic-ext' => __( 'Cyrillic Extended', 'kirki' ),
147
+ 'devanagari' => __( 'Devanagari', 'kirki' ),
148
+ 'greek' => __( 'Greek', 'kirki' ),
149
+ 'greek-ext' => __( 'Greek Extended', 'kirki' ),
150
+ 'khmer' => __( 'Khmer', 'kirki' ),
151
+ 'latin' => __( 'Latin', 'kirki' ),
152
+ 'latin-ext' => __( 'Latin Extended', 'kirki' ),
153
+ 'vietnamese' => __( 'Vietnamese', 'kirki' ),
154
+ );
155
+
156
+ }
157
+
158
+ /**
159
+ * Given a font, chose the variants to load for the theme.
160
+ *
161
+ * Attempts to load regular, italic, and 700. If regular is not found, the first variant in the family is chosen. italic
162
+ * and 700 are only loaded if found. No fallbacks are loaded for those fonts.
163
+ *
164
+ * @param string $font The font to load variants for.
165
+ * @param array $variants The variants for the font.
166
+ * @return array The chosen variants.
167
+ */
168
+ public static function choose_google_font_variants( $font, $variants = array() ) {
169
+
170
+ $chosen_variants = array();
171
+
172
+ if ( empty( $variants ) ) {
173
+
174
+ $fonts = self::get_google_fonts();
175
+
176
+ if ( array_key_exists( $font, $fonts ) ) {
177
+ $variants = $fonts[ $font ]['variants'];
178
+ }
179
+
180
+ }
181
+
182
+ // If a "regular" variant is not found, get the first variant
183
+ if ( ! in_array( 'regular', $variants ) ) {
184
+
185
+ $chosen_variants[] = $variants[0];
186
+
187
+ } else {
188
+
189
+ $chosen_variants[] = 'regular';
190
+
191
+ }
192
+
193
+ // Only add "italic" if it exists
194
+ if ( in_array( 'italic', $variants ) ) {
195
+
196
+ $chosen_variants[] = 'italic';
197
+
198
+ }
199
+
200
+ // Only add "700" if it exists
201
+ if ( in_array( '700', $variants ) ) {
202
+
203
+ $chosen_variants[] = '700';
204
+
205
+ }
206
+
207
+ return apply_filters( 'kirki/font/variants', array_unique( $chosen_variants ), $font, $variants );
208
+
209
+ }
210
+
211
+ /**
212
+ * Return an array of standard websafe fonts.
213
+ *
214
+ * @return array Standard websafe fonts.
215
+ */
216
+ public static function get_standard_fonts() {
217
+
218
+ return array(
219
+ 'serif' => array(
220
+ 'label' => _x( 'Serif', 'font style', 'kirki' ),
221
+ 'stack' => 'Georgia,Times,"Times New Roman",serif'
222
+ ),
223
+ 'sans-serif' => array(
224
+ 'label' => _x( 'Sans Serif', 'font style', 'kirki' ),
225
+ 'stack' => '"Helvetica Neue",Helvetica,Arial,sans-serif'
226
+ ),
227
+ 'monospace' => array(
228
+ 'label' => _x( 'Monospaced', 'font style', 'kirki' ),
229
+ 'stack' => 'Monaco,"Lucida Sans Typewriter","Lucida Typewriter","Courier New",Courier,monospace'
230
+ )
231
+ );
232
+
233
+ }
234
+
235
+
236
+ /**
237
+ * Validate the font choice and get a font stack for it.
238
+ *
239
+ * @param string $font The 1st font in the stack.
240
+ * @return string The full font stack.
241
+ */
242
+ public static function get_font_stack( $font ) {
243
+
244
+ $all_fonts = get_all_fonts();
245
+
246
+ // Sanitize font choice
247
+ $font = self::sanitize_font_choice( $font );
248
+
249
+ $sans = '"Helvetica Neue",sans-serif';
250
+ $serif = 'Georgia, serif';
251
+
252
+ // Use stack if one is identified
253
+ if ( isset( $all_fonts[ $font ]['stack'] ) && ! empty( $all_fonts[ $font ]['stack'] ) ) {
254
+
255
+ $stack = $all_fonts[ $font ]['stack'];
256
+
257
+ } else {
258
+
259
+ $stack = '"' . $font . '",' . $sans;
260
+
261
+ }
262
+
263
+ return $stack;
264
+
265
+ }
266
+
267
+
268
+ /**
269
+ * Sanitize a font choice.
270
+ *
271
+ * @param string $value The font choice.
272
+ * @return string The sanitized font choice.
273
+ */
274
+ public static function sanitize_font_choice( $value ) {
275
+
276
+ if ( is_int( $value ) ) {
277
+
278
+ // The array key is an integer, so the chosen option is a heading, not a real choice
279
+ return '';
280
+
281
+ } else if ( array_key_exists( $value, self::get_font_choices() ) ) {
282
+
283
+ return $value;
284
+
285
+ } else {
286
+
287
+ return '';
288
+
289
+ }
290
+
291
+ }
292
+
293
+
294
+ /**
295
+ * Return an array of all available Google Fonts.
296
+ *
297
+ * @return array All Google Fonts.
298
+ */
299
+ public static function get_google_fonts() {
300
+
301
+ return apply_filters( 'kirki/fonts/google_fonts', array(
302
+ 'ABeeZee' => array(
303
+ 'label' => 'ABeeZee',
304
+ 'variants' => array(
305
+ 'regular',
306
+ 'italic',
307
+ ),
308
+ 'subsets' => array(
309
+ 'latin',
310
+ ),
311
+ ),
312
+ 'Abel' => array(
313
+ 'label' => 'Abel',
314
+ 'variants' => array(
315
+ 'regular',
316
+ ),
317
+ 'subsets' => array(
318
+ 'latin',
319
+ ),
320
+ ),
321
+ 'Abril Fatface' => array(
322
+ 'label' => 'Abril Fatface',
323
+ 'variants' => array(
324
+ 'regular',
325
+ ),
326
+ 'subsets' => array(
327
+ 'latin',
328
+ 'latin-ext',
329
+ ),
330
+ ),
331
+ 'Aclonica' => array(
332
+ 'label' => 'Aclonica',
333
+ 'variants' => array(
334
+ 'regular',
335
+ ),
336
+ 'subsets' => array(
337
+ 'latin',
338
+ ),
339
+ ),
340
+ 'Acme' => array(
341
+ 'label' => 'Acme',
342
+ 'variants' => array(
343
+ 'regular',
344
+ ),
345
+ 'subsets' => array(
346
+ 'latin',
347
+ ),
348
+ ),
349
+ 'Actor' => array(
350
+ 'label' => 'Actor',
351
+ 'variants' => array(
352
+ 'regular',
353
+ ),
354
+ 'subsets' => array(
355
+ 'latin',
356
+ ),
357
+ ),
358
+ 'Adamina' => array(
359
+ 'label' => 'Adamina',
360
+ 'variants' => array(
361
+ 'regular',
362
+ ),
363
+ 'subsets' => array(
364
+ 'latin',
365
+ ),
366
+ ),
367
+ 'Advent Pro' => array(
368
+ 'label' => 'Advent Pro',
369
+ 'variants' => array(
370
+ '100',
371
+ '200',
372
+ '300',
373
+ 'regular',
374
+ '500',
375
+ '600',
376
+ '700',
377
+ ),
378
+ 'subsets' => array(
379
+ 'latin',
380
+ 'greek',
381
+ 'latin-ext',
382
+ ),
383
+ ),
384
+ 'Aguafina Script' => array(
385
+ 'label' => 'Aguafina Script',
386
+ 'variants' => array(
387
+ 'regular',
388
+ ),
389
+ 'subsets' => array(
390
+ 'latin',
391
+ 'latin-ext',
392
+ ),
393
+ ),
394
+ 'Akronim' => array(
395
+ 'label' => 'Akronim',
396
+ 'variants' => array(
397
+ 'regular',
398
+ ),
399
+ 'subsets' => array(
400
+ 'latin',
401
+ 'latin-ext',
402
+ ),
403
+ ),
404
+ 'Aladin' => array(
405
+ 'label' => 'Aladin',
406
+ 'variants' => array(
407
+ 'regular',
408
+ ),
409
+ 'subsets' => array(
410
+ 'latin',
411
+ 'latin-ext',
412
+ ),
413
+ ),
414
+ 'Aldrich' => array(
415
+ 'label' => 'Aldrich',
416
+ 'variants' => array(
417
+ 'regular',
418
+ ),
419
+ 'subsets' => array(
420
+ 'latin',
421
+ ),
422
+ ),
423
+ 'Alef' => array(
424
+ 'label' => 'Alef',
425
+ 'variants' => array(
426
+ 'regular',
427
+ '700',
428
+ ),
429
+ 'subsets' => array(
430
+ 'latin',
431
+ ),
432
+ ),
433
+ 'Alegreya' => array(
434
+ 'label' => 'Alegreya',
435
+ 'variants' => array(
436
+ 'regular',
437
+ 'italic',
438
+ '700',
439
+ '700italic',
440
+ '900',
441
+ '900italic',
442
+ ),
443
+ 'subsets' => array(
444
+ 'latin',
445
+ 'latin-ext',
446
+ ),
447
+ ),
448
+ 'Alegreya SC' => array(
449
+ 'label' => 'Alegreya SC',
450
+ 'variants' => array(
451
+ 'regular',
452
+ 'italic',
453
+ '700',
454
+ '700italic',
455
+ '900',
456
+ '900italic',
457
+ ),
458
+ 'subsets' => array(
459
+ 'latin',
460
+ 'latin-ext',
461
+ ),
462
+ ),
463
+ 'Alegreya Sans' => array(
464
+ 'label' => 'Alegreya Sans',
465
+ 'variants' => array(
466
+ '100',
467
+ '100italic',
468
+ '300',
469
+ '300italic',
470
+ 'regular',
471
+ 'italic',
472
+ '500',
473
+ '500italic',
474
+ '700',
475
+ '700italic',
476
+ '800',
477
+ '800italic',
478
+ '900',
479
+ '900italic',
480
+ ),
481
+ 'subsets' => array(
482
+ 'latin',
483
+ 'vietnamese',
484
+ 'latin-ext',
485
+ ),
486
+ ),
487
+ 'Alegreya Sans SC' => array(
488
+ 'label' => 'Alegreya Sans SC',
489
+ 'variants' => array(
490
+ '100',
491
+ '100italic',
492
+ '300',
493
+ '300italic',
494
+ 'regular',
495
+ 'italic',
496
+ '500',
497
+ '500italic',
498
+ '700',
499
+ '700italic',
500
+ '800',
501
+ '800italic',
502
+ '900',
503
+ '900italic',
504
+ ),
505
+ 'subsets' => array(
506
+ 'latin',
507
+ 'vietnamese',
508
+ 'latin-ext',
509
+ ),
510
+ ),
511
+ 'Alex Brush' => array(
512
+ 'label' => 'Alex Brush',
513
+ 'variants' => array(
514
+ 'regular',
515
+ ),
516
+ 'subsets' => array(
517
+ 'latin',
518
+ 'latin-ext',
519
+ ),
520
+ ),
521
+ 'Alfa Slab One' => array(
522
+ 'label' => 'Alfa Slab One',
523
+ 'variants' => array(
524
+ 'regular',
525
+ ),
526
+ 'subsets' => array(
527
+ 'latin',
528
+ ),
529
+ ),
530
+ 'Alice' => array(
531
+ 'label' => 'Alice',
532
+ 'variants' => array(
533
+ 'regular',
534
+ ),
535
+ 'subsets' => array(
536
+ 'latin',
537
+ ),
538
+ ),
539
+ 'Alike' => array(
540
+ 'label' => 'Alike',
541
+ 'variants' => array(
542
+ 'regular',
543
+ ),
544
+ 'subsets' => array(
545
+ 'latin',
546
+ ),
547
+ ),
548
+ 'Alike Angular' => array(
549
+ 'label' => 'Alike Angular',
550
+ 'variants' => array(
551
+ 'regular',
552
+ ),
553
+ 'subsets' => array(
554
+ 'latin',
555
+ ),
556
+ ),
557
+ 'Allan' => array(
558
+ 'label' => 'Allan',
559
+ 'variants' => array(
560
+ 'regular',
561
+ '700',
562
+ ),
563
+ 'subsets' => array(
564
+ 'latin',
565
+ 'latin-ext',
566
+ ),
567
+ ),
568
+ 'Allerta' => array(
569
+ 'label' => 'Allerta',
570
+ 'variants' => array(
571
+ 'regular',
572
+ ),
573
+ 'subsets' => array(
574
+ 'latin',
575
+ ),
576
+ ),
577
+ 'Allerta Stencil' => array(
578
+ 'label' => 'Allerta Stencil',
579
+ 'variants' => array(
580
+ 'regular',
581
+ ),
582
+ 'subsets' => array(
583
+ 'latin',
584
+ ),
585
+ ),
586
+ 'Allura' => array(
587
+ 'label' => 'Allura',
588
+ 'variants' => array(
589
+ 'regular',
590
+ ),
591
+ 'subsets' => array(
592
+ 'latin',
593
+ 'latin-ext',
594
+ ),
595
+ ),
596
+ 'Almendra' => array(
597
+ 'label' => 'Almendra',
598
+ 'variants' => array(
599
+ 'regular',
600
+ 'italic',
601
+ '700',
602
+ '700italic',
603
+ ),
604
+ 'subsets' => array(
605
+ 'latin',
606
+ 'latin-ext',
607
+ ),
608
+ ),
609
+ 'Almendra Display' => array(
610
+ 'label' => 'Almendra Display',
611
+ 'variants' => array(
612
+ 'regular',
613
+ ),
614
+ 'subsets' => array(
615
+ 'latin',
616
+ 'latin-ext',
617
+ ),
618
+ ),
619
+ 'Almendra SC' => array(
620
+ 'label' => 'Almendra SC',
621
+ 'variants' => array(
622
+ 'regular',
623
+ ),
624
+ 'subsets' => array(
625
+ 'latin',
626
+ ),
627
+ ),
628
+ 'Amarante' => array(
629
+ 'label' => 'Amarante',
630
+ 'variants' => array(
631
+ 'regular',
632
+ ),
633
+ 'subsets' => array(
634
+ 'latin',
635
+ 'latin-ext',
636
+ ),
637
+ ),
638
+ 'Amaranth' => array(
639
+ 'label' => 'Amaranth',
640
+ 'variants' => array(
641
+ 'regular',
642
+ 'italic',
643
+ '700',
644
+ '700italic',
645
+ ),
646
+ 'subsets' => array(
647
+ 'latin',
648
+ ),
649
+ ),
650
+ 'Amatic SC' => array(
651
+ 'label' => 'Amatic SC',
652
+ 'variants' => array(
653
+ 'regular',
654
+ '700',
655
+ ),
656
+ 'subsets' => array(
657
+ 'latin',
658
+ ),
659
+ ),
660
+ 'Amethysta' => array(
661
+ 'label' => 'Amethysta',
662
+ 'variants' => array(
663
+ 'regular',
664
+ ),
665
+ 'subsets' => array(
666
+ 'latin',
667
+ ),
668
+ ),
669
+ 'Anaheim' => array(
670
+ 'label' => 'Anaheim',
671
+ 'variants' => array(
672
+ 'regular',
673
+ ),
674
+ 'subsets' => array(
675
+ 'latin',
676
+ 'latin-ext',
677
+ ),
678
+ ),
679
+ 'Andada' => array(
680
+ 'label' => 'Andada',
681
+ 'variants' => array(
682
+ 'regular',
683
+ ),
684
+ 'subsets' => array(
685
+ 'latin',
686
+ 'latin-ext',
687
+ ),
688
+ ),
689
+ 'Andika' => array(
690
+ 'label' => 'Andika',
691
+ 'variants' => array(
692
+ 'regular',
693
+ ),
694
+ 'subsets' => array(
695
+ 'latin',
696
+ 'cyrillic',
697
+ 'latin-ext',
698
+ 'cyrillic-ext',
699
+ ),
700
+ ),
701
+ 'Angkor' => array(
702
+ 'label' => 'Angkor',
703
+ 'variants' => array(
704
+ 'regular',
705
+ ),
706
+ 'subsets' => array(
707
+ 'khmer',
708
+ ),
709
+ ),
710
+ 'Annie Use Your Telescope' => array(
711
+ 'label' => 'Annie Use Your Telescope',
712
+ 'variants' => array(
713
+ 'regular',
714
+ ),
715
+ 'subsets' => array(
716
+ 'latin',
717
+ ),
718
+ ),
719
+ 'Anonymous Pro' => array(
720
+ 'label' => 'Anonymous Pro',
721
+ 'variants' => array(
722
+ 'regular',
723
+ 'italic',
724
+ '700',
725
+ '700italic',
726
+ ),
727
+ 'subsets' => array(
728
+ 'latin',
729
+ 'greek-ext',
730
+ 'cyrillic',
731
+ 'greek',
732
+ 'latin-ext',
733
+ 'cyrillic-ext',
734
+ ),
735
+ ),
736
+ 'Antic' => array(
737
+ 'label' => 'Antic',
738
+ 'variants' => array(
739
+ 'regular',
740
+ ),
741
+ 'subsets' => array(
742
+ 'latin',
743
+ ),
744
+ ),
745
+ 'Antic Didone' => array(
746
+ 'label' => 'Antic Didone',
747
+ 'variants' => array(
748
+ 'regular',
749
+ ),
750
+ 'subsets' => array(
751
+ 'latin',
752
+ ),
753
+ ),
754
+ 'Antic Slab' => array(
755
+ 'label' => 'Antic Slab',
756
+ 'variants' => array(
757
+ 'regular',
758
+ ),
759
+ 'subsets' => array(
760
+ 'latin',
761
+ ),
762
+ ),
763
+ 'Anton' => array(
764
+ 'label' => 'Anton',
765
+ 'variants' => array(
766
+ 'regular',
767
+ ),
768
+ 'subsets' => array(
769
+ 'latin',
770
+ 'latin-ext',
771
+ ),
772
+ ),
773
+ 'Arapey' => array(
774
+ 'label' => 'Arapey',
775
+ 'variants' => array(
776
+ 'regular',
777
+ 'italic',
778
+ ),
779
+ 'subsets' => array(
780
+ 'latin',
781
+ ),
782
+ ),
783
+ 'Arbutus' => array(
784
+ 'label' => 'Arbutus',
785
+ 'variants' => array(
786
+ 'regular',
787
+ ),
788
+ 'subsets' => array(
789
+ 'latin',
790
+ 'latin-ext',
791
+ ),
792
+ ),
793
+ 'Arbutus Slab' => array(
794
+ 'label' => 'Arbutus Slab',
795
+ 'variants' => array(
796
+ 'regular',
797
+ ),
798
+ 'subsets' => array(
799
+ 'latin',
800
+ 'latin-ext',
801
+ ),
802
+ ),
803
+ 'Architects Daughter' => array(
804
+ 'label' => 'Architects Daughter',
805
+ 'variants' => array(
806
+ 'regular',
807
+ ),
808
+ 'subsets' => array(
809
+ 'latin',
810
+ ),
811
+ ),
812
+ 'Archivo Black' => array(
813
+ 'label' => 'Archivo Black',
814
+ 'variants' => array(
815
+ 'regular',
816
+ ),
817
+ 'subsets' => array(
818
+ 'latin',
819
+ 'latin-ext',
820
+ ),
821
+ ),
822
+ 'Archivo Narrow' => array(
823
+ 'label' => 'Archivo Narrow',
824
+ 'variants' => array(
825
+ 'regular',
826
+ 'italic',
827
+ '700',
828
+ '700italic',
829
+ ),
830
+ 'subsets' => array(
831
+ 'latin',
832
+ 'latin-ext',
833
+ ),
834
+ ),
835
+ 'Arimo' => array(
836
+ 'label' => 'Arimo',
837
+ 'variants' => array(
838
+ 'regular',
839
+ 'italic',
840
+ '700',
841
+ '700italic',
842
+ ),
843
+ 'subsets' => array(
844
+ 'latin',
845
+ 'greek-ext',
846
+ 'cyrillic',
847
+ 'greek',
848
+ 'vietnamese',
849
+ 'latin-ext',
850
+ 'cyrillic-ext',
851
+ ),
852
+ ),
853
+ 'Arizonia' => array(
854
+ 'label' => 'Arizonia',
855
+ 'variants' => array(
856
+ 'regular',
857
+ ),
858
+ 'subsets' => array(
859
+ 'latin',
860
+ 'latin-ext',
861
+ ),
862
+ ),
863
+ 'Armata' => array(
864
+ 'label' => 'Armata',
865
+ 'variants' => array(
866
+ 'regular',
867
+ ),
868
+ 'subsets' => array(
869
+ 'latin',
870
+ 'latin-ext',
871
+ ),
872
+ ),
873
+ 'Artifika' => array(
874
+ 'label' => 'Artifika',
875
+ 'variants' => array(
876
+ 'regular',
877
+ ),
878
+ 'subsets' => array(
879
+ 'latin',
880
+ ),
881
+ ),
882
+ 'Arvo' => array(
883
+ 'label' => 'Arvo',
884
+ 'variants' => array(
885
+ 'regular',
886
+ 'italic',
887
+ '700',
888
+ '700italic',
889
+ ),
890
+ 'subsets' => array(
891
+ 'latin',
892
+ ),
893
+ ),
894
+ 'Asap' => array(
895
+ 'label' => 'Asap',
896
+ 'variants' => array(
897
+ 'regular',
898
+ 'italic',
899
+ '700',
900
+ '700italic',
901
+ ),
902
+ 'subsets' => array(
903
+ 'latin',
904
+ 'latin-ext',
905
+ ),
906
+ ),
907
+ 'Asset' => array(
908
+ 'label' => 'Asset',
909
+ 'variants' => array(
910
+ 'regular',
911
+ ),
912
+ 'subsets' => array(
913
+ 'latin',
914
+ ),
915
+ ),
916
+ 'Astloch' => array(
917
+ 'label' => 'Astloch',
918
+ 'variants' => array(
919
+ 'regular',
920
+ '700',
921
+ ),
922
+ 'subsets' => array(
923
+ 'latin',
924
+ ),
925
+ ),
926
+ 'Asul' => array(
927
+ 'label' => 'Asul',
928
+ 'variants' => array(
929
+ 'regular',
930
+ '700',
931
+ ),
932
+ 'subsets' => array(
933
+ 'latin',
934
+ ),
935
+ ),
936
+ 'Atomic Age' => array(
937
+ 'label' => 'Atomic Age',
938
+ 'variants' => array(
939
+ 'regular',
940
+ ),
941
+ 'subsets' => array(
942
+ 'latin',
943
+ ),
944
+ ),
945
+ 'Aubrey' => array(
946
+ 'label' => 'Aubrey',
947
+ 'variants' => array(
948
+ 'regular',
949
+ ),
950
+ 'subsets' => array(
951
+ 'latin',
952
+ ),
953
+ ),
954
+ 'Audiowide' => array(
955
+ 'label' => 'Audiowide',
956
+ 'variants' => array(
957
+ 'regular',
958
+ ),
959
+ 'subsets' => array(
960
+ 'latin',
961
+ 'latin-ext',
962
+ ),
963
+ ),
964
+ 'Autour One' => array(
965
+ 'label' => 'Autour One',
966
+ 'variants' => array(
967
+ 'regular',
968
+ ),
969
+ 'subsets' => array(
970
+ 'latin',
971
+ 'latin-ext',
972
+ ),
973
+ ),
974
+ 'Average' => array(
975
+ 'label' => 'Average',
976
+ 'variants' => array(
977
+ 'regular',
978
+ ),
979
+ 'subsets' => array(
980
+ 'latin',
981
+ 'latin-ext',
982
+ ),
983
+ ),
984
+ 'Average Sans' => array(
985
+ 'label' => 'Average Sans',
986
+ 'variants' => array(
987
+ 'regular',
988
+ ),
989
+ 'subsets' => array(
990
+ 'latin',
991
+ 'latin-ext',
992
+ ),
993
+ ),
994
+ 'Averia Gruesa Libre' => array(
995
+ 'label' => 'Averia Gruesa Libre',
996
+ 'variants' => array(
997
+ 'regular',
998
+ ),
999
+ 'subsets' => array(
1000
+ 'latin',
1001
+ 'latin-ext',
1002
+ ),
1003
+ ),
1004
+ 'Averia Libre' => array(
1005
+ 'label' => 'Averia Libre',
1006
+ 'variants' => array(
1007
+ '300',
1008
+ '300italic',
1009
+ 'regular',
1010
+ 'italic',
1011
+ '700',
1012
+ '700italic',
1013
+ ),
1014
+ 'subsets' => array(
1015
+ 'latin',
1016
+ ),
1017
+ ),
1018
+ 'Averia Sans Libre' => array(
1019
+ 'label' => 'Averia Sans Libre',
1020
+ 'variants' => array(
1021
+ '300',
1022
+ '300italic',
1023
+ 'regular',
1024
+ 'italic',
1025
+ '700',
1026
+ '700italic',
1027
+ ),
1028
+ 'subsets' => array(
1029
+ 'latin',
1030
+ ),
1031
+ ),
1032
+ 'Averia Serif Libre' => array(
1033
+ 'label' => 'Averia Serif Libre',
1034
+ 'variants' => array(
1035
+ '300',
1036
+ '300italic',
1037
+ 'regular',
1038
+ 'italic',
1039
+ '700',
1040
+ '700italic',
1041
+ ),
1042
+ 'subsets' => array(
1043
+ 'latin',
1044
+ ),
1045
+ ),
1046
+ 'Bad Script' => array(
1047
+ 'label' => 'Bad Script',
1048
+ 'variants' => array(
1049
+ 'regular',
1050
+ ),
1051
+ 'subsets' => array(
1052
+ 'latin',
1053
+ 'cyrillic',
1054
+ ),
1055
+ ),
1056
+ 'Balthazar' => array(
1057
+ 'label' => 'Balthazar',
1058
+ 'variants' => array(
1059
+ 'regular',
1060
+ ),
1061
+ 'subsets' => array(
1062
+ 'latin',
1063
+ ),
1064
+ ),
1065
+ 'Bangers' => array(
1066
+ 'label' => 'Bangers',
1067
+ 'variants' => array(
1068
+ 'regular',
1069
+ ),
1070
+ 'subsets' => array(
1071
+ 'latin',
1072
+ ),
1073
+ ),
1074
+ 'Basic' => array(
1075
+ 'label' => 'Basic',
1076
+ 'variants' => array(
1077
+ 'regular',
1078
+ ),
1079
+ 'subsets' => array(
1080
+ 'latin',
1081
+ 'latin-ext',
1082
+ ),
1083
+ ),
1084
+ 'Battambang' => array(
1085
+ 'label' => 'Battambang',
1086
+ 'variants' => array(
1087
+ 'regular',
1088
+ '700',
1089
+ ),
1090
+ 'subsets' => array(
1091
+ 'khmer',
1092
+ ),
1093
+ ),
1094
+ 'Baumans' => array(
1095
+ 'label' => 'Baumans',
1096
+ 'variants' => array(
1097
+ 'regular',
1098
+ ),
1099
+ 'subsets' => array(
1100
+ 'latin',
1101
+ ),
1102
+ ),
1103
+ 'Bayon' => array(
1104
+ 'label' => 'Bayon',
1105
+ 'variants' => array(
1106
+ 'regular',
1107
+ ),
1108
+ 'subsets' => array(
1109
+ 'khmer',
1110
+ ),
1111
+ ),
1112
+ 'Belgrano' => array(
1113
+ 'label' => 'Belgrano',
1114
+ 'variants' => array(
1115
+ 'regular',
1116
+ ),
1117
+ 'subsets' => array(
1118
+ 'latin',
1119
+ ),
1120
+ ),
1121
+ 'Belleza' => array(
1122
+ 'label' => 'Belleza',
1123
+ 'variants' => array(
1124
+ 'regular',
1125
+ ),
1126
+ 'subsets' => array(
1127
+ 'latin',
1128
+ 'latin-ext',
1129
+ ),
1130
+ ),
1131
+ 'BenchNine' => array(
1132
+ 'label' => 'BenchNine',
1133
+ 'variants' => array(
1134
+ '300',
1135
+ 'regular',
1136
+ '700',
1137
+ ),
1138
+ 'subsets' => array(
1139
+ 'latin',
1140
+ 'latin-ext',
1141
+ ),
1142
+ ),
1143
+ 'Bentham' => array(
1144
+ 'label' => 'Bentham',
1145
+ 'variants' => array(
1146
+ 'regular',
1147
+ ),
1148
+ 'subsets' => array(
1149
+ 'latin',
1150
+ ),
1151
+ ),
1152
+ 'Berkshire Swash' => array(
1153
+ 'label' => 'Berkshire Swash',
1154
+ 'variants' => array(
1155
+ 'regular',
1156
+ ),
1157
+ 'subsets' => array(
1158
+ 'latin',
1159
+ 'latin-ext',
1160
+ ),
1161
+ ),
1162
+ 'Bevan' => array(
1163
+ 'label' => 'Bevan',
1164
+ 'variants' => array(
1165
+ 'regular',
1166
+ ),
1167
+ 'subsets' => array(
1168
+ 'latin',
1169
+ ),
1170
+ ),
1171
+ 'Bigelow Rules' => array(
1172
+ 'label' => 'Bigelow Rules',
1173
+ 'variants' => array(
1174
+ 'regular',
1175
+ ),
1176
+ 'subsets' => array(
1177
+ 'latin',
1178
+ 'latin-ext',
1179
+ ),
1180
+ ),
1181
+ 'Bigshot One' => array(
1182
+ 'label' => 'Bigshot One',
1183
+ 'variants' => array(
1184
+ 'regular',
1185
+ ),
1186
+ 'subsets' => array(
1187
+ 'latin',
1188
+ ),
1189
+ ),
1190
+ 'Bilbo' => array(
1191
+ 'label' => 'Bilbo',
1192
+ 'variants' => array(
1193
+ 'regular',
1194
+ ),
1195
+ 'subsets' => array(
1196
+ 'latin',
1197
+ 'latin-ext',
1198
+ ),
1199
+ ),
1200
+ 'Bilbo Swash Caps' => array(
1201
+ 'label' => 'Bilbo Swash Caps',
1202
+ 'variants' => array(
1203
+ 'regular',
1204
+ ),
1205
+ 'subsets' => array(
1206
+ 'latin',
1207
+ 'latin-ext',
1208
+ ),
1209
+ ),
1210
+ 'Bitter' => array(
1211
+ 'label' => 'Bitter',
1212
+ 'variants' => array(
1213
+ 'regular',
1214
+ 'italic',
1215
+ '700',
1216
+ ),
1217
+ 'subsets' => array(
1218
+ 'latin',
1219
+ 'latin-ext',
1220
+ ),
1221
+ ),
1222
+ 'Black Ops One' => array(
1223
+ 'label' => 'Black Ops One',
1224
+ 'variants' => array(
1225
+ 'regular',
1226
+ ),
1227
+ 'subsets' => array(
1228
+ 'latin',
1229
+ 'latin-ext',
1230
+ ),
1231
+ ),
1232
+ 'Bokor' => array(
1233
+ 'label' => 'Bokor',
1234
+ 'variants' => array(
1235
+ 'regular',
1236
+ ),
1237
+ 'subsets' => array(
1238
+ 'khmer',
1239
+ ),
1240
+ ),
1241
+ 'Bonbon' => array(
1242
+ 'label' => 'Bonbon',
1243
+ 'variants' => array(
1244
+ 'regular',
1245
+ ),
1246
+ 'subsets' => array(
1247
+ 'latin',
1248
+ ),
1249
+ ),
1250
+ 'Boogaloo' => array(
1251
+ 'label' => 'Boogaloo',
1252
+ 'variants' => array(
1253
+ 'regular',
1254
+ ),
1255
+ 'subsets' => array(
1256
+ 'latin',
1257
+ ),
1258
+ ),
1259
+ 'Bowlby One' => array(
1260
+ 'label' => 'Bowlby One',
1261
+ 'variants' => array(
1262
+ 'regular',
1263
+ ),
1264
+ 'subsets' => array(
1265
+ 'latin',
1266
+ ),
1267
+ ),
1268
+ 'Bowlby One SC' => array(
1269
+ 'label' => 'Bowlby One SC',
1270
+ 'variants' => array(
1271
+ 'regular',
1272
+ ),
1273
+ 'subsets' => array(
1274
+ 'latin',
1275
+ 'latin-ext',
1276
+ ),
1277
+ ),
1278
+ 'Brawler' => array(
1279
+ 'label' => 'Brawler',
1280
+ 'variants' => array(
1281
+ 'regular',
1282
+ ),
1283
+ 'subsets' => array(
1284
+ 'latin',
1285
+ ),
1286
+ ),
1287
+ 'Bree Serif' => array(
1288
+ 'label' => 'Bree Serif',
1289
+ 'variants' => array(
1290
+ 'regular',
1291
+ ),
1292
+ 'subsets' => array(
1293
+ 'latin',
1294
+ 'latin-ext',
1295
+ ),
1296
+ ),
1297
+ 'Bubblegum Sans' => array(
1298
+ 'label' => 'Bubblegum Sans',
1299
+ 'variants' => array(
1300
+ 'regular',
1301
+ ),
1302
+ 'subsets' => array(
1303
+ 'latin',
1304
+ 'latin-ext',
1305
+ ),
1306
+ ),
1307
+ 'Bubbler One' => array(
1308
+ 'label' => 'Bubbler One',
1309
+ 'variants' => array(
1310
+ 'regular',
1311
+ ),
1312
+ 'subsets' => array(
1313
+ 'latin',
1314
+ 'latin-ext',
1315
+ ),
1316
+ ),
1317
+ 'Buda' => array(
1318
+ 'label' => 'Buda',
1319
+ 'variants' => array(
1320
+ '300',
1321
+ ),
1322
+ 'subsets' => array(
1323
+ 'latin',
1324
+ ),
1325
+ ),
1326
+ 'Buenard' => array(
1327
+ 'label' => 'Buenard',
1328
+ 'variants' => array(
1329
+ 'regular',
1330
+ '700',
1331
+ ),
1332
+ 'subsets' => array(
1333
+ 'latin',
1334
+ 'latin-ext',
1335
+ ),
1336
+ ),
1337
+ 'Butcherman' => array(
1338
+ 'label' => 'Butcherman',
1339
+ 'variants' => array(
1340
+ 'regular',
1341
+ ),
1342
+ 'subsets' => array(
1343
+ 'latin',
1344
+ 'latin-ext',
1345
+ ),
1346
+ ),
1347
+ 'Butterfly Kids' => array(
1348
+ 'label' => 'Butterfly Kids',
1349
+ 'variants' => array(
1350
+ 'regular',
1351
+ ),
1352
+ 'subsets' => array(
1353
+ 'latin',
1354
+ 'latin-ext',
1355
+ ),
1356
+ ),
1357
+ 'Cabin' => array(
1358
+ 'label' => 'Cabin',
1359
+ 'variants' => array(
1360
+ 'regular',
1361
+ 'italic',
1362
+ '500',
1363
+ '500italic',
1364
+ '600',
1365
+ '600italic',
1366
+ '700',
1367
+ '700italic',
1368
+ ),
1369
+ 'subsets' => array(
1370
+ 'latin',
1371
+ ),
1372
+ ),
1373
+ 'Cabin Condensed' => array(
1374
+ 'label' => 'Cabin Condensed',
1375
+ 'variants' => array(
1376
+ 'regular',
1377
+ '500',
1378
+ '600',
1379
+ '700',
1380
+ ),
1381
+ 'subsets' => array(
1382
+ 'latin',
1383
+ ),
1384
+ ),
1385
+ 'Cabin Sketch' => array(
1386
+ 'label' => 'Cabin Sketch',
1387
+ 'variants' => array(
1388
+ 'regular',
1389
+ '700',
1390
+ ),
1391
+ 'subsets' => array(
1392
+ 'latin',
1393
+ ),
1394
+ ),
1395
+ 'Caesar Dressing' => array(
1396
+ 'label' => 'Caesar Dressing',
1397
+ 'variants' => array(
1398
+ 'regular',
1399
+ ),
1400
+ 'subsets' => array(
1401
+ 'latin',
1402
+ ),
1403
+ ),
1404
+ 'Cagliostro' => array(
1405
+ 'label' => 'Cagliostro',
1406
+ 'variants' => array(
1407
+ 'regular',
1408
+ ),
1409
+ 'subsets' => array(
1410
+ 'latin',
1411
+ ),
1412
+ ),
1413
+ 'Calligraffitti' => array(
1414
+ 'label' => 'Calligraffitti',
1415
+ 'variants' => array(
1416
+ 'regular',
1417
+ ),
1418
+ 'subsets' => array(
1419
+ 'latin',
1420
+ ),
1421
+ ),
1422
+ 'Cambo' => array(
1423
+ 'label' => 'Cambo',
1424
+ 'variants' => array(
1425
+ 'regular',
1426
+ ),
1427
+ 'subsets' => array(
1428
+ 'latin',
1429
+ ),
1430
+ ),
1431
+ 'Candal' => array(
1432
+ 'label' => 'Candal',
1433
+ 'variants' => array(
1434
+ 'regular',
1435
+ ),
1436
+ 'subsets' => array(
1437
+ 'latin',
1438
+ ),
1439
+ ),
1440
+ 'Cantarell' => array(
1441
+ 'label' => 'Cantarell',
1442
+ 'variants' => array(
1443
+ 'regular',
1444
+ 'italic',
1445
+ '700',
1446
+ '700italic',
1447
+ ),
1448
+ 'subsets' => array(
1449
+ 'latin',
1450
+ ),
1451
+ ),
1452
+ 'Cantata One' => array(
1453
+ 'label' => 'Cantata One',
1454
+ 'variants' => array(
1455
+ 'regular',
1456
+ ),
1457
+ 'subsets' => array(
1458
+ 'latin',
1459
+ 'latin-ext',
1460
+ ),
1461
+ ),
1462
+ 'Cantora One' => array(
1463
+ 'label' => 'Cantora One',
1464
+ 'variants' => array(
1465
+ 'regular',
1466
+ ),
1467
+ 'subsets' => array(
1468
+ 'latin',
1469
+ 'latin-ext',
1470
+ ),
1471
+ ),
1472
+ 'Capriola' => array(
1473
+ 'label' => 'Capriola',
1474
+ 'variants' => array(
1475
+ 'regular',
1476
+ ),
1477
+ 'subsets' => array(
1478
+ 'latin',
1479
+ 'latin-ext',
1480
+ ),
1481
+ ),
1482
+ 'Cardo' => array(
1483
+ 'label' => 'Cardo',
1484
+ 'variants' => array(
1485
+ 'regular',
1486
+ 'italic',
1487
+ '700',
1488
+ ),
1489
+ 'subsets' => array(
1490
+ 'latin',
1491
+ 'greek-ext',
1492
+ 'greek',
1493
+ 'latin-ext',
1494
+ ),
1495
+ ),
1496
+ 'Carme' => array(
1497
+ 'label' => 'Carme',
1498
+ 'variants' => array(
1499
+ 'regular',
1500
+ ),
1501
+ 'subsets' => array(
1502
+ 'latin',
1503
+ ),
1504
+ ),
1505
+ 'Carrois Gothic' => array(
1506
+ 'label' => 'Carrois Gothic',
1507
+ 'variants' => array(
1508
+ 'regular',
1509
+ ),
1510
+ 'subsets' => array(
1511
+ 'latin',
1512
+ ),
1513
+ ),
1514
+ 'Carrois Gothic SC' => array(
1515
+ 'label' => 'Carrois Gothic SC',
1516
+ 'variants' => array(
1517
+ 'regular',
1518
+ ),
1519
+ 'subsets' => array(
1520
+ 'latin',
1521
+ ),
1522
+ ),
1523
+ 'Carter One' => array(
1524
+ 'label' => 'Carter One',
1525
+ 'variants' => array(
1526
+ 'regular',
1527
+ ),
1528
+ 'subsets' => array(
1529
+ 'latin',
1530
+ ),
1531
+ ),
1532
+ 'Caudex' => array(
1533
+ 'label' => 'Caudex',
1534
+ 'variants' => array(
1535
+ 'regular',
1536
+ 'italic',
1537
+ '700',
1538
+ '700italic',
1539
+ ),
1540
+ 'subsets' => array(
1541
+ 'latin',
1542
+ 'greek-ext',
1543
+ 'greek',
1544
+ 'latin-ext',
1545
+ ),
1546
+ ),
1547
+ 'Cedarville Cursive' => array(
1548
+ 'label' => 'Cedarville Cursive',
1549
+ 'variants' => array(
1550
+ 'regular',
1551
+ ),
1552
+ 'subsets' => array(
1553
+ 'latin',
1554
+ ),
1555
+ ),
1556
+ 'Ceviche One' => array(
1557
+ 'label' => 'Ceviche One',
1558
+ 'variants' => array(
1559
+ 'regular',
1560
+ ),
1561
+ 'subsets' => array(
1562
+ 'latin',
1563
+ ),
1564
+ ),
1565
+ 'Changa One' => array(
1566
+ 'label' => 'Changa One',
1567
+ 'variants' => array(
1568
+ 'regular',
1569
+ 'italic',
1570
+ ),
1571
+ 'subsets' => array(
1572
+ 'latin',
1573
+ ),
1574
+ ),
1575
+ 'Chango' => array(
1576
+ 'label' => 'Chango',
1577
+ 'variants' => array(
1578
+ 'regular',
1579
+ ),
1580
+ 'subsets' => array(
1581
+ 'latin',
1582
+ 'latin-ext',
1583
+ ),
1584
+ ),
1585
+ 'Chau Philomene One' => array(
1586
+ 'label' => 'Chau Philomene One',
1587
+ 'variants' => array(
1588
+ 'regular',
1589
+ 'italic',
1590
+ ),
1591
+ 'subsets' => array(
1592
+ 'latin',
1593
+ 'latin-ext',
1594
+ ),
1595
+ ),
1596
+ 'Chela One' => array(
1597
+ 'label' => 'Chela One',
1598
+ 'variants' => array(
1599
+ 'regular',
1600
+ ),
1601
+ 'subsets' => array(
1602
+ 'latin',
1603
+ 'latin-ext',
1604
+ ),
1605
+ ),
1606
+ 'Chelsea Market' => array(
1607
+ 'label' => 'Chelsea Market',
1608
+ 'variants' => array(
1609
+ 'regular',
1610
+ ),
1611
+ 'subsets' => array(
1612
+ 'latin',
1613
+ 'latin-ext',
1614
+ ),
1615
+ ),
1616
+ 'Chenla' => array(
1617
+ 'label' => 'Chenla',
1618
+ 'variants' => array(
1619
+ 'regular',
1620
+ ),
1621
+ 'subsets' => array(
1622
+ 'khmer',
1623
+ ),
1624
+ ),
1625
+ 'Cherry Cream Soda' => array(
1626
+ 'label' => 'Cherry Cream Soda',
1627
+ 'variants' => array(
1628
+ 'regular',
1629
+ ),
1630
+ 'subsets' => array(
1631
+ 'latin',
1632
+ ),
1633
+ ),
1634
+ 'Cherry Swash' => array(
1635
+ 'label' => 'Cherry Swash',
1636
+ 'variants' => array(
1637
+ 'regular',
1638
+ '700',
1639
+ ),
1640
+ 'subsets' => array(
1641
+ 'latin',
1642
+ 'latin-ext',
1643
+ ),
1644
+ ),
1645
+ 'Chewy' => array(
1646
+ 'label' => 'Chewy',
1647
+ 'variants' => array(
1648
+ 'regular',
1649
+ ),
1650
+ 'subsets' => array(
1651
+ 'latin',
1652
+ ),
1653
+ ),
1654
+ 'Chicle' => array(
1655
+ 'label' => 'Chicle',
1656
+ 'variants' => array(
1657
+ 'regular',
1658
+ ),
1659
+ 'subsets' => array(
1660
+ 'latin',
1661
+ 'latin-ext',
1662
+ ),
1663
+ ),
1664
+ 'Chivo' => array(
1665
+ 'label' => 'Chivo',
1666
+ 'variants' => array(
1667
+ 'regular',
1668
+ 'italic',
1669
+ '900',
1670
+ '900italic',
1671
+ ),
1672
+ 'subsets' => array(
1673
+ 'latin',
1674
+ ),
1675
+ ),
1676
+ 'Cinzel' => array(
1677
+ 'label' => 'Cinzel',
1678
+ 'variants' => array(
1679
+ 'regular',
1680
+ '700',
1681
+ '900',
1682
+ ),
1683
+ 'subsets' => array(
1684
+ 'latin',
1685
+ ),
1686
+ ),
1687
+ 'Cinzel Decorative' => array(
1688
+ 'label' => 'Cinzel Decorative',
1689
+ 'variants' => array(
1690
+ 'regular',
1691
+ '700',
1692
+ '900',
1693
+ ),
1694
+ 'subsets' => array(
1695
+ 'latin',
1696
+ ),
1697
+ ),
1698
+ 'Clicker Script' => array(
1699
+ 'label' => 'Clicker Script',
1700
+ 'variants' => array(
1701
+ 'regular',
1702
+ ),
1703
+ 'subsets' => array(
1704
+ 'latin',
1705
+ 'latin-ext',
1706
+ ),
1707
+ ),
1708
+ 'Coda' => array(
1709
+ 'label' => 'Coda',
1710
+ 'variants' => array(
1711
+ 'regular',
1712
+ '800',
1713
+ ),
1714
+ 'subsets' => array(
1715
+ 'latin',
1716
+ ),
1717
+ ),
1718
+ 'Coda Caption' => array(
1719
+ 'label' => 'Coda Caption',
1720
+ 'variants' => array(
1721
+ '800',
1722
+ ),
1723
+ 'subsets' => array(
1724
+ 'latin',
1725
+ ),
1726
+ ),
1727
+ 'Codystar' => array(
1728
+ 'label' => 'Codystar',
1729
+ 'variants' => array(
1730
+ '300',
1731
+ 'regular',
1732
+ ),
1733
+ 'subsets' => array(
1734
+ 'latin',
1735
+ 'latin-ext',
1736
+ ),
1737
+ ),
1738
+ 'Combo' => array(
1739
+ 'label' => 'Combo',
1740
+ 'variants' => array(
1741
+ 'regular',
1742
+ ),
1743
+ 'subsets' => array(
1744
+ 'latin',
1745
+ 'latin-ext',
1746
+ ),
1747
+ ),
1748
+ 'Comfortaa' => array(
1749
+ 'label' => 'Comfortaa',
1750
+ 'variants' => array(
1751
+ '300',
1752
+ 'regular',
1753
+ '700',
1754
+ ),
1755
+ 'subsets' => array(
1756
+ 'latin',
1757
+ 'cyrillic',
1758
+ 'greek',
1759
+ 'latin-ext',
1760
+ 'cyrillic-ext',
1761
+ ),
1762
+ ),
1763
+ 'Coming Soon' => array(
1764
+ 'label' => 'Coming Soon',
1765
+ 'variants' => array(
1766
+ 'regular',
1767
+ ),
1768
+ 'subsets' => array(
1769
+ 'latin',
1770
+ ),
1771
+ ),
1772
+ 'Concert One' => array(
1773
+ 'label' => 'Concert One',
1774
+ 'variants' => array(
1775
+ 'regular',
1776
+ ),
1777
+ 'subsets' => array(
1778
+ 'latin',
1779
+ 'latin-ext',
1780
+ ),
1781
+ ),
1782
+ 'Condiment' => array(
1783
+ 'label' => 'Condiment',
1784
+ 'variants' => array(
1785
+ 'regular',
1786
+ ),
1787
+ 'subsets' => array(
1788
+ 'latin',
1789
+ 'latin-ext',
1790
+ ),
1791
+ ),
1792
+ 'Content' => array(
1793
+ 'label' => 'Content',
1794
+ 'variants' => array(
1795
+ 'regular',
1796
+ '700',
1797
+ ),
1798
+ 'subsets' => array(
1799
+ 'khmer',
1800
+ ),
1801
+ ),
1802
+ 'Contrail One' => array(
1803
+ 'label' => 'Contrail One',
1804
+ 'variants' => array(
1805
+ 'regular',
1806
+ ),
1807
+ 'subsets' => array(
1808
+ 'latin',
1809
+ ),
1810
+ ),
1811
+ 'Convergence' => array(
1812
+ 'label' => 'Convergence',
1813
+ 'variants' => array(
1814
+ 'regular',
1815
+ ),
1816
+ 'subsets' => array(
1817
+ 'latin',
1818
+ ),
1819
+ ),
1820
+ 'Cookie' => array(
1821
+ 'label' => 'Cookie',
1822
+ 'variants' => array(
1823
+ 'regular',
1824
+ ),
1825
+ 'subsets' => array(
1826
+ 'latin',
1827
+ ),
1828
+ ),
1829
+ 'Copse' => array(
1830
+ 'label' => 'Copse',
1831
+ 'variants' => array(
1832
+ 'regular',
1833
+ ),
1834
+ 'subsets' => array(
1835
+ 'latin',
1836
+ ),
1837
+ ),
1838
+ 'Corben' => array(
1839
+ 'label' => 'Corben',
1840
+ 'variants' => array(
1841
+ 'regular',
1842
+ '700',
1843
+ ),
1844
+ 'subsets' => array(
1845
+ 'latin',
1846
+ ),
1847
+ ),
1848
+ 'Courgette' => array(
1849
+ 'label' => 'Courgette',
1850
+ 'variants' => array(
1851
+ 'regular',
1852
+ ),
1853
+ 'subsets' => array(
1854
+ 'latin',
1855
+ 'latin-ext',
1856
+ ),
1857
+ ),
1858
+ 'Cousine' => array(
1859
+ 'label' => 'Cousine',
1860
+ 'variants' => array(
1861
+ 'regular',
1862
+ 'italic',
1863
+ '700',
1864
+ '700italic',
1865
+ ),
1866
+ 'subsets' => array(
1867
+ 'latin',
1868
+ 'greek-ext',
1869
+ 'cyrillic',
1870
+ 'greek',
1871
+ 'vietnamese',
1872
+ 'latin-ext',
1873
+ 'cyrillic-ext',
1874
+ ),
1875
+ ),
1876
+ 'Coustard' => array(
1877
+ 'label' => 'Coustard',
1878
+ 'variants' => array(
1879
+ 'regular',
1880
+ '900',
1881
+ ),
1882
+ 'subsets' => array(
1883
+ 'latin',
1884
+ ),
1885
+ ),
1886
+ 'Covered By Your Grace' => array(
1887
+ 'label' => 'Covered By Your Grace',
1888
+ 'variants' => array(
1889
+ 'regular',
1890
+ ),
1891
+ 'subsets' => array(
1892
+ 'latin',
1893
+ ),
1894
+ ),
1895
+ 'Crafty Girls' => array(
1896
+ 'label' => 'Crafty Girls',
1897
+ 'variants' => array(
1898
+ 'regular',
1899
+ ),
1900
+ 'subsets' => array(
1901
+ 'latin',
1902
+ ),
1903
+ ),
1904
+ 'Creepster' => array(
1905
+ 'label' => 'Creepster',
1906
+ 'variants' => array(
1907
+ 'regular',
1908
+ ),
1909
+ 'subsets' => array(
1910
+ 'latin',
1911
+ ),
1912
+ ),
1913
+ 'Crete Round' => array(
1914
+ 'label' => 'Crete Round',
1915
+ 'variants' => array(
1916
+ 'regular',
1917
+ 'italic',
1918
+ ),
1919
+ 'subsets' => array(
1920
+ 'latin',
1921
+ 'latin-ext',
1922
+ ),
1923
+ ),
1924
+ 'Crimson Text' => array(
1925
+ 'label' => 'Crimson Text',
1926
+ 'variants' => array(
1927
+ 'regular',
1928
+ 'italic',
1929
+ '600',
1930
+ '600italic',
1931
+ '700',
1932
+ '700italic',
1933
+ ),
1934
+ 'subsets' => array(
1935
+ 'latin',
1936
+ ),
1937
+ ),
1938
+ 'Croissant One' => array(
1939
+ 'label' => 'Croissant One',
1940
+ 'variants' => array(
1941
+ 'regular',
1942
+ ),
1943
+ 'subsets' => array(
1944
+ 'latin',
1945
+ 'latin-ext',
1946
+ ),
1947
+ ),
1948
+ 'Crushed' => array(
1949
+ 'label' => 'Crushed',
1950
+ 'variants' => array(
1951
+ 'regular',
1952
+ ),
1953
+ 'subsets' => array(
1954
+ 'latin',
1955
+ ),
1956
+ ),
1957
+ 'Cuprum' => array(
1958
+ 'label' => 'Cuprum',
1959
+ 'variants' => array(
1960
+ 'regular',
1961
+ 'italic',
1962
+ '700',
1963
+ '700italic',
1964
+ ),
1965
+ 'subsets' => array(
1966
+ 'latin',
1967
+ 'cyrillic',
1968
+ 'latin-ext',
1969
+ ),
1970
+ ),
1971
+ 'Cutive' => array(
1972
+ 'label' => 'Cutive',
1973
+ 'variants' => array(
1974
+ 'regular',
1975
+ ),
1976
+ 'subsets' => array(
1977
+ 'latin',
1978
+ 'latin-ext',
1979
+ ),
1980
+ ),
1981
+ 'Cutive Mono' => array(
1982
+ 'label' => 'Cutive Mono',
1983
+ 'variants' => array(
1984
+ 'regular',
1985
+ ),
1986
+ 'subsets' => array(
1987
+ 'latin',
1988
+ 'latin-ext',
1989
+ ),
1990
+ ),
1991
+ 'Damion' => array(
1992
+ 'label' => 'Damion',
1993
+ 'variants' => array(
1994
+ 'regular',
1995
+ ),
1996
+ 'subsets' => array(
1997
+ 'latin',
1998
+ ),
1999
+ ),
2000
+ 'Dancing Script' => array(
2001
+ 'label' => 'Dancing Script',
2002
+ 'variants' => array(
2003
+ 'regular',
2004
+ '700',
2005
+ ),
2006
+ 'subsets' => array(
2007
+ 'latin',
2008
+ ),
2009
+ ),
2010
+ 'Dangrek' => array(
2011
+ 'label' => 'Dangrek',
2012
+ 'variants' => array(
2013
+ 'regular',
2014
+ ),
2015
+ 'subsets' => array(
2016
+ 'khmer',
2017
+ ),
2018
+ ),
2019
+ 'Dawning of a New Day' => array(
2020
+ 'label' => 'Dawning of a New Day',
2021
+ 'variants' => array(
2022
+ 'regular',
2023
+ ),
2024
+ 'subsets' => array(
2025
+ 'latin',
2026
+ ),
2027
+ ),
2028
+ 'Days One' => array(
2029
+ 'label' => 'Days One',
2030
+ 'variants' => array(
2031
+ 'regular',
2032
+ ),
2033
+ 'subsets' => array(
2034
+ 'latin',
2035
+ ),
2036
+ ),
2037
+ 'Delius' => array(
2038
+ 'label' => 'Delius',
2039
+ 'variants' => array(
2040
+ 'regular',
2041
+ ),
2042
+ 'subsets' => array(
2043
+ 'latin',
2044
+ ),
2045
+ ),
2046
+ 'Delius Swash Caps' => array(
2047
+ 'label' => 'Delius Swash Caps',
2048
+ 'variants' => array(
2049
+ 'regular',
2050
+ ),
2051
+ 'subsets' => array(
2052
+ 'latin',
2053
+ ),
2054
+ ),
2055
+ 'Delius Unicase' => array(
2056
+ 'label' => 'Delius Unicase',
2057
+ 'variants' => array(
2058
+ 'regular',
2059
+ '700',
2060
+ ),
2061
+ 'subsets' => array(
2062
+ 'latin',
2063
+ ),
2064
+ ),
2065
+ 'Della Respira' => array(
2066
+ 'label' => 'Della Respira',
2067
+ 'variants' => array(
2068
+ 'regular',
2069
+ ),
2070
+ 'subsets' => array(
2071
+ 'latin',
2072
+ ),
2073
+ ),
2074
+ 'Denk One' => array(
2075
+ 'label' => 'Denk One',
2076
+ 'variants' => array(
2077
+ 'regular',
2078
+ ),
2079
+ 'subsets' => array(
2080
+ 'latin',
2081
+ 'latin-ext',
2082
+ ),
2083
+ ),
2084
+ 'Devonshire' => array(
2085
+ 'label' => 'Devonshire',
2086
+ 'variants' => array(
2087
+ 'regular',
2088
+ ),
2089
+ 'subsets' => array(
2090
+ 'latin',
2091
+ 'latin-ext',
2092
+ ),
2093
+ ),
2094
+ 'Didact Gothic' => array(
2095
+ 'label' => 'Didact Gothic',
2096
+ 'variants' => array(
2097
+ 'regular',
2098
+ ),
2099
+ 'subsets' => array(
2100
+ 'latin',
2101
+ 'greek-ext',
2102
+ 'cyrillic',
2103
+ 'greek',
2104
+ 'latin-ext',
2105
+ 'cyrillic-ext',
2106
+ ),
2107
+ ),
2108
+ 'Diplomata' => array(
2109
+ 'label' => 'Diplomata',
2110
+ 'variants' => array(
2111
+ 'regular',
2112
+ ),
2113
+ 'subsets' => array(
2114
+ 'latin',
2115
+ 'latin-ext',
2116
+ ),
2117
+ ),
2118
+ 'Diplomata SC' => array(
2119
+ 'label' => 'Diplomata SC',
2120
+ 'variants' => array(
2121
+ 'regular',
2122
+ ),
2123
+ 'subsets' => array(
2124
+ 'latin',
2125
+ 'latin-ext',
2126
+ ),
2127
+ ),
2128
+ 'Domine' => array(
2129
+ 'label' => 'Domine',
2130
+ 'variants' => array(
2131
+ 'regular',
2132
+ '700',
2133
+ ),
2134
+ 'subsets' => array(
2135
+ 'latin',
2136
+ 'latin-ext',
2137
+ ),
2138
+ ),
2139
+ 'Donegal One' => array(
2140
+ 'label' => 'Donegal One',
2141
+ 'variants' => array(
2142
+ 'regular',
2143
+ ),
2144
+ 'subsets' => array(
2145
+ 'latin',
2146
+ 'latin-ext',
2147
+ ),
2148
+ ),
2149
+ 'Doppio One' => array(
2150
+ 'label' => 'Doppio One',
2151
+ 'variants' => array(
2152
+ 'regular',
2153
+ ),
2154
+ 'subsets' => array(
2155
+ 'latin',
2156
+ 'latin-ext',
2157
+ ),
2158
+ ),
2159
+ 'Dorsa' => array(
2160
+ 'label' => 'Dorsa',
2161
+ 'variants' => array(
2162
+ 'regular',
2163
+ ),
2164
+ 'subsets' => array(
2165
+ 'latin',
2166
+ ),
2167
+ ),
2168
+ 'Dosis' => array(
2169
+ 'label' => 'Dosis',
2170
+ 'variants' => array(
2171
+ '200',
2172
+ '300',
2173
+ 'regular',
2174
+ '500',
2175
+ '600',
2176
+ '700',
2177
+ '800',
2178
+ ),
2179
+ 'subsets' => array(
2180
+ 'latin',
2181
+ 'latin-ext',
2182
+ ),
2183
+ ),
2184
+ 'Dr Sugiyama' => array(
2185
+ 'label' => 'Dr Sugiyama',
2186
+ 'variants' => array(
2187
+ 'regular',
2188
+ ),
2189
+ 'subsets' => array(
2190
+ 'latin',
2191
+ 'latin-ext',
2192
+ ),
2193
+ ),
2194
+ 'Droid Sans' => array(
2195
+ 'label' => 'Droid Sans',
2196
+ 'variants' => array(
2197
+ 'regular',
2198
+ '700',
2199
+ ),
2200
+ 'subsets' => array(
2201
+ 'latin',
2202
+ ),
2203
+ ),
2204
+ 'Droid Sans Mono' => array(
2205
+ 'label' => 'Droid Sans Mono',
2206
+ 'variants' => array(
2207
+ 'regular',
2208
+ ),
2209
+ 'subsets' => array(
2210
+ 'latin',
2211
+ ),
2212
+ ),
2213
+ 'Droid Serif' => array(
2214
+ 'label' => 'Droid Serif',
2215
+ 'variants' => array(
2216
+ 'regular',
2217
+ 'italic',
2218
+ '700',
2219
+ '700italic',
2220
+ ),
2221
+ 'subsets' => array(
2222
+ 'latin',
2223
+ ),
2224
+ ),
2225
+ 'Duru Sans' => array(
2226
+ 'label' => 'Duru Sans',
2227
+ 'variants' => array(
2228
+ 'regular',
2229
+ ),
2230
+ 'subsets' => array(
2231
+ 'latin',
2232
+ 'latin-ext',
2233
+ ),
2234
+ ),
2235
+ 'Dynalight' => array(
2236
+ 'label' => 'Dynalight',
2237
+ 'variants' => array(
2238
+ 'regular',
2239
+ ),
2240
+ 'subsets' => array(
2241
+ 'latin',
2242
+ 'latin-ext',
2243
+ ),
2244
+ ),
2245
+ 'EB Garamond' => array(
2246
+ 'label' => 'EB Garamond',
2247
+ 'variants' => array(
2248
+ 'regular',
2249
+ ),
2250
+ 'subsets' => array(
2251
+ 'latin',
2252
+ 'cyrillic',
2253
+ 'vietnamese',
2254
+ 'latin-ext',
2255
+ 'cyrillic-ext',
2256
+ ),
2257
+ ),
2258
+ 'Eagle Lake' => array(
2259
+ 'label' => 'Eagle Lake',
2260
+ 'variants' => array(
2261
+ 'regular',
2262
+ ),
2263
+ 'subsets' => array(
2264
+ 'latin',
2265
+ 'latin-ext',
2266
+ ),
2267
+ ),
2268
+ 'Eater' => array(
2269
+ 'label' => 'Eater',
2270
+ 'variants' => array(
2271
+ 'regular',
2272
+ ),
2273
+ 'subsets' => array(
2274
+ 'latin',
2275
+ 'latin-ext',
2276
+ ),
2277
+ ),
2278
+ 'Economica' => array(
2279
+ 'label' => 'Economica',
2280
+ 'variants' => array(
2281
+ 'regular',
2282
+ 'italic',
2283
+ '700',
2284
+ '700italic',
2285
+ ),
2286
+ 'subsets' => array(
2287
+ 'latin',
2288
+ 'latin-ext',
2289
+ ),
2290
+ ),
2291
+ 'Electrolize' => array(
2292
+ 'label' => 'Electrolize',
2293
+ 'variants' => array(
2294
+ 'regular',
2295
+ ),
2296
+ 'subsets' => array(
2297
+ 'latin',
2298
+ ),
2299
+ ),
2300
+ 'Elsie' => array(
2301
+ 'label' => 'Elsie',
2302
+ 'variants' => array(
2303
+ 'regular',
2304
+ '900',
2305
+ ),
2306
+ 'subsets' => array(
2307
+ 'latin',
2308
+ 'latin-ext',
2309
+ ),
2310
+ ),
2311
+ 'Elsie Swash Caps' => array(
2312
+ 'label' => 'Elsie Swash Caps',
2313
+ 'variants' => array(
2314
+ 'regular',
2315
+ '900',
2316
+ ),
2317
+ 'subsets' => array(
2318
+ 'latin',
2319
+ 'latin-ext',
2320
+ ),
2321
+ ),
2322
+ 'Emblema One' => array(
2323
+ 'label' => 'Emblema One',
2324
+ 'variants' => array(
2325
+ 'regular',
2326
+ ),
2327
+ 'subsets' => array(
2328
+ 'latin',
2329
+ 'latin-ext',
2330
+ ),
2331
+ ),
2332
+ 'Emilys Candy' => array(
2333
+ 'label' => 'Emilys Candy',
2334
+ 'variants' => array(
2335
+ 'regular',
2336
+ ),
2337
+ 'subsets' => array(
2338
+ 'latin',
2339
+ 'latin-ext',
2340
+ ),
2341
+ ),
2342
+ 'Engagement' => array(
2343
+ 'label' => 'Engagement',
2344
+ 'variants' => array(
2345
+ 'regular',
2346
+ ),
2347
+ 'subsets' => array(
2348
+ 'latin',
2349
+ ),
2350
+ ),
2351
+ 'Englebert' => array(
2352
+ 'label' => 'Englebert',
2353
+ 'variants' => array(
2354
+ 'regular',
2355
+ ),
2356
+ 'subsets' => array(
2357
+ 'latin',
2358
+ 'latin-ext',
2359
+ ),
2360
+ ),
2361
+ 'Enriqueta' => array(
2362
+ 'label' => 'Enriqueta',
2363
+ 'variants' => array(
2364
+ 'regular',
2365
+ '700',
2366
+ ),
2367
+ 'subsets' => array(
2368
+ 'latin',
2369
+ 'latin-ext',
2370
+ ),
2371
+ ),
2372
+ 'Erica One' => array(
2373
+ 'label' => 'Erica One',
2374
+ 'variants' => array(
2375
+ 'regular',
2376
+ ),
2377
+ 'subsets' => array(
2378
+ 'latin',
2379
+ ),
2380
+ ),
2381
+ 'Esteban' => array(
2382
+ 'label' => 'Esteban',
2383
+ 'variants' => array(
2384
+ 'regular',
2385
+ ),
2386
+ 'subsets' => array(
2387
+ 'latin',
2388
+ 'latin-ext',
2389
+ ),
2390
+ ),
2391
+ 'Euphoria Script' => array(
2392
+ 'label' => 'Euphoria Script',
2393
+ 'variants' => array(
2394
+ 'regular',
2395
+ ),
2396
+ 'subsets' => array(
2397
+ 'latin',
2398
+ 'latin-ext',
2399
+ ),
2400
+ ),
2401
+ 'Ewert' => array(
2402
+ 'label' => 'Ewert',
2403
+ 'variants' => array(
2404
+ 'regular',
2405
+ ),
2406
+ 'subsets' => array(
2407
+ 'latin',
2408
+ 'latin-ext',
2409
+ ),
2410
+ ),
2411
+ 'Exo' => array(
2412
+ 'label' => 'Exo',
2413
+ 'variants' => array(
2414
+ '100',
2415
+ '100italic',
2416
+ '200',
2417
+ '200italic',
2418
+ '300',
2419
+ '300italic',
2420
+ 'regular',
2421
+ 'italic',
2422
+ '500',
2423
+ '500italic',
2424
+ '600',
2425
+ '600italic',
2426
+ '700',
2427
+ '700italic',
2428
+ '800',
2429
+ '800italic',
2430
+ '900',
2431
+ '900italic',
2432
+ ),
2433
+ 'subsets' => array(
2434
+ 'latin',
2435
+ 'latin-ext',
2436
+ ),
2437
+ ),
2438
+ 'Exo 2' => array(
2439
+ 'label' => 'Exo 2',
2440
+ 'variants' => array(
2441
+ '100',
2442
+ '100italic',
2443
+ '200',
2444
+ '200italic',
2445
+ '300',
2446
+ '300italic',
2447
+ 'regular',
2448
+ 'italic',
2449
+ '500',
2450
+ '500italic',
2451
+ '600',
2452
+ '600italic',
2453
+ '700',
2454
+ '700italic',
2455
+ '800',
2456
+ '800italic',
2457
+ '900',
2458
+ '900italic',
2459
+ ),
2460
+ 'subsets' => array(
2461
+ 'latin',
2462
+ 'cyrillic',
2463
+ 'latin-ext',
2464
+ ),
2465
+ ),
2466
+ 'Expletus Sans' => array(
2467
+ 'label' => 'Expletus Sans',
2468
+ 'variants' => array(
2469
+ 'regular',
2470
+ 'italic',
2471
+ '500',
2472
+ '500italic',
2473
+ '600',
2474
+ '600italic',
2475
+ '700',
2476
+ '700italic',
2477
+ ),
2478
+ 'subsets' => array(
2479
+ 'latin',
2480
+ ),
2481
+ ),
2482
+ 'Fanwood Text' => array(
2483
+ 'label' => 'Fanwood Text',
2484
+ 'variants' => array(
2485
+ 'regular',
2486
+ 'italic',
2487
+ ),
2488
+ 'subsets' => array(
2489
+ 'latin',
2490
+ ),
2491
+ ),
2492
+ 'Fascinate' => array(
2493
+ 'label' => 'Fascinate',
2494
+ 'variants' => array(
2495
+ 'regular',
2496
+ ),
2497
+ 'subsets' => array(
2498
+ 'latin',
2499
+ ),
2500
+ ),
2501
+ 'Fascinate Inline' => array(
2502
+ 'label' => 'Fascinate Inline',
2503
+ 'variants' => array(
2504
+ 'regular',
2505
+ ),
2506
+ 'subsets' => array(
2507
+ 'latin',
2508
+ ),
2509
+ ),
2510
+ 'Faster One' => array(
2511
+ 'label' => 'Faster One',
2512
+ 'variants' => array(
2513
+ 'regular',
2514
+ ),
2515
+ 'subsets' => array(
2516
+ 'latin',
2517
+ ),
2518
+ ),
2519
+ 'Fasthand' => array(
2520
+ 'label' => 'Fasthand',
2521
+ 'variants' => array(
2522
+ 'regular',
2523
+ ),
2524
+ 'subsets' => array(
2525
+ 'khmer',
2526
+ ),
2527
+ ),
2528
+ 'Fauna One' => array(
2529
+ 'label' => 'Fauna One',
2530
+ 'variants' => array(
2531
+ 'regular',
2532
+ ),
2533
+ 'subsets' => array(
2534
+ 'latin',
2535
+ 'latin-ext',
2536
+ ),
2537
+ ),
2538
+ 'Federant' => array(
2539
+ 'label' => 'Federant',
2540
+ 'variants' => array(
2541
+ 'regular',
2542
+ ),
2543
+ 'subsets' => array(
2544
+ 'latin',
2545
+ ),
2546
+ ),
2547
+ 'Federo' => array(
2548
+ 'label' => 'Federo',
2549
+ 'variants' => array(
2550
+ 'regular',
2551
+ ),
2552
+ 'subsets' => array(
2553
+ 'latin',
2554
+ ),
2555
+ ),
2556
+ 'Felipa' => array(
2557
+ 'label' => 'Felipa',
2558
+ 'variants' => array(
2559
+ 'regular',
2560
+ ),
2561
+ 'subsets' => array(
2562
+ 'latin',
2563
+ 'latin-ext',
2564
+ ),
2565
+ ),
2566
+ 'Fenix' => array(
2567
+ 'label' => 'Fenix',
2568
+ 'variants' => array(
2569
+ 'regular',
2570
+ ),
2571
+ 'subsets' => array(
2572
+ 'latin',
2573
+ 'latin-ext',
2574
+ ),
2575
+ ),
2576
+ 'Finger Paint' => array(
2577
+ 'label' => 'Finger Paint',
2578
+ 'variants' => array(
2579
+ 'regular',
2580
+ ),
2581
+ 'subsets' => array(
2582
+ 'latin',
2583
+ ),
2584
+ ),
2585
+ 'Fjalla One' => array(
2586
+ 'label' => 'Fjalla One',
2587
+ 'variants' => array(
2588
+ 'regular',
2589
+ ),
2590
+ 'subsets' => array(
2591
+ 'latin',
2592
+ 'latin-ext',
2593
+ ),
2594
+ ),
2595
+ 'Fjord One' => array(
2596
+ 'label' => 'Fjord One',
2597
+ 'variants' => array(
2598
+ 'regular',
2599
+ ),
2600
+ 'subsets' => array(
2601
+ 'latin',
2602
+ ),
2603
+ ),
2604
+ 'Flamenco' => array(
2605
+ 'label' => 'Flamenco',
2606
+ 'variants' => array(
2607
+ '300',
2608
+ 'regular',
2609
+ ),
2610
+ 'subsets' => array(
2611
+ 'latin',
2612
+ ),
2613
+ ),
2614
+ 'Flavors' => array(
2615
+ 'label' => 'Flavors',
2616
+ 'variants' => array(
2617
+ 'regular',
2618
+ ),
2619
+ 'subsets' => array(
2620
+ 'latin',
2621
+ ),
2622
+ ),
2623
+ 'Fondamento' => array(
2624
+ 'label' => 'Fondamento',
2625
+ 'variants' => array(
2626
+ 'regular',
2627
+ 'italic',
2628
+ ),
2629
+ 'subsets' => array(
2630
+ 'latin',
2631
+ 'latin-ext',
2632
+ ),
2633
+ ),
2634
+ 'Fontdiner Swanky' => array(
2635
+ 'label' => 'Fontdiner Swanky',
2636
+ 'variants' => array(
2637
+ 'regular',
2638
+ ),
2639
+ 'subsets' => array(
2640
+ 'latin',
2641
+ ),
2642
+ ),
2643
+ 'Forum' => array(
2644
+ 'label' => 'Forum',
2645
+ 'variants' => array(
2646
+ 'regular',
2647
+ ),
2648
+ 'subsets' => array(
2649
+ 'latin',
2650
+ 'cyrillic',
2651
+ 'latin-ext',
2652
+ 'cyrillic-ext',
2653
+ ),
2654
+ ),
2655
+ 'Francois One' => array(
2656
+ 'label' => 'Francois One',
2657
+ 'variants' => array(
2658
+ 'regular',
2659
+ ),
2660
+ 'subsets' => array(
2661
+ 'latin',
2662
+ 'latin-ext',
2663
+ ),
2664
+ ),
2665
+ 'Freckle Face' => array(
2666
+ 'label' => 'Freckle Face',
2667
+ 'variants' => array(
2668
+ 'regular',
2669
+ ),
2670
+ 'subsets' => array(
2671
+ 'latin',
2672
+ 'latin-ext',
2673
+ ),
2674
+ ),
2675
+ 'Fredericka the Great' => array(
2676
+ 'label' => 'Fredericka the Great',
2677
+ 'variants' => array(
2678
+ 'regular',
2679
+ ),
2680
+ 'subsets' => array(
2681
+ 'latin',
2682
+ ),
2683
+ ),
2684
+ 'Fredoka One' => array(
2685
+ 'label' => 'Fredoka One',
2686
+ 'variants' => array(
2687
+ 'regular',
2688
+ ),
2689
+ 'subsets' => array(
2690
+ 'latin',
2691
+ ),
2692
+ ),
2693
+ 'Freehand' => array(
2694
+ 'label' => 'Freehand',
2695
+ 'variants' => array(
2696
+ 'regular',
2697
+ ),
2698
+ 'subsets' => array(
2699
+ 'khmer',
2700
+ ),
2701
+ ),
2702
+ 'Fresca' => array(
2703
+ 'label' => 'Fresca',
2704
+ 'variants' => array(
2705
+ 'regular',
2706
+ ),
2707
+ 'subsets' => array(
2708
+ 'latin',
2709
+ 'latin-ext',
2710
+ ),
2711
+ ),
2712
+ 'Frijole' => array(
2713
+ 'label' => 'Frijole',
2714
+ 'variants' => array(
2715
+ 'regular',
2716
+ ),
2717
+ 'subsets' => array(
2718
+ 'latin',
2719
+ ),
2720
+ ),
2721
+ 'Fruktur' => array(
2722
+ 'label' => 'Fruktur',
2723
+ 'variants' => array(
2724
+ 'regular',
2725
+ ),
2726
+ 'subsets' => array(
2727
+ 'latin',
2728
+ 'latin-ext',
2729
+ ),
2730
+ ),
2731
+ 'Fugaz One' => array(
2732
+ 'label' => 'Fugaz One',
2733
+ 'variants' => array(
2734
+ 'regular',
2735
+ ),
2736
+ 'subsets' => array(
2737
+ 'latin',
2738
+ ),
2739
+ ),
2740
+ 'GFS Didot' => array(
2741
+ 'label' => 'GFS Didot',
2742
+ 'variants' => array(
2743
+ 'regular',
2744
+ ),
2745
+ 'subsets' => array(
2746
+ 'greek',
2747
+ ),
2748
+ ),
2749
+ 'GFS Neohellenic' => array(
2750
+ 'label' => 'GFS Neohellenic',
2751
+ 'variants' => array(
2752
+ 'regular',
2753
+ 'italic',
2754
+ '700',
2755
+ '700italic',
2756
+ ),
2757
+ 'subsets' => array(
2758
+ 'greek',
2759
+ ),
2760
+ ),
2761
+ 'Gabriela' => array(
2762
+ 'label' => 'Gabriela',
2763
+ 'variants' => array(
2764
+ 'regular',
2765
+ ),
2766
+ 'subsets' => array(
2767
+ 'latin',
2768
+ 'latin-ext',
2769
+ ),
2770
+ ),
2771
+ 'Gafata' => array(
2772
+ 'label' => 'Gafata',
2773
+ 'variants' => array(
2774
+ 'regular',
2775
+ ),
2776
+ 'subsets' => array(
2777
+ 'latin',
2778
+ 'latin-ext',
2779
+ ),
2780
+ ),
2781
+ 'Galdeano' => array(
2782
+ 'label' => 'Galdeano',
2783
+ 'variants' => array(
2784
+ 'regular',
2785
+ ),
2786
+ 'subsets' => array(
2787
+ 'latin',
2788
+ ),
2789
+ ),
2790
+ 'Galindo' => array(
2791
+ 'label' => 'Galindo',
2792
+ 'variants' => array(
2793
+ 'regular',
2794
+ ),
2795
+ 'subsets' => array(
2796
+ 'latin',
2797
+ 'latin-ext',
2798
+ ),
2799
+ ),
2800
+ 'Gentium Basic' => array(
2801
+ 'label' => 'Gentium Basic',
2802
+ 'variants' => array(
2803
+ 'regular',
2804
+ 'italic',
2805
+ '700',
2806
+ '700italic',
2807
+ ),
2808
+ 'subsets' => array(
2809
+ 'latin',
2810
+ 'latin-ext',
2811
+ ),
2812
+ ),
2813
+ 'Gentium Book Basic' => array(
2814
+ 'label' => 'Gentium Book Basic',
2815
+ 'variants' => array(
2816
+ 'regular',
2817
+ 'italic',
2818
+ '700',
2819
+ '700italic',
2820
+ ),
2821
+ 'subsets' => array(
2822
+ 'latin',
2823
+ 'latin-ext',
2824
+ ),
2825
+ ),
2826
+ 'Geo' => array(
2827
+ 'label' => 'Geo',
2828
+ 'variants' => array(
2829
+ 'regular',
2830
+ 'italic',
2831
+ ),
2832
+ 'subsets' => array(
2833
+ 'latin',
2834
+ ),
2835
+ ),
2836
+ 'Geostar' => array(
2837
+ 'label' => 'Geostar',
2838
+ 'variants' => array(
2839
+ 'regular',
2840
+ ),
2841
+ 'subsets' => array(
2842
+ 'latin',
2843
+ ),
2844
+ ),
2845
+ 'Geostar Fill' => array(
2846
+ 'label' => 'Geostar Fill',
2847
+ 'variants' => array(
2848
+ 'regular',
2849
+ ),
2850
+ 'subsets' => array(
2851
+ 'latin',
2852
+ ),
2853
+ ),
2854
+ 'Germania One' => array(
2855
+ 'label' => 'Germania One',
2856
+ 'variants' => array(
2857
+ 'regular',
2858
+ ),
2859
+ 'subsets' => array(
2860
+ 'latin',
2861
+ ),
2862
+ ),
2863
+ 'Gilda Display' => array(
2864
+ 'label' => 'Gilda Display',
2865
+ 'variants' => array(
2866
+ 'regular',
2867
+ ),
2868
+ 'subsets' => array(
2869
+ 'latin',
2870
+ 'latin-ext',
2871
+ ),
2872
+ ),
2873
+ 'Give You Glory' => array(
2874
+ 'label' => 'Give You Glory',
2875
+ 'variants' => array(
2876
+ 'regular',
2877
+ ),
2878
+ 'subsets' => array(
2879
+ 'latin',
2880
+ ),
2881
+ ),
2882
+ 'Glass Antiqua' => array(
2883
+ 'label' => 'Glass Antiqua',
2884
+ 'variants' => array(
2885
+ 'regular',
2886
+ ),
2887
+ 'subsets' => array(
2888
+ 'latin',
2889
+ 'latin-ext',
2890
+ ),
2891
+ ),
2892
+ 'Glegoo' => array(
2893
+ 'label' => 'Glegoo',
2894
+ 'variants' => array(
2895
+ 'regular',
2896
+ ),
2897
+ 'subsets' => array(
2898
+ 'latin',
2899
+ 'latin-ext',
2900
+ ),
2901
+ ),
2902
+ 'Gloria Hallelujah' => array(
2903
+ 'label' => 'Gloria Hallelujah',
2904
+ 'variants' => array(
2905
+ 'regular',
2906
+ ),
2907
+ 'subsets' => array(
2908
+ 'latin',
2909
+ ),
2910
+ ),
2911
+ 'Goblin One' => array(
2912
+ 'label' => 'Goblin One',
2913
+ 'variants' => array(
2914
+ 'regular',
2915
+ ),
2916
+ 'subsets' => array(
2917
+ 'latin',
2918
+ ),
2919
+ ),
2920
+ 'Gochi Hand' => array(
2921
+ 'label' => 'Gochi Hand',
2922
+ 'variants' => array(
2923
+ 'regular',
2924
+ ),
2925
+ 'subsets' => array(
2926
+ 'latin',
2927
+ ),
2928
+ ),
2929
+ 'Gorditas' => array(
2930
+ 'label' => 'Gorditas',
2931
+ 'variants' => array(
2932
+ 'regular',
2933
+ '700',
2934
+ ),
2935
+ 'subsets' => array(
2936
+ 'latin',
2937
+ ),
2938
+ ),
2939
+ 'Goudy Bookletter 1911' => array(
2940
+ 'label' => 'Goudy Bookletter 1911',
2941
+ 'variants' => array(
2942
+ 'regular',
2943
+ ),
2944
+ 'subsets' => array(
2945
+ 'latin',
2946
+ ),
2947
+ ),
2948
+ 'Graduate' => array(
2949
+ 'label' => 'Graduate',
2950
+ 'variants' => array(
2951
+ 'regular',
2952
+ ),
2953
+ 'subsets' => array(
2954
+ 'latin',
2955
+ ),
2956
+ ),
2957
+ 'Grand Hotel' => array(
2958
+ 'label' => 'Grand Hotel',
2959
+ 'variants' => array(
2960
+ 'regular',
2961
+ ),
2962
+ 'subsets' => array(
2963
+ 'latin',
2964
+ 'latin-ext',
2965
+ ),
2966
+ ),
2967
+ 'Gravitas One' => array(
2968
+ 'label' => 'Gravitas One',
2969
+ 'variants' => array(
2970
+ 'regular',
2971
+ ),
2972
+ 'subsets' => array(
2973
+ 'latin',
2974
+ ),
2975
+ ),
2976
+ 'Great Vibes' => array(
2977
+ 'label' => 'Great Vibes',
2978
+ 'variants' => array(
2979
+ 'regular',
2980
+ ),
2981
+ 'subsets' => array(
2982
+ 'latin',
2983
+ 'latin-ext',
2984
+ ),
2985
+ ),
2986
+ 'Griffy' => array(
2987
+ 'label' => 'Griffy',
2988
+ 'variants' => array(
2989
+ 'regular',
2990
+ ),
2991
+ 'subsets' => array(
2992
+ 'latin',
2993
+ 'latin-ext',
2994
+ ),
2995
+ ),
2996
+ 'Gruppo' => array(
2997
+ 'label' => 'Gruppo',
2998
+ 'variants' => array(
2999
+ 'regular',
3000
+ ),
3001
+ 'subsets' => array(
3002
+ 'latin',
3003
+ 'latin-ext',
3004
+ ),
3005
+ ),
3006
+ 'Gudea' => array(
3007
+ 'label' => 'Gudea',
3008
+ 'variants' => array(
3009
+ 'regular',
3010
+ 'italic',
3011
+ '700',
3012
+ ),
3013
+ 'subsets' => array(
3014
+ 'latin',
3015
+ 'latin-ext',
3016
+ ),
3017
+ ),
3018
+ 'Habibi' => array(
3019
+ 'label' => 'Habibi',
3020
+ 'variants' => array(
3021
+ 'regular',
3022
+ ),
3023
+ 'subsets' => array(
3024
+ 'latin',
3025
+ 'latin-ext',
3026
+ ),
3027
+ ),
3028
+ 'Hammersmith One' => array(
3029
+ 'label' => 'Hammersmith One',
3030
+ 'variants' => array(
3031
+ 'regular',
3032
+ ),
3033
+ 'subsets' => array(
3034
+ 'latin',
3035
+ 'latin-ext',
3036
+ ),
3037
+ ),
3038
+ 'Hanalei' => array(
3039
+ 'label' => 'Hanalei',
3040
+ 'variants' => array(
3041
+ 'regular',
3042
+ ),
3043
+ 'subsets' => array(
3044
+ 'latin',
3045
+ 'latin-ext',
3046
+ ),
3047
+ ),
3048
+ 'Hanalei Fill' => array(
3049
+ 'label' => 'Hanalei Fill',
3050
+ 'variants' => array(
3051
+ 'regular',
3052
+ ),
3053
+ 'subsets' => array(
3054
+ 'latin',
3055
+ 'latin-ext',
3056
+ ),
3057
+ ),
3058
+ 'Handlee' => array(
3059
+ 'label' => 'Handlee',
3060
+ 'variants' => array(
3061
+ 'regular',
3062
+ ),
3063
+ 'subsets' => array(
3064
+ 'latin',
3065
+ ),
3066
+ ),
3067
+ 'Hanuman' => array(
3068
+ 'label' => 'Hanuman',
3069
+ 'variants' => array(
3070
+ 'regular',
3071
+ '700',
3072
+ ),
3073
+ 'subsets' => array(
3074
+ 'khmer',
3075
+ ),
3076
+ ),
3077
+ 'Happy Monkey' => array(
3078
+ 'label' => 'Happy Monkey',
3079
+ 'variants' => array(
3080
+ 'regular',
3081
+ ),
3082
+ 'subsets' => array(
3083
+ 'latin',
3084
+ 'latin-ext',
3085
+ ),
3086
+ ),
3087
+ 'Headland One' => array(
3088
+ 'label' => 'Headland One',
3089
+ 'variants' => array(
3090
+ 'regular',
3091
+ ),
3092
+ 'subsets' => array(
3093
+ 'latin',
3094
+ 'latin-ext',
3095
+ ),
3096
+ ),
3097
+ 'Henny Penny' => array(
3098
+ 'label' => 'Henny Penny',
3099
+ 'variants' => array(
3100
+ 'regular',
3101
+ ),
3102
+ 'subsets' => array(
3103
+ 'latin',
3104
+ ),
3105
+ ),
3106
+ 'Herr Von Muellerhoff' => array(
3107
+ 'label' => 'Herr Von Muellerhoff',
3108
+ 'variants' => array(
3109
+ 'regular',
3110
+ ),
3111
+ 'subsets' => array(
3112
+ 'latin',
3113
+ 'latin-ext',
3114
+ ),
3115
+ ),
3116
+ 'Holtwood One SC' => array(
3117
+ 'label' => 'Holtwood One SC',
3118
+ 'variants' => array(
3119
+ 'regular',
3120
+ ),
3121
+ 'subsets' => array(
3122
+ 'latin',
3123
+ ),
3124
+ ),
3125
+ 'Homemade Apple' => array(
3126
+ 'label' => 'Homemade Apple',
3127
+ 'variants' => array(
3128
+ 'regular',
3129
+ ),
3130
+ 'subsets' => array(
3131
+ 'latin',
3132
+ ),
3133
+ ),
3134
+ 'Homenaje' => array(
3135
+ 'label' => 'Homenaje',
3136
+ 'variants' => array(
3137
+ 'regular',
3138
+ ),
3139
+ 'subsets' => array(
3140
+ 'latin',
3141
+ 'latin-ext',
3142
+ ),
3143
+ ),
3144
+ 'IM Fell DW Pica' => array(
3145
+ 'label' => 'IM Fell DW Pica',
3146
+ 'variants' => array(
3147
+ 'regular',
3148
+ 'italic',
3149
+ ),
3150
+ 'subsets' => array(
3151
+ 'latin',
3152
+ ),
3153
+ ),
3154
+ 'IM Fell DW Pica SC' => array(
3155
+ 'label' => 'IM Fell DW Pica SC',
3156
+ 'variants' => array(
3157
+ 'regular',
3158
+ ),
3159
+ 'subsets' => array(
3160
+ 'latin',
3161
+ ),
3162
+ ),
3163
+ 'IM Fell Double Pica' => array(
3164
+ 'label' => 'IM Fell Double Pica',
3165
+ 'variants' => array(
3166
+ 'regular',
3167
+ 'italic',
3168
+ ),
3169
+ 'subsets' => array(
3170
+ 'latin',
3171
+ ),
3172
+ ),
3173
+ 'IM Fell Double Pica SC' => array(
3174
+ 'label' => 'IM Fell Double Pica SC',
3175
+ 'variants' => array(
3176
+ 'regular',
3177
+ ),
3178
+ 'subsets' => array(
3179
+ 'latin',
3180
+ ),
3181
+ ),
3182
+ 'IM Fell English' => array(
3183
+ 'label' => 'IM Fell English',
3184
+ 'variants' => array(
3185
+ 'regular',
3186
+ 'italic',
3187
+ ),
3188
+ 'subsets' => array(
3189
+ 'latin',
3190
+ ),
3191
+ ),
3192
+ 'IM Fell English SC' => array(
3193
+ 'label' => 'IM Fell English SC',
3194
+ 'variants' => array(
3195
+ 'regular',
3196
+ ),
3197
+ 'subsets' => array(
3198
+ 'latin',
3199
+ ),
3200
+ ),
3201
+ 'IM Fell French Canon' => array(
3202
+ 'label' => 'IM Fell French Canon',
3203
+ 'variants' => array(
3204
+ 'regular',
3205
+ 'italic',
3206
+ ),
3207
+ 'subsets' => array(
3208
+ 'latin',
3209
+ ),
3210
+ ),
3211
+ 'IM Fell French Canon SC' => array(
3212
+ 'label' => 'IM Fell French Canon SC',
3213
+ 'variants' => array(
3214
+ 'regular',
3215
+ ),
3216
+ 'subsets' => array(
3217
+ 'latin',
3218
+ ),
3219
+ ),
3220
+ 'IM Fell Great Primer' => array(
3221
+ 'label' => 'IM Fell Great Primer',
3222
+ 'variants' => array(
3223
+ 'regular',
3224
+ 'italic',
3225
+ ),
3226
+ 'subsets' => array(
3227
+ 'latin',
3228
+ ),
3229
+ ),
3230
+ 'IM Fell Great Primer SC' => array(
3231
+ 'label' => 'IM Fell Great Primer SC',
3232
+ 'variants' => array(
3233
+ 'regular',
3234
+ ),
3235
+ 'subsets' => array(
3236
+ 'latin',
3237
+ ),
3238
+ ),
3239
+ 'Iceberg' => array(
3240
+ 'label' => 'Iceberg',
3241
+ 'variants' => array(
3242
+ 'regular',
3243
+ ),
3244
+ 'subsets' => array(
3245
+ 'latin',
3246
+ ),
3247
+ ),
3248
+ 'Iceland' => array(
3249
+ 'label' => 'Iceland',
3250
+ 'variants' => array(
3251
+ 'regular',
3252
+ ),
3253
+ 'subsets' => array(
3254
+ 'latin',
3255
+ ),
3256
+ ),
3257
+ 'Imprima' => array(
3258
+ 'label' => 'Imprima',
3259
+ 'variants' => array(
3260
+ 'regular',
3261
+ ),
3262
+ 'subsets' => array(
3263
+ 'latin',
3264
+ 'latin-ext',
3265
+ ),
3266
+ ),
3267
+ 'Inconsolata' => array(
3268
+ 'label' => 'Inconsolata',
3269
+ 'variants' => array(
3270
+ 'regular',
3271
+ '700',
3272
+ ),
3273
+ 'subsets' => array(
3274
+ 'latin',
3275
+ 'latin-ext',
3276
+ ),
3277
+ ),
3278
+ 'Inder' => array(
3279
+ 'label' => 'Inder',
3280
+ 'variants' => array(
3281
+ 'regular',
3282
+ ),
3283
+ 'subsets' => array(
3284
+ 'latin',
3285
+ 'latin-ext',
3286
+ ),
3287
+ ),
3288
+ 'Indie Flower' => array(
3289
+ 'label' => 'Indie Flower',
3290
+ 'variants' => array(
3291
+ 'regular',
3292
+ ),
3293
+ 'subsets' => array(
3294
+ 'latin',
3295
+ ),
3296
+ ),
3297
+ 'Inika' => array(
3298
+ 'label' => 'Inika',
3299
+ 'variants' => array(
3300
+ 'regular',
3301
+ '700',
3302
+ ),
3303
+ 'subsets' => array(
3304
+ 'latin',
3305
+ 'latin-ext',
3306
+ ),
3307
+ ),
3308
+ 'Irish Grover' => array(
3309
+ 'label' => 'Irish Grover',
3310
+ 'variants' => array(
3311
+ 'regular',
3312
+ ),
3313
+ 'subsets' => array(
3314
+ 'latin',
3315
+ ),
3316
+ ),
3317
+ 'Istok Web' => array(
3318
+ 'label' => 'Istok Web',
3319
+ 'variants' => array(
3320
+ 'regular',
3321
+ 'italic',
3322
+ '700',
3323
+ '700italic',
3324
+ ),
3325
+ 'subsets' => array(
3326
+ 'latin',
3327
+ 'cyrillic',
3328
+ 'latin-ext',
3329
+ 'cyrillic-ext',
3330
+ ),
3331
+ ),
3332
+ 'Italiana' => array(
3333
+ 'label' => 'Italiana',
3334
+ 'variants' => array(
3335
+ 'regular',
3336
+ ),
3337
+ 'subsets' => array(
3338
+ 'latin',
3339
+ ),
3340
+ ),
3341
+ 'Italianno' => array(
3342
+ 'label' => 'Italianno',
3343
+ 'variants' => array(
3344
+ 'regular',
3345
+ ),
3346
+ 'subsets' => array(
3347
+ 'latin',
3348
+ 'latin-ext',
3349
+ ),
3350
+ ),
3351
+ 'Jacques Francois' => array(
3352
+ 'label' => 'Jacques Francois',
3353
+ 'variants' => array(
3354
+ 'regular',
3355
+ ),
3356
+ 'subsets' => array(
3357
+ 'latin',
3358
+ ),
3359
+ ),
3360
+ 'Jacques Francois Shadow' => array(
3361
+ 'label' => 'Jacques Francois Shadow',
3362
+ 'variants' => array(
3363
+ 'regular',
3364
+ ),
3365
+ 'subsets' => array(
3366
+ 'latin',
3367
+ ),
3368
+ ),
3369
+ 'Jim Nightshade' => array(
3370
+ 'label' => 'Jim Nightshade',
3371
+ 'variants' => array(
3372
+ 'regular',
3373
+ ),
3374
+ 'subsets' => array(
3375
+ 'latin',
3376
+ 'latin-ext',
3377
+ ),
3378
+ ),
3379
+ 'Jockey One' => array(
3380
+ 'label' => 'Jockey One',
3381
+ 'variants' => array(
3382
+ 'regular',
3383
+ ),
3384
+ 'subsets' => array(
3385
+ 'latin',
3386
+ 'latin-ext',
3387
+ ),
3388
+ ),
3389
+ 'Jolly Lodger' => array(
3390
+ 'label' => 'Jolly Lodger',
3391
+ 'variants' => array(
3392
+ 'regular',
3393
+ ),
3394
+ 'subsets' => array(
3395
+ 'latin',
3396
+ 'latin-ext',
3397
+ ),
3398
+ ),
3399
+ 'Josefin Sans' => array(
3400
+ 'label' => 'Josefin Sans',
3401
+ 'variants' => array(
3402
+ '100',
3403
+ '100italic',
3404
+ '300',
3405
+ '300italic',
3406
+ 'regular',
3407
+ 'italic',
3408
+ '600',
3409
+ '600italic',
3410
+ '700',
3411
+ '700italic',
3412
+ ),
3413
+ 'subsets' => array(
3414
+ 'latin',
3415
+ ),
3416
+ ),
3417
+ 'Josefin Slab' => array(
3418
+ 'label' => 'Josefin Slab',
3419
+ 'variants' => array(
3420
+ '100',
3421
+ '100italic',
3422
+ '300',
3423
+ '300italic',
3424
+ 'regular',
3425
+ 'italic',
3426
+ '600',
3427
+ '600italic',
3428
+ '700',
3429
+ '700italic',
3430
+ ),
3431
+ 'subsets' => array(
3432
+ 'latin',
3433
+ ),
3434
+ ),
3435
+ 'Joti One' => array(
3436
+ 'label' => 'Joti One',
3437
+ 'variants' => array(
3438
+ 'regular',
3439
+ ),
3440
+ 'subsets' => array(
3441
+ 'latin',
3442
+ 'latin-ext',
3443
+ ),
3444
+ ),
3445
+ 'Judson' => array(
3446
+ 'label' => 'Judson',
3447
+ 'variants' => array(
3448
+ 'regular',
3449
+ 'italic',
3450
+ '700',
3451
+ ),
3452
+ 'subsets' => array(
3453
+ 'latin',
3454
+ ),
3455
+ ),
3456
+ 'Julee' => array(
3457
+ 'label' => 'Julee',
3458
+ 'variants' => array(
3459
+ 'regular',
3460
+ ),
3461
+ 'subsets' => array(
3462
+ 'latin',
3463
+ ),
3464
+ ),
3465
+ 'Julius Sans One' => array(
3466
+ 'label' => 'Julius Sans One',
3467
+ 'variants' => array(
3468
+ 'regular',
3469
+ ),
3470
+ 'subsets' => array(
3471
+ 'latin',
3472
+ 'latin-ext',
3473
+ ),
3474
+ ),
3475
+ 'Junge' => array(
3476
+ 'label' => 'Junge',
3477
+ 'variants' => array(
3478
+ 'regular',
3479
+ ),
3480
+ 'subsets' => array(
3481
+ 'latin',
3482
+ ),
3483
+ ),
3484
+ 'Jura' => array(
3485
+ 'label' => 'Jura',
3486
+ 'variants' => array(
3487
+ '300',
3488
+ 'regular',
3489
+ '500',
3490
+ '600',
3491
+ ),
3492
+ 'subsets' => array(
3493
+ 'latin',
3494
+ 'greek-ext',
3495
+ 'cyrillic',
3496
+ 'greek',
3497
+ 'latin-ext',
3498
+ 'cyrillic-ext',
3499
+ ),
3500
+ ),
3501
+ 'Just Another Hand' => array(
3502
+ 'label' => 'Just Another Hand',
3503
+ 'variants' => array(
3504
+ 'regular',
3505
+ ),
3506
+ 'subsets' => array(
3507
+ 'latin',
3508
+ ),
3509
+ ),
3510
+ 'Just Me Again Down Here' => array(
3511
+ 'label' => 'Just Me Again Down Here',
3512
+ 'variants' => array(
3513
+ 'regular',
3514
+ ),
3515
+ 'subsets' => array(
3516
+ 'latin',
3517
+ 'latin-ext',
3518
+ ),
3519
+ ),
3520
+ 'Kameron' => array(
3521
+ 'label' => 'Kameron',
3522
+ 'variants' => array(
3523
+ 'regular',
3524
+ '700',
3525
+ ),
3526
+ 'subsets' => array(
3527
+ 'latin',
3528
+ ),
3529
+ ),
3530
+ 'Kantumruy' => array(
3531
+ 'label' => 'Kantumruy',
3532
+ 'variants' => array(
3533
+ '300',
3534
+ 'regular',
3535
+ '700',
3536
+ ),
3537
+ 'subsets' => array(
3538
+ 'khmer',
3539
+ ),
3540
+ ),
3541
+ 'Karla' => array(
3542
+ 'label' => 'Karla',
3543
+ 'variants' => array(
3544
+ 'regular',
3545
+ 'italic',
3546
+ '700',
3547
+ '700italic',
3548
+ ),
3549
+ 'subsets' => array(
3550
+ 'latin',
3551
+ 'latin-ext',
3552
+ ),
3553
+ ),
3554
+ 'Kaushan Script' => array(
3555
+ 'label' => 'Kaushan Script',
3556
+ 'variants' => array(
3557
+ 'regular',
3558
+ ),
3559
+ 'subsets' => array(
3560
+ 'latin',
3561
+ 'latin-ext',
3562
+ ),
3563
+ ),
3564
+ 'Kavoon' => array(
3565
+ 'label' => 'Kavoon',
3566
+ 'variants' => array(
3567
+ 'regular',
3568
+ ),
3569
+ 'subsets' => array(
3570
+ 'latin',
3571
+ 'latin-ext',
3572
+ ),
3573
+ ),
3574
+ 'Kdam Thmor' => array(
3575
+ 'label' => 'Kdam Thmor',
3576
+ 'variants' => array(
3577
+ 'regular',
3578
+ ),
3579
+ 'subsets' => array(
3580
+ 'khmer',
3581
+ ),
3582
+ ),
3583
+ 'Keania One' => array(
3584
+ 'label' => 'Keania One',
3585
+ 'variants' => array(
3586
+ 'regular',
3587
+ ),
3588
+ 'subsets' => array(
3589
+ 'latin',
3590
+ 'latin-ext',
3591
+ ),
3592
+ ),
3593
+ 'Kelly Slab' => array(
3594
+ 'label' => 'Kelly Slab',
3595
+ 'variants' => array(
3596
+ 'regular',
3597
+ ),
3598
+ 'subsets' => array(
3599
+ 'latin',
3600
+ 'cyrillic',
3601
+ 'latin-ext',
3602
+ ),
3603
+ ),
3604
+ 'Kenia' => array(
3605
+ 'label' => 'Kenia',
3606
+ 'variants' => array(
3607
+ 'regular',
3608
+ ),
3609
+ 'subsets' => array(
3610
+ 'latin',
3611
+ ),
3612
+ ),
3613
+ 'Khmer' => array(
3614
+ 'label' => 'Khmer',
3615
+ 'variants' => array(
3616
+ 'regular',
3617
+ ),
3618
+ 'subsets' => array(
3619
+ 'khmer',
3620
+ ),
3621
+ ),
3622
+ 'Kite One' => array(
3623
+ 'label' => 'Kite One',
3624
+ 'variants' => array(
3625
+ 'regular',
3626
+ ),
3627
+ 'subsets' => array(
3628
+ 'latin',
3629
+ ),
3630
+ ),
3631
+ 'Knewave' => array(
3632
+ 'label' => 'Knewave',
3633
+ 'variants' => array(
3634
+ 'regular',
3635
+ ),
3636
+ 'subsets' => array(
3637
+ 'latin',
3638
+ 'latin-ext',
3639
+ ),
3640
+ ),
3641
+ 'Kotta One' => array(
3642
+ 'label' => 'Kotta One',
3643
+ 'variants' => array(
3644
+ 'regular',
3645
+ ),
3646
+ 'subsets' => array(
3647
+ 'latin',
3648
+ 'latin-ext',
3649
+ ),
3650
+ ),
3651
+ 'Koulen' => array(
3652
+ 'label' => 'Koulen',
3653
+ 'variants' => array(
3654
+ 'regular',
3655
+ ),
3656
+ 'subsets' => array(
3657
+ 'khmer',
3658
+ ),
3659
+ ),
3660
+ 'Kranky' => array(
3661
+ 'label' => 'Kranky',
3662
+ 'variants' => array(
3663
+ 'regular',
3664
+ ),
3665
+ 'subsets' => array(
3666
+ 'latin',
3667
+ ),
3668
+ ),
3669
+ 'Kreon' => array(
3670
+ 'label' => 'Kreon',
3671
+ 'variants' => array(
3672
+ '300',
3673
+ 'regular',
3674
+ '700',
3675
+ ),
3676
+ 'subsets' => array(
3677
+ 'latin',
3678
+ ),
3679
+ ),
3680
+ 'Kristi' => array(
3681
+ 'label' => 'Kristi',
3682
+ 'variants' => array(
3683
+ 'regular',
3684
+ ),
3685
+ 'subsets' => array(
3686
+ 'latin',
3687
+ ),
3688
+ ),
3689
+ 'Krona One' => array(
3690
+ 'label' => 'Krona One',
3691
+ 'variants' => array(
3692
+ 'regular',
3693
+ ),
3694
+ 'subsets' => array(
3695
+ 'latin',
3696
+ 'latin-ext',
3697
+ ),
3698
+ ),
3699
+ 'La Belle Aurore' => array(
3700
+ 'label' => 'La Belle Aurore',
3701
+ 'variants' => array(
3702
+ 'regular',
3703
+ ),
3704
+ 'subsets' => array(
3705
+ 'latin',
3706
+ ),
3707
+ ),
3708
+ 'Lancelot' => array(
3709
+ 'label' => 'Lancelot',
3710
+ 'variants' => array(
3711
+ 'regular',
3712
+ ),
3713
+ 'subsets' => array(
3714
+ 'latin',
3715
+ ),
3716
+ ),
3717
+ 'Lato' => array(
3718
+ 'label' => 'Lato',
3719
+ 'variants' => array(
3720
+ '100',
3721
+ '100italic',
3722
+ '300',
3723
+ '300italic',
3724
+ 'regular',
3725
+ 'italic',
3726
+ '700',
3727
+ '700italic',
3728
+ '900',
3729
+ '900italic',
3730
+ ),
3731
+ 'subsets' => array(
3732
+ 'latin',
3733
+ ),
3734
+ ),
3735
+ 'League Script' => array(
3736
+ 'label' => 'League Script',
3737
+ 'variants' => array(
3738
+ 'regular',
3739
+ ),
3740
+ 'subsets' => array(
3741
+ 'latin',
3742
+ ),
3743
+ ),
3744
+ 'Leckerli One' => array(
3745
+ 'label' => 'Leckerli One',
3746
+ 'variants' => array(
3747
+ 'regular',
3748
+ ),
3749
+ 'subsets' => array(
3750
+ 'latin',
3751
+ ),
3752
+ ),
3753
+ 'Ledger' => array(
3754
+ 'label' => 'Ledger',
3755
+ 'variants' => array(
3756
+ 'regular',
3757
+ ),
3758
+ 'subsets' => array(
3759
+ 'latin',
3760
+ 'cyrillic',
3761
+ 'latin-ext',
3762
+ ),
3763
+ ),
3764
+ 'Lekton' => array(
3765
+ 'label' => 'Lekton',
3766
+ 'variants' => array(
3767
+ 'regular',
3768
+ 'italic',
3769
+ '700',
3770
+ ),
3771
+ 'subsets' => array(
3772
+ 'latin',
3773
+ 'latin-ext',
3774
+ ),
3775
+ ),
3776
+ 'Lemon' => array(
3777
+ 'label' => 'Lemon',
3778
+ 'variants' => array(
3779
+ 'regular',
3780
+ ),
3781
+ 'subsets' => array(
3782
+ 'latin',
3783
+ ),
3784
+ ),
3785
+ 'Libre Baskerville' => array(
3786
+ 'label' => 'Libre Baskerville',
3787
+ 'variants' => array(
3788
+ 'regular',
3789
+ 'italic',
3790
+ '700',
3791
+ ),
3792
+ 'subsets' => array(
3793
+ 'latin',
3794
+ 'latin-ext',
3795
+ ),
3796
+ ),
3797
+ 'Life Savers' => array(
3798
+ 'label' => 'Life Savers',
3799
+ 'variants' => array(
3800
+ 'regular',
3801
+ '700',
3802
+ ),
3803
+ 'subsets' => array(
3804
+ 'latin',
3805
+ 'latin-ext',
3806
+ ),
3807
+ ),
3808
+ 'Lilita One' => array(
3809
+ 'label' => 'Lilita One',
3810
+ 'variants' => array(
3811
+ 'regular',
3812
+ ),
3813
+ 'subsets' => array(
3814
+ 'latin',
3815
+ 'latin-ext',
3816
+ ),
3817
+ ),
3818
+ 'Lily Script One' => array(
3819
+ 'label' => 'Lily Script One',
3820
+ 'variants' => array(
3821
+ 'regular',
3822
+ ),
3823
+ 'subsets' => array(
3824
+ 'latin',
3825
+ 'latin-ext',
3826
+ ),
3827
+ ),
3828
+ 'Limelight' => array(
3829
+ 'label' => 'Limelight',
3830
+ 'variants' => array(
3831
+ 'regular',
3832
+ ),
3833
+ 'subsets' => array(
3834
+ 'latin',
3835
+ 'latin-ext',
3836
+ ),
3837
+ ),
3838
+ 'Linden Hill' => array(
3839
+ 'label' => 'Linden Hill',
3840
+ 'variants' => array(
3841
+ 'regular',
3842
+ 'italic',
3843
+ ),
3844
+ 'subsets' => array(
3845
+ 'latin',
3846
+ ),
3847
+ ),
3848
+ 'Lobster' => array(
3849
+ 'label' => 'Lobster',
3850
+ 'variants' => array(
3851
+ 'regular',
3852
+ ),
3853
+ 'subsets' => array(
3854
+ 'latin',
3855
+ 'cyrillic',
3856
+ 'latin-ext',
3857
+ 'cyrillic-ext',
3858
+ ),
3859
+ ),
3860
+ 'Lobster Two' => array(
3861
+ 'label' => 'Lobster Two',
3862
+ 'variants' => array(
3863
+ 'regular',
3864
+ 'italic',
3865
+ '700',
3866
+ '700italic',
3867
+ ),
3868
+ 'subsets' => array(
3869
+ 'latin',
3870
+ ),
3871
+ ),
3872
+ 'Londrina Outline' => array(
3873
+ 'label' => 'Londrina Outline',
3874
+ 'variants' => array(
3875
+ 'regular',
3876
+ ),
3877
+ 'subsets' => array(
3878
+ 'latin',
3879
+ ),
3880
+ ),
3881
+ 'Londrina Shadow' => array(
3882
+ 'label' => 'Londrina Shadow',
3883
+ 'variants' => array(
3884
+ 'regular',
3885
+ ),
3886
+ 'subsets' => array(
3887
+ 'latin',
3888
+ ),
3889
+ ),
3890
+ 'Londrina Sketch' => array(
3891
+ 'label' => 'Londrina Sketch',
3892
+ 'variants' => array(
3893
+ 'regular',
3894
+ ),
3895
+ 'subsets' => array(
3896
+ 'latin',
3897
+ ),
3898
+ ),
3899
+ 'Londrina Solid' => array(
3900
+ 'label' => 'Londrina Solid',
3901
+ 'variants' => array(
3902
+ 'regular',
3903
+ ),
3904
+ 'subsets' => array(
3905
+ 'latin',
3906
+ ),
3907
+ ),
3908
+ 'Lora' => array(
3909
+ 'label' => 'Lora',
3910
+ 'variants' => array(
3911
+ 'regular',
3912
+ 'italic',
3913
+ '700',
3914
+ '700italic',
3915
+ ),
3916
+ 'subsets' => array(
3917
+ 'latin',
3918
+ 'cyrillic',
3919
+ 'latin-ext',
3920
+ ),
3921
+ ),
3922
+ 'Love Ya Like A Sister' => array(
3923
+ 'label' => 'Love Ya Like A Sister',
3924
+ 'variants' => array(
3925
+ 'regular',
3926
+ ),
3927
+ 'subsets' => array(
3928
+ 'latin',
3929
+ ),
3930
+ ),
3931
+ 'Loved by the King' => array(
3932
+ 'label' => 'Loved by the King',
3933
+ 'variants' => array(
3934
+ 'regular',
3935
+ ),
3936
+ 'subsets' => array(
3937
+ 'latin',
3938
+ ),
3939
+ ),
3940
+ 'Lovers Quarrel' => array(
3941
+ 'label' => 'Lovers Quarrel',
3942
+ 'variants' => array(
3943
+ 'regular',
3944
+ ),
3945
+ 'subsets' => array(
3946
+ 'latin',
3947
+ 'latin-ext',
3948
+ ),
3949
+ ),
3950
+ 'Luckiest Guy' => array(
3951
+ 'label' => 'Luckiest Guy',
3952
+ 'variants' => array(
3953
+ 'regular',
3954
+ ),
3955
+ 'subsets' => array(
3956
+ 'latin',
3957
+ ),
3958
+ ),
3959
+ 'Lusitana' => array(
3960
+ 'label' => 'Lusitana',
3961
+ 'variants' => array(
3962
+ 'regular',
3963
+ '700',
3964
+ ),
3965
+ 'subsets' => array(
3966
+ 'latin',
3967
+ ),
3968
+ ),
3969
+ 'Lustria' => array(
3970
+ 'label' => 'Lustria',
3971
+ 'variants' => array(
3972
+ 'regular',
3973
+ ),
3974
+ 'subsets' => array(
3975
+ 'latin',
3976
+ ),
3977
+ ),
3978
+ 'Macondo' => array(
3979
+ 'label' => 'Macondo',
3980
+ 'variants' => array(
3981
+ 'regular',
3982
+ ),
3983
+ 'subsets' => array(
3984
+ 'latin',
3985
+ ),
3986
+ ),
3987
+ 'Macondo Swash Caps' => array(
3988
+ 'label' => 'Macondo Swash Caps',
3989
+ 'variants' => array(
3990
+ 'regular',
3991
+ ),
3992
+ 'subsets' => array(
3993
+ 'latin',
3994
+ ),
3995
+ ),
3996
+ 'Magra' => array(
3997
+ 'label' => 'Magra',
3998
+ 'variants' => array(
3999
+ 'regular',
4000
+ '700',
4001
+ ),
4002
+ 'subsets' => array(
4003
+ 'latin',
4004
+ 'latin-ext',
4005
+ ),
4006
+ ),
4007
+ 'Maiden Orange' => array(
4008
+ 'label' => 'Maiden Orange',
4009
+ 'variants' => array(
4010
+ 'regular',
4011
+ ),
4012
+ 'subsets' => array(
4013
+ 'latin',
4014
+ ),
4015
+ ),
4016
+ 'Mako' => array(
4017
+ 'label' => 'Mako',
4018
+ 'variants' => array(
4019
+ 'regular',
4020
+ ),
4021
+ 'subsets' => array(
4022
+ 'latin',
4023
+ ),
4024
+ ),
4025
+ 'Marcellus' => array(
4026
+ 'label' => 'Marcellus',
4027
+ 'variants' => array(
4028
+ 'regular',
4029
+ ),
4030
+ 'subsets' => array(
4031
+ 'latin',
4032
+ 'latin-ext',
4033
+ ),
4034
+ ),
4035
+ 'Marcellus SC' => array(
4036
+ 'label' => 'Marcellus SC',
4037
+ 'variants' => array(
4038
+ 'regular',
4039
+ ),
4040
+ 'subsets' => array(
4041
+ 'latin',
4042
+ 'latin-ext',
4043
+ ),
4044
+ ),
4045
+ 'Marck Script' => array(
4046
+ 'label' => 'Marck Script',
4047
+ 'variants' => array(
4048
+ 'regular',
4049
+ ),
4050
+ 'subsets' => array(
4051
+ 'latin',
4052
+ 'cyrillic',
4053
+ 'latin-ext',
4054
+ ),
4055
+ ),
4056
+ 'Margarine' => array(
4057
+ 'label' => 'Margarine',
4058
+ 'variants' => array(
4059
+ 'regular',
4060
+ ),
4061
+ 'subsets' => array(
4062
+ 'latin',
4063
+ 'latin-ext',
4064
+ ),
4065
+ ),
4066
+ 'Marko One' => array(
4067
+ 'label' => 'Marko One',
4068
+ 'variants' => array(
4069
+ 'regular',
4070
+ ),
4071
+ 'subsets' => array(
4072
+ 'latin',
4073
+ ),
4074
+ ),
4075
+ 'Marmelad' => array(
4076
+ 'label' => 'Marmelad',
4077
+ 'variants' => array(
4078
+ 'regular',
4079
+ ),
4080
+ 'subsets' => array(
4081
+ 'latin',
4082
+ 'cyrillic',
4083
+ 'latin-ext',
4084
+ ),
4085
+ ),
4086
+ 'Marvel' => array(
4087
+ 'label' => 'Marvel',
4088
+ 'variants' => array(
4089
+ 'regular',
4090
+ 'italic',
4091
+ '700',
4092
+ '700italic',
4093
+ ),
4094
+ 'subsets' => array(
4095
+ 'latin',
4096
+ ),
4097
+ ),
4098
+ 'Mate' => array(
4099
+ 'label' => 'Mate',
4100
+ 'variants' => array(
4101
+ 'regular',
4102
+ 'italic',
4103
+ ),
4104
+ 'subsets' => array(
4105
+ 'latin',
4106
+ ),
4107
+ ),
4108
+ 'Mate SC' => array(
4109
+ 'label' => 'Mate SC',
4110
+ 'variants' => array(
4111
+ 'regular',
4112
+ ),
4113
+ 'subsets' => array(
4114
+ 'latin',
4115
+ ),
4116
+ ),
4117
+ 'Maven Pro' => array(
4118
+ 'label' => 'Maven Pro',
4119
+ 'variants' => array(
4120
+ 'regular',
4121
+ '500',
4122
+ '700',
4123
+ '900',
4124
+ ),
4125
+ 'subsets' => array(
4126
+ 'latin',
4127
+ ),
4128
+ ),
4129
+ 'McLaren' => array(
4130
+ 'label' => 'McLaren',
4131
+ 'variants' => array(
4132
+ 'regular',
4133
+ ),
4134
+ 'subsets' => array(
4135
+ 'latin',
4136
+ 'latin-ext',
4137
+ ),
4138
+ ),
4139
+ 'Meddon' => array(
4140
+ 'label' => 'Meddon',
4141
+ 'variants' => array(
4142
+ 'regular',
4143
+ ),
4144
+ 'subsets' => array(
4145
+ 'latin',
4146
+ ),
4147
+ ),
4148
+ 'MedievalSharp' => array(
4149
+ 'label' => 'MedievalSharp',
4150
+ 'variants' => array(
4151
+ 'regular',
4152
+ ),
4153
+ 'subsets' => array(
4154
+ 'latin',
4155
+ 'latin-ext',
4156
+ ),
4157
+ ),
4158
+ 'Medula One' => array(
4159
+ 'label' => 'Medula One',
4160
+ 'variants' => array(
4161
+ 'regular',
4162
+ ),
4163
+ 'subsets' => array(
4164
+ 'latin',
4165
+ ),
4166
+ ),
4167
+ 'Megrim' => array(
4168
+ 'label' => 'Megrim',
4169
+ 'variants' => array(
4170
+ 'regular',
4171
+ ),
4172
+ 'subsets' => array(
4173
+ 'latin',
4174
+ ),
4175
+ ),
4176
+ 'Meie Script' => array(
4177
+ 'label' => 'Meie Script',
4178
+ 'variants' => array(
4179
+ 'regular',
4180
+ ),
4181
+ 'subsets' => array(
4182
+ 'latin',
4183
+ 'latin-ext',
4184
+ ),
4185
+ ),
4186
+ 'Merienda' => array(
4187
+ 'label' => 'Merienda',
4188
+ 'variants' => array(
4189
+ 'regular',
4190
+ '700',
4191
+ ),
4192
+ 'subsets' => array(
4193
+ 'latin',
4194
+ 'latin-ext',
4195
+ ),
4196
+ ),
4197
+ 'Merienda One' => array(
4198
+ 'label' => 'Merienda One',
4199
+ 'variants' => array(
4200
+ 'regular',
4201
+ ),
4202
+ 'subsets' => array(
4203
+ 'latin',
4204
+ ),
4205
+ ),
4206
+ 'Merriweather' => array(
4207
+ 'label' => 'Merriweather',
4208
+ 'variants' => array(
4209
+ '300',
4210
+ '300italic',
4211
+ 'regular',
4212
+ 'italic',
4213
+ '700',
4214
+ '700italic',
4215
+ '900',
4216
+ '900italic',
4217
+ ),
4218
+ 'subsets' => array(
4219
+ 'latin',
4220
+ 'latin-ext',
4221
+ ),
4222
+ ),
4223
+ 'Merriweather Sans' => array(
4224
+ 'label' => 'Merriweather Sans',
4225
+ 'variants' => array(
4226
+ '300',
4227
+ '300italic',
4228
+ 'regular',
4229
+ 'italic',
4230
+ '700',
4231
+ '700italic',
4232
+ '800',
4233
+ '800italic',
4234
+ ),
4235
+ 'subsets' => array(
4236
+ 'latin',
4237
+ 'latin-ext',
4238
+ ),
4239
+ ),
4240
+ 'Metal' => array(
4241
+ 'label' => 'Metal',
4242
+ 'variants' => array(
4243
+ 'regular',
4244
+ ),
4245
+ 'subsets' => array(
4246
+ 'khmer',
4247
+ ),
4248
+ ),
4249
+ 'Metal Mania' => array(
4250
+ 'label' => 'Metal Mania',
4251
+ 'variants' => array(
4252
+ 'regular',
4253
+ ),
4254
+ 'subsets' => array(
4255
+ 'latin',
4256
+ 'latin-ext',
4257
+ ),
4258
+ ),
4259
+ 'Metamorphous' => array(
4260
+ 'label' => 'Metamorphous',
4261
+ 'variants' => array(
4262
+ 'regular',
4263
+ ),
4264
+ 'subsets' => array(
4265
+ 'latin',
4266
+ 'latin-ext',
4267
+ ),
4268
+ ),
4269
+ 'Metrophobic' => array(
4270
+ 'label' => 'Metrophobic',
4271
+ 'variants' => array(
4272
+ 'regular',
4273
+ ),
4274
+ 'subsets' => array(
4275
+ 'latin',
4276
+ ),
4277
+ ),
4278
+ 'Michroma' => array(
4279
+ 'label' => 'Michroma',
4280
+ 'variants' => array(
4281
+ 'regular',
4282
+ ),
4283
+ 'subsets' => array(
4284
+ 'latin',
4285
+ ),
4286
+ ),
4287
+ 'Milonga' => array(
4288
+ 'label' => 'Milonga',
4289
+ 'variants' => array(
4290
+ 'regular',
4291
+ ),
4292
+ 'subsets' => array(
4293
+ 'latin',
4294
+ 'latin-ext',
4295
+ ),
4296
+ ),
4297
+ 'Miltonian' => array(
4298
+ 'label' => 'Miltonian',
4299
+ 'variants' => array(
4300
+ 'regular',
4301
+ ),
4302
+ 'subsets' => array(
4303
+ 'latin',
4304
+ ),
4305
+ ),
4306
+ 'Miltonian Tattoo' => array(
4307
+ 'label' => 'Miltonian Tattoo',
4308
+ 'variants' => array(
4309
+ 'regular',
4310
+ ),
4311
+ 'subsets' => array(
4312
+ 'latin',
4313
+ ),
4314
+ ),
4315
+ 'Miniver' => array(
4316
+ 'label' => 'Miniver',
4317
+ 'variants' => array(
4318
+ 'regular',
4319
+ ),
4320
+ 'subsets' => array(
4321
+ 'latin',
4322
+ ),
4323
+ ),
4324
+ 'Miss Fajardose' => array(
4325
+ 'label' => 'Miss Fajardose',
4326
+ 'variants' => array(
4327
+ 'regular',
4328
+ ),
4329
+ 'subsets' => array(
4330
+ 'latin',
4331
+ 'latin-ext',
4332
+ ),
4333
+ ),
4334
+ 'Modern Antiqua' => array(
4335
+ 'label' => 'Modern Antiqua',
4336
+ 'variants' => array(
4337
+ 'regular',
4338
+ ),
4339
+ 'subsets' => array(
4340
+ 'latin',
4341
+ 'latin-ext',
4342
+ ),
4343
+ ),
4344
+ 'Molengo' => array(
4345
+ 'label' => 'Molengo',
4346
+ 'variants' => array(
4347
+ 'regular',
4348
+ ),
4349
+ 'subsets' => array(
4350
+ 'latin',
4351
+ 'latin-ext',
4352
+ ),
4353
+ ),
4354
+ 'Molle' => array(
4355
+ 'label' => 'Molle',
4356
+ 'variants' => array(
4357
+ 'italic',
4358
+ ),
4359
+ 'subsets' => array(
4360
+ 'latin',
4361
+ 'latin-ext',
4362
+ ),
4363
+ ),
4364
+ 'Monda' => array(
4365
+ 'label' => 'Monda',
4366
+ 'variants' => array(
4367
+ 'regular',
4368
+ '700',
4369
+ ),
4370
+ 'subsets' => array(
4371
+ 'latin',
4372
+ 'latin-ext',
4373
+ ),
4374
+ ),
4375
+ 'Monofett' => array(
4376
+ 'label' => 'Monofett',
4377
+ 'variants' => array(
4378
+ 'regular',
4379
+ ),
4380
+ 'subsets' => array(
4381
+ 'latin',
4382
+ ),
4383
+ ),
4384
+ 'Monoton' => array(
4385
+ 'label' => 'Monoton',
4386
+ 'variants' => array(
4387
+ 'regular',
4388
+ ),
4389
+ 'subsets' => array(
4390
+ 'latin',
4391
+ ),
4392
+ ),
4393
+ 'Monsieur La Doulaise' => array(
4394
+ 'label' => 'Monsieur La Doulaise',
4395
+ 'variants' => array(
4396
+ 'regular',
4397
+ ),
4398
+ 'subsets' => array(
4399
+ 'latin',
4400
+ 'latin-ext',
4401
+ ),
4402
+ ),
4403
+ 'Montaga' => array(
4404
+ 'label' => 'Montaga',
4405
+ 'variants' => array(
4406
+ 'regular',
4407
+ ),
4408
+ 'subsets' => array(
4409
+ 'latin',
4410
+ ),
4411
+ ),
4412
+ 'Montez' => array(
4413
+ 'label' => 'Montez',
4414
+ 'variants' => array(
4415
+ 'regular',
4416
+ ),
4417
+ 'subsets' => array(
4418
+ 'latin',
4419
+ ),
4420
+ ),
4421
+ 'Montserrat' => array(
4422
+ 'label' => 'Montserrat',
4423
+ 'variants' => array(
4424
+ 'regular',
4425
+ '700',
4426
+ ),
4427
+ 'subsets' => array(
4428
+ 'latin',
4429
+ ),
4430
+ ),
4431
+ 'Montserrat Alternates' => array(
4432
+ 'label' => 'Montserrat Alternates',
4433
+ 'variants' => array(
4434
+ 'regular',
4435
+ '700',
4436
+ ),
4437
+ 'subsets' => array(
4438
+ 'latin',
4439
+ ),
4440
+ ),
4441
+ 'Montserrat Subrayada' => array(
4442
+ 'label' => 'Montserrat Subrayada',
4443
+ 'variants' => array(
4444
+ 'regular',
4445
+ '700',
4446
+ ),
4447
+ 'subsets' => array(
4448
+ 'latin',
4449
+ ),
4450
+ ),
4451
+ 'Moul' => array(
4452
+ 'label' => 'Moul',
4453
+ 'variants' => array(
4454
+ 'regular',
4455
+ ),
4456
+ 'subsets' => array(
4457
+ 'khmer',
4458
+ ),
4459
+ ),
4460
+ 'Moulpali' => array(
4461
+ 'label' => 'Moulpali',
4462
+ 'variants' => array(
4463
+ 'regular',
4464
+ ),
4465
+ 'subsets' => array(
4466
+ 'khmer',
4467
+ ),
4468
+ ),
4469
+ 'Mountains of Christmas' => array(
4470
+ 'label' => 'Mountains of Christmas',
4471
+ 'variants' => array(
4472
+ 'regular',
4473
+ '700',
4474
+ ),
4475
+ 'subsets' => array(
4476
+ 'latin',
4477
+ ),
4478
+ ),
4479
+ 'Mouse Memoirs' => array(
4480
+ 'label' => 'Mouse Memoirs',
4481
+ 'variants' => array(
4482
+ 'regular',
4483
+ ),
4484
+ 'subsets' => array(
4485
+ 'latin',
4486
+ 'latin-ext',
4487
+ ),
4488
+ ),
4489
+ 'Mr Bedfort' => array(
4490
+ 'label' => 'Mr Bedfort',
4491
+ 'variants' => array(
4492
+ 'regular',
4493
+ ),
4494
+ 'subsets' => array(
4495
+ 'latin',
4496
+ 'latin-ext',
4497
+ ),
4498
+ ),
4499
+ 'Mr Dafoe' => array(
4500
+ 'label' => 'Mr Dafoe',
4501
+ 'variants' => array(
4502
+ 'regular',
4503
+ ),
4504
+ 'subsets' => array(
4505
+ 'latin',
4506
+ 'latin-ext',
4507
+ ),
4508
+ ),
4509
+ 'Mr De Haviland' => array(
4510
+ 'label' => 'Mr De Haviland',
4511
+ 'variants' => array(
4512
+ 'regular',
4513
+ ),
4514
+ 'subsets' => array(
4515
+ 'latin',
4516
+ 'latin-ext',
4517
+ ),
4518
+ ),
4519
+ 'Mrs Saint Delafield' => array(
4520
+ 'label' => 'Mrs Saint Delafield',
4521
+ 'variants' => array(
4522
+ 'regular',
4523
+ ),
4524
+ 'subsets' => array(
4525
+ 'latin',
4526
+ 'latin-ext',
4527
+ ),
4528
+ ),
4529
+ 'Mrs Sheppards' => array(
4530
+ 'label' => 'Mrs Sheppards',
4531
+ 'variants' => array(
4532
+ 'regular',
4533
+ ),
4534
+ 'subsets' => array(
4535
+ 'latin',
4536
+ 'latin-ext',
4537
+ ),
4538
+ ),
4539
+ 'Muli' => array(
4540
+ 'label' => 'Muli',
4541
+ 'variants' => array(
4542
+ '300',
4543
+ '300italic',
4544
+ 'regular',
4545
+ 'italic',
4546
+ ),
4547
+ 'subsets' => array(
4548
+ 'latin',
4549
+ ),
4550
+ ),
4551
+ 'Mystery Quest' => array(
4552
+ 'label' => 'Mystery Quest',
4553
+ 'variants' => array(
4554
+ 'regular',
4555
+ ),
4556
+ 'subsets' => array(
4557
+ 'latin',
4558
+ 'latin-ext',
4559
+ ),
4560
+ ),
4561
+ 'Neucha' => array(
4562
+ 'label' => 'Neucha',
4563
+ 'variants' => array(
4564
+ 'regular',
4565
+ ),
4566
+ 'subsets' => array(
4567
+ 'latin',
4568
+ 'cyrillic',
4569
+ ),
4570
+ ),
4571
+ 'Neuton' => array(
4572
+ 'label' => 'Neuton',
4573
+ 'variants' => array(
4574
+ '200',
4575
+ '300',
4576
+ 'regular',
4577
+ 'italic',
4578
+ '700',
4579
+ '800',
4580
+ ),
4581
+ 'subsets' => array(
4582
+ 'latin',
4583
+ 'latin-ext',
4584
+ ),
4585
+ ),
4586
+ 'New Rocker' => array(
4587
+ 'label' => 'New Rocker',
4588
+ 'variants' => array(
4589
+ 'regular',
4590
+ ),
4591
+ 'subsets' => array(
4592
+ 'latin',
4593
+ 'latin-ext',
4594
+ ),
4595
+ ),
4596
+ 'News Cycle' => array(
4597
+ 'label' => 'News Cycle',
4598
+ 'variants' => array(
4599
+ 'regular',
4600
+ '700',
4601
+ ),
4602
+ 'subsets' => array(
4603
+ 'latin',
4604
+ 'latin-ext',
4605
+ ),
4606
+ ),
4607
+ 'Niconne' => array(
4608
+ 'label' => 'Niconne',
4609
+ 'variants' => array(
4610
+ 'regular',
4611
+ ),
4612
+ 'subsets' => array(
4613
+ 'latin',
4614
+ 'latin-ext',
4615
+ ),
4616
+ ),
4617
+ 'Nixie One' => array(
4618
+ 'label' => 'Nixie One',
4619
+ 'variants' => array(
4620
+ 'regular',
4621
+ ),
4622
+ 'subsets' => array(
4623
+ 'latin',
4624
+ ),
4625
+ ),
4626
+ 'Nobile' => array(
4627
+ 'label' => 'Nobile',
4628
+ 'variants' => array(
4629
+ 'regular',
4630
+ 'italic',
4631
+ '700',
4632
+ '700italic',
4633
+ ),
4634
+ 'subsets' => array(
4635
+ 'latin',
4636
+ ),
4637
+ ),
4638
+ 'Nokora' => array(
4639
+ 'label' => 'Nokora',
4640
+ 'variants' => array(
4641
+ 'regular',
4642
+ '700',
4643
+ ),
4644
+ 'subsets' => array(
4645
+ 'khmer',
4646
+ ),
4647
+ ),
4648
+ 'Norican' => array(
4649
+ 'label' => 'Norican',
4650
+ 'variants' => array(
4651
+ 'regular',
4652
+ ),
4653
+ 'subsets' => array(
4654
+ 'latin',
4655
+ 'latin-ext',
4656
+ ),
4657
+ ),
4658
+ 'Nosifer' => array(
4659
+ 'label' => 'Nosifer',
4660
+ 'variants' => array(
4661
+ 'regular',
4662
+ ),
4663
+ 'subsets' => array(
4664
+ 'latin',
4665
+ 'latin-ext',
4666
+ ),
4667
+ ),
4668
+ 'Nothing You Could Do' => array(
4669
+ 'label' => 'Nothing You Could Do',
4670
+ 'variants' => array(
4671
+ 'regular',
4672
+ ),
4673
+ 'subsets' => array(
4674
+ 'latin',
4675
+ ),
4676
+ ),
4677
+ 'Noticia Text' => array(
4678
+ 'label' => 'Noticia Text',
4679
+ 'variants' => array(
4680
+ 'regular',
4681
+ 'italic',
4682
+ '700',
4683
+ '700italic',
4684
+ ),
4685
+ 'subsets' => array(
4686
+ 'latin',
4687
+ 'vietnamese',
4688
+ 'latin-ext',
4689
+ ),
4690
+ ),
4691
+ 'Noto Sans' => array(
4692
+ 'label' => 'Noto Sans',
4693
+ 'variants' => array(
4694
+ 'regular',
4695
+ 'italic',
4696
+ '700',
4697
+ '700italic',
4698
+ ),
4699
+ 'subsets' => array(
4700
+ 'latin',
4701
+ 'greek-ext',
4702
+ 'cyrillic',
4703
+ 'greek',
4704
+ 'vietnamese',
4705
+ 'latin-ext',
4706
+ 'devanagari',
4707
+ 'cyrillic-ext',
4708
+ ),
4709
+ ),
4710
+ 'Noto Serif' => array(
4711
+ 'label' => 'Noto Serif',
4712
+ 'variants' => array(
4713
+ 'regular',
4714
+ 'italic',
4715
+ '700',
4716
+ '700italic',
4717
+ ),
4718
+ 'subsets' => array(
4719
+ 'latin',
4720
+ 'greek-ext',
4721
+ 'cyrillic',
4722
+ 'greek',
4723
+ 'vietnamese',
4724
+ 'latin-ext',
4725
+ 'cyrillic-ext',
4726
+ ),
4727
+ ),
4728
+ 'Nova Cut' => array(
4729
+ 'label' => 'Nova Cut',
4730
+ 'variants' => array(
4731
+ 'regular',
4732
+ ),
4733
+ 'subsets' => array(
4734
+ 'latin',
4735
+ ),
4736
+ ),
4737
+ 'Nova Flat' => array(
4738
+ 'label' => 'Nova Flat',
4739
+ 'variants' => array(
4740
+ 'regular',
4741
+ ),
4742
+ 'subsets' => array(
4743
+ 'latin',
4744
+ ),
4745
+ ),
4746
+ 'Nova Mono' => array(
4747
+ 'label' => 'Nova Mono',
4748
+ 'variants' => array(
4749
+ 'regular',
4750
+ ),
4751
+ 'subsets' => array(
4752
+ 'latin',
4753
+ 'greek',
4754
+ ),
4755
+ ),
4756
+ 'Nova Oval' => array(
4757
+ 'label' => 'Nova Oval',
4758
+ 'variants' => array(
4759
+ 'regular',
4760
+ ),
4761
+ 'subsets' => array(
4762
+ 'latin',
4763
+ ),
4764
+ ),
4765
+ 'Nova Round' => array(
4766
+ 'label' => 'Nova Round',
4767
+ 'variants' => array(
4768
+ 'regular',
4769
+ ),
4770
+ 'subsets' => array(
4771
+ 'latin',
4772
+ ),
4773
+ ),
4774
+ 'Nova Script' => array(
4775
+ 'label' => 'Nova Script',
4776
+ 'variants' => array(
4777
+ 'regular',
4778
+ ),
4779
+ 'subsets' => array(
4780
+ 'latin',
4781
+ ),
4782
+ ),
4783
+ 'Nova Slim' => array(
4784
+ 'label' => 'Nova Slim',
4785
+ 'variants' => array(
4786
+ 'regular',
4787
+ ),
4788
+ 'subsets' => array(
4789
+ 'latin',
4790
+ ),
4791
+ ),
4792
+ 'Nova Square' => array(
4793
+ 'label' => 'Nova Square',
4794
+ 'variants' => array(
4795
+ 'regular',
4796
+ ),
4797
+ 'subsets' => array(
4798
+ 'latin',
4799
+ ),
4800
+ ),
4801
+ 'Numans' => array(
4802
+ 'label' => 'Numans',
4803
+ 'variants' => array(
4804
+ 'regular',
4805
+ ),
4806
+ 'subsets' => array(
4807
+ 'latin',
4808
+ ),
4809
+ ),
4810
+ 'Nunito' => array(
4811
+ 'label' => 'Nunito',
4812
+ 'variants' => array(
4813
+ '300',
4814
+ 'regular',
4815
+ '700',
4816
+ ),
4817
+ 'subsets' => array(
4818
+ 'latin',
4819
+ ),
4820
+ ),
4821
+ 'Odor Mean Chey' => array(
4822
+ 'label' => 'Odor Mean Chey',
4823
+ 'variants' => array(
4824
+ 'regular',
4825
+ ),
4826
+ 'subsets' => array(
4827
+ 'khmer',
4828
+ ),
4829
+ ),
4830
+ 'Offside' => array(
4831
+ 'label' => 'Offside',
4832
+ 'variants' => array(
4833
+ 'regular',
4834
+ ),
4835
+ 'subsets' => array(
4836
+ 'latin',
4837
+ ),
4838
+ ),
4839
+ 'Old Standard TT' => array(
4840
+ 'label' => 'Old Standard TT',
4841
+ 'variants' => array(
4842
+ 'regular',
4843
+ 'italic',
4844
+ '700',
4845
+ ),
4846
+ 'subsets' => array(
4847
+ 'latin',
4848
+ ),
4849
+ ),
4850
+ 'Oldenburg' => array(
4851
+ 'label' => 'Oldenburg',
4852
+ 'variants' => array(
4853
+ 'regular',
4854
+ ),
4855
+ 'subsets' => array(
4856
+ 'latin',
4857
+ 'latin-ext',
4858
+ ),
4859
+ ),
4860
+ 'Oleo Script' => array(
4861
+ 'label' => 'Oleo Script',
4862
+ 'variants' => array(
4863
+ 'regular',
4864
+ '700',
4865
+ ),
4866
+ 'subsets' => array(
4867
+ 'latin',
4868
+ 'latin-ext',
4869
+ ),
4870
+ ),
4871
+ 'Oleo Script Swash Caps' => array(
4872
+ 'label' => 'Oleo Script Swash Caps',
4873
+ 'variants' => array(
4874
+ 'regular',
4875
+ '700',
4876
+ ),
4877
+ 'subsets' => array(
4878
+ 'latin',
4879
+ 'latin-ext',
4880
+ ),
4881
+ ),
4882
+ 'Open Sans' => array(
4883
+ 'label' => 'Open Sans',
4884
+ 'variants' => array(
4885
+ '300',
4886
+ '300italic',
4887
+ 'regular',
4888
+ 'italic',
4889
+ '600',
4890
+ '600italic',
4891
+ '700',
4892
+ '700italic',
4893
+ '800',
4894
+ '800italic',
4895
+ ),
4896
+ 'subsets' => array(
4897
+ 'latin',
4898
+ 'greek-ext',
4899
+ 'cyrillic',
4900
+ 'greek',
4901
+ 'vietnamese',
4902
+ 'latin-ext',
4903
+ 'devanagari',
4904
+ 'cyrillic-ext',
4905
+ ),
4906
+ ),
4907
+ 'Open Sans Condensed' => array(
4908
+ 'label' => 'Open Sans Condensed',
4909
+ 'variants' => array(
4910
+ '300',
4911
+ '300italic',
4912
+ '700',
4913
+ ),
4914
+ 'subsets' => array(
4915
+ 'latin',
4916
+ 'greek-ext',
4917
+ 'cyrillic',
4918
+ 'greek',
4919
+ 'vietnamese',
4920
+ 'latin-ext',
4921
+ 'cyrillic-ext',
4922
+ ),
4923
+ ),
4924
+ 'Oranienbaum' => array(
4925
+ 'label' => 'Oranienbaum',
4926
+ 'variants' => array(
4927
+ 'regular',
4928
+ ),
4929
+ 'subsets' => array(
4930
+ 'latin',
4931
+ 'cyrillic',
4932
+ 'latin-ext',
4933
+ 'cyrillic-ext',
4934
+ ),
4935
+ ),
4936
+ 'Orbitron' => array(
4937
+ 'label' => 'Orbitron',
4938
+ 'variants' => array(
4939
+ 'regular',
4940
+ '500',
4941
+ '700',
4942
+ '900',
4943
+ ),
4944
+ 'subsets' => array(
4945
+ 'latin',
4946
+ ),
4947
+ ),
4948
+ 'Oregano' => array(
4949
+ 'label' => 'Oregano',
4950
+ 'variants' => array(
4951
+ 'regular',
4952
+ 'italic',
4953
+ ),
4954
+ 'subsets' => array(
4955
+ 'latin',
4956
+ 'latin-ext',
4957
+ ),
4958
+ ),
4959
+ 'Orienta' => array(
4960
+ 'label' => 'Orienta',
4961
+ 'variants' => array(
4962
+ 'regular',
4963
+ ),
4964
+ 'subsets' => array(
4965
+ 'latin',
4966
+ 'latin-ext',
4967
+ ),
4968
+ ),
4969
+ 'Original Surfer' => array(
4970
+ 'label' => 'Original Surfer',
4971
+ 'variants' => array(
4972
+ 'regular',
4973
+ ),
4974
+ 'subsets' => array(
4975
+ 'latin',
4976
+ ),
4977
+ ),
4978
+ 'Oswald' => array(
4979
+ 'label' => 'Oswald',
4980
+ 'variants' => array(
4981
+ '300',
4982
+ 'regular',
4983
+ '700',
4984
+ ),
4985
+ 'subsets' => array(
4986
+ 'latin',
4987
+ 'latin-ext',
4988
+ ),
4989
+ ),
4990
+ 'Over the Rainbow' => array(
4991
+ 'label' => 'Over the Rainbow',
4992
+ 'variants' => array(
4993
+ 'regular',
4994
+ ),
4995
+ 'subsets' => array(
4996
+ 'latin',
4997
+ ),
4998
+ ),
4999
+ 'Overlock' => array(
5000
+ 'label' => 'Overlock',
5001
+ 'variants' => array(
5002
+ 'regular',
5003
+ 'italic',
5004
+ '700',
5005
+ '700italic',
5006
+ '900',
5007
+ '900italic',
5008
+ ),
5009
+ 'subsets' => array(
5010
+ 'latin',
5011
+ 'latin-ext',
5012
+ ),
5013
+ ),
5014
+ 'Overlock SC' => array(
5015
+ 'label' => 'Overlock SC',
5016
+ 'variants' => array(
5017
+ 'regular',
5018
+ ),
5019
+ 'subsets' => array(
5020
+ 'latin',
5021
+ 'latin-ext',
5022
+ ),
5023
+ ),
5024
+ 'Ovo' => array(
5025
+ 'label' => 'Ovo',
5026
+ 'variants' => array(
5027
+ 'regular',
5028
+ ),
5029
+ 'subsets' => array(
5030
+ 'latin',
5031
+ ),
5032
+ ),
5033
+ 'Oxygen' => array(
5034
+ 'label' => 'Oxygen',
5035
+ 'variants' => array(
5036
+ '300',
5037
+ 'regular',
5038
+ '700',
5039
+ ),
5040
+ 'subsets' => array(
5041
+ 'latin',
5042
+ 'latin-ext',
5043
+ ),
5044
+ ),
5045
+ 'Oxygen Mono' => array(
5046
+ 'label' => 'Oxygen Mono',
5047
+ 'variants' => array(
5048
+ 'regular',
5049
+ ),
5050
+ 'subsets' => array(
5051
+ 'latin',
5052
+ 'latin-ext',
5053
+ ),
5054
+ ),
5055
+ 'PT Mono' => array(
5056
+ 'label' => 'PT Mono',
5057
+ 'variants' => array(
5058
+ 'regular',
5059
+ ),
5060
+ 'subsets' => array(
5061
+ 'latin',
5062
+ 'cyrillic',
5063
+ 'latin-ext',
5064
+ 'cyrillic-ext',
5065
+ ),
5066
+ ),
5067
+ 'PT Sans' => array(
5068
+ 'label' => 'PT Sans',
5069
+ 'variants' => array(
5070
+ 'regular',
5071
+ 'italic',
5072
+ '700',
5073
+ '700italic',
5074
+ ),
5075
+ 'subsets' => array(
5076
+ 'latin',
5077
+ 'cyrillic',
5078
+ 'latin-ext',
5079
+ 'cyrillic-ext',
5080
+ ),
5081
+ ),
5082
+ 'PT Sans Caption' => array(
5083
+ 'label' => 'PT Sans Caption',
5084
+ 'variants' => array(
5085
+ 'regular',
5086
+ '700',
5087
+ ),
5088
+ 'subsets' => array(
5089
+ 'latin',
5090
+ 'cyrillic',
5091
+ 'latin-ext',
5092
+ 'cyrillic-ext',
5093
+ ),
5094
+ ),
5095
+ 'PT Sans Narrow' => array(
5096
+ 'label' => 'PT Sans Narrow',
5097
+ 'variants' => array(
5098
+ 'regular',
5099
+ '700',
5100
+ ),
5101
+ 'subsets' => array(
5102
+ 'latin',
5103
+ 'cyrillic',
5104
+ 'latin-ext',
5105
+ 'cyrillic-ext',
5106
+ ),
5107
+ ),
5108
+ 'PT Serif' => array(
5109
+ 'label' => 'PT Serif',
5110
+ 'variants' => array(
5111
+ 'regular',
5112
+ 'italic',
5113
+ '700',
5114
+ '700italic',
5115
+ ),
5116
+ 'subsets' => array(
5117
+ 'latin',
5118
+ 'cyrillic',
5119
+ 'latin-ext',
5120
+ 'cyrillic-ext',
5121
+ ),
5122
+ ),
5123
+ 'PT Serif Caption' => array(
5124
+ 'label' => 'PT Serif Caption',
5125
+ 'variants' => array(
5126
+ 'regular',
5127
+ 'italic',
5128
+ ),
5129
+ 'subsets' => array(
5130
+ 'latin',
5131
+ 'cyrillic',
5132
+ 'latin-ext',
5133
+ 'cyrillic-ext',
5134
+ ),
5135
+ ),
5136
+ 'Pacifico' => array(
5137
+ 'label' => 'Pacifico',
5138
+ 'variants' => array(
5139
+ 'regular',
5140
+ ),
5141
+ 'subsets' => array(
5142
+ 'latin',
5143
+ ),
5144
+ ),
5145
+ 'Paprika' => array(
5146
+ 'label' => 'Paprika',
5147
+ 'variants' => array(
5148
+ 'regular',
5149
+ ),
5150
+ 'subsets' => array(
5151
+ 'latin',
5152
+ ),
5153
+ ),
5154
+ 'Parisienne' => array(
5155
+ 'label' => 'Parisienne',
5156
+ 'variants' => array(
5157
+ 'regular',
5158
+ ),
5159
+ 'subsets' => array(
5160
+ 'latin',
5161
+ 'latin-ext',
5162
+ ),
5163
+ ),
5164
+ 'Passero One' => array(
5165
+ 'label' => 'Passero One',
5166
+ 'variants' => array(
5167
+ 'regular',
5168
+ ),
5169
+ 'subsets' => array(
5170
+ 'latin',
5171
+ 'latin-ext',
5172
+ ),
5173
+ ),
5174
+ 'Passion One' => array(
5175
+ 'label' => 'Passion One',
5176
+ 'variants' => array(
5177
+ 'regular',
5178
+ '700',
5179
+ '900',
5180
+ ),
5181
+ 'subsets' => array(
5182
+ 'latin',
5183
+ 'latin-ext',
5184
+ ),
5185
+ ),
5186
+ 'Pathway Gothic One' => array(
5187
+ 'label' => 'Pathway Gothic One',
5188
+ 'variants' => array(
5189
+ 'regular',
5190
+ ),
5191
+ 'subsets' => array(
5192
+ 'latin',
5193
+ 'latin-ext',
5194
+ ),
5195
+ ),
5196
+ 'Patrick Hand' => array(
5197
+ 'label' => 'Patrick Hand',
5198
+ 'variants' => array(
5199
+ 'regular',
5200
+ ),
5201
+ 'subsets' => array(
5202
+ 'latin',
5203
+ 'vietnamese',
5204
+ 'latin-ext',
5205
+ ),
5206
+ ),
5207
+ 'Patrick Hand SC' => array(
5208
+ 'label' => 'Patrick Hand SC',
5209
+ 'variants' => array(
5210
+ 'regular',
5211
+ ),
5212
+ 'subsets' => array(
5213
+ 'latin',
5214
+ 'vietnamese',
5215
+ 'latin-ext',
5216
+ ),
5217
+ ),
5218
+ 'Patua One' => array(
5219
+ 'label' => 'Patua One',
5220
+ 'variants' => array(
5221
+ 'regular',
5222
+ ),
5223
+ 'subsets' => array(
5224
+ 'latin',
5225
+ ),
5226
+ ),
5227
+ 'Paytone One' => array(
5228
+ 'label' => 'Paytone One',
5229
+ 'variants' => array(
5230
+ 'regular',
5231
+ ),
5232
+ 'subsets' => array(
5233
+ 'latin',
5234
+ ),
5235
+ ),
5236
+ 'Peralta' => array(
5237
+ 'label' => 'Peralta',
5238
+ 'variants' => array(
5239
+ 'regular',
5240
+ ),
5241
+ 'subsets' => array(
5242
+ 'latin',
5243
+ 'latin-ext',
5244
+ ),
5245
+ ),
5246
+ 'Permanent Marker' => array(
5247
+ 'label' => 'Permanent Marker',
5248
+ 'variants' => array(
5249
+ 'regular',
5250
+ ),
5251
+ 'subsets' => array(
5252
+ 'latin',
5253
+ ),
5254
+ ),
5255
+ 'Petit Formal Script' => array(
5256
+ 'label' => 'Petit Formal Script',
5257
+ 'variants' => array(
5258
+ 'regular',
5259
+ ),
5260
+ 'subsets' => array(
5261
+ 'latin',
5262
+ 'latin-ext',
5263
+ ),
5264
+ ),
5265
+ 'Petrona' => array(
5266
+ 'label' => 'Petrona',
5267
+ 'variants' => array(
5268
+ 'regular',
5269
+ ),
5270
+ 'subsets' => array(
5271
+ 'latin',
5272
+ ),
5273
+ ),
5274
+ 'Philosopher' => array(
5275
+ 'label' => 'Philosopher',
5276
+ 'variants' => array(
5277
+ 'regular',
5278
+ 'italic',
5279
+ '700',
5280
+ '700italic',
5281
+ ),
5282
+ 'subsets' => array(
5283
+ 'latin',
5284
+ 'cyrillic',
5285
+ ),
5286
+ ),
5287
+ 'Piedra' => array(
5288
+ 'label' => 'Piedra',
5289
+ 'variants' => array(
5290
+ 'regular',
5291
+ ),
5292
+ 'subsets' => array(
5293
+ 'latin',
5294
+ 'latin-ext',
5295
+ ),
5296
+ ),
5297
+ 'Pinyon Script' => array(
5298
+ 'label' => 'Pinyon Script',
5299
+ 'variants' => array(
5300
+ 'regular',
5301
+ ),
5302
+ 'subsets' => array(
5303
+ 'latin',
5304
+ ),
5305
+ ),
5306
+ 'Pirata One' => array(
5307
+ 'label' => 'Pirata One',
5308
+ 'variants' => array(
5309
+ 'regular',
5310
+ ),
5311
+ 'subsets' => array(
5312
+ 'latin',
5313
+ 'latin-ext',
5314
+ ),
5315
+ ),
5316
+ 'Plaster' => array(
5317
+ 'label' => 'Plaster',
5318
+ 'variants' => array(
5319
+ 'regular',
5320
+ ),
5321
+ 'subsets' => array(
5322
+ 'latin',
5323
+ 'latin-ext',
5324
+ ),
5325
+ ),
5326
+ 'Play' => array(
5327
+ 'label' => 'Play',
5328
+ 'variants' => array(
5329
+ 'regular',
5330
+ '700',
5331
+ ),
5332
+ 'subsets' => array(
5333
+ 'latin',
5334
+ 'greek-ext',
5335
+ 'cyrillic',
5336
+ 'greek',
5337
+ 'latin-ext',
5338
+ 'cyrillic-ext',
5339
+ ),
5340
+ ),
5341
+ 'Playball' => array(
5342
+ 'label' => 'Playball',
5343
+ 'variants' => array(
5344
+ 'regular',
5345
+ ),
5346
+ 'subsets' => array(
5347
+ 'latin',
5348
+ 'latin-ext',
5349
+ ),
5350
+ ),
5351
+ 'Playfair Display' => array(
5352
+ 'label' => 'Playfair Display',
5353
+ 'variants' => array(
5354
+ 'regular',
5355
+ 'italic',
5356
+ '700',
5357
+ '700italic',
5358
+ '900',
5359
+ '900italic',
5360
+ ),
5361
+ 'subsets' => array(
5362
+ 'latin',
5363
+ 'cyrillic',
5364
+ 'latin-ext',
5365
+ ),
5366
+ ),
5367
+ 'Playfair Display SC' => array(
5368
+ 'label' => 'Playfair Display SC',
5369
+ 'variants' => array(
5370
+ 'regular',
5371
+ 'italic',
5372
+ '700',
5373
+ '700italic',
5374
+ '900',
5375
+ '900italic',
5376
+ ),
5377
+ 'subsets' => array(
5378
+ 'latin',
5379
+ 'cyrillic',
5380
+ 'latin-ext',
5381
+ ),
5382
+ ),
5383
+ 'Podkova' => array(
5384
+ 'label' => 'Podkova',
5385
+ 'variants' => array(
5386
+ 'regular',
5387
+ '700',
5388
+ ),
5389
+ 'subsets' => array(
5390
+ 'latin',
5391
+ ),
5392
+ ),
5393
+ 'Poiret One' => array(
5394
+ 'label' => 'Poiret One',
5395
+ 'variants' => array(
5396
+ 'regular',
5397
+ ),
5398
+ 'subsets' => array(
5399
+ 'latin',
5400
+ 'cyrillic',
5401
+ 'latin-ext',
5402
+ ),
5403
+ ),
5404
+ 'Poller One' => array(
5405
+ 'label' => 'Poller One',
5406
+ 'variants' => array(
5407
+ 'regular',
5408
+ ),
5409
+ 'subsets' => array(
5410
+ 'latin',
5411
+ ),
5412
+ ),
5413
+ 'Poly' => array(
5414
+ 'label' => 'Poly',
5415
+ 'variants' => array(
5416
+ 'regular',
5417
+ 'italic',
5418
+ ),
5419
+ 'subsets' => array(
5420
+ 'latin',
5421
+ ),
5422
+ ),
5423
+ 'Pompiere' => array(
5424
+ 'label' => 'Pompiere',
5425
+ 'variants' => array(
5426
+ 'regular',
5427
+ ),
5428
+ 'subsets' => array(
5429
+ 'latin',
5430
+ ),
5431
+ ),
5432
+ 'Pontano Sans' => array(
5433
+ 'label' => 'Pontano Sans',
5434
+ 'variants' => array(
5435
+ 'regular',
5436
+ ),
5437
+ 'subsets' => array(
5438
+ 'latin',
5439
+ 'latin-ext',
5440
+ ),
5441
+ ),
5442
+ 'Port Lligat Sans' => array(
5443
+ 'label' => 'Port Lligat Sans',
5444
+ 'variants' => array(
5445
+ 'regular',
5446
+ ),
5447
+ 'subsets' => array(
5448
+ 'latin',
5449
+ ),
5450
+ ),
5451
+ 'Port Lligat Slab' => array(
5452
+ 'label' => 'Port Lligat Slab',
5453
+ 'variants' => array(
5454
+ 'regular',
5455
+ ),
5456
+ 'subsets' => array(
5457
+ 'latin',
5458
+ ),
5459
+ ),
5460
+ 'Prata' => array(
5461
+ 'label' => 'Prata',
5462
+ 'variants' => array(
5463
+ 'regular',
5464
+ ),
5465
+ 'subsets' => array(
5466
+ 'latin',
5467
+ ),
5468
+ ),
5469
+ 'Preahvihear' => array(
5470
+ 'label' => 'Preahvihear',
5471
+ 'variants' => array(
5472
+ 'regular',
5473
+ ),
5474
+ 'subsets' => array(
5475
+ 'khmer',
5476
+ ),
5477
+ ),
5478
+ 'Press Start 2P' => array(
5479
+ 'label' => 'Press Start 2P',
5480
+ 'variants' => array(
5481
+ 'regular',
5482
+ ),
5483
+ 'subsets' => array(
5484
+ 'latin',
5485
+ 'cyrillic',
5486
+ 'greek',
5487
+ 'latin-ext',
5488
+ ),
5489
+ ),
5490
+ 'Princess Sofia' => array(
5491
+ 'label' => 'Princess Sofia',
5492
+ 'variants' => array(
5493
+ 'regular',
5494
+ ),
5495
+ 'subsets' => array(
5496
+ 'latin',
5497
+ 'latin-ext',
5498
+ ),
5499
+ ),
5500
+ 'Prociono' => array(
5501
+ 'label' => 'Prociono',
5502
+ 'variants' => array(
5503
+ 'regular',
5504
+ ),
5505
+ 'subsets' => array(
5506
+ 'latin',
5507
+ ),
5508
+ ),
5509
+ 'Prosto One' => array(
5510
+ 'label' => 'Prosto One',
5511
+ 'variants' => array(
5512
+ 'regular',
5513
+ ),
5514
+ 'subsets' => array(
5515
+ 'latin',
5516
+ 'cyrillic',
5517
+ 'latin-ext',
5518
+ ),
5519
+ ),
5520
+ 'Puritan' => array(
5521
+ 'label' => 'Puritan',
5522
+ 'variants' => array(
5523
+ 'regular',
5524
+ 'italic',
5525
+ '700',
5526
+ '700italic',
5527
+ ),
5528
+ 'subsets' => array(
5529
+ 'latin',
5530
+ ),
5531
+ ),
5532
+ 'Purple Purse' => array(
5533
+ 'label' => 'Purple Purse',
5534
+ 'variants' => array(
5535
+ 'regular',
5536
+ ),
5537
+ 'subsets' => array(
5538
+ 'latin',
5539
+ 'latin-ext',
5540
+ ),
5541
+ ),
5542
+ 'Quando' => array(
5543
+ 'label' => 'Quando',
5544
+ 'variants' => array(
5545
+ 'regular',
5546
+ ),
5547
+ 'subsets' => array(
5548
+ 'latin',
5549
+ 'latin-ext',
5550
+ ),
5551
+ ),
5552
+ 'Quantico' => array(
5553
+ 'label' => 'Quantico',
5554
+ 'variants' => array(
5555
+ 'regular',
5556
+ 'italic',
5557
+ '700',
5558
+ '700italic',
5559
+ ),
5560
+ 'subsets' => array(
5561
+ 'latin',
5562
+ ),
5563
+ ),
5564
+ 'Quattrocento' => array(
5565
+ 'label' => 'Quattrocento',
5566
+ 'variants' => array(
5567
+ 'regular',
5568
+ '700',
5569
+ ),
5570
+ 'subsets' => array(
5571
+ 'latin',
5572
+ 'latin-ext',
5573
+ ),
5574
+ ),
5575
+ 'Quattrocento Sans' => array(
5576
+ 'label' => 'Quattrocento Sans',
5577
+ 'variants' => array(
5578
+ 'regular',
5579
+ 'italic',
5580
+ '700',
5581
+ '700italic',
5582
+ ),
5583
+ 'subsets' => array(
5584
+ 'latin',
5585
+ 'latin-ext',
5586
+ ),
5587
+ ),
5588
+ 'Questrial' => array(
5589
+ 'label' => 'Questrial',
5590
+ 'variants' => array(
5591
+ 'regular',
5592
+ ),
5593
+ 'subsets' => array(
5594
+ 'latin',
5595
+ ),
5596
+ ),
5597
+ 'Quicksand' => array(
5598
+ 'label' => 'Quicksand',
5599
+ 'variants' => array(
5600
+ '300',
5601
+ 'regular',
5602
+ '700',
5603
+ ),
5604
+ 'subsets' => array(
5605
+ 'latin',
5606
+ ),
5607
+ ),
5608
+ 'Quintessential' => array(
5609
+ 'label' => 'Quintessential',
5610
+ 'variants' => array(
5611
+ 'regular',
5612
+ ),
5613
+ 'subsets' => array(
5614
+ 'latin',
5615
+ 'latin-ext',
5616
+ ),
5617
+ ),
5618
+ 'Qwigley' => array(
5619
+ 'label' => 'Qwigley',
5620
+ 'variants' => array(
5621
+ 'regular',
5622
+ ),
5623
+ 'subsets' => array(
5624
+ 'latin',
5625
+ 'latin-ext',
5626
+ ),
5627
+ ),
5628
+ 'Racing Sans One' => array(
5629
+ 'label' => 'Racing Sans One',
5630
+ 'variants' => array(
5631
+ 'regular',
5632
+ ),
5633
+ 'subsets' => array(
5634
+ 'latin',
5635
+ 'latin-ext',
5636
+ ),
5637
+ ),
5638
+ 'Radley' => array(
5639
+ 'label' => 'Radley',
5640
+ 'variants' => array(
5641
+ 'regular',
5642
+ 'italic',
5643
+ ),
5644
+ 'subsets' => array(
5645
+ 'latin',
5646
+ 'latin-ext',
5647
+ ),
5648
+ ),
5649
+ 'Raleway' => array(
5650
+ 'label' => 'Raleway',
5651
+ 'variants' => array(
5652
+ '100',
5653
+ '200',
5654
+ '300',
5655
+ 'regular',
5656
+ '500',
5657
+ '600',
5658
+ '700',
5659
+ '800',
5660
+ '900',
5661
+ ),
5662
+ 'subsets' => array(
5663
+ 'latin',
5664
+ ),
5665
+ ),
5666
+ 'Raleway Dots' => array(
5667
+ 'label' => 'Raleway Dots',
5668
+ 'variants' => array(
5669
+ 'regular',
5670
+ ),
5671
+ 'subsets' => array(
5672
+ 'latin',
5673
+ 'latin-ext',
5674
+ ),
5675
+ ),
5676
+ 'Rambla' => array(
5677
+ 'label' => 'Rambla',
5678
+ 'variants' => array(
5679
+ 'regular',
5680
+ 'italic',
5681
+ '700',
5682
+ '700italic',
5683
+ ),
5684
+ 'subsets' => array(
5685
+ 'latin',
5686
+ 'latin-ext',
5687
+ ),
5688
+ ),
5689
+ 'Rammetto One' => array(
5690
+ 'label' => 'Rammetto One',
5691
+ 'variants' => array(
5692
+ 'regular',
5693
+ ),
5694
+ 'subsets' => array(
5695
+ 'latin',
5696
+ 'latin-ext',
5697
+ ),
5698
+ ),
5699
+ 'Ranchers' => array(
5700
+ 'label' => 'Ranchers',
5701
+ 'variants' => array(
5702
+ 'regular',
5703
+ ),
5704
+ 'subsets' => array(
5705
+ 'latin',
5706
+ 'latin-ext',
5707
+ ),
5708
+ ),
5709
+ 'Rancho' => array(
5710
+ 'label' => 'Rancho',
5711
+ 'variants' => array(
5712
+ 'regular',
5713
+ ),
5714
+ 'subsets' => array(
5715
+ 'latin',
5716
+ ),
5717
+ ),
5718
+ 'Rationale' => array(
5719
+ 'label' => 'Rationale',
5720
+ 'variants' => array(
5721
+ 'regular',
5722
+ ),
5723
+ 'subsets' => array(
5724
+ 'latin',
5725
+ ),
5726
+ ),
5727
+ 'Redressed' => array(
5728
+ 'label' => 'Redressed',
5729
+ 'variants' => array(
5730
+ 'regular',
5731
+ ),
5732
+ 'subsets' => array(
5733
+ 'latin',
5734
+ ),
5735
+ ),
5736
+ 'Reenie Beanie' => array(
5737
+ 'label' => 'Reenie Beanie',
5738
+ 'variants' => array(
5739
+ 'regular',
5740
+ ),
5741
+ 'subsets' => array(
5742
+ 'latin',
5743
+ ),
5744
+ ),
5745
+ 'Revalia' => array(
5746
+ 'label' => 'Revalia',
5747
+ 'variants' => array(
5748
+ 'regular',
5749
+ ),
5750
+ 'subsets' => array(
5751
+ 'latin',
5752
+ 'latin-ext',
5753
+ ),
5754
+ ),
5755
+ 'Ribeye' => array(
5756
+ 'label' => 'Ribeye',
5757
+ 'variants' => array(
5758
+ 'regular',
5759
+ ),
5760
+ 'subsets' => array(
5761
+ 'latin',
5762
+ 'latin-ext',
5763
+ ),
5764
+ ),
5765
+ 'Ribeye Marrow' => array(
5766
+ 'label' => 'Ribeye Marrow',
5767
+ 'variants' => array(
5768
+ 'regular',
5769
+ ),
5770
+ 'subsets' => array(
5771
+ 'latin',
5772
+ 'latin-ext',
5773
+ ),
5774
+ ),
5775
+ 'Righteous' => array(
5776
+ 'label' => 'Righteous',
5777
+ 'variants' => array(
5778
+ 'regular',
5779
+ ),
5780
+ 'subsets' => array(
5781
+ 'latin',
5782
+ 'latin-ext',
5783
+ ),
5784
+ ),
5785
+ 'Risque' => array(
5786
+ 'label' => 'Risque',
5787
+ 'variants' => array(
5788
+ 'regular',
5789
+ ),
5790
+ 'subsets' => array(
5791
+ 'latin',
5792
+ 'latin-ext',
5793
+ ),
5794
+ ),
5795
+ 'Roboto' => array(
5796
+ 'label' => 'Roboto',
5797
+ 'variants' => array(
5798
+ '100',
5799
+ '100italic',
5800
+ '300',
5801
+ '300italic',
5802
+ 'regular',
5803
+ 'italic',
5804
+ '500',
5805
+ '500italic',
5806
+ '700',
5807
+ '700italic',
5808
+ '900',
5809
+ '900italic',
5810
+ ),
5811
+ 'subsets' => array(
5812
+ 'latin',
5813
+ 'greek-ext',
5814
+ 'cyrillic',
5815
+ 'greek',
5816
+ 'vietnamese',
5817
+ 'latin-ext',
5818
+ 'cyrillic-ext',
5819
+ ),
5820
+ ),
5821
+ 'Roboto Condensed' => array(
5822
+ 'label' => 'Roboto Condensed',
5823
+ 'variants' => array(
5824
+ '300',
5825
+ '300italic',
5826
+ 'regular',
5827
+ 'italic',
5828
+ '700',
5829
+ '700italic',
5830
+ ),
5831
+ 'subsets' => array(
5832
+ 'latin',
5833
+ 'greek-ext',
5834
+ 'cyrillic',
5835
+ 'greek',
5836
+ 'vietnamese',
5837
+ 'latin-ext',
5838
+ 'cyrillic-ext',
5839
+ ),
5840
+ ),
5841
+ 'Roboto Slab' => array(
5842
+ 'label' => 'Roboto Slab',
5843
+ 'variants' => array(
5844
+ '100',
5845
+ '300',
5846
+ 'regular',
5847
+ '700',
5848
+ ),
5849
+ 'subsets' => array(
5850
+ 'latin',
5851
+ 'greek-ext',
5852
+ 'cyrillic',
5853
+ 'greek',
5854
+ 'vietnamese',
5855
+ 'latin-ext',
5856
+ 'cyrillic-ext',
5857
+ ),
5858
+ ),
5859
+ 'Rochester' => array(
5860
+ 'label' => 'Rochester',
5861
+ 'variants' => array(
5862
+ 'regular',
5863
+ ),
5864
+ 'subsets' => array(
5865
+ 'latin',
5866
+ ),
5867
+ ),
5868
+ 'Rock Salt' => array(
5869
+ 'label' => 'Rock Salt',
5870
+ 'variants' => array(
5871
+ 'regular',
5872
+ ),
5873
+ 'subsets' => array(
5874
+ 'latin',
5875
+ ),
5876
+ ),
5877
+ 'Rokkitt' => array(
5878
+ 'label' => 'Rokkitt',
5879
+ 'variants' => array(
5880
+ 'regular',
5881
+ '700',
5882
+ ),
5883
+ 'subsets' => array(
5884
+ 'latin',
5885
+ ),
5886
+ ),
5887
+ 'Romanesco' => array(
5888
+ 'label' => 'Romanesco',
5889
+ 'variants' => array(
5890
+ 'regular',
5891
+ ),
5892
+ 'subsets' => array(
5893
+ 'latin',
5894
+ 'latin-ext',
5895
+ ),
5896
+ ),
5897
+ 'Ropa Sans' => array(
5898
+ 'label' => 'Ropa Sans',
5899
+ 'variants' => array(
5900
+ 'regular',
5901
+ 'italic',
5902
+ ),
5903
+ 'subsets' => array(
5904
+ 'latin',
5905
+ 'latin-ext',
5906
+ ),
5907
+ ),
5908
+ 'Rosario' => array(
5909
+ 'label' => 'Rosario',
5910
+ 'variants' => array(
5911
+ 'regular',
5912
+ 'italic',
5913
+ '700',
5914
+ '700italic',
5915
+ ),
5916
+ 'subsets' => array(
5917
+ 'latin',
5918
+ ),
5919
+ ),
5920
+ 'Rosarivo' => array(
5921
+ 'label' => 'Rosarivo',
5922
+ 'variants' => array(
5923
+ 'regular',
5924
+ 'italic',
5925
+ ),
5926
+ 'subsets' => array(
5927
+ 'latin',
5928
+ 'latin-ext',
5929
+ ),
5930
+ ),
5931
+ 'Rouge Script' => array(
5932
+ 'label' => 'Rouge Script',
5933
+ 'variants' => array(
5934
+ 'regular',
5935
+ ),
5936
+ 'subsets' => array(
5937
+ 'latin',
5938
+ ),
5939
+ ),
5940
+ 'Ruda' => array(
5941
+ 'label' => 'Ruda',
5942
+ 'variants' => array(
5943
+ 'regular',
5944
+ '700',
5945
+ '900',
5946
+ ),
5947
+ 'subsets' => array(
5948
+ 'latin',
5949
+ 'latin-ext',
5950
+ ),
5951
+ ),
5952
+ 'Rufina' => array(
5953
+ 'label' => 'Rufina',
5954
+ 'variants' => array(
5955
+ 'regular',
5956
+ '700',
5957
+ ),
5958
+ 'subsets' => array(
5959
+ 'latin',
5960
+ 'latin-ext',
5961
+ ),
5962
+ ),
5963
+ 'Ruge Boogie' => array(
5964
+ 'label' => 'Ruge Boogie',
5965
+ 'variants' => array(
5966
+ 'regular',
5967
+ ),
5968
+ 'subsets' => array(
5969
+ 'latin',
5970
+ 'latin-ext',
5971
+ ),
5972
+ ),
5973
+ 'Ruluko' => array(
5974
+ 'label' => 'Ruluko',
5975
+ 'variants' => array(
5976
+ 'regular',
5977
+ ),
5978
+ 'subsets' => array(
5979
+ 'latin',
5980
+ 'latin-ext',
5981
+ ),
5982
+ ),
5983
+ 'Rum Raisin' => array(
5984
+ 'label' => 'Rum Raisin',
5985
+ 'variants' => array(
5986
+ 'regular',
5987
+ ),
5988
+ 'subsets' => array(
5989
+ 'latin',
5990
+ 'latin-ext',
5991
+ ),
5992
+ ),
5993
+ 'Ruslan Display' => array(
5994
+ 'label' => 'Ruslan Display',
5995
+ 'variants' => array(
5996
+ 'regular',
5997
+ ),
5998
+ 'subsets' => array(
5999
+ 'latin',
6000
+ 'cyrillic',
6001
+ 'latin-ext',
6002
+ 'cyrillic-ext',
6003
+ ),
6004
+ ),
6005
+ 'Russo One' => array(
6006
+ 'label' => 'Russo One',
6007
+ 'variants' => array(
6008
+ 'regular',
6009
+ ),
6010
+ 'subsets' => array(
6011
+ 'latin',
6012
+ 'cyrillic',
6013
+ 'latin-ext',
6014
+ ),
6015
+ ),
6016
+ 'Ruthie' => array(
6017
+ 'label' => 'Ruthie',
6018
+ 'variants' => array(
6019
+ 'regular',
6020
+ ),
6021
+ 'subsets' => array(
6022
+ 'latin',
6023
+ 'latin-ext',
6024
+ ),
6025
+ ),
6026
+ 'Rye' => array(
6027
+ 'label' => 'Rye',
6028
+ 'variants' => array(
6029
+ 'regular',
6030
+ ),
6031
+ 'subsets' => array(
6032
+ 'latin',
6033
+ 'latin-ext',
6034
+ ),
6035
+ ),
6036
+ 'Sacramento' => array(
6037
+ 'label' => 'Sacramento',
6038
+ 'variants' => array(
6039
+ 'regular',
6040
+ ),
6041
+ 'subsets' => array(
6042
+ 'latin',
6043
+ 'latin-ext',
6044
+ ),
6045
+ ),
6046
+ 'Sail' => array(
6047
+ 'label' => 'Sail',
6048
+ 'variants' => array(
6049
+ 'regular',
6050
+ ),
6051
+ 'subsets' => array(
6052
+ 'latin',
6053
+ ),
6054
+ ),
6055
+ 'Salsa' => array(
6056
+ 'label' => 'Salsa',
6057
+ 'variants' => array(
6058
+ 'regular',
6059
+ ),
6060
+ 'subsets' => array(
6061
+ 'latin',
6062
+ ),
6063
+ ),
6064
+ 'Sanchez' => array(
6065
+ 'label' => 'Sanchez',
6066
+ 'variants' => array(
6067
+ 'regular',
6068
+ 'italic',
6069
+ ),
6070
+ 'subsets' => array(
6071
+ 'latin',
6072
+ 'latin-ext',
6073
+ ),
6074
+ ),
6075
+ 'Sancreek' => array(
6076
+ 'label' => 'Sancreek',
6077
+ 'variants' => array(
6078
+ 'regular',
6079
+ ),
6080
+ 'subsets' => array(
6081
+ 'latin',
6082
+ 'latin-ext',
6083
+ ),
6084
+ ),
6085
+ 'Sansita One' => array(
6086
+ 'label' => 'Sansita One',
6087
+ 'variants' => array(
6088
+ 'regular',
6089
+ ),
6090
+ 'subsets' => array(
6091
+ 'latin',
6092
+ ),
6093
+ ),
6094
+ 'Sarina' => array(
6095
+ 'label' => 'Sarina',
6096
+ 'variants' => array(
6097
+ 'regular',
6098
+ ),
6099
+ 'subsets' => array(
6100
+ 'latin',
6101
+ 'latin-ext',
6102
+ ),
6103
+ ),
6104
+ 'Satisfy' => array(
6105
+ 'label' => 'Satisfy',
6106
+ 'variants' => array(
6107
+ 'regular',
6108
+ ),
6109
+ 'subsets' => array(
6110
+ 'latin',
6111
+ ),
6112
+ ),
6113
+ 'Scada' => array(
6114
+ 'label' => 'Scada',
6115
+ 'variants' => array(
6116
+ 'regular',
6117
+ 'italic',
6118
+ '700',
6119
+ '700italic',
6120
+ ),
6121
+ 'subsets' => array(
6122
+ 'latin',
6123
+ 'cyrillic',
6124
+ 'latin-ext',
6125
+ ),
6126
+ ),
6127
+ 'Schoolbell' => array(
6128
+ 'label' => 'Schoolbell',
6129
+ 'variants' => array(
6130
+ 'regular',
6131
+ ),
6132
+ 'subsets' => array(
6133
+ 'latin',
6134
+ ),
6135
+ ),
6136
+ 'Seaweed Script' => array(
6137
+ 'label' => 'Seaweed Script',
6138
+ 'variants' => array(
6139
+ 'regular',
6140
+ ),
6141
+ 'subsets' => array(
6142
+ 'latin',
6143
+ 'latin-ext',
6144
+ ),
6145
+ ),
6146
+ 'Sevillana' => array(
6147
+ 'label' => 'Sevillana',
6148
+ 'variants' => array(
6149
+ 'regular',
6150
+ ),
6151
+ 'subsets' => array(
6152
+ 'latin',
6153
+ 'latin-ext',
6154
+ ),
6155
+ ),
6156
+ 'Seymour One' => array(
6157
+ 'label' => 'Seymour One',
6158
+ 'variants' => array(
6159
+ 'regular',
6160
+ ),
6161
+ 'subsets' => array(
6162
+ 'latin',
6163
+ 'cyrillic',
6164
+ 'latin-ext',
6165
+ ),
6166
+ ),
6167
+ 'Shadows Into Light' => array(
6168
+ 'label' => 'Shadows Into Light',
6169
+ 'variants' => array(
6170
+ 'regular',
6171
+ ),
6172
+ 'subsets' => array(
6173
+ 'latin',
6174
+ ),
6175
+ ),
6176
+ 'Shadows Into Light Two' => array(
6177
+ 'label' => 'Shadows Into Light Two',
6178
+ 'variants' => array(
6179
+ 'regular',
6180
+ ),
6181
+ 'subsets' => array(
6182
+ 'latin',
6183
+ 'latin-ext',
6184
+ ),
6185
+ ),
6186
+ 'Shanti' => array(
6187
+ 'label' => 'Shanti',
6188
+ 'variants' => array(
6189
+ 'regular',
6190
+ ),
6191
+ 'subsets' => array(
6192
+ 'latin',
6193
+ ),
6194
+ ),
6195
+ 'Share' => array(
6196
+ 'label' => 'Share',
6197
+ 'variants' => array(
6198
+ 'regular',
6199
+ 'italic',
6200
+ '700',
6201
+ '700italic',
6202
+ ),
6203
+ 'subsets' => array(
6204
+ 'latin',
6205
+ 'latin-ext',
6206
+ ),
6207
+ ),
6208
+ 'Share Tech' => array(
6209
+ 'label' => 'Share Tech',
6210
+ 'variants' => array(
6211
+ 'regular',
6212
+ ),
6213
+ 'subsets' => array(
6214
+ 'latin',
6215
+ ),
6216
+ ),
6217
+ 'Share Tech Mono' => array(
6218
+ 'label' => 'Share Tech Mono',
6219
+ 'variants' => array(
6220
+ 'regular',
6221
+ ),
6222
+ 'subsets' => array(
6223
+ 'latin',
6224
+ ),
6225
+ ),
6226
+ 'Shojumaru' => array(
6227
+ 'label' => 'Shojumaru',
6228
+ 'variants' => array(
6229
+ 'regular',
6230
+ ),
6231
+ 'subsets' => array(
6232
+ 'latin',
6233
+ 'latin-ext',
6234
+ ),
6235
+ ),
6236
+ 'Short Stack' => array(
6237
+ 'label' => 'Short Stack',
6238
+ 'variants' => array(
6239
+ 'regular',
6240
+ ),
6241
+ 'subsets' => array(
6242
+ 'latin',
6243
+ ),
6244
+ ),
6245
+ 'Siemreap' => array(
6246
+ 'label' => 'Siemreap',
6247
+ 'variants' => array(
6248
+ 'regular',
6249
+ ),
6250
+ 'subsets' => array(
6251
+ 'khmer',
6252
+ ),
6253
+ ),
6254
+ 'Sigmar One' => array(
6255
+ 'label' => 'Sigmar One',
6256
+ 'variants' => array(
6257
+ 'regular',
6258
+ ),
6259
+ 'subsets' => array(
6260
+ 'latin',
6261
+ ),
6262
+ ),
6263
+ 'Signika' => array(
6264
+ 'label' => 'Signika',
6265
+ 'variants' => array(
6266
+ '300',
6267
+ 'regular',
6268
+ '600',
6269
+ '700',
6270
+ ),
6271
+ 'subsets' => array(
6272
+ 'latin',
6273
+ 'latin-ext',
6274
+ ),
6275
+ ),
6276
+ 'Signika Negative' => array(
6277
+ 'label' => 'Signika Negative',
6278
+ 'variants' => array(
6279
+ '300',
6280
+ 'regular',
6281
+ '600',
6282
+ '700',
6283
+ ),
6284
+ 'subsets' => array(
6285
+ 'latin',
6286
+ 'latin-ext',
6287
+ ),
6288
+ ),
6289
+ 'Simonetta' => array(
6290
+ 'label' => 'Simonetta',
6291
+ 'variants' => array(
6292
+ 'regular',
6293
+ 'italic',
6294
+ '900',
6295
+ '900italic',
6296
+ ),
6297
+ 'subsets' => array(
6298
+ 'latin',
6299
+ 'latin-ext',
6300
+ ),
6301
+ ),
6302
+ 'Sintony' => array(
6303
+ 'label' => 'Sintony',
6304
+ 'variants' => array(
6305
+ 'regular',
6306
+ '700',
6307
+ ),
6308
+ 'subsets' => array(
6309
+ 'latin',
6310
+ 'latin-ext',
6311
+ ),
6312
+ ),
6313
+ 'Sirin Stencil' => array(
6314
+ 'label' => 'Sirin Stencil',
6315
+ 'variants' => array(
6316
+ 'regular',
6317
+ ),
6318
+ 'subsets' => array(
6319
+ 'latin',
6320
+ ),
6321
+ ),
6322
+ 'Six Caps' => array(
6323
+ 'label' => 'Six Caps',
6324
+ 'variants' => array(
6325
+ 'regular',
6326
+ ),
6327
+ 'subsets' => array(
6328
+ 'latin',
6329
+ ),
6330
+ ),
6331
+ 'Skranji' => array(
6332
+ 'label' => 'Skranji',
6333
+ 'variants' => array(
6334
+ 'regular',
6335
+ '700',
6336
+ ),
6337
+ 'subsets' => array(
6338
+ 'latin',
6339
+ 'latin-ext',
6340
+ ),
6341
+ ),
6342
+ 'Slackey' => array(
6343
+ 'label' => 'Slackey',
6344
+ 'variants' => array(
6345
+ 'regular',
6346
+ ),
6347
+ 'subsets' => array(
6348
+ 'latin',
6349
+ ),
6350
+ ),
6351
+ 'Smokum' => array(
6352
+ 'label' => 'Smokum',
6353
+ 'variants' => array(
6354
+ 'regular',
6355
+ ),
6356
+ 'subsets' => array(
6357
+ 'latin',
6358
+ ),
6359
+ ),
6360
+ 'Smythe' => array(
6361
+ 'label' => 'Smythe',
6362
+ 'variants' => array(
6363
+ 'regular',
6364
+ ),
6365
+ 'subsets' => array(
6366
+ 'latin',
6367
+ ),
6368
+ ),
6369
+ 'Sniglet' => array(
6370
+ 'label' => 'Sniglet',
6371
+ 'variants' => array(
6372
+ 'regular',
6373
+ '800',
6374
+ ),
6375
+ 'subsets' => array(
6376
+ 'latin',
6377
+ 'latin-ext',
6378
+ ),
6379
+ ),
6380
+ 'Snippet' => array(
6381
+ 'label' => 'Snippet',
6382
+ 'variants' => array(
6383
+ 'regular',
6384
+ ),
6385
+ 'subsets' => array(
6386
+ 'latin',
6387
+ ),
6388
+ ),
6389
+ 'Snowburst One' => array(
6390
+ 'label' => 'Snowburst One',
6391
+ 'variants' => array(
6392
+ 'regular',
6393
+ ),
6394
+ 'subsets' => array(
6395
+ 'latin',
6396
+ 'latin-ext',
6397
+ ),
6398
+ ),
6399
+ 'Sofadi One' => array(
6400
+ 'label' => 'Sofadi One',
6401
+ 'variants' => array(
6402
+ 'regular',
6403
+ ),
6404
+ 'subsets' => array(
6405
+ 'latin',
6406
+ ),
6407
+ ),
6408
+ 'Sofia' => array(
6409
+ 'label' => 'Sofia',
6410
+ 'variants' => array(
6411
+ 'regular',
6412
+ ),
6413
+ 'subsets' => array(
6414
+ 'latin',
6415
+ ),
6416
+ ),
6417
+ 'Sonsie One' => array(
6418
+ 'label' => 'Sonsie One',
6419
+ 'variants' => array(
6420
+ 'regular',
6421
+ ),
6422
+ 'subsets' => array(
6423
+ 'latin',
6424
+ 'latin-ext',
6425
+ ),
6426
+ ),
6427
+ 'Sorts Mill Goudy' => array(
6428
+ 'label' => 'Sorts Mill Goudy',
6429
+ 'variants' => array(
6430
+ 'regular',
6431
+ 'italic',
6432
+ ),
6433
+ 'subsets' => array(
6434
+ 'latin',
6435
+ 'latin-ext',
6436
+ ),
6437
+ ),
6438
+ 'Source Code Pro' => array(
6439
+ 'label' => 'Source Code Pro',
6440
+ 'variants' => array(
6441
+ '200',
6442
+ '300',
6443
+ 'regular',
6444
+ '500',
6445
+ '600',
6446
+ '700',
6447
+ '900',
6448
+ ),
6449
+ 'subsets' => array(
6450
+ 'latin',
6451
+ 'latin-ext',
6452
+ ),
6453
+ ),
6454
+ 'Source Sans Pro' => array(
6455
+ 'label' => 'Source Sans Pro',
6456
+ 'variants' => array(
6457
+ '200',
6458
+ '200italic',
6459
+ '300',
6460
+ '300italic',
6461
+ 'regular',
6462
+ 'italic',
6463
+ '600',
6464
+ '600italic',
6465
+ '700',
6466
+ '700italic',
6467
+ '900',
6468
+ '900italic',
6469
+ ),
6470
+ 'subsets' => array(
6471
+ 'latin',
6472
+ 'vietnamese',
6473
+ 'latin-ext',
6474
+ ),
6475
+ ),
6476
+ 'Special Elite' => array(
6477
+ 'label' => 'Special Elite',
6478
+ 'variants' => array(
6479
+ 'regular',
6480
+ ),
6481
+ 'subsets' => array(
6482
+ 'latin',
6483
+ ),
6484
+ ),
6485
+ 'Spicy Rice' => array(
6486
+ 'label' => 'Spicy Rice',
6487
+ 'variants' => array(
6488
+ 'regular',
6489
+ ),
6490
+ 'subsets' => array(
6491
+ 'latin',
6492
+ ),
6493
+ ),
6494
+ 'Spinnaker' => array(
6495
+ 'label' => 'Spinnaker',
6496
+ 'variants' => array(
6497
+ 'regular',
6498
+ ),
6499
+ 'subsets' => array(
6500
+ 'latin',
6501
+ 'latin-ext',
6502
+ ),
6503
+ ),
6504
+ 'Spirax' => array(
6505
+ 'label' => 'Spirax',
6506
+ 'variants' => array(
6507
+ 'regular',
6508
+ ),
6509
+ 'subsets' => array(
6510
+ 'latin',
6511
+ ),
6512
+ ),
6513
+ 'Squada One' => array(
6514
+ 'label' => 'Squada One',
6515
+ 'variants' => array(
6516
+ 'regular',
6517
+ ),
6518
+ 'subsets' => array(
6519
+ 'latin',
6520
+ ),
6521
+ ),
6522
+ 'Stalemate' => array(
6523
+ 'label' => 'Stalemate',
6524
+ 'variants' => array(
6525
+ 'regular',
6526
+ ),
6527
+ 'subsets' => array(
6528
+ 'latin',
6529
+ 'latin-ext',
6530
+ ),
6531
+ ),
6532
+ 'Stalinist One' => array(
6533
+ 'label' => 'Stalinist One',
6534
+ 'variants' => array(
6535
+ 'regular',
6536
+ ),
6537
+ 'subsets' => array(
6538
+ 'latin',
6539
+ 'cyrillic',
6540
+ 'latin-ext',
6541
+ ),
6542
+ ),
6543
+ 'Stardos Stencil' => array(
6544
+ 'label' => 'Stardos Stencil',
6545
+ 'variants' => array(
6546
+ 'regular',
6547
+ '700',
6548
+ ),
6549
+ 'subsets' => array(
6550
+ 'latin',
6551
+ ),
6552
+ ),
6553
+ 'Stint Ultra Condensed' => array(
6554
+ 'label' => 'Stint Ultra Condensed',
6555
+ 'variants' => array(
6556
+ 'regular',
6557
+ ),
6558
+ 'subsets' => array(
6559
+ 'latin',
6560
+ 'latin-ext',
6561
+ ),
6562
+ ),
6563
+ 'Stint Ultra Expanded' => array(
6564
+ 'label' => 'Stint Ultra Expanded',
6565
+ 'variants' => array(
6566
+ 'regular',
6567
+ ),
6568
+ 'subsets' => array(
6569
+ 'latin',
6570
+ 'latin-ext',
6571
+ ),
6572
+ ),
6573
+ 'Stoke' => array(
6574
+ 'label' => 'Stoke',
6575
+ 'variants' => array(
6576
+ '300',
6577
+ 'regular',
6578
+ ),
6579
+ 'subsets' => array(
6580
+ 'latin',
6581
+ 'latin-ext',
6582
+ ),
6583
+ ),
6584
+ 'Strait' => array(
6585
+ 'label' => 'Strait',
6586
+ 'variants' => array(
6587
+ 'regular',
6588
+ ),
6589
+ 'subsets' => array(
6590
+ 'latin',
6591
+ ),
6592
+ ),
6593
+ 'Sue Ellen Francisco' => array(
6594
+ 'label' => 'Sue Ellen Francisco',
6595
+ 'variants' => array(
6596
+ 'regular',
6597
+ ),
6598
+ 'subsets' => array(
6599
+ 'latin',
6600
+ ),
6601
+ ),
6602
+ 'Sunshiney' => array(
6603
+ 'label' => 'Sunshiney',
6604
+ 'variants' => array(
6605
+ 'regular',
6606
+ ),
6607
+ 'subsets' => array(
6608
+ 'latin',
6609
+ ),
6610
+ ),
6611
+ 'Supermercado One' => array(
6612
+ 'label' => 'Supermercado One',
6613
+ 'variants' => array(
6614
+ 'regular',
6615
+ ),
6616
+ 'subsets' => array(
6617
+ 'latin',
6618
+ ),
6619
+ ),
6620
+ 'Suwannaphum' => array(
6621
+ 'label' => 'Suwannaphum',
6622
+ 'variants' => array(
6623
+ 'regular',
6624
+ ),
6625
+ 'subsets' => array(
6626
+ 'khmer',
6627
+ ),
6628
+ ),
6629
+ 'Swanky and Moo Moo' => array(
6630
+ 'label' => 'Swanky and Moo Moo',
6631
+ 'variants' => array(
6632
+ 'regular',
6633
+ ),
6634
+ 'subsets' => array(
6635
+ 'latin',
6636
+ ),
6637
+ ),
6638
+ 'Syncopate' => array(
6639
+ 'label' => 'Syncopate',
6640
+ 'variants' => array(
6641
+ 'regular',
6642
+ '700',
6643
+ ),
6644
+ 'subsets' => array(
6645
+ 'latin',
6646
+ ),
6647
+ ),
6648
+ 'Tangerine' => array(
6649
+ 'label' => 'Tangerine',
6650
+ 'variants' => array(
6651
+ 'regular',
6652
+ '700',
6653
+ ),
6654
+ 'subsets' => array(
6655
+ 'latin',
6656
+ ),
6657
+ ),
6658
+ 'Taprom' => array(
6659
+ 'label' => 'Taprom',
6660
+ 'variants' => array(
6661
+ 'regular',
6662
+ ),
6663
+ 'subsets' => array(
6664
+ 'khmer',
6665
+ ),
6666
+ ),
6667
+ 'Tauri' => array(
6668
+ 'label' => 'Tauri',
6669
+ 'variants' => array(
6670
+ 'regular',
6671
+ ),
6672
+ 'subsets' => array(
6673
+ 'latin',
6674
+ 'latin-ext',
6675
+ ),
6676
+ ),
6677
+ 'Telex' => array(
6678
+ 'label' => 'Telex',
6679
+ 'variants' => array(
6680
+ 'regular',
6681
+ ),
6682
+ 'subsets' => array(
6683
+ 'latin',
6684
+ ),
6685
+ ),
6686
+ 'Tenor Sans' => array(
6687
+ 'label' => 'Tenor Sans',
6688
+ 'variants' => array(
6689
+ 'regular',
6690
+ ),
6691
+ 'subsets' => array(
6692
+ 'latin',
6693
+ 'cyrillic',
6694
+ 'latin-ext',
6695
+ 'cyrillic-ext',
6696
+ ),
6697
+ ),
6698
+ 'Text Me One' => array(
6699
+ 'label' => 'Text Me One',
6700
+ 'variants' => array(
6701
+ 'regular',
6702
+ ),
6703
+ 'subsets' => array(
6704
+ 'latin',
6705
+ 'latin-ext',
6706
+ ),
6707
+ ),
6708
+ 'The Girl Next Door' => array(
6709
+ 'label' => 'The Girl Next Door',
6710
+ 'variants' => array(
6711
+ 'regular',
6712
+ ),
6713
+ 'subsets' => array(
6714
+ 'latin',
6715
+ ),
6716
+ ),
6717
+ 'Tienne' => array(
6718
+ 'label' => 'Tienne',
6719
+ 'variants' => array(
6720
+ 'regular',
6721
+ '700',
6722
+ '900',
6723
+ ),
6724
+ 'subsets' => array(
6725
+ 'latin',
6726
+ ),
6727
+ ),
6728
+ 'Tinos' => array(
6729
+ 'label' => 'Tinos',
6730
+ 'variants' => array(
6731
+ 'regular',
6732
+ 'italic',
6733
+ '700',
6734
+ '700italic',
6735
+ ),
6736
+ 'subsets' => array(
6737
+ 'latin',
6738
+ 'greek-ext',
6739
+ 'cyrillic',
6740
+ 'greek',
6741
+ 'vietnamese',
6742
+ 'latin-ext',
6743
+ 'cyrillic-ext',
6744
+ ),
6745
+ ),
6746
+ 'Titan One' => array(
6747
+ 'label' => 'Titan One',
6748
+ 'variants' => array(
6749
+ 'regular',
6750
+ ),
6751
+ 'subsets' => array(
6752
+ 'latin',
6753
+ 'latin-ext',
6754
+ ),
6755
+ ),
6756
+ 'Titillium Web' => array(
6757
+ 'label' => 'Titillium Web',
6758
+ 'variants' => array(
6759
+ '200',
6760
+ '200italic',
6761
+ '300',
6762
+ '300italic',
6763
+ 'regular',
6764
+ 'italic',
6765
+ '600',
6766
+ '600italic',
6767
+ '700',
6768
+ '700italic',
6769
+ '900',
6770
+ ),
6771
+ 'subsets' => array(
6772
+ 'latin',
6773
+ 'latin-ext',
6774
+ ),
6775
+ ),
6776
+ 'Trade Winds' => array(
6777
+ 'label' => 'Trade Winds',
6778
+ 'variants' => array(
6779
+ 'regular',
6780
+ ),
6781
+ 'subsets' => array(
6782
+ 'latin',
6783
+ ),
6784
+ ),
6785
+ 'Trocchi' => array(
6786
+ 'label' => 'Trocchi',
6787
+ 'variants' => array(
6788
+ 'regular',
6789
+ ),
6790
+ 'subsets' => array(
6791
+ 'latin',
6792
+ 'latin-ext',
6793
+ ),
6794
+ ),
6795
+ 'Trochut' => array(
6796
+ 'label' => 'Trochut',
6797
+ 'variants' => array(
6798
+ 'regular',
6799
+ 'italic',
6800
+ '700',
6801
+ ),
6802
+ 'subsets' => array(
6803
+ 'latin',
6804
+ ),
6805
+ ),
6806
+ 'Trykker' => array(
6807
+ 'label' => 'Trykker',
6808
+ 'variants' => array(
6809
+ 'regular',
6810
+ ),
6811
+ 'subsets' => array(
6812
+ 'latin',
6813
+ 'latin-ext',
6814
+ ),
6815
+ ),
6816
+ 'Tulpen One' => array(
6817
+ 'label' => 'Tulpen One',
6818
+ 'variants' => array(
6819
+ 'regular',
6820
+ ),
6821
+ 'subsets' => array(
6822
+ 'latin',
6823
+ ),
6824
+ ),
6825
+ 'Ubuntu' => array(
6826
+ 'label' => 'Ubuntu',
6827
+ 'variants' => array(
6828
+ '300',
6829
+ '300italic',
6830
+ 'regular',
6831
+ 'italic',
6832
+ '500',
6833
+ '500italic',
6834
+ '700',
6835
+ '700italic',
6836
+ ),
6837
+ 'subsets' => array(
6838
+ 'latin',
6839
+ 'greek-ext',
6840
+ 'cyrillic',
6841
+ 'greek',
6842
+ 'latin-ext',
6843
+ 'cyrillic-ext',
6844
+ ),
6845
+ ),
6846
+ 'Ubuntu Condensed' => array(
6847
+ 'label' => 'Ubuntu Condensed',
6848
+ 'variants' => array(
6849
+ 'regular',
6850
+ ),
6851
+ 'subsets' => array(
6852
+ 'latin',
6853
+ 'greek-ext',
6854
+ 'cyrillic',
6855
+ 'greek',
6856
+ 'latin-ext',
6857
+ 'cyrillic-ext',
6858
+ ),
6859
+ ),
6860
+ 'Ubuntu Mono' => array(
6861
+ 'label' => 'Ubuntu Mono',
6862
+ 'variants' => array(
6863
+ 'regular',
6864
+ 'italic',
6865
+ '700',
6866
+ '700italic',
6867
+ ),
6868
+ 'subsets' => array(
6869
+ 'latin',
6870
+ 'greek-ext',
6871
+ 'cyrillic',
6872
+ 'greek',
6873
+ 'latin-ext',
6874
+ 'cyrillic-ext',
6875
+ ),
6876
+ ),
6877
+ 'Ultra' => array(
6878
+ 'label' => 'Ultra',
6879
+ 'variants' => array(
6880
+ 'regular',
6881
+ ),
6882
+ 'subsets' => array(
6883
+ 'latin',
6884
+ ),
6885
+ ),
6886
+ 'Uncial Antiqua' => array(
6887
+ 'label' => 'Uncial Antiqua',
6888
+ 'variants' => array(
6889
+ 'regular',
6890
+ ),
6891
+ 'subsets' => array(
6892
+ 'latin',
6893
+ ),
6894
+ ),
6895
+ 'Underdog' => array(
6896
+ 'label' => 'Underdog',
6897
+ 'variants' => array(
6898
+ 'regular',
6899
+ ),
6900
+ 'subsets' => array(
6901
+ 'latin',
6902
+ 'cyrillic',
6903
+ 'latin-ext',
6904
+ ),
6905
+ ),
6906
+ 'Unica One' => array(
6907
+ 'label' => 'Unica One',
6908
+ 'variants' => array(
6909
+ 'regular',
6910
+ ),
6911
+ 'subsets' => array(
6912
+ 'latin',
6913
+ 'latin-ext',
6914
+ ),
6915
+ ),
6916
+ 'UnifrakturCook' => array(
6917
+ 'label' => 'UnifrakturCook',
6918
+ 'variants' => array(
6919
+ '700',
6920
+ ),
6921
+ 'subsets' => array(
6922
+ 'latin',
6923
+ ),
6924
+ ),
6925
+ 'UnifrakturMaguntia' => array(
6926
+ 'label' => 'UnifrakturMaguntia',
6927
+ 'variants' => array(
6928
+ 'regular',
6929
+ ),
6930
+ 'subsets' => array(
6931
+ 'latin',
6932
+ ),
6933
+ ),
6934
+ 'Unkempt' => array(
6935
+ 'label' => 'Unkempt',
6936
+ 'variants' => array(
6937
+ 'regular',
6938
+ '700',
6939
+ ),
6940
+ 'subsets' => array(
6941
+ 'latin',
6942
+ ),
6943
+ ),
6944
+ 'Unlock' => array(
6945
+ 'label' => 'Unlock',
6946
+ 'variants' => array(
6947
+ 'regular',
6948
+ ),
6949
+ 'subsets' => array(
6950
+ 'latin',
6951
+ ),
6952
+ ),
6953
+ 'Unna' => array(
6954
+ 'label' => 'Unna',
6955
+ 'variants' => array(
6956
+ 'regular',
6957
+ ),
6958
+ 'subsets' => array(
6959
+ 'latin',
6960
+ ),
6961
+ ),
6962
+ 'VT323' => array(
6963
+ 'label' => 'VT323',
6964
+ 'variants' => array(
6965
+ 'regular',
6966
+ ),
6967
+ 'subsets' => array(
6968
+ 'latin',
6969
+ ),
6970
+ ),
6971
+ 'Vampiro One' => array(
6972
+ 'label' => 'Vampiro One',
6973
+ 'variants' => array(
6974
+ 'regular',
6975
+ ),
6976
+ 'subsets' => array(
6977
+ 'latin',
6978
+ 'latin-ext',
6979
+ ),
6980
+ ),
6981
+ 'Varela' => array(
6982
+ 'label' => 'Varela',
6983
+ 'variants' => array(
6984
+ 'regular',
6985
+ ),
6986
+ 'subsets' => array(
6987
+ 'latin',
6988
+ 'latin-ext',
6989
+ ),
6990
+ ),
6991
+ 'Varela Round' => array(
6992
+ 'label' => 'Varela Round',
6993
+ 'variants' => array(
6994
+ 'regular',
6995
+ ),
6996
+ 'subsets' => array(
6997
+ 'latin',
6998
+ ),
6999
+ ),
7000
+ 'Vast Shadow' => array(
7001
+ 'label' => 'Vast Shadow',
7002
+ 'variants' => array(
7003
+ 'regular',
7004
+ ),
7005
+ 'subsets' => array(
7006
+ 'latin',
7007
+ ),
7008
+ ),
7009
+ 'Vibur' => array(
7010
+ 'label' => 'Vibur',
7011
+ 'variants' => array(
7012
+ 'regular',
7013
+ ),
7014
+ 'subsets' => array(
7015
+ 'latin',
7016
+ ),
7017
+ ),
7018
+ 'Vidaloka' => array(
7019
+ 'label' => 'Vidaloka',
7020
+ 'variants' => array(
7021
+ 'regular',
7022
+ ),
7023
+ 'subsets' => array(
7024
+ 'latin',
7025
+ ),
7026
+ ),
7027
+ 'Viga' => array(
7028
+ 'label' => 'Viga',
7029
+ 'variants' => array(
7030
+ 'regular',
7031
+ ),
7032
+ 'subsets' => array(
7033
+ 'latin',
7034
+ 'latin-ext',
7035
+ ),
7036
+ ),
7037
+ 'Voces' => array(
7038
+ 'label' => 'Voces',
7039
+ 'variants' => array(
7040
+ 'regular',
7041
+ ),
7042
+ 'subsets' => array(
7043
+ 'latin',
7044
+ 'latin-ext',
7045
+ ),
7046
+ ),
7047
+ 'Volkhov' => array(
7048
+ 'label' => 'Volkhov',
7049
+ 'variants' => array(
7050
+ 'regular',
7051
+ 'italic',
7052
+ '700',
7053
+ '700italic',
7054
+ ),
7055
+ 'subsets' => array(
7056
+ 'latin',
7057
+ ),
7058
+ ),
7059
+ 'Vollkorn' => array(
7060
+ 'label' => 'Vollkorn',
7061
+ 'variants' => array(
7062
+ 'regular',
7063
+ 'italic',
7064
+ '700',
7065
+ '700italic',
7066
+ ),
7067
+ 'subsets' => array(
7068
+ 'latin',
7069
+ ),
7070
+ ),
7071
+ 'Voltaire' => array(
7072
+ 'label' => 'Voltaire',
7073
+ 'variants' => array(
7074
+ 'regular',
7075
+ ),
7076
+ 'subsets' => array(
7077
+ 'latin',
7078
+ ),
7079
+ ),
7080
+ 'Waiting for the Sunrise' => array(
7081
+ 'label' => 'Waiting for the Sunrise',
7082
+ 'variants' => array(
7083
+ 'regular',
7084
+ ),
7085
+ 'subsets' => array(
7086
+ 'latin',
7087
+ ),
7088
+ ),
7089
+ 'Wallpoet' => array(
7090
+ 'label' => 'Wallpoet',
7091
+ 'variants' => array(
7092
+ 'regular',
7093
+ ),
7094
+ 'subsets' => array(
7095
+ 'latin',
7096
+ ),
7097
+ ),
7098
+ 'Walter Turncoat' => array(
7099
+ 'label' => 'Walter Turncoat',
7100
+ 'variants' => array(
7101
+ 'regular',
7102
+ ),
7103
+ 'subsets' => array(
7104
+ 'latin',
7105
+ ),
7106
+ ),
7107
+ 'Warnes' => array(
7108
+ 'label' => 'Warnes',
7109
+ 'variants' => array(
7110
+ 'regular',
7111
+ ),
7112
+ 'subsets' => array(
7113
+ 'latin',
7114
+ 'latin-ext',
7115
+ ),
7116
+ ),
7117
+ 'Wellfleet' => array(
7118
+ 'label' => 'Wellfleet',
7119
+ 'variants' => array(
7120
+ 'regular',
7121
+ ),
7122
+ 'subsets' => array(
7123
+ 'latin',
7124
+ 'latin-ext',
7125
+ ),
7126
+ ),
7127
+ 'Wendy One' => array(
7128
+ 'label' => 'Wendy One',
7129
+ 'variants' => array(
7130
+ 'regular',
7131
+ ),
7132
+ 'subsets' => array(
7133
+ 'latin',
7134
+ 'latin-ext',
7135
+ ),
7136
+ ),
7137
+ 'Wire One' => array(
7138
+ 'label' => 'Wire One',
7139
+ 'variants' => array(
7140
+ 'regular',
7141
+ ),
7142
+ 'subsets' => array(
7143
+ 'latin',
7144
+ ),
7145
+ ),
7146
+ 'Yanone Kaffeesatz' => array(
7147
+ 'label' => 'Yanone Kaffeesatz',
7148
+ 'variants' => array(
7149
+ '200',
7150
+ '300',
7151
+ 'regular',
7152
+ '700',
7153
+ ),
7154
+ 'subsets' => array(
7155
+ 'latin',
7156
+ 'latin-ext',
7157
+ ),
7158
+ ),
7159
+ 'Yellowtail' => array(
7160
+ 'label' => 'Yellowtail',
7161
+ 'variants' => array(
7162
+ 'regular',
7163
+ ),
7164
+ 'subsets' => array(
7165
+ 'latin',
7166
+ ),
7167
+ ),
7168
+ 'Yeseva One' => array(
7169
+ 'label' => 'Yeseva One',
7170
+ 'variants' => array(
7171
+ 'regular',
7172
+ ),
7173
+ 'subsets' => array(
7174
+ 'latin',
7175
+ 'cyrillic',
7176
+ 'latin-ext',
7177
+ ),
7178
+ ),
7179
+ 'Yesteryear' => array(
7180
+ 'label' => 'Yesteryear',
7181
+ 'variants' => array(
7182
+ 'regular',
7183
+ ),
7184
+ 'subsets' => array(
7185
+ 'latin',
7186
+ ),
7187
+ ),
7188
+ 'Zeyada' => array(
7189
+ 'label' => 'Zeyada',
7190
+ 'variants' => array(
7191
+ 'regular',
7192
+ ),
7193
+ 'subsets' => array(
7194
+ 'latin',
7195
+ ),
7196
+ ),
7197
+ ) );
7198
+
7199
+ }
7200
+
7201
+ }
includes/class-Kirki_Scripts.php ADDED
@@ -0,0 +1,296 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Scripts {
4
+
5
+ function __construct() {
6
+ add_action( 'customize_controls_print_styles', array( $this, 'scripts' ) );
7
+ add_action( 'customize_controls_print_styles', array( $this, 'googlefonts' ) );
8
+ add_action( 'customize_controls_print_scripts', array( $this, 'custom_js' ), 999 );
9
+ add_action( 'customize_controls_print_styles', array( $this, 'custom_css' ), 999 );
10
+ // TODO: This is not perfect under ANY circumstances.
11
+ add_action( 'customize_controls_print_footer_scripts', array( $this, 'postmessage' ), 21 );
12
+
13
+ add_action( 'wp_enqueue_scripts', array( $this, 'frontend_styles' ) );
14
+ }
15
+
16
+ /**
17
+ * Enqueue the stylesheets and scripts required.
18
+ */
19
+ function scripts() {
20
+
21
+ global $kirki;
22
+ $options = $kirki->get_config();
23
+
24
+ $kirki_url = isset( $options['url_path'] ) ? $options['url_path'] : KIRKI_URL;
25
+
26
+ wp_enqueue_style( 'kirki-customizer-css', $kirki_url . 'assets/css/customizer.css', NULL, '0.5' );
27
+ wp_enqueue_style( 'hint-css', $kirki_url . 'assets/css/hint.css', NULL, '1.3.3' );
28
+ wp_enqueue_style( 'kirki-customizer-ui', $kirki_url . 'assets/css/jquery-ui-1.10.0.custom.css', NULL, '1.10.0' );
29
+
30
+ // wp_enqueue_script( 'kirki_customizer_js', $kirki_url . 'assets/js/customizer.js');
31
+ wp_enqueue_script( 'jquery-ui-core' );
32
+ wp_enqueue_script( 'jquery-ui-tooltip' );
33
+
34
+ }
35
+
36
+ /**
37
+ * Add a dummy, empty stylesheet if no stylesheet_id has been defined and we need one.
38
+ */
39
+ function frontend_styles() {
40
+
41
+ global $kirki;
42
+ $config = $kirki->get_config();
43
+ $controls = $kirki->get_controls();
44
+
45
+ foreach( $controls as $control ) {
46
+ if ( isset( $control['output'] ) ) {
47
+ $uses_output = true;
48
+ }
49
+ }
50
+
51
+ if ( isset( $uses_output ) && ! isset( $config['stylesheet_id'] ) ) {
52
+ wp_enqueue_style( 'kirki-styles', $kirki_url . 'assets/css/kirki-styles.css', NULL, NULL );
53
+ }
54
+
55
+ }
56
+
57
+ /**
58
+ * Use the Roboto font on the customizer.
59
+ */
60
+ function googlefonts() { ?>
61
+ <link href='//fonts.googleapis.com/css?family=Roboto:100,400|Roboto+Slab:700,400&subset=latin,cyrillic-ext,greek,vietnamese,latin-ext,cyrillic' rel='stylesheet' type='text/css'>
62
+ <?php
63
+ }
64
+
65
+
66
+ /**
67
+ * If we've specified an image to be used as logo, replace the default theme description with a div that will have our logo as background.
68
+ */
69
+ function custom_js() {
70
+
71
+ $options = apply_filters( 'kirki/config', array() ); ?>
72
+
73
+ <?php if ( isset( $options['logo_image'] ) ) : ?>
74
+ <script>
75
+ jQuery(document).ready(function($) {
76
+ "use strict";
77
+
78
+ $( 'div#customize-info' ).replaceWith( '<div class="kirki-customizer"></div>' );
79
+ });
80
+ </script>
81
+ <?php endif;
82
+
83
+ }
84
+
85
+ /**
86
+ * Get the admin color theme
87
+ */
88
+ public static function admin_colors() {
89
+
90
+ // Get the active admin theme
91
+ global $_wp_admin_css_colors;
92
+
93
+ // Get the user's admin colors
94
+ $color = get_user_option( 'admin_color' );
95
+ // If no theme is active set it to 'fresh'
96
+ if ( empty( $color ) || ! isset( $_wp_admin_css_colors[$color] ) ) {
97
+ $color = 'fresh';
98
+ }
99
+
100
+ $color = (array) $_wp_admin_css_colors[$color];
101
+
102
+ return $color;
103
+
104
+ }
105
+
106
+ /**
107
+ * Add custom CSS rules to the head, applying our custom styles
108
+ */
109
+ function custom_css() {
110
+
111
+ global $kirki;
112
+
113
+ $color = self::admin_colors();
114
+ $options = $kirki->get_config();
115
+
116
+ $color_font = false;
117
+ $color_active = isset( $options['color_active'] ) ? $options['color_active'] : $color['colors'][3];
118
+ $color_light = isset( $options['color_light'] ) ? $options['color_light'] : $color['colors'][2];
119
+ $color_select = isset( $options['color_select'] ) ? $options['color_select'] : $color['colors'][3];
120
+ $color_accent = isset( $options['color_accent'] ) ? $options['color_accent'] : $color['icon_colors']['focus'];
121
+ $color_back = isset( $options['color_back'] ) ? $options['color_back'] : false;
122
+
123
+ if ( $color_back ) {
124
+ $color_font = ( 170 > kirki_get_brightness( $color_back ) ) ? '#f2f2f2' : '#222';
125
+ }
126
+
127
+ ?>
128
+
129
+ <style>
130
+ .wp-core-ui .button.tooltip {
131
+ background: <?php echo $color_select; ?>;
132
+ color: #fff;
133
+ }
134
+
135
+ .image.ui-buttonset label.ui-button.ui-state-active {
136
+ background: <?php echo $color_select; ?>;
137
+ }
138
+
139
+ <?php if ( $color_back ) : ?>
140
+
141
+ .wp-full-overlay-sidebar,
142
+ #customize-info .accordion-section-title,
143
+ #customize-info .accordion-section-title:hover,
144
+ #customize-theme-controls .accordion-section-title,
145
+ #customize-theme-controls .control-section .accordion-section-title {
146
+ background: <?php echo $color_back; ?>;
147
+ <?php if ( $color_font ) : ?>color: <?php echo $color_font; ?>;<?php endif; ?>
148
+ }
149
+ <?php if ( $color_font ) : ?>
150
+ #customize-theme-controls .control-section .accordion-section-title:focus,
151
+ #customize-theme-controls .control-section .accordion-section-title:hover,
152
+ #customize-theme-controls .control-section.open .accordion-section-title,
153
+ #customize-theme-controls .control-section:hover .accordion-section-title {
154
+ color: <?php echo $color_font; ?>;
155
+ }
156
+ <?php endif; ?>
157
+
158
+ <?php if ( 170 > Kirki_Color::get_brightness( $color_back ) ) : ?>
159
+ .control-section.control-panel>.accordion-section-title:after {
160
+ background: #111;
161
+ color: #f5f5f5;
162
+ border-left: 1px solid #000;
163
+ }
164
+ #customize-theme-controls .control-section.control-panel>h3.accordion-section-title:focus:after,
165
+ #customize-theme-controls .control-section.control-panel>h3.accordion-section-title:hover:after {
166
+ background: #222;
167
+ color: #fff;
168
+ border: 1px solid #222;
169
+ }
170
+
171
+ .control-panel-back,
172
+ .customize-controls-close {
173
+ background: #111 !important;
174
+ border-right: 1px solid #111 !important;
175
+ }
176
+ .control-panel-back:before,
177
+ .control-panel-back:after,
178
+ .customize-controls-close:before,
179
+ .customize-controls-close:after {
180
+ color: #f2f2f2 !important;
181
+ }
182
+ .control-panel-back:focus:before,
183
+ .control-panel-back:hover:before,
184
+ .customize-controls-close:focus:before,
185
+ .customize-controls-close:hover:before {
186
+ background: #000;
187
+ color: #fff;
188
+ }
189
+ #customize-header-actions {
190
+ border-bottom: 1px solid #111;
191
+ }
192
+ <?php endif; ?>
193
+
194
+ <?php endif; ?>
195
+
196
+ .ui-state-default,
197
+ .ui-widget-content .ui-state-default,
198
+ .ui-widget-header .ui-state-default,
199
+ .ui-state-active.ui-button.ui-widget.ui-state-default {
200
+ background-color: <?php echo $color_active; ?>;
201
+ border: 1px solid rgba(0,0,0,.05);
202
+ }
203
+
204
+ .ui-button.ui-widget.ui-state-default {
205
+ background-color: #f2f2f2;
206
+ }
207
+
208
+ #customize-theme-controls .accordion-section-title {
209
+ border-bottom: 1px solid rgba(0,0,0,.1);
210
+ }
211
+
212
+ #customize-theme-controls .control-section .accordion-section-title:focus,
213
+ #customize-theme-controls .control-section .accordion-section-title:hover,
214
+ #customize-theme-controls .control-section.open .accordion-section-title,
215
+ #customize-theme-controls .control-section:hover .accordion-section-title {
216
+ background: <?php echo $color_active; ?>;
217
+ }
218
+ #customize-theme-controls .control-section.control-panel.current-panel:hover .accordion-section-title{
219
+ background: none;
220
+ }
221
+
222
+ #customize-theme-controls .control-section.control-panel.current-panel .accordion-section-title:hover{
223
+ background: <?php echo $color_active; ?>;
224
+ }
225
+
226
+ .wp-core-ui .button-primary {
227
+ background: <?php echo $color_active; ?>;
228
+ }
229
+
230
+ .wp-core-ui .button-primary.focus,
231
+ .wp-core-ui .button-primary.hover,
232
+ .wp-core-ui .button-primary:focus,
233
+ .wp-core-ui .button-primary:hover {
234
+ background: <?php echo $color_select; ?>;
235
+ }
236
+
237
+ .wp-core-ui .button-primary-disabled,
238
+ .wp-core-ui .button-primary.disabled,
239
+ .wp-core-ui .button-primary:disabled,
240
+ .wp-core-ui .button-primary[disabled] {
241
+ background: <?php echo $color_light; ?> !important;
242
+ color: <?php echo $color_select; ?> !important;
243
+ }
244
+
245
+ <?php if ( isset( $options['logo_image'] ) ) : ?>
246
+ div.kirki-customizer {
247
+ background: url("<?php echo $options['logo_image']; ?>") no-repeat left center;
248
+ }
249
+ <?php endif; ?>
250
+ </style>
251
+ <?php
252
+ }
253
+
254
+ /**
255
+ * Try to automatically generate the script necessary for postMessage to work.
256
+ * Something like this will have to be added to the control arguments:
257
+ *
258
+ * 'transport' => 'postMessage',
259
+ * 'js_vars' => array(
260
+ * 'element' => 'body',
261
+ * 'type' => 'css',
262
+ * 'property' => 'color',
263
+ * ),
264
+ *
265
+ */
266
+ function postmessage() {
267
+
268
+ global $kirki;
269
+ $controls = $kirki->get_controls();
270
+
271
+ $script = '';
272
+
273
+ foreach ( $controls as $control ) {
274
+
275
+ if ( isset( $control['transport'] ) && isset( $control['js_vars'] ) && 'postMessage' == $control['transport'] ) {
276
+
277
+ $script .= '<script type="text/javascript">jQuery(document).ready(function( $ ) {';
278
+ $script .= 'wp.customize("' . $control['setting'] . '",function( value ) {';
279
+
280
+ if ( isset( $control['js_vars']['type'] ) && 'css' == $control['js_vars']['type'] ) {
281
+ $script .= 'value.bind(function(to) {';
282
+ $script .= '$("' . $control['js_vars']['element'] . '").css("' . $control['js_vars']['property'] . '", to ? to : "" );';
283
+ $script .= '});';
284
+ }
285
+
286
+ $script .= '});});</script>';
287
+
288
+ }
289
+
290
+ }
291
+
292
+ echo $script;
293
+
294
+ }
295
+
296
+ }
includes/class-Kirki_Settings.php ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class Kirki_Settings extends Kirki {
5
+
6
+ /**
7
+ * Build a single setting
8
+ */
9
+ function add_setting( $wp_customize, $control ) {
10
+
11
+ if ( 'background' == $control['type'] ) {
12
+
13
+ $wp_customize->add_setting( $control['setting'] . '_color', array(
14
+ 'default' => $control['default']['color'],
15
+ 'type' => 'theme_mod',
16
+ 'capability' => 'edit_theme_options',
17
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
18
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : 'sanitize_hex_color'
19
+ ) );
20
+
21
+ $wp_customize->add_setting( $control['setting'] . '_image', array(
22
+ 'default' => $control['default']['image'],
23
+ 'type' => 'theme_mod',
24
+ 'capability' => 'edit_theme_options',
25
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
26
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : 'esc_url_raw'
27
+ ) );
28
+
29
+ $wp_customize->add_setting( $control['setting'] . '_repeat', array(
30
+ 'default' => $control['default']['repeat'],
31
+ 'type' => 'theme_mod',
32
+ 'capability' => 'edit_theme_options',
33
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
34
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : array( $this, 'sanitize_bg_repeat' ),
35
+ ) );
36
+
37
+ $wp_customize->add_setting( $control['setting'] . '_size', array(
38
+ 'default' => $control['default']['size'],
39
+ 'type' => 'theme_mod',
40
+ 'capability' => 'edit_theme_options',
41
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
42
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : array( $this, 'sanitize_bg_size' ),
43
+ ) );
44
+
45
+ $wp_customize->add_setting( $control['setting'] . '_attach', array(
46
+ 'default' => $control['default']['attach'],
47
+ 'type' => 'theme_mod',
48
+ 'capability' => 'edit_theme_options',
49
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
50
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : array( $this, 'sanitize_bg_attach' ),
51
+ ) );
52
+
53
+ $wp_customize->add_setting( $control['setting'] . '_position', array(
54
+ 'default' => $control['default']['position'],
55
+ 'type' => 'theme_mod',
56
+ 'capability' => 'edit_theme_options',
57
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
58
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : array( $this, 'sanitize_bg_position' ),
59
+ ) );
60
+
61
+ if ( false != $control['default']['opacity'] ) {
62
+
63
+ $wp_customize->add_setting( $control['setting'] . '_opacity', array(
64
+ 'default' => $control['default']['opacity'],
65
+ 'type' => 'theme_mod',
66
+ 'capability' => 'edit_theme_options',
67
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
68
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : 'absint'
69
+ ) );
70
+
71
+ }
72
+ } else {
73
+
74
+ if ( 'checkbox' == $control['type'] ) {
75
+ $sanitize_callback = array( $this, 'sanitize_checkbox' );
76
+ } elseif ( 'color' == $control['type'] ) {
77
+ $sanitize_callback = 'sanitize_hex_color';
78
+ } elseif ( 'image' == $control['type'] ) {
79
+ $sanitize_callback = 'esc_url_raw';
80
+ } elseif ( 'radio' == $control['type'] ) {
81
+ // TODO: Find a way to handle these
82
+ $sanitize_callback = array( $this, 'unfiltered' );
83
+ } elseif ( 'select' == $control['type'] ) {
84
+ // TODO: Find a way to handle these
85
+ $sanitize_callback = array( $this, 'unfiltered' );
86
+ } elseif ( 'slider' == $control['type'] ) {
87
+ $sanitize_callback = array( $this, 'sanitize_number' );
88
+ } elseif ( 'text' == $control['type'] ) {
89
+ $sanitize_callback = 'esc_textarea';
90
+ } elseif ( 'textarea' == $control['type'] ) {
91
+ $sanitize_callback = 'esc_textarea';
92
+ } elseif ( 'upload' == $control['type'] ) {
93
+ $sanitize_callback = 'esc_url_raw';
94
+ } elseif ( 'number' == $control['type'] ) {
95
+ $sanitize_callback = 'intval';
96
+ } elseif ( 'multicheck' == $control['type'] ) {
97
+ $sanitize_callback = 'esc_attr';
98
+ } elseif ( 'group_title' == $control['type'] ) {
99
+ $sanitize_callback = 'esc_attr';
100
+ } else {
101
+ $sanitize_callback = array( $this, 'unfiltered' );
102
+ }
103
+
104
+ // Add settings
105
+ $wp_customize->add_setting( $control['setting'], array(
106
+ 'default' => isset( $control['default'] ) ? $control['default'] : '',
107
+ 'type' => 'theme_mod',
108
+ 'capability' => 'edit_theme_options',
109
+ 'transport' => isset( $control['transport'] ) ? $control['transport'] : 'postMessage',
110
+ 'sanitize_callback' => isset( $control['sanitize_callback'] ) ? $control['sanitize_callback'] : $sanitize_callback,
111
+ ) );
112
+
113
+ }
114
+
115
+ }
116
+
117
+ /**
118
+ * Sanitize checkbox options
119
+ *
120
+ * @since 0.5
121
+ */
122
+ public function sanitize_checkbox( $value ) {
123
+ return ( 'on' != $value ) ? false : $value;
124
+ }
125
+
126
+ /**
127
+ * Sanitize number options
128
+ *
129
+ * @since 0.5
130
+ */
131
+ public function sanitize_number( $value ) {
132
+ return ( is_int( $value ) || is_float( $value ) ) ? $value : intval( $value );
133
+ }
134
+
135
+ /**
136
+ * Sanitize a value from a list of allowed values.
137
+ *
138
+ * @since 0.5
139
+ *
140
+ * @param mixed $value The value to sanitize.
141
+ * @param mixed $setting The setting for which the sanitizing is occurring.
142
+ * @return mixed The sanitized value.
143
+ */
144
+ function sanitize_choice( $value, $choices, $default ) {
145
+
146
+ $allowed_choices = array_keys( $choices );
147
+ return ( ! in_array( $value, $allowed_choices ) ) ? $default : $value;
148
+
149
+ }
150
+
151
+ /**
152
+ * Sanitize background repeat values
153
+ *
154
+ * @since 0.5
155
+ */
156
+ function sanitize_bg_repeat( $value ) {
157
+ $valid = array(
158
+ 'no-repeat' => __( 'No Repeat', 'kirki' ),
159
+ 'repeat' => __( 'Repeat All', 'kirki' ),
160
+ 'repeat-x' => __( 'Repeat Horizontally', 'kirki' ),
161
+ 'repeat-y' => __( 'Repeat Vertically', 'kirki' ),
162
+ 'inherit' => __( 'Inherit', 'kirki' )
163
+ );
164
+
165
+ return ( array_key_exists( $value, $valid ) ) ? $value : 'inherit';
166
+
167
+ }
168
+
169
+ /**
170
+ * Sanitize background size values
171
+ *
172
+ * @since 0.5
173
+ */
174
+ function sanitize_bg_size( $value ) {
175
+ $valid = array(
176
+ 'inherit' => __( 'Inherit', 'kirki' ),
177
+ 'cover' => __( 'Cover', 'kirki' ),
178
+ 'contain' => __( 'Contain', 'kirki' ),
179
+ );
180
+
181
+ return ( array_key_exists( $value, $valid ) ) ? $value : 'inherit';
182
+
183
+ }
184
+
185
+ /**
186
+ * Sanitize background attachment values
187
+ *
188
+ * @since 0.5
189
+ */
190
+ function sanitize_bg_attach( $value ) {
191
+ $valid = array(
192
+ 'inherit' => __( 'Inherit', 'kirki' ),
193
+ 'fixed' => __( 'Fixed', 'kirki' ),
194
+ 'scroll' => __( 'Scroll', 'kirki' ),
195
+ );
196
+
197
+ return ( array_key_exists( $value, $valid ) ) ? $value : 'inherit';
198
+
199
+ }
200
+
201
+ /**
202
+ * Sanitize background position values
203
+ *
204
+ * @since 0.5
205
+ */
206
+ function sanitize_bg_position( $value ) {
207
+ $valid = array(
208
+ 'left-top' => __( 'Left Top', 'kirki' ),
209
+ 'left-center' => __( 'Left Center', 'kirki' ),
210
+ 'left-bottom' => __( 'Left Bottom', 'kirki' ),
211
+ 'right-top' => __( 'Right Top', 'kirki' ),
212
+ 'right-center' => __( 'Right Center', 'kirki' ),
213
+ 'right-bottom' => __( 'Right Bottom', 'kirki' ),
214
+ 'center-top' => __( 'Center Top', 'kirki' ),
215
+ 'center-center' => __( 'Center Center', 'kirki' ),
216
+ 'center-bottom' => __( 'Center Bottom', 'kirki' ),
217
+ );
218
+
219
+ return ( array_key_exists( $value, $valid ) ) ? $value : 'center-center';
220
+
221
+ }
222
+
223
+ /**
224
+ * DOES NOT SANITIZE ANYTHING.
225
+ *
226
+ * @since 0.5
227
+ */
228
+ function unfiltered( $value ) {
229
+ return $value;
230
+ }
231
+
232
+ }
includes/class-Kirki_Style_Background.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Style_Background {
4
+
5
+ function __construct() {
6
+ add_action( 'wp_enqueue_scripts', array( $this, 'add_css' ), 150 );
7
+ }
8
+
9
+ function add_css() {
10
+
11
+ global $kirki;
12
+ $controls = $kirki->get_controls();
13
+ $config = $kirki->get_config();
14
+
15
+ $css = '';
16
+ foreach ( $controls as $control ) {
17
+ $css .= $this->control_css( $control );
18
+ }
19
+
20
+ wp_add_inline_style( $config['stylesheet_id'], $css );
21
+
22
+ }
23
+
24
+ /**
25
+ * Apply custom backgrounds to our page.
26
+ */
27
+ function control_css( $control ) {
28
+
29
+ // Early exit if this is not a background control
30
+ if ( 'background' != $control['type'] ) {
31
+ return;
32
+ }
33
+
34
+ // Early exit if we have not set the 'output'.
35
+ if ( is_null( $control['output'] ) ) {
36
+ return;
37
+ }
38
+
39
+ // Add support for previous syntax for output (string instead of array)
40
+ $output_element = is_array( $control['output'] ) ? $control['output']['element'] : $control['output'];
41
+
42
+ $bg_color = Kirki_Color::sanitize_hex( get_theme_mod( $control['setting'] . '_color', $control['default']['color'] ) );
43
+ $bg_image = get_theme_mod( $control['setting'] . '_image', $control['default']['image'] );
44
+ $bg_repeat = get_theme_mod( $control['setting'] . '_repeat', $control['default']['repeat'] );
45
+ $bg_size = get_theme_mod( $control['setting'] . '_size', $control['default']['size'] );
46
+ $bg_attach = get_theme_mod( $control['setting'] . '_attach', $control['default']['attach'] );
47
+ $bg_position = get_theme_mod( $control['setting'] . '_position', $control['default']['position'] );
48
+ $bg_opacity = get_theme_mod( $control['setting'] . '_opacity', $control['default']['opacity'] );
49
+
50
+ if ( false != $control['default']['opacity'] ) {
51
+
52
+ $bg_position = get_theme_mod( $control['setting'] . '_opacity', $control['default']['opacity'] );
53
+
54
+ // If we're using an opacity other than 100, then convert the color to RGBA.
55
+ if ( 100 != $bg_opacity ) {
56
+ $bg_color = Kirki_Color::get_rgba( $bg_color, $bg_opacity );
57
+ }
58
+
59
+ }
60
+
61
+ // HTML Background
62
+ $styles = $output_element . '{';
63
+ $styles .= 'background-color:' . $bg_color . ';';
64
+
65
+ if ( '' != $bg_image ) {
66
+ $styles .= 'background-image: url("' . $bg_image . '");';
67
+ $styles .= 'background-repeat: ' . $bg_repeat . ';';
68
+ $styles .= 'background-size: ' . $bg_size . ';';
69
+ $styles .= 'background-attachment: ' . $bg_attach . ';';
70
+ $styles .= 'background-position: ' . str_replace( '-', ' ', $bg_position ) . ';';
71
+ }
72
+
73
+ $styles .= '}';
74
+
75
+ return $styles;
76
+
77
+ }
78
+
79
+ }
includes/class-Kirki_Style_Color.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Style_Color {
4
+
5
+ function __construct() {
6
+ add_action( 'wp_enqueue_scripts', array( $this, 'add_css' ), 150 );
7
+ }
8
+
9
+ function add_css() {
10
+
11
+ global $kirki;
12
+ $controls = $kirki->get_controls();
13
+ $config = $kirki->get_config();
14
+
15
+ $css = '';
16
+ foreach ( $controls as $control ) {
17
+ $css .= $this->control_css( $control );
18
+ }
19
+
20
+ wp_add_inline_style( $config['stylesheet_id'], $css );
21
+
22
+ }
23
+
24
+ /**
25
+ * Apply custom backgrounds to our page.
26
+ */
27
+ function control_css( $control ) {
28
+
29
+ // Early exit if this is not a background control
30
+ if ( 'color' != $control['type'] ) {
31
+ return;
32
+ }
33
+
34
+ // Early exit if 'output' is not set or not an array.
35
+ if ( ! isset( $control['output'] ) || ! array( $control['output'] ) ) {
36
+ return;
37
+ }
38
+
39
+ $color = Kirki_Color::sanitize_hex( get_theme_mod( $control['setting'], $control['default'] ) );
40
+
41
+ // Generate the styles
42
+ $styles = $control['output']['element'] . '{' . $control['output']['property'] . ':' . $color . ';}';
43
+ return $styles;
44
+
45
+ }
46
+
47
+ }
includes/class-Kirki_Style_Fonts.php ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Style_Fonts {
4
+
5
+ function __construct() {
6
+ add_action( 'wp_enqueue_scripts', array( $this, 'get_css' ), 150 );
7
+ add_action( 'wp_enqueue_scripts', array( $this, 'google_font' ), 105 );
8
+ }
9
+
10
+ function font_builder( $context = 'styles' ) {
11
+
12
+ // Get the global config and controls
13
+ global $kirki;
14
+ $controls = $kirki->get_controls();
15
+ $config = $kirki->get_config();
16
+
17
+ // Get an array of all the google fonts
18
+ $google_fonts = Kirki_Fonts::get_google_fonts();
19
+
20
+ $css = '';
21
+ $fonts = array();
22
+ foreach ( $controls as $control ) {
23
+
24
+ // The value of this control
25
+ $value = get_theme_mod( $control['setting'], $control['default'] );
26
+
27
+ if ( isset( $control['output'] ) ) {
28
+
29
+ // Check if this is a font-family control
30
+ $is_font_family = isset( $control['output']['property'] ) && 'font-family' == $control['output']['property'] ? true : false;
31
+ // Check if this is a font-size control
32
+ $is_font_size = isset( $control['output']['property'] ) && 'font-size' == $control['output']['property'] ? true : false;
33
+ // Check if this is a font-weight control
34
+ $is_font_weight = isset( $control['output']['property'] ) && 'font-weight' == $control['output']['property'] ? true : false;
35
+ // Check if this is a font subset control
36
+ $is_font_subset = isset( $control['output']['property'] ) && 'font-subset' == $control['output']['property'] ? true : false;
37
+
38
+ if ( $is_font_family ) {
39
+
40
+ $fonts[]['font-family'] = $value;
41
+ $css .= $control['output']['element'] . '{font-family:' . $value . ';}';
42
+
43
+ } else if ( $is_font_size ) {
44
+
45
+ // Get the unit we're going to use for the font-size.
46
+ $units = isset( $control['output']['units'] ) ? $control['output']['units'] : 'px';
47
+
48
+ $css .= $control['output']['element'] . '{font-size:' . $value . $units . ';}';
49
+
50
+ } else if ( $is_font_weight ) {
51
+
52
+ $fonts[]['font-weight'] = $value;
53
+ $css .= $control['output']['element'] . '{font-weight:' . $value . ';}';
54
+
55
+ } else if ( $is_font_subset ) {
56
+
57
+ $fonts[]['subsets'] = $value;
58
+
59
+ }
60
+
61
+ }
62
+
63
+ }
64
+
65
+ foreach ( $fonts as $font ) {
66
+
67
+ if ( isset( $font['font-family'] ) ) {
68
+
69
+ $font_families = ( ! isset( $font_families ) ) ? array() : $font_families;
70
+ $font_families[] = $font['font-family'];
71
+
72
+ if ( Kirki_Fonts::is_google_font( $font['font-family'] ) ) {
73
+ $has_google_font = true;
74
+ }
75
+
76
+ }
77
+
78
+ if ( isset( $font['font-weight'] ) ) {
79
+
80
+ $font_weights = ( ! isset( $font_weights ) ) ? array() : $font_weights;
81
+ $font_weights[] = $font['font-weight'];
82
+
83
+ }
84
+
85
+ if ( isset( $font['subsets'] ) ) {
86
+
87
+ $font_subsets = ( ! isset( $font_subsets ) ) ? array() : $font_subsets;
88
+ $font_subsets[] = $font['subsets'];
89
+
90
+ }
91
+
92
+ }
93
+
94
+ $font_families = ( ! isset( $font_families ) || empty( $font_families ) ) ? false : $font_families;
95
+ $font_weights = ( ! isset( $font_weights ) || empty( $font_weights ) ) ? '400' : $font_weights;
96
+ $font_subsets = ( ! isset( $font_subsets ) || empty( $font_subsets ) ) ? 'all' : $font_subsets;
97
+
98
+ if ( ! isset( $has_google_font ) || ! $has_google_font ) {
99
+ $font_families = false;
100
+ }
101
+
102
+ if ( 'styles' == $context ) {
103
+ return $css;
104
+ } else if ( 'google_link' == $context ) {
105
+ return ( $font_families ) ? Kirki_Fonts::get_google_font_uri( $font_families, $font_weights, $font_subsets ) : false;
106
+ }
107
+
108
+ }
109
+
110
+ function get_css() {
111
+
112
+ global $kirki;
113
+ $config = $kirki->get_config();
114
+
115
+ $css = $this->font_builder( 'styles' );
116
+
117
+ wp_add_inline_style( $config['stylesheet_id'], $css );
118
+
119
+ }
120
+
121
+ /**
122
+ * Enqueue Google fonts if necessary
123
+ */
124
+ function google_font() {
125
+
126
+ $google_link = $this->font_builder( 'google_link' );
127
+
128
+ if ( $google_link ) {
129
+ wp_register_style( 'kirki_google_fonts', $google_link );
130
+ wp_enqueue_style( 'kirki_google_fonts' );
131
+ }
132
+
133
+ }
134
+
135
+ }
includes/class-Kirki_Style_Generic.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Style_Generic {
4
+
5
+ function __construct() {
6
+ add_action( 'wp_enqueue_scripts', array( $this, 'add_css' ), 150 );
7
+ }
8
+
9
+ function add_css() {
10
+
11
+ global $kirki;
12
+ $controls = $kirki->get_controls();
13
+ $config = $kirki->get_config();
14
+
15
+ $css = '';
16
+ foreach ( $controls as $control ) {
17
+ $css .= $this->control_css( $control );
18
+ }
19
+
20
+ wp_add_inline_style( $config['stylesheet_id'], $css );
21
+
22
+ }
23
+
24
+ /**
25
+ * Apply custom CSS to our page.
26
+ */
27
+ function control_css( $control ) {
28
+
29
+ /**
30
+ * Early exit if this control is a background or a color control.
31
+ * Background controls are handled in the Kirki_Style_Background class.
32
+ * Color controls are handled in the Kirki_Style_Color class.
33
+ */
34
+ if ( 'color' != $control['type'] && 'background' != $control['type'] ) {
35
+ return;
36
+ }
37
+
38
+ // Early exit if 'output' is not set or not an array.
39
+ if ( ! isset( $control['output'] ) || ! array( $control['output'] ) ) {
40
+ return;
41
+ }
42
+
43
+ /**
44
+ * Early exit if this is a font control.
45
+ * Font controls are hndled in the Kirki_Style_Fonts class
46
+ */
47
+ if ( isset( $control['output']['property'] ) ) {
48
+ $font_properties = array( 'font-family', 'font-size', 'font-weight', 'font-subset' );
49
+
50
+ if ( in_array( $control['output']['property'], $font_properties ) ) {
51
+ return;
52
+ }
53
+
54
+ }
55
+
56
+ $value = get_theme_mod( $control['setting'], $control['default'] );
57
+
58
+ // Do we have a unit specified?
59
+ $units = ( isset( $control['output']['units'] ) ) ? $control['output']['units'] : null;
60
+ // Generate the styles
61
+ $styles = $control['output']['element'] . '{' . $control['output']['property'] . ':' . $value . $units . ';}';
62
+
63
+ return $styles;
64
+
65
+ }
66
+
67
+ }
includes/controls/class-Kirki_Customize_Checkbox_Control.php CHANGED
@@ -3,57 +3,20 @@
3
  class Kirki_Customize_Checkbox_Control extends WP_Customize_Control {
4
 
5
  public $type = 'checkbox';
6
-
7
  public $description = '';
8
-
9
  public $subtitle = '';
10
 
11
- public $separator = false;
12
-
13
- public $required;
14
-
15
  public function render_content() { ?>
16
  <label class="customizer-checkbox">
17
  <input type="checkbox" value="<?php echo esc_attr( $this->value() ); ?>" id="<?php echo $this->id . esc_attr( $this->value() ); ?>" <?php $this->link(); checked( $this->value() ); ?> />
18
  <strong><?php echo esc_html( $this->label ); ?></strong>
19
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
20
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
21
  <?php } ?>
22
  <?php if ( '' != $this->subtitle ) : ?>
23
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
24
  <?php endif; ?>
25
  </label>
26
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
27
- <?php foreach ( $this->required as $id => $value ) :
28
-
29
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
30
- <script>
31
- jQuery(document).ready(function($) {
32
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
33
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
34
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
35
- });
36
- $( "#<?php echo $id . $value; ?>" ).click(function(){
37
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
38
- });
39
- });
40
- </script>
41
- <?php }
42
-
43
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
44
- <script>
45
- jQuery(document).ready(function($) {
46
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
47
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
48
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
49
- });
50
- $( "#<?php echo $id . $value; ?>" ).click(function(){
51
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
52
- });
53
- });
54
- </script>
55
- <?php }
56
-
57
- endforeach;
58
  }
59
  }
3
  class Kirki_Customize_Checkbox_Control extends WP_Customize_Control {
4
 
5
  public $type = 'checkbox';
 
6
  public $description = '';
 
7
  public $subtitle = '';
8
 
 
 
 
 
9
  public function render_content() { ?>
10
  <label class="customizer-checkbox">
11
  <input type="checkbox" value="<?php echo esc_attr( $this->value() ); ?>" id="<?php echo $this->id . esc_attr( $this->value() ); ?>" <?php $this->link(); checked( $this->value() ); ?> />
12
  <strong><?php echo esc_html( $this->label ); ?></strong>
13
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
14
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
15
  <?php } ?>
16
  <?php if ( '' != $this->subtitle ) : ?>
17
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
18
  <?php endif; ?>
19
  </label>
20
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  }
22
  }
includes/controls/class-Kirki_Customize_Color_Control.php CHANGED
@@ -19,14 +19,9 @@ class Kirki_Customize_Color_Control extends WP_Customize_Control {
19
  * @var array
20
  */
21
  public $statuses;
22
-
23
  public $description = '';
24
-
25
  public $subtitle = '';
26
-
27
- public $separator = false;
28
-
29
- public $required;
30
 
31
  /**
32
  * Constructor.
@@ -39,8 +34,9 @@ class Kirki_Customize_Color_Control extends WP_Customize_Control {
39
  * @param array $args
40
  */
41
  public function __construct( $manager, $id, $args = array() ) {
42
- $this->statuses = array( '' => __('Default') );
43
  parent::__construct( $manager, $id, $args );
 
44
  }
45
 
46
  /**
@@ -72,58 +68,34 @@ class Kirki_Customize_Color_Control extends WP_Customize_Control {
72
  public function render_content() {
73
  $this_default = $this->setting->default;
74
  $default_attr = '';
 
 
75
  if ( $this_default ) {
76
  if ( false === strpos( $this_default, '#' ) )
77
  $this_default = '#' . $this_default;
78
  $default_attr = ' data-default-color="' . esc_attr( $this_default ) . '"';
79
  }
 
 
 
 
80
  // The input's value gets set by JS. Don't fill it.
81
  ?>
82
  <label>
83
  <span class="customize-control-title">
84
  <?php echo esc_html( $this->label ); ?>
85
  <?php if ( isset( $this->description ) && ! empty( $this->description ) ) { ?>
86
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
87
  <?php } ?>
88
  </span>
89
  <?php if ( '' != $this->subtitle ) : ?>
90
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
91
  <?php endif; ?>
92
  <div class="customize-control-content">
93
- <input class="color-picker-hex" type="text" maxlength="7" placeholder="<?php esc_attr_e( 'Hex Value' ); ?>"<?php echo $default_attr; ?> />
94
  </div>
95
  </label>
96
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
97
- <?php foreach ( $this->required as $id => $value ) :
98
-
99
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
100
- <script>
101
- jQuery(document).ready(function($) {
102
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
103
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
104
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
105
- });
106
- $( "#<?php echo $id . $value; ?>" ).click(function(){
107
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
108
- });
109
- });
110
- </script>
111
- <?php }
112
-
113
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
114
- <script>
115
- jQuery(document).ready(function($) {
116
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
117
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
118
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
119
- });
120
- $( "#<?php echo $id . $value; ?>" ).click(function(){
121
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
122
- });
123
- });
124
- </script>
125
- <?php }
126
 
127
- endforeach;
128
  }
129
  }
19
  * @var array
20
  */
21
  public $statuses;
 
22
  public $description = '';
 
23
  public $subtitle = '';
24
+ public $framework_var = '';
 
 
 
25
 
26
  /**
27
  * Constructor.
34
  * @param array $args
35
  */
36
  public function __construct( $manager, $id, $args = array() ) {
37
+ $this->statuses = array( '' => __( 'Default', 'kirki' ) );
38
  parent::__construct( $manager, $id, $args );
39
+ $this->framework_var = ( isset( $args['framework_var'] ) && ! is_null( $args['framework_var'] ) ) ? $args['framework_var'] : null;
40
  }
41
 
42
  /**
68
  public function render_content() {
69
  $this_default = $this->setting->default;
70
  $default_attr = '';
71
+ $this_id = $this->id;
72
+
73
  if ( $this_default ) {
74
  if ( false === strpos( $this_default, '#' ) )
75
  $this_default = '#' . $this_default;
76
  $default_attr = ' data-default-color="' . esc_attr( $this_default ) . '"';
77
  }
78
+
79
+ $setting_attr = ' data-customize-setting-link="' . esc_attr( $this_id ) . '"';
80
+ $framework_var = ' data-framework-var="' . $this->framework_var . '"';
81
+
82
  // The input's value gets set by JS. Don't fill it.
83
  ?>
84
  <label>
85
  <span class="customize-control-title">
86
  <?php echo esc_html( $this->label ); ?>
87
  <?php if ( isset( $this->description ) && ! empty( $this->description ) ) { ?>
88
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
89
  <?php } ?>
90
  </span>
91
  <?php if ( '' != $this->subtitle ) : ?>
92
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
93
  <?php endif; ?>
94
  <div class="customize-control-content">
95
+ <input class="color-picker-hex kirki-color-picker" type="text" maxlength="7" placeholder="<?php esc_attr_e( 'Hex Value' ); ?>"<?php echo $default_attr; ?> <?php echo $setting_attr; ?> <?php echo $framework_var; ?>/>
96
  </div>
97
  </label>
98
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
 
 
100
  }
101
  }
includes/controls/class-Kirki_Customize_Group_Title_Control.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Kirki_Customize_Group_Title_Control extends WP_Customize_Control {
4
+
5
+ public $type = 'group_title';
6
+ public $description = '';
7
+ public $subtitle = '';
8
+
9
+ public function render_content() { ?>
10
+
11
+ <label class="customizer-separator">
12
+ <span class="customize-control-title">
13
+ <?php echo esc_html( $this->label ); ?>
14
+
15
+ <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
16
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
17
+ <?php } ?>
18
+ </span>
19
+
20
+ <?php if ( '' != $this->subtitle ) : ?>
21
+ <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
22
+ <?php endif; ?>
23
+ </label>
24
+ <?php
25
+ }
26
+ }
includes/controls/class-Kirki_Customize_Image_Control.php CHANGED
@@ -12,15 +12,9 @@ class Kirki_Customize_Image_Control extends WP_Customize_Upload_Control {
12
  public $get_url;
13
  public $statuses;
14
  public $extensions = array( 'jpg', 'jpeg', 'gif', 'png' );
15
-
16
  public $description = '';
17
-
18
  public $subtitle = '';
19
 
20
- public $separator = false;
21
-
22
- public $required;
23
-
24
  protected $tabs = array();
25
 
26
  /**
@@ -34,12 +28,12 @@ class Kirki_Customize_Image_Control extends WP_Customize_Upload_Control {
34
  * @param array $args
35
  */
36
  public function __construct( $manager, $id, $args ) {
37
- $this->statuses = array( '' => __('No Image') );
38
 
39
  parent::__construct( $manager, $id, $args );
40
 
41
- $this->add_tab( 'upload-new', __('Upload New'), array( $this, 'tab_upload_new' ) );
42
- $this->add_tab( 'uploaded', __('Uploaded'), array( $this, 'tab_uploaded' ) );
43
 
44
  // Early priority to occur before $this->manager->prepare_controls();
45
  add_action( 'customize_controls_init', array( $this, 'prepare_control' ), 5 );
@@ -83,7 +77,7 @@ class Kirki_Customize_Image_Control extends WP_Customize_Upload_Control {
83
  <span class="customize-control-title">
84
  <?php echo esc_html( $this->label ); ?>
85
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
86
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
87
  <?php } ?>
88
  </span>
89
 
@@ -121,41 +115,10 @@ class Kirki_Customize_Image_Control extends WP_Customize_Upload_Control {
121
  </div>
122
 
123
  <div class="actions">
124
- <a href="#" class="remove"><?php _e( 'Remove Image' ); ?></a>
125
  </div>
126
  </div>
127
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
128
- <?php foreach ( $this->required as $id => $value ) :
129
-
130
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
131
- <script>
132
- jQuery(document).ready(function($) {
133
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
134
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
135
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
136
- });
137
- $( "#<?php echo $id . $value; ?>" ).click(function(){
138
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
139
- });
140
- });
141
- </script>
142
- <?php }
143
-
144
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
145
- <script>
146
- jQuery(document).ready(function($) {
147
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
148
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
149
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
150
- });
151
- $( "#<?php echo $id . $value; ?>" ).click(function(){
152
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
153
- });
154
- });
155
- </script>
156
- <?php }
157
-
158
- endforeach;
159
  }
160
 
161
  /**
@@ -197,7 +160,7 @@ class Kirki_Customize_Image_Control extends WP_Customize_Upload_Control {
197
  <?php _e('Drop a file here or <a href="#" class="upload">select a file</a>.'); ?>
198
  </div>
199
  <div class="upload-fallback">
200
- <span class="button-secondary"><?php _e('Select File'); ?></span>
201
  </div>
202
  <?php
203
  }
12
  public $get_url;
13
  public $statuses;
14
  public $extensions = array( 'jpg', 'jpeg', 'gif', 'png' );
 
15
  public $description = '';
 
16
  public $subtitle = '';
17
 
 
 
 
 
18
  protected $tabs = array();
19
 
20
  /**
28
  * @param array $args
29
  */
30
  public function __construct( $manager, $id, $args ) {
31
+ $this->statuses = array( '' => __( 'No Image', 'kirki' ) );
32
 
33
  parent::__construct( $manager, $id, $args );
34
 
35
+ $this->add_tab( 'upload-new', __( 'Upload New', 'kirki' ), array( $this, 'tab_upload_new' ) );
36
+ $this->add_tab( 'uploaded', __( 'Uploaded', 'kirki' ), array( $this, 'tab_uploaded' ) );
37
 
38
  // Early priority to occur before $this->manager->prepare_controls();
39
  add_action( 'customize_controls_init', array( $this, 'prepare_control' ), 5 );
77
  <span class="customize-control-title">
78
  <?php echo esc_html( $this->label ); ?>
79
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
80
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
81
  <?php } ?>
82
  </span>
83
 
115
  </div>
116
 
117
  <div class="actions">
118
+ <a href="#" class="remove"><?php _e( 'Remove Image', 'kirki' ); ?></a>
119
  </div>
120
  </div>
121
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  }
123
 
124
  /**
160
  <?php _e('Drop a file here or <a href="#" class="upload">select a file</a>.'); ?>
161
  </div>
162
  <div class="upload-fallback">
163
+ <span class="button-secondary"><?php _e( 'Select File', 'kirki' ); ?></span>
164
  </div>
165
  <?php
166
  }
includes/controls/class-Kirki_Customize_Multicheck_Control.php CHANGED
@@ -8,13 +8,8 @@
8
  class Kirki_Customize_Multicheck_Control extends WP_Customize_Control {
9
 
10
  public $description = '';
11
-
12
  public $subtitle = '';
13
 
14
- public $separator = false;
15
-
16
- public $required;
17
-
18
  private static $firstLoad = true;
19
 
20
  // Since theme_mod cannot handle multichecks, we will do it with some JS
@@ -61,7 +56,7 @@ class Kirki_Customize_Multicheck_Control extends WP_Customize_Control {
61
  <span class="customize-control-title">
62
  <?php echo esc_html( $this->label ); ?>
63
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
64
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
65
  <?php } ?>
66
  </span>
67
  <?php if ( '' != $this->subtitle ) : ?>
@@ -80,37 +75,7 @@ class Kirki_Customize_Multicheck_Control extends WP_Customize_Control {
80
  ?>
81
  <input type="hidden" value="<?php echo esc_attr( $savedValueCSV ); ?>" <?php $this->link(); ?> />
82
  </label>
83
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
84
- <?php foreach ( $this->required as $id => $value ) :
85
-
86
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
87
- <script>
88
- jQuery(document).ready(function($) {
89
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
90
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
91
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
92
- });
93
- $( "#<?php echo $id . $value; ?>" ).click(function(){
94
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
95
- });
96
- });
97
- </script>
98
- <?php }
99
-
100
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
101
- <script>
102
- jQuery(document).ready(function($) {
103
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
104
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
105
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
106
- });
107
- $( "#<?php echo $id . $value; ?>" ).click(function(){
108
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
109
- });
110
- });
111
- </script>
112
- <?php }
113
 
114
- endforeach;
115
  }
116
  }
8
  class Kirki_Customize_Multicheck_Control extends WP_Customize_Control {
9
 
10
  public $description = '';
 
11
  public $subtitle = '';
12
 
 
 
 
 
13
  private static $firstLoad = true;
14
 
15
  // Since theme_mod cannot handle multichecks, we will do it with some JS
56
  <span class="customize-control-title">
57
  <?php echo esc_html( $this->label ); ?>
58
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
59
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
60
  <?php } ?>
61
  </span>
62
  <?php if ( '' != $this->subtitle ) : ?>
75
  ?>
76
  <input type="hidden" value="<?php echo esc_attr( $savedValueCSV ); ?>" <?php $this->link(); ?> />
77
  </label>
78
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
 
80
  }
81
  }
includes/controls/class-Kirki_Customize_Number_Control.php CHANGED
@@ -3,13 +3,9 @@
3
  class Kirki_Customize_Number_Control extends WP_Customize_Control {
4
 
5
  public $type = 'number';
6
-
7
  public $description = '';
8
-
9
  public $subtitle = '';
10
 
11
- public $separator = false;
12
-
13
  public function render_content() { ?>
14
 
15
  <label class="customizer-text">
@@ -17,7 +13,7 @@ class Kirki_Customize_Number_Control extends WP_Customize_Control {
17
  <?php echo esc_html( $this->label ); ?>
18
 
19
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
20
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
21
  <?php } ?>
22
  </span>
23
 
@@ -27,10 +23,9 @@ class Kirki_Customize_Number_Control extends WP_Customize_Control {
27
 
28
  <input type="number" <?php $this->link(); ?> value="<?php echo intval( $this->value() ); ?>"/>
29
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
30
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
31
  <?php } ?>
32
  </label>
33
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
34
  <?php
35
  }
36
  }
3
  class Kirki_Customize_Number_Control extends WP_Customize_Control {
4
 
5
  public $type = 'number';
 
6
  public $description = '';
 
7
  public $subtitle = '';
8
 
 
 
9
  public function render_content() { ?>
10
 
11
  <label class="customizer-text">
13
  <?php echo esc_html( $this->label ); ?>
14
 
15
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
16
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
17
  <?php } ?>
18
  </span>
19
 
23
 
24
  <input type="number" <?php $this->link(); ?> value="<?php echo intval( $this->value() ); ?>"/>
25
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
26
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
27
  <?php } ?>
28
  </label>
 
29
  <?php
30
  }
31
  }
includes/controls/class-Kirki_Customize_Radio_Control.php CHANGED
@@ -3,17 +3,10 @@
3
  class Kirki_Customize_Radio_Control extends WP_Customize_Control {
4
 
5
  public $type = 'radio';
6
-
7
  public $description = '';
8
-
9
  public $mode = 'radio';
10
-
11
  public $subtitle = '';
12
 
13
- public $separator = false;
14
-
15
- public $required;
16
-
17
  public function enqueue() {
18
 
19
  if ( 'buttonset' == $this->mode || 'image' == $this->mode ) {
@@ -34,7 +27,7 @@ class Kirki_Customize_Radio_Control extends WP_Customize_Control {
34
  <span class="customize-control-title">
35
  <?php echo esc_html( $this->label ); ?>
36
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
37
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
38
  <?php } ?>
39
  </span>
40
 
@@ -74,7 +67,7 @@ class Kirki_Customize_Radio_Control extends WP_Customize_Control {
74
  foreach ( $this->choices as $value => $label ) :
75
  ?>
76
  <label class="customizer-radio">
77
- <input type="radio" value="<?php echo esc_attr( $value ); ?>" name="<?php echo esc_attr( $name ); ?>" <?php $this->link(); checked( $this->value(), $value ); ?> />
78
  <?php echo esc_html( $label ); ?><br/>
79
  </label>
80
  <?php
@@ -83,45 +76,13 @@ class Kirki_Customize_Radio_Control extends WP_Customize_Control {
83
  }
84
  ?>
85
  </div>
86
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
87
  <?php if ( 'buttonset' == $this->mode || 'image' == $this->mode ) { ?>
88
  <script>
89
  jQuery(document).ready(function($) {
90
- $( "#input_<?php echo $this->id; ?>" ).buttonset();
91
  });
92
  </script>
93
- <?php } ?>
94
-
95
- <?php foreach ( $this->required as $id => $value ) :
96
-
97
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
98
- <script>
99
- jQuery(document).ready(function($) {
100
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
101
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
102
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
103
- });
104
- $( "#<?php echo $id . $value; ?>" ).click(function(){
105
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
106
- });
107
- });
108
- </script>
109
- <?php }
110
-
111
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
112
- <script>
113
- jQuery(document).ready(function($) {
114
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
115
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
116
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
117
- });
118
- $( "#<?php echo $id . $value; ?>" ).click(function(){
119
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
120
- });
121
- });
122
- </script>
123
- <?php }
124
-
125
- endforeach;
126
  }
127
  }
3
  class Kirki_Customize_Radio_Control extends WP_Customize_Control {
4
 
5
  public $type = 'radio';
 
6
  public $description = '';
 
7
  public $mode = 'radio';
 
8
  public $subtitle = '';
9
 
 
 
 
 
10
  public function enqueue() {
11
 
12
  if ( 'buttonset' == $this->mode || 'image' == $this->mode ) {
27
  <span class="customize-control-title">
28
  <?php echo esc_html( $this->label ); ?>
29
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
30
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
31
  <?php } ?>
32
  </span>
33
 
67
  foreach ( $this->choices as $value => $label ) :
68
  ?>
69
  <label class="customizer-radio">
70
+ <input class="kirki-radio" type="radio" value="<?php echo esc_attr( $value ); ?>" name="<?php echo esc_attr( $name ); ?>" <?php $this->link(); checked( $this->value(), $value ); ?> />
71
  <?php echo esc_html( $label ); ?><br/>
72
  </label>
73
  <?php
76
  }
77
  ?>
78
  </div>
 
79
  <?php if ( 'buttonset' == $this->mode || 'image' == $this->mode ) { ?>
80
  <script>
81
  jQuery(document).ready(function($) {
82
+ $( '[id="input_<?php echo $this->id; ?>"]' ).buttonset();
83
  });
84
  </script>
85
+ <?php }
86
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
88
  }
includes/controls/class-Kirki_Customize_Sliderui_Control.php CHANGED
@@ -3,18 +3,11 @@
3
  class Kirki_Customize_Sliderui_Control extends WP_Customize_Control {
4
 
5
  public $type = 'slider';
6
-
7
  public $description = '';
8
-
9
  public $subtitle = '';
10
 
11
- public $separator = false;
12
-
13
- public $required;
14
-
15
  public function enqueue() {
16
 
17
- wp_enqueue_script( 'jquery-ui-core' );
18
  wp_enqueue_script( 'jquery-ui-slider' );
19
 
20
  }
@@ -25,7 +18,7 @@ class Kirki_Customize_Sliderui_Control extends WP_Customize_Control {
25
  <span class="customize-control-title">
26
  <?php echo esc_html( $this->label ); ?>
27
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
28
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
29
  <?php } ?>
30
  </span>
31
 
@@ -33,56 +26,24 @@ class Kirki_Customize_Sliderui_Control extends WP_Customize_Control {
33
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
34
  <?php endif; ?>
35
 
36
- <input type="text" id="input_<?php echo $this->id; ?>" disabled value="<?php echo $this->value(); ?>" <?php $this->link(); ?>/>
37
 
38
  </label>
39
 
40
  <div id="slider_<?php echo $this->id; ?>" class="ss-slider"></div>
41
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
42
  <script>
43
  jQuery(document).ready(function($) {
44
- $( "#slider_<?php echo $this->id; ?>" ).slider({
45
  value : <?php echo $this->value(); ?>,
46
  min : <?php echo $this->choices['min']; ?>,
47
  max : <?php echo $this->choices['max']; ?>,
48
  step : <?php echo $this->choices['step']; ?>,
49
- slide : function( event, ui ) { $( "#input_<?php echo $this->id; ?>" ).val(ui.value).keyup(); }
50
  });
51
- $( "#input_<?php echo $this->id; ?>" ).val( $( "#slider_<?php echo $this->id; ?>" ).slider( "value" ) );
52
  });
53
  </script>
54
  <?php
55
 
56
- foreach ( $this->required as $id => $value ) :
57
-
58
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
59
- <script>
60
- jQuery(document).ready(function($) {
61
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
62
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
63
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
64
- });
65
- $( "#<?php echo $id . $value; ?>" ).click(function(){
66
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
67
- });
68
- });
69
- </script>
70
- <?php }
71
-
72
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
73
- <script>
74
- jQuery(document).ready(function($) {
75
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
76
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
77
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
78
- });
79
- $( "#<?php echo $id . $value; ?>" ).click(function(){
80
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
81
- });
82
- });
83
- </script>
84
- <?php }
85
-
86
- endforeach;
87
  }
88
  }
3
  class Kirki_Customize_Sliderui_Control extends WP_Customize_Control {
4
 
5
  public $type = 'slider';
 
6
  public $description = '';
 
7
  public $subtitle = '';
8
 
 
 
 
 
9
  public function enqueue() {
10
 
 
11
  wp_enqueue_script( 'jquery-ui-slider' );
12
 
13
  }
18
  <span class="customize-control-title">
19
  <?php echo esc_html( $this->label ); ?>
20
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
21
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
22
  <?php } ?>
23
  </span>
24
 
26
  <div class="customizer-subtitle"><?php echo $this->subtitle; ?></div>
27
  <?php endif; ?>
28
 
29
+ <input type="text" class="kirki-slider" id="input_<?php echo $this->id; ?>" disabled value="<?php echo $this->value(); ?>" <?php $this->link(); ?>/>
30
 
31
  </label>
32
 
33
  <div id="slider_<?php echo $this->id; ?>" class="ss-slider"></div>
 
34
  <script>
35
  jQuery(document).ready(function($) {
36
+ $( '[id="slider_<?php echo $this->id; ?>"]' ).slider({
37
  value : <?php echo $this->value(); ?>,
38
  min : <?php echo $this->choices['min']; ?>,
39
  max : <?php echo $this->choices['max']; ?>,
40
  step : <?php echo $this->choices['step']; ?>,
41
+ slide : function( event, ui ) { $( '[id="input_<?php echo $this->id; ?>"]' ).val(ui.value).keyup(); }
42
  });
43
+ $( '[id="input_<?php echo $this->id; ?>"]' ).val( $( '[id="slider_<?php echo $this->id; ?>"]' ).slider( "value" ) );
44
  });
45
  </script>
46
  <?php
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
  }
includes/controls/class-Kirki_Customize_Text_Control.php CHANGED
@@ -3,15 +3,9 @@
3
  class Kirki_Customize_Text_Control extends WP_Customize_Control {
4
 
5
  public $type = 'text';
6
-
7
  public $description = '';
8
-
9
  public $subtitle = '';
10
 
11
- public $separator = false;
12
-
13
- public $required;
14
-
15
  public function render_content() { ?>
16
 
17
  <label class="customizer-text">
@@ -19,7 +13,7 @@ class Kirki_Customize_Text_Control extends WP_Customize_Control {
19
  <?php echo esc_html( $this->label ); ?>
20
 
21
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
22
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
23
  <?php } ?>
24
  </span>
25
 
@@ -29,37 +23,7 @@ class Kirki_Customize_Text_Control extends WP_Customize_Control {
29
 
30
  <input type="text" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); ?> />
31
  </label>
32
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
33
- <?php foreach ( $this->required as $id => $value ) :
34
-
35
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
36
- <script>
37
- jQuery(document).ready(function($) {
38
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
39
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
40
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
41
- });
42
- $( "#<?php echo $id . $value; ?>" ).click(function(){
43
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
44
- });
45
- });
46
- </script>
47
- <?php }
48
-
49
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
50
- <script>
51
- jQuery(document).ready(function($) {
52
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
53
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
54
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
55
- });
56
- $( "#<?php echo $id . $value; ?>" ).click(function(){
57
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
58
- });
59
- });
60
- </script>
61
- <?php }
62
 
63
- endforeach;
64
  }
65
  }
3
  class Kirki_Customize_Text_Control extends WP_Customize_Control {
4
 
5
  public $type = 'text';
 
6
  public $description = '';
 
7
  public $subtitle = '';
8
 
 
 
 
 
9
  public function render_content() { ?>
10
 
11
  <label class="customizer-text">
13
  <?php echo esc_html( $this->label ); ?>
14
 
15
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
16
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
17
  <?php } ?>
18
  </span>
19
 
23
 
24
  <input type="text" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); ?> />
25
  </label>
26
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
 
28
  }
29
  }
includes/controls/class-Kirki_Customize_Textarea_Control.php CHANGED
@@ -3,21 +3,15 @@
3
  class Kirki_Customize_Textarea_Control extends WP_Customize_Control {
4
 
5
  public $type = 'textarea';
6
-
7
  public $description = '';
8
-
9
  public $subtitle = '';
10
 
11
- public $separator = false;
12
-
13
- public $required;
14
-
15
  public function render_content() { ?>
16
  <label class="customizer-textarea">
17
  <span class="customize-control-title">
18
  <?php echo esc_html( $this->label ); ?>
19
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
20
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
21
  <?php } ?>
22
  </span>
23
 
@@ -27,37 +21,7 @@ class Kirki_Customize_Textarea_Control extends WP_Customize_Control {
27
 
28
  <textarea class="of-input" rows="5" style="width:100%;" <?php $this->link(); ?>><?php echo esc_textarea( $this->value() ); ?></textarea>
29
  </label>
30
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
31
- <?php foreach ( $this->required as $id => $value ) :
32
-
33
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
34
- <script>
35
- jQuery(document).ready(function($) {
36
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
37
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
38
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
39
- });
40
- $( "#<?php echo $id . $value; ?>" ).click(function(){
41
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
42
- });
43
- });
44
- </script>
45
- <?php }
46
-
47
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
48
- <script>
49
- jQuery(document).ready(function($) {
50
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
51
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
52
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
53
- });
54
- $( "#<?php echo $id . $value; ?>" ).click(function(){
55
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
56
- });
57
- });
58
- </script>
59
- <?php }
60
 
61
- endforeach;
62
  }
63
  }
3
  class Kirki_Customize_Textarea_Control extends WP_Customize_Control {
4
 
5
  public $type = 'textarea';
 
6
  public $description = '';
 
7
  public $subtitle = '';
8
 
 
 
 
 
9
  public function render_content() { ?>
10
  <label class="customizer-textarea">
11
  <span class="customize-control-title">
12
  <?php echo esc_html( $this->label ); ?>
13
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
14
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
15
  <?php } ?>
16
  </span>
17
 
21
 
22
  <textarea class="of-input" rows="5" style="width:100%;" <?php $this->link(); ?>><?php echo esc_textarea( $this->value() ); ?></textarea>
23
  </label>
24
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
 
26
  }
27
  }
includes/controls/class-Kirki_Customize_Upload_Control.php CHANGED
@@ -12,15 +12,9 @@ class Kirki_Customize_Upload_Control extends WP_Customize_Control {
12
  public $removed = '';
13
  public $context;
14
  public $extensions = array();
15
-
16
  public $description = '';
17
-
18
  public $subtitle = '';
19
 
20
- public $separator = false;
21
-
22
- public $required;
23
-
24
  /**
25
  * Enqueue control related scripts/styles.
26
  *
@@ -59,7 +53,7 @@ class Kirki_Customize_Upload_Control extends WP_Customize_Control {
59
  <span class="customize-control-title">
60
  <?php echo esc_html( $this->label ); ?>
61
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
62
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
63
  <?php } ?>
64
  </span>
65
 
@@ -68,41 +62,11 @@ class Kirki_Customize_Upload_Control extends WP_Customize_Control {
68
  <?php endif; ?>
69
 
70
  <div>
71
- <a href="#" class="button-secondary upload"><?php _e( 'Upload' ); ?></a>
72
- <a href="#" class="remove"><?php _e( 'Remove' ); ?></a>
73
  </div>
74
  </label>
75
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
76
- <?php foreach ( $this->required as $id => $value ) :
77
-
78
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
79
- <script>
80
- jQuery(document).ready(function($) {
81
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
82
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
83
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
84
- });
85
- $( "#<?php echo $id . $value; ?>" ).click(function(){
86
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
87
- });
88
- });
89
- </script>
90
- <?php }
91
-
92
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
93
- <script>
94
- jQuery(document).ready(function($) {
95
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
96
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
97
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
98
- });
99
- $( "#<?php echo $id . $value; ?>" ).click(function(){
100
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
101
- });
102
- });
103
- </script>
104
- <?php }
105
 
106
- endforeach;
107
  }
108
  }
12
  public $removed = '';
13
  public $context;
14
  public $extensions = array();
 
15
  public $description = '';
 
16
  public $subtitle = '';
17
 
 
 
 
 
18
  /**
19
  * Enqueue control related scripts/styles.
20
  *
53
  <span class="customize-control-title">
54
  <?php echo esc_html( $this->label ); ?>
55
  <?php if ( isset( $this->description ) && '' != $this->description ) { ?>
56
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
57
  <?php } ?>
58
  </span>
59
 
62
  <?php endif; ?>
63
 
64
  <div>
65
+ <a href="#" class="button-secondary upload"><?php _e( 'Upload', 'kirki' ); ?></a>
66
+ <a href="#" class="remove"><?php _e( 'Remove', 'kirki' ); ?></a>
67
  </div>
68
  </label>
69
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
 
71
  }
72
  }
includes/controls/class-Kirki_Select_Control.php CHANGED
@@ -6,15 +6,9 @@ class Kirki_Select_Control extends WP_Customize_Control {
6
  * @var string
7
  */
8
  public $type = 'select';
9
-
10
  public $description = '';
11
-
12
  public $subtitle = '';
13
 
14
- public $separator = false;
15
-
16
- public $required;
17
-
18
  public function render_content() {
19
 
20
  if ( empty( $this->choices ) ) {
@@ -24,7 +18,7 @@ class Kirki_Select_Control extends WP_Customize_Control {
24
  <label>
25
  <span class="customize-control-title"><?php echo esc_html( $this->label ); ?>
26
  <?php if ( isset( $this->description ) && ! empty( $this->description ) ) { ?>
27
- <a href="#" class="button tooltip" title="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
28
  <?php } ?>
29
  </span>
30
 
@@ -39,37 +33,7 @@ class Kirki_Select_Control extends WP_Customize_Control {
39
  } ?>
40
  </select>
41
  </label>
42
- <?php if ( $this->separator ) echo '<hr class="customizer-separator">'; ?>
43
- <?php foreach ( $this->required as $id => $value ) :
44
-
45
- if ( isset($id) && isset($value) && get_theme_mod($id,0)==$value ) { ?>
46
- <script>
47
- jQuery(document).ready(function($) {
48
- $( "#customize-control-<?php echo $this->id; ?>" ).show();
49
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
50
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
51
- });
52
- $( "#<?php echo $id . $value; ?>" ).click(function(){
53
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
54
- });
55
- });
56
- </script>
57
- <?php }
58
-
59
- if ( isset($id) && isset($value) && get_theme_mod($id,0)!=$value ) { ?>
60
- <script>
61
- jQuery(document).ready(function($) {
62
- $( "#customize-control-<?php echo $this->id; ?>" ).hide();
63
- $( "#<?php echo $id . get_theme_mod($id,0); ?>" ).click(function(){
64
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeOut(300);
65
- });
66
- $( "#<?php echo $id . $value; ?>" ).click(function(){
67
- $( "#customize-control-<?php echo $this->id; ?>" ).fadeIn(300);
68
- });
69
- });
70
- </script>
71
- <?php }
72
 
73
- endforeach;
74
  }
75
  }
6
  * @var string
7
  */
8
  public $type = 'select';
 
9
  public $description = '';
 
10
  public $subtitle = '';
11
 
 
 
 
 
12
  public function render_content() {
13
 
14
  if ( empty( $this->choices ) ) {
18
  <label>
19
  <span class="customize-control-title"><?php echo esc_html( $this->label ); ?>
20
  <?php if ( isset( $this->description ) && ! empty( $this->description ) ) { ?>
21
+ <a href="#" class="button tooltip hint--left" data-hint="<?php echo strip_tags( esc_html( $this->description ) ); ?>">?</a>
22
  <?php } ?>
23
  </span>
24
 
33
  } ?>
34
  </select>
35
  </label>
36
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
 
38
  }
39
  }
includes/controls/controls-init.php DELETED
@@ -1,385 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Build the controls
5
- */
6
- function kirki_customizer_controls( $wp_customize ) {
7
-
8
- $controls = apply_filters( 'kirki/controls', array() );
9
-
10
- if ( isset( $controls ) ) {
11
- foreach ( $controls as $control ) {
12
-
13
- if ( 'background' == $control['type'] ) {
14
-
15
- $wp_customize->add_setting( $control['setting'] . '_color', array(
16
- 'default' => $control['default']['color'],
17
- 'type' => 'theme_mod',
18
- 'capability' => 'edit_theme_options'
19
- ) );
20
-
21
- $wp_customize->add_setting( $control['setting'] . '_image', array(
22
- 'default' => $control['default']['image'],
23
- 'type' => 'theme_mod',
24
- 'capability' => 'edit_theme_options'
25
- ) );
26
-
27
- $wp_customize->add_setting( $control['setting'] . '_repeat', array(
28
- 'default' => $control['default']['repeat'],
29
- 'type' => 'theme_mod',
30
- 'capability' => 'edit_theme_options'
31
- ) );
32
-
33
- $wp_customize->add_setting( $control['setting'] . '_size', array(
34
- 'default' => $control['default']['size'],
35
- 'type' => 'theme_mod',
36
- 'capability' => 'edit_theme_options'
37
- ) );
38
-
39
- $wp_customize->add_setting( $control['setting'] . '_attach', array(
40
- 'default' => $control['default']['attach'],
41
- 'type' => 'theme_mod',
42
- 'capability' => 'edit_theme_options'
43
- ) );
44
-
45
- $wp_customize->add_setting( $control['setting'] . '_position', array(
46
- 'default' => $control['default']['position'],
47
- 'type' => 'theme_mod',
48
- 'capability' => 'edit_theme_options'
49
- ) );
50
-
51
- if ( false != $control['default']['opacity'] ) {
52
-
53
- $wp_customize->add_setting( $control['setting'] . '_opacity', array(
54
- 'default' => $control['default']['opacity'],
55
- 'type' => 'theme_mod',
56
- 'capability' => 'edit_theme_options'
57
- ) );
58
-
59
- }
60
- } else {
61
-
62
- // Add settings
63
- $wp_customize->add_setting( $control['setting'], array(
64
- 'default' => $control['default'],
65
- 'type' => 'theme_mod',
66
- 'capability' => 'edit_theme_options'
67
- ) );
68
-
69
- }
70
-
71
- // Checkbox controls
72
- if ( 'checkbox' == $control['type'] ) {
73
-
74
- $wp_customize->add_control( new Kirki_Customize_Checkbox_Control( $wp_customize, $control['setting'], array(
75
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
76
- 'section' => $control['section'],
77
- 'settings' => $control['setting'],
78
- 'priority' => $control['priority'],
79
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
80
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
81
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
82
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
83
- // 'transport' => 'postMessage',
84
- ) )
85
- );
86
-
87
- // Background Controls
88
- } elseif ( 'background' == $control['type'] ) {
89
-
90
- $wp_customize->add_control( new Kirki_Customize_Color_Control( $wp_customize, $control['setting'] . '_color', array(
91
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
92
- 'section' => $control['section'],
93
- 'settings' => $control['setting'] . '_color',
94
- 'priority' => $control['priority'],
95
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
96
- 'subtitle' => __( 'Background Color', 'kirki' ),
97
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
98
- // 'transport' => 'postMessage',
99
- ) )
100
- );
101
-
102
- $wp_customize->add_control( new Kirki_Customize_Image_Control( $wp_customize, $control['setting'] . '_image', array(
103
- 'label' => null,
104
- 'section' => $control['section'],
105
- 'settings' => $control['setting'] . '_image',
106
- 'priority' => $control['priority'] + 1,
107
- 'description' => null,
108
- 'subtitle' => __( 'Background Image', 'kirki' ),
109
- 'separator' => false,
110
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
111
- // 'transport' => 'postMessage',
112
- ) )
113
- );
114
-
115
- $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'] . '_repeat', array(
116
- 'label' => null,
117
- 'section' => $control['section'],
118
- 'settings' => $control['setting'] . '_repeat',
119
- 'priority' => $control['priority'] + 2,
120
- 'choices' => array(
121
- 'no-repeat' => __( 'No Repeat', 'kirki' ),
122
- 'repeat' => __( 'Repeat All', 'kirki' ),
123
- 'repeat-x' => __( 'Repeat Horizontally', 'kirki' ),
124
- 'repeat-y' => __( 'Repeat Vertically', 'kirki' ),
125
- 'inherit' => __( 'Inherit', 'kirki' )
126
- ),
127
- 'description' => null,
128
- 'subtitle' => __( 'Background Repeat', 'kirki' ),
129
- 'separator' => false,
130
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
131
- // 'transport' => 'postMessage',
132
- ) )
133
- );
134
-
135
- $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'] . '_size', array(
136
- 'label' => null,
137
- 'section' => $control['section'],
138
- 'settings' => $control['setting'] . '_size',
139
- 'priority' => $control['priority'] + 3,
140
- 'choices' => array(
141
- 'inherit' => __( 'Inherit', 'kirki' ),
142
- 'cover' => __( 'Cover', 'kirki' ),
143
- 'contain' => __( 'Contain', 'kirki' ),
144
- ),
145
- 'description' => null,
146
- 'mode' => 'buttonset',
147
- 'subtitle' => __( 'Background Size', 'kirki' ),
148
- 'separator' => false,
149
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
150
- // 'transport' => 'postMessage',
151
- ) )
152
- );
153
-
154
- $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'] . '_attach', array(
155
- 'label' => null,
156
- 'section' => $control['section'],
157
- 'settings' => $control['setting'] . '_attach',
158
- 'priority' => $control['priority'] + 4,
159
- 'choices' => array(
160
- 'inherit' => __( 'Inherit', 'kirki' ),
161
- 'fixed' => __( 'Fixed', 'kirki' ),
162
- 'scroll' => __( 'Scroll', 'kirki' ),
163
- ),
164
- 'description' => null,
165
- 'mode' => 'buttonset',
166
- 'subtitle' => __( 'Background Attachment', 'kirki' ),
167
- 'separator' => false,
168
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
169
- // 'transport' => 'postMessage',
170
- ) )
171
- );
172
-
173
- $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'] . '_position', array(
174
- 'label' => null,
175
- 'section' => $control['section'],
176
- 'settings' => $control['setting'] . '_position',
177
- 'priority' => $control['priority'] + 5,
178
- 'choices' => array(
179
- 'left-top' => __( 'Left Top', 'kirki' ),
180
- 'left-center' => __( 'Left Center', 'kirki' ),
181
- 'left-bottom' => __( 'Left Bottom', 'kirki' ),
182
- 'right-top' => __( 'Right Top', 'kirki' ),
183
- 'right-center' => __( 'Right Center', 'kirki' ),
184
- 'right-bottom' => __( 'Right Bottom', 'kirki' ),
185
- 'center-top' => __( 'Center Top', 'kirki' ),
186
- 'center-center' => __( 'Center Center', 'kirki' ),
187
- 'center-bottom' => __( 'Center Bottom', 'kirki' ),
188
- ),
189
- 'description' => null,
190
- 'subtitle' => __( 'Background Position', 'kirki' ),
191
- 'separator' => ( false != $control['default']['opacity'] ) ? false : true,
192
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
193
- // 'transport' => 'postMessage',
194
- ) )
195
- );
196
-
197
- if ( false != $control['default']['opacity'] ) {
198
- $wp_customize->add_control( new Kirki_Customize_Sliderui_Control( $wp_customize, $control['setting'] . '_opacity', array(
199
- 'label' => null,
200
- 'section' => $control['section'],
201
- 'settings' => $control['setting'] . '_opacity',
202
- 'priority' => $control['priority'] + 6,
203
- 'choices' => array(
204
- 'min' => 0,
205
- 'max' => 100,
206
- 'step' => 1,
207
- ),
208
- 'description' => null,
209
- 'subtitle' => __( 'Background Opacity', 'kirki' ),
210
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
211
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
212
- // 'transport' => 'postMessage',
213
- ) )
214
- );
215
- }
216
-
217
- // Color Controls
218
- } elseif ( 'color' == $control['type'] ) {
219
-
220
- $wp_customize->add_control( new Kirki_Customize_Color_Control( $wp_customize, $control['setting'], array(
221
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
222
- 'section' => $control['section'],
223
- 'settings' => $control['setting'],
224
- 'priority' => isset( $control['priority'] ) ? $control['priority'] : '',
225
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
226
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
227
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
228
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
229
- // 'transport' => 'postMessage',
230
- ) )
231
- );
232
-
233
- // Image Controls
234
- } elseif ( 'image' == $control['type'] ) {
235
-
236
- $wp_customize->add_control( new Kirki_Customize_Image_Control( $wp_customize, $control['setting'], array(
237
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
238
- 'section' => $control['section'],
239
- 'settings' => $control['setting'],
240
- 'priority' => $control['priority'],
241
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
242
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
243
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
244
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
245
- // 'transport' => 'postMessage',
246
- ) )
247
- );
248
-
249
- // Radio Controls
250
- } elseif ( 'radio' == $control['type'] ) {
251
-
252
- $wp_customize->add_control( new Kirki_Customize_Radio_Control( $wp_customize, $control['setting'], array(
253
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
254
- 'section' => $control['section'],
255
- 'settings' => $control['setting'],
256
- 'priority' => $control['priority'],
257
- 'choices' => $control['choices'],
258
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
259
- 'mode' => isset( $control['mode'] ) ? $control['mode'] : 'radio', // Can be 'radio', 'image' or 'buttonset'.
260
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
261
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
262
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
263
- // 'transport' => 'postMessage',
264
- ) )
265
- );
266
-
267
- // Select Controls
268
- } elseif ( 'select' == $control['type'] ) {
269
-
270
- $wp_customize->add_control( new Kirki_Select_Control( $wp_customize, $control['setting'], array(
271
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
272
- 'section' => $control['section'],
273
- 'settings' => $control['setting'],
274
- 'priority' => $control['priority'],
275
- 'choices' => $control['choices'],
276
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
277
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
278
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
279
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
280
- // 'transport' => 'postMessage',
281
- ) )
282
- );
283
-
284
- // Slider Controls
285
- } elseif ( 'slider' == $control['type'] ) {
286
-
287
- $wp_customize->add_control( new Kirki_Customize_Sliderui_Control( $wp_customize, $control['setting'], array(
288
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
289
- 'section' => $control['section'],
290
- 'settings' => $control['setting'],
291
- 'priority' => $control['priority'],
292
- 'choices' => $control['choices'],
293
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
294
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
295
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
296
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
297
- // 'transport' => 'postMessage',
298
- ) )
299
- );
300
-
301
- // Text Controls
302
- } elseif ( 'text' == $control['type'] ) {
303
-
304
- $wp_customize->add_control( new Kirki_Customize_Text_Control( $wp_customize, $control['setting'], array(
305
- 'label' => isset( $control['label'] ) ? $control['label'] : '',
306
- 'section' => $control['section'],
307
- 'settings' => $control['setting'],
308
- 'priority' => $control['priority'],
309
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
310
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
311
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
312
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
313
- // 'transport' => 'postMessage',
314
- ) )
315
- );
316
-
317
- // Text Controls
318
- } elseif ( 'textarea' == $control['type'] ) {
319
-
320
- $wp_customize->add_control( new Kirki_Customize_Textarea_Control( $wp_customize, $control['setting'], array(
321
- 'label' => $control['label'],
322
- 'section' => $control['section'],
323
- 'settings' => $control['setting'],
324
- 'priority' => $control['priority'],
325
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
326
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
327
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
328
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
329
- // 'transport' => 'postMessage',
330
- ) )
331
- );
332
-
333
- // Upload Controls
334
- } elseif ( 'upload' == $control['type'] ) {
335
-
336
- $wp_customize->add_control( new Kirki_Customize_Upload_Control( $wp_customize, $control['setting'], array(
337
- 'label' => $control['label'],
338
- 'section' => $control['section'],
339
- 'settings' => $control['setting'],
340
- 'priority' => $control['priority'],
341
- 'choices' => $control['choices'],
342
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
343
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
344
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
345
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
346
- // 'transport' => 'postMessage',
347
- ) )
348
- );
349
-
350
- // Number Controls
351
- } elseif ( 'number' == $control['type'] ) {
352
-
353
- $wp_customize->add_control( new Kirki_Customize_Number_Control( $wp_customize, $control['setting'], array(
354
- 'label' => $control['label'],
355
- 'section' => $control['section'],
356
- 'settings' => $control['setting'],
357
- 'priority' => $control['priority'],
358
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
359
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
360
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
361
- // 'transport' => 'postMessage',
362
- ) )
363
- );
364
-
365
- // Multicheck Controls
366
- } elseif ( 'multicheck' == $control['type'] ) {
367
-
368
- $wp_customize->add_control( new Kirki_Customize_Multicheck_Control( $wp_customize, $control['setting'], array(
369
- 'label' => $control['label'],
370
- 'section' => $control['section'],
371
- 'settings' => $control['setting'],
372
- 'priority' => $control['priority'],
373
- 'choices' => $control['choices'],
374
- 'description' => isset( $control['description'] ) ? $control['description'] : null,
375
- 'subtitle' => isset( $control['subtitle'] ) ? $control['subtitle'] : '',
376
- 'separator' => isset( $control['separator'] ) ? $control['separator'] : false,
377
- 'required' => isset( $control['required'] ) ? $control['required'] : array(),
378
- // 'transport' => 'postMessage',
379
- ) )
380
- );
381
- }
382
- }
383
- }
384
- }
385
- add_action( 'customize_register', 'kirki_customizer_controls', 99 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/deprecated.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This file contains all the deprecated functions
5
+ */
6
+
7
+ function kirki_sanitize_hex( $color ) {
8
+ Kirki_Color::sanitize_hex( $color );
9
+ }
10
+
11
+ function kirki_get_rgb( $hex, $implode = false ) {
12
+ Kirki_Color::get_rgb( $hex, $implode );
13
+ }
14
+
15
+ function kirki_get_rgba( $hex = '#fff', $opacity = 100 ) {
16
+ Kirki_Color::get_rgba( $hex, $opacity );
17
+ }
18
+
19
+ function kirki_get_brightness( $hex ) {
20
+ Kirki_Color::get_brightness( $hex );
21
+ }
includes/functions/background-css.php DELETED
@@ -1,62 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Apply custom backgrounds to our page.
5
- */
6
- function kirki_background_css() {
7
-
8
- $controls = apply_filters( 'kirki/controls', array() );
9
- $config = apply_filters( 'kirki/config', array() );
10
-
11
- if ( isset( $controls ) ) {
12
- foreach ( $controls as $control ) {
13
-
14
- if ( 'background' == $control['type'] ) {
15
-
16
- // Apply custom CSS if we've set the 'output'.
17
- if ( ! is_null( $control['output'] ) ) {
18
-
19
- $bg_color = kirki_sanitize_hex( get_theme_mod( $control['setting'] . '_color', $control['default']['color'] ) );
20
- $bg_image = get_theme_mod( $control['setting'] . '_image', $control['default']['image'] );
21
- $bg_repeat = get_theme_mod( $control['setting'] . '_repeat', $control['default']['repeat'] );
22
- $bg_size = get_theme_mod( $control['setting'] . '_size', $control['default']['size'] );
23
- $bg_attach = get_theme_mod( $control['setting'] . '_attach', $control['default']['attach'] );
24
- $bg_position = get_theme_mod( $control['setting'] . '_position', $control['default']['position'] );
25
- $bg_opacity = get_theme_mod( $control['setting'] . '_opacity', $control['default']['opacity'] );
26
-
27
- if ( false != $control['default']['opacity'] ) {
28
-
29
- $bg_position = get_theme_mod( $control['setting'] . '_opacity', $control['default']['opacity'] );
30
-
31
- // If we're using an opacity other than 100, then convert the color to RGBA.
32
- if ( 100 != $bg_opacity ) {
33
- $bg_color = kirki_get_rgba( $bg_color, $bg_opacity );
34
- }
35
-
36
- }
37
-
38
- // HTML Background
39
- $styles = $control['output'] . '{';
40
-
41
- $styles .= 'background-color:' . $bg_color . ';';
42
-
43
- if ( '' != $bg_image ) {
44
- $styles .= 'background-image: url("' . $bg_image . '");';
45
- $styles .= 'background-repeat: ' . $bg_repeat . ';';
46
- $styles .= 'background-size: ' . $bg_size . ';';
47
- $styles .= 'background-attachment: ' . $bg_attach . ';';
48
- $styles .= 'background-position: ' . str_replace( '-', ' ', $bg_position ) . ';';
49
- }
50
-
51
- $styles .= '}';
52
- }
53
-
54
- wp_add_inline_style( $config['stylesheet_id'], $styles );
55
-
56
- }
57
-
58
- }
59
- }
60
-
61
- }
62
- add_action( 'wp_enqueue_scripts', 'kirki_background_css', 150 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/functions/color-functions.php DELETED
@@ -1,126 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Sanitize hex colors
5
- */
6
- function kirki_sanitize_hex( $color ) {
7
- // Remove any spaces and special characters before and after the string
8
- $color = trim( $color. ' \t\n\r\0\x0B' );
9
-
10
- // Remove any trailing '#' symbols from the color value
11
- $color = str_replace( '#', '', $color );
12
-
13
- // If there are more than 6 characters, only keep the first 6.
14
- if ( strlen( $color ) > 6 ) {
15
-
16
- $color = substr( $color, 0, 6 );
17
-
18
- }
19
-
20
- if ( strlen( $color ) == 6 ) {
21
-
22
- $hex = $color; // If string consists of 6 characters, then this is our color
23
-
24
- } else {
25
-
26
- // String is shorter than 6 characters.
27
- // We will have to do some calculations below to get the actual 6-digit hex value.
28
-
29
- // If the string is longer than 3 characters, only keep the first 3.
30
- if ( strlen( $color ) > 3 ) {
31
- $color = substr( $color, 0, 3 );
32
- }
33
-
34
- // If this is a 3-character string, format it to 6 characters.
35
- if ( strlen( $color ) == 3 ) {
36
-
37
- $red = substr( $color, 0, 1 ) . substr( $color, 0, 1 );
38
- $green = substr( $color, 1, 1 ) . substr( $color, 1, 1 );
39
- $blue = substr( $color, 2, 1 ) . substr( $color, 2, 1 );
40
-
41
- $hex = $red . $green . $blue;
42
-
43
- }
44
-
45
- // If this is shorter than 3 characters, do some voodoo.
46
- if ( strlen( $color ) == 2 ) {
47
-
48
- $hex = $color . $color . $color;
49
-
50
- } else if ( strlen( $color ) == 1 ) {
51
-
52
- $hex = $color . $color . $color . $color . $color . $color;
53
-
54
- }
55
-
56
- }
57
-
58
- return '#' . $hex;
59
- }
60
-
61
- /*
62
- * Gets the rgb value of the $hex color.
63
- * Returns an array.
64
- */
65
- function kirki_get_rgb( $hex, $implode = false ) {
66
- // Remove any trailing '#' symbols from the color value
67
- $hex = str_replace( '#', '', kirki_sanitize_hex( $hex ) );
68
-
69
- if ( strlen( $hex ) == 3 ) {
70
- // If the color is entered using a short, 3-character format,
71
- // then find the rgb values from them
72
- $red = hexdec( substr( $hex, 0, 1 ) . substr( $hex, 0, 1 ) );
73
- $green = hexdec( substr( $hex, 1, 1 ) . substr( $hex, 1, 1 ) );
74
- $blue = hexdec( substr( $hex, 2, 1 ) . substr( $hex, 2, 1 ) );
75
- } else {
76
- // If the color is entered using a 6-character format,
77
- // then find the rgb values from them
78
- $red = hexdec( substr( $hex, 0, 2 ) );
79
- $green = hexdec( substr( $hex, 2, 2 ) );
80
- $blue = hexdec( substr( $hex, 4, 2 ) );
81
- }
82
-
83
- // rgb is an array
84
- $rgb = array( $red, $green, $blue );
85
- if ( $implode ) {
86
- return implode( ',', $rgb );
87
- } else {
88
- return $rgb;
89
- }
90
- }
91
-
92
- /*
93
- * Gets the rgba value of a color.
94
- */
95
- function kirki_get_rgba( $hex = '#fff', $opacity = 100 ) {
96
- $hex = kirki_sanitize_hex( $hex );
97
- // Make sure that opacity is properly formatted :
98
- // Set the opacity to 100 if a larger value has been entered by mistake.
99
- // If a negative value is used, then set to 0.
100
- // If an opacity value is entered in a decimal form (for example 0.25), then multiply by 100.
101
- if ( $opacity >= 100 ) {
102
-
103
- $opacity = 100;
104
-
105
- } elseif ( $opacity < 0 ) {
106
-
107
- $opacity = 0;
108
-
109
- } elseif ( $opacity < 1 && $opacity != 0 ) {
110
-
111
- $opacity = ( $opacity * 100 );
112
-
113
- } else {
114
-
115
- $opacity = $opacity;
116
-
117
- }
118
-
119
- // Divide the opacity by 100 to end-up with a CSS value for the opacity
120
- $opacity = ( $opacity / 100 );
121
-
122
- $color = 'rgba(' . kirki_get_rgb( $hex, true ) . ', ' . $opacity . ')';
123
-
124
- return $color;
125
-
126
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/required.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Add the required script.
5
+ */
6
+ function kirki_required_script() {
7
+
8
+ $controls = apply_filters( 'kirki/controls', array() );
9
+
10
+ if ( isset( $controls ) ) {
11
+
12
+ foreach ( $controls as $control ) {
13
+
14
+ if ( isset( $control['required'] ) && ! is_null( $control['required'] && is_array( $control['required'] ) ) ) {
15
+
16
+ foreach ( $control['required'] as $id => $value ) : ?>
17
+
18
+ <script>
19
+ jQuery(document).ready(function($) {
20
+ <?php if ( isset( $id ) && isset( $value ) ) : ?>
21
+ <?php if ( $value == get_theme_mod( $id ) ) : ?>
22
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeIn(300);
23
+ <?php else : ?>
24
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeOut(300);
25
+ <?php endif; ?>
26
+ <?php endif; ?>
27
+
28
+ $( "#input_<?php echo $id; ?> input" ).each(function(){
29
+ $(this).click(function(){
30
+ if ( $(this).val() == "<?php echo $value; ?>" ) {
31
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeIn(300);
32
+ } else {
33
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeOut(300);
34
+ }
35
+ });
36
+ if ( $(this).val() == "<?php echo $value; ?>" ) {
37
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeIn(300);
38
+ } else {
39
+ $( '[id="customize-control-<?php echo $control['setting']; ?>"]' ).fadeOut(300);
40
+ }
41
+ });
42
+ });
43
+ </script>
44
+ <?php
45
+
46
+ endforeach;
47
+
48
+ }
49
+
50
+ }
51
+
52
+ }
53
+
54
+ }
55
+ add_action( 'customize_controls_print_footer_scripts', 'kirki_required_script' );
kirki.php CHANGED
@@ -1,39 +1,59 @@
1
  <?php
2
  /*
3
- Plugin Name: Kirki Framework
4
- Plugin URI: http://kirki.org
5
- Description: An options framework using and extending the WordPress Customizer
6
- Author: Aristeides Stathopoulos
7
- Author URI: http://wpmu.io/
8
- Version: 0.3
9
  */
10
 
 
 
 
11
  /**
12
- * The main Kirki class
13
- */
 
14
  class Kirki {
15
 
16
  function __construct() {
17
 
18
- // Include necessary files
19
- include_once( dirname( __FILE__ ) . '/includes/functions/color-functions.php' );
20
- include_once( dirname( __FILE__ ) . '/includes/functions/background-css.php' );
21
-
22
- // Include the controls initialization script
23
- include_once( dirname( __FILE__ ) . '/includes/controls/controls-init.php' );
24
-
25
- add_action( 'customize_register', array( $this, 'include_files' ), 1 );
26
- add_action( 'customize_controls_print_styles', array( $this, 'styles' ) );
27
- add_action( 'customize_controls_print_styles', array( $this, 'googlefonts' ) );
28
- add_action( 'customize_controls_print_styles', array( $this, 'custom_css' ), 999 );
29
- add_action( 'customize_controls_print_scripts', array( $this, 'custom_js' ), 999 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  }
32
 
33
  /**
34
  * Include the necessary files
35
  */
36
- function include_files() {
37
 
38
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Checkbox_Control.php' );
39
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Color_Control.php' );
@@ -46,134 +66,58 @@ class Kirki {
46
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Textarea_Control.php' );
47
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Upload_Control.php' );
48
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Select_Control.php' );
 
49
 
50
  }
51
 
52
  /**
53
- * Enqueue the stylesheets and scripts required.
54
  */
55
- function styles() {
56
-
57
- $options = apply_filters( 'kirki/config', array() );
58
 
59
- $kirki_url = isset( $options['url_path'] ) ? $options['url_path'] : plugin_dir_url( __FILE__ );
 
 
60
 
61
- wp_register_style( 'kirki-customizer-css', $kirki_url . 'assets/css/customizer.css', NULL, NULL, 'all' );
62
- wp_register_style( 'kirki-customizer-ui', $kirki_url . 'assets/css/jquery-ui-1.10.0.custom.css', NULL, NULL, 'all' );
63
- wp_enqueue_style( 'kirki-customizer-css' );
64
- wp_enqueue_style( 'kirki-customizer-ui' );
 
 
 
 
65
 
66
- wp_enqueue_script( 'kirki_customizer_js', $kirki_url . 'assets/js/customizer.js');
67
- wp_enqueue_script( 'tipsy', $kirki_url . 'assets/js/tooltipsy.min.js', array( 'jquery' ) );
68
-
69
- }
70
-
71
- /**
72
- * Use the Roboto font on the customizer.
73
- */
74
- function googlefonts() { ?>
75
- <link href='http://fonts.googleapis.com/css?family=Roboto:100,400|Roboto+Slab:700,400&subset=latin,cyrillic-ext,greek,vietnamese,latin-ext,cyrillic' rel='stylesheet' type='text/css'>
76
- <?php
77
  }
78
 
79
- /**
80
- * Add custom CSS rules to the head, applying our custom styles
81
- */
82
- function custom_css() {
83
-
84
- $options = apply_filters( 'kirki/config', array() );
85
-
86
- $color_active = isset( $options['color_active'] ) ? $options['color_active'] : '#1abc9c';
87
- $color_accent = isset( $options['color_accent'] ) ? $options['color_accent'] : '#FF5740';
88
- $color_light = isset( $options['color_light'] ) ? $options['color_light'] : '#8cddcd';
89
- $color_select = isset( $options['color_select'] ) ? $options['color_select'] : '#34495e';
90
- $color_back = isset( $options['color_back'] ) ? $options['color_back'] : '#222';
91
- ?>
92
-
93
- <style>
94
- .wp-core-ui .button.tooltip {
95
- background: <?php echo $color_active; ?>;
96
- }
97
-
98
- .image.ui-buttonset label.ui-button.ui-state-active {
99
- background: <?php echo $color_accent; ?>;
100
- }
101
-
102
- .wp-full-overlay-sidebar {
103
- background: <?php echo $color_back; ?>;
104
- }
105
-
106
- #customize-info .accordion-section-title, #customize-info .accordion-section-title:hover {
107
- background: <?php echo $color_back; ?>;
108
- }
109
-
110
- #customize-theme-controls .accordion-section-title {
111
- background: <?php echo $color_back; ?>;
112
- }
113
 
114
- #customize-theme-controls .accordion-section-title {
115
- border-bottom: 1px solid <?php echo $color_back; ?>;
116
- }
117
 
118
- #customize-theme-controls .control-section .accordion-section-title {
119
- background: <?php echo $color_back; ?>;
 
 
120
  }
 
121
 
122
- #customize-theme-controls .control-section .accordion-section-title:focus,
123
- #customize-theme-controls .control-section .accordion-section-title:hover,
124
- #customize-theme-controls .control-section.open .accordion-section-title,
125
- #customize-theme-controls .control-section:hover .accordion-section-title {
126
- background: <?php echo $color_active; ?>;
127
- }
128
-
129
- .wp-core-ui .button-primary {
130
- background: <?php echo $color_active; ?>;
131
- }
132
-
133
- .wp-core-ui .button-primary.focus,
134
- .wp-core-ui .button-primary.hover,
135
- .wp-core-ui .button-primary:focus,
136
- .wp-core-ui .button-primary:hover {
137
- background: <?php echo $color_select; ?>;
138
- }
139
-
140
- .wp-core-ui .button-primary-disabled,
141
- .wp-core-ui .button-primary.disabled,
142
- .wp-core-ui .button-primary:disabled,
143
- .wp-core-ui .button-primary[disabled] {
144
- background: <?php echo $color_light; ?> !important;
145
- color: <?php echo $color_select; ?> !important;
146
- }
147
-
148
- <?php if ( isset( $options['logo_image'] ) ) : ?>
149
- div.kirki-customizer {
150
- background: url("<?php echo $options['logo_image']; ?>") no-repeat left center;
151
- }
152
- <?php endif; ?>
153
- </style>
154
- <?php
155
 
156
  }
157
 
158
- /**
159
- * If we've specified an image to be used as logo, replace the default theme description with a div that will have our logo as background.
160
- */
161
- function custom_js() {
162
-
163
- $options = apply_filters( 'kirki/config', array() ); ?>
164
 
165
- <?php if ( isset( $options['logo_image'] ) ) : ?>
166
- <script>
167
- jQuery(document).ready(function($) {
168
- "use strict";
169
-
170
- $( 'div#customize-info' ).replaceWith( '<div class="kirki-customizer"></div>' );
171
- });
172
- </script>
173
- <?php endif;
174
 
175
  }
176
 
177
  }
178
 
 
179
  $kirki = new Kirki();
 
 
1
  <?php
2
  /*
3
+ Plugin Name: Kirki Framework
4
+ Plugin URI: http://kirki.org
5
+ Description: An options framework using and extending the WordPress Customizer
6
+ Author: Aristeides Stathopoulos
7
+ Author URI: http://press.codes
8
+ Version: 0.5
9
  */
10
 
11
+ // Load Kirki_Fonts before everything else
12
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Fonts.php' );
13
+
14
  /**
15
+ * The main Kirki class
16
+ */
17
+ if ( ! class_exists( 'Kirki' ) ) :
18
  class Kirki {
19
 
20
  function __construct() {
21
 
22
+ if ( ! defined( 'KIRKI_PATH' ) ) {
23
+ define( 'KIRKI_PATH', dirname( __FILE__ ) );
24
+ }
25
+ if ( ! defined( 'KIRKI_URL' ) ) {
26
+ define( 'KIRKI_URL', plugin_dir_url( __FILE__ ) );
27
+ }
28
+
29
+ $options = $this->get_config();
30
+
31
+ include_once( dirname( __FILE__ ) . '/includes/required.php' );
32
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Scripts.php' );
33
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Style_Background.php' );
34
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Style_Color.php' );
35
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Style_Fonts.php' );
36
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Style_Generic.php' );
37
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Color.php' );
38
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Settings.php' );
39
+ include_once( dirname( __FILE__ ) . '/includes/class-Kirki_Controls.php' );
40
+ include_once( dirname( __FILE__ ) . '/includes/deprecated.php' );
41
+
42
+ $scripts = new Kirki_Scripts();
43
+ $styles_bg = new Kirki_Style_Background();
44
+ $styles_color = new Kirki_Style_Color();
45
+ $styles_fonts = new Kirki_Style_Fonts();
46
+ $styles_gen = new Kirki_Style_Generic();
47
+
48
+ add_action( 'customize_register', array( $this, 'include_customizer_controls' ), 1 );
49
+ add_action( 'customize_register', array( $this, 'customizer_builder' ), 99 );
50
 
51
  }
52
 
53
  /**
54
  * Include the necessary files
55
  */
56
+ function include_customizer_controls() {
57
 
58
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Checkbox_Control.php' );
59
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Color_Control.php' );
66
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Textarea_Control.php' );
67
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Upload_Control.php' );
68
  include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Select_Control.php' );
69
+ include_once( dirname( __FILE__ ) . '/includes/controls/class-Kirki_Customize_Group_Title_Control.php' );
70
 
71
  }
72
 
73
  /**
74
+ * Build the controls
75
  */
76
+ function customizer_builder( $wp_customize ) {
 
 
77
 
78
+ $controls = $this->get_controls();
79
+ $kirki_settings = new Kirki_Settings();
80
+ $kirki_controls = new Kirki_Controls();
81
 
82
+ // Early exit if controls are not set or if they're empty
83
+ if ( ! isset( $controls ) || empty( $controls ) ) {
84
+ return;
85
+ }
86
+ foreach ( $controls as $control ) {
87
+ $kirki_settings->add_setting( $wp_customize, $control );
88
+ $kirki_controls->add_control( $wp_customize, $control );
89
+ }
90
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
+ function get_config() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
+ $config = apply_filters( 'kirki/config', array() );
 
 
96
 
97
+ $controls = $this->get_controls();
98
+ foreach( $controls as $control ) {
99
+ if ( isset( $control['output'] ) ) {
100
+ $uses_output = true;
101
  }
102
+ }
103
 
104
+ if ( isset( $uses_output ) && ! isset( $config['stylesheet_id'] ) ) {
105
+ $config['stylesheet_id'] = 'kirki-styles';
106
+ }
107
+ return $config;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
  }
110
 
111
+ function get_controls() {
 
 
 
 
 
112
 
113
+ $controls = apply_filters( 'kirki/controls', array() );
114
+ return $controls;
 
 
 
 
 
 
 
115
 
116
  }
117
 
118
  }
119
 
120
+ global $kirki;
121
  $kirki = new Kirki();
122
+
123
+ endif;
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: aristath, fovoc
3
  Donate link: http://kirki.org
4
  Tags: customizer
5
- Requires at least: 3.8
6
- Tested up to: 3.9.1
7
- Stable tag: 0.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -12,21 +12,56 @@ Tired of all the bloated options frameworks? You can use the WordPress Customize
12
 
13
  == Description ==
14
 
15
- This plugin empowers theme developers making it easier to implement advanced features:
16
 
17
- * Use [additional controls](http://kirki.org/#fields) on the WordPress Customizer.
18
- * Easier definition of customizer controls.
19
- * Advanced settings on each controls (such as subtitles and help popovers).
20
 
21
- The plugin has extensive and thorough documentation available on [kirki.org](http://kirki.org).
22
- Please visit the [usage and implementation advice](http://kirki.org/#configuration).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  == Installation ==
25
 
26
  Just install this plugin and activate it.
27
  For configuration instructions please visit http://kirki.org/#configuration
28
 
29
- == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  = 0.3 =
32
  * new: added background field
2
  Contributors: aristath, fovoc
3
  Donate link: http://kirki.org
4
  Tags: customizer
5
+ Requires at least: 3.9
6
+ Tested up to: 4.1
7
+ Stable tag: 0.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
12
 
13
  == Description ==
14
 
15
+ Kirki allows developers to add advanced controls to their customizer as well as customize the way the customizer looks and feels.
16
 
17
+ The following controls are included:
 
 
18
 
19
+ * Buttonset
20
+ * Checkbox
21
+ * Color
22
+ * Image
23
+ * Background
24
+ * Image Radio
25
+ * Multicheck
26
+ * Radio
27
+ * Select
28
+ * Slider
29
+ * Text
30
+ * Textarea
31
+ * Upload
32
+
33
+ For documentation and examples on how to use these controls, please visit [kirki.org](http://kirki.org/#fields).
34
+
35
+ In addition you can also automatically generate the CSS for a lot of controls and have it added to the head of your document without writing any custom functions and code for that. [Learn more about automatic output of CSS here](http://kirki.org/#output)
36
 
37
  == Installation ==
38
 
39
  Just install this plugin and activate it.
40
  For configuration instructions please visit http://kirki.org/#configuration
41
 
42
+ == 0.5 ==
43
+ * New: Automatic output of styles for generic controls.
44
+ * New: Automatic output of styles + scripts for fonts (including googlefonts )
45
+ * New: The 'output' argument on background controls is now an array for consistency with other controls. Older syntax is still compatible though. :)
46
+ * New: Add the ability to auto-generate styles for colors.
47
+ * Fix: Add a blank stylesheet if we need one and no stylesheet_id has been defined in the config options.
48
+ * Fix: CSS-only tooltips. Fixes issue with tooltips now showing up on WP >= 4.1
49
+ * Fix: Code cleanups
50
+ * New: Added support for WordPress's transport arguments
51
+ * Fix: All controls now have a sanitization callback. Users can override the default sanitizations by adding their own 'sanitize_callback' argument.
52
+ * Fix: OOP rewrite
53
+ * Fix: Strip protocol from Google API link
54
+ * Fix: Loading order for some files
55
+ * Fix: Removed deprecated less_var argument
56
+
57
+ = 0.4 =
58
+ * Fix: bugfix for selector
59
+ * New: Change the Kirki theme based on which admin theme is selected.
60
+ * Fix: Tranlsation domain issue
61
+ * New: Added a "group_title" control
62
+ * Fix: Updated the required script
63
+ * Fix: Updating CSS
64
+ * Other minor improvements and bugfixes
65
 
66
  = 0.3 =
67
  * new: added background field