Coming Soon, Under Construction & Maintenance Page - Version 2.0.0

Version Description

  • WP compatibility check
  • Few bug fixes
Download this release

Release Info

Developer wpconcern
Plugin Icon 128x128 Coming Soon, Under Construction & Maintenance Page
Version 2.0.0
Comparing to
See all releases

Code changes from version 1.63 to 2.0.0

Files changed (191) hide show
  1. admin/assets/css/ot-admin.css +4088 -4088
  2. admin/assets/images/themes/pro/aeroplane-company.jpg +0 -0
  3. admin/assets/images/themes/pro/air-balloon.jpg +0 -0
  4. admin/assets/images/themes/pro/animated-clock.jpg +0 -0
  5. admin/assets/images/themes/pro/architecture-inc.jpg +0 -0
  6. admin/assets/images/themes/pro/architecture.jpg +0 -0
  7. admin/assets/images/themes/pro/art-gallery.jpg +0 -0
  8. admin/assets/images/themes/pro/auto-service.jpg +0 -0
  9. admin/assets/images/themes/pro/bakery.jpg +0 -0
  10. admin/assets/images/themes/pro/banking-app.jpg +0 -0
  11. admin/assets/images/themes/pro/barbershop.jpg +0 -0
  12. admin/assets/images/themes/pro/beach.jpg +0 -0
  13. admin/assets/images/themes/pro/bicycle-race.jpg +0 -0
  14. admin/assets/images/themes/pro/bike-shop.jpg +0 -0
  15. admin/assets/images/themes/pro/bitcoin-miners.jpg +0 -0
  16. admin/assets/images/themes/pro/black-friday.jpg +0 -0
  17. admin/assets/images/themes/pro/blogging.jpg +0 -0
  18. admin/assets/images/themes/pro/blue-ocean.jpg +0 -0
  19. admin/assets/images/themes/pro/body-transformation.jpg +0 -0
  20. admin/assets/images/themes/pro/bodybuilding.jpg +0 -0
  21. admin/assets/images/themes/pro/book-lovers.jpg +0 -0
  22. admin/assets/images/themes/pro/business-company.jpg +0 -0
  23. admin/assets/images/themes/pro/business-consulting-video.jpg +0 -0
  24. admin/assets/images/themes/pro/business-consulting.jpg +0 -0
  25. admin/assets/images/themes/pro/business-launch.jpg +0 -0
  26. admin/assets/images/themes/pro/business-meeting-video.jpg +0 -0
  27. admin/assets/images/themes/pro/business.jpg +0 -0
  28. admin/assets/images/themes/pro/cafe.jpg +0 -0
  29. admin/assets/images/themes/pro/chatbot.jpg +0 -0
  30. admin/assets/images/themes/pro/christmas-decor.jpg +0 -0
  31. admin/assets/images/themes/pro/christmas-sale.jpg +0 -0
  32. admin/assets/images/themes/pro/church.jpg +0 -0
  33. admin/assets/images/themes/pro/city-nighttime.jpg +0 -0
  34. admin/assets/images/themes/pro/cityscape.jpg +0 -0
  35. admin/assets/images/themes/pro/clothing-trends.jpg +0 -0
  36. admin/assets/images/themes/pro/clouds-screensaver-video.jpg +0 -0
  37. admin/assets/images/themes/pro/coffee-shop.jpg +0 -0
  38. admin/assets/images/themes/pro/cold-lake.jpg +0 -0
  39. admin/assets/images/themes/pro/computer-repair-service.jpg +0 -0
  40. admin/assets/images/themes/pro/concert.jpg +0 -0
  41. admin/assets/images/themes/pro/conference-event.jpg +0 -0
  42. admin/assets/images/themes/pro/construction-company.jpg +0 -0
  43. admin/assets/images/themes/pro/creative-design.jpg +0 -0
  44. admin/assets/images/themes/pro/custom-decor.jpg +0 -0
  45. admin/assets/images/themes/pro/cyber-security.jpg +0 -0
  46. admin/assets/images/themes/pro/default.jpg +0 -0
  47. admin/assets/images/themes/pro/dental-clinic.jpg +0 -0
  48. admin/assets/images/themes/pro/digital-agency.jpg +0 -0
  49. admin/assets/images/themes/pro/dog-shelter.jpg +0 -0
  50. admin/assets/images/themes/pro/dog-training-and-behavior-consulting.jpg +0 -0
  51. admin/assets/images/themes/pro/donation.jpg +0 -0
  52. admin/assets/images/themes/pro/ecommerce.jpg +0 -0
  53. admin/assets/images/themes/pro/email-platform.jpg +0 -0
  54. admin/assets/images/themes/pro/employment.jpg +0 -0
  55. admin/assets/images/themes/pro/essay-writing-service.jpg +0 -0
  56. admin/assets/images/themes/pro/fall-video.jpg +0 -0
  57. admin/assets/images/themes/pro/fashion.jpg +0 -0
  58. admin/assets/images/themes/pro/film-trailer.jpg +0 -0
  59. admin/assets/images/themes/pro/financial-counselling.jpg +0 -0
  60. admin/assets/images/themes/pro/financial-district.jpg +0 -0
  61. admin/assets/images/themes/pro/fitness-e-shop.jpg +0 -0
  62. admin/assets/images/themes/pro/florium.jpg +0 -0
  63. admin/assets/images/themes/pro/flower-shop.jpg +0 -0
  64. admin/assets/images/themes/pro/food-blog.jpg +0 -0
  65. admin/assets/images/themes/pro/food-store.jpg +0 -0
  66. admin/assets/images/themes/pro/foodie.jpg +0 -0
  67. admin/assets/images/themes/pro/football.jpg +0 -0
  68. admin/assets/images/themes/pro/frozen-nature.jpg +0 -0
  69. admin/assets/images/themes/pro/future-technology.jpg +0 -0
  70. admin/assets/images/themes/pro/graphic-design.jpg +0 -0
  71. admin/assets/images/themes/pro/greenlife.jpg +0 -0
  72. admin/assets/images/themes/pro/halloween.jpg +0 -0
  73. admin/assets/images/themes/pro/healthy-eating.jpg +0 -0
  74. admin/assets/images/themes/pro/hexagons-video.jpg +0 -0
  75. admin/assets/images/themes/pro/holiday-resort.jpg +0 -0
  76. admin/assets/images/themes/pro/home-design.jpg +0 -0
  77. admin/assets/images/themes/pro/homemade-chocolate-gifts.jpg +0 -0
  78. admin/assets/images/themes/pro/hosting.jpg +0 -0
  79. admin/assets/images/themes/pro/ice-cream-shop.jpg +0 -0
  80. admin/assets/images/themes/pro/in-design.jpg +0 -0
  81. admin/assets/images/themes/pro/inspy-romance.jpg +0 -0
  82. admin/assets/images/themes/pro/interior-design.jpg +0 -0
  83. admin/assets/images/themes/pro/internet-service-provider.jpg +0 -0
  84. admin/assets/images/themes/pro/it-conference.jpg +0 -0
  85. admin/assets/images/themes/pro/journey-video.jpg +0 -0
  86. admin/assets/images/themes/pro/keyword-research.jpg +0 -0
  87. admin/assets/images/themes/pro/kids-center.jpg +0 -0
  88. admin/assets/images/themes/pro/kids-innovation-program.jpg +0 -0
  89. admin/assets/images/themes/pro/ladies-accessories.jpg +0 -0
  90. admin/assets/images/themes/pro/lego-bricks.jpg +0 -0
  91. admin/assets/images/themes/pro/loneliness.jpg +0 -0
  92. admin/assets/images/themes/pro/lonely-road.jpg +0 -0
  93. admin/assets/images/themes/pro/luxury-car.jpg +0 -0
  94. admin/assets/images/themes/pro/maintenance-mode.jpg +0 -0
  95. admin/assets/images/themes/pro/makeup-artist-training.jpg +0 -0
  96. admin/assets/images/themes/pro/marketing-webinar.jpg +0 -0
  97. admin/assets/images/themes/pro/metrics-video.jpg +0 -0
  98. admin/assets/images/themes/pro/misty-forest-video.jpg +0 -0
  99. admin/assets/images/themes/pro/mobile-app.jpg +0 -0
  100. admin/assets/images/themes/pro/mobile-designer.jpg +0 -0
  101. admin/assets/images/themes/pro/mobile-meeting.jpg +0 -0
  102. admin/assets/images/themes/pro/modern-blog.jpg +0 -0
  103. admin/assets/images/themes/pro/modern-office.jpg +0 -0
  104. admin/assets/images/themes/pro/modern-recipes.jpg +0 -0
  105. admin/assets/images/themes/pro/mountain-slide.jpg +0 -0
  106. admin/assets/images/themes/pro/mountain.jpg +0 -0
  107. admin/assets/images/themes/pro/movie-trailer-video.jpg +0 -0
  108. admin/assets/images/themes/pro/moving-service.jpg +0 -0
  109. admin/assets/images/themes/pro/museum.jpg +0 -0
  110. admin/assets/images/themes/pro/music-lessons.jpg +0 -0
  111. admin/assets/images/themes/pro/music.jpg +0 -0
  112. admin/assets/images/themes/pro/nature.jpg +0 -0
  113. admin/assets/images/themes/pro/non-profit-organization.jpg +0 -0
  114. admin/assets/images/themes/pro/nutritionist.jpg +0 -0
  115. admin/assets/images/themes/pro/office-meeting-video.jpg +0 -0
  116. admin/assets/images/themes/pro/office-theme.jpg +0 -0
  117. admin/assets/images/themes/pro/online-food-delivery.jpg +0 -0
  118. admin/assets/images/themes/pro/online-learning.jpg +0 -0
  119. admin/assets/images/themes/pro/online-shopping.jpg +0 -0
  120. admin/assets/images/themes/pro/organic-cosmetics.jpg +0 -0
  121. admin/assets/images/themes/pro/pancake-house.jpg +0 -0
  122. admin/assets/images/themes/pro/parenting.jpg +0 -0
  123. admin/assets/images/themes/pro/parents-online.jpg +0 -0
  124. admin/assets/images/themes/pro/passage.jpg +0 -0
  125. admin/assets/images/themes/pro/peaceful-river.jpg +0 -0
  126. admin/assets/images/themes/pro/perfume-shop.jpg +0 -0
  127. admin/assets/images/themes/pro/personal-trainer.jpg +0 -0
  128. admin/assets/images/themes/pro/photo-studio.jpg +0 -0
  129. admin/assets/images/themes/pro/photography.jpg +0 -0
  130. admin/assets/images/themes/pro/plumbing.jpg +0 -0
  131. admin/assets/images/themes/pro/podcast.jpg +0 -0
  132. admin/assets/images/themes/pro/portfolio.jpg +0 -0
  133. admin/assets/images/themes/pro/real-estate.jpg +0 -0
  134. admin/assets/images/themes/pro/remote-work.jpg +0 -0
  135. admin/assets/images/themes/pro/restaurant.jpg +0 -0
  136. admin/assets/images/themes/pro/romantic-travels.jpg +0 -0
  137. admin/assets/images/themes/pro/running-blog.jpg +0 -0
  138. admin/assets/images/themes/pro/running-video.jpg +0 -0
  139. admin/assets/images/themes/pro/scholar-university.jpg +0 -0
  140. admin/assets/images/themes/pro/seo-digital-marketing.jpg +0 -0
  141. admin/assets/images/themes/pro/shoes-store.jpg +0 -0
  142. admin/assets/images/themes/pro/simple-beige-design.jpg +0 -0
  143. admin/assets/images/themes/pro/skin-care.jpg +0 -0
  144. admin/assets/images/themes/pro/skincare.jpg +0 -0
  145. admin/assets/images/themes/pro/snow-screensaver-video.jpg +0 -0
  146. admin/assets/images/themes/pro/snowboarding-blog.jpg +0 -0
  147. admin/assets/images/themes/pro/snowy-mountain.jpg +0 -0
  148. admin/assets/images/themes/pro/snowy-oasis.jpg +0 -0
  149. admin/assets/images/themes/pro/social-media-service.jpg +0 -0
  150. admin/assets/images/themes/pro/social-media.jpg +0 -0
  151. admin/assets/images/themes/pro/spa-beauty-studio.jpg +0 -0
  152. admin/assets/images/themes/pro/spa.jpg +0 -0
  153. admin/assets/images/themes/pro/sport-shop.jpg +0 -0
  154. admin/assets/images/themes/pro/spring-sale.jpg +0 -0
  155. admin/assets/images/themes/pro/spring.jpg +0 -0
  156. admin/assets/images/themes/pro/startup.jpg +0 -0
  157. admin/assets/images/themes/pro/stat-team.jpg +0 -0
  158. admin/assets/images/themes/pro/statistics-survey.jpg +0 -0
  159. admin/assets/images/themes/pro/studio-design.jpg +0 -0
  160. admin/assets/images/themes/pro/stylish-workplace.jpg +0 -0
  161. admin/assets/images/themes/pro/tattoo-studio.jpg +0 -0
  162. admin/assets/images/themes/pro/tech.jpg +0 -0
  163. admin/assets/images/themes/pro/techexpo.jpg +0 -0
  164. admin/assets/images/themes/pro/technology.jpg +0 -0
  165. admin/assets/images/themes/pro/telecommunication.jpg +0 -0
  166. admin/assets/images/themes/pro/the-big-city-newsletter.jpg +0 -0
  167. admin/assets/images/themes/pro/the-sunny-view.jpg +0 -0
  168. admin/assets/images/themes/pro/theatre.jpg +0 -0
  169. admin/assets/images/themes/pro/travel-agency.jpg +0 -0
  170. admin/assets/images/themes/pro/travel-blog.jpg +0 -0
  171. admin/assets/images/themes/pro/travel.jpg +0 -0
  172. admin/assets/images/themes/pro/tulips.jpg +0 -0
  173. admin/assets/images/themes/pro/valentines-day.jpg +0 -0
  174. admin/assets/images/themes/pro/video-production.jpg +0 -0
  175. admin/assets/images/themes/pro/virtual-assistant-service.jpg +0 -0
  176. admin/assets/images/themes/pro/virtual-reality.jpg +0 -0
  177. admin/assets/images/themes/pro/walking-away-video.jpg +0 -0
  178. admin/assets/images/themes/pro/web-security.jpg +0 -0
  179. admin/assets/images/themes/pro/webinar.jpg +0 -0
  180. admin/assets/images/themes/pro/wedding-blog.jpg +0 -0
  181. admin/assets/images/themes/pro/wedding.jpg +0 -0
  182. admin/assets/images/themes/pro/white-orchids.jpg +0 -0
  183. admin/assets/images/themes/pro/winter-sale.jpg +0 -0
  184. admin/assets/images/themes/pro/working-out.jpg +0 -0
  185. admin/assets/images/themes/pro/workplace.jpg +0 -0
  186. admin/assets/images/themes/pro/writing-service-video.jpg +0 -0
  187. admin/assets/images/themes/pro/yoga-classes.jpg +0 -0
  188. admin/assets/js/ot-admin.js +1335 -1335
  189. admin/includes/google-fonts.php +5960 -5960
  190. admin/includes/ot-functions-admin.php +6111 -6111
  191. admin/includes/ot-functions-option-types.php +0 -2619
admin/assets/css/ot-admin.css CHANGED
@@ -1,4089 +1,4089 @@
1
- .theme-thumb {
2
- min-width: 150px;
3
- display: inline-block;
4
- margin: 15px;
5
- width: calc(33% - 25px);
6
- box-sizing: border-box;
7
- background-color: #f1f1f1;
8
- padding-bottom: 5px;
9
- border: thin solid transparent;
10
- position: relative;
11
- }
12
- #rate-plugin {
13
- left: 150px;
14
- margin: 10px 20px 10px 150px;
15
- padding: 15px;
16
- background-color: #79042e;
17
- width: calc(100% - 400px);
18
- font-size: 16px;
19
- color: #ffffff;
20
- }
21
-
22
- #rate-plugin a {
23
- color: #ffffff;
24
- }
25
-
26
- #option-tree-settings-api #rate-plugin p {
27
- margin: 10px 0 0 0 !important;
28
- }
29
-
30
- .format-setting-wrap .theme-thumb:nth-child(3n + 1) {
31
- margin-left: 0;
32
- }
33
- .theme-thumb:hover {
34
- border: thin solid #00000099;
35
- }
36
- .theme-thumb span {
37
- display: block;
38
- padding: 5px 10px;
39
- }
40
- .theme-thumb span .button {
41
- margin-top: 5px;
42
- }
43
- .theme-thumb img {
44
- max-width: 100%;
45
- border-bottom: 2px solid #fe2929;
46
- }
47
- .theme-thumb span.name {
48
- font-weight: 600;
49
- font-size: 15px;
50
- }
51
- .theme-thumb span.name small {
52
- font-weight: 400;
53
- font-style: italic;
54
- }
55
- .theme-thumb .ribbon {
56
- width: 100px;
57
- height: 100px;
58
- overflow: hidden;
59
- position: absolute;
60
- top: 0;
61
- right: 0;
62
- }
63
- .theme-thumb .ribbon::before,
64
- .theme-thumb .ribbon::after {
65
- position: absolute;
66
- z-index: -1;
67
- content: '';
68
- display: block;
69
- }
70
- .theme-thumb .ribbon i {
71
- position: absolute;
72
- display: inline-block;
73
- padding: 10px;
74
- background-color: #fe2929e6;
75
- color: #fff;
76
- font: 700 18px/1 'Lato', sans-serif;
77
- right: 0;
78
- top: 0;
79
- }
80
- .theme-thumb .ribbon::before,
81
- .theme-thumb .ribbon::after {
82
- border-top-color: transparent;
83
- border-right-color: transparent;
84
- }
85
- .theme-thumb .ribbon::before {
86
- top: 0;
87
- left: 0;
88
- }
89
- .theme-thumb .ribbon::after {
90
- bottom: 0;
91
- right: 0;
92
- }
93
-
94
- /* --------------------------------------------------
95
- :: OptionTree Font
96
- ---------------------------------------------------*/
97
- @font-face {
98
- font-family: "option-tree-font";
99
- src:url("../fonts/option-tree-font.eot");
100
- src:url("../fonts/option-tree-font.eot?#iefix") format("embedded-opentype"),
101
- url("../fonts/option-tree-font.woff") format("woff"),
102
- url("../fonts/option-tree-font.ttf") format("truetype"),
103
- url("../fonts/option-tree-font.svg#option-tree-font") format("svg");
104
- font-weight: normal;
105
- font-style: normal;
106
- }
107
-
108
- [class^="ot-icon-"],
109
- [class*=" ot-icon-"] {
110
- font-family: "option-tree-font";
111
- speak: none;
112
- font-style: normal;
113
- font-weight: normal;
114
- font-variant: normal;
115
- text-transform: none;
116
- line-height: 1;
117
- -webkit-font-smoothing: antialiased;
118
- -moz-osx-font-smoothing: grayscale;
119
- }
120
-
121
- .ui-tabs li > a [class^="ot-icon-"],
122
- .ui-tabs li > a [class*=" ot-icon-"] {
123
- padding-right: 5px;
124
- line-height: 18px;
125
- vertical-align: middle;
126
- }
127
-
128
- .ot-icon-option-tree:before {
129
- content: "\e785";
130
- }
131
- .ot-icon-glass:before {
132
- content: "\f000";
133
- }
134
- .ot-icon-music:before {
135
- content: "\f001";
136
- }
137
- .ot-icon-search:before {
138
- content: "\f002";
139
- }
140
- .ot-icon-envelope-o:before {
141
- content: "\f003";
142
- }
143
- .ot-icon-heart:before {
144
- content: "\f004";
145
- }
146
- .ot-icon-star:before {
147
- content: "\f005";
148
- }
149
- .ot-icon-star-o:before {
150
- content: "\f006";
151
- }
152
- .ot-icon-user:before {
153
- content: "\f007";
154
- }
155
- .ot-icon-film:before {
156
- content: "\f008";
157
- }
158
- .ot-icon-th-large:before {
159
- content: "\f009";
160
- }
161
- .ot-icon-th:before {
162
- content: "\f00a";
163
- }
164
- .ot-icon-th-list:before {
165
- content: "\f00b";
166
- }
167
- .ot-icon-check:before {
168
- content: "\f00c";
169
- }
170
- .ot-icon-times:before {
171
- content: "\f00d";
172
- }
173
- .ot-icon-search-plus:before {
174
- content: "\f00e";
175
- }
176
- .ot-icon-search-minus:before {
177
- content: "\f010";
178
- }
179
- .ot-icon-power-off:before {
180
- content: "\f011";
181
- }
182
- .ot-icon-signal:before {
183
- content: "\f012";
184
- }
185
- .ot-icon-gear:before {
186
- content: "\f013";
187
- }
188
- .ot-icon-trash-o:before {
189
- content: "\f014";
190
- }
191
- .ot-icon-home:before {
192
- content: "\f015";
193
- }
194
- .ot-icon-file-o:before {
195
- content: "\f016";
196
- }
197
- .ot-icon-clock-o:before {
198
- content: "\f017";
199
- }
200
- .ot-icon-road:before {
201
- content: "\f018";
202
- }
203
- .ot-icon-download:before {
204
- content: "\f019";
205
- }
206
- .ot-icon-arrow-circle-o-down:before {
207
- content: "\f01a";
208
- }
209
- .ot-icon-arrow-circle-o-up:before {
210
- content: "\f01b";
211
- }
212
- .ot-icon-inbox:before {
213
- content: "\f01c";
214
- }
215
- .ot-icon-play-circle-o:before {
216
- content: "\f01d";
217
- }
218
- .ot-icon-rotate-right:before {
219
- content: "\f01e";
220
- }
221
- .ot-icon-refresh:before {
222
- content: "\f021";
223
- }
224
- .ot-icon-list-alt:before {
225
- content: "\f022";
226
- }
227
- .ot-icon-lock:before {
228
- content: "\f023";
229
- }
230
- .ot-icon-flag:before {
231
- content: "\f024";
232
- }
233
- .ot-icon-headphones:before {
234
- content: "\f025";
235
- }
236
- .ot-icon-volume-off:before {
237
- content: "\f026";
238
- }
239
- .ot-icon-volume-down:before {
240
- content: "\f027";
241
- }
242
- .ot-icon-volume-up:before {
243
- content: "\f028";
244
- }
245
- .ot-icon-qrcode:before {
246
- content: "\f029";
247
- }
248
- .ot-icon-barcode:before {
249
- content: "\f02a";
250
- }
251
- .ot-icon-tag:before {
252
- content: "\f02b";
253
- }
254
- .ot-icon-tags:before {
255
- content: "\f02c";
256
- }
257
- .ot-icon-book:before {
258
- content: "\f02d";
259
- }
260
- .ot-icon-bookmark:before {
261
- content: "\f02e";
262
- }
263
- .ot-icon-print:before {
264
- content: "\f02f";
265
- }
266
- .ot-icon-camera:before {
267
- content: "\f030";
268
- }
269
- .ot-icon-font:before {
270
- content: "\f031";
271
- }
272
- .ot-icon-bold:before {
273
- content: "\f032";
274
- }
275
- .ot-icon-italic:before {
276
- content: "\f033";
277
- }
278
- .ot-icon-text-height:before {
279
- content: "\f034";
280
- }
281
- .ot-icon-text-width:before {
282
- content: "\f035";
283
- }
284
- .ot-icon-align-left:before {
285
- content: "\f036";
286
- }
287
- .ot-icon-align-center:before {
288
- content: "\f037";
289
- }
290
- .ot-icon-align-right:before {
291
- content: "\f038";
292
- }
293
- .ot-icon-align-justify:before {
294
- content: "\f039";
295
- }
296
- .ot-icon-list:before {
297
- content: "\f03a";
298
- }
299
- .ot-icon-dedent:before {
300
- content: "\f03b";
301
- }
302
- .ot-icon-indent:before {
303
- content: "\f03c";
304
- }
305
- .ot-icon-video-camera:before {
306
- content: "\f03d";
307
- }
308
- .ot-icon-picture-o:before {
309
- content: "\f03e";
310
- }
311
- .ot-icon-pencil:before {
312
- content: "\f040";
313
- }
314
- .ot-icon-map-marker:before {
315
- content: "\f041";
316
- }
317
- .ot-icon-adjust:before {
318
- content: "\f042";
319
- }
320
- .ot-icon-tint:before {
321
- content: "\f043";
322
- }
323
- .ot-icon-edit:before {
324
- content: "\f044";
325
- }
326
- .ot-icon-share-square-o:before {
327
- content: "\f045";
328
- }
329
- .ot-icon-check-square-o:before {
330
- content: "\f046";
331
- }
332
- .ot-icon-arrows:before {
333
- content: "\f047";
334
- }
335
- .ot-icon-step-backward:before {
336
- content: "\f048";
337
- }
338
- .ot-icon-fast-backward:before {
339
- content: "\f049";
340
- }
341
- .ot-icon-backward:before {
342
- content: "\f04a";
343
- }
344
- .ot-icon-play:before {
345
- content: "\f04b";
346
- }
347
- .ot-icon-pause:before {
348
- content: "\f04c";
349
- }
350
- .ot-icon-stop:before {
351
- content: "\f04d";
352
- }
353
- .ot-icon-forward:before {
354
- content: "\f04e";
355
- }
356
- .ot-icon-fast-forward:before {
357
- content: "\f050";
358
- }
359
- .ot-icon-step-forward:before {
360
- content: "\f051";
361
- }
362
- .ot-icon-eject:before {
363
- content: "\f052";
364
- }
365
- .ot-icon-chevron-left:before {
366
- content: "\f053";
367
- }
368
- .ot-icon-chevron-right:before {
369
- content: "\f054";
370
- }
371
- .ot-icon-plus-circle:before {
372
- content: "\f055";
373
- }
374
- .ot-icon-minus-circle:before {
375
- content: "\f056";
376
- }
377
- .ot-icon-times-circle:before {
378
- content: "\f057";
379
- }
380
- .ot-icon-check-circle:before {
381
- content: "\f058";
382
- }
383
- .ot-icon-question-circle:before {
384
- content: "\f059";
385
- }
386
- .ot-icon-info-circle:before {
387
- content: "\f05a";
388
- }
389
- .ot-icon-crosshairs:before {
390
- content: "\f05b";
391
- }
392
- .ot-icon-times-circle-o:before {
393
- content: "\f05c";
394
- }
395
- .ot-icon-check-circle-o:before {
396
- content: "\f05d";
397
- }
398
- .ot-icon-ban:before {
399
- content: "\f05e";
400
- }
401
- .ot-icon-arrow-left:before {
402
- content: "\f060";
403
- }
404
- .ot-icon-arrow-right:before {
405
- content: "\f061";
406
- }
407
- .ot-icon-arrow-up:before {
408
- content: "\f062";
409
- }
410
- .ot-icon-arrow-down:before {
411
- content: "\f063";
412
- }
413
- .ot-icon-mail-forward:before {
414
- content: "\f064";
415
- }
416
- .ot-icon-expand:before {
417
- content: "\f065";
418
- }
419
- .ot-icon-compress:before {
420
- content: "\f066";
421
- }
422
- .ot-icon-plus:before {
423
- content: "\f067";
424
- }
425
- .ot-icon-minus:before {
426
- content: "\f068";
427
- }
428
- .ot-icon-asterisk:before {
429
- content: "\f069";
430
- }
431
- .ot-icon-exclamation-circle:before {
432
- content: "\f06a";
433
- }
434
- .ot-icon-gift:before {
435
- content: "\f06b";
436
- }
437
- .ot-icon-leaf:before {
438
- content: "\f06c";
439
- }
440
- .ot-icon-fire:before {
441
- content: "\f06d";
442
- }
443
- .ot-icon-eye:before {
444
- content: "\f06e";
445
- }
446
- .ot-icon-eye-slash:before {
447
- content: "\f070";
448
- }
449
- .ot-icon-warning:before {
450
- content: "\f071";
451
- }
452
- .ot-icon-plane:before {
453
- content: "\f072";
454
- }
455
- .ot-icon-calendar:before {
456
- content: "\f073";
457
- }
458
- .ot-icon-random:before {
459
- content: "\f074";
460
- }
461
- .ot-icon-comment:before {
462
- content: "\f075";
463
- }
464
- .ot-icon-magnet:before {
465
- content: "\f076";
466
- }
467
- .ot-icon-chevron-up:before {
468
- content: "\f077";
469
- }
470
- .ot-icon-chevron-down:before {
471
- content: "\f078";
472
- }
473
- .ot-icon-retweet:before {
474
- content: "\f079";
475
- }
476
- .ot-icon-shopping-cart:before {
477
- content: "\f07a";
478
- }
479
- .ot-icon-folder:before {
480
- content: "\f07b";
481
- }
482
- .ot-icon-folder-open:before {
483
- content: "\f07c";
484
- }
485
- .ot-icon-arrows-v:before {
486
- content: "\f07d";
487
- }
488
- .ot-icon-arrows-h:before {
489
- content: "\f07e";
490
- }
491
- .ot-icon-bar-chart-o:before {
492
- content: "\f080";
493
- }
494
- .ot-icon-twitter-square:before {
495
- content: "\f081";
496
- }
497
- .ot-icon-facebook-square:before {
498
- content: "\f082";
499
- }
500
- .ot-icon-camera-retro:before {
501
- content: "\f083";
502
- }
503
- .ot-icon-key:before {
504
- content: "\f084";
505
- }
506
- .ot-icon-gears:before {
507
- content: "\f085";
508
- }
509
- .ot-icon-comments:before {
510
- content: "\f086";
511
- }
512
- .ot-icon-thumbs-o-up:before {
513
- content: "\f087";
514
- }
515
- .ot-icon-thumbs-o-down:before {
516
- content: "\f088";
517
- }
518
- .ot-icon-star-half:before {
519
- content: "\f089";
520
- }
521
- .ot-icon-heart-o:before {
522
- content: "\f08a";
523
- }
524
- .ot-icon-sign-out:before {
525
- content: "\f08b";
526
- }
527
- .ot-icon-linkedin-square:before {
528
- content: "\f08c";
529
- }
530
- .ot-icon-thumb-tack:before {
531
- content: "\f08d";
532
- }
533
- .ot-icon-external-link:before {
534
- content: "\f08e";
535
- }
536
- .ot-icon-sign-in:before {
537
- content: "\f090";
538
- }
539
- .ot-icon-trophy:before {
540
- content: "\f091";
541
- }
542
- .ot-icon-github-square:before {
543
- content: "\f092";
544
- }
545
- .ot-icon-upload:before {
546
- content: "\f093";
547
- }
548
- .ot-icon-lemon-o:before {
549
- content: "\f094";
550
- }
551
- .ot-icon-phone:before {
552
- content: "\f095";
553
- }
554
- .ot-icon-square-o:before {
555
- content: "\f096";
556
- }
557
- .ot-icon-bookmark-o:before {
558
- content: "\f097";
559
- }
560
- .ot-icon-phone-square:before {
561
- content: "\f098";
562
- }
563
- .ot-icon-twitter:before {
564
- content: "\f099";
565
- }
566
- .ot-icon-facebook:before {
567
- content: "\f09a";
568
- }
569
- .ot-icon-github:before {
570
- content: "\f09b";
571
- }
572
- .ot-icon-unlock:before {
573
- content: "\f09c";
574
- }
575
- .ot-icon-credit-card:before {
576
- content: "\f09d";
577
- }
578
- .ot-icon-rss:before {
579
- content: "\f09e";
580
- }
581
- .ot-icon-hdd-o:before {
582
- content: "\f0a0";
583
- }
584
- .ot-icon-bullhorn:before {
585
- content: "\f0a1";
586
- }
587
- .ot-icon-bell:before {
588
- content: "\f0a2";
589
- }
590
- .ot-icon-certificate:before {
591
- content: "\f0a3";
592
- }
593
- .ot-icon-hand-o-right:before {
594
- content: "\f0a4";
595
- }
596
- .ot-icon-hand-o-left:before {
597
- content: "\f0a5";
598
- }
599
- .ot-icon-hand-o-up:before {
600
- content: "\f0a6";
601
- }
602
- .ot-icon-hand-o-down:before {
603
- content: "\f0a7";
604
- }
605
- .ot-icon-arrow-circle-left:before {
606
- content: "\f0a8";
607
- }
608
- .ot-icon-arrow-circle-right:before {
609
- content: "\f0a9";
610
- }
611
- .ot-icon-arrow-circle-up:before {
612
- content: "\f0aa";
613
- }
614
- .ot-icon-arrow-circle-down:before {
615
- content: "\f0ab";
616
- }
617
- .ot-icon-globe:before {
618
- content: "\f0ac";
619
- }
620
- .ot-icon-wrench:before {
621
- content: "\f0ad";
622
- }
623
- .ot-icon-tasks:before {
624
- content: "\f0ae";
625
- }
626
- .ot-icon-filter:before {
627
- content: "\f0b0";
628
- }
629
- .ot-icon-briefcase:before {
630
- content: "\f0b1";
631
- }
632
- .ot-icon-arrows-alt:before {
633
- content: "\f0b2";
634
- }
635
- .ot-icon-group:before {
636
- content: "\f0c0";
637
- }
638
- .ot-icon-chain:before {
639
- content: "\f0c1";
640
- }
641
- .ot-icon-cloud:before {
642
- content: "\f0c2";
643
- }
644
- .ot-icon-flask:before {
645
- content: "\f0c3";
646
- }
647
- .ot-icon-cut:before {
648
- content: "\f0c4";
649
- }
650
- .ot-icon-copy:before {
651
- content: "\f0c5";
652
- }
653
- .ot-icon-paperclip:before {
654
- content: "\f0c6";
655
- }
656
- .ot-icon-save:before {
657
- content: "\f0c7";
658
- }
659
- .ot-icon-square:before {
660
- content: "\f0c8";
661
- }
662
- .ot-icon-bars:before {
663
- content: "\f0c9";
664
- }
665
- .ot-icon-list-ul:before {
666
- content: "\f0ca";
667
- }
668
- .ot-icon-list-ol:before {
669
- content: "\f0cb";
670
- }
671
- .ot-icon-strikethrough:before {
672
- content: "\f0cc";
673
- }
674
- .ot-icon-underline:before {
675
- content: "\f0cd";
676
- }
677
- .ot-icon-table:before {
678
- content: "\f0ce";
679
- }
680
- .ot-icon-magic:before {
681
- content: "\f0d0";
682
- }
683
- .ot-icon-truck:before {
684
- content: "\f0d1";
685
- }
686
- .ot-icon-pinterest:before {
687
- content: "\f0d2";
688
- }
689
- .ot-icon-pinterest-square:before {
690
- content: "\f0d3";
691
- }
692
- .ot-icon-google-plus-square:before {
693
- content: "\f0d4";
694
- }
695
- .ot-icon-google-plus:before {
696
- content: "\f0d5";
697
- }
698
- .ot-icon-money:before {
699
- content: "\f0d6";
700
- }
701
- .ot-icon-caret-down:before {
702
- content: "\f0d7";
703
- }
704
- .ot-icon-caret-up:before {
705
- content: "\f0d8";
706
- }
707
- .ot-icon-caret-left:before {
708
- content: "\f0d9";
709
- }
710
- .ot-icon-caret-right:before {
711
- content: "\f0da";
712
- }
713
- .ot-icon-columns:before {
714
- content: "\f0db";
715
- }
716
- .ot-icon-unsorted:before {
717
- content: "\f0dc";
718
- }
719
- .ot-icon-sort-down:before {
720
- content: "\f0dd";
721
- }
722
- .ot-icon-sort-up:before {
723
- content: "\f0de";
724
- }
725
- .ot-icon-envelope:before {
726
- content: "\f0e0";
727
- }
728
- .ot-icon-linkedin:before {
729
- content: "\f0e1";
730
- }
731
- .ot-icon-rotate-left:before {
732
- content: "\f0e2";
733
- }
734
- .ot-icon-legal:before {
735
- content: "\f0e3";
736
- }
737
- .ot-icon-dashboard:before {
738
- content: "\f0e4";
739
- }
740
- .ot-icon-comment-o:before {
741
- content: "\f0e5";
742
- }
743
- .ot-icon-comments-o:before {
744
- content: "\f0e6";
745
- }
746
- .ot-icon-flash:before {
747
- content: "\f0e7";
748
- }
749
- .ot-icon-sitemap:before {
750
- content: "\f0e8";
751
- }
752
- .ot-icon-umbrella:before {
753
- content: "\f0e9";
754
- }
755
- .ot-icon-paste:before {
756
- content: "\f0ea";
757
- }
758
- .ot-icon-lightbulb-o:before {
759
- content: "\f0eb";
760
- }
761
- .ot-icon-exchange:before {
762
- content: "\f0ec";
763
- }
764
- .ot-icon-cloud-download:before {
765
- content: "\f0ed";
766
- }
767
- .ot-icon-cloud-upload:before {
768
- content: "\f0ee";
769
- }
770
- .ot-icon-user-md:before {
771
- content: "\f0f0";
772
- }
773
- .ot-icon-stethoscope:before {
774
- content: "\f0f1";
775
- }
776
- .ot-icon-suitcase:before {
777
- content: "\f0f2";
778
- }
779
- .ot-icon-bell-o:before {
780
- content: "\f0f3";
781
- }
782
- .ot-icon-coffee:before {
783
- content: "\f0f4";
784
- }
785
- .ot-icon-cutlery:before {
786
- content: "\f0f5";
787
- }
788
- .ot-icon-file-text-o:before {
789
- content: "\f0f6";
790
- }
791
- .ot-icon-building-o:before {
792
- content: "\f0f7";
793
- }
794
- .ot-icon-hospital-o:before {
795
- content: "\f0f8";
796
- }
797
- .ot-icon-ambulance:before {
798
- content: "\f0f9";
799
- }
800
- .ot-icon-medkit:before {
801
- content: "\f0fa";
802
- }
803
- .ot-icon-fighter-jet:before {
804
- content: "\f0fb";
805
- }
806
- .ot-icon-beer:before {
807
- content: "\f0fc";
808
- }
809
- .ot-icon-h-square:before {
810
- content: "\f0fd";
811
- }
812
- .ot-icon-plus-square:before {
813
- content: "\f0fe";
814
- }
815
- .ot-icon-angle-double-left:before {
816
- content: "\f100";
817
- }
818
- .ot-icon-angle-double-right:before {
819
- content: "\f101";
820
- }
821
- .ot-icon-angle-double-up:before {
822
- content: "\f102";
823
- }
824
- .ot-icon-angle-double-down:before {
825
- content: "\f103";
826
- }
827
- .ot-icon-angle-left:before {
828
- content: "\f104";
829
- }
830
- .ot-icon-angle-right:before {
831
- content: "\f105";
832
- }
833
- .ot-icon-angle-up:before {
834
- content: "\f106";
835
- }
836
- .ot-icon-angle-down:before {
837
- content: "\f107";
838
- }
839
- .ot-icon-desktop:before {
840
- content: "\f108";
841
- }
842
- .ot-icon-laptop:before {
843
- content: "\f109";
844
- }
845
- .ot-icon-tablet:before {
846
- content: "\f10a";
847
- }
848
- .ot-icon-mobile-phone:before {
849
- content: "\f10b";
850
- }
851
- .ot-icon-circle-o:before {
852
- content: "\f10c";
853
- }
854
- .ot-icon-quote-left:before {
855
- content: "\f10d";
856
- }
857
- .ot-icon-quote-right:before {
858
- content: "\f10e";
859
- }
860
- .ot-icon-spinner:before {
861
- content: "\f110";
862
- }
863
- .ot-icon-circle:before {
864
- content: "\f111";
865
- }
866
- .ot-icon-mail-reply:before {
867
- content: "\f112";
868
- }
869
- .ot-icon-github-alt:before {
870
- content: "\f113";
871
- }
872
- .ot-icon-folder-o:before {
873
- content: "\f114";
874
- }
875
- .ot-icon-folder-open-o:before {
876
- content: "\f115";
877
- }
878
- .ot-icon-smile-o:before {
879
- content: "\f118";
880
- }
881
- .ot-icon-frown-o:before {
882
- content: "\f119";
883
- }
884
- .ot-icon-meh-o:before {
885
- content: "\f11a";
886
- }
887
- .ot-icon-gamepad:before {
888
- content: "\f11b";
889
- }
890
- .ot-icon-keyboard-o:before {
891
- content: "\f11c";
892
- }
893
- .ot-icon-flag-o:before {
894
- content: "\f11d";
895
- }
896
- .ot-icon-flag-checkered:before {
897
- content: "\f11e";
898
- }
899
- .ot-icon-terminal:before {
900
- content: "\f120";
901
- }
902
- .ot-icon-code:before {
903
- content: "\f121";
904
- }
905
- .ot-icon-reply-all:before {
906
- content: "\f122";
907
- }
908
- .ot-icon-star-half-empty:before {
909
- content: "\f123";
910
- }
911
- .ot-icon-location-arrow:before {
912
- content: "\f124";
913
- }
914
- .ot-icon-crop:before {
915
- content: "\f125";
916
- }
917
- .ot-icon-code-fork:before {
918
- content: "\f126";
919
- }
920
- .ot-icon-unlink:before {
921
- content: "\f127";
922
- }
923
- .ot-icon-question:before {
924
- content: "\f128";
925
- }
926
- .ot-icon-info:before {
927
- content: "\f129";
928
- }
929
- .ot-icon-exclamation:before {
930
- content: "\f12a";
931
- }
932
- .ot-icon-superscript:before {
933
- content: "\f12b";
934
- }
935
- .ot-icon-subscript:before {
936
- content: "\f12c";
937
- }
938
- .ot-icon-eraser:before {
939
- content: "\f12d";
940
- }
941
- .ot-icon-puzzle-piece:before {
942
- content: "\f12e";
943
- }
944
- .ot-icon-microphone:before {
945
- content: "\f130";
946
- }
947
- .ot-icon-microphone-slash:before {
948
- content: "\f131";
949
- }
950
- .ot-icon-shield:before {
951
- content: "\f132";
952
- }
953
- .ot-icon-calendar-o:before {
954
- content: "\f133";
955
- }
956
- .ot-icon-fire-extinguisher:before {
957
- content: "\f134";
958
- }
959
- .ot-icon-rocket:before {
960
- content: "\f135";
961
- }
962
- .ot-icon-maxcdn:before {
963
- content: "\f136";
964
- }
965
- .ot-icon-chevron-circle-left:before {
966
- content: "\f137";
967
- }
968
- .ot-icon-chevron-circle-right:before {
969
- content: "\f138";
970
- }
971
- .ot-icon-chevron-circle-up:before {
972
- content: "\f139";
973
- }
974
- .ot-icon-chevron-circle-down:before {
975
- content: "\f13a";
976
- }
977
- .ot-icon-html5:before {
978
- content: "\f13b";
979
- }
980
- .ot-icon-css3:before {
981
- content: "\f13c";
982
- }
983
- .ot-icon-anchor:before {
984
- content: "\f13d";
985
- }
986
- .ot-icon-unlock-alt:before {
987
- content: "\f13e";
988
- }
989
- .ot-icon-bullseye:before {
990
- content: "\f140";
991
- }
992
- .ot-icon-ellipsis-h:before {
993
- content: "\f141";
994
- }
995
- .ot-icon-ellipsis-v:before {
996
- content: "\f142";
997
- }
998
- .ot-icon-rss-square:before {
999
- content: "\f143";
1000
- }
1001
- .ot-icon-play-circle:before {
1002
- content: "\f144";
1003
- }
1004
- .ot-icon-ticket:before {
1005
- content: "\f145";
1006
- }
1007
- .ot-icon-minus-square:before {
1008
- content: "\f146";
1009
- }
1010
- .ot-icon-minus-square-o:before {
1011
- content: "\f147";
1012
- }
1013
- .ot-icon-level-up:before {
1014
- content: "\f148";
1015
- }
1016
- .ot-icon-level-down:before {
1017
- content: "\f149";
1018
- }
1019
- .ot-icon-check-square:before {
1020
- content: "\f14a";
1021
- }
1022
- .ot-icon-pencil-square:before {
1023
- content: "\f14b";
1024
- }
1025
- .ot-icon-external-link-square:before {
1026
- content: "\f14c";
1027
- }
1028
- .ot-icon-share-square:before {
1029
- content: "\f14d";
1030
- }
1031
- .ot-icon-compass:before {
1032
- content: "\f14e";
1033
- }
1034
- .ot-icon-toggle-down:before {
1035
- content: "\f150";
1036
- }
1037
- .ot-icon-toggle-up:before {
1038
- content: "\f151";
1039
- }
1040
- .ot-icon-toggle-right:before {
1041
- content: "\f152";
1042
- }
1043
- .ot-icon-euro:before {
1044
- content: "\f153";
1045
- }
1046
- .ot-icon-gbp:before {
1047
- content: "\f154";
1048
- }
1049
- .ot-icon-dollar:before {
1050
- content: "\f155";
1051
- }
1052
- .ot-icon-rupee:before {
1053
- content: "\f156";
1054
- }
1055
- .ot-icon-cny:before {
1056
- content: "\f157";
1057
- }
1058
- .ot-icon-ruble:before {
1059
- content: "\f158";
1060
- }
1061
- .ot-icon-won:before {
1062
- content: "\f159";
1063
- }
1064
- .ot-icon-bitcoin:before {
1065
- content: "\f15a";
1066
- }
1067
- .ot-icon-file:before {
1068
- content: "\f15b";
1069
- }
1070
- .ot-icon-file-text:before {
1071
- content: "\f15c";
1072
- }
1073
- .ot-icon-sort-alpha-asc:before {
1074
- content: "\f15d";
1075
- }
1076
- .ot-icon-sort-alpha-desc:before {
1077
- content: "\f15e";
1078
- }
1079
- .ot-icon-sort-amount-asc:before {
1080
- content: "\f160";
1081
- }
1082
- .ot-icon-sort-amount-desc:before {
1083
- content: "\f161";
1084
- }
1085
- .ot-icon-sort-numeric-asc:before {
1086
- content: "\f162";
1087
- }
1088
- .ot-icon-sort-numeric-desc:before {
1089
- content: "\f163";
1090
- }
1091
- .ot-icon-thumbs-up:before {
1092
- content: "\f164";
1093
- }
1094
- .ot-icon-thumbs-down:before {
1095
- content: "\f165";
1096
- }
1097
- .ot-icon-youtube-square:before {
1098
- content: "\f166";
1099
- }
1100
- .ot-icon-youtube:before {
1101
- content: "\f167";
1102
- }
1103
- .ot-icon-xing:before {
1104
- content: "\f168";
1105
- }
1106
- .ot-icon-xing-square:before {
1107
- content: "\f169";
1108
- }
1109
- .ot-icon-youtube-play:before {
1110
- content: "\f16a";
1111
- }
1112
- .ot-icon-dropbox:before {
1113
- content: "\f16b";
1114
- }
1115
- .ot-icon-stack-overflow:before {
1116
- content: "\f16c";
1117
- }
1118
- .ot-icon-instagram:before {
1119
- content: "\f16d";
1120
- }
1121
- .ot-icon-flickr:before {
1122
- content: "\f16e";
1123
- }
1124
- .ot-icon-adn:before {
1125
- content: "\f170";
1126
- }
1127
- .ot-icon-bitbucket:before {
1128
- content: "\f171";
1129
- }
1130
- .ot-icon-bitbucket-square:before {
1131
- content: "\f172";
1132
- }
1133
- .ot-icon-tumblr:before {
1134
- content: "\f173";
1135
- }
1136
- .ot-icon-tumblr-square:before {
1137
- content: "\f174";
1138
- }
1139
- .ot-icon-long-arrow-down:before {
1140
- content: "\f175";
1141
- }
1142
- .ot-icon-long-arrow-up:before {
1143
- content: "\f176";
1144
- }
1145
- .ot-icon-long-arrow-left:before {
1146
- content: "\f177";
1147
- }
1148
- .ot-icon-long-arrow-right:before {
1149
- content: "\f178";
1150
- }
1151
- .ot-icon-apple:before {
1152
- content: "\f179";
1153
- }
1154
- .ot-icon-windows:before {
1155
- content: "\f17a";
1156
- }
1157
- .ot-icon-android:before {
1158
- content: "\f17b";
1159
- }
1160
- .ot-icon-linux:before {
1161
- content: "\f17c";
1162
- }
1163
- .ot-icon-dribbble:before {
1164
- content: "\f17d";
1165
- }
1166
- .ot-icon-skype:before {
1167
- content: "\f17e";
1168
- }
1169
- .ot-icon-foursquare:before {
1170
- content: "\f180";
1171
- }
1172
- .ot-icon-trello:before {
1173
- content: "\f181";
1174
- }
1175
- .ot-icon-female:before {
1176
- content: "\f182";
1177
- }
1178
- .ot-icon-male:before {
1179
- content: "\f183";
1180
- }
1181
- .ot-icon-gittip:before {
1182
- content: "\f184";
1183
- }
1184
- .ot-icon-sun-o:before {
1185
- content: "\f185";
1186
- }
1187
- .ot-icon-moon-o:before {
1188
- content: "\f186";
1189
- }
1190
- .ot-icon-archive:before {
1191
- content: "\f187";
1192
- }
1193
- .ot-icon-bug:before {
1194
- content: "\f188";
1195
- }
1196
- .ot-icon-vk:before {
1197
- content: "\f189";
1198
- }
1199
- .ot-icon-weibo:before {
1200
- content: "\f18a";
1201
- }
1202
- .ot-icon-renren:before {
1203
- content: "\f18b";
1204
- }
1205
- .ot-icon-pagelines:before {
1206
- content: "\f18c";
1207
- }
1208
- .ot-icon-stack-exchange:before {
1209
- content: "\f18d";
1210
- }
1211
- .ot-icon-arrow-circle-o-right:before {
1212
- content: "\f18e";
1213
- }
1214
- .ot-icon-arrow-circle-o-left:before {
1215
- content: "\f190";
1216
- }
1217
- .ot-icon-toggle-left:before {
1218
- content: "\f191";
1219
- }
1220
- .ot-icon-dot-circle-o:before {
1221
- content: "\f192";
1222
- }
1223
- .ot-icon-wheelchair:before {
1224
- content: "\f193";
1225
- }
1226
- .ot-icon-vimeo-square:before {
1227
- content: "\f194";
1228
- }
1229
- .ot-icon-turkish-lira:before {
1230
- content: "\f195";
1231
- }
1232
- .ot-icon-plus-square-o:before {
1233
- content: "\f196";
1234
- }
1235
-
1236
- /* --------------------------------------------------
1237
- :: Screen Meta & Menu Icon
1238
- ---------------------------------------------------*/
1239
- .appearance_page_ot-theme-options #screen-meta {
1240
- margin-right: 20px;
1241
- margin-left: 2px;
1242
- min-width: 533px;
1243
- }
1244
-
1245
- /* --------------------------------------------------
1246
- :: Messages
1247
- ---------------------------------------------------*/
1248
- .wrap.settings-wrap div.error,
1249
- .wrap.settings-wrap div.updated {
1250
- margin: 9px 5px 0px 2px !important;
1251
- }
1252
-
1253
- /* --------------------------------------------------
1254
- :: OptionTree Wrappers
1255
- ---------------------------------------------------*/
1256
- #option-tree-settings-api .metabox-holder {
1257
- overflow: hidden;
1258
- }
1259
- #option-tree-settings-api .postbox {
1260
- background: #fff;
1261
- border: none;
1262
- margin: 0 20px;
1263
- }
1264
- #option-tree-settings-api .inside {
1265
- margin: 0px !important;
1266
- padding: 0px !important;
1267
- }
1268
- #option-tree-settings-api > .ui-tabs {
1269
- background: #fff;
1270
- border: 1px solid #ccc;
1271
- border-top: none;
1272
- margin: 0px 5px 0 2px;
1273
- min-width: 533px;
1274
- padding-bottom: 5px;
1275
- position: relative;
1276
- -webkit-box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1277
- -moz-box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1278
- box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1279
- -webkit-border-radius: 0 0 2px 2px;
1280
- -moz-border-radius: 0 0 2px 2px;
1281
- border-radius: 0 0 2px 2px;
1282
- }
1283
-
1284
- /* --------------------------------------------------
1285
- :: Header
1286
- ---------------------------------------------------*/
1287
- #option-tree-header-wrap {
1288
- position: relative;
1289
- }
1290
- #option-tree-header {
1291
- background: #333;
1292
- color: #bbb;
1293
- display: block;
1294
- margin: 11px 5px 0 2px;
1295
- min-width: 535px;
1296
- overflow: hidden;
1297
- position: relative;
1298
- -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1299
- -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1300
- box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1301
- -webkit-border-radius: 2px 2px 0 0;
1302
- -moz-border-radius: 2px 2px 0 0;
1303
- border-radius: 2px 2px 0 0;
1304
- }
1305
- #option-tree-header li {
1306
- display: block;
1307
- float: left;
1308
- margin: 0px;
1309
- padding: 0px;
1310
- }
1311
- #option-tree-header li a {
1312
- color: #999;
1313
- text-decoration: none;
1314
- -webkit-transition: none;
1315
- -moz-transition: none;
1316
- transition: none;
1317
- }
1318
- #option-tree-header li a:hover {
1319
- color: #0074a2;
1320
- }
1321
- #option-tree-header #option-tree-logo a {
1322
- border-right: 1px solid #000;
1323
- float: left;
1324
- height: 24px;
1325
- padding: 3px 12px 3px 13px;
1326
- width: 20px;
1327
- }
1328
- #option-tree-header #option-tree-logo a:before {
1329
- content: "\e785";
1330
- font: normal 20px/1 "option-tree-font" !important;
1331
- speak: none;
1332
- padding: 2px 0;
1333
- height: 24px;
1334
- width: 20px;
1335
- display: inline-block;
1336
- -webkit-font-smoothing: antialiased;
1337
- -moz-osx-font-smoothing: grayscale;
1338
- -webkit-transition: all .1s ease-in-out;
1339
- -moz-transition: all .1s ease-in-out;
1340
- transition: all .1s ease-in-out;
1341
- }
1342
- #option-tree-header li#option-tree-logo:hover {
1343
- background-color: #222;
1344
- color: #0074a2;
1345
- -webkit-border-top-left-radius: 2px;
1346
- -moz-border-radius-topleft: 2px;
1347
- border-top-left-radius: 2px;
1348
- }
1349
- #option-tree-header li#option-tree-logo:hover a {
1350
- border-right-color: #000;
1351
- }
1352
- #option-tree-header #option-tree-version span,
1353
- #option-tree-header #theme-version span {
1354
- border-left: 1px solid #444;
1355
- display: block;
1356
- float: left;
1357
- height: 24px;
1358
- line-height: 24px;
1359
- padding: 3px 12px 3px 12px;
1360
- }
1361
- #option-tree-header #theme-version:before {
1362
- border-right: 1px solid #000;
1363
- content: "";
1364
- display: block;
1365
- float: left;
1366
- height: 30px;
1367
- }
1368
- /* light */
1369
- .admin-color-light #option-tree-header {
1370
- background: #888;
1371
- color: #fff;
1372
- }
1373
- .admin-color-light #option-tree-header li a {
1374
- color: #ccc;
1375
- }
1376
- .admin-color-light #option-tree-header li a:hover {
1377
- color: #eee;
1378
- }
1379
- .admin-color-light #option-tree-header #option-tree-logo a,
1380
- .admin-color-light #option-tree-header #theme-version:before {
1381
- border-right-color: #3c3c3c;
1382
- }
1383
- .admin-color-light #option-tree-header li#option-tree-logo:hover {
1384
- background-color: #777;
1385
- }
1386
- .admin-color-light #option-tree-header li#option-tree-logo:hover a {
1387
- border-right-color: #3c3c3c;
1388
- }
1389
- .admin-color-light #option-tree-header #option-tree-version span,
1390
- .admin-color-light #option-tree-header #theme-version span {
1391
- border-left-color: #999;
1392
- }
1393
- /* blue */
1394
- .admin-color-blue #option-tree-header {
1395
- background: #52accc;
1396
- color: #fff;
1397
- }
1398
- .admin-color-blue #option-tree-header li a {
1399
- color: #e2f8ff;
1400
- }
1401
- .admin-color-blue #option-tree-header li a:hover {
1402
- color: #fff;
1403
- }
1404
- .admin-color-blue #option-tree-header #option-tree-logo a,
1405
- .admin-color-blue #option-tree-header #theme-version:before {
1406
- border-right-color: #002b39;
1407
- }
1408
- .admin-color-blue #option-tree-header li#option-tree-logo:hover {
1409
- background-color: #006484;
1410
- }
1411
- .admin-color-blue #option-tree-header li#option-tree-logo:hover a {
1412
- border-right-color: #002b39;
1413
- }
1414
- .admin-color-blue #option-tree-header #option-tree-version span,
1415
- .admin-color-blue #option-tree-header #theme-version span {
1416
- border-left-color: #5dc2e6;
1417
- }
1418
- /* coffee */
1419
- .admin-color-coffee #option-tree-header {
1420
- background: #59524c;
1421
- color: #c7cbc9;
1422
- }
1423
- .admin-color-coffee #option-tree-header li a {
1424
- color: #f3f2f1;
1425
- }
1426
- .admin-color-coffee #option-tree-header li a:hover {
1427
- color: #fff;
1428
- }
1429
- .admin-color-coffee #option-tree-header #option-tree-logo a,
1430
- .admin-color-coffee #option-tree-header #theme-version:before {
1431
- border-right-color: #0f0e0d;
1432
- }
1433
- .admin-color-coffee #option-tree-header li#option-tree-logo:hover {
1434
- background-color: #cca588;
1435
- }
1436
- .admin-color-coffee #option-tree-header li#option-tree-logo:hover a {
1437
- border-right-color: #0f0e0d;
1438
- }
1439
- .admin-color-coffee #option-tree-header #option-tree-version span,
1440
- .admin-color-coffee #option-tree-header #theme-version span {
1441
- border-left-color: #675f58;
1442
- }
1443
- /* ectoplasm */
1444
- .admin-color-ectoplasm #option-tree-header {
1445
- background: #523f6d;
1446
- color: #c6c6d3;
1447
- }
1448
- .admin-color-ectoplasm #option-tree-header li a {
1449
- color: #f3f2f1;
1450
- }
1451
- .admin-color-ectoplasm #option-tree-header li a:hover {
1452
- color: #fff;
1453
- }
1454
- .admin-color-ectoplasm #option-tree-header #option-tree-logo a,
1455
- .admin-color-ectoplasm #option-tree-header #theme-version:before {
1456
- border-right-color: #181220;
1457
- }
1458
- .admin-color-ectoplasm #option-tree-header li#option-tree-logo:hover {
1459
- background-color: #a3b542;
1460
- }
1461
- .admin-color-ectoplasm #option-tree-header li#option-tree-logo:hover a {
1462
- border-right-color: #181220;
1463
- }
1464
- .admin-color-ectoplasm #option-tree-header #option-tree-version span,
1465
- .admin-color-ectoplasm #option-tree-header #theme-version span {
1466
- border-left-color: #644d85;
1467
- }
1468
- /* midnight */
1469
- .admin-color-midnight #option-tree-header {
1470
- background: #363b3f;
1471
- color: #f1f2f3;
1472
- }
1473
- .admin-color-midnight #option-tree-header li a {
1474
- color: #f1f2f3;
1475
- }
1476
- .admin-color-midnight #option-tree-header li a:hover {
1477
- color: #fff;
1478
- }
1479
- .admin-color-midnight #option-tree-header #option-tree-logo a,
1480
- .admin-color-midnight #option-tree-header #theme-version:before {
1481
- border-right-color: #090a0b;
1482
- }
1483
- .admin-color-midnight #option-tree-header li#option-tree-logo:hover {
1484
- background-color: #ed543f;
1485
- }
1486
- .admin-color-midnight #option-tree-header li#option-tree-logo:hover a {
1487
- border-right-color: #090a0b;
1488
- }
1489
- .admin-color-midnight #option-tree-header #option-tree-version span,
1490
- .admin-color-midnight #option-tree-header #theme-version span {
1491
- border-left-color: #4c5359;
1492
- }
1493
- /* ocean */
1494
- .admin-color-ocean #option-tree-header {
1495
- background: #738e96;
1496
- color: #f1fcff;
1497
- }
1498
- .admin-color-ocean #option-tree-header li a {
1499
- color: #f1fcff;
1500
- }
1501
- .admin-color-ocean #option-tree-header li a:hover {
1502
- color: #fff;
1503
- }
1504
- .admin-color-ocean #option-tree-header #option-tree-logo a,
1505
- .admin-color-ocean #option-tree-header #theme-version:before {
1506
- border-right-color: #39464a;
1507
- }
1508
- .admin-color-ocean #option-tree-header li#option-tree-logo:hover {
1509
- background-color: #9ab8a0;
1510
- }
1511
- .admin-color-ocean #option-tree-header li#option-tree-logo:hover a {
1512
- border-right-color: #39464a;
1513
- }
1514
- .admin-color-ocean #option-tree-header #option-tree-version span,
1515
- .admin-color-ocean #option-tree-header #theme-version span {
1516
- border-left-color: #87a6af;
1517
- }
1518
- /* sunrise */
1519
- .admin-color-sunrise #option-tree-header {
1520
- background: #da4f41;
1521
- color: #fff;
1522
- }
1523
- .admin-color-sunrise #option-tree-header li a {
1524
- color: #f3f1f1;
1525
- }
1526
- .admin-color-sunrise #option-tree-header li a:hover {
1527
- color: #fff;
1528
- }
1529
- .admin-color-sunrise #option-tree-header #option-tree-logo a,
1530
- .admin-color-sunrise #option-tree-header #theme-version:before {
1531
- border-right-color: #8a322a;
1532
- }
1533
- .admin-color-sunrise #option-tree-header li#option-tree-logo:hover {
1534
- background-color: #e88436;
1535
- }
1536
- .admin-color-sunrise #option-tree-header li#option-tree-logo:hover a {
1537
- border-right-color: #8a322a;
1538
- }
1539
- .admin-color-sunrise #option-tree-header #option-tree-version span,
1540
- .admin-color-sunrise #option-tree-header #theme-version span {
1541
- border-left-color: #e75546;
1542
- }
1543
-
1544
- /* --------------------------------------------------
1545
- :: Sub Header
1546
- ---------------------------------------------------*/
1547
- #option-tree-sub-header {
1548
- background: #fafafa;
1549
- border: 1px solid #ccc;
1550
- border-top: none;
1551
- display: block;
1552
- margin: 0 5px 0 2px;
1553
- min-width: 523px;
1554
- overflow: hidden;
1555
- padding: 5px;
1556
- position: relative;
1557
- -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1558
- -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1559
- box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1560
- }
1561
-
1562
- /* --------------------------------------------------
1563
- :: Tabs
1564
- ---------------------------------------------------*/
1565
- .wrap.settings-wrap .ui-tabs-nav {
1566
- float: left;
1567
- list-style: none;
1568
- margin: 0 0 0 -4px;
1569
- padding: 1em 0;
1570
- width: 151px;
1571
- }
1572
- .wrap.settings-wrap .ui-tabs-nav li {
1573
- border: 1px solid transparent;
1574
- border-right-width: 0px;
1575
- display: block; margin: 0;
1576
- -webkit-border-radius: 2px 0 0 2px;
1577
- -moz-border-radius: 2px 0 0 2px;
1578
- border-radius: 2px 0 0 2px;
1579
- }
1580
- .wrap.settings-wrap .ui-tabs-nav li.ui-state-active {
1581
- background: #fff;
1582
- border-color: #ccc;
1583
- color: #000;
1584
- }
1585
- .wrap.settings-wrap .ui-tabs-nav li a {
1586
- color: #21759b;
1587
- display: block;
1588
- line-height: 18px;
1589
- padding: 5px 5px 5px 12px;
1590
- text-decoration: none;
1591
- }
1592
- .wrap.settings-wrap .ui-tabs-nav li a:hover,
1593
- .wrap.settings-wrap .ui-tabs-nav li.ui-state-active a {
1594
- color: #000;
1595
- outline: none;
1596
- }
1597
- .wrap.settings-wrap .ui-tabs-panel {
1598
- clear: both;
1599
- }
1600
- .wrap.settings-wrap .ui-tabs-nav li a:focus { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; }
1601
- /* --------------------------------------------------
1602
- :: Format Settings
1603
- ---------------------------------------------------*/
1604
- .format-settings {
1605
- position: relative;
1606
- width: 100%;
1607
- }
1608
- .format-setting-wrap,
1609
- .option-tree-sortable .format-settings {
1610
- padding: 10px 0 20px 0;
1611
- }
1612
-
1613
- /* --------------------------------------------------
1614
- :: Format Setting Label
1615
- ---------------------------------------------------*/
1616
- .format-setting-label {
1617
- border-bottom: 1px solid #F0F0F0;
1618
- margin: 0 0 20px 0;
1619
- padding: 5px 0px 1px 0px;
1620
- width: 100%;
1621
- }
1622
- #option-tree-settings-api .description h3,
1623
- #option-tree-settings-api .format-setting-label .label,
1624
- #poststuff .format-setting-label .label {
1625
- background: none;
1626
- border: none;
1627
- color: #222;
1628
- cursor: text;
1629
- display: block;
1630
- font-size: 1.3em;
1631
- font-weight: 800;
1632
- line-height: 1.6em;
1633
- letter-spacing: 0;
1634
- padding: 0 0 9px 0;
1635
- -webkit-user-select: text;
1636
- text-shadow: none;
1637
- }
1638
-
1639
- /* --------------------------------------------------
1640
- :: Format Setting
1641
- ---------------------------------------------------*/
1642
- .format-setting {
1643
- overflow: hidden;
1644
- position: relative;
1645
- width: 100%;
1646
- }
1647
- .format-setting .format-setting-inner {
1648
- float: left;
1649
- position: relative;
1650
- width: 63%;
1651
- }
1652
- .format-setting.no-desc > .format-setting-inner,
1653
- .format-setting.wide-desc .format-setting-inner {
1654
- width: 100%;
1655
- }
1656
- .format-setting .description {
1657
- float: right;
1658
- padding: 5px 0;
1659
- width: 35%;
1660
- font-size: 14px;
1661
- }
1662
- .format-setting.no-desc > .description,
1663
- .format-setting.wide-desc .description {
1664
- float: none;
1665
- width: 100%;
1666
- }
1667
- .list-item-description {
1668
- padding-top: 10px;
1669
- }
1670
- #option-tree-settings-api h4 {
1671
- color: #333;
1672
- font-size: 1.2em;
1673
- font-weight: 500;
1674
- line-height: 1.5em;
1675
- margin: 1em 0 0.5em 0;
1676
- padding: 0;
1677
- }
1678
- #option-tree-settings-api h5 {
1679
- color: #444;
1680
- font-size: 1em;
1681
- font-weight: 700;
1682
- line-height: 1.2em;
1683
- margin: 1em 0 0.5em 0;
1684
- padding: 0;
1685
- }
1686
- #option-tree-settings-api p {
1687
- margin: 0 0 1.5em 0 !important;
1688
- }
1689
- #post .format-setting-inner p {
1690
- float: left;
1691
- width: 100%;
1692
- margin: 0 0 1.05em 0 !important;
1693
- }
1694
- .aside {
1695
- border-bottom: 1px solid #eee;
1696
- padding-bottom: 15px;
1697
- margin-bottom: 15px;
1698
- }
1699
- .deprecated {
1700
- border-bottom: 1px solid #eee;
1701
- color: #b94029;
1702
- padding-bottom: 15px;
1703
- margin-bottom: 15px;
1704
- }
1705
- .warning {
1706
- color: #b94029;
1707
- }
1708
- .docs-ul {
1709
- line-height: 1.3em;
1710
- margin: 0;
1711
- padding: 0 0 1em 0;
1712
- }
1713
- .docs-ul li {
1714
- list-style-type: square;
1715
- margin-left: 20px;
1716
- }
1717
- #contextual-help-setting {
1718
- float: left;
1719
- padding: 10px 0 5px 0;
1720
- width: 100%;
1721
- }
1722
- #contextual-help-label {
1723
- float: left;
1724
- padding-top: 20px;
1725
- width: 100%;
1726
- }
1727
- #option_tree_settings_help {
1728
- float: left;
1729
- width: 100%;
1730
- }
1731
- #option-tree-settings-api blockquote {
1732
- font-style: italic;
1733
- padding-left: 15px;
1734
- position: relative;
1735
- }
1736
- #option-tree-settings-api blockquote:before {
1737
- color: #ccc;
1738
- content: "\201C";
1739
- display: block;
1740
- font-size: 400%;
1741
- font-style: normal;
1742
- left: -10px;
1743
- position: absolute;
1744
- top: 10px;
1745
- }
1746
- @media only screen and (max-width: 1020px) {
1747
- .format-setting .description,
1748
- .format-setting .format-setting-inner {
1749
- width: 100%;
1750
- }
1751
- .format-setting .description {
1752
- padding-top: 0px;
1753
- padding-bottom: 20px;
1754
- }
1755
- }
1756
- .ot-background-group {
1757
- overflow: hidden;
1758
- width: auto;
1759
- }
1760
- .ot-background-size-input {
1761
- max-width: 110px;
1762
- }
1763
- .option-tree-setting-edit,
1764
- .option-tree-setting-remove {
1765
- text-indent: -9999px;
1766
- }
1767
-
1768
- /* --------------------------------------------------
1769
- :: Code formatting
1770
- ---------------------------------------------------*/
1771
- #option-tree-settings-api code,
1772
- .ot-metabox-wrapper code {
1773
- background-color: #f1f1f1;
1774
- color: #333;
1775
- font-size: 12px;
1776
- }
1777
- #option-tree-settings-api pre {
1778
- font-size: 13px;
1779
- padding: 0;
1780
- margin: 1.5em 0;
1781
- line-height: 18px;
1782
- overflow: auto;
1783
- overflow-Y: hidden;
1784
- padding-top: 18px;
1785
- background: #f1f1f1;
1786
- border-bottom: 1px solid #f1f1f1;
1787
- margin-bottom: 20px;
1788
- color: #000;
1789
- white-space: pre-wrap;
1790
- word-wrap: break-word;
1791
- }
1792
- #option-tree-settings-api pre code {
1793
- padding: 0 18px 18px 18px;
1794
- display: block;
1795
- background: url(../images/ot-pre-bg.gif) repeat left top;
1796
- }
1797
-
1798
- /* --------------------------------------------------
1799
- :: Input & Upload
1800
- ---------------------------------------------------*/
1801
- input.option-tree-ui-upload-input,
1802
- input.option-tree-ui-input {
1803
- background: #fff;
1804
- border: 1px solid #ccc !important;
1805
- line-height: 17px;
1806
- font-size: 12px;
1807
- margin-bottom: 5px !important;
1808
- padding: 7px 6px;
1809
- position: relative;
1810
- width: 100% !important;
1811
- -webkit-border-radius: 2px;
1812
- -moz-border-radius: 2px;
1813
- border-radius: 2px;
1814
- -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1815
- -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1816
- box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1817
- }
1818
- input:hover.option-tree-ui-upload-input,
1819
- input:hover.option-tree-ui-input {
1820
- border-color: #bbb !important;
1821
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1822
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1823
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1824
- }
1825
- input:focus.option-tree-ui-upload-input,
1826
- input:focus.option-tree-ui-input {
1827
- border-color: #999 !important;
1828
- }
1829
-
1830
- @media screen and (-webkit-min-device-pixel-ratio:0) {
1831
- .option-tree-ui-input,
1832
- .option-tree-ui-upload-input {
1833
- padding: 5px 6px !important;
1834
- }
1835
- }
1836
-
1837
- /* --------------------------------------------------
1838
- :: Upload
1839
- ---------------------------------------------------*/
1840
- div.option-tree-ui-media-wrap {
1841
- margin: 0 55px 0 0;
1842
- min-height: 35px;
1843
- position: relative;
1844
- }
1845
- .option-tree-ui-media-wrap img {
1846
- background: #fafafa;
1847
- border: 1px solid #ccc;
1848
- padding: 4px;
1849
- display: block;
1850
- float: left;
1851
- max-width: 100%;
1852
- height: auto;
1853
- -ms-interpolation-mode: bicubic;
1854
- -webkit-border-radius: 2px;
1855
- -moz-border-radius: 2px;
1856
- border-radius: 2px;
1857
- }
1858
- .option-tree-ui-upload-parent {
1859
- width: auto !important;
1860
- margin-right: 45px;
1861
- padding: 0px;
1862
- position: relative;
1863
- }
1864
- .ot_upload_media {
1865
- top: 0px;
1866
- margin: 0px !important;
1867
- position: absolute;
1868
- right: -45px;
1869
- text-indent: -9999px;
1870
- }
1871
- .option-tree-ui-media-wrap a.option-tree-ui-remove-media {
1872
- float: none !important;
1873
- margin: 0px !important;
1874
- position: absolute !important;
1875
- right: -55px;
1876
- text-indent: -9999px;
1877
- top: 1px;
1878
- }
1879
-
1880
- /* --------------------------------------------------
1881
- :: Textarea
1882
- ---------------------------------------------------*/
1883
- .fill-area .description,
1884
- .fill-area .format-setting-inner {
1885
- width: 100% !important;
1886
- }
1887
- .wp-editor-area {
1888
- display: block;
1889
- }
1890
- .textarea,
1891
- .ot-metabox-wrapper textarea {
1892
- width: 99.9%;
1893
- border: 1px solid #ccc;
1894
- font-family: Consolas, Monaco, monospace;
1895
- line-height: 150%;
1896
- outline: 0;
1897
- padding: 10px;
1898
- resize: vertical;
1899
- }
1900
- #contextual-help-setting .textarea {
1901
- width: 99.75%;
1902
- }
1903
- .ot-metabox-wrapper .wp-editor-container {
1904
- border: none;
1905
- }
1906
- .textarea:hover,
1907
- .ot-metabox-wrapper textarea:hover {
1908
- border-color: #bbb !important;
1909
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1910
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1911
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1912
- }
1913
- .textarea:focus,
1914
- .ot-metabox-wrapper textarea:focus {
1915
- border-color: #999 !important;
1916
- }
1917
-
1918
- @media only screen and (max-width: 1105px) {
1919
- .type-textarea .description, .type-textarea .format-setting-inner {
1920
- width: 100%;
1921
- }
1922
- }
1923
-
1924
- /* --------------------------------------------------
1925
- :: Setting Item with Drag & Drop
1926
- ---------------------------------------------------*/
1927
- .option-tree-setting-wrap {
1928
- margin-top: 0px;
1929
- }
1930
- .option-tree-setting-wrap li {
1931
- margin: 5px 0px;
1932
- }
1933
- .option-tree-setting {
1934
- border: 1px solid #ccc;
1935
- overflow: hidden;
1936
- position: relative;
1937
- -webkit-border-radius: 2px;
1938
- -moz-border-radius: 2px;
1939
- border-radius: 2px;
1940
- }
1941
- .option-tree-setting:hover {
1942
- border-color: #999;
1943
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1944
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1945
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1946
- }
1947
- .option-tree-setting a {
1948
- text-decoration: none;
1949
- }
1950
- .option-tree-setting .open {
1951
- background: #fafafa;
1952
- line-height: 21px;
1953
- height: 21px;
1954
- padding: 10px 100px 10px 10px;
1955
- display: block;
1956
- }
1957
- .option-tree-sortable .open {
1958
- cursor: move;
1959
- }
1960
- .ui-state-disabled .option-tree-setting .open {
1961
- cursor: default;
1962
- }
1963
- .option-tree-setting .open:hover {
1964
- background: #fafafa;
1965
- }
1966
- .option-tree-setting .open:hover:before {
1967
- color: #999;
1968
- content: "\f142";
1969
- left: 4px;
1970
- font-family: "option-tree-font";
1971
- speak: none;
1972
- font-size: 14px;
1973
- font-style: normal;
1974
- font-weight: normal;
1975
- font-variant: normal;
1976
- text-transform: none;
1977
- line-height: 1;
1978
- position: absolute;
1979
- top: 14px;
1980
- -webkit-font-smoothing: antialiased;
1981
- -moz-osx-font-smoothing: grayscale;
1982
- }
1983
- .option-tree-setting.is-section .open:hover:before {
1984
- color: #000;
1985
- }
1986
- .button-section {
1987
- position: absolute;
1988
- right: 0px;
1989
- top: 1px;
1990
- }
1991
- .option-tree-setting.is-section {
1992
- border: 1px solid #000;
1993
- }
1994
- .option-tree-setting.is-section .option-tree-setting-body,
1995
- .option-tree-setting.is-section .option-tree-ui-button {
1996
- border-right-color: #000 !important;
1997
- }
1998
- .option-tree-setting.is-section .open {
1999
- background: #333;
2000
- color: #bbb;
2001
- }
2002
- .format-setting .ui-sortable-helper .option-tree-setting .open {
2003
- background: #fff;
2004
- }
2005
- .option-tree-setting.is-section .open:hover,
2006
- .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2007
- background: #333;
2008
- }
2009
- /* light */
2010
- .admin-color-light .option-tree-setting.is-section,
2011
- .admin-color-light .option-tree-setting.is-section .option-tree-setting-body,
2012
- .admin-color-light .option-tree-setting.is-section .option-tree-ui-button {
2013
- border-color: #3c3c3c !important;
2014
- }
2015
- .admin-color-light .option-tree-setting.is-section .open:hover:before {
2016
- color: #3c3c3c;
2017
- }
2018
- .admin-color-light .option-tree-setting.is-section .open {
2019
- background: #888;
2020
- color: #fff;
2021
- }
2022
- .admin-color-light .option-tree-setting.is-section .open:hover,
2023
- .admin-color-light .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2024
- background: #888;
2025
- }
2026
- /* blue */
2027
- .admin-color-blue .option-tree-setting.is-section,
2028
- .admin-color-blue .option-tree-setting.is-section .option-tree-setting-body,
2029
- .admin-color-blue .option-tree-setting.is-section .option-tree-ui-button {
2030
- border-color: #002b39 !important;
2031
- }
2032
- .admin-color-blue .option-tree-setting.is-section .open:hover:before {
2033
- color: #002b39;
2034
- }
2035
- .admin-color-blue .option-tree-setting.is-section .open {
2036
- background: #52accc;
2037
- color: #fff;
2038
- }
2039
- .admin-color-blue .option-tree-setting.is-section .open:hover,
2040
- .admin-color-blue .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2041
- background: #52accc;
2042
- }
2043
- /* coffee */
2044
- .admin-color-coffee .option-tree-setting.is-section,
2045
- .admin-color-coffee .option-tree-setting.is-section .option-tree-setting-body,
2046
- .admin-color-coffee .option-tree-setting.is-section .option-tree-ui-button {
2047
- border-color: #0f0e0d !important;
2048
- }
2049
- .admin-color-coffee .option-tree-setting.is-section .open:hover:before {
2050
- color: #0f0e0d;
2051
- }
2052
- .admin-color-coffee .option-tree-setting.is-section .open {
2053
- background: #59524c;
2054
- color: #c7cbc9;
2055
- }
2056
- .admin-color-coffee .option-tree-setting.is-section .open:hover,
2057
- .admin-color-coffee .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2058
- background: #59524c;
2059
- }
2060
- /* ectoplasm */
2061
- .admin-color-ectoplasm .option-tree-setting.is-section,
2062
- .admin-color-ectoplasm .option-tree-setting.is-section .option-tree-setting-body,
2063
- .admin-color-ectoplasm .option-tree-setting.is-section .option-tree-ui-button {
2064
- border-color: #181220 !important;
2065
- }
2066
- .admin-color-ectoplasm .option-tree-setting.is-section .open:hover:before {
2067
- color: #181220;
2068
- }
2069
- .admin-color-ectoplasm .option-tree-setting.is-section .open {
2070
- background: #523f6d;
2071
- color: #c6c6d3;
2072
- }
2073
- .admin-color-ectoplasm .option-tree-setting.is-section .open:hover,
2074
- .admin-color-ectoplasm .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2075
- background: #523f6d;
2076
- }
2077
- /* midnight */
2078
- .admin-color-midnight .option-tree-setting.is-section,
2079
- .admin-color-midnight .option-tree-setting.is-section .option-tree-setting-body,
2080
- .admin-color-midnight .option-tree-setting.is-section .option-tree-ui-button {
2081
- border-color: #090a0b !important;
2082
- }
2083
- .admin-color-midnight .option-tree-setting.is-section .open:hover:before {
2084
- color: #090a0b;
2085
- }
2086
- .admin-color-midnight .option-tree-setting.is-section .open {
2087
- background: #363b3f;
2088
- color: #f1f2f3;
2089
- }
2090
- .admin-color-midnight .option-tree-setting.is-section .open:hover,
2091
- .admin-color-midnight .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2092
- background: #363b3f;
2093
- }
2094
- /* ocean */
2095
- .admin-color-ocean .option-tree-setting.is-section,
2096
- .admin-color-ocean .option-tree-setting.is-section .option-tree-setting-body,
2097
- .admin-color-ocean .option-tree-setting.is-section .option-tree-ui-button {
2098
- border-color: #39464a !important;
2099
- }
2100
- .admin-color-ocean .option-tree-setting.is-section .open:hover:before {
2101
- color: #39464a;
2102
- }
2103
- .admin-color-ocean .option-tree-setting.is-section .open {
2104
- background: #738e96;
2105
- color: #f1fcff;
2106
- }
2107
- .admin-color-ocean .option-tree-setting.is-section .open:hover,
2108
- .admin-color-ocean .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2109
- background: #738e96;
2110
- }
2111
- /* sunrise */
2112
- .admin-color-sunrise .option-tree-setting.is-section,
2113
- .admin-color-sunrise .option-tree-setting.is-section .option-tree-setting-body,
2114
- .admin-color-sunrise .option-tree-setting.is-section .option-tree-ui-button {
2115
- border-color: #8a322a !important;
2116
- }
2117
- .admin-color-sunrise .option-tree-setting.is-section .open:hover:before {
2118
- color: #8a322a;
2119
- }
2120
- .admin-color-sunrise .option-tree-setting.is-section .open {
2121
- background: #da4f41;
2122
- color: #fff;
2123
- }
2124
- .admin-color-sunrise .option-tree-setting.is-section .open:hover,
2125
- .admin-color-sunrise .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2126
- background: #da4f41;
2127
- }
2128
- .ui-state-highlight {
2129
- border: 1px dashed #ccc;
2130
- display: block;
2131
- -webkit-border-radius: 2px;
2132
- -moz-border-radius: 2px;
2133
- border-radius: 2px;
2134
- }
2135
- .option-tree-setting-body {
2136
- background: #fff;
2137
- border-top: 1px solid #ccc;
2138
- display: none;
2139
- padding: 10px;
2140
- -webkit-border-bottom-right-radius: 2px;
2141
- -webkit-border-bottom-left-radius: 2px;
2142
- -moz-border-radius-bottomright: 2px;
2143
- -moz-border-radius-bottomleft: 2px;
2144
- border-bottom-right-radius: 2px;
2145
- border-bottom-left-radius: 2px;
2146
- }
2147
- li ul .format-setting-wrap {
2148
- padding: 0 0 10px 0;
2149
- }
2150
- li ul .format-setting-label {
2151
- border: none;
2152
- padding: 0px;
2153
- margin: 0px;
2154
- }
2155
-
2156
- /* --------------------------------------------------
2157
- :: Layouts
2158
- ---------------------------------------------------*/
2159
- #option_tree_layouts {
2160
- display: none;
2161
- padding-top: 12px;
2162
- }
2163
- #option-tree-options-layouts-form {
2164
- left: 13px;
2165
- position: absolute;
2166
- top: 30px;
2167
- z-index: 10;
2168
- }
2169
- .option-tree-save-layout {
2170
- float: left;
2171
- padding: 10px 0;
2172
- }
2173
- .option-tree-save-layout.active-layout {
2174
- padding-left: 10px;
2175
- }
2176
- .option-tree-save-layout .widefat {
2177
- float: left;
2178
- width: 128px !important;
2179
- margin: 0;
2180
- }
2181
- .option-tree-active-layout {
2182
- border-right: 1px solid #ccc;
2183
- float: left;
2184
- padding: 10px 10px 10px 0;
2185
- min-width: 126px;
2186
- }
2187
- .button.save-layout {
2188
- margin: 0 0 0 10px !important;
2189
- }
2190
- .option-tree-layout-activate {
2191
- text-indent: -9999px;
2192
- }
2193
- .option-tree-layout-activate .icon:before {
2194
- content: "\f096";
2195
- position: relative;
2196
- top: 1px;
2197
- }
2198
- .option-tree-layout-activate.active .icon:before {
2199
- content: "\f046";
2200
- padding-left: 1px;
2201
- }
2202
-
2203
- /* --------------------------------------------------
2204
- :: Option Group
2205
- ---------------------------------------------------*/
2206
- .ot-option-group {
2207
- float: left;
2208
- padding-right: 5px;
2209
- position: relative;
2210
- width: 20%;
2211
- box-sizing: border-box;
2212
- }
2213
- .ot-option-group--three-fourths {
2214
- width: 75%;
2215
- }
2216
- .ot-option-group--two-thirds {
2217
- width: 66.6%;
2218
- }
2219
- .ot-option-group--one-half {
2220
- width: 50%;
2221
- }
2222
- .ot-option-group--one-third {
2223
- width: 33.3%;
2224
- }
2225
- .ot-option-group--one-fourth {
2226
- width: 25%;
2227
- }
2228
- .ot-option-group--one-fifth {
2229
- width: 20%;
2230
- }
2231
- .ot-option-group--one-sixth {
2232
- width: 16.6%;
2233
- }
2234
- .ot-option-group--one-eighth {
2235
- width: 12.5%;
2236
- }
2237
- .ot-option-group--is-last {
2238
- padding-right: 0;
2239
- }
2240
- .ot-option-group--icon {
2241
- background: #fafafa;
2242
- border-right: 1px solid #ccc;
2243
- display: inline-block;
2244
- font-size: 14px;
2245
- line-height: 14px;
2246
- padding: 6px 6px 7px;
2247
- position: absolute;
2248
- text-align: center;
2249
- top: 1px;
2250
- left: 1px;
2251
- width: 14px;
2252
- z-index: 10;
2253
- }
2254
- .ot-icon-circle.ot-option-group--icon:before {
2255
- left: 1px;
2256
- position: relative;
2257
- -webkit-filter: blur(1px);
2258
- -moz-filter: blur(1px);
2259
- -ms-filter: blur(1px);
2260
- -o-filter: blur(1px);
2261
- filter: blur(1px);
2262
- }
2263
- .ot-option-group--icon + input.option-tree-ui-input {
2264
- padding-left: 34px !important;
2265
- margin-right: 5px;
2266
- }
2267
- .ot-option-group--checkbox {
2268
- float: left;
2269
- padding-top: 2px;
2270
- padding-right: 10px;
2271
- width: auto;
2272
- }
2273
- #post-body .ot-option-group--checkbox p {
2274
- color: #a9a9a9;
2275
- float: left;
2276
- margin: 1px 0 0.3em 0 !important;
2277
- }
2278
- @media screen and ( min-width: 783px ) {
2279
- #post-body .ot-option-group--checkbox p input {
2280
- margin-top: 0px !important;
2281
- }
2282
- }
2283
- @media screen and ( max-width: 1020px ) {
2284
- .ot-option-group--one-fourth,
2285
- .ot-option-group--one-fifth,
2286
- .ot-option-group--one-sixth,
2287
- .ot-option-group--one-eighth {
2288
- width: 33.3%;
2289
- }
2290
- .ot-option-group--checkbox {
2291
- width: 100%;
2292
- }
2293
- }
2294
- @media screen and ( max-width: 782px ) {
2295
- .ot-option-group {
2296
- width: 50%;
2297
- }
2298
- .ot-option-group--three-fourths,
2299
- .ot-option-group--two-thirds,
2300
- .ot-option-group--one-half {
2301
- width: 100%;
2302
- }
2303
- .ot-option-group--checkbox {
2304
- padding-top: 0.3em;
2305
- }
2306
- }
2307
- .ot-option-group .select-wrapper {
2308
- width: 100%;
2309
- }
2310
-
2311
- /* --------------------------------------------------
2312
- :: Select
2313
- ---------------------------------------------------*/
2314
- .select-wrapper {
2315
- background: #fff url(../images/ot-select.png) no-repeat right center;
2316
- border: 1px solid #ccc;
2317
- display: block;
2318
- float: left;
2319
- font-size: 12px;
2320
- height: 29px;
2321
- margin: 0 5px 5px 0;
2322
- max-width: 100%;
2323
- width: auto;
2324
- -webkit-border-radius: 2px;
2325
- -moz-border-radius: 2px;
2326
- border-radius: 2px;
2327
- -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2328
- -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2329
- box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2330
- -webkit-box-sizing: border-box;
2331
- -moz-box-sizing: border-box;
2332
- box-sizing: border-box;
2333
- }
2334
- .select-wrapper:hover {
2335
- background-image: url(../images/ot-select-hover.png);
2336
- border-color: #999;
2337
- }
2338
- select.option-tree-ui-select {
2339
- cursor: pointer;
2340
- filter: alpha(opacity= 0);
2341
- font-size: 14px;
2342
- height: 29px;
2343
- margin: 0;
2344
- max-width: 100%;
2345
- -moz-opacity: 0;
2346
- opacity: 0;
2347
- padding: 0 !important;
2348
- position: relative;
2349
- width: inherit;
2350
- z-index: 4;
2351
- min-width: 118px;
2352
- }
2353
-
2354
- select.option-tree-ui-select option {
2355
- padding: 3px 15px !important;
2356
- }
2357
- .select-wrapper span {
2358
- height: 27px;
2359
- line-height: 27px;
2360
- overflow: hidden;
2361
- padding-left: 7px;
2362
- padding-right: 27px;
2363
- position: absolute;
2364
- z-index: 2;
2365
- }
2366
- #option-tree-options-layouts-form .select-wrapper {
2367
- margin: 0px;
2368
- }
2369
- #option-tree-options-layouts-form select.option-tree-ui-select {
2370
- min-width: 124px;
2371
- }
2372
- .type-measurement select.option-tree-ui-select {
2373
- min-width: 73px !important;
2374
- }
2375
- .type-measurement .select-wrapper {
2376
- margin-right: 0;
2377
- position: absolute;
2378
- right: 0px;
2379
- top: 0px;
2380
- }
2381
-
2382
- /* FireFox */
2383
- @-moz-document url-prefix() {
2384
- #option-tree-options-layouts-form .select-wrapper {
2385
- left: 250px;
2386
- }
2387
- }
2388
-
2389
- /* --------------------------------------------------
2390
- :: Measurement
2391
- ---------------------------------------------------*/
2392
- .option-tree-ui-measurement-input-wrap {
2393
- margin-right: 80px;
2394
- }
2395
-
2396
- /* --------------------------------------------------
2397
- :: Checkbox & Radio
2398
- ---------------------------------------------------*/
2399
- .format-setting.type-checkbox input,
2400
- .format-setting.type-radio input {
2401
- float: left;
2402
- margin: 2px 5px 0 1px;
2403
- }
2404
- .format-setting.type-checkbox label,
2405
- .format-setting.type-radio label {
2406
- float: left;
2407
- max-width: 90%;
2408
- padding: 0px;
2409
- }
2410
- #option-tree-settings-api .format-setting.type-checkbox p,
2411
- #option-tree-settings-api .format-setting.type-radio p {
2412
- float: left;
2413
- margin: 0.5em 0 !important;
2414
- width: 100%;
2415
- }
2416
- @media screen and ( max-width: 782px ) {
2417
- .format-setting.type-checkbox,
2418
- .format-setting.type-radio {
2419
- padding-top: 0.3em;
2420
- }
2421
- }
2422
-
2423
- /* --------------------------------------------------
2424
- :: Radio Images
2425
- ---------------------------------------------------*/
2426
- .type-radio-image .option-tree-ui-radio-images {
2427
- float: left;
2428
- margin: 0 10px 10px 0px;
2429
- }
2430
-
2431
- .type-radio-image .option-tree-ui-radio-images img {
2432
- background: #c2c2c2;
2433
- border: 1px solid #ccc;
2434
- cursor: pointer;
2435
- opacity: 0.8;
2436
- padding: 5px;
2437
- -webkit-border-radius: 2px;
2438
- -moz-border-radius: 2px;
2439
- border-radius: 2px;
2440
- }
2441
- .type-radio-image .option-tree-ui-radio-images img.option-tree-ui-radio-image-selected,
2442
- .type-radio-image .option-tree-ui-radio-images img:hover {
2443
- border-color: #464646;
2444
- opacity: 1;
2445
- -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2446
- -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2447
- box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2448
- }
2449
-
2450
- /* --------------------------------------------------
2451
- :: Social Links
2452
- ---------------------------------------------------*/
2453
- .type-social-links input.option-tree-ui-input {
2454
- margin-top: 5px;
2455
- }
2456
-
2457
- /* --------------------------------------------------
2458
- :: Numeric Slider
2459
- ---------------------------------------------------*/
2460
- .type-numeric-slider .format-setting-inner {
2461
- background: #fcfcfc;
2462
- border: 1px solid #ccc;
2463
- min-height: 41px;
2464
- padding: 5px;
2465
- -webkit-box-sizing: border-box;
2466
- -moz-box-sizing: border-box;
2467
- box-sizing: border-box;
2468
- -webkit-border-radius: 2px;
2469
- -moz-border-radius: 2px;
2470
- border-radius: 2px;
2471
- }
2472
- .ot-numeric-slider-wrap {
2473
- margin: 0 96px 0 0;
2474
- }
2475
- .ot-numeric-slider-wrap .ot-numeric-slider-helper-input {
2476
- position: absolute;
2477
- right: 5px;
2478
- text-align: center;
2479
- top: 5px;
2480
- width: 90px !important;
2481
- }
2482
- .ot-numeric-slider.ui-slider {
2483
- background: #fff;
2484
- border: 1px solid #ccc;
2485
- margin: 8px 8px 0 8px;
2486
- position: relative;
2487
- -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2488
- -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2489
- box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2490
- -webkit-border-radius: 2px;
2491
- -moz-border-radius: 2px;
2492
- border-radius: 2px;
2493
- }
2494
- .ot-numeric-slider.ui-slider-horizontal {
2495
- height: 11px;
2496
- }
2497
- .ot-numeric-slider.ui-slider .ui-slider-handle {
2498
- border: 1px solid #000;
2499
- color: #555;
2500
- cursor: pointer;
2501
- display: block;
2502
- height: 27px;
2503
- margin: -9px -8px;
2504
- outline: 0;
2505
- position: absolute;
2506
- width: 16px;
2507
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2508
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2509
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2510
- -webkit-border-radius: 2px;
2511
- -moz-border-radius: 2px;
2512
- border-radius: 2px;
2513
- }
2514
- /* default */
2515
- .ot-numeric-slider.ui-slider .ui-slider-handle {
2516
- background: #333;
2517
- border-color: #000;
2518
- }
2519
- .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2520
- .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2521
- background: #444;
2522
- border-color: #111;
2523
- }
2524
- /* light */
2525
- .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle {
2526
- background: #888;
2527
- border-color: #3c3c3c;
2528
- }
2529
- .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2530
- .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2531
- background: #999;
2532
- border-color: #777;
2533
- }
2534
- /* blue */
2535
- .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle {
2536
- background: #52accc;
2537
- border-color: #002b39;
2538
- }
2539
- .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2540
- .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2541
- background: #5dc2e6;
2542
- border-color: #006484;
2543
- }
2544
- /* coffee */
2545
- .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle {
2546
- background: #59524c;
2547
- border-color: #0f0e0d;
2548
- }
2549
- .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2550
- .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2551
- background: #cca588;
2552
- border-color: #675f58;
2553
- }
2554
- /* ectoplasm */
2555
- .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle {
2556
- background: #523f6d;
2557
- border-color: #181220;
2558
- }
2559
- .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2560
- .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2561
- background: #a3b542;
2562
- border-color: #644d85;
2563
- }
2564
- /* midnight */
2565
- .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle {
2566
- background: #363b3f;
2567
- border-color: #090a0b;
2568
- }
2569
- .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2570
- .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2571
- background: #ed543f;
2572
- border-color: #a0382a;
2573
- }
2574
- /* ocean */
2575
- .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle {
2576
- background: #738e96;
2577
- border-color: #39464a;
2578
- }
2579
- .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2580
- .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2581
- background: #9ab8a0;
2582
- border-color: #5a6c5e;
2583
- }
2584
- /* sunrise */
2585
- .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle {
2586
- background: #da4f41;
2587
- border-color: #8a322a;
2588
- }
2589
- .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2590
- .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2591
- background: #e88436;
2592
- border-color: #e75546;
2593
- }
2594
-
2595
- /* --------------------------------------------------
2596
- :: Colorpicker
2597
- ---------------------------------------------------*/
2598
- .option-tree-ui-colorpicker-input-wrap {
2599
- float: left;
2600
- }
2601
- .hide-color-picker {
2602
-
2603
- }
2604
- .option-tree-ui-colorpicker-input-wrap .option-tree-ui-colorpicker-label {
2605
- height: 30px;
2606
- line-height: 30px;
2607
- margin-right: 10px;
2608
- display: block;
2609
- }
2610
- .type-link-color .option-tree-ui-colorpicker-input-wrap {
2611
- margin-right: 20px;
2612
- }
2613
- .option-tree-ui-colorpicker-input-wrap .wp-color-picker,
2614
- .option-tree-ui-colorpicker-input-wrap .wp-picker-default,
2615
- .option-tree-ui-colorpicker-input-wrap .wp-picker-clear {
2616
- border-color: #ccc;
2617
- font-size: 12px !important;
2618
- height: 29px !important;
2619
- line-height: 27px !important;
2620
- margin-top: 0px;
2621
- -webkit-border-radius: 2px;
2622
- -moz-border-radius: 2px;
2623
- border-radius: 2px;
2624
- -webkit-box-shadow: none;
2625
- -moz-box-shadow: none;
2626
- box-shadow: none;
2627
- }
2628
- .option-tree-ui-colorpicker-input-wrap .wp-color-picker {
2629
- margin: 0 0 5px 0 !important;
2630
- }
2631
- .option-tree-ui-colorpicker-input-wrap .wp-color-result {
2632
- height: 27px;
2633
- outline: 0;
2634
- margin: 0 5px 5px 0px;
2635
- top: 0px;
2636
- -webkit-box-shadow: none;
2637
- -moz-box-shadow: none;
2638
- box-shadow: none;
2639
- }
2640
- .option-tree-ui-colorpicker-input-wrap .wp-color-result:after {
2641
- line-height: 27px;
2642
- }
2643
- .option-tree-ui-colorpicker-input-wrap .wp-picker-container .iris-picker {
2644
- border-color: #ccc;
2645
- margin: 0px 5px 5px 0;
2646
- -webkit-border-radius: 2px;
2647
- -moz-border-radius: 2px;
2648
- border-radius: 2px;
2649
- }
2650
- @media screen and ( max-width: 782px ) {
2651
- .option-tree-ui-colorpicker-input-wrap .wp-color-picker {
2652
- padding: 3px 5px !important;
2653
- }
2654
- .option-tree-ui-colorpicker-input-wrap .wp-picker-clear,
2655
- .option-tree-ui-colorpicker-input-wrap .wp-picker-default {
2656
- margin-top: 4px;
2657
- padding: 0 8px 1px !important;
2658
- }
2659
- }
2660
-
2661
- /* --------------------------------------------------
2662
- :: Colorpicker Opacity (Derivative work of the Codestar WP Color Picker.)
2663
- ---------------------------------------------------*/
2664
- .option-tree-opacity-wrap {
2665
- background-color: #fff;
2666
- border: 1px solid #ccc;
2667
- border-top: none;
2668
- border-radius: 0 0 2px 2px;
2669
- direction: ltr;
2670
- display: none;
2671
- padding: 10px;
2672
- position: relative;
2673
- top: -6px;
2674
- width: 235px;
2675
- }
2676
- .option-tree-opacity-slider {
2677
- left: 10px;
2678
- position: absolute;
2679
- width: 171px;
2680
- margin-left: 3px;
2681
- height: 28px;
2682
- }
2683
- .option-tree-opacity-slider .ui-slider-handle {
2684
- position: absolute;
2685
- top: -3px;
2686
- bottom: -3px;
2687
- z-index: 5;
2688
- border-color: #aaa;
2689
- border-style: solid;
2690
- border-width: 4px 3px;
2691
- width: 6px;
2692
- height: 26px;
2693
- margin: 0 -3px;
2694
- background: none;
2695
- cursor: ew-resize;
2696
- opacity: 0.9;
2697
- border-radius: 4px;
2698
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
2699
- }
2700
- .option-tree-opacity-slider .ui-slider-handle:before {
2701
- content: " ";
2702
- position: absolute;
2703
- left: -2px;
2704
- right: -2px;
2705
- top: -3px;
2706
- bottom: -3px;
2707
- border: 2px solid #fff;
2708
- border-radius: 3px;
2709
- }
2710
- .option-tree-opacity-slider-offset {
2711
- height: 28px;
2712
- width: 183px;
2713
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC);
2714
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.4) inset;
2715
- border-radius: 2px;
2716
- }
2717
- .option-tree-opacity-text {
2718
- position: absolute;
2719
- top: 15px;
2720
- left: 215px;
2721
- width: 30px;
2722
- font-size: 12px;
2723
- text-align: center;
2724
- }
2725
-
2726
- /* --------------------------------------------------
2727
- :: Google Font
2728
- ---------------------------------------------------*/
2729
- .type-google-font {
2730
-
2731
- }
2732
- .type-google-font-group-clone {
2733
- display: none;
2734
- }
2735
- .type-google-font-group {
2736
- float: left;
2737
- margin-bottom: 20px;
2738
- width: 100%;
2739
- }
2740
- .js-remove-google-font.option-tree-ui-button.button {
2741
- margin-left: 0;
2742
- margin-top: 0;
2743
- }
2744
-
2745
- /* --------------------------------------------------
2746
- :: OptionTree UI Buttons
2747
- ---------------------------------------------------*/
2748
- .option-tree-ui-button.button {
2749
- float: left;
2750
- font-size: 12px !important;
2751
- line-height: 27px !important;
2752
- height: 29px !important;
2753
- margin: 5px;
2754
- min-width: 40px;
2755
- padding: 0 10px 1px !important;
2756
- }
2757
- .option-tree-ui-button:active,
2758
- .option-tree-ui-button:hover,
2759
- .option-tree-ui-button:focus {
2760
- outline: 0;
2761
- }
2762
- .option-tree-ui-button.hidden {
2763
- display: none;
2764
- }
2765
- .option-tree-ui-button.button-secondary {
2766
- background: #b73b27;
2767
- border-color: #7f291b;
2768
- color: #fff;
2769
- text-shadow: none;
2770
- -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2771
- -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2772
- box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2773
- }
2774
- .option-tree-ui-button.button-secondary.hover,
2775
- .option-tree-ui-button.button-secondary:hover,
2776
- .option-tree-ui-button.button-secondary.focus,
2777
- .option-tree-ui-button.button-secondary:focus {
2778
- background: #9b3221;
2779
- border-color: #7f291b;
2780
- color: #fff;
2781
- -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6);
2782
- -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2783
- box-shadow: inset 0 1px 0 rgba(229,134,119,0.6);
2784
- }
2785
- .option-tree-ui-button.button-secondary.focus,
2786
- .option-tree-ui-button.button-secondary:focus {
2787
- border-color: #4f160d;
2788
- -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2789
- -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2790
- box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2791
- }
2792
- .option-tree-ui-button.button-secondary.active,
2793
- .option-tree-ui-button.button-secondary.active:hover,
2794
- .option-tree-ui-button.button-secondary.active:focus,
2795
- .option-tree-ui-button.button-secondary:active {
2796
- background: #b73b27;
2797
- border-color: #7f291b;
2798
- color: rgba(255,255,255,0.95);
2799
- -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2800
- -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2801
- box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2802
- vertical-align: top;
2803
- }
2804
- .option-tree-ui-button.right {
2805
- float: right;
2806
- }
2807
- .option-tree-ui-button.hug-left {
2808
- margin-left: 0px;
2809
- }
2810
- .option-tree-ui-button.hug-right {
2811
- margin-right: 0px;
2812
- }
2813
- .option-tree-ui-button.pad {
2814
- padding: 0px 21px;
2815
- }
2816
- .option-tree-ui-button.left-item {
2817
- margin: 5px 0 5px 5px;
2818
- -webkit-border-top-right-radius: 0px;
2819
- -webkit-border-bottom-right-radius: 0px;
2820
- -moz-border-radius-topright: 0px;
2821
- -moz-border-radius-bottomright: 0px;
2822
- border-top-right-radius: 0px;
2823
- border-bottom-right-radius: 0px;
2824
- }
2825
- .option-tree-ui-button.center-item {
2826
- margin: 5px 0 5px -1px;
2827
- -webkit-border-radius: 0px;
2828
- -moz-border-radius: 0px;
2829
- border-radius: 0px;
2830
- }
2831
- .option-tree-ui-button.right-item {
2832
- margin: 5px 5px 5px -1px;
2833
- -webkit-border-top-left-radius: 0px;
2834
- -webkit-border-bottom-left-radius: 0px;
2835
- -moz-border-radius-topleft: 0px;
2836
- -moz-border-radius-bottomleft: 0px;
2837
- border-top-left-radius: 0px;
2838
- border-bottom-left-radius: 0px;
2839
- }
2840
- .option-tree-ui-buttons {
2841
- background: #fff;
2842
- border: 1px solid #ccc;
2843
- margin: 11px 5px 0 2px;
2844
- min-width: 523px;
2845
- overflow: hidden;
2846
- padding: 5px;
2847
- position: relative;
2848
- -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2849
- -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2850
- box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2851
- -webkit-border-radius: 2px;
2852
- -moz-border-radius: 2px;
2853
- border-radius: 2px;
2854
- }
2855
- .option-tree-ui-buttons.alt {
2856
- background: #f5f5f5;
2857
- border-color: #dfdfdf;
2858
- }
2859
- .option-tree-ui-buttons:before,
2860
- .option-tree-ui-buttons:after {
2861
- content: "\0020";
2862
- display: block;
2863
- height: 0;
2864
- visibility: hidden;
2865
- }
2866
- .option-tree-ui-buttons:after {
2867
- clear: both;
2868
- }
2869
- .option-tree-ui-buttons {
2870
- zoom: 1;
2871
- }
2872
- button.reset-settings {
2873
- position: relative;
2874
- top: -45px;
2875
- left: 8px;
2876
- }
2877
-
2878
- /* --------------------------------------------------
2879
- :: OptionTree UI Button Icons
2880
- ---------------------------------------------------*/
2881
- .option-tree-ui-button .icon {
2882
- color: #3a3a3a;
2883
- display: inline-block;
2884
- float: left;
2885
- font-size: 20px;
2886
- height: 20px;
2887
- margin-top: 3px;
2888
- opacity: 0.9;
2889
- overflow: hidden;
2890
- text-align: center;
2891
- text-indent: 0;
2892
- width: 18px;
2893
- }
2894
- button.option-tree-ui-button .icon {
2895
- margin-top: -3px;
2896
- }
2897
- .option-tree-ui-button.light .icon {
2898
- color: #fff;
2899
- opacity: 0.9;
2900
- }
2901
- .option-tree-ui-button.active .icon,
2902
- .option-tree-ui-button:hover .icon {
2903
- opacity: 1;
2904
- }
2905
- .option-tree-ui-button .icon.right-label {
2906
- margin-right: 10px;
2907
- }
2908
- .option-tree-ui-button .icon.left-label {
2909
- margin-left: 10px;
2910
- float: right;
2911
- }
2912
- .option-tree-ui-button .upload {
2913
- background-position: -0px -0px;
2914
- }
2915
- .option-tree-ui-button .trash-can {
2916
- background-position: -18px -0px;
2917
- }
2918
- .option-tree-ui-button .pencil,
2919
- .option-tree-ui-button .check {
2920
- background-position: -36px -0px;
2921
- }
2922
- .option-tree-ui-button:hover .pencil,
2923
- .option-tree-ui-button:hover .check,
2924
- .option-tree-ui-button.active .pencil,
2925
- .option-tree-ui-button.active .check {
2926
- background-position: -54px -0px;
2927
- }
2928
-
2929
- /* --------------------------------------------------
2930
- :: WP 3.8 Fixes (via Github @AlxMedia)
2931
- ---------------------------------------------------*/
2932
- #option-tree-settings-api #poststuff,
2933
- #option-tree-settings-api #post-body-content {
2934
- min-width: 0;
2935
- }
2936
- #option-tree-settings-api #poststuff h3 {
2937
- font-family: inherit !important;
2938
- }
2939
- #option-tree-settings-api .postbox {
2940
- -webkit-box-shadow: none;
2941
- -moz-box-shadow: none;
2942
- box-shadow: none;
2943
- }
2944
- #option-tree-settings-api p input[type="checkbox"],
2945
- #option-tree-settings-api p input[type="radio"] {
2946
- margin-top: 2px;
2947
- }
2948
- #option-tree-settings-api .format-setting.type-checkbox p,
2949
- #option-tree-settings-api .format-setting.type-radio p {
2950
- margin: 0.3em 0 !important;
2951
- }
2952
- input.option-tree-ui-upload-input,
2953
- input.option-tree-ui-input {
2954
- padding-top: 5px;
2955
- padding-bottom: 5px;
2956
- }
2957
- @media screen and ( max-width: 782px ) {
2958
- #option-tree-settings-api p input[type="checkbox"],
2959
- #option-tree-settings-api p input[type="radio"] {
2960
- margin-top: -3px;
2961
- }
2962
- }
2963
-
2964
- /* --------------------------------------------------
2965
- :: Gallery
2966
- ---------------------------------------------------*/
2967
- ul.ot-gallery-list {
2968
- float: left;
2969
- margin: 0;
2970
- width: 100%;
2971
- }
2972
- ul.ot-gallery-list li {
2973
- background: none repeat scroll 0 0 white;
2974
- border: 1px solid #bbb;
2975
- float: left;
2976
- margin: 0px 10px 10px 0;
2977
- padding: 4px;
2978
- -webkit-border-radius: 2px;
2979
- -moz-border-radius: 2px;
2980
- border-radius: 2px;
2981
- }
2982
- ul.ot-gallery-list li img {
2983
- display: block;
2984
- margin: 0;
2985
- }
2986
-
2987
- .ot-gallery-buttons {
2988
- float: left;
2989
- width: 100%;
2990
- }
2991
- .ot-gallery-buttons a.option-tree-ui-button {
2992
- margin-top: 0px;
2993
- margin-bottom: 0px;
2994
- }
2995
-
2996
- /* --------------------------------------------------
2997
- :: Google Fonts
2998
- ---------------------------------------------------*/
2999
- .option-tree-google-font-family,
3000
- .option-tree-google-font-variants,
3001
- .option-tree-google-font-subsets {
3002
- float: left;
3003
- width: 20%;
3004
- }
3005
- .option-tree-google-font-family {
3006
- width: 100%;
3007
- }
3008
- #option-tree-settings-api p.checkbox-wrap,
3009
- #post-body .ot-metabox-panels p.checkbox-wrap {
3010
- display: block;
3011
- float: left;
3012
- margin: 0.3em 0 !important;
3013
- width: 100%;
3014
- }
3015
- @media screen and ( max-width: 1020px ) {
3016
- .option-tree-google-font-variants,
3017
- .option-tree-google-font-subsets {
3018
- width: 33%;
3019
- }
3020
- }
3021
- @media screen and ( max-width: 782px ) {
3022
- .option-tree-google-font-variants,
3023
- .option-tree-google-font-subsets {
3024
- width: 50%;
3025
- }
3026
- }
3027
-
3028
- /* --------------------------------------------------
3029
- :: On/Off Switch
3030
- ---------------------------------------------------*/
3031
- .on-off-switch .slide-button {
3032
- display: none;
3033
- }
3034
- @media only screen {
3035
- .on-off-switch {
3036
- background-color: #fff;
3037
- border: 1px solid #ccc;
3038
- color: #333;
3039
- display: block;
3040
- font-size: 12px;
3041
- font-weight: normal;
3042
- height: 27px;
3043
- margin: 2px 1px;
3044
- position: relative;
3045
- padding: 0;
3046
- text-align: center;
3047
- text-transform: uppercase;
3048
- width: 100px;
3049
- -webkit-border-radius: 2px;
3050
- -moz-border-radius: 2px;
3051
- border-radius: 2px;
3052
- -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3053
- -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3054
- box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3055
- }
3056
- .on-off-switch * {
3057
- -webkit-box-sizing: border-box;
3058
- -moz-box-sizing: border-box;
3059
- box-sizing: border-box;
3060
- }
3061
- .on-off-switch input {
3062
- position: absolute;
3063
- opacity: 0;
3064
- }
3065
- .on-off-switch label {
3066
- cursor: pointer;
3067
- float: left;
3068
- height: 27px;
3069
- line-height: 27px;
3070
- margin: 0;
3071
- position: relative;
3072
- text-align: center;
3073
- vertical-align: middle;
3074
- width: 50%;
3075
- z-index: 2;
3076
- }
3077
- .on-off-switch input:last-of-type + label {
3078
- color: #333;
3079
- }
3080
- .on-off-switch input:checked + label {
3081
- color: #333;
3082
- }
3083
- .on-off-switch input:last-of-type:checked + label {
3084
- color: #fff;
3085
- }
3086
- .on-off-switch input:focus + label {
3087
- outline: none;
3088
- }
3089
- .on-off-switch .slide-button {
3090
- background: #b2d27e;
3091
- border: 1px solid #7c9258;
3092
- display: block;
3093
- height: 29px;
3094
- left: -1px;
3095
- padding: 0;
3096
- position: absolute;
3097
- text-decoration: none;
3098
- top: -1px;
3099
- width: 51%;
3100
- z-index: 1;
3101
- -webkit-border-radius: 2px;
3102
- -moz-border-radius: 2px;
3103
- border-radius: 2px;
3104
- -webkit-box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3105
- -moz-box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3106
- box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3107
- -webkit-transition: all 0.2s ease-out;
3108
- -moz-transition: all 0.2s ease-out;
3109
- transition: all 0.2s ease-out;
3110
- }
3111
- .on-off-switch input:last-of-type:checked ~ .slide-button {
3112
- background: #b73b27;
3113
- border-color: #7f291b;
3114
- color: #fff;
3115
- left: 50%;
3116
- -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3117
- -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3118
- box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3119
- }
3120
- }
3121
- @media only screen and (-webkit-max-device-pixel-ratio: 2) and (max-device-width: 1280px) {
3122
- .on-off-switch {
3123
- -webkit-animation: webkitSiblingBugfix infinite 1s;
3124
- }
3125
- }
3126
- @-webkit-keyframes webkitSiblingBugfix {
3127
- from {
3128
- -webkit-transform: translate3d(0, 0, 0);
3129
- }
3130
- to {
3131
- -webkit-transform: translate3d(0, 0, 0);
3132
- }
3133
- }
3134
-
3135
- /* --------------------------------------------------
3136
- :: Simple Input Append & Prepend
3137
- ---------------------------------------------------*/
3138
- .ot-input-append,
3139
- .ot-input-prepend {
3140
- display: inline-block;
3141
- vertical-align: middle;
3142
- font-size: 0;
3143
- white-space: nowrap;
3144
- }
3145
- .ot-input-append input {
3146
- position: relative;
3147
- margin-bottom: 0;
3148
- *margin-left: 0;
3149
- vertical-align: top;
3150
- -webkit-border-radius: 0 2px 2px 0;
3151
- -moz-border-radius: 0 2px 2px 0;
3152
- border-radius: 0 2px 2px 0;
3153
- }
3154
- .ot-input-append input:focus,
3155
- .ot-input-prepend input:focus {
3156
- z-index: 2;
3157
- }
3158
- .ot-input-append .ot-add-on,
3159
- .ot-input-prepend .ot-add-on {
3160
- display: inline-block;
3161
- width: auto;
3162
- height: 27px;
3163
- line-height: 28px;
3164
- min-width: 16px;
3165
- padding: 0 6px;
3166
- font-size: 16px;
3167
- font-weight: normal;
3168
- text-align: center;
3169
- text-shadow: 0 1px 0 white;
3170
- background-color: #f7f7f7;
3171
- border: 1px solid #ccc;
3172
- }
3173
- .ot-input-prepend input {
3174
- border-left: 0 !important;
3175
- }
3176
- .ot-input-prepend .ot-add-on:first-child {
3177
- -webkit-border-radius: 2px 0 0 2px;
3178
- -moz-border-radius: 2px 0 0 2px;
3179
- border-radius: 2px 0 0 2px;
3180
- }
3181
- .ot-input-append input {
3182
- border-right: 0 !important;
3183
- -webkit-border-radius: 2px 0 0 2px;
3184
- -moz-border-radius: 2px 0 0 2px;
3185
- border-radius: 2px 0 0 2px;
3186
- }
3187
- .ot-input-append input + .btn-group .btn:first-child {
3188
- -webkit-border-top-left-radius: 0;
3189
- -moz-border-radius-topleft: 0;
3190
- border-top-left-radius: 0;
3191
- -webkit-border-bottom-left-radius: 0;
3192
- -moz-border-radius-bottomleft: 0;
3193
- border-bottom-left-radius: 0;
3194
- }
3195
- .ot-input-append .ot-add-on:last-child {
3196
- -webkit-border-radius: 0 2px 2px 0;
3197
- -moz-border-radius: 0 2px 2px 0;
3198
- border-radius: 0 2px 2px 0;
3199
- }
3200
- .ot-input-prepend.ot-input-append input {
3201
- -webkit-border-radius: 0;
3202
- -moz-border-radius: 0;
3203
- border-radius: 0;
3204
- }
3205
- .ot-input-prepend.ot-input-append .ot-add-on:first-child {
3206
- -webkit-border-radius: 2px 0 0 2px;
3207
- -moz-border-radius: 2px 0 0 2px;
3208
- border-radius: 2px 0 0 2px;
3209
- }
3210
- .ot-input-prepend.ot-input-append .ot-add-on:last-child {
3211
- -webkit-border-radius: 0 2px 2px 0;
3212
- -moz-border-radius: 0 2px 2px 0;
3213
- border-radius: 0 2px 2px 0;
3214
- }
3215
-
3216
- /* --------------------------------------------------
3217
- :: CSS Editor
3218
- ---------------------------------------------------*/
3219
- #option-tree-settings-api pre.ot-css-editor,
3220
- #poststuff .type-css pre.ot-css-editor,
3221
- #option-tree-settings-api pre.ot-javascript-editor,
3222
- #poststuff .type-javascript pre.ot-javascript-editor {
3223
- bottom: 0;
3224
- height: 280px;
3225
- left: 0;
3226
- margin: 0 !important;
3227
- right: 0;
3228
- top: 0;
3229
- }
3230
- #option-tree-settings-api pre.ace-chrome,
3231
- #poststuff .type-css pre.ace-chrome,
3232
- #poststuff .type-javascript pre.ace-chrome {
3233
- background-color: #fff !important;
3234
- border: 1px solid #ccc;
3235
- -webkit-border-radius: 2px;
3236
- -moz-border-radius: 2px;
3237
- border-radius: 2px;
3238
- }
3239
- #option-tree-settings-api pre.ace-chrome:hover,
3240
- #poststuff .type-css pre.ace-chrome:hover,
3241
- #poststuff .type-javascript pre.ace-chrome:hover {
3242
- border-color: #bbb !important;
3243
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3244
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3245
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3246
- }
3247
- #option-tree-settings-api pre.ace-chrome.ace_focus,
3248
- #poststuff .type-css pre.ace-chrome.ace_focus,
3249
- #poststuff .type-javascript pre.ace-chrome.ace_focus {
3250
- border-color: #999 !important;
3251
- -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3252
- -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3253
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3254
- }
3255
-
3256
- /* --------------------------------------------------
3257
- :: Date Picker
3258
- ---------------------------------------------------*/
3259
- .ui-datepicker {
3260
- background: #fff;
3261
- border: 1px solid #ccc;
3262
- height: auto;
3263
- margin: 5px auto 0;
3264
- width: 216px;
3265
- z-index: 101 !important;
3266
- -webkit-border-radius: 2px;
3267
- -moz-border-radius: 2px;
3268
- border-radius: 2px;
3269
- }
3270
- .ui-datepicker a {
3271
- text-decoration: none;
3272
- }
3273
- .ui-datepicker table {
3274
- border-collapse: collapse;
3275
- border-spacing: 0;
3276
- width: 100%;
3277
- }
3278
- .ui-datepicker .ui-widget-header {
3279
- left: -1px;
3280
- line-height: 30px;
3281
- position: relative;
3282
- top: -1px;
3283
- width: 218px;
3284
- -webkit-border-radius: 2px 2px 0 0;
3285
- -moz-border-radius: 2px 2px 0 0;
3286
- border-radius: 2px 2px 0 0;
3287
- }
3288
- .ui-datepicker .ui-datepicker-title {
3289
- text-align: center;
3290
- }
3291
- .ui-datepicker-prev,
3292
- .ui-datepicker-next {
3293
- color: #ccc;
3294
- display: inline-block;
3295
- font-family: "option-tree-font";
3296
- font-size: 16px;
3297
- width: 30px;
3298
- height: 30px;
3299
- text-align: center;
3300
- cursor: pointer;
3301
- -webkit-border-radius: 2px 0 0 0;
3302
- -moz-border-radius: 2px 0 0 0;
3303
- border-radius: 2px 0 0 0;
3304
- }
3305
- .ui-datepicker-next {
3306
- -webkit-border-radius: 0 2px 0 0;
3307
- -moz-border-radius: 0 2px 0 0;
3308
- border-radius: 0 2px 0 0;
3309
- }
3310
- .ui-datepicker-prev span,
3311
- .ui-datepicker-next span {
3312
- display: none;
3313
- }
3314
- .ui-datepicker-prev:hover,
3315
- .ui-datepicker-next:hover {
3316
- color: #fff;
3317
- }
3318
- .ui-datepicker-prev:before {
3319
- border-right: 1px solid #555;
3320
- content: "\f104";
3321
- display: block;
3322
- float: left;
3323
- width: 31px;
3324
- height: 30px;
3325
- }
3326
- .ui-datepicker-prev {
3327
- border-right: 1px solid #333;
3328
- float: left;
3329
- }
3330
- .ui-datepicker-next:before {
3331
- border-left: 1px solid #555;
3332
- content: "\f105";
3333
- display: block;
3334
- float: right;
3335
- width: 30px;
3336
- height: 30px;
3337
- }
3338
- .ui-datepicker-next {
3339
- border-left: 1px solid #333;
3340
- float: right;
3341
- width: 31px;
3342
- }
3343
- a.ui-datepicker-prev,
3344
- a.ui-datepicker-next {
3345
- outline: 0;
3346
- }
3347
- .ui-datepicker thead {
3348
- background-color: #fafafa;
3349
- border-bottom: 1px solid #ccc;
3350
- }
3351
- .ui-datepicker th {
3352
- text-transform: uppercase;
3353
- font-size: 9px;
3354
- padding: 5px 0;
3355
- color: #555;
3356
- text-shadow: 1px 0px 0px rgba(255,255,255,0.5);
3357
- }
3358
- .ui-datepicker tbody td {
3359
- border-right: 1px solid #ccc;
3360
- padding: 0;
3361
- }
3362
- .ui-datepicker tbody td:last-child {
3363
- border-right: 0px;
3364
- }
3365
- .ui-datepicker tbody tr {
3366
- border-bottom: 1px solid #ccc;
3367
- }
3368
- .ui-datepicker tbody tr:last-child {
3369
- border-bottom: 0px;
3370
- }
3371
- .ui-datepicker td span,
3372
- .ui-datepicker td a {
3373
- display: inline-block;
3374
- font-size: 11px;
3375
- text-align: center;
3376
- width: 30px;
3377
- height: 29px;
3378
- line-height: 30px;
3379
- color: #555;
3380
- text-shadow: 1px 0px 0px rgba(255,255,255,0.5);
3381
- }
3382
- .ui-datepicker-calendar .ui-state-default {
3383
- background-color: #f1f1f1;
3384
- }
3385
- .ui-datepicker-calendar .ui-state-highlight {
3386
- border-radius: 0px;
3387
- border: none;
3388
- color: #0074a2;
3389
- }
3390
- .ui-datepicker-calendar .ui-state-hover {
3391
- background: #fff;
3392
- }
3393
- .ui-datepicker-calendar .ui-state-active {
3394
- background-color: #0074a2;
3395
- color: #fff !important;
3396
- text-shadow: 0px 1px 0px rgba(0,0,0,0.25);
3397
- position: relative;
3398
- }
3399
- .ui-datepicker-unselectable .ui-state-default {
3400
- background: #fff;
3401
- color: #aaa;
3402
- }
3403
- .ui-datepicker-calendar td:first-child .ui-state-active {
3404
- margin-left: 0;
3405
- width: 30px;
3406
- }
3407
- .ui-datepicker-calendar td:last-child .ui-state-active {
3408
- margin-right: 0;
3409
- width: 30px;
3410
- }
3411
- .ui-datepicker-calendar tr:last-child .ui-state-active {
3412
- height: 30px;
3413
- margin-bottom: 0;
3414
- }
3415
- .ui-datepicker .ui-datepicker-buttonpane {
3416
- background-image: none;
3417
- border-left: 0;
3418
- border-right: 0;
3419
- border-bottom: 0;
3420
- margin: 0;
3421
- padding: 0 .7em;
3422
- }
3423
- .ui-datepicker .ui-datepicker-buttonpane button {
3424
- background: #f7f7f7;
3425
- border: 1px solid #ccc;
3426
- color: #555;
3427
- cursor: pointer;
3428
- float: right;
3429
- height: auto;
3430
- margin: .7em 0;
3431
- padding: 5px 14px;
3432
- width: auto;
3433
- -webkit-border-radius: 3px;
3434
- -moz-border-radius: 3px;
3435
- border-radius: 3px;
3436
- -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3437
- -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3438
- box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3439
- }
3440
- .ui-datepicker .ui-datepicker-buttonpane button::-moz-focus-inner {
3441
- border-width: 1px 0;
3442
- border-style: solid none;
3443
- border-color: transparent;
3444
- padding: 0;
3445
- }
3446
- .ui-datepicker .ui-datepicker-buttonpane button:hover,
3447
- .ui-datepicker .ui-datepicker-buttonpane button:focus {
3448
- background: #fafafa;
3449
- border-color: #999;
3450
- color: #222;
3451
- outline: 0;
3452
- }
3453
- .ui-datepicker .ui-datepicker-buttonpane button:focus {
3454
- -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3455
- -moz-box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3456
- box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3457
- }
3458
- .ui-datepicker .ui-datepicker-buttonpane button:active {
3459
- background: #eee;
3460
- border-color: #999;
3461
- color: #333;
3462
- outline: 0;
3463
- -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3464
- -moz-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3465
- box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3466
- }
3467
- .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
3468
- float: left;
3469
- }
3470
- .ui-datepicker-calendar + .ui-datepicker-buttonpane {
3471
- border-bottom: 1px solid #ccc;
3472
- }
3473
- .ui-datepicker-multi-2 {
3474
- width: 432px !important;
3475
- }
3476
- .ui-datepicker-multi-3 {
3477
- width: 648px !important;
3478
- }
3479
- .ui-datepicker-multi-4 {
3480
- width: 864px !important;
3481
- }
3482
- .ui-datepicker-group {
3483
- float: left;
3484
- width: 216px !important;
3485
- }
3486
- .ui-datepicker-row-break {
3487
- clear: both;
3488
- width: 100%;
3489
- font-size: 0;
3490
- }
3491
- .ui-datepicker-multi .ui-datepicker-buttonpane {
3492
- border-top: 1px solid #ccc !important;
3493
- }
3494
-
3495
- /* default color scheme */
3496
- .ui-datepicker .ui-widget-header {
3497
- background: #333;
3498
- color: #bbb;
3499
- }
3500
- .ui-datepicker .ui-widget-header a {
3501
- color: #999;
3502
- }
3503
- .ui-datepicker-prev,
3504
- .ui-datepicker-next:before {
3505
- border-color: #000;
3506
- }
3507
- .ui-datepicker-next,
3508
- .ui-datepicker-prev:before {
3509
- border-color: #444;
3510
- }
3511
- .ui-datepicker-prev:hover,
3512
- .ui-datepicker-next:hover {
3513
- background: #222;
3514
- color: #0074a2 !important;
3515
- }
3516
- /* light */
3517
- .admin-color-light .ui-datepicker .ui-widget-header {
3518
- background: #888;
3519
- color: #fff;
3520
- }
3521
- .admin-color-light .ui-datepicker .ui-widget-header a {
3522
- color: #ccc;
3523
- }
3524
- .admin-color-light .ui-datepicker-prev,
3525
- .admin-color-light .ui-datepicker-next:before {
3526
- border-color: #3c3c3c;
3527
- }
3528
- .admin-color-light .ui-datepicker-next,
3529
- .admin-color-light .ui-datepicker-prev:before {
3530
- border-color: #999;
3531
- }
3532
- .admin-color-light .ui-datepicker-prev:hover,
3533
- .admin-color-light .ui-datepicker-next:hover {
3534
- background: #777;
3535
- color: #eee !important;
3536
- }
3537
- /* blue */
3538
- .admin-color-blue .ui-datepicker .ui-widget-header {
3539
- background: #52accc;
3540
- color: #fff;
3541
- }
3542
- .admin-color-blue .ui-datepicker .ui-widget-header a {
3543
- color: #e2f8ff;
3544
- }
3545
- .admin-color-blue .ui-datepicker-prev,
3546
- .admin-color-blue .ui-datepicker-next:before {
3547
- border-color: #002b39;
3548
- }
3549
- .admin-color-blue .ui-datepicker-next,
3550
- .admin-color-blue .ui-datepicker-prev:before {
3551
- border-color: #5dc2e6;
3552
- }
3553
- .admin-color-blue .ui-datepicker-prev:hover,
3554
- .admin-color-blue .ui-datepicker-next:hover {
3555
- background: #006484;
3556
- color: #fff !important;
3557
- }
3558
- /* coffee */
3559
- .admin-color-coffee .ui-datepicker .ui-widget-header {
3560
- background: #59524c;
3561
- color: #c7cbc9;
3562
- }
3563
- .admin-color-coffee .ui-datepicker .ui-widget-header a {
3564
- color: #f3f2f1;
3565
- }
3566
- .admin-color-coffee .ui-datepicker-prev,
3567
- .admin-color-coffee .ui-datepicker-next:before {
3568
- border-color: #0f0e0d;
3569
- }
3570
- .admin-color-coffee .ui-datepicker-next,
3571
- .admin-color-coffee .ui-datepicker-prev:before {
3572
- border-color: #675f58;
3573
- }
3574
- .admin-color-coffee .ui-datepicker-prev:hover,
3575
- .admin-color-coffee .ui-datepicker-next:hover {
3576
- background: #cca588;
3577
- color: #fff !important;
3578
- }
3579
- /* ectoplasm */
3580
- .admin-color-ectoplasm .ui-datepicker .ui-widget-header {
3581
- background: #523f6d;
3582
- color: #c6c6d3;
3583
- }
3584
- .admin-color-ectoplasm .ui-datepicker .ui-widget-header a {
3585
- color: #f3f2f1;
3586
- }
3587
- .admin-color-ectoplasm .ui-datepicker-prev,
3588
- .admin-color-ectoplasm .ui-datepicker-next:before {
3589
- border-color: #181220;
3590
- }
3591
- .admin-color-ectoplasm .ui-datepicker-next,
3592
- .admin-color-ectoplasm .ui-datepicker-prev:before {
3593
- border-color: #644d85;
3594
- }
3595
- .admin-color-ectoplasm .ui-datepicker-prev:hover,
3596
- .admin-color-ectoplasm .ui-datepicker-next:hover {
3597
- background: #a3b542;
3598
- color: #fff !important;
3599
- }
3600
- /* midnight */
3601
- .admin-color-midnight .ui-datepicker .ui-widget-header {
3602
- background: #363b3f;
3603
- color: #f1f2f3;
3604
- }
3605
- .admin-color-midnight .ui-datepicker .ui-widget-header a {
3606
- color: #f1f2f3;
3607
- }
3608
- .admin-color-midnight .ui-datepicker-prev,
3609
- .admin-color-midnight .ui-datepicker-next:before {
3610
- border-color: #090a0b;
3611
- }
3612
- .admin-color-midnight .ui-datepicker-next,
3613
- .admin-color-midnight .ui-datepicker-prev:before {
3614
- border-color: #4c5359;
3615
- }
3616
- .admin-color-midnight .ui-datepicker-prev:hover,
3617
- .admin-color-midnight .ui-datepicker-next:hover {
3618
- background: #ed543f;
3619
- color: #fff !important;
3620
- }
3621
- /* ocean */
3622
- .admin-color-ocean .ui-datepicker .ui-widget-header {
3623
- background: #738e96;
3624
- color: #f1fcff;
3625
- }
3626
- .admin-color-ocean .ui-datepicker .ui-widget-header a {
3627
- color: #f1fcff;
3628
- }
3629
- .admin-color-ocean .ui-datepicker-prev,
3630
- .admin-color-ocean .ui-datepicker-next:before {
3631
- border-color: #39464a;
3632
- }
3633
- .admin-color-ocean .ui-datepicker-next,
3634
- .admin-color-ocean .ui-datepicker-prev:before {
3635
- border-color: #87a6af;
3636
- }
3637
- .admin-color-ocean .ui-datepicker-prev:hover,
3638
- .admin-color-ocean .ui-datepicker-next:hover {
3639
- background: #9ab8a0;
3640
- color: #fff !important;
3641
- }
3642
- /* sunrise */
3643
- .admin-color-sunrise .ui-datepicker .ui-widget-header {
3644
- background: #da4f41;
3645
- color: #fff;
3646
- }
3647
- .admin-color-sunrise .ui-datepicker .ui-widget-header a {
3648
- color: #f3f1f1;
3649
- }
3650
- .admin-color-sunrise .ui-datepicker-prev,
3651
- .admin-color-sunrise .ui-datepicker-next:before {
3652
- border-color: #8a322a;
3653
- }
3654
- .admin-color-sunrise .ui-datepicker-next,
3655
- .admin-color-sunrise .ui-datepicker-prev:before {
3656
- border-color: #e75546;
3657
- }
3658
- .admin-color-sunrise .ui-datepicker-prev:hover,
3659
- .admin-color-sunrise .ui-datepicker-next:hover {
3660
- background: #e88436;
3661
- color: #fff !important;
3662
- }
3663
-
3664
- /* --------------------------------------------------
3665
- :: Time Picker
3666
- ---------------------------------------------------*/
3667
- .ui-timepicker-div {
3668
- border-top: 1px solid #ccc;
3669
- padding: 0 .4em;
3670
- }
3671
- .ui-timepicker-div .ui-widget-content {
3672
- border: 1px solid #aaa;
3673
- background: #fff;
3674
- font-weight: normal;
3675
- color: #212121;
3676
- }
3677
- .ui-timepicker-div .ui-slider {
3678
- position: relative;
3679
- text-align: left;
3680
- }
3681
- .ui-timepicker-div .ui-slider-horizontal {
3682
- height: .8em;
3683
- bottom: -.3em;
3684
- position: relative;
3685
- -webkit-border-radius: 2px;
3686
- -moz-border-radius: 2px;
3687
- border-radius: 2px;
3688
- }
3689
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3690
- background: #f7f7f7;
3691
- border: 1px solid #ccc;
3692
- color: #555;
3693
- cursor: pointer;
3694
- display: block;
3695
- height: 1.3em;
3696
- margin-left: -.5em;
3697
- outline: 0;
3698
- position: absolute;
3699
- top: -.325em;
3700
- width: .8em;
3701
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3702
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3703
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3704
- -webkit-border-radius: 2px;
3705
- -moz-border-radius: 2px;
3706
- border-radius: 2px;
3707
- }
3708
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover {
3709
- background: #fafafa;
3710
- border-color: #999;
3711
- color: #222;
3712
- }
3713
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3714
- background: #eee;
3715
- border-color: #999;
3716
- color: #333;
3717
- outline: none;
3718
- }
3719
- .ui-datepicker-prev,
3720
- .ui-datepicker-next:before {
3721
- border-color: #000;
3722
- }
3723
- .ui-datepicker-next,
3724
- .ui-datepicker-prev:before {
3725
- border-color: #444;
3726
- }
3727
- .ui-datepicker-prev:hover,
3728
- .ui-datepicker-next:hover {
3729
- background: #222;
3730
- color: #0074a2 !important;
3731
- }
3732
-
3733
- .ui-timepicker-div dl {
3734
- text-align: left;
3735
- }
3736
- .ui-timepicker-div dl dt {
3737
- float: left;
3738
- clear: left;
3739
- padding: 0 0 0 5px;
3740
- }
3741
- .ui-timepicker-div dl dd {
3742
- margin: 0 10px 10px 45%;
3743
- }
3744
- .ui-timepicker-div td {
3745
- font-size: 90%;
3746
- }
3747
- .ui-tpicker-grid-label {
3748
- background: none;
3749
- border: none;
3750
- margin: 0;
3751
- padding: 0;
3752
- }
3753
- /* default */
3754
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3755
- background: #333;
3756
- border-color: #000;
3757
- }
3758
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3759
- .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3760
- background: #444;
3761
- border-color: #111;
3762
- }
3763
- /* light */
3764
- .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3765
- background: #888;
3766
- border-color: #3c3c3c;
3767
- }
3768
- .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3769
- .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3770
- background: #999;
3771
- border-color: #777;
3772
- }
3773
- /* blue */
3774
- .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3775
- background: #52accc;
3776
- border-color: #002b39;
3777
- }
3778
- .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3779
- .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3780
- background: #5dc2e6;
3781
- border-color: #006484;
3782
- }
3783
- /* coffee */
3784
- .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3785
- background: #59524c;
3786
- border-color: #0f0e0d;
3787
- }
3788
- .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3789
- .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3790
- background: #cca588;
3791
- border-color: #675f58;
3792
- }
3793
- /* ectoplasm */
3794
- .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3795
- background: #523f6d;
3796
- border-color: #181220;
3797
- }
3798
- .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3799
- .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3800
- background: #a3b542;
3801
- border-color: #644d85;
3802
- }
3803
- /* midnight */
3804
- .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3805
- background: #363b3f;
3806
- border-color: #090a0b;
3807
- }
3808
- .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3809
- .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3810
- background: #ed543f;
3811
- border-color: #a0382a;
3812
- }
3813
- /* ocean */
3814
- .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3815
- background: #738e96;
3816
- border-color: #39464a;
3817
- }
3818
- .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3819
- .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3820
- background: #9ab8a0;
3821
- border-color: #5a6c5e;
3822
- }
3823
- /* sunrise */
3824
- .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3825
- background: #da4f41;
3826
- border-color: #8a322a;
3827
- }
3828
- .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3829
- .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3830
- background: #e88436;
3831
- border-color: #e75546;
3832
- }
3833
-
3834
- /* --------------------------------------------------
3835
- :: Meta Box Tabs
3836
- ---------------------------------------------------*/
3837
- .ot-metabox-tabs.ui-tabs {
3838
- overflow: hidden;
3839
- position: relative;
3840
- }
3841
- .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
3842
- overflow: hidden;
3843
- }
3844
- .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
3845
- background: white;
3846
- border: 1px solid #ccc;
3847
- margin: 7px 0 1px 0;
3848
- min-height: 140px;
3849
- overflow: hidden;
3850
- padding: 12px;
3851
- -webkit-border-radius: 2px;
3852
- -moz-border-radius: 2px;
3853
- border-radius: 2px;
3854
- }
3855
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3856
- float: left;
3857
- list-style: none;
3858
- margin: 0 -1px 0 0;
3859
- padding: 18px 0 12px 0;
3860
- width: 151px;
3861
- }
3862
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li,
3863
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-focus {
3864
- background: none;
3865
- border: 1px solid transparent;
3866
- border-right-width: 0px;
3867
- display: block;
3868
- margin: 0;
3869
- outline: 0;
3870
- padding: 1px 0;
3871
- width: 150px;
3872
- -webkit-border-radius: 2px 0 0 2px;
3873
- -moz-border-radius: 2px 0 0 2px;
3874
- border-radius: 2px 0 0 2px;
3875
- }
3876
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
3877
- background: white;
3878
- border-color: #ccc;
3879
- color: black;
3880
- }
3881
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
3882
- color: #21759b;
3883
- display: block;
3884
- line-height: 18px;
3885
- outline: 0;
3886
- padding: 5px 5px 5px 12px;
3887
- text-decoration: none;
3888
- }
3889
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
3890
- color: black;
3891
- outline: none;
3892
- }
3893
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
3894
- color: black;
3895
- outline: none;
3896
- }
3897
- .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
3898
- clear: both;
3899
- }
3900
-
3901
- /* --------------------------------------------------
3902
- :: Theme Option & Side Metabox Tabs
3903
- ---------------------------------------------------*/
3904
- .ot-theme-option-tabs.ui-tabs
3905
- #side-sortables .ot-metabox-tabs.ui-tabs {
3906
- position: relative;
3907
- }
3908
- .ot-theme-option-tabs.ui-tabs .inside,
3909
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
3910
- overflow: hidden;
3911
- }
3912
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-panels,
3913
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
3914
- border: 0;
3915
- margin: 0;
3916
- overflow: hidden;
3917
- padding: 0;
3918
- width: 100%;
3919
- }
3920
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav,
3921
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3922
- border-bottom: 1px solid #ccc;
3923
- float: none;
3924
- font-size: 12px !important;
3925
- height: 30px;
3926
- list-style: none;
3927
- margin: 2px 0 0 0;
3928
- padding: 0;
3929
- width: 100%;
3930
- }
3931
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3932
- margin-top: 10px;
3933
- }
3934
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-default,
3935
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-default {
3936
- background: #fafafa;
3937
- border: 1px solid #ccc;
3938
- border-width: 1px 1px 0px 1px;
3939
- display: block;
3940
- float: left;
3941
- margin: 0 0 0 3px;
3942
- padding: 0;
3943
- outline: 0;
3944
- -webkit-border-radius: 2px 2px 0 0;
3945
- -moz-border-radius: 2px 2px 0 0;
3946
- border-radius: 2px 2px 0 0;
3947
- }
3948
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li:hover,
3949
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li:hover {
3950
- background: #f1f1f1;
3951
- border: 1px solid #ccc;
3952
- border-width: 1px 1px 0px 1px;
3953
- }
3954
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-active,
3955
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
3956
- background: white;
3957
- border-color: #ccc;
3958
- border-width: 1px 1px 0px 1px;
3959
- color: black;
3960
- padding: 0;
3961
- -webkit-border-radius: 2px 2px 0 0;
3962
- -moz-border-radius: 2px 2px 0 0;
3963
- border-radius: 2px 2px 0 0;
3964
- }
3965
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li a,
3966
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
3967
- color: #21759b;
3968
- display: block;
3969
- line-height: 18px;
3970
- outline: 0;
3971
- padding: 6px 12px 5px 12px !important;
3972
- text-decoration: none;
3973
- }
3974
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li a:hover,
3975
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
3976
- color: black;
3977
- outline: none;
3978
- }
3979
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-active a,
3980
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
3981
- color: black;
3982
- outline: none;
3983
- padding: 6px 12px 6px 12px !important;
3984
- }
3985
- .ot-theme-option-tabs.ui-tabs .ot-theme-option-panel,
3986
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
3987
- clear: both;
3988
- }
3989
- #side-sortables .ot-metabox-tabs.ui-tabs .format-setting .description,
3990
- #side-sortables .ot-metabox-tabs.ui-tabs .format-setting .format-setting-inner {
3991
- width: 100%;
3992
- }
3993
-
3994
- /* --------------------------------------------------
3995
- :: Metabox Tabs for Small Screens & Mobile Devices
3996
- ---------------------------------------------------*/
3997
- @media screen and ( max-width: 1020px ) {
3998
- .ot-metabox-tabs.ui-tabs {
3999
- position: relative;
4000
- }
4001
- .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
4002
- overflow: hidden;
4003
- }
4004
- .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
4005
- border: 0;
4006
- margin: 0;
4007
- overflow: hidden;
4008
- padding: 0;
4009
- width: 100%;
4010
- }
4011
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
4012
- border-bottom: 1px solid #ccc;
4013
- float: none;
4014
- font-size: 12px !important;
4015
- height: 30px;
4016
- list-style: none;
4017
- margin: 2px 0 0 0;
4018
- padding: 0;
4019
- width: 100%;
4020
- }
4021
- #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
4022
- margin-top: 10px;
4023
- }
4024
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li {
4025
- background: #fafafa;
4026
- border: 1px solid #ccc !important;
4027
- border-width: 1px 1px 0px 1px !important;
4028
- display: inline-block !important;
4029
- margin: 0 0 0 3px !important;
4030
- padding: 0 !important;
4031
- outline: 0 !important;
4032
- width: auto !important;
4033
- -webkit-border-radius: 2px 2px 0 0;
4034
- -moz-border-radius: 2px 2px 0 0;
4035
- border-radius: 2px 2px 0 0;
4036
- }
4037
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li:hover {
4038
- background: #f1f1f1;
4039
- }
4040
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
4041
- background: white;
4042
- color: black;
4043
- padding: 0;
4044
- -webkit-border-radius: 2px 2px 0 0;
4045
- -moz-border-radius: 2px 2px 0 0;
4046
- border-radius: 2px 2px 0 0;
4047
- }
4048
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
4049
- color: #21759b;
4050
- display: block;
4051
- line-height: 18px;
4052
- outline: 0;
4053
- padding: 6px 12px 5px 12px !important;
4054
- text-decoration: none;
4055
- }
4056
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
4057
- color: black;
4058
- outline: none;
4059
- }
4060
- .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
4061
- color: black;
4062
- outline: none;
4063
- padding: 6px 12px 6px 12px !important;
4064
- }
4065
- .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
4066
- clear: both;
4067
- }
4068
- }
4069
-
4070
-
4071
- .of-notice-small {
4072
- border-left: 4px solid #00a0d2;
4073
- margin: 5px 0 15px;
4074
- padding: 1px 12px;
4075
- background-color: #fafafa;
4076
- display: inline-block;
4077
- }
4078
-
4079
-
4080
- .nifty-list {
4081
- list-style-type: circle;
4082
- list-style-position: outside;
4083
- margin-left: 14px;
4084
- line-height: 150%;
4085
- }
4086
-
4087
- .toplevel_page_niftycs-options .upsell-footer{
4088
- text-align: center;
4089
  }
1
+ .theme-thumb {
2
+ min-width: 150px;
3
+ display: inline-block;
4
+ margin: 15px;
5
+ width: calc(33% - 25px);
6
+ box-sizing: border-box;
7
+ background-color: #f1f1f1;
8
+ padding-bottom: 5px;
9
+ border: thin solid transparent;
10
+ position: relative;
11
+ }
12
+ #rate-plugin {
13
+ left: 150px;
14
+ margin: 10px 20px 10px 150px;
15
+ padding: 15px;
16
+ background-color: #79042e;
17
+ width: calc(100% - 400px);
18
+ font-size: 16px;
19
+ color: #ffffff;
20
+ }
21
+
22
+ #rate-plugin a {
23
+ color: #ffffff;
24
+ }
25
+
26
+ #option-tree-settings-api #rate-plugin p {
27
+ margin: 10px 0 0 0 !important;
28
+ }
29
+
30
+ .format-setting-wrap .theme-thumb:nth-child(3n + 1) {
31
+ margin-left: 0;
32
+ }
33
+ .theme-thumb:hover {
34
+ border: thin solid #00000099;
35
+ }
36
+ .theme-thumb span {
37
+ display: block;
38
+ padding: 5px 10px;
39
+ }
40
+ .theme-thumb span .button {
41
+ margin-top: 5px;
42
+ }
43
+ .theme-thumb img {
44
+ max-width: 100%;
45
+ border-bottom: 2px solid #fe2929;
46
+ }
47
+ .theme-thumb span.name {
48
+ font-weight: 600;
49
+ font-size: 15px;
50
+ }
51
+ .theme-thumb span.name small {
52
+ font-weight: 400;
53
+ font-style: italic;
54
+ }
55
+ .theme-thumb .ribbon {
56
+ width: 100px;
57
+ height: 100px;
58
+ overflow: hidden;
59
+ position: absolute;
60
+ top: 0;
61
+ right: 0;
62
+ }
63
+ .theme-thumb .ribbon::before,
64
+ .theme-thumb .ribbon::after {
65
+ position: absolute;
66
+ z-index: -1;
67
+ content: '';
68
+ display: block;
69
+ }
70
+ .theme-thumb .ribbon i {
71
+ position: absolute;
72
+ display: inline-block;
73
+ padding: 10px;
74
+ background-color: #fe2929e6;
75
+ color: #fff;
76
+ font: 700 18px/1 'Lato', sans-serif;
77
+ right: 0;
78
+ top: 0;
79
+ }
80
+ .theme-thumb .ribbon::before,
81
+ .theme-thumb .ribbon::after {
82
+ border-top-color: transparent;
83
+ border-right-color: transparent;
84
+ }
85
+ .theme-thumb .ribbon::before {
86
+ top: 0;
87
+ left: 0;
88
+ }
89
+ .theme-thumb .ribbon::after {
90
+ bottom: 0;
91
+ right: 0;
92
+ }
93
+
94
+ /* --------------------------------------------------
95
+ :: OptionTree Font
96
+ ---------------------------------------------------*/
97
+ @font-face {
98
+ font-family: "option-tree-font";
99
+ src:url("../fonts/option-tree-font.eot");
100
+ src:url("../fonts/option-tree-font.eot?#iefix") format("embedded-opentype"),
101
+ url("../fonts/option-tree-font.woff") format("woff"),
102
+ url("../fonts/option-tree-font.ttf") format("truetype"),
103
+ url("../fonts/option-tree-font.svg#option-tree-font") format("svg");
104
+ font-weight: normal;
105
+ font-style: normal;
106
+ }
107
+
108
+ [class^="ot-icon-"],
109
+ [class*=" ot-icon-"] {
110
+ font-family: "option-tree-font";
111
+ speak: none;
112
+ font-style: normal;
113
+ font-weight: normal;
114
+ font-variant: normal;
115
+ text-transform: none;
116
+ line-height: 1;
117
+ -webkit-font-smoothing: antialiased;
118
+ -moz-osx-font-smoothing: grayscale;
119
+ }
120
+
121
+ .ui-tabs li > a [class^="ot-icon-"],
122
+ .ui-tabs li > a [class*=" ot-icon-"] {
123
+ padding-right: 5px;
124
+ line-height: 18px;
125
+ vertical-align: middle;
126
+ }
127
+
128
+ .ot-icon-option-tree:before {
129
+ content: "\e785";
130
+ }
131
+ .ot-icon-glass:before {
132
+ content: "\f000";
133
+ }
134
+ .ot-icon-music:before {
135
+ content: "\f001";
136
+ }
137
+ .ot-icon-search:before {
138
+ content: "\f002";
139
+ }
140
+ .ot-icon-envelope-o:before {
141
+ content: "\f003";
142
+ }
143
+ .ot-icon-heart:before {
144
+ content: "\f004";
145
+ }
146
+ .ot-icon-star:before {
147
+ content: "\f005";
148
+ }
149
+ .ot-icon-star-o:before {
150
+ content: "\f006";
151
+ }
152
+ .ot-icon-user:before {
153
+ content: "\f007";
154
+ }
155
+ .ot-icon-film:before {
156
+ content: "\f008";
157
+ }
158
+ .ot-icon-th-large:before {
159
+ content: "\f009";
160
+ }
161
+ .ot-icon-th:before {
162
+ content: "\f00a";
163
+ }
164
+ .ot-icon-th-list:before {
165
+ content: "\f00b";
166
+ }
167
+ .ot-icon-check:before {
168
+ content: "\f00c";
169
+ }
170
+ .ot-icon-times:before {
171
+ content: "\f00d";
172
+ }
173
+ .ot-icon-search-plus:before {
174
+ content: "\f00e";
175
+ }
176
+ .ot-icon-search-minus:before {
177
+ content: "\f010";
178
+ }
179
+ .ot-icon-power-off:before {
180
+ content: "\f011";
181
+ }
182
+ .ot-icon-signal:before {
183
+ content: "\f012";
184
+ }
185
+ .ot-icon-gear:before {
186
+ content: "\f013";
187
+ }
188
+ .ot-icon-trash-o:before {
189
+ content: "\f014";
190
+ }
191
+ .ot-icon-home:before {
192
+ content: "\f015";
193
+ }
194
+ .ot-icon-file-o:before {
195
+ content: "\f016";
196
+ }
197
+ .ot-icon-clock-o:before {
198
+ content: "\f017";
199
+ }
200
+ .ot-icon-road:before {
201
+ content: "\f018";
202
+ }
203
+ .ot-icon-download:before {
204
+ content: "\f019";
205
+ }
206
+ .ot-icon-arrow-circle-o-down:before {
207
+ content: "\f01a";
208
+ }
209
+ .ot-icon-arrow-circle-o-up:before {
210
+ content: "\f01b";
211
+ }
212
+ .ot-icon-inbox:before {
213
+ content: "\f01c";
214
+ }
215
+ .ot-icon-play-circle-o:before {
216
+ content: "\f01d";
217
+ }
218
+ .ot-icon-rotate-right:before {
219
+ content: "\f01e";
220
+ }
221
+ .ot-icon-refresh:before {
222
+ content: "\f021";
223
+ }
224
+ .ot-icon-list-alt:before {
225
+ content: "\f022";
226
+ }
227
+ .ot-icon-lock:before {
228
+ content: "\f023";
229
+ }
230
+ .ot-icon-flag:before {
231
+ content: "\f024";
232
+ }
233
+ .ot-icon-headphones:before {
234
+ content: "\f025";
235
+ }
236
+ .ot-icon-volume-off:before {
237
+ content: "\f026";
238
+ }
239
+ .ot-icon-volume-down:before {
240
+ content: "\f027";
241
+ }
242
+ .ot-icon-volume-up:before {
243
+ content: "\f028";
244
+ }
245
+ .ot-icon-qrcode:before {
246
+ content: "\f029";
247
+ }
248
+ .ot-icon-barcode:before {
249
+ content: "\f02a";
250
+ }
251
+ .ot-icon-tag:before {
252
+ content: "\f02b";
253
+ }
254
+ .ot-icon-tags:before {
255
+ content: "\f02c";
256
+ }
257
+ .ot-icon-book:before {
258
+ content: "\f02d";
259
+ }
260
+ .ot-icon-bookmark:before {
261
+ content: "\f02e";
262
+ }
263
+ .ot-icon-print:before {
264
+ content: "\f02f";
265
+ }
266
+ .ot-icon-camera:before {
267
+ content: "\f030";
268
+ }
269
+ .ot-icon-font:before {
270
+ content: "\f031";
271
+ }
272
+ .ot-icon-bold:before {
273
+ content: "\f032";
274
+ }
275
+ .ot-icon-italic:before {
276
+ content: "\f033";
277
+ }
278
+ .ot-icon-text-height:before {
279
+ content: "\f034";
280
+ }
281
+ .ot-icon-text-width:before {
282
+ content: "\f035";
283
+ }
284
+ .ot-icon-align-left:before {
285
+ content: "\f036";
286
+ }
287
+ .ot-icon-align-center:before {
288
+ content: "\f037";
289
+ }
290
+ .ot-icon-align-right:before {
291
+ content: "\f038";
292
+ }
293
+ .ot-icon-align-justify:before {
294
+ content: "\f039";
295
+ }
296
+ .ot-icon-list:before {
297
+ content: "\f03a";
298
+ }
299
+ .ot-icon-dedent:before {
300
+ content: "\f03b";
301
+ }
302
+ .ot-icon-indent:before {
303
+ content: "\f03c";
304
+ }
305
+ .ot-icon-video-camera:before {
306
+ content: "\f03d";
307
+ }
308
+ .ot-icon-picture-o:before {
309
+ content: "\f03e";
310
+ }
311
+ .ot-icon-pencil:before {
312
+ content: "\f040";
313
+ }
314
+ .ot-icon-map-marker:before {
315
+ content: "\f041";
316
+ }
317
+ .ot-icon-adjust:before {
318
+ content: "\f042";
319
+ }
320
+ .ot-icon-tint:before {
321
+ content: "\f043";
322
+ }
323
+ .ot-icon-edit:before {
324
+ content: "\f044";
325
+ }
326
+ .ot-icon-share-square-o:before {
327
+ content: "\f045";
328
+ }
329
+ .ot-icon-check-square-o:before {
330
+ content: "\f046";
331
+ }
332
+ .ot-icon-arrows:before {
333
+ content: "\f047";
334
+ }
335
+ .ot-icon-step-backward:before {
336
+ content: "\f048";
337
+ }
338
+ .ot-icon-fast-backward:before {
339
+ content: "\f049";
340
+ }
341
+ .ot-icon-backward:before {
342
+ content: "\f04a";
343
+ }
344
+ .ot-icon-play:before {
345
+ content: "\f04b";
346
+ }
347
+ .ot-icon-pause:before {
348
+ content: "\f04c";
349
+ }
350
+ .ot-icon-stop:before {
351
+ content: "\f04d";
352
+ }
353
+ .ot-icon-forward:before {
354
+ content: "\f04e";
355
+ }
356
+ .ot-icon-fast-forward:before {
357
+ content: "\f050";
358
+ }
359
+ .ot-icon-step-forward:before {
360
+ content: "\f051";
361
+ }
362
+ .ot-icon-eject:before {
363
+ content: "\f052";
364
+ }
365
+ .ot-icon-chevron-left:before {
366
+ content: "\f053";
367
+ }
368
+ .ot-icon-chevron-right:before {
369
+ content: "\f054";
370
+ }
371
+ .ot-icon-plus-circle:before {
372
+ content: "\f055";
373
+ }
374
+ .ot-icon-minus-circle:before {
375
+ content: "\f056";
376
+ }
377
+ .ot-icon-times-circle:before {
378
+ content: "\f057";
379
+ }
380
+ .ot-icon-check-circle:before {
381
+ content: "\f058";
382
+ }
383
+ .ot-icon-question-circle:before {
384
+ content: "\f059";
385
+ }
386
+ .ot-icon-info-circle:before {
387
+ content: "\f05a";
388
+ }
389
+ .ot-icon-crosshairs:before {
390
+ content: "\f05b";
391
+ }
392
+ .ot-icon-times-circle-o:before {
393
+ content: "\f05c";
394
+ }
395
+ .ot-icon-check-circle-o:before {
396
+ content: "\f05d";
397
+ }
398
+ .ot-icon-ban:before {
399
+ content: "\f05e";
400
+ }
401
+ .ot-icon-arrow-left:before {
402
+ content: "\f060";
403
+ }
404
+ .ot-icon-arrow-right:before {
405
+ content: "\f061";
406
+ }
407
+ .ot-icon-arrow-up:before {
408
+ content: "\f062";
409
+ }
410
+ .ot-icon-arrow-down:before {
411
+ content: "\f063";
412
+ }
413
+ .ot-icon-mail-forward:before {
414
+ content: "\f064";
415
+ }
416
+ .ot-icon-expand:before {
417
+ content: "\f065";
418
+ }
419
+ .ot-icon-compress:before {
420
+ content: "\f066";
421
+ }
422
+ .ot-icon-plus:before {
423
+ content: "\f067";
424
+ }
425
+ .ot-icon-minus:before {
426
+ content: "\f068";
427
+ }
428
+ .ot-icon-asterisk:before {
429
+ content: "\f069";
430
+ }
431
+ .ot-icon-exclamation-circle:before {
432
+ content: "\f06a";
433
+ }
434
+ .ot-icon-gift:before {
435
+ content: "\f06b";
436
+ }
437
+ .ot-icon-leaf:before {
438
+ content: "\f06c";
439
+ }
440
+ .ot-icon-fire:before {
441
+ content: "\f06d";
442
+ }
443
+ .ot-icon-eye:before {
444
+ content: "\f06e";
445
+ }
446
+ .ot-icon-eye-slash:before {
447
+ content: "\f070";
448
+ }
449
+ .ot-icon-warning:before {
450
+ content: "\f071";
451
+ }
452
+ .ot-icon-plane:before {
453
+ content: "\f072";
454
+ }
455
+ .ot-icon-calendar:before {
456
+ content: "\f073";
457
+ }
458
+ .ot-icon-random:before {
459
+ content: "\f074";
460
+ }
461
+ .ot-icon-comment:before {
462
+ content: "\f075";
463
+ }
464
+ .ot-icon-magnet:before {
465
+ content: "\f076";
466
+ }
467
+ .ot-icon-chevron-up:before {
468
+ content: "\f077";
469
+ }
470
+ .ot-icon-chevron-down:before {
471
+ content: "\f078";
472
+ }
473
+ .ot-icon-retweet:before {
474
+ content: "\f079";
475
+ }
476
+ .ot-icon-shopping-cart:before {
477
+ content: "\f07a";
478
+ }
479
+ .ot-icon-folder:before {
480
+ content: "\f07b";
481
+ }
482
+ .ot-icon-folder-open:before {
483
+ content: "\f07c";
484
+ }
485
+ .ot-icon-arrows-v:before {
486
+ content: "\f07d";
487
+ }
488
+ .ot-icon-arrows-h:before {
489
+ content: "\f07e";
490
+ }
491
+ .ot-icon-bar-chart-o:before {
492
+ content: "\f080";
493
+ }
494
+ .ot-icon-twitter-square:before {
495
+ content: "\f081";
496
+ }
497
+ .ot-icon-facebook-square:before {
498
+ content: "\f082";
499
+ }
500
+ .ot-icon-camera-retro:before {
501
+ content: "\f083";
502
+ }
503
+ .ot-icon-key:before {
504
+ content: "\f084";
505
+ }
506
+ .ot-icon-gears:before {
507
+ content: "\f085";
508
+ }
509
+ .ot-icon-comments:before {
510
+ content: "\f086";
511
+ }
512
+ .ot-icon-thumbs-o-up:before {
513
+ content: "\f087";
514
+ }
515
+ .ot-icon-thumbs-o-down:before {
516
+ content: "\f088";
517
+ }
518
+ .ot-icon-star-half:before {
519
+ content: "\f089";
520
+ }
521
+ .ot-icon-heart-o:before {
522
+ content: "\f08a";
523
+ }
524
+ .ot-icon-sign-out:before {
525
+ content: "\f08b";
526
+ }
527
+ .ot-icon-linkedin-square:before {
528
+ content: "\f08c";
529
+ }
530
+ .ot-icon-thumb-tack:before {
531
+ content: "\f08d";
532
+ }
533
+ .ot-icon-external-link:before {
534
+ content: "\f08e";
535
+ }
536
+ .ot-icon-sign-in:before {
537
+ content: "\f090";
538
+ }
539
+ .ot-icon-trophy:before {
540
+ content: "\f091";
541
+ }
542
+ .ot-icon-github-square:before {
543
+ content: "\f092";
544
+ }
545
+ .ot-icon-upload:before {
546
+ content: "\f093";
547
+ }
548
+ .ot-icon-lemon-o:before {
549
+ content: "\f094";
550
+ }
551
+ .ot-icon-phone:before {
552
+ content: "\f095";
553
+ }
554
+ .ot-icon-square-o:before {
555
+ content: "\f096";
556
+ }
557
+ .ot-icon-bookmark-o:before {
558
+ content: "\f097";
559
+ }
560
+ .ot-icon-phone-square:before {
561
+ content: "\f098";
562
+ }
563
+ .ot-icon-twitter:before {
564
+ content: "\f099";
565
+ }
566
+ .ot-icon-facebook:before {
567
+ content: "\f09a";
568
+ }
569
+ .ot-icon-github:before {
570
+ content: "\f09b";
571
+ }
572
+ .ot-icon-unlock:before {
573
+ content: "\f09c";
574
+ }
575
+ .ot-icon-credit-card:before {
576
+ content: "\f09d";
577
+ }
578
+ .ot-icon-rss:before {
579
+ content: "\f09e";
580
+ }
581
+ .ot-icon-hdd-o:before {
582
+ content: "\f0a0";
583
+ }
584
+ .ot-icon-bullhorn:before {
585
+ content: "\f0a1";
586
+ }
587
+ .ot-icon-bell:before {
588
+ content: "\f0a2";
589
+ }
590
+ .ot-icon-certificate:before {
591
+ content: "\f0a3";
592
+ }
593
+ .ot-icon-hand-o-right:before {
594
+ content: "\f0a4";
595
+ }
596
+ .ot-icon-hand-o-left:before {
597
+ content: "\f0a5";
598
+ }
599
+ .ot-icon-hand-o-up:before {
600
+ content: "\f0a6";
601
+ }
602
+ .ot-icon-hand-o-down:before {
603
+ content: "\f0a7";
604
+ }
605
+ .ot-icon-arrow-circle-left:before {
606
+ content: "\f0a8";
607
+ }
608
+ .ot-icon-arrow-circle-right:before {
609
+ content: "\f0a9";
610
+ }
611
+ .ot-icon-arrow-circle-up:before {
612
+ content: "\f0aa";
613
+ }
614
+ .ot-icon-arrow-circle-down:before {
615
+ content: "\f0ab";
616
+ }
617
+ .ot-icon-globe:before {
618
+ content: "\f0ac";
619
+ }
620
+ .ot-icon-wrench:before {
621
+ content: "\f0ad";
622
+ }
623
+ .ot-icon-tasks:before {
624
+ content: "\f0ae";
625
+ }
626
+ .ot-icon-filter:before {
627
+ content: "\f0b0";
628
+ }
629
+ .ot-icon-briefcase:before {
630
+ content: "\f0b1";
631
+ }
632
+ .ot-icon-arrows-alt:before {
633
+ content: "\f0b2";
634
+ }
635
+ .ot-icon-group:before {
636
+ content: "\f0c0";
637
+ }
638
+ .ot-icon-chain:before {
639
+ content: "\f0c1";
640
+ }
641
+ .ot-icon-cloud:before {
642
+ content: "\f0c2";
643
+ }
644
+ .ot-icon-flask:before {
645
+ content: "\f0c3";
646
+ }
647
+ .ot-icon-cut:before {
648
+ content: "\f0c4";
649
+ }
650
+ .ot-icon-copy:before {
651
+ content: "\f0c5";
652
+ }
653
+ .ot-icon-paperclip:before {
654
+ content: "\f0c6";
655
+ }
656
+ .ot-icon-save:before {
657
+ content: "\f0c7";
658
+ }
659
+ .ot-icon-square:before {
660
+ content: "\f0c8";
661
+ }
662
+ .ot-icon-bars:before {
663
+ content: "\f0c9";
664
+ }
665
+ .ot-icon-list-ul:before {
666
+ content: "\f0ca";
667
+ }
668
+ .ot-icon-list-ol:before {
669
+ content: "\f0cb";
670
+ }
671
+ .ot-icon-strikethrough:before {
672
+ content: "\f0cc";
673
+ }
674
+ .ot-icon-underline:before {
675
+ content: "\f0cd";
676
+ }
677
+ .ot-icon-table:before {
678
+ content: "\f0ce";
679
+ }
680
+ .ot-icon-magic:before {
681
+ content: "\f0d0";
682
+ }
683
+ .ot-icon-truck:before {
684
+ content: "\f0d1";
685
+ }
686
+ .ot-icon-pinterest:before {
687
+ content: "\f0d2";
688
+ }
689
+ .ot-icon-pinterest-square:before {
690
+ content: "\f0d3";
691
+ }
692
+ .ot-icon-google-plus-square:before {
693
+ content: "\f0d4";
694
+ }
695
+ .ot-icon-google-plus:before {
696
+ content: "\f0d5";
697
+ }
698
+ .ot-icon-money:before {
699
+ content: "\f0d6";
700
+ }
701
+ .ot-icon-caret-down:before {
702
+ content: "\f0d7";
703
+ }
704
+ .ot-icon-caret-up:before {
705
+ content: "\f0d8";
706
+ }
707
+ .ot-icon-caret-left:before {
708
+ content: "\f0d9";
709
+ }
710
+ .ot-icon-caret-right:before {
711
+ content: "\f0da";
712
+ }
713
+ .ot-icon-columns:before {
714
+ content: "\f0db";
715
+ }
716
+ .ot-icon-unsorted:before {
717
+ content: "\f0dc";
718
+ }
719
+ .ot-icon-sort-down:before {
720
+ content: "\f0dd";
721
+ }
722
+ .ot-icon-sort-up:before {
723
+ content: "\f0de";
724
+ }
725
+ .ot-icon-envelope:before {
726
+ content: "\f0e0";
727
+ }
728
+ .ot-icon-linkedin:before {
729
+ content: "\f0e1";
730
+ }
731
+ .ot-icon-rotate-left:before {
732
+ content: "\f0e2";
733
+ }
734
+ .ot-icon-legal:before {
735
+ content: "\f0e3";
736
+ }
737
+ .ot-icon-dashboard:before {
738
+ content: "\f0e4";
739
+ }
740
+ .ot-icon-comment-o:before {
741
+ content: "\f0e5";
742
+ }
743
+ .ot-icon-comments-o:before {
744
+ content: "\f0e6";
745
+ }
746
+ .ot-icon-flash:before {
747
+ content: "\f0e7";
748
+ }
749
+ .ot-icon-sitemap:before {
750
+ content: "\f0e8";
751
+ }
752
+ .ot-icon-umbrella:before {
753
+ content: "\f0e9";
754
+ }
755
+ .ot-icon-paste:before {
756
+ content: "\f0ea";
757
+ }
758
+ .ot-icon-lightbulb-o:before {
759
+ content: "\f0eb";
760
+ }
761
+ .ot-icon-exchange:before {
762
+ content: "\f0ec";
763
+ }
764
+ .ot-icon-cloud-download:before {
765
+ content: "\f0ed";
766
+ }
767
+ .ot-icon-cloud-upload:before {
768
+ content: "\f0ee";
769
+ }
770
+ .ot-icon-user-md:before {
771
+ content: "\f0f0";
772
+ }
773
+ .ot-icon-stethoscope:before {
774
+ content: "\f0f1";
775
+ }
776
+ .ot-icon-suitcase:before {
777
+ content: "\f0f2";
778
+ }
779
+ .ot-icon-bell-o:before {
780
+ content: "\f0f3";
781
+ }
782
+ .ot-icon-coffee:before {
783
+ content: "\f0f4";
784
+ }
785
+ .ot-icon-cutlery:before {
786
+ content: "\f0f5";
787
+ }
788
+ .ot-icon-file-text-o:before {
789
+ content: "\f0f6";
790
+ }
791
+ .ot-icon-building-o:before {
792
+ content: "\f0f7";
793
+ }
794
+ .ot-icon-hospital-o:before {
795
+ content: "\f0f8";
796
+ }
797
+ .ot-icon-ambulance:before {
798
+ content: "\f0f9";
799
+ }
800
+ .ot-icon-medkit:before {
801
+ content: "\f0fa";
802
+ }
803
+ .ot-icon-fighter-jet:before {
804
+ content: "\f0fb";
805
+ }
806
+ .ot-icon-beer:before {
807
+ content: "\f0fc";
808
+ }
809
+ .ot-icon-h-square:before {
810
+ content: "\f0fd";
811
+ }
812
+ .ot-icon-plus-square:before {
813
+ content: "\f0fe";
814
+ }
815
+ .ot-icon-angle-double-left:before {
816
+ content: "\f100";
817
+ }
818
+ .ot-icon-angle-double-right:before {
819
+ content: "\f101";
820
+ }
821
+ .ot-icon-angle-double-up:before {
822
+ content: "\f102";
823
+ }
824
+ .ot-icon-angle-double-down:before {
825
+ content: "\f103";
826
+ }
827
+ .ot-icon-angle-left:before {
828
+ content: "\f104";
829
+ }
830
+ .ot-icon-angle-right:before {
831
+ content: "\f105";
832
+ }
833
+ .ot-icon-angle-up:before {
834
+ content: "\f106";
835
+ }
836
+ .ot-icon-angle-down:before {
837
+ content: "\f107";
838
+ }
839
+ .ot-icon-desktop:before {
840
+ content: "\f108";
841
+ }
842
+ .ot-icon-laptop:before {
843
+ content: "\f109";
844
+ }
845
+ .ot-icon-tablet:before {
846
+ content: "\f10a";
847
+ }
848
+ .ot-icon-mobile-phone:before {
849
+ content: "\f10b";
850
+ }
851
+ .ot-icon-circle-o:before {
852
+ content: "\f10c";
853
+ }
854
+ .ot-icon-quote-left:before {
855
+ content: "\f10d";
856
+ }
857
+ .ot-icon-quote-right:before {
858
+ content: "\f10e";
859
+ }
860
+ .ot-icon-spinner:before {
861
+ content: "\f110";
862
+ }
863
+ .ot-icon-circle:before {
864
+ content: "\f111";
865
+ }
866
+ .ot-icon-mail-reply:before {
867
+ content: "\f112";
868
+ }
869
+ .ot-icon-github-alt:before {
870
+ content: "\f113";
871
+ }
872
+ .ot-icon-folder-o:before {
873
+ content: "\f114";
874
+ }
875
+ .ot-icon-folder-open-o:before {
876
+ content: "\f115";
877
+ }
878
+ .ot-icon-smile-o:before {
879
+ content: "\f118";
880
+ }
881
+ .ot-icon-frown-o:before {
882
+ content: "\f119";
883
+ }
884
+ .ot-icon-meh-o:before {
885
+ content: "\f11a";
886
+ }
887
+ .ot-icon-gamepad:before {
888
+ content: "\f11b";
889
+ }
890
+ .ot-icon-keyboard-o:before {
891
+ content: "\f11c";
892
+ }
893
+ .ot-icon-flag-o:before {
894
+ content: "\f11d";
895
+ }
896
+ .ot-icon-flag-checkered:before {
897
+ content: "\f11e";
898
+ }
899
+ .ot-icon-terminal:before {
900
+ content: "\f120";
901
+ }
902
+ .ot-icon-code:before {
903
+ content: "\f121";
904
+ }
905
+ .ot-icon-reply-all:before {
906
+ content: "\f122";
907
+ }
908
+ .ot-icon-star-half-empty:before {
909
+ content: "\f123";
910
+ }
911
+ .ot-icon-location-arrow:before {
912
+ content: "\f124";
913
+ }
914
+ .ot-icon-crop:before {
915
+ content: "\f125";
916
+ }
917
+ .ot-icon-code-fork:before {
918
+ content: "\f126";
919
+ }
920
+ .ot-icon-unlink:before {
921
+ content: "\f127";
922
+ }
923
+ .ot-icon-question:before {
924
+ content: "\f128";
925
+ }
926
+ .ot-icon-info:before {
927
+ content: "\f129";
928
+ }
929
+ .ot-icon-exclamation:before {
930
+ content: "\f12a";
931
+ }
932
+ .ot-icon-superscript:before {
933
+ content: "\f12b";
934
+ }
935
+ .ot-icon-subscript:before {
936
+ content: "\f12c";
937
+ }
938
+ .ot-icon-eraser:before {
939
+ content: "\f12d";
940
+ }
941
+ .ot-icon-puzzle-piece:before {
942
+ content: "\f12e";
943
+ }
944
+ .ot-icon-microphone:before {
945
+ content: "\f130";
946
+ }
947
+ .ot-icon-microphone-slash:before {
948
+ content: "\f131";
949
+ }
950
+ .ot-icon-shield:before {
951
+ content: "\f132";
952
+ }
953
+ .ot-icon-calendar-o:before {
954
+ content: "\f133";
955
+ }
956
+ .ot-icon-fire-extinguisher:before {
957
+ content: "\f134";
958
+ }
959
+ .ot-icon-rocket:before {
960
+ content: "\f135";
961
+ }
962
+ .ot-icon-maxcdn:before {
963
+ content: "\f136";
964
+ }
965
+ .ot-icon-chevron-circle-left:before {
966
+ content: "\f137";
967
+ }
968
+ .ot-icon-chevron-circle-right:before {
969
+ content: "\f138";
970
+ }
971
+ .ot-icon-chevron-circle-up:before {
972
+ content: "\f139";
973
+ }
974
+ .ot-icon-chevron-circle-down:before {
975
+ content: "\f13a";
976
+ }
977
+ .ot-icon-html5:before {
978
+ content: "\f13b";
979
+ }
980
+ .ot-icon-css3:before {
981
+ content: "\f13c";
982
+ }
983
+ .ot-icon-anchor:before {
984
+ content: "\f13d";
985
+ }
986
+ .ot-icon-unlock-alt:before {
987
+ content: "\f13e";
988
+ }
989
+ .ot-icon-bullseye:before {
990
+ content: "\f140";
991
+ }
992
+ .ot-icon-ellipsis-h:before {
993
+ content: "\f141";
994
+ }
995
+ .ot-icon-ellipsis-v:before {
996
+ content: "\f142";
997
+ }
998
+ .ot-icon-rss-square:before {
999
+ content: "\f143";
1000
+ }
1001
+ .ot-icon-play-circle:before {
1002
+ content: "\f144";
1003
+ }
1004
+ .ot-icon-ticket:before {
1005
+ content: "\f145";
1006
+ }
1007
+ .ot-icon-minus-square:before {
1008
+ content: "\f146";
1009
+ }
1010
+ .ot-icon-minus-square-o:before {
1011
+ content: "\f147";
1012
+ }
1013
+ .ot-icon-level-up:before {
1014
+ content: "\f148";
1015
+ }
1016
+ .ot-icon-level-down:before {
1017
+ content: "\f149";
1018
+ }
1019
+ .ot-icon-check-square:before {
1020
+ content: "\f14a";
1021
+ }
1022
+ .ot-icon-pencil-square:before {
1023
+ content: "\f14b";
1024
+ }
1025
+ .ot-icon-external-link-square:before {
1026
+ content: "\f14c";
1027
+ }
1028
+ .ot-icon-share-square:before {
1029
+ content: "\f14d";
1030
+ }
1031
+ .ot-icon-compass:before {
1032
+ content: "\f14e";
1033
+ }
1034
+ .ot-icon-toggle-down:before {
1035
+ content: "\f150";
1036
+ }
1037
+ .ot-icon-toggle-up:before {
1038
+ content: "\f151";
1039
+ }
1040
+ .ot-icon-toggle-right:before {
1041
+ content: "\f152";
1042
+ }
1043
+ .ot-icon-euro:before {
1044
+ content: "\f153";
1045
+ }
1046
+ .ot-icon-gbp:before {
1047
+ content: "\f154";
1048
+ }
1049
+ .ot-icon-dollar:before {
1050
+ content: "\f155";
1051
+ }
1052
+ .ot-icon-rupee:before {
1053
+ content: "\f156";
1054
+ }
1055
+ .ot-icon-cny:before {
1056
+ content: "\f157";
1057
+ }
1058
+ .ot-icon-ruble:before {
1059
+ content: "\f158";
1060
+ }
1061
+ .ot-icon-won:before {
1062
+ content: "\f159";
1063
+ }
1064
+ .ot-icon-bitcoin:before {
1065
+ content: "\f15a";
1066
+ }
1067
+ .ot-icon-file:before {
1068
+ content: "\f15b";
1069
+ }
1070
+ .ot-icon-file-text:before {
1071
+ content: "\f15c";
1072
+ }
1073
+ .ot-icon-sort-alpha-asc:before {
1074
+ content: "\f15d";
1075
+ }
1076
+ .ot-icon-sort-alpha-desc:before {
1077
+ content: "\f15e";
1078
+ }
1079
+ .ot-icon-sort-amount-asc:before {
1080
+ content: "\f160";
1081
+ }
1082
+ .ot-icon-sort-amount-desc:before {
1083
+ content: "\f161";
1084
+ }
1085
+ .ot-icon-sort-numeric-asc:before {
1086
+ content: "\f162";
1087
+ }
1088
+ .ot-icon-sort-numeric-desc:before {
1089
+ content: "\f163";
1090
+ }
1091
+ .ot-icon-thumbs-up:before {
1092
+ content: "\f164";
1093
+ }
1094
+ .ot-icon-thumbs-down:before {
1095
+ content: "\f165";
1096
+ }
1097
+ .ot-icon-youtube-square:before {
1098
+ content: "\f166";
1099
+ }
1100
+ .ot-icon-youtube:before {
1101
+ content: "\f167";
1102
+ }
1103
+ .ot-icon-xing:before {
1104
+ content: "\f168";
1105
+ }
1106
+ .ot-icon-xing-square:before {
1107
+ content: "\f169";
1108
+ }
1109
+ .ot-icon-youtube-play:before {
1110
+ content: "\f16a";
1111
+ }
1112
+ .ot-icon-dropbox:before {
1113
+ content: "\f16b";
1114
+ }
1115
+ .ot-icon-stack-overflow:before {
1116
+ content: "\f16c";
1117
+ }
1118
+ .ot-icon-instagram:before {
1119
+ content: "\f16d";
1120
+ }
1121
+ .ot-icon-flickr:before {
1122
+ content: "\f16e";
1123
+ }
1124
+ .ot-icon-adn:before {
1125
+ content: "\f170";
1126
+ }
1127
+ .ot-icon-bitbucket:before {
1128
+ content: "\f171";
1129
+ }
1130
+ .ot-icon-bitbucket-square:before {
1131
+ content: "\f172";
1132
+ }
1133
+ .ot-icon-tumblr:before {
1134
+ content: "\f173";
1135
+ }
1136
+ .ot-icon-tumblr-square:before {
1137
+ content: "\f174";
1138
+ }
1139
+ .ot-icon-long-arrow-down:before {
1140
+ content: "\f175";
1141
+ }
1142
+ .ot-icon-long-arrow-up:before {
1143
+ content: "\f176";
1144
+ }
1145
+ .ot-icon-long-arrow-left:before {
1146
+ content: "\f177";
1147
+ }
1148
+ .ot-icon-long-arrow-right:before {
1149
+ content: "\f178";
1150
+ }
1151
+ .ot-icon-apple:before {
1152
+ content: "\f179";
1153
+ }
1154
+ .ot-icon-windows:before {
1155
+ content: "\f17a";
1156
+ }
1157
+ .ot-icon-android:before {
1158
+ content: "\f17b";
1159
+ }
1160
+ .ot-icon-linux:before {
1161
+ content: "\f17c";
1162
+ }
1163
+ .ot-icon-dribbble:before {
1164
+ content: "\f17d";
1165
+ }
1166
+ .ot-icon-skype:before {
1167
+ content: "\f17e";
1168
+ }
1169
+ .ot-icon-foursquare:before {
1170
+ content: "\f180";
1171
+ }
1172
+ .ot-icon-trello:before {
1173
+ content: "\f181";
1174
+ }
1175
+ .ot-icon-female:before {
1176
+ content: "\f182";
1177
+ }
1178
+ .ot-icon-male:before {
1179
+ content: "\f183";
1180
+ }
1181
+ .ot-icon-gittip:before {
1182
+ content: "\f184";
1183
+ }
1184
+ .ot-icon-sun-o:before {
1185
+ content: "\f185";
1186
+ }
1187
+ .ot-icon-moon-o:before {
1188
+ content: "\f186";
1189
+ }
1190
+ .ot-icon-archive:before {
1191
+ content: "\f187";
1192
+ }
1193
+ .ot-icon-bug:before {
1194
+ content: "\f188";
1195
+ }
1196
+ .ot-icon-vk:before {
1197
+ content: "\f189";
1198
+ }
1199
+ .ot-icon-weibo:before {
1200
+ content: "\f18a";
1201
+ }
1202
+ .ot-icon-renren:before {
1203
+ content: "\f18b";
1204
+ }
1205
+ .ot-icon-pagelines:before {
1206
+ content: "\f18c";
1207
+ }
1208
+ .ot-icon-stack-exchange:before {
1209
+ content: "\f18d";
1210
+ }
1211
+ .ot-icon-arrow-circle-o-right:before {
1212
+ content: "\f18e";
1213
+ }
1214
+ .ot-icon-arrow-circle-o-left:before {
1215
+ content: "\f190";
1216
+ }
1217
+ .ot-icon-toggle-left:before {
1218
+ content: "\f191";
1219
+ }
1220
+ .ot-icon-dot-circle-o:before {
1221
+ content: "\f192";
1222
+ }
1223
+ .ot-icon-wheelchair:before {
1224
+ content: "\f193";
1225
+ }
1226
+ .ot-icon-vimeo-square:before {
1227
+ content: "\f194";
1228
+ }
1229
+ .ot-icon-turkish-lira:before {
1230
+ content: "\f195";
1231
+ }
1232
+ .ot-icon-plus-square-o:before {
1233
+ content: "\f196";
1234
+ }
1235
+
1236
+ /* --------------------------------------------------
1237
+ :: Screen Meta & Menu Icon
1238
+ ---------------------------------------------------*/
1239
+ .appearance_page_ot-theme-options #screen-meta {
1240
+ margin-right: 20px;
1241
+ margin-left: 2px;
1242
+ min-width: 533px;
1243
+ }
1244
+
1245
+ /* --------------------------------------------------
1246
+ :: Messages
1247
+ ---------------------------------------------------*/
1248
+ .wrap.settings-wrap div.error,
1249
+ .wrap.settings-wrap div.updated {
1250
+ margin: 9px 5px 0px 2px !important;
1251
+ }
1252
+
1253
+ /* --------------------------------------------------
1254
+ :: OptionTree Wrappers
1255
+ ---------------------------------------------------*/
1256
+ #option-tree-settings-api .metabox-holder {
1257
+ overflow: hidden;
1258
+ }
1259
+ #option-tree-settings-api .postbox {
1260
+ background: #fff;
1261
+ border: none;
1262
+ margin: 0 20px;
1263
+ }
1264
+ #option-tree-settings-api .inside {
1265
+ margin: 0px !important;
1266
+ padding: 0px !important;
1267
+ }
1268
+ #option-tree-settings-api > .ui-tabs {
1269
+ background: #fff;
1270
+ border: 1px solid #ccc;
1271
+ border-top: none;
1272
+ margin: 0px 5px 0 2px;
1273
+ min-width: 533px;
1274
+ padding-bottom: 5px;
1275
+ position: relative;
1276
+ -webkit-box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1277
+ -moz-box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1278
+ box-shadow: inset 146px 0 0 #f1f1f1, inset 147px 0 0 #ccc, 0 1px 3px rgba(0,0,0,0.05);
1279
+ -webkit-border-radius: 0 0 2px 2px;
1280
+ -moz-border-radius: 0 0 2px 2px;
1281
+ border-radius: 0 0 2px 2px;
1282
+ }
1283
+
1284
+ /* --------------------------------------------------
1285
+ :: Header
1286
+ ---------------------------------------------------*/
1287
+ #option-tree-header-wrap {
1288
+ position: relative;
1289
+ }
1290
+ #option-tree-header {
1291
+ background: #333;
1292
+ color: #bbb;
1293
+ display: block;
1294
+ margin: 11px 5px 0 2px;
1295
+ min-width: 535px;
1296
+ overflow: hidden;
1297
+ position: relative;
1298
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1299
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1300
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1301
+ -webkit-border-radius: 2px 2px 0 0;
1302
+ -moz-border-radius: 2px 2px 0 0;
1303
+ border-radius: 2px 2px 0 0;
1304
+ }
1305
+ #option-tree-header li {
1306
+ display: block;
1307
+ float: left;
1308
+ margin: 0px;
1309
+ padding: 0px;
1310
+ }
1311
+ #option-tree-header li a {
1312
+ color: #999;
1313
+ text-decoration: none;
1314
+ -webkit-transition: none;
1315
+ -moz-transition: none;
1316
+ transition: none;
1317
+ }
1318
+ #option-tree-header li a:hover {
1319
+ color: #0074a2;
1320
+ }
1321
+ #option-tree-header #option-tree-logo a {
1322
+ border-right: 1px solid #000;
1323
+ float: left;
1324
+ height: 24px;
1325
+ padding: 3px 12px 3px 13px;
1326
+ width: 20px;
1327
+ }
1328
+ #option-tree-header #option-tree-logo a:before {
1329
+ content: "\e785";
1330
+ font: normal 20px/1 "option-tree-font" !important;
1331
+ speak: none;
1332
+ padding: 2px 0;
1333
+ height: 24px;
1334
+ width: 20px;
1335
+ display: inline-block;
1336
+ -webkit-font-smoothing: antialiased;
1337
+ -moz-osx-font-smoothing: grayscale;
1338
+ -webkit-transition: all .1s ease-in-out;
1339
+ -moz-transition: all .1s ease-in-out;
1340
+ transition: all .1s ease-in-out;
1341
+ }
1342
+ #option-tree-header li#option-tree-logo:hover {
1343
+ background-color: #222;
1344
+ color: #0074a2;
1345
+ -webkit-border-top-left-radius: 2px;
1346
+ -moz-border-radius-topleft: 2px;
1347
+ border-top-left-radius: 2px;
1348
+ }
1349
+ #option-tree-header li#option-tree-logo:hover a {
1350
+ border-right-color: #000;
1351
+ }
1352
+ #option-tree-header #option-tree-version span,
1353
+ #option-tree-header #theme-version span {
1354
+ border-left: 1px solid #444;
1355
+ display: block;
1356
+ float: left;
1357
+ height: 24px;
1358
+ line-height: 24px;
1359
+ padding: 3px 12px 3px 12px;
1360
+ }
1361
+ #option-tree-header #theme-version:before {
1362
+ border-right: 1px solid #000;
1363
+ content: "";
1364
+ display: block;
1365
+ float: left;
1366
+ height: 30px;
1367
+ }
1368
+ /* light */
1369
+ .admin-color-light #option-tree-header {
1370
+ background: #888;
1371
+ color: #fff;
1372
+ }
1373
+ .admin-color-light #option-tree-header li a {
1374
+ color: #ccc;
1375
+ }
1376
+ .admin-color-light #option-tree-header li a:hover {
1377
+ color: #eee;
1378
+ }
1379
+ .admin-color-light #option-tree-header #option-tree-logo a,
1380
+ .admin-color-light #option-tree-header #theme-version:before {
1381
+ border-right-color: #3c3c3c;
1382
+ }
1383
+ .admin-color-light #option-tree-header li#option-tree-logo:hover {
1384
+ background-color: #777;
1385
+ }
1386
+ .admin-color-light #option-tree-header li#option-tree-logo:hover a {
1387
+ border-right-color: #3c3c3c;
1388
+ }
1389
+ .admin-color-light #option-tree-header #option-tree-version span,
1390
+ .admin-color-light #option-tree-header #theme-version span {
1391
+ border-left-color: #999;
1392
+ }
1393
+ /* blue */
1394
+ .admin-color-blue #option-tree-header {
1395
+ background: #52accc;
1396
+ color: #fff;
1397
+ }
1398
+ .admin-color-blue #option-tree-header li a {
1399
+ color: #e2f8ff;
1400
+ }
1401
+ .admin-color-blue #option-tree-header li a:hover {
1402
+ color: #fff;
1403
+ }
1404
+ .admin-color-blue #option-tree-header #option-tree-logo a,
1405
+ .admin-color-blue #option-tree-header #theme-version:before {
1406
+ border-right-color: #002b39;
1407
+ }
1408
+ .admin-color-blue #option-tree-header li#option-tree-logo:hover {
1409
+ background-color: #006484;
1410
+ }
1411
+ .admin-color-blue #option-tree-header li#option-tree-logo:hover a {
1412
+ border-right-color: #002b39;
1413
+ }
1414
+ .admin-color-blue #option-tree-header #option-tree-version span,
1415
+ .admin-color-blue #option-tree-header #theme-version span {
1416
+ border-left-color: #5dc2e6;
1417
+ }
1418
+ /* coffee */
1419
+ .admin-color-coffee #option-tree-header {
1420
+ background: #59524c;
1421
+ color: #c7cbc9;
1422
+ }
1423
+ .admin-color-coffee #option-tree-header li a {
1424
+ color: #f3f2f1;
1425
+ }
1426
+ .admin-color-coffee #option-tree-header li a:hover {
1427
+ color: #fff;
1428
+ }
1429
+ .admin-color-coffee #option-tree-header #option-tree-logo a,
1430
+ .admin-color-coffee #option-tree-header #theme-version:before {
1431
+ border-right-color: #0f0e0d;
1432
+ }
1433
+ .admin-color-coffee #option-tree-header li#option-tree-logo:hover {
1434
+ background-color: #cca588;
1435
+ }
1436
+ .admin-color-coffee #option-tree-header li#option-tree-logo:hover a {
1437
+ border-right-color: #0f0e0d;
1438
+ }
1439
+ .admin-color-coffee #option-tree-header #option-tree-version span,
1440
+ .admin-color-coffee #option-tree-header #theme-version span {
1441
+ border-left-color: #675f58;
1442
+ }
1443
+ /* ectoplasm */
1444
+ .admin-color-ectoplasm #option-tree-header {
1445
+ background: #523f6d;
1446
+ color: #c6c6d3;
1447
+ }
1448
+ .admin-color-ectoplasm #option-tree-header li a {
1449
+ color: #f3f2f1;
1450
+ }
1451
+ .admin-color-ectoplasm #option-tree-header li a:hover {
1452
+ color: #fff;
1453
+ }
1454
+ .admin-color-ectoplasm #option-tree-header #option-tree-logo a,
1455
+ .admin-color-ectoplasm #option-tree-header #theme-version:before {
1456
+ border-right-color: #181220;
1457
+ }
1458
+ .admin-color-ectoplasm #option-tree-header li#option-tree-logo:hover {
1459
+ background-color: #a3b542;
1460
+ }
1461
+ .admin-color-ectoplasm #option-tree-header li#option-tree-logo:hover a {
1462
+ border-right-color: #181220;
1463
+ }
1464
+ .admin-color-ectoplasm #option-tree-header #option-tree-version span,
1465
+ .admin-color-ectoplasm #option-tree-header #theme-version span {
1466
+ border-left-color: #644d85;
1467
+ }
1468
+ /* midnight */
1469
+ .admin-color-midnight #option-tree-header {
1470
+ background: #363b3f;
1471
+ color: #f1f2f3;
1472
+ }
1473
+ .admin-color-midnight #option-tree-header li a {
1474
+ color: #f1f2f3;
1475
+ }
1476
+ .admin-color-midnight #option-tree-header li a:hover {
1477
+ color: #fff;
1478
+ }
1479
+ .admin-color-midnight #option-tree-header #option-tree-logo a,
1480
+ .admin-color-midnight #option-tree-header #theme-version:before {
1481
+ border-right-color: #090a0b;
1482
+ }
1483
+ .admin-color-midnight #option-tree-header li#option-tree-logo:hover {
1484
+ background-color: #ed543f;
1485
+ }
1486
+ .admin-color-midnight #option-tree-header li#option-tree-logo:hover a {
1487
+ border-right-color: #090a0b;
1488
+ }
1489
+ .admin-color-midnight #option-tree-header #option-tree-version span,
1490
+ .admin-color-midnight #option-tree-header #theme-version span {
1491
+ border-left-color: #4c5359;
1492
+ }
1493
+ /* ocean */
1494
+ .admin-color-ocean #option-tree-header {
1495
+ background: #738e96;
1496
+ color: #f1fcff;
1497
+ }
1498
+ .admin-color-ocean #option-tree-header li a {
1499
+ color: #f1fcff;
1500
+ }
1501
+ .admin-color-ocean #option-tree-header li a:hover {
1502
+ color: #fff;
1503
+ }
1504
+ .admin-color-ocean #option-tree-header #option-tree-logo a,
1505
+ .admin-color-ocean #option-tree-header #theme-version:before {
1506
+ border-right-color: #39464a;
1507
+ }
1508
+ .admin-color-ocean #option-tree-header li#option-tree-logo:hover {
1509
+ background-color: #9ab8a0;
1510
+ }
1511
+ .admin-color-ocean #option-tree-header li#option-tree-logo:hover a {
1512
+ border-right-color: #39464a;
1513
+ }
1514
+ .admin-color-ocean #option-tree-header #option-tree-version span,
1515
+ .admin-color-ocean #option-tree-header #theme-version span {
1516
+ border-left-color: #87a6af;
1517
+ }
1518
+ /* sunrise */
1519
+ .admin-color-sunrise #option-tree-header {
1520
+ background: #da4f41;
1521
+ color: #fff;
1522
+ }
1523
+ .admin-color-sunrise #option-tree-header li a {
1524
+ color: #f3f1f1;
1525
+ }
1526
+ .admin-color-sunrise #option-tree-header li a:hover {
1527
+ color: #fff;
1528
+ }
1529
+ .admin-color-sunrise #option-tree-header #option-tree-logo a,
1530
+ .admin-color-sunrise #option-tree-header #theme-version:before {
1531
+ border-right-color: #8a322a;
1532
+ }
1533
+ .admin-color-sunrise #option-tree-header li#option-tree-logo:hover {
1534
+ background-color: #e88436;
1535
+ }
1536
+ .admin-color-sunrise #option-tree-header li#option-tree-logo:hover a {
1537
+ border-right-color: #8a322a;
1538
+ }
1539
+ .admin-color-sunrise #option-tree-header #option-tree-version span,
1540
+ .admin-color-sunrise #option-tree-header #theme-version span {
1541
+ border-left-color: #e75546;
1542
+ }
1543
+
1544
+ /* --------------------------------------------------
1545
+ :: Sub Header
1546
+ ---------------------------------------------------*/
1547
+ #option-tree-sub-header {
1548
+ background: #fafafa;
1549
+ border: 1px solid #ccc;
1550
+ border-top: none;
1551
+ display: block;
1552
+ margin: 0 5px 0 2px;
1553
+ min-width: 523px;
1554
+ overflow: hidden;
1555
+ padding: 5px;
1556
+ position: relative;
1557
+ -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1558
+ -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1559
+ box-shadow: inset 0 1px 0 #fff, 0 1px 3px rgba(0,0,0,0.05);
1560
+ }
1561
+
1562
+ /* --------------------------------------------------
1563
+ :: Tabs
1564
+ ---------------------------------------------------*/
1565
+ .wrap.settings-wrap .ui-tabs-nav {
1566
+ float: left;
1567
+ list-style: none;
1568
+ margin: 0 0 0 -4px;
1569
+ padding: 1em 0;
1570
+ width: 151px;
1571
+ }
1572
+ .wrap.settings-wrap .ui-tabs-nav li {
1573
+ border: 1px solid transparent;
1574
+ border-right-width: 0px;
1575
+ display: block; margin: 0;
1576
+ -webkit-border-radius: 2px 0 0 2px;
1577
+ -moz-border-radius: 2px 0 0 2px;
1578
+ border-radius: 2px 0 0 2px;
1579
+ }
1580
+ .wrap.settings-wrap .ui-tabs-nav li.ui-state-active {
1581
+ background: #fff;
1582
+ border-color: #ccc;
1583
+ color: #000;
1584
+ }
1585
+ .wrap.settings-wrap .ui-tabs-nav li a {
1586
+ color: #21759b;
1587
+ display: block;
1588
+ line-height: 18px;
1589
+ padding: 5px 5px 5px 12px;
1590
+ text-decoration: none;
1591
+ }
1592
+ .wrap.settings-wrap .ui-tabs-nav li a:hover,
1593
+ .wrap.settings-wrap .ui-tabs-nav li.ui-state-active a {
1594
+ color: #000;
1595
+ outline: none;
1596
+ }
1597
+ .wrap.settings-wrap .ui-tabs-panel {
1598
+ clear: both;
1599
+ }
1600
+ .wrap.settings-wrap .ui-tabs-nav li a:focus { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; }
1601
+ /* --------------------------------------------------
1602
+ :: Format Settings
1603
+ ---------------------------------------------------*/
1604
+ .format-settings {
1605
+ position: relative;
1606
+ width: 100%;
1607
+ }
1608
+ .format-setting-wrap,
1609
+ .option-tree-sortable .format-settings {
1610
+ padding: 10px 0 20px 0;
1611
+ }
1612
+
1613
+ /* --------------------------------------------------
1614
+ :: Format Setting Label
1615
+ ---------------------------------------------------*/
1616
+ .format-setting-label {
1617
+ border-bottom: 1px solid #F0F0F0;
1618
+ margin: 0 0 20px 0;
1619
+ padding: 5px 0px 1px 0px;
1620
+ width: 100%;
1621
+ }
1622
+ #option-tree-settings-api .description h3,
1623
+ #option-tree-settings-api .format-setting-label .label,
1624
+ #poststuff .format-setting-label .label {
1625
+ background: none;
1626
+ border: none;
1627
+ color: #222;
1628
+ cursor: text;
1629
+ display: block;
1630
+ font-size: 1.3em;
1631
+ font-weight: 800;
1632
+ line-height: 1.6em;
1633
+ letter-spacing: 0;
1634
+ padding: 0 0 9px 0;
1635
+ -webkit-user-select: text;
1636
+ text-shadow: none;
1637
+ }
1638
+
1639
+ /* --------------------------------------------------
1640
+ :: Format Setting
1641
+ ---------------------------------------------------*/
1642
+ .format-setting {
1643
+ overflow: hidden;
1644
+ position: relative;
1645
+ width: 100%;
1646
+ }
1647
+ .format-setting .format-setting-inner {
1648
+ float: left;
1649
+ position: relative;
1650
+ width: 63%;
1651
+ }
1652
+ .format-setting.no-desc > .format-setting-inner,
1653
+ .format-setting.wide-desc .format-setting-inner {
1654
+ width: 100%;
1655
+ }
1656
+ .format-setting .description {
1657
+ float: right;
1658
+ padding: 5px 0;
1659
+ width: 35%;
1660
+ font-size: 14px;
1661
+ }
1662
+ .format-setting.no-desc > .description,
1663
+ .format-setting.wide-desc .description {
1664
+ float: none;
1665
+ width: 100%;
1666
+ }
1667
+ .list-item-description {
1668
+ padding-top: 10px;
1669
+ }
1670
+ #option-tree-settings-api h4 {
1671
+ color: #333;
1672
+ font-size: 1.2em;
1673
+ font-weight: 500;
1674
+ line-height: 1.5em;
1675
+ margin: 1em 0 0.5em 0;
1676
+ padding: 0;
1677
+ }
1678
+ #option-tree-settings-api h5 {
1679
+ color: #444;
1680
+ font-size: 1em;
1681
+ font-weight: 700;
1682
+ line-height: 1.2em;
1683
+ margin: 1em 0 0.5em 0;
1684
+ padding: 0;
1685
+ }
1686
+ #option-tree-settings-api p {
1687
+ margin: 0 0 1.5em 0 !important;
1688
+ }
1689
+ #post .format-setting-inner p {
1690
+ float: left;
1691
+ width: 100%;
1692
+ margin: 0 0 1.05em 0 !important;
1693
+ }
1694
+ .aside {
1695
+ border-bottom: 1px solid #eee;
1696
+ padding-bottom: 15px;
1697
+ margin-bottom: 15px;
1698
+ }
1699
+ .deprecated {
1700
+ border-bottom: 1px solid #eee;
1701
+ color: #b94029;
1702
+ padding-bottom: 15px;
1703
+ margin-bottom: 15px;
1704
+ }
1705
+ .warning {
1706
+ color: #b94029;
1707
+ }
1708
+ .docs-ul {
1709
+ line-height: 1.3em;
1710
+ margin: 0;
1711
+ padding: 0 0 1em 0;
1712
+ }
1713
+ .docs-ul li {
1714
+ list-style-type: square;
1715
+ margin-left: 20px;
1716
+ }
1717
+ #contextual-help-setting {
1718
+ float: left;
1719
+ padding: 10px 0 5px 0;
1720
+ width: 100%;
1721
+ }
1722
+ #contextual-help-label {
1723
+ float: left;
1724
+ padding-top: 20px;
1725
+ width: 100%;
1726
+ }
1727
+ #option_tree_settings_help {
1728
+ float: left;
1729
+ width: 100%;
1730
+ }
1731
+ #option-tree-settings-api blockquote {
1732
+ font-style: italic;
1733
+ padding-left: 15px;
1734
+ position: relative;
1735
+ }
1736
+ #option-tree-settings-api blockquote:before {
1737
+ color: #ccc;
1738
+ content: "\201C";
1739
+ display: block;
1740
+ font-size: 400%;
1741
+ font-style: normal;
1742
+ left: -10px;
1743
+ position: absolute;
1744
+ top: 10px;
1745
+ }
1746
+ @media only screen and (max-width: 1020px) {
1747
+ .format-setting .description,
1748
+ .format-setting .format-setting-inner {
1749
+ width: 100%;
1750
+ }
1751
+ .format-setting .description {
1752
+ padding-top: 0px;
1753
+ padding-bottom: 20px;
1754
+ }
1755
+ }
1756
+ .ot-background-group {
1757
+ overflow: hidden;
1758
+ width: auto;
1759
+ }
1760
+ .ot-background-size-input {
1761
+ max-width: 110px;
1762
+ }
1763
+ .option-tree-setting-edit,
1764
+ .option-tree-setting-remove {
1765
+ text-indent: -9999px;
1766
+ }
1767
+
1768
+ /* --------------------------------------------------
1769
+ :: Code formatting
1770
+ ---------------------------------------------------*/
1771
+ #option-tree-settings-api code,
1772
+ .ot-metabox-wrapper code {
1773
+ background-color: #f1f1f1;
1774
+ color: #333;
1775
+ font-size: 12px;
1776
+ }
1777
+ #option-tree-settings-api pre {
1778
+ font-size: 13px;
1779
+ padding: 0;
1780
+ margin: 1.5em 0;
1781
+ line-height: 18px;
1782
+ overflow: auto;
1783
+ overflow-Y: hidden;
1784
+ padding-top: 18px;
1785
+ background: #f1f1f1;
1786
+ border-bottom: 1px solid #f1f1f1;
1787
+ margin-bottom: 20px;
1788
+ color: #000;
1789
+ white-space: pre-wrap;
1790
+ word-wrap: break-word;
1791
+ }
1792
+ #option-tree-settings-api pre code {
1793
+ padding: 0 18px 18px 18px;
1794
+ display: block;
1795
+ background: url(../images/ot-pre-bg.gif) repeat left top;
1796
+ }
1797
+
1798
+ /* --------------------------------------------------
1799
+ :: Input & Upload
1800
+ ---------------------------------------------------*/
1801
+ input.option-tree-ui-upload-input,
1802
+ input.option-tree-ui-input {
1803
+ background: #fff;
1804
+ border: 1px solid #ccc !important;
1805
+ line-height: 17px;
1806
+ font-size: 12px;
1807
+ margin-bottom: 5px !important;
1808
+ padding: 7px 6px;
1809
+ position: relative;
1810
+ width: 100% !important;
1811
+ -webkit-border-radius: 2px;
1812
+ -moz-border-radius: 2px;
1813
+ border-radius: 2px;
1814
+ -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1815
+ -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1816
+ box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
1817
+ }
1818
+ input:hover.option-tree-ui-upload-input,
1819
+ input:hover.option-tree-ui-input {
1820
+ border-color: #bbb !important;
1821
+ -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1822
+ -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1823
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1824
+ }
1825
+ input:focus.option-tree-ui-upload-input,
1826
+ input:focus.option-tree-ui-input {
1827
+ border-color: #999 !important;
1828
+ }
1829
+
1830
+ @media screen and (-webkit-min-device-pixel-ratio:0) {
1831
+ .option-tree-ui-input,
1832
+ .option-tree-ui-upload-input {
1833
+ padding: 5px 6px !important;
1834
+ }
1835
+ }
1836
+
1837
+ /* --------------------------------------------------
1838
+ :: Upload
1839
+ ---------------------------------------------------*/
1840
+ div.option-tree-ui-media-wrap {
1841
+ margin: 0 55px 0 0;
1842
+ min-height: 35px;
1843
+ position: relative;
1844
+ }
1845
+ .option-tree-ui-media-wrap img {
1846
+ background: #fafafa;
1847
+ border: 1px solid #ccc;
1848
+ padding: 4px;
1849
+ display: block;
1850
+ float: left;
1851
+ max-width: 100%;
1852
+ height: auto;
1853
+ -ms-interpolation-mode: bicubic;
1854
+ -webkit-border-radius: 2px;
1855
+ -moz-border-radius: 2px;
1856
+ border-radius: 2px;
1857
+ }
1858
+ .option-tree-ui-upload-parent {
1859
+ width: auto !important;
1860
+ margin-right: 45px;
1861
+ padding: 0px;
1862
+ position: relative;
1863
+ }
1864
+ .ot_upload_media {
1865
+ top: 0px;
1866
+ margin: 0px !important;
1867
+ position: absolute;
1868
+ right: -45px;
1869
+ text-indent: -9999px;
1870
+ }
1871
+ .option-tree-ui-media-wrap a.option-tree-ui-remove-media {
1872
+ float: none !important;
1873
+ margin: 0px !important;
1874
+ position: absolute !important;
1875
+ right: -55px;
1876
+ text-indent: -9999px;
1877
+ top: 1px;
1878
+ }
1879
+
1880
+ /* --------------------------------------------------
1881
+ :: Textarea
1882
+ ---------------------------------------------------*/
1883
+ .fill-area .description,
1884
+ .fill-area .format-setting-inner {
1885
+ width: 100% !important;
1886
+ }
1887
+ .wp-editor-area {
1888
+ display: block;
1889
+ }
1890
+ .textarea,
1891
+ .ot-metabox-wrapper textarea {
1892
+ width: 99.9%;
1893
+ border: 1px solid #ccc;
1894
+ font-family: Consolas, Monaco, monospace;
1895
+ line-height: 150%;
1896
+ outline: 0;
1897
+ padding: 10px;
1898
+ resize: vertical;
1899
+ }
1900
+ #contextual-help-setting .textarea {
1901
+ width: 99.75%;
1902
+ }
1903
+ .ot-metabox-wrapper .wp-editor-container {
1904
+ border: none;
1905
+ }
1906
+ .textarea:hover,
1907
+ .ot-metabox-wrapper textarea:hover {
1908
+ border-color: #bbb !important;
1909
+ -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1910
+ -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1911
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1912
+ }
1913
+ .textarea:focus,
1914
+ .ot-metabox-wrapper textarea:focus {
1915
+ border-color: #999 !important;
1916
+ }
1917
+
1918
+ @media only screen and (max-width: 1105px) {
1919
+ .type-textarea .description, .type-textarea .format-setting-inner {
1920
+ width: 100%;
1921
+ }
1922
+ }
1923
+
1924
+ /* --------------------------------------------------
1925
+ :: Setting Item with Drag & Drop
1926
+ ---------------------------------------------------*/
1927
+ .option-tree-setting-wrap {
1928
+ margin-top: 0px;
1929
+ }
1930
+ .option-tree-setting-wrap li {
1931
+ margin: 5px 0px;
1932
+ }
1933
+ .option-tree-setting {
1934
+ border: 1px solid #ccc;
1935
+ overflow: hidden;
1936
+ position: relative;
1937
+ -webkit-border-radius: 2px;
1938
+ -moz-border-radius: 2px;
1939
+ border-radius: 2px;
1940
+ }
1941
+ .option-tree-setting:hover {
1942
+ border-color: #999;
1943
+ -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1944
+ -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1945
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
1946
+ }
1947
+ .option-tree-setting a {
1948
+ text-decoration: none;
1949
+ }
1950
+ .option-tree-setting .open {
1951
+ background: #fafafa;
1952
+ line-height: 21px;
1953
+ height: 21px;
1954
+ padding: 10px 100px 10px 10px;
1955
+ display: block;
1956
+ }
1957
+ .option-tree-sortable .open {
1958
+ cursor: move;
1959
+ }
1960
+ .ui-state-disabled .option-tree-setting .open {
1961
+ cursor: default;
1962
+ }
1963
+ .option-tree-setting .open:hover {
1964
+ background: #fafafa;
1965
+ }
1966
+ .option-tree-setting .open:hover:before {
1967
+ color: #999;
1968
+ content: "\f142";
1969
+ left: 4px;
1970
+ font-family: "option-tree-font";
1971
+ speak: none;
1972
+ font-size: 14px;
1973
+ font-style: normal;
1974
+ font-weight: normal;
1975
+ font-variant: normal;
1976
+ text-transform: none;
1977
+ line-height: 1;
1978
+ position: absolute;
1979
+ top: 14px;
1980
+ -webkit-font-smoothing: antialiased;
1981
+ -moz-osx-font-smoothing: grayscale;
1982
+ }
1983
+ .option-tree-setting.is-section .open:hover:before {
1984
+ color: #000;
1985
+ }
1986
+ .button-section {
1987
+ position: absolute;
1988
+ right: 0px;
1989
+ top: 1px;
1990
+ }
1991
+ .option-tree-setting.is-section {
1992
+ border: 1px solid #000;
1993
+ }
1994
+ .option-tree-setting.is-section .option-tree-setting-body,
1995
+ .option-tree-setting.is-section .option-tree-ui-button {
1996
+ border-right-color: #000 !important;
1997
+ }
1998
+ .option-tree-setting.is-section .open {
1999
+ background: #333;
2000
+ color: #bbb;
2001
+ }
2002
+ .format-setting .ui-sortable-helper .option-tree-setting .open {
2003
+ background: #fff;
2004
+ }
2005
+ .option-tree-setting.is-section .open:hover,
2006
+ .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2007
+ background: #333;
2008
+ }
2009
+ /* light */
2010
+ .admin-color-light .option-tree-setting.is-section,
2011
+ .admin-color-light .option-tree-setting.is-section .option-tree-setting-body,
2012
+ .admin-color-light .option-tree-setting.is-section .option-tree-ui-button {
2013
+ border-color: #3c3c3c !important;
2014
+ }
2015
+ .admin-color-light .option-tree-setting.is-section .open:hover:before {
2016
+ color: #3c3c3c;
2017
+ }
2018
+ .admin-color-light .option-tree-setting.is-section .open {
2019
+ background: #888;
2020
+ color: #fff;
2021
+ }
2022
+ .admin-color-light .option-tree-setting.is-section .open:hover,
2023
+ .admin-color-light .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2024
+ background: #888;
2025
+ }
2026
+ /* blue */
2027
+ .admin-color-blue .option-tree-setting.is-section,
2028
+ .admin-color-blue .option-tree-setting.is-section .option-tree-setting-body,
2029
+ .admin-color-blue .option-tree-setting.is-section .option-tree-ui-button {
2030
+ border-color: #002b39 !important;
2031
+ }
2032
+ .admin-color-blue .option-tree-setting.is-section .open:hover:before {
2033
+ color: #002b39;
2034
+ }
2035
+ .admin-color-blue .option-tree-setting.is-section .open {
2036
+ background: #52accc;
2037
+ color: #fff;
2038
+ }
2039
+ .admin-color-blue .option-tree-setting.is-section .open:hover,
2040
+ .admin-color-blue .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2041
+ background: #52accc;
2042
+ }
2043
+ /* coffee */
2044
+ .admin-color-coffee .option-tree-setting.is-section,
2045
+ .admin-color-coffee .option-tree-setting.is-section .option-tree-setting-body,
2046
+ .admin-color-coffee .option-tree-setting.is-section .option-tree-ui-button {
2047
+ border-color: #0f0e0d !important;
2048
+ }
2049
+ .admin-color-coffee .option-tree-setting.is-section .open:hover:before {
2050
+ color: #0f0e0d;
2051
+ }
2052
+ .admin-color-coffee .option-tree-setting.is-section .open {
2053
+ background: #59524c;
2054
+ color: #c7cbc9;
2055
+ }
2056
+ .admin-color-coffee .option-tree-setting.is-section .open:hover,
2057
+ .admin-color-coffee .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2058
+ background: #59524c;
2059
+ }
2060
+ /* ectoplasm */
2061
+ .admin-color-ectoplasm .option-tree-setting.is-section,
2062
+ .admin-color-ectoplasm .option-tree-setting.is-section .option-tree-setting-body,
2063
+ .admin-color-ectoplasm .option-tree-setting.is-section .option-tree-ui-button {
2064
+ border-color: #181220 !important;
2065
+ }
2066
+ .admin-color-ectoplasm .option-tree-setting.is-section .open:hover:before {
2067
+ color: #181220;
2068
+ }
2069
+ .admin-color-ectoplasm .option-tree-setting.is-section .open {
2070
+ background: #523f6d;
2071
+ color: #c6c6d3;
2072
+ }
2073
+ .admin-color-ectoplasm .option-tree-setting.is-section .open:hover,
2074
+ .admin-color-ectoplasm .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2075
+ background: #523f6d;
2076
+ }
2077
+ /* midnight */
2078
+ .admin-color-midnight .option-tree-setting.is-section,
2079
+ .admin-color-midnight .option-tree-setting.is-section .option-tree-setting-body,
2080
+ .admin-color-midnight .option-tree-setting.is-section .option-tree-ui-button {
2081
+ border-color: #090a0b !important;
2082
+ }
2083
+ .admin-color-midnight .option-tree-setting.is-section .open:hover:before {
2084
+ color: #090a0b;
2085
+ }
2086
+ .admin-color-midnight .option-tree-setting.is-section .open {
2087
+ background: #363b3f;
2088
+ color: #f1f2f3;
2089
+ }
2090
+ .admin-color-midnight .option-tree-setting.is-section .open:hover,
2091
+ .admin-color-midnight .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2092
+ background: #363b3f;
2093
+ }
2094
+ /* ocean */
2095
+ .admin-color-ocean .option-tree-setting.is-section,
2096
+ .admin-color-ocean .option-tree-setting.is-section .option-tree-setting-body,
2097
+ .admin-color-ocean .option-tree-setting.is-section .option-tree-ui-button {
2098
+ border-color: #39464a !important;
2099
+ }
2100
+ .admin-color-ocean .option-tree-setting.is-section .open:hover:before {
2101
+ color: #39464a;
2102
+ }
2103
+ .admin-color-ocean .option-tree-setting.is-section .open {
2104
+ background: #738e96;
2105
+ color: #f1fcff;
2106
+ }
2107
+ .admin-color-ocean .option-tree-setting.is-section .open:hover,
2108
+ .admin-color-ocean .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2109
+ background: #738e96;
2110
+ }
2111
+ /* sunrise */
2112
+ .admin-color-sunrise .option-tree-setting.is-section,
2113
+ .admin-color-sunrise .option-tree-setting.is-section .option-tree-setting-body,
2114
+ .admin-color-sunrise .option-tree-setting.is-section .option-tree-ui-button {
2115
+ border-color: #8a322a !important;
2116
+ }
2117
+ .admin-color-sunrise .option-tree-setting.is-section .open:hover:before {
2118
+ color: #8a322a;
2119
+ }
2120
+ .admin-color-sunrise .option-tree-setting.is-section .open {
2121
+ background: #da4f41;
2122
+ color: #fff;
2123
+ }
2124
+ .admin-color-sunrise .option-tree-setting.is-section .open:hover,
2125
+ .admin-color-sunrise .format-setting .ui-sortable-helper .option-tree-setting.is-section .open {
2126
+ background: #da4f41;
2127
+ }
2128
+ .ui-state-highlight {
2129
+ border: 1px dashed #ccc;
2130
+ display: block;
2131
+ -webkit-border-radius: 2px;
2132
+ -moz-border-radius: 2px;
2133
+ border-radius: 2px;
2134
+ }
2135
+ .option-tree-setting-body {
2136
+ background: #fff;
2137
+ border-top: 1px solid #ccc;
2138
+ display: none;
2139
+ padding: 10px;
2140
+ -webkit-border-bottom-right-radius: 2px;
2141
+ -webkit-border-bottom-left-radius: 2px;
2142
+ -moz-border-radius-bottomright: 2px;
2143
+ -moz-border-radius-bottomleft: 2px;
2144
+ border-bottom-right-radius: 2px;
2145
+ border-bottom-left-radius: 2px;
2146
+ }
2147
+ li ul .format-setting-wrap {
2148
+ padding: 0 0 10px 0;
2149
+ }
2150
+ li ul .format-setting-label {
2151
+ border: none;
2152
+ padding: 0px;
2153
+ margin: 0px;
2154
+ }
2155
+
2156
+ /* --------------------------------------------------
2157
+ :: Layouts
2158
+ ---------------------------------------------------*/
2159
+ #option_tree_layouts {
2160
+ display: none;
2161
+ padding-top: 12px;
2162
+ }
2163
+ #option-tree-options-layouts-form {
2164
+ left: 13px;
2165
+ position: absolute;
2166
+ top: 30px;
2167
+ z-index: 10;
2168
+ }
2169
+ .option-tree-save-layout {
2170
+ float: left;
2171
+ padding: 10px 0;
2172
+ }
2173
+ .option-tree-save-layout.active-layout {
2174
+ padding-left: 10px;
2175
+ }
2176
+ .option-tree-save-layout .widefat {
2177
+ float: left;
2178
+ width: 128px !important;
2179
+ margin: 0;
2180
+ }
2181
+ .option-tree-active-layout {
2182
+ border-right: 1px solid #ccc;
2183
+ float: left;
2184
+ padding: 10px 10px 10px 0;
2185
+ min-width: 126px;
2186
+ }
2187
+ .button.save-layout {
2188
+ margin: 0 0 0 10px !important;
2189
+ }
2190
+ .option-tree-layout-activate {
2191
+ text-indent: -9999px;
2192
+ }
2193
+ .option-tree-layout-activate .icon:before {
2194
+ content: "\f096";
2195
+ position: relative;
2196
+ top: 1px;
2197
+ }
2198
+ .option-tree-layout-activate.active .icon:before {
2199
+ content: "\f046";
2200
+ padding-left: 1px;
2201
+ }
2202
+
2203
+ /* --------------------------------------------------
2204
+ :: Option Group
2205
+ ---------------------------------------------------*/
2206
+ .ot-option-group {
2207
+ float: left;
2208
+ padding-right: 5px;
2209
+ position: relative;
2210
+ width: 20%;
2211
+ box-sizing: border-box;
2212
+ }
2213
+ .ot-option-group--three-fourths {
2214
+ width: 75%;
2215
+ }
2216
+ .ot-option-group--two-thirds {
2217
+ width: 66.6%;
2218
+ }
2219
+ .ot-option-group--one-half {
2220
+ width: 50%;
2221
+ }
2222
+ .ot-option-group--one-third {
2223
+ width: 33.3%;
2224
+ }
2225
+ .ot-option-group--one-fourth {
2226
+ width: 25%;
2227
+ }
2228
+ .ot-option-group--one-fifth {
2229
+ width: 20%;
2230
+ }
2231
+ .ot-option-group--one-sixth {
2232
+ width: 16.6%;
2233
+ }
2234
+ .ot-option-group--one-eighth {
2235
+ width: 12.5%;
2236
+ }
2237
+ .ot-option-group--is-last {
2238
+ padding-right: 0;
2239
+ }
2240
+ .ot-option-group--icon {
2241
+ background: #fafafa;
2242
+ border-right: 1px solid #ccc;
2243
+ display: inline-block;
2244
+ font-size: 14px;
2245
+ line-height: 14px;
2246
+ padding: 6px 6px 7px;
2247
+ position: absolute;
2248
+ text-align: center;
2249
+ top: 1px;
2250
+ left: 1px;
2251
+ width: 14px;
2252
+ z-index: 10;
2253
+ }
2254
+ .ot-icon-circle.ot-option-group--icon:before {
2255
+ left: 1px;
2256
+ position: relative;
2257
+ -webkit-filter: blur(1px);
2258
+ -moz-filter: blur(1px);
2259
+ -ms-filter: blur(1px);
2260
+ -o-filter: blur(1px);
2261
+ filter: blur(1px);
2262
+ }
2263
+ .ot-option-group--icon + input.option-tree-ui-input {
2264
+ padding-left: 34px !important;
2265
+ margin-right: 5px;
2266
+ }
2267
+ .ot-option-group--checkbox {
2268
+ float: left;
2269
+ padding-top: 2px;
2270
+ padding-right: 10px;
2271
+ width: auto;
2272
+ }
2273
+ #post-body .ot-option-group--checkbox p {
2274
+ color: #a9a9a9;
2275
+ float: left;
2276
+ margin: 1px 0 0.3em 0 !important;
2277
+ }
2278
+ @media screen and ( min-width: 783px ) {
2279
+ #post-body .ot-option-group--checkbox p input {
2280
+ margin-top: 0px !important;
2281
+ }
2282
+ }
2283
+ @media screen and ( max-width: 1020px ) {
2284
+ .ot-option-group--one-fourth,
2285
+ .ot-option-group--one-fifth,
2286
+ .ot-option-group--one-sixth,
2287
+ .ot-option-group--one-eighth {
2288
+ width: 33.3%;
2289
+ }
2290
+ .ot-option-group--checkbox {
2291
+ width: 100%;
2292
+ }
2293
+ }
2294
+ @media screen and ( max-width: 782px ) {
2295
+ .ot-option-group {
2296
+ width: 50%;
2297
+ }
2298
+ .ot-option-group--three-fourths,
2299
+ .ot-option-group--two-thirds,
2300
+ .ot-option-group--one-half {
2301
+ width: 100%;
2302
+ }
2303
+ .ot-option-group--checkbox {
2304
+ padding-top: 0.3em;
2305
+ }
2306
+ }
2307
+ .ot-option-group .select-wrapper {
2308
+ width: 100%;
2309
+ }
2310
+
2311
+ /* --------------------------------------------------
2312
+ :: Select
2313
+ ---------------------------------------------------*/
2314
+ .select-wrapper {
2315
+ background: #fff url(../images/ot-select.png) no-repeat right center;
2316
+ border: 1px solid #ccc;
2317
+ display: block;
2318
+ float: left;
2319
+ font-size: 12px;
2320
+ height: 29px;
2321
+ margin: 0 5px 5px 0;
2322
+ max-width: 100%;
2323
+ width: auto;
2324
+ -webkit-border-radius: 2px;
2325
+ -moz-border-radius: 2px;
2326
+ border-radius: 2px;
2327
+ -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2328
+ -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2329
+ box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2330
+ -webkit-box-sizing: border-box;
2331
+ -moz-box-sizing: border-box;
2332
+ box-sizing: border-box;
2333
+ }
2334
+ .select-wrapper:hover {
2335
+ background-image: url(../images/ot-select-hover.png);
2336
+ border-color: #999;
2337
+ }
2338
+ select.option-tree-ui-select {
2339
+ cursor: pointer;
2340
+ filter: alpha(opacity= 0);
2341
+ font-size: 14px;
2342
+ height: 29px;
2343
+ margin: 0;
2344
+ max-width: 100%;
2345
+ -moz-opacity: 0;
2346
+ opacity: 0;
2347
+ padding: 0 !important;
2348
+ position: relative;
2349
+ width: inherit;
2350
+ z-index: 4;
2351
+ min-width: 118px;
2352
+ }
2353
+
2354
+ select.option-tree-ui-select option {
2355
+ padding: 3px 15px !important;
2356
+ }
2357
+ .select-wrapper span {
2358
+ height: 27px;
2359
+ line-height: 27px;
2360
+ overflow: hidden;
2361
+ padding-left: 7px;
2362
+ padding-right: 27px;
2363
+ position: absolute;
2364
+ z-index: 2;
2365
+ }
2366
+ #option-tree-options-layouts-form .select-wrapper {
2367
+ margin: 0px;
2368
+ }
2369
+ #option-tree-options-layouts-form select.option-tree-ui-select {
2370
+ min-width: 124px;
2371
+ }
2372
+ .type-measurement select.option-tree-ui-select {
2373
+ min-width: 73px !important;
2374
+ }
2375
+ .type-measurement .select-wrapper {
2376
+ margin-right: 0;
2377
+ position: absolute;
2378
+ right: 0px;
2379
+ top: 0px;
2380
+ }
2381
+
2382
+ /* FireFox */
2383
+ @-moz-document url-prefix() {
2384
+ #option-tree-options-layouts-form .select-wrapper {
2385
+ left: 250px;
2386
+ }
2387
+ }
2388
+
2389
+ /* --------------------------------------------------
2390
+ :: Measurement
2391
+ ---------------------------------------------------*/
2392
+ .option-tree-ui-measurement-input-wrap {
2393
+ margin-right: 80px;
2394
+ }
2395
+
2396
+ /* --------------------------------------------------
2397
+ :: Checkbox & Radio
2398
+ ---------------------------------------------------*/
2399
+ .format-setting.type-checkbox input,
2400
+ .format-setting.type-radio input {
2401
+ float: left;
2402
+ margin: 2px 5px 0 1px;
2403
+ }
2404
+ .format-setting.type-checkbox label,
2405
+ .format-setting.type-radio label {
2406
+ float: left;
2407
+ max-width: 90%;
2408
+ padding: 0px;
2409
+ }
2410
+ #option-tree-settings-api .format-setting.type-checkbox p,
2411
+ #option-tree-settings-api .format-setting.type-radio p {
2412
+ float: left;
2413
+ margin: 0.5em 0 !important;
2414
+ width: 100%;
2415
+ }
2416
+ @media screen and ( max-width: 782px ) {
2417
+ .format-setting.type-checkbox,
2418
+ .format-setting.type-radio {
2419
+ padding-top: 0.3em;
2420
+ }
2421
+ }
2422
+
2423
+ /* --------------------------------------------------
2424
+ :: Radio Images
2425
+ ---------------------------------------------------*/
2426
+ .type-radio-image .option-tree-ui-radio-images {
2427
+ float: left;
2428
+ margin: 0 10px 10px 0px;
2429
+ }
2430
+
2431
+ .type-radio-image .option-tree-ui-radio-images img {
2432
+ background: #c2c2c2;
2433
+ border: 1px solid #ccc;
2434
+ cursor: pointer;
2435
+ opacity: 0.8;
2436
+ padding: 5px;
2437
+ -webkit-border-radius: 2px;
2438
+ -moz-border-radius: 2px;
2439
+ border-radius: 2px;
2440
+ }
2441
+ .type-radio-image .option-tree-ui-radio-images img.option-tree-ui-radio-image-selected,
2442
+ .type-radio-image .option-tree-ui-radio-images img:hover {
2443
+ border-color: #464646;
2444
+ opacity: 1;
2445
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2446
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2447
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2448
+ }
2449
+
2450
+ /* --------------------------------------------------
2451
+ :: Social Links
2452
+ ---------------------------------------------------*/
2453
+ .type-social-links input.option-tree-ui-input {
2454
+ margin-top: 5px;
2455
+ }
2456
+
2457
+ /* --------------------------------------------------
2458
+ :: Numeric Slider
2459
+ ---------------------------------------------------*/
2460
+ .type-numeric-slider .format-setting-inner {
2461
+ background: #fcfcfc;
2462
+ border: 1px solid #ccc;
2463
+ min-height: 41px;
2464
+ padding: 5px;
2465
+ -webkit-box-sizing: border-box;
2466
+ -moz-box-sizing: border-box;
2467
+ box-sizing: border-box;
2468
+ -webkit-border-radius: 2px;
2469
+ -moz-border-radius: 2px;
2470
+ border-radius: 2px;
2471
+ }
2472
+ .ot-numeric-slider-wrap {
2473
+ margin: 0 96px 0 0;
2474
+ }
2475
+ .ot-numeric-slider-wrap .ot-numeric-slider-helper-input {
2476
+ position: absolute;
2477
+ right: 5px;
2478
+ text-align: center;
2479
+ top: 5px;
2480
+ width: 90px !important;
2481
+ }
2482
+ .ot-numeric-slider.ui-slider {
2483
+ background: #fff;
2484
+ border: 1px solid #ccc;
2485
+ margin: 8px 8px 0 8px;
2486
+ position: relative;
2487
+ -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2488
+ -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2489
+ box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
2490
+ -webkit-border-radius: 2px;
2491
+ -moz-border-radius: 2px;
2492
+ border-radius: 2px;
2493
+ }
2494
+ .ot-numeric-slider.ui-slider-horizontal {
2495
+ height: 11px;
2496
+ }
2497
+ .ot-numeric-slider.ui-slider .ui-slider-handle {
2498
+ border: 1px solid #000;
2499
+ color: #555;
2500
+ cursor: pointer;
2501
+ display: block;
2502
+ height: 27px;
2503
+ margin: -9px -8px;
2504
+ outline: 0;
2505
+ position: absolute;
2506
+ width: 16px;
2507
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2508
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2509
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
2510
+ -webkit-border-radius: 2px;
2511
+ -moz-border-radius: 2px;
2512
+ border-radius: 2px;
2513
+ }
2514
+ /* default */
2515
+ .ot-numeric-slider.ui-slider .ui-slider-handle {
2516
+ background: #333;
2517
+ border-color: #000;
2518
+ }
2519
+ .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2520
+ .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2521
+ background: #444;
2522
+ border-color: #111;
2523
+ }
2524
+ /* light */
2525
+ .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle {
2526
+ background: #888;
2527
+ border-color: #3c3c3c;
2528
+ }
2529
+ .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2530
+ .admin-color-light .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2531
+ background: #999;
2532
+ border-color: #777;
2533
+ }
2534
+ /* blue */
2535
+ .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle {
2536
+ background: #52accc;
2537
+ border-color: #002b39;
2538
+ }
2539
+ .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2540
+ .admin-color-blue .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2541
+ background: #5dc2e6;
2542
+ border-color: #006484;
2543
+ }
2544
+ /* coffee */
2545
+ .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle {
2546
+ background: #59524c;
2547
+ border-color: #0f0e0d;
2548
+ }
2549
+ .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2550
+ .admin-color-coffee .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2551
+ background: #cca588;
2552
+ border-color: #675f58;
2553
+ }
2554
+ /* ectoplasm */
2555
+ .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle {
2556
+ background: #523f6d;
2557
+ border-color: #181220;
2558
+ }
2559
+ .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2560
+ .admin-color-ectoplasm .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2561
+ background: #a3b542;
2562
+ border-color: #644d85;
2563
+ }
2564
+ /* midnight */
2565
+ .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle {
2566
+ background: #363b3f;
2567
+ border-color: #090a0b;
2568
+ }
2569
+ .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2570
+ .admin-color-midnight .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2571
+ background: #ed543f;
2572
+ border-color: #a0382a;
2573
+ }
2574
+ /* ocean */
2575
+ .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle {
2576
+ background: #738e96;
2577
+ border-color: #39464a;
2578
+ }
2579
+ .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2580
+ .admin-color-ocean .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2581
+ background: #9ab8a0;
2582
+ border-color: #5a6c5e;
2583
+ }
2584
+ /* sunrise */
2585
+ .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle {
2586
+ background: #da4f41;
2587
+ border-color: #8a322a;
2588
+ }
2589
+ .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle:hover,
2590
+ .admin-color-sunrise .ot-numeric-slider.ui-slider .ui-slider-handle.ui-state-active {
2591
+ background: #e88436;
2592
+ border-color: #e75546;
2593
+ }
2594
+
2595
+ /* --------------------------------------------------
2596
+ :: Colorpicker
2597
+ ---------------------------------------------------*/
2598
+ .option-tree-ui-colorpicker-input-wrap {
2599
+ float: left;
2600
+ }
2601
+ .hide-color-picker {
2602
+
2603
+ }
2604
+ .option-tree-ui-colorpicker-input-wrap .option-tree-ui-colorpicker-label {
2605
+ height: 30px;
2606
+ line-height: 30px;
2607
+ margin-right: 10px;
2608
+ display: block;
2609
+ }
2610
+ .type-link-color .option-tree-ui-colorpicker-input-wrap {
2611
+ margin-right: 20px;
2612
+ }
2613
+ .option-tree-ui-colorpicker-input-wrap .wp-color-picker,
2614
+ .option-tree-ui-colorpicker-input-wrap .wp-picker-default,
2615
+ .option-tree-ui-colorpicker-input-wrap .wp-picker-clear {
2616
+ border-color: #ccc;
2617
+ font-size: 12px !important;
2618
+ height: 29px !important;
2619
+ line-height: 27px !important;
2620
+ margin-top: 0px;
2621
+ -webkit-border-radius: 2px;
2622
+ -moz-border-radius: 2px;
2623
+ border-radius: 2px;
2624
+ -webkit-box-shadow: none;
2625
+ -moz-box-shadow: none;
2626
+ box-shadow: none;
2627
+ }
2628
+ .option-tree-ui-colorpicker-input-wrap .wp-color-picker {
2629
+ margin: 0 0 5px 0 !important;
2630
+ }
2631
+ .option-tree-ui-colorpicker-input-wrap .wp-color-result {
2632
+ height: 27px;
2633
+ outline: 0;
2634
+ margin: 0 5px 5px 0px;
2635
+ top: 0px;
2636
+ -webkit-box-shadow: none;
2637
+ -moz-box-shadow: none;
2638
+ box-shadow: none;
2639
+ }
2640
+ .option-tree-ui-colorpicker-input-wrap .wp-color-result:after {
2641
+ line-height: 27px;
2642
+ }
2643
+ .option-tree-ui-colorpicker-input-wrap .wp-picker-container .iris-picker {
2644
+ border-color: #ccc;
2645
+ margin: 0px 5px 5px 0;
2646
+ -webkit-border-radius: 2px;
2647
+ -moz-border-radius: 2px;
2648
+ border-radius: 2px;
2649
+ }
2650
+ @media screen and ( max-width: 782px ) {
2651
+ .option-tree-ui-colorpicker-input-wrap .wp-color-picker {
2652
+ padding: 3px 5px !important;
2653
+ }
2654
+ .option-tree-ui-colorpicker-input-wrap .wp-picker-clear,
2655
+ .option-tree-ui-colorpicker-input-wrap .wp-picker-default {
2656
+ margin-top: 4px;
2657
+ padding: 0 8px 1px !important;
2658
+ }
2659
+ }
2660
+
2661
+ /* --------------------------------------------------
2662
+ :: Colorpicker Opacity (Derivative work of the Codestar WP Color Picker.)
2663
+ ---------------------------------------------------*/
2664
+ .option-tree-opacity-wrap {
2665
+ background-color: #fff;
2666
+ border: 1px solid #ccc;
2667
+ border-top: none;
2668
+ border-radius: 0 0 2px 2px;
2669
+ direction: ltr;
2670
+ display: none;
2671
+ padding: 10px;
2672
+ position: relative;
2673
+ top: -6px;
2674
+ width: 235px;
2675
+ }
2676
+ .option-tree-opacity-slider {
2677
+ left: 10px;
2678
+ position: absolute;
2679
+ width: 171px;
2680
+ margin-left: 3px;
2681
+ height: 28px;
2682
+ }
2683
+ .option-tree-opacity-slider .ui-slider-handle {
2684
+ position: absolute;
2685
+ top: -3px;
2686
+ bottom: -3px;
2687
+ z-index: 5;
2688
+ border-color: #aaa;
2689
+ border-style: solid;
2690
+ border-width: 4px 3px;
2691
+ width: 6px;
2692
+ height: 26px;
2693
+ margin: 0 -3px;
2694
+ background: none;
2695
+ cursor: ew-resize;
2696
+ opacity: 0.9;
2697
+ border-radius: 4px;
2698
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
2699
+ }
2700
+ .option-tree-opacity-slider .ui-slider-handle:before {
2701
+ content: " ";
2702
+ position: absolute;
2703
+ left: -2px;
2704
+ right: -2px;
2705
+ top: -3px;
2706
+ bottom: -3px;
2707
+ border: 2px solid #fff;
2708
+ border-radius: 3px;
2709
+ }
2710
+ .option-tree-opacity-slider-offset {
2711
+ height: 28px;
2712
+ width: 183px;
2713
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC);
2714
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.4) inset;
2715
+ border-radius: 2px;
2716
+ }
2717
+ .option-tree-opacity-text {
2718
+ position: absolute;
2719
+ top: 15px;
2720
+ left: 215px;
2721
+ width: 30px;
2722
+ font-size: 12px;
2723
+ text-align: center;
2724
+ }
2725
+
2726
+ /* --------------------------------------------------
2727
+ :: Google Font
2728
+ ---------------------------------------------------*/
2729
+ .type-google-font {
2730
+
2731
+ }
2732
+ .type-google-font-group-clone {
2733
+ display: none;
2734
+ }
2735
+ .type-google-font-group {
2736
+ float: left;
2737
+ margin-bottom: 20px;
2738
+ width: 100%;
2739
+ }
2740
+ .js-remove-google-font.option-tree-ui-button.button {
2741
+ margin-left: 0;
2742
+ margin-top: 0;
2743
+ }
2744
+
2745
+ /* --------------------------------------------------
2746
+ :: OptionTree UI Buttons
2747
+ ---------------------------------------------------*/
2748
+ .option-tree-ui-button.button {
2749
+ float: left;
2750
+ font-size: 12px !important;
2751
+ line-height: 27px !important;
2752
+ height: 29px !important;
2753
+ margin: 5px;
2754
+ min-width: 40px;
2755
+ padding: 0 10px 1px !important;
2756
+ }
2757
+ .option-tree-ui-button:active,
2758
+ .option-tree-ui-button:hover,
2759
+ .option-tree-ui-button:focus {
2760
+ outline: 0;
2761
+ }
2762
+ .option-tree-ui-button.hidden {
2763
+ display: none;
2764
+ }
2765
+ .option-tree-ui-button.button-secondary {
2766
+ background: #b73b27;
2767
+ border-color: #7f291b;
2768
+ color: #fff;
2769
+ text-shadow: none;
2770
+ -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2771
+ -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2772
+ box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2773
+ }
2774
+ .option-tree-ui-button.button-secondary.hover,
2775
+ .option-tree-ui-button.button-secondary:hover,
2776
+ .option-tree-ui-button.button-secondary.focus,
2777
+ .option-tree-ui-button.button-secondary:focus {
2778
+ background: #9b3221;
2779
+ border-color: #7f291b;
2780
+ color: #fff;
2781
+ -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6);
2782
+ -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.5), 0 1px 0 rgba(0,0,0,.15);
2783
+ box-shadow: inset 0 1px 0 rgba(229,134,119,0.6);
2784
+ }
2785
+ .option-tree-ui-button.button-secondary.focus,
2786
+ .option-tree-ui-button.button-secondary:focus {
2787
+ border-color: #4f160d;
2788
+ -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2789
+ -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2790
+ box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 1px 1px 2px rgba(0,0,0,0.4);
2791
+ }
2792
+ .option-tree-ui-button.button-secondary.active,
2793
+ .option-tree-ui-button.button-secondary.active:hover,
2794
+ .option-tree-ui-button.button-secondary.active:focus,
2795
+ .option-tree-ui-button.button-secondary:active {
2796
+ background: #b73b27;
2797
+ border-color: #7f291b;
2798
+ color: rgba(255,255,255,0.95);
2799
+ -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2800
+ -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2801
+ box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
2802
+ vertical-align: top;
2803
+ }
2804
+ .option-tree-ui-button.right {
2805
+ float: right;
2806
+ }
2807
+ .option-tree-ui-button.hug-left {
2808
+ margin-left: 0px;
2809
+ }
2810
+ .option-tree-ui-button.hug-right {
2811
+ margin-right: 0px;
2812
+ }
2813
+ .option-tree-ui-button.pad {
2814
+ padding: 0px 21px;
2815
+ }
2816
+ .option-tree-ui-button.left-item {
2817
+ margin: 5px 0 5px 5px;
2818
+ -webkit-border-top-right-radius: 0px;
2819
+ -webkit-border-bottom-right-radius: 0px;
2820
+ -moz-border-radius-topright: 0px;
2821
+ -moz-border-radius-bottomright: 0px;
2822
+ border-top-right-radius: 0px;
2823
+ border-bottom-right-radius: 0px;
2824
+ }
2825
+ .option-tree-ui-button.center-item {
2826
+ margin: 5px 0 5px -1px;
2827
+ -webkit-border-radius: 0px;
2828
+ -moz-border-radius: 0px;
2829
+ border-radius: 0px;
2830
+ }
2831
+ .option-tree-ui-button.right-item {
2832
+ margin: 5px 5px 5px -1px;
2833
+ -webkit-border-top-left-radius: 0px;
2834
+ -webkit-border-bottom-left-radius: 0px;
2835
+ -moz-border-radius-topleft: 0px;
2836
+ -moz-border-radius-bottomleft: 0px;
2837
+ border-top-left-radius: 0px;
2838
+ border-bottom-left-radius: 0px;
2839
+ }
2840
+ .option-tree-ui-buttons {
2841
+ background: #fff;
2842
+ border: 1px solid #ccc;
2843
+ margin: 11px 5px 0 2px;
2844
+ min-width: 523px;
2845
+ overflow: hidden;
2846
+ padding: 5px;
2847
+ position: relative;
2848
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2849
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2850
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
2851
+ -webkit-border-radius: 2px;
2852
+ -moz-border-radius: 2px;
2853
+ border-radius: 2px;
2854
+ }
2855
+ .option-tree-ui-buttons.alt {
2856
+ background: #f5f5f5;
2857
+ border-color: #dfdfdf;
2858
+ }
2859
+ .option-tree-ui-buttons:before,
2860
+ .option-tree-ui-buttons:after {
2861
+ content: "\0020";
2862
+ display: block;
2863
+ height: 0;
2864
+ visibility: hidden;
2865
+ }
2866
+ .option-tree-ui-buttons:after {
2867
+ clear: both;
2868
+ }
2869
+ .option-tree-ui-buttons {
2870
+ zoom: 1;
2871
+ }
2872
+ button.reset-settings {
2873
+ position: relative;
2874
+ top: -45px;
2875
+ left: 8px;
2876
+ }
2877
+
2878
+ /* --------------------------------------------------
2879
+ :: OptionTree UI Button Icons
2880
+ ---------------------------------------------------*/
2881
+ .option-tree-ui-button .icon {
2882
+ color: #3a3a3a;
2883
+ display: inline-block;
2884
+ float: left;
2885
+ font-size: 20px;
2886
+ height: 20px;
2887
+ margin-top: 3px;
2888
+ opacity: 0.9;
2889
+ overflow: hidden;
2890
+ text-align: center;
2891
+ text-indent: 0;
2892
+ width: 18px;
2893
+ }
2894
+ button.option-tree-ui-button .icon {
2895
+ margin-top: -3px;
2896
+ }
2897
+ .option-tree-ui-button.light .icon {
2898
+ color: #fff;
2899
+ opacity: 0.9;
2900
+ }
2901
+ .option-tree-ui-button.active .icon,
2902
+ .option-tree-ui-button:hover .icon {
2903
+ opacity: 1;
2904
+ }
2905
+ .option-tree-ui-button .icon.right-label {
2906
+ margin-right: 10px;
2907
+ }
2908
+ .option-tree-ui-button .icon.left-label {
2909
+ margin-left: 10px;
2910
+ float: right;
2911
+ }
2912
+ .option-tree-ui-button .upload {
2913
+ background-position: -0px -0px;
2914
+ }
2915
+ .option-tree-ui-button .trash-can {
2916
+ background-position: -18px -0px;
2917
+ }
2918
+ .option-tree-ui-button .pencil,
2919
+ .option-tree-ui-button .check {
2920
+ background-position: -36px -0px;
2921
+ }
2922
+ .option-tree-ui-button:hover .pencil,
2923
+ .option-tree-ui-button:hover .check,
2924
+ .option-tree-ui-button.active .pencil,
2925
+ .option-tree-ui-button.active .check {
2926
+ background-position: -54px -0px;
2927
+ }
2928
+
2929
+ /* --------------------------------------------------
2930
+ :: WP 3.8 Fixes (via Github @AlxMedia)
2931
+ ---------------------------------------------------*/
2932
+ #option-tree-settings-api #poststuff,
2933
+ #option-tree-settings-api #post-body-content {
2934
+ min-width: 0;
2935
+ }
2936
+ #option-tree-settings-api #poststuff h3 {
2937
+ font-family: inherit !important;
2938
+ }
2939
+ #option-tree-settings-api .postbox {
2940
+ -webkit-box-shadow: none;
2941
+ -moz-box-shadow: none;
2942
+ box-shadow: none;
2943
+ }
2944
+ #option-tree-settings-api p input[type="checkbox"],
2945
+ #option-tree-settings-api p input[type="radio"] {
2946
+ margin-top: 2px;
2947
+ }
2948
+ #option-tree-settings-api .format-setting.type-checkbox p,
2949
+ #option-tree-settings-api .format-setting.type-radio p {
2950
+ margin: 0.3em 0 !important;
2951
+ }
2952
+ input.option-tree-ui-upload-input,
2953
+ input.option-tree-ui-input {
2954
+ padding-top: 5px;
2955
+ padding-bottom: 5px;
2956
+ }
2957
+ @media screen and ( max-width: 782px ) {
2958
+ #option-tree-settings-api p input[type="checkbox"],
2959
+ #option-tree-settings-api p input[type="radio"] {
2960
+ margin-top: -3px;
2961
+ }
2962
+ }
2963
+
2964
+ /* --------------------------------------------------
2965
+ :: Gallery
2966
+ ---------------------------------------------------*/
2967
+ ul.ot-gallery-list {
2968
+ float: left;
2969
+ margin: 0;
2970
+ width: 100%;
2971
+ }
2972
+ ul.ot-gallery-list li {
2973
+ background: none repeat scroll 0 0 white;
2974
+ border: 1px solid #bbb;
2975
+ float: left;
2976
+ margin: 0px 10px 10px 0;
2977
+ padding: 4px;
2978
+ -webkit-border-radius: 2px;
2979
+ -moz-border-radius: 2px;
2980
+ border-radius: 2px;
2981
+ }
2982
+ ul.ot-gallery-list li img {
2983
+ display: block;
2984
+ margin: 0;
2985
+ }
2986
+
2987
+ .ot-gallery-buttons {
2988
+ float: left;
2989
+ width: 100%;
2990
+ }
2991
+ .ot-gallery-buttons a.option-tree-ui-button {
2992
+ margin-top: 0px;
2993
+ margin-bottom: 0px;
2994
+ }
2995
+
2996
+ /* --------------------------------------------------
2997
+ :: Google Fonts
2998
+ ---------------------------------------------------*/
2999
+ .option-tree-google-font-family,
3000
+ .option-tree-google-font-variants,
3001
+ .option-tree-google-font-subsets {
3002
+ float: left;
3003
+ width: 20%;
3004
+ }
3005
+ .option-tree-google-font-family {
3006
+ width: 100%;
3007
+ }
3008
+ #option-tree-settings-api p.checkbox-wrap,
3009
+ #post-body .ot-metabox-panels p.checkbox-wrap {
3010
+ display: block;
3011
+ float: left;
3012
+ margin: 0.3em 0 !important;
3013
+ width: 100%;
3014
+ }
3015
+ @media screen and ( max-width: 1020px ) {
3016
+ .option-tree-google-font-variants,
3017
+ .option-tree-google-font-subsets {
3018
+ width: 33%;
3019
+ }
3020
+ }
3021
+ @media screen and ( max-width: 782px ) {
3022
+ .option-tree-google-font-variants,
3023
+ .option-tree-google-font-subsets {
3024
+ width: 50%;
3025
+ }
3026
+ }
3027
+
3028
+ /* --------------------------------------------------
3029
+ :: On/Off Switch
3030
+ ---------------------------------------------------*/
3031
+ .on-off-switch .slide-button {
3032
+ display: none;
3033
+ }
3034
+ @media only screen {
3035
+ .on-off-switch {
3036
+ background-color: #fff;
3037
+ border: 1px solid #ccc;
3038
+ color: #333;
3039
+ display: block;
3040
+ font-size: 12px;
3041
+ font-weight: normal;
3042
+ height: 27px;
3043
+ margin: 2px 1px;
3044
+ position: relative;
3045
+ padding: 0;
3046
+ text-align: center;
3047
+ text-transform: uppercase;
3048
+ width: 100px;
3049
+ -webkit-border-radius: 2px;
3050
+ -moz-border-radius: 2px;
3051
+ border-radius: 2px;
3052
+ -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3053
+ -moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3054
+ box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05);
3055
+ }
3056
+ .on-off-switch * {
3057
+ -webkit-box-sizing: border-box;
3058
+ -moz-box-sizing: border-box;
3059
+ box-sizing: border-box;
3060
+ }
3061
+ .on-off-switch input {
3062
+ position: absolute;
3063
+ opacity: 0;
3064
+ }
3065
+ .on-off-switch label {
3066
+ cursor: pointer;
3067
+ float: left;
3068
+ height: 27px;
3069
+ line-height: 27px;
3070
+ margin: 0;
3071
+ position: relative;
3072
+ text-align: center;
3073
+ vertical-align: middle;
3074
+ width: 50%;
3075
+ z-index: 2;
3076
+ }
3077
+ .on-off-switch input:last-of-type + label {
3078
+ color: #333;
3079
+ }
3080
+ .on-off-switch input:checked + label {
3081
+ color: #333;
3082
+ }
3083
+ .on-off-switch input:last-of-type:checked + label {
3084
+ color: #fff;
3085
+ }
3086
+ .on-off-switch input:focus + label {
3087
+ outline: none;
3088
+ }
3089
+ .on-off-switch .slide-button {
3090
+ background: #b2d27e;
3091
+ border: 1px solid #7c9258;
3092
+ display: block;
3093
+ height: 29px;
3094
+ left: -1px;
3095
+ padding: 0;
3096
+ position: absolute;
3097
+ text-decoration: none;
3098
+ top: -1px;
3099
+ width: 51%;
3100
+ z-index: 1;
3101
+ -webkit-border-radius: 2px;
3102
+ -moz-border-radius: 2px;
3103
+ border-radius: 2px;
3104
+ -webkit-box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3105
+ -moz-box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3106
+ box-shadow: inset 0 1px 0 #c8eb8e, 0 1px 0 rgba(0,0,0,.08);
3107
+ -webkit-transition: all 0.2s ease-out;
3108
+ -moz-transition: all 0.2s ease-out;
3109
+ transition: all 0.2s ease-out;
3110
+ }
3111
+ .on-off-switch input:last-of-type:checked ~ .slide-button {
3112
+ background: #b73b27;
3113
+ border-color: #7f291b;
3114
+ color: #fff;
3115
+ left: 50%;
3116
+ -webkit-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3117
+ -moz-box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3118
+ box-shadow: inset 0 1px 0 rgba(229,134,119,0.6), 0 1px 0 rgba(0,0,0,.15);
3119
+ }
3120
+ }
3121
+ @media only screen and (-webkit-max-device-pixel-ratio: 2) and (max-device-width: 1280px) {
3122
+ .on-off-switch {
3123
+ -webkit-animation: webkitSiblingBugfix infinite 1s;
3124
+ }
3125
+ }
3126
+ @-webkit-keyframes webkitSiblingBugfix {
3127
+ from {
3128
+ -webkit-transform: translate3d(0, 0, 0);
3129
+ }
3130
+ to {
3131
+ -webkit-transform: translate3d(0, 0, 0);
3132
+ }
3133
+ }
3134
+
3135
+ /* --------------------------------------------------
3136
+ :: Simple Input Append & Prepend
3137
+ ---------------------------------------------------*/
3138
+ .ot-input-append,
3139
+ .ot-input-prepend {
3140
+ display: inline-block;
3141
+ vertical-align: middle;
3142
+ font-size: 0;
3143
+ white-space: nowrap;
3144
+ }
3145
+ .ot-input-append input {
3146
+ position: relative;
3147
+ margin-bottom: 0;
3148
+ *margin-left: 0;
3149
+ vertical-align: top;
3150
+ -webkit-border-radius: 0 2px 2px 0;
3151
+ -moz-border-radius: 0 2px 2px 0;
3152
+ border-radius: 0 2px 2px 0;
3153
+ }
3154
+ .ot-input-append input:focus,
3155
+ .ot-input-prepend input:focus {
3156
+ z-index: 2;
3157
+ }
3158
+ .ot-input-append .ot-add-on,
3159
+ .ot-input-prepend .ot-add-on {
3160
+ display: inline-block;
3161
+ width: auto;
3162
+ height: 27px;
3163
+ line-height: 28px;
3164
+ min-width: 16px;
3165
+ padding: 0 6px;
3166
+ font-size: 16px;
3167
+ font-weight: normal;
3168
+ text-align: center;
3169
+ text-shadow: 0 1px 0 white;
3170
+ background-color: #f7f7f7;
3171
+ border: 1px solid #ccc;
3172
+ }
3173
+ .ot-input-prepend input {
3174
+ border-left: 0 !important;
3175
+ }
3176
+ .ot-input-prepend .ot-add-on:first-child {
3177
+ -webkit-border-radius: 2px 0 0 2px;
3178
+ -moz-border-radius: 2px 0 0 2px;
3179
+ border-radius: 2px 0 0 2px;
3180
+ }
3181
+ .ot-input-append input {
3182
+ border-right: 0 !important;
3183
+ -webkit-border-radius: 2px 0 0 2px;
3184
+ -moz-border-radius: 2px 0 0 2px;
3185
+ border-radius: 2px 0 0 2px;
3186
+ }
3187
+ .ot-input-append input + .btn-group .btn:first-child {
3188
+ -webkit-border-top-left-radius: 0;
3189
+ -moz-border-radius-topleft: 0;
3190
+ border-top-left-radius: 0;
3191
+ -webkit-border-bottom-left-radius: 0;
3192
+ -moz-border-radius-bottomleft: 0;
3193
+ border-bottom-left-radius: 0;
3194
+ }
3195
+ .ot-input-append .ot-add-on:last-child {
3196
+ -webkit-border-radius: 0 2px 2px 0;
3197
+ -moz-border-radius: 0 2px 2px 0;
3198
+ border-radius: 0 2px 2px 0;
3199
+ }
3200
+ .ot-input-prepend.ot-input-append input {
3201
+ -webkit-border-radius: 0;
3202
+ -moz-border-radius: 0;
3203
+ border-radius: 0;
3204
+ }
3205
+ .ot-input-prepend.ot-input-append .ot-add-on:first-child {
3206
+ -webkit-border-radius: 2px 0 0 2px;
3207
+ -moz-border-radius: 2px 0 0 2px;
3208
+ border-radius: 2px 0 0 2px;
3209
+ }
3210
+ .ot-input-prepend.ot-input-append .ot-add-on:last-child {
3211
+ -webkit-border-radius: 0 2px 2px 0;
3212
+ -moz-border-radius: 0 2px 2px 0;
3213
+ border-radius: 0 2px 2px 0;
3214
+ }
3215
+
3216
+ /* --------------------------------------------------
3217
+ :: CSS Editor
3218
+ ---------------------------------------------------*/
3219
+ #option-tree-settings-api pre.ot-css-editor,
3220
+ #poststuff .type-css pre.ot-css-editor,
3221
+ #option-tree-settings-api pre.ot-javascript-editor,
3222
+ #poststuff .type-javascript pre.ot-javascript-editor {
3223
+ bottom: 0;
3224
+ height: 280px;
3225
+ left: 0;
3226
+ margin: 0 !important;
3227
+ right: 0;
3228
+ top: 0;
3229
+ }
3230
+ #option-tree-settings-api pre.ace-chrome,
3231
+ #poststuff .type-css pre.ace-chrome,
3232
+ #poststuff .type-javascript pre.ace-chrome {
3233
+ background-color: #fff !important;
3234
+ border: 1px solid #ccc;
3235
+ -webkit-border-radius: 2px;
3236
+ -moz-border-radius: 2px;
3237
+ border-radius: 2px;
3238
+ }
3239
+ #option-tree-settings-api pre.ace-chrome:hover,
3240
+ #poststuff .type-css pre.ace-chrome:hover,
3241
+ #poststuff .type-javascript pre.ace-chrome:hover {
3242
+ border-color: #bbb !important;
3243
+ -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3244
+ -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3245
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3246
+ }
3247
+ #option-tree-settings-api pre.ace-chrome.ace_focus,
3248
+ #poststuff .type-css pre.ace-chrome.ace_focus,
3249
+ #poststuff .type-javascript pre.ace-chrome.ace_focus {
3250
+ border-color: #999 !important;
3251
+ -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3252
+ -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3253
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.0980392);
3254
+ }
3255
+
3256
+ /* --------------------------------------------------
3257
+ :: Date Picker
3258
+ ---------------------------------------------------*/
3259
+ .ui-datepicker {
3260
+ background: #fff;
3261
+ border: 1px solid #ccc;
3262
+ height: auto;
3263
+ margin: 5px auto 0;
3264
+ width: 216px;
3265
+ z-index: 101 !important;
3266
+ -webkit-border-radius: 2px;
3267
+ -moz-border-radius: 2px;
3268
+ border-radius: 2px;
3269
+ }
3270
+ .ui-datepicker a {
3271
+ text-decoration: none;
3272
+ }
3273
+ .ui-datepicker table {
3274
+ border-collapse: collapse;
3275
+ border-spacing: 0;
3276
+ width: 100%;
3277
+ }
3278
+ .ui-datepicker .ui-widget-header {
3279
+ left: -1px;
3280
+ line-height: 30px;
3281
+ position: relative;
3282
+ top: -1px;
3283
+ width: 218px;
3284
+ -webkit-border-radius: 2px 2px 0 0;
3285
+ -moz-border-radius: 2px 2px 0 0;
3286
+ border-radius: 2px 2px 0 0;
3287
+ }
3288
+ .ui-datepicker .ui-datepicker-title {
3289
+ text-align: center;
3290
+ }
3291
+ .ui-datepicker-prev,
3292
+ .ui-datepicker-next {
3293
+ color: #ccc;
3294
+ display: inline-block;
3295
+ font-family: "option-tree-font";
3296
+ font-size: 16px;
3297
+ width: 30px;
3298
+ height: 30px;
3299
+ text-align: center;
3300
+ cursor: pointer;
3301
+ -webkit-border-radius: 2px 0 0 0;
3302
+ -moz-border-radius: 2px 0 0 0;
3303
+ border-radius: 2px 0 0 0;
3304
+ }
3305
+ .ui-datepicker-next {
3306
+ -webkit-border-radius: 0 2px 0 0;
3307
+ -moz-border-radius: 0 2px 0 0;
3308
+ border-radius: 0 2px 0 0;
3309
+ }
3310
+ .ui-datepicker-prev span,
3311
+ .ui-datepicker-next span {
3312
+ display: none;
3313
+ }
3314
+ .ui-datepicker-prev:hover,
3315
+ .ui-datepicker-next:hover {
3316
+ color: #fff;
3317
+ }
3318
+ .ui-datepicker-prev:before {
3319
+ border-right: 1px solid #555;
3320
+ content: "\f104";
3321
+ display: block;
3322
+ float: left;
3323
+ width: 31px;
3324
+ height: 30px;
3325
+ }
3326
+ .ui-datepicker-prev {
3327
+ border-right: 1px solid #333;
3328
+ float: left;
3329
+ }
3330
+ .ui-datepicker-next:before {
3331
+ border-left: 1px solid #555;
3332
+ content: "\f105";
3333
+ display: block;
3334
+ float: right;
3335
+ width: 30px;
3336
+ height: 30px;
3337
+ }
3338
+ .ui-datepicker-next {
3339
+ border-left: 1px solid #333;
3340
+ float: right;
3341
+ width: 31px;
3342
+ }
3343
+ a.ui-datepicker-prev,
3344
+ a.ui-datepicker-next {
3345
+ outline: 0;
3346
+ }
3347
+ .ui-datepicker thead {
3348
+ background-color: #fafafa;
3349
+ border-bottom: 1px solid #ccc;
3350
+ }
3351
+ .ui-datepicker th {
3352
+ text-transform: uppercase;
3353
+ font-size: 9px;
3354
+ padding: 5px 0;
3355
+ color: #555;
3356
+ text-shadow: 1px 0px 0px rgba(255,255,255,0.5);
3357
+ }
3358
+ .ui-datepicker tbody td {
3359
+ border-right: 1px solid #ccc;
3360
+ padding: 0;
3361
+ }
3362
+ .ui-datepicker tbody td:last-child {
3363
+ border-right: 0px;
3364
+ }
3365
+ .ui-datepicker tbody tr {
3366
+ border-bottom: 1px solid #ccc;
3367
+ }
3368
+ .ui-datepicker tbody tr:last-child {
3369
+ border-bottom: 0px;
3370
+ }
3371
+ .ui-datepicker td span,
3372
+ .ui-datepicker td a {
3373
+ display: inline-block;
3374
+ font-size: 11px;
3375
+ text-align: center;
3376
+ width: 30px;
3377
+ height: 29px;
3378
+ line-height: 30px;
3379
+ color: #555;
3380
+ text-shadow: 1px 0px 0px rgba(255,255,255,0.5);
3381
+ }
3382
+ .ui-datepicker-calendar .ui-state-default {
3383
+ background-color: #f1f1f1;
3384
+ }
3385
+ .ui-datepicker-calendar .ui-state-highlight {
3386
+ border-radius: 0px;
3387
+ border: none;
3388
+ color: #0074a2;
3389
+ }
3390
+ .ui-datepicker-calendar .ui-state-hover {
3391
+ background: #fff;
3392
+ }
3393
+ .ui-datepicker-calendar .ui-state-active {
3394
+ background-color: #0074a2;
3395
+ color: #fff !important;
3396
+ text-shadow: 0px 1px 0px rgba(0,0,0,0.25);
3397
+ position: relative;
3398
+ }
3399
+ .ui-datepicker-unselectable .ui-state-default {
3400
+ background: #fff;
3401
+ color: #aaa;
3402
+ }
3403
+ .ui-datepicker-calendar td:first-child .ui-state-active {
3404
+ margin-left: 0;
3405
+ width: 30px;
3406
+ }
3407
+ .ui-datepicker-calendar td:last-child .ui-state-active {
3408
+ margin-right: 0;
3409
+ width: 30px;
3410
+ }
3411
+ .ui-datepicker-calendar tr:last-child .ui-state-active {
3412
+ height: 30px;
3413
+ margin-bottom: 0;
3414
+ }
3415
+ .ui-datepicker .ui-datepicker-buttonpane {
3416
+ background-image: none;
3417
+ border-left: 0;
3418
+ border-right: 0;
3419
+ border-bottom: 0;
3420
+ margin: 0;
3421
+ padding: 0 .7em;
3422
+ }
3423
+ .ui-datepicker .ui-datepicker-buttonpane button {
3424
+ background: #f7f7f7;
3425
+ border: 1px solid #ccc;
3426
+ color: #555;
3427
+ cursor: pointer;
3428
+ float: right;
3429
+ height: auto;
3430
+ margin: .7em 0;
3431
+ padding: 5px 14px;
3432
+ width: auto;
3433
+ -webkit-border-radius: 3px;
3434
+ -moz-border-radius: 3px;
3435
+ border-radius: 3px;
3436
+ -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3437
+ -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3438
+ box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0,0,0,.08);
3439
+ }
3440
+ .ui-datepicker .ui-datepicker-buttonpane button::-moz-focus-inner {
3441
+ border-width: 1px 0;
3442
+ border-style: solid none;
3443
+ border-color: transparent;
3444
+ padding: 0;
3445
+ }
3446
+ .ui-datepicker .ui-datepicker-buttonpane button:hover,
3447
+ .ui-datepicker .ui-datepicker-buttonpane button:focus {
3448
+ background: #fafafa;
3449
+ border-color: #999;
3450
+ color: #222;
3451
+ outline: 0;
3452
+ }
3453
+ .ui-datepicker .ui-datepicker-buttonpane button:focus {
3454
+ -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3455
+ -moz-box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3456
+ box-shadow: 1px 1px 1px rgba(0,0,0,.2);
3457
+ }
3458
+ .ui-datepicker .ui-datepicker-buttonpane button:active {
3459
+ background: #eee;
3460
+ border-color: #999;
3461
+ color: #333;
3462
+ outline: 0;
3463
+ -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3464
+ -moz-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3465
+ box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );
3466
+ }
3467
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
3468
+ float: left;
3469
+ }
3470
+ .ui-datepicker-calendar + .ui-datepicker-buttonpane {
3471
+ border-bottom: 1px solid #ccc;
3472
+ }
3473
+ .ui-datepicker-multi-2 {
3474
+ width: 432px !important;
3475
+ }
3476
+ .ui-datepicker-multi-3 {
3477
+ width: 648px !important;
3478
+ }
3479
+ .ui-datepicker-multi-4 {
3480
+ width: 864px !important;
3481
+ }
3482
+ .ui-datepicker-group {
3483
+ float: left;
3484
+ width: 216px !important;
3485
+ }
3486
+ .ui-datepicker-row-break {
3487
+ clear: both;
3488
+ width: 100%;
3489
+ font-size: 0;
3490
+ }
3491
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
3492
+ border-top: 1px solid #ccc !important;
3493
+ }
3494
+
3495
+ /* default color scheme */
3496
+ .ui-datepicker .ui-widget-header {
3497
+ background: #333;
3498
+ color: #bbb;
3499
+ }
3500
+ .ui-datepicker .ui-widget-header a {
3501
+ color: #999;
3502
+ }
3503
+ .ui-datepicker-prev,
3504
+ .ui-datepicker-next:before {
3505
+ border-color: #000;
3506
+ }
3507
+ .ui-datepicker-next,
3508
+ .ui-datepicker-prev:before {
3509
+ border-color: #444;
3510
+ }
3511
+ .ui-datepicker-prev:hover,
3512
+ .ui-datepicker-next:hover {
3513
+ background: #222;
3514
+ color: #0074a2 !important;
3515
+ }
3516
+ /* light */
3517
+ .admin-color-light .ui-datepicker .ui-widget-header {
3518
+ background: #888;
3519
+ color: #fff;
3520
+ }
3521
+ .admin-color-light .ui-datepicker .ui-widget-header a {
3522
+ color: #ccc;
3523
+ }
3524
+ .admin-color-light .ui-datepicker-prev,
3525
+ .admin-color-light .ui-datepicker-next:before {
3526
+ border-color: #3c3c3c;
3527
+ }
3528
+ .admin-color-light .ui-datepicker-next,
3529
+ .admin-color-light .ui-datepicker-prev:before {
3530
+ border-color: #999;
3531
+ }
3532
+ .admin-color-light .ui-datepicker-prev:hover,
3533
+ .admin-color-light .ui-datepicker-next:hover {
3534
+ background: #777;
3535
+ color: #eee !important;
3536
+ }
3537
+ /* blue */
3538
+ .admin-color-blue .ui-datepicker .ui-widget-header {
3539
+ background: #52accc;
3540
+ color: #fff;
3541
+ }
3542
+ .admin-color-blue .ui-datepicker .ui-widget-header a {
3543
+ color: #e2f8ff;
3544
+ }
3545
+ .admin-color-blue .ui-datepicker-prev,
3546
+ .admin-color-blue .ui-datepicker-next:before {
3547
+ border-color: #002b39;
3548
+ }
3549
+ .admin-color-blue .ui-datepicker-next,
3550
+ .admin-color-blue .ui-datepicker-prev:before {
3551
+ border-color: #5dc2e6;
3552
+ }
3553
+ .admin-color-blue .ui-datepicker-prev:hover,
3554
+ .admin-color-blue .ui-datepicker-next:hover {
3555
+ background: #006484;
3556
+ color: #fff !important;
3557
+ }
3558
+ /* coffee */
3559
+ .admin-color-coffee .ui-datepicker .ui-widget-header {
3560
+ background: #59524c;
3561
+ color: #c7cbc9;
3562
+ }
3563
+ .admin-color-coffee .ui-datepicker .ui-widget-header a {
3564
+ color: #f3f2f1;
3565
+ }
3566
+ .admin-color-coffee .ui-datepicker-prev,
3567
+ .admin-color-coffee .ui-datepicker-next:before {
3568
+ border-color: #0f0e0d;
3569
+ }
3570
+ .admin-color-coffee .ui-datepicker-next,
3571
+ .admin-color-coffee .ui-datepicker-prev:before {
3572
+ border-color: #675f58;
3573
+ }
3574
+ .admin-color-coffee .ui-datepicker-prev:hover,
3575
+ .admin-color-coffee .ui-datepicker-next:hover {
3576
+ background: #cca588;
3577
+ color: #fff !important;
3578
+ }
3579
+ /* ectoplasm */
3580
+ .admin-color-ectoplasm .ui-datepicker .ui-widget-header {
3581
+ background: #523f6d;
3582
+ color: #c6c6d3;
3583
+ }
3584
+ .admin-color-ectoplasm .ui-datepicker .ui-widget-header a {
3585
+ color: #f3f2f1;
3586
+ }
3587
+ .admin-color-ectoplasm .ui-datepicker-prev,
3588
+ .admin-color-ectoplasm .ui-datepicker-next:before {
3589
+ border-color: #181220;
3590
+ }
3591
+ .admin-color-ectoplasm .ui-datepicker-next,
3592
+ .admin-color-ectoplasm .ui-datepicker-prev:before {
3593
+ border-color: #644d85;
3594
+ }
3595
+ .admin-color-ectoplasm .ui-datepicker-prev:hover,
3596
+ .admin-color-ectoplasm .ui-datepicker-next:hover {
3597
+ background: #a3b542;
3598
+ color: #fff !important;
3599
+ }
3600
+ /* midnight */
3601
+ .admin-color-midnight .ui-datepicker .ui-widget-header {
3602
+ background: #363b3f;
3603
+ color: #f1f2f3;
3604
+ }
3605
+ .admin-color-midnight .ui-datepicker .ui-widget-header a {
3606
+ color: #f1f2f3;
3607
+ }
3608
+ .admin-color-midnight .ui-datepicker-prev,
3609
+ .admin-color-midnight .ui-datepicker-next:before {
3610
+ border-color: #090a0b;
3611
+ }
3612
+ .admin-color-midnight .ui-datepicker-next,
3613
+ .admin-color-midnight .ui-datepicker-prev:before {
3614
+ border-color: #4c5359;
3615
+ }
3616
+ .admin-color-midnight .ui-datepicker-prev:hover,
3617
+ .admin-color-midnight .ui-datepicker-next:hover {
3618
+ background: #ed543f;
3619
+ color: #fff !important;
3620
+ }
3621
+ /* ocean */
3622
+ .admin-color-ocean .ui-datepicker .ui-widget-header {
3623
+ background: #738e96;
3624
+ color: #f1fcff;
3625
+ }
3626
+ .admin-color-ocean .ui-datepicker .ui-widget-header a {
3627
+ color: #f1fcff;
3628
+ }
3629
+ .admin-color-ocean .ui-datepicker-prev,
3630
+ .admin-color-ocean .ui-datepicker-next:before {
3631
+ border-color: #39464a;
3632
+ }
3633
+ .admin-color-ocean .ui-datepicker-next,
3634
+ .admin-color-ocean .ui-datepicker-prev:before {
3635
+ border-color: #87a6af;
3636
+ }
3637
+ .admin-color-ocean .ui-datepicker-prev:hover,
3638
+ .admin-color-ocean .ui-datepicker-next:hover {
3639
+ background: #9ab8a0;
3640
+ color: #fff !important;
3641
+ }
3642
+ /* sunrise */
3643
+ .admin-color-sunrise .ui-datepicker .ui-widget-header {
3644
+ background: #da4f41;
3645
+ color: #fff;
3646
+ }
3647
+ .admin-color-sunrise .ui-datepicker .ui-widget-header a {
3648
+ color: #f3f1f1;
3649
+ }
3650
+ .admin-color-sunrise .ui-datepicker-prev,
3651
+ .admin-color-sunrise .ui-datepicker-next:before {
3652
+ border-color: #8a322a;
3653
+ }
3654
+ .admin-color-sunrise .ui-datepicker-next,
3655
+ .admin-color-sunrise .ui-datepicker-prev:before {
3656
+ border-color: #e75546;
3657
+ }
3658
+ .admin-color-sunrise .ui-datepicker-prev:hover,
3659
+ .admin-color-sunrise .ui-datepicker-next:hover {
3660
+ background: #e88436;
3661
+ color: #fff !important;
3662
+ }
3663
+
3664
+ /* --------------------------------------------------
3665
+ :: Time Picker
3666
+ ---------------------------------------------------*/
3667
+ .ui-timepicker-div {
3668
+ border-top: 1px solid #ccc;
3669
+ padding: 0 .4em;
3670
+ }
3671
+ .ui-timepicker-div .ui-widget-content {
3672
+ border: 1px solid #aaa;
3673
+ background: #fff;
3674
+ font-weight: normal;
3675
+ color: #212121;
3676
+ }
3677
+ .ui-timepicker-div .ui-slider {
3678
+ position: relative;
3679
+ text-align: left;
3680
+ }
3681
+ .ui-timepicker-div .ui-slider-horizontal {
3682
+ height: .8em;
3683
+ bottom: -.3em;
3684
+ position: relative;
3685
+ -webkit-border-radius: 2px;
3686
+ -moz-border-radius: 2px;
3687
+ border-radius: 2px;
3688
+ }
3689
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3690
+ background: #f7f7f7;
3691
+ border: 1px solid #ccc;
3692
+ color: #555;
3693
+ cursor: pointer;
3694
+ display: block;
3695
+ height: 1.3em;
3696
+ margin-left: -.5em;
3697
+ outline: 0;
3698
+ position: absolute;
3699
+ top: -.325em;
3700
+ width: .8em;
3701
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3702
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3703
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 rgba(0,0,0,.08);
3704
+ -webkit-border-radius: 2px;
3705
+ -moz-border-radius: 2px;
3706
+ border-radius: 2px;
3707
+ }
3708
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover {
3709
+ background: #fafafa;
3710
+ border-color: #999;
3711
+ color: #222;
3712
+ }
3713
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3714
+ background: #eee;
3715
+ border-color: #999;
3716
+ color: #333;
3717
+ outline: none;
3718
+ }
3719
+ .ui-datepicker-prev,
3720
+ .ui-datepicker-next:before {
3721
+ border-color: #000;
3722
+ }
3723
+ .ui-datepicker-next,
3724
+ .ui-datepicker-prev:before {
3725
+ border-color: #444;
3726
+ }
3727
+ .ui-datepicker-prev:hover,
3728
+ .ui-datepicker-next:hover {
3729
+ background: #222;
3730
+ color: #0074a2 !important;
3731
+ }
3732
+
3733
+ .ui-timepicker-div dl {
3734
+ text-align: left;
3735
+ }
3736
+ .ui-timepicker-div dl dt {
3737
+ float: left;
3738
+ clear: left;
3739
+ padding: 0 0 0 5px;
3740
+ }
3741
+ .ui-timepicker-div dl dd {
3742
+ margin: 0 10px 10px 45%;
3743
+ }
3744
+ .ui-timepicker-div td {
3745
+ font-size: 90%;
3746
+ }
3747
+ .ui-tpicker-grid-label {
3748
+ background: none;
3749
+ border: none;
3750
+ margin: 0;
3751
+ padding: 0;
3752
+ }
3753
+ /* default */
3754
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3755
+ background: #333;
3756
+ border-color: #000;
3757
+ }
3758
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3759
+ .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3760
+ background: #444;
3761
+ border-color: #111;
3762
+ }
3763
+ /* light */
3764
+ .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3765
+ background: #888;
3766
+ border-color: #3c3c3c;
3767
+ }
3768
+ .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3769
+ .admin-color-light .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3770
+ background: #999;
3771
+ border-color: #777;
3772
+ }
3773
+ /* blue */
3774
+ .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3775
+ background: #52accc;
3776
+ border-color: #002b39;
3777
+ }
3778
+ .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3779
+ .admin-color-blue .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3780
+ background: #5dc2e6;
3781
+ border-color: #006484;
3782
+ }
3783
+ /* coffee */
3784
+ .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3785
+ background: #59524c;
3786
+ border-color: #0f0e0d;
3787
+ }
3788
+ .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3789
+ .admin-color-coffee .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3790
+ background: #cca588;
3791
+ border-color: #675f58;
3792
+ }
3793
+ /* ectoplasm */
3794
+ .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3795
+ background: #523f6d;
3796
+ border-color: #181220;
3797
+ }
3798
+ .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3799
+ .admin-color-ectoplasm .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3800
+ background: #a3b542;
3801
+ border-color: #644d85;
3802
+ }
3803
+ /* midnight */
3804
+ .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3805
+ background: #363b3f;
3806
+ border-color: #090a0b;
3807
+ }
3808
+ .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3809
+ .admin-color-midnight .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3810
+ background: #ed543f;
3811
+ border-color: #a0382a;
3812
+ }
3813
+ /* ocean */
3814
+ .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3815
+ background: #738e96;
3816
+ border-color: #39464a;
3817
+ }
3818
+ .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3819
+ .admin-color-ocean .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3820
+ background: #9ab8a0;
3821
+ border-color: #5a6c5e;
3822
+ }
3823
+ /* sunrise */
3824
+ .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle {
3825
+ background: #da4f41;
3826
+ border-color: #8a322a;
3827
+ }
3828
+ .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle:hover,
3829
+ .admin-color-sunrise .ui-timepicker-div .ui-slider-horizontal .ui-slider-handle.ui-state-active {
3830
+ background: #e88436;
3831
+ border-color: #e75546;
3832
+ }
3833
+
3834
+ /* --------------------------------------------------
3835
+ :: Meta Box Tabs
3836
+ ---------------------------------------------------*/
3837
+ .ot-metabox-tabs.ui-tabs {
3838
+ overflow: hidden;
3839
+ position: relative;
3840
+ }
3841
+ .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
3842
+ overflow: hidden;
3843
+ }
3844
+ .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
3845
+ background: white;
3846
+ border: 1px solid #ccc;
3847
+ margin: 7px 0 1px 0;
3848
+ min-height: 140px;
3849
+ overflow: hidden;
3850
+ padding: 12px;
3851
+ -webkit-border-radius: 2px;
3852
+ -moz-border-radius: 2px;
3853
+ border-radius: 2px;
3854
+ }
3855
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3856
+ float: left;
3857
+ list-style: none;
3858
+ margin: 0 -1px 0 0;
3859
+ padding: 18px 0 12px 0;
3860
+ width: 151px;
3861
+ }
3862
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li,
3863
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-focus {
3864
+ background: none;
3865
+ border: 1px solid transparent;
3866
+ border-right-width: 0px;
3867
+ display: block;
3868
+ margin: 0;
3869
+ outline: 0;
3870
+ padding: 1px 0;
3871
+ width: 150px;
3872
+ -webkit-border-radius: 2px 0 0 2px;
3873
+ -moz-border-radius: 2px 0 0 2px;
3874
+ border-radius: 2px 0 0 2px;
3875
+ }
3876
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
3877
+ background: white;
3878
+ border-color: #ccc;
3879
+ color: black;
3880
+ }
3881
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
3882
+ color: #21759b;
3883
+ display: block;
3884
+ line-height: 18px;
3885
+ outline: 0;
3886
+ padding: 5px 5px 5px 12px;
3887
+ text-decoration: none;
3888
+ }
3889
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
3890
+ color: black;
3891
+ outline: none;
3892
+ }
3893
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
3894
+ color: black;
3895
+ outline: none;
3896
+ }
3897
+ .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
3898
+ clear: both;
3899
+ }
3900
+
3901
+ /* --------------------------------------------------
3902
+ :: Theme Option & Side Metabox Tabs
3903
+ ---------------------------------------------------*/
3904
+ .ot-theme-option-tabs.ui-tabs
3905
+ #side-sortables .ot-metabox-tabs.ui-tabs {
3906
+ position: relative;
3907
+ }
3908
+ .ot-theme-option-tabs.ui-tabs .inside,
3909
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
3910
+ overflow: hidden;
3911
+ }
3912
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-panels,
3913
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
3914
+ border: 0;
3915
+ margin: 0;
3916
+ overflow: hidden;
3917
+ padding: 0;
3918
+ width: 100%;
3919
+ }
3920
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav,
3921
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3922
+ border-bottom: 1px solid #ccc;
3923
+ float: none;
3924
+ font-size: 12px !important;
3925
+ height: 30px;
3926
+ list-style: none;
3927
+ margin: 2px 0 0 0;
3928
+ padding: 0;
3929
+ width: 100%;
3930
+ }
3931
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
3932
+ margin-top: 10px;
3933
+ }
3934
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-default,
3935
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-default {
3936
+ background: #fafafa;
3937
+ border: 1px solid #ccc;
3938
+ border-width: 1px 1px 0px 1px;
3939
+ display: block;
3940
+ float: left;
3941
+ margin: 0 0 0 3px;
3942
+ padding: 0;
3943
+ outline: 0;
3944
+ -webkit-border-radius: 2px 2px 0 0;
3945
+ -moz-border-radius: 2px 2px 0 0;
3946
+ border-radius: 2px 2px 0 0;
3947
+ }
3948
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li:hover,
3949
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li:hover {
3950
+ background: #f1f1f1;
3951
+ border: 1px solid #ccc;
3952
+ border-width: 1px 1px 0px 1px;
3953
+ }
3954
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-active,
3955
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
3956
+ background: white;
3957
+ border-color: #ccc;
3958
+ border-width: 1px 1px 0px 1px;
3959
+ color: black;
3960
+ padding: 0;
3961
+ -webkit-border-radius: 2px 2px 0 0;
3962
+ -moz-border-radius: 2px 2px 0 0;
3963
+ border-radius: 2px 2px 0 0;
3964
+ }
3965
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li a,
3966
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
3967
+ color: #21759b;
3968
+ display: block;
3969
+ line-height: 18px;
3970
+ outline: 0;
3971
+ padding: 6px 12px 5px 12px !important;
3972
+ text-decoration: none;
3973
+ }
3974
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li a:hover,
3975
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
3976
+ color: black;
3977
+ outline: none;
3978
+ }
3979
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-nav.ui-tabs-nav li.ui-state-active a,
3980
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
3981
+ color: black;
3982
+ outline: none;
3983
+ padding: 6px 12px 6px 12px !important;
3984
+ }
3985
+ .ot-theme-option-tabs.ui-tabs .ot-theme-option-panel,
3986
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
3987
+ clear: both;
3988
+ }
3989
+ #side-sortables .ot-metabox-tabs.ui-tabs .format-setting .description,
3990
+ #side-sortables .ot-metabox-tabs.ui-tabs .format-setting .format-setting-inner {
3991
+ width: 100%;
3992
+ }
3993
+
3994
+ /* --------------------------------------------------
3995
+ :: Metabox Tabs for Small Screens & Mobile Devices
3996
+ ---------------------------------------------------*/
3997
+ @media screen and ( max-width: 1020px ) {
3998
+ .ot-metabox-tabs.ui-tabs {
3999
+ position: relative;
4000
+ }
4001
+ .ot-metabox-tabs.ui-tabs .ot-metabox-wrapper {
4002
+ overflow: hidden;
4003
+ }
4004
+ .ot-metabox-tabs.ui-tabs .ot-metabox-panels {
4005
+ border: 0;
4006
+ margin: 0;
4007
+ overflow: hidden;
4008
+ padding: 0;
4009
+ width: 100%;
4010
+ }
4011
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
4012
+ border-bottom: 1px solid #ccc;
4013
+ float: none;
4014
+ font-size: 12px !important;
4015
+ height: 30px;
4016
+ list-style: none;
4017
+ margin: 2px 0 0 0;
4018
+ padding: 0;
4019
+ width: 100%;
4020
+ }
4021
+ #side-sortables .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav {
4022
+ margin-top: 10px;
4023
+ }
4024
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li {
4025
+ background: #fafafa;
4026
+ border: 1px solid #ccc !important;
4027
+ border-width: 1px 1px 0px 1px !important;
4028
+ display: inline-block !important;
4029
+ margin: 0 0 0 3px !important;
4030
+ padding: 0 !important;
4031
+ outline: 0 !important;
4032
+ width: auto !important;
4033
+ -webkit-border-radius: 2px 2px 0 0;
4034
+ -moz-border-radius: 2px 2px 0 0;
4035
+ border-radius: 2px 2px 0 0;
4036
+ }
4037
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li:hover {
4038
+ background: #f1f1f1;
4039
+ }
4040
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active {
4041
+ background: white;
4042
+ color: black;
4043
+ padding: 0;
4044
+ -webkit-border-radius: 2px 2px 0 0;
4045
+ -moz-border-radius: 2px 2px 0 0;
4046
+ border-radius: 2px 2px 0 0;
4047
+ }
4048
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a {
4049
+ color: #21759b;
4050
+ display: block;
4051
+ line-height: 18px;
4052
+ outline: 0;
4053
+ padding: 6px 12px 5px 12px !important;
4054
+ text-decoration: none;
4055
+ }
4056
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li a:hover {
4057
+ color: black;
4058
+ outline: none;
4059
+ }
4060
+ .ot-metabox-tabs.ui-tabs .ot-metabox-nav.ui-tabs-nav li.ui-state-active a {
4061
+ color: black;
4062
+ outline: none;
4063
+ padding: 6px 12px 6px 12px !important;
4064
+ }
4065
+ .ot-metabox-tabs.ui-tabs .ot-metabox-panel {
4066
+ clear: both;
4067
+ }
4068
+ }
4069
+
4070
+
4071
+ .of-notice-small {
4072
+ border-left: 4px solid #00a0d2;
4073
+ margin: 5px 0 15px;
4074
+ padding: 1px 12px;
4075
+ background-color: #fafafa;
4076
+ display: inline-block;
4077
+ }
4078
+
4079
+
4080
+ .nifty-list {
4081
+ list-style-type: circle;
4082
+ list-style-position: outside;
4083
+ margin-left: 14px;
4084
+ line-height: 150%;
4085
+ }
4086
+
4087
+ .toplevel_page_niftycs-options .upsell-footer{
4088
+ text-align: center;
4089
  }
admin/assets/images/themes/pro/aeroplane-company.jpg DELETED
Binary file
admin/assets/images/themes/pro/air-balloon.jpg DELETED
Binary file
admin/assets/images/themes/pro/animated-clock.jpg DELETED
Binary file
admin/assets/images/themes/pro/architecture-inc.jpg DELETED
Binary file
admin/assets/images/themes/pro/architecture.jpg DELETED
Binary file
admin/assets/images/themes/pro/art-gallery.jpg DELETED
Binary file
admin/assets/images/themes/pro/auto-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/bakery.jpg DELETED
Binary file
admin/assets/images/themes/pro/banking-app.jpg DELETED
Binary file
admin/assets/images/themes/pro/barbershop.jpg DELETED
Binary file
admin/assets/images/themes/pro/beach.jpg DELETED
Binary file
admin/assets/images/themes/pro/bicycle-race.jpg DELETED
Binary file
admin/assets/images/themes/pro/bike-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/bitcoin-miners.jpg DELETED
Binary file
admin/assets/images/themes/pro/black-friday.jpg DELETED
Binary file
admin/assets/images/themes/pro/blogging.jpg DELETED
Binary file
admin/assets/images/themes/pro/blue-ocean.jpg DELETED
Binary file
admin/assets/images/themes/pro/body-transformation.jpg DELETED
Binary file
admin/assets/images/themes/pro/bodybuilding.jpg DELETED
Binary file
admin/assets/images/themes/pro/book-lovers.jpg DELETED
Binary file
admin/assets/images/themes/pro/business-company.jpg DELETED
Binary file
admin/assets/images/themes/pro/business-consulting-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/business-consulting.jpg DELETED
Binary file
admin/assets/images/themes/pro/business-launch.jpg DELETED
Binary file
admin/assets/images/themes/pro/business-meeting-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/business.jpg DELETED
Binary file
admin/assets/images/themes/pro/cafe.jpg DELETED
Binary file
admin/assets/images/themes/pro/chatbot.jpg DELETED
Binary file
admin/assets/images/themes/pro/christmas-decor.jpg DELETED
Binary file
admin/assets/images/themes/pro/christmas-sale.jpg DELETED
Binary file
admin/assets/images/themes/pro/church.jpg DELETED
Binary file
admin/assets/images/themes/pro/city-nighttime.jpg DELETED
Binary file
admin/assets/images/themes/pro/cityscape.jpg DELETED
Binary file
admin/assets/images/themes/pro/clothing-trends.jpg DELETED
Binary file
admin/assets/images/themes/pro/clouds-screensaver-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/coffee-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/cold-lake.jpg DELETED
Binary file
admin/assets/images/themes/pro/computer-repair-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/concert.jpg DELETED
Binary file
admin/assets/images/themes/pro/conference-event.jpg DELETED
Binary file
admin/assets/images/themes/pro/construction-company.jpg DELETED
Binary file
admin/assets/images/themes/pro/creative-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/custom-decor.jpg DELETED
Binary file
admin/assets/images/themes/pro/cyber-security.jpg DELETED
Binary file
admin/assets/images/themes/pro/default.jpg DELETED
Binary file
admin/assets/images/themes/pro/dental-clinic.jpg DELETED
Binary file
admin/assets/images/themes/pro/digital-agency.jpg DELETED
Binary file
admin/assets/images/themes/pro/dog-shelter.jpg DELETED
Binary file
admin/assets/images/themes/pro/dog-training-and-behavior-consulting.jpg DELETED
Binary file
admin/assets/images/themes/pro/donation.jpg DELETED
Binary file
admin/assets/images/themes/pro/ecommerce.jpg DELETED
Binary file
admin/assets/images/themes/pro/email-platform.jpg DELETED
Binary file
admin/assets/images/themes/pro/employment.jpg DELETED
Binary file
admin/assets/images/themes/pro/essay-writing-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/fall-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/fashion.jpg DELETED
Binary file
admin/assets/images/themes/pro/film-trailer.jpg DELETED
Binary file
admin/assets/images/themes/pro/financial-counselling.jpg DELETED
Binary file
admin/assets/images/themes/pro/financial-district.jpg DELETED
Binary file
admin/assets/images/themes/pro/fitness-e-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/florium.jpg DELETED
Binary file
admin/assets/images/themes/pro/flower-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/food-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/food-store.jpg DELETED
Binary file
admin/assets/images/themes/pro/foodie.jpg DELETED
Binary file
admin/assets/images/themes/pro/football.jpg DELETED
Binary file
admin/assets/images/themes/pro/frozen-nature.jpg DELETED
Binary file
admin/assets/images/themes/pro/future-technology.jpg DELETED
Binary file
admin/assets/images/themes/pro/graphic-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/greenlife.jpg DELETED
Binary file
admin/assets/images/themes/pro/halloween.jpg DELETED
Binary file
admin/assets/images/themes/pro/healthy-eating.jpg DELETED
Binary file
admin/assets/images/themes/pro/hexagons-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/holiday-resort.jpg DELETED
Binary file
admin/assets/images/themes/pro/home-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/homemade-chocolate-gifts.jpg DELETED
Binary file
admin/assets/images/themes/pro/hosting.jpg DELETED
Binary file
admin/assets/images/themes/pro/ice-cream-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/in-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/inspy-romance.jpg DELETED
Binary file
admin/assets/images/themes/pro/interior-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/internet-service-provider.jpg DELETED
Binary file
admin/assets/images/themes/pro/it-conference.jpg DELETED
Binary file
admin/assets/images/themes/pro/journey-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/keyword-research.jpg DELETED
Binary file
admin/assets/images/themes/pro/kids-center.jpg DELETED
Binary file
admin/assets/images/themes/pro/kids-innovation-program.jpg DELETED
Binary file
admin/assets/images/themes/pro/ladies-accessories.jpg DELETED
Binary file
admin/assets/images/themes/pro/lego-bricks.jpg DELETED
Binary file
admin/assets/images/themes/pro/loneliness.jpg DELETED
Binary file
admin/assets/images/themes/pro/lonely-road.jpg DELETED
Binary file
admin/assets/images/themes/pro/luxury-car.jpg DELETED
Binary file
admin/assets/images/themes/pro/maintenance-mode.jpg DELETED
Binary file
admin/assets/images/themes/pro/makeup-artist-training.jpg DELETED
Binary file
admin/assets/images/themes/pro/marketing-webinar.jpg DELETED
Binary file
admin/assets/images/themes/pro/metrics-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/misty-forest-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/mobile-app.jpg DELETED
Binary file
admin/assets/images/themes/pro/mobile-designer.jpg DELETED
Binary file
admin/assets/images/themes/pro/mobile-meeting.jpg DELETED
Binary file
admin/assets/images/themes/pro/modern-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/modern-office.jpg DELETED
Binary file
admin/assets/images/themes/pro/modern-recipes.jpg DELETED
Binary file
admin/assets/images/themes/pro/mountain-slide.jpg DELETED
Binary file
admin/assets/images/themes/pro/mountain.jpg DELETED
Binary file
admin/assets/images/themes/pro/movie-trailer-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/moving-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/museum.jpg DELETED
Binary file
admin/assets/images/themes/pro/music-lessons.jpg DELETED
Binary file
admin/assets/images/themes/pro/music.jpg DELETED
Binary file
admin/assets/images/themes/pro/nature.jpg DELETED
Binary file
admin/assets/images/themes/pro/non-profit-organization.jpg DELETED
Binary file
admin/assets/images/themes/pro/nutritionist.jpg DELETED
Binary file
admin/assets/images/themes/pro/office-meeting-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/office-theme.jpg DELETED
Binary file
admin/assets/images/themes/pro/online-food-delivery.jpg DELETED
Binary file
admin/assets/images/themes/pro/online-learning.jpg DELETED
Binary file
admin/assets/images/themes/pro/online-shopping.jpg DELETED
Binary file
admin/assets/images/themes/pro/organic-cosmetics.jpg DELETED
Binary file
admin/assets/images/themes/pro/pancake-house.jpg DELETED
Binary file
admin/assets/images/themes/pro/parenting.jpg DELETED
Binary file
admin/assets/images/themes/pro/parents-online.jpg DELETED
Binary file
admin/assets/images/themes/pro/passage.jpg DELETED
Binary file
admin/assets/images/themes/pro/peaceful-river.jpg DELETED
Binary file
admin/assets/images/themes/pro/perfume-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/personal-trainer.jpg DELETED
Binary file
admin/assets/images/themes/pro/photo-studio.jpg DELETED
Binary file
admin/assets/images/themes/pro/photography.jpg DELETED
Binary file
admin/assets/images/themes/pro/plumbing.jpg DELETED
Binary file
admin/assets/images/themes/pro/podcast.jpg DELETED
Binary file
admin/assets/images/themes/pro/portfolio.jpg DELETED
Binary file
admin/assets/images/themes/pro/real-estate.jpg DELETED
Binary file
admin/assets/images/themes/pro/remote-work.jpg DELETED
Binary file
admin/assets/images/themes/pro/restaurant.jpg DELETED
Binary file
admin/assets/images/themes/pro/romantic-travels.jpg DELETED
Binary file
admin/assets/images/themes/pro/running-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/running-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/scholar-university.jpg DELETED
Binary file
admin/assets/images/themes/pro/seo-digital-marketing.jpg DELETED
Binary file
admin/assets/images/themes/pro/shoes-store.jpg DELETED
Binary file
admin/assets/images/themes/pro/simple-beige-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/skin-care.jpg DELETED
Binary file
admin/assets/images/themes/pro/skincare.jpg DELETED
Binary file
admin/assets/images/themes/pro/snow-screensaver-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/snowboarding-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/snowy-mountain.jpg DELETED
Binary file
admin/assets/images/themes/pro/snowy-oasis.jpg DELETED
Binary file
admin/assets/images/themes/pro/social-media-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/social-media.jpg DELETED
Binary file
admin/assets/images/themes/pro/spa-beauty-studio.jpg DELETED
Binary file
admin/assets/images/themes/pro/spa.jpg DELETED
Binary file
admin/assets/images/themes/pro/sport-shop.jpg DELETED
Binary file
admin/assets/images/themes/pro/spring-sale.jpg DELETED
Binary file
admin/assets/images/themes/pro/spring.jpg DELETED
Binary file
admin/assets/images/themes/pro/startup.jpg DELETED
Binary file
admin/assets/images/themes/pro/stat-team.jpg DELETED
Binary file
admin/assets/images/themes/pro/statistics-survey.jpg DELETED
Binary file
admin/assets/images/themes/pro/studio-design.jpg DELETED
Binary file
admin/assets/images/themes/pro/stylish-workplace.jpg DELETED
Binary file
admin/assets/images/themes/pro/tattoo-studio.jpg DELETED
Binary file
admin/assets/images/themes/pro/tech.jpg DELETED
Binary file
admin/assets/images/themes/pro/techexpo.jpg DELETED
Binary file
admin/assets/images/themes/pro/technology.jpg DELETED
Binary file
admin/assets/images/themes/pro/telecommunication.jpg DELETED
Binary file
admin/assets/images/themes/pro/the-big-city-newsletter.jpg DELETED
Binary file
admin/assets/images/themes/pro/the-sunny-view.jpg DELETED
Binary file
admin/assets/images/themes/pro/theatre.jpg DELETED
Binary file
admin/assets/images/themes/pro/travel-agency.jpg DELETED
Binary file
admin/assets/images/themes/pro/travel-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/travel.jpg DELETED
Binary file
admin/assets/images/themes/pro/tulips.jpg DELETED
Binary file
admin/assets/images/themes/pro/valentines-day.jpg DELETED
Binary file
admin/assets/images/themes/pro/video-production.jpg DELETED
Binary file
admin/assets/images/themes/pro/virtual-assistant-service.jpg DELETED
Binary file
admin/assets/images/themes/pro/virtual-reality.jpg DELETED
Binary file
admin/assets/images/themes/pro/walking-away-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/web-security.jpg DELETED
Binary file
admin/assets/images/themes/pro/webinar.jpg DELETED
Binary file
admin/assets/images/themes/pro/wedding-blog.jpg DELETED
Binary file
admin/assets/images/themes/pro/wedding.jpg DELETED
Binary file
admin/assets/images/themes/pro/white-orchids.jpg DELETED
Binary file
admin/assets/images/themes/pro/winter-sale.jpg DELETED
Binary file
admin/assets/images/themes/pro/working-out.jpg DELETED
Binary file
admin/assets/images/themes/pro/workplace.jpg DELETED
Binary file
admin/assets/images/themes/pro/writing-service-video.jpg DELETED
Binary file
admin/assets/images/themes/pro/yoga-classes.jpg DELETED
Binary file
admin/assets/js/ot-admin.js CHANGED
@@ -1,1335 +1,1335 @@
1
- /**
2
- * Option Tree UI
3
- *
4
- * Dependencies: jQuery, jQuery UI, ColorPicker
5
- *
6
- * @author Derek Herman (derek@valendesigns.com)
7
- */
8
- ;(function($) {
9
- OT_UI = {
10
- processing: false,
11
- init: function() {
12
- this.init_hide_body();
13
- this.init_sortable();
14
- this.init_add();
15
- this.init_edit();
16
- this.init_remove();
17
- this.init_edit_title();
18
- this.init_edit_id();
19
- this.init_activate_layout();
20
- this.init_conditions();
21
- this.init_upload();
22
- this.init_upload_remove();
23
- this.init_numeric_slider();
24
- this.init_tabs();
25
- this.init_radio_image_select();
26
- this.init_select_wrapper();
27
- this.bind_select_wrapper();
28
- this.init_google_fonts();
29
- this.fix_upload_parent();
30
- this.fix_textarea();
31
- this.replicate_ajax();
32
- this.reset_settings();
33
- this.css_editor_mode();
34
- this.javascript_editor_mode();
35
- },
36
- init_hide_body: function(elm,type) {
37
- var css = '.option-tree-setting-body';
38
- if ( type == 'parent' ) {
39
- $(css).not( elm.parent().parent().children(css) ).hide();
40
- } else if ( type == 'child' ) {
41
- elm.closest('ul').find(css).not( elm.parent().parent().children(css) ).hide();
42
- } else if ( type == 'child-add' ) {
43
- elm.children().find(css).hide();
44
- } else if ( type == 'toggle' ) {
45
- elm.parent().parent().children(css).toggle();
46
- } else {
47
- $(css).hide();
48
- }
49
- },
50
- init_remove_active: function(elm,type) {
51
- var css = '.option-tree-setting-edit';
52
- if ( type == 'parent' ) {
53
- $(css).not(elm).removeClass('active');
54
- } else if ( type == 'child' ) {
55
- elm.closest('ul').find(css).not(elm).removeClass('active');
56
- } else if ( type == 'child-add' ) {
57
- elm.children().find(css).removeClass('active');
58
- } else {
59
- $(css).removeClass('active');
60
- }
61
- },
62
- init_sortable: function(scope) {
63
- scope = scope || document;
64
- $('.option-tree-sortable', scope).each( function() {
65
- if ( $(this).children('li').length ) {
66
- var elm = $(this);
67
- elm.show();
68
- elm.sortable({
69
- items: 'li:not(.ui-state-disabled)',
70
- handle: 'div.open',
71
- placeholder: 'ui-state-highlight',
72
- start: function (event, ui) {
73
- ui.placeholder.height(ui.item.height()-2);
74
- },
75
- stop: function(evt, ui) {
76
- setTimeout(
77
- function(){
78
- OT_UI.update_ids(elm);
79
- },
80
- 200
81
- )
82
- }
83
- });
84
- }
85
- });
86
- },
87
- init_add: function() {
88
- $(document).on('click', '.option-tree-section-add', function(e) {
89
- e.preventDefault();
90
- OT_UI.add(this,'section');
91
- });
92
- $(document).on('click', '.option-tree-setting-add', function(e) {
93
- e.preventDefault();
94
- OT_UI.add(this,'setting');
95
- });
96
- $(document).on('click', '.option-tree-help-add', function(e) {
97
- e.preventDefault();
98
- OT_UI.add(this,'the_contextual_help');
99
- });
100
- $(document).on('click', '.option-tree-choice-add', function(e) {
101
- e.preventDefault();
102
- OT_UI.add(this,'choice');
103
- });
104
- $(document).on('click', '.option-tree-list-item-add', function(e) {
105
- e.preventDefault();
106
- OT_UI.add(this,'list_item');
107
- });
108
- $(document).on('click', '.option-tree-social-links-add', function(e) {
109
- e.preventDefault();
110
- OT_UI.add(this,'social_links');
111
- });
112
- $(document).on('click', '.option-tree-list-item-setting-add', function(e) {
113
- e.preventDefault();
114
- if ( $(this).parents('ul').parents('ul').hasClass('ui-sortable') ) {
115
- alert(option_tree.setting_limit);
116
- return false;
117
- }
118
- OT_UI.add(this,'list_item_setting');
119
- });
120
- },
121
- init_edit: function() {
122
- $(document).on('click', '.option-tree-setting-edit', function(e) {
123
- e.preventDefault();
124
- if ( $(this).parents().hasClass('option-tree-setting-body') ) {
125
- OT_UI.init_remove_active($(this),'child');
126
- OT_UI.init_hide_body($(this),'child');
127
- } else {
128
- OT_UI.init_remove_active($(this),'parent');
129
- OT_UI.init_hide_body($(this), 'parent');
130
- }
131
- $(this).toggleClass('active');
132
- OT_UI.init_hide_body($(this), 'toggle');
133
- });
134
- },
135
- init_remove: function() {
136
- $(document).on('click', '.option-tree-setting-remove', function(event) {
137
- event.preventDefault();
138
- if ( $(this).parents('li').hasClass('ui-state-disabled') ) {
139
- alert(option_tree.remove_no);
140
- return false;
141
- }
142
- var agree = confirm(option_tree.remove_agree);
143
- if (agree) {
144
- var list = $(this).parents('ul');
145
- OT_UI.remove(this);
146
- setTimeout( function() {
147
- OT_UI.update_ids(list);
148
- }, 200 );
149
- }
150
- return false;
151
- });
152
- },
153
- init_edit_title: function() {
154
- $(document).on('keyup', '.option-tree-setting-title', function() {
155
- OT_UI.edit_title(this);
156
- });
157
- // Automatically fill option IDs with clean versions of their respective option labels
158
- $(document).on('blur', '.option-tree-setting-title', function() {
159
- var optionId = $(this).parents('.option-tree-setting-body').find('[type="text"][name$="id]"]')
160
- if ( optionId.val() === '' ) {
161
- optionId.val($(this).val().replace(/[^a-z0-9]/gi,'_').toLowerCase());
162
- }
163
- });
164
- },
165
- init_edit_id: function() {
166
- $(document).on('keyup', '.section-id', function(){
167
- OT_UI.update_id(this);
168
- });
169
- },
170
- init_activate_layout: function() {
171
- $(document).on('click', '.option-tree-layout-activate', function() {
172
- var active = $(this).parents('.option-tree-setting').find('.open').text();
173
- $('.option-tree-layout-activate').removeClass('active');
174
- $(this).toggleClass('active');
175
- $('.active-layout-input').attr({'value':active});
176
- });
177
- $(document).on('change', '#option-tree-options-layouts-form select', function() {
178
- var agree = confirm(option_tree.activate_layout_agree);
179
- if (agree) {
180
- $('#option-tree-options-layouts-form').submit();
181
- } else {
182
- var active = $('#the_current_layout').attr('value');
183
- $('#option-tree-options-layouts-form select option[value="' + active + '"]').attr({'selected':'selected'});
184
- $('#option-tree-options-layouts-form select').prev('span').replaceWith('<span>' + active + '</span>');
185
- }
186
- });
187
- },
188
- add: function(elm,type) {
189
- var self = this,
190
- list = '',
191
- list_class = '',
192
- name = '',
193
- post_id = 0,
194
- get_option = '',
195
- settings = '';
196
- if ( type == 'the_contextual_help' ) {
197
- list = $(elm).parent().find('ul:last');
198
- list_class = 'list-contextual-help';
199
- } else if ( type == 'choice' ) {
200
- list = $(elm).parent().children('ul');
201
- list_class = 'list-choice';
202
- } else if ( type == 'list_item' ) {
203
- list = $(elm).parent().children('ul');
204
- list_class = 'list-sub-setting';
205
- } else if ( type == 'list_item_setting' ) {
206
- list = $(elm).parent().children('ul');
207
- list_class = 'list-sub-setting';
208
- } else if ( type == 'social_links' ) {
209
- list = $(elm).parent().children('ul');
210
- list_class = 'list-sub-setting';
211
- } else {
212
- list = $(elm).parent().find('ul:first');
213
- list_class = ( type == 'section' ) ? 'list-section' : 'list-setting';
214
- }
215
- name = list.data('name');
216
- post_id = list.data('id');
217
- get_option = list.data('getOption');
218
- settings = $('#'+name+'_settings_array').val();
219
- if ( this.processing === false ) {
220
- this.processing = true;
221
- var count = parseInt(list.children('li').length);
222
- if ( type == 'list_item' || type == 'social_links' ) {
223
- list.find('li input.option-tree-setting-title', self).each(function(){
224
- var setting = $(this).attr('name'),
225
- regex = /\[([0-9]+)\]/,
226
- matches = setting.match(regex),
227
- id = null != matches ? parseInt(matches[1]) : 0;
228
- id++;
229
- if ( id > count) {
230
- count = id;
231
- }
232
- });
233
- }
234
- $.ajax({
235
- url: option_tree.ajax,
236
- type: 'post',
237
- data: {
238
- action: 'add_' + type,
239
- count: count,
240
- name: name,
241
- post_id: post_id,
242
- get_option: get_option,
243
- settings: settings,
244
- type: type,
245
- nonce: option_tree.nonce
246
- },
247
- complete: function( data ) {
248
- if ( type == 'choice' || type == 'list_item_setting' ) {
249
- OT_UI.init_remove_active(list,'child-add');
250
- OT_UI.init_hide_body(list,'child-add');
251
- } else {
252
- OT_UI.init_remove_active();
253
- OT_UI.init_hide_body();
254
- }
255
- var listItem = $('<li class="ui-state-default ' + list_class + '">' + data.responseText + '</li>');
256
- list.append(listItem);
257
- list.children().last().find('.option-tree-setting-edit').toggleClass('active');
258
- list.children().last().find('.option-tree-setting-body').toggle();
259
- list.children().last().find('.option-tree-setting-title').focus();
260
- if ( type != 'the_contextual_help' ) {
261
- OT_UI.update_ids(list);
262
- }
263
- OT_UI.init_sortable(listItem);
264
- OT_UI.init_select_wrapper(listItem);
265
- OT_UI.init_numeric_slider(listItem);
266
- OT_UI.parse_condition();
267
- self.processing = false;
268
- }
269
- });
270
- }
271
- },
272
- remove: function(e) {
273
- $(e).parent().parent().parent('li').remove();
274
- },
275
- edit_title: function(e) {
276
- if ( this.timer ) {
277
- clearTimeout(e.timer);
278
- }
279
- this.timer = setTimeout( function() {
280
- $(e).parent().parent().parent().parent().parent().children('.open').text(e.value);
281
- }, 100);
282
- return true;
283
- },
284
- update_id: function(e) {
285
- if ( this.timer ) {
286
- clearTimeout(e.timer);
287
- }
288
- this.timer = setTimeout( function() {
289
- OT_UI.update_ids($(e).parents('ul'));
290
- }, 100);
291
- return true;
292
- },
293
- update_ids: function(list) {
294
- var last_section, section, list_items = list.children('li');
295
- list_items.each(function(index) {
296
- if ( $(this).hasClass('list-section') ) {
297
- section = $(this).find('.section-id').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
298
- if (!section) {
299
- section = $(this).find('.section-title').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
300
- }
301
- if (!section) {
302
- section = last_section;
303
- }
304
- }
305
- if ($(this).hasClass('list-setting') ) {
306
- $(this).find('.hidden-section').attr({'value':section});
307
- }
308
- last_section = section;
309
- });
310
- },
311
- condition_objects: function() {
312
- return 'select, input[type="radio"]:checked, input[type="text"], input[type="hidden"], input.ot-numeric-slider-hidden-input';
313
- },
314
- match_conditions: function(condition) {
315
- var match;
316
- var regex = /(.+?):(is|not|contains|less_than|less_than_or_equal_to|greater_than|greater_than_or_equal_to)\((.*?)\),?/g;
317
- var conditions = [];
318
-
319
- while( match = regex.exec( condition ) ) {
320
- conditions.push({
321
- 'check': match[1],
322
- 'rule': match[2],
323
- 'value': match[3] || ''
324
- });
325
- }
326
-
327
- return conditions;
328
- },
329
- parse_condition: function() {
330
- $( '.format-settings[id^="setting_"][data-condition]' ).each(function() {
331
-
332
- var passed;
333
- var conditions = OT_UI.match_conditions( $( this ).data( 'condition' ) );
334
- var operator = ( $( this ).data( 'operator' ) || 'and' ).toLowerCase();
335
-
336
- $.each( conditions, function( index, condition ) {
337
-
338
- var target = $( '#setting_' + condition.check );
339
- var targetEl = !! target.length && target.find( OT_UI.condition_objects() ).first();
340
-
341
- if ( ! target.length || ( ! targetEl.length && condition.value.toString() != '' ) ) {
342
- return;
343
- }
344
-
345
- var v1 = targetEl.length ? targetEl.val().toString() : '';
346
- var v2 = condition.value.toString();
347
- var result;
348
-
349
- switch ( condition.rule ) {
350
- case 'less_than':
351
- result = ( parseInt( v1 ) < parseInt( v2 ) );
352
- break;
353
- case 'less_than_or_equal_to':
354
- result = ( parseInt( v1 ) <= parseInt( v2 ) );
355
- break;
356
- case 'greater_than':
357
- result = ( parseInt( v1 ) > parseInt( v2 ) );
358
- break;
359
- case 'greater_than_or_equal_to':
360
- result = ( parseInt( v1 ) >= parseInt( v2 ) );
361
- break;
362
- case 'contains':
363
- result = ( v1.indexOf(v2) !== -1 ? true : false );
364
- break;
365
- case 'is':
366
- result = ( v1 == v2 );
367
- break;
368
- case 'not':
369
- result = ( v1 != v2 );
370
- break;
371
- }
372
-
373
- if ( 'undefined' == typeof passed ) {
374
- passed = result;
375
- }
376
-
377
- switch ( operator ) {
378
- case 'or':
379
- passed = ( passed || result );
380
- break;
381
- case 'and':
382
- default:
383
- passed = ( passed && result );
384
- break;
385
- }
386
-
387
- });
388
-
389
- if ( passed ) {
390
- $(this).animate({opacity: 'show' , height: 'show'}, 200);
391
- } else {
392
- $(this).animate({opacity: 'hide' , height: 'hide'}, 200);
393
- }
394
-
395
- delete passed;
396
-
397
- });
398
- },
399
- init_conditions: function() {
400
- var delay = (function() {
401
- var timer = 0;
402
- return function(callback, ms) {
403
- clearTimeout(timer);
404
- timer = setTimeout(callback, ms);
405
- };
406
- })();
407
-
408
- $('.format-settings[id^="setting_"]').on( 'change.conditionals, keyup.conditionals', OT_UI.condition_objects(), function(e) {
409
- if (e.type === 'keyup') {
410
- // handle keyup event only once every 500ms
411
- delay(function() {
412
- OT_UI.parse_condition();
413
- }, 500);
414
- } else {
415
- OT_UI.parse_condition();
416
- }
417
- OT_UI.load_editors();
418
- });
419
- OT_UI.parse_condition();
420
- },
421
- init_upload: function() {
422
- $(document).on('click', '.ot_upload_media', function() {
423
- var field_id = $(this).parent('.option-tree-ui-upload-parent').find('input').attr('id'),
424
- post_id = $(this).attr('rel'),
425
- save_attachment_id = $('#'+field_id).hasClass('ot-upload-attachment-id'),
426
- btnContent = '';
427
- if ( window.wp && wp.media ) {
428
- window.ot_media_frame = window.ot_media_frame || new wp.media.view.MediaFrame.Select({
429
- title: $(this).attr('title'),
430
- button: {
431
- text: option_tree.upload_text
432
- },
433
- multiple: false
434
- });
435
- window.ot_media_frame.on('select', function() {
436
- var attachment = window.ot_media_frame.state().get('selection').first(),
437
- href = attachment.attributes.url,
438
- attachment_id = attachment.attributes.id,
439
- mime = attachment.attributes.mime,
440
- regex = /^image\/(?:jpe?g|png|gif|x-icon)$/i;
441
- if ( mime.match(regex) ) {
442
- btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
443
- }
444
- btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
445
- $('#'+field_id).val( ( save_attachment_id ? attachment_id : href ) );
446
- $('#'+field_id+'_media').remove();
447
- $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
448
- $('#'+field_id+'_media').append(btnContent).slideDown();
449
- window.ot_media_frame.off('select');
450
- }).open();
451
- } else {
452
- var backup = window.send_to_editor,
453
- intval = window.setInterval(
454
- function() {
455
- if ( $('#TB_iframeContent').length > 0 && $('#TB_iframeContent').attr('src').indexOf( "&field_id=" ) !== -1 ) {
456
- $('#TB_iframeContent').contents().find('#tab-type_url').hide();
457
- }
458
- $('#TB_iframeContent').contents().find('.savesend .button').val(option_tree.upload_text);
459
- }, 50);
460
- tb_show('', 'media-upload.php?post_id='+post_id+'&field_id='+field_id+'&type=image&TB_iframe=1');
461
- window.send_to_editor = function(html) {
462
- var href = $(html).find('img').attr('src');
463
- if ( typeof href == 'undefined') {
464
- href = $(html).attr('src');
465
- }
466
- if ( typeof href == 'undefined') {
467
- href = $(html).attr('href');
468
- }
469
- var image = /\.(?:jpe?g|png|gif|ico)$/i;
470
- if (href.match(image) && OT_UI.url_exists(href)) {
471
- btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
472
- }
473
- btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
474
- $('#'+field_id).val(href);
475
- $('#'+field_id+'_media').remove();
476
- $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
477
- $('#'+field_id+'_media').append(btnContent).slideDown();
478
- OT_UI.fix_upload_parent();
479
- tb_remove();
480
- window.clearInterval(intval);
481
- window.send_to_editor = backup;
482
- };
483
- }
484
- return false;
485
- });
486
- },
487
- init_upload_remove: function() {
488
- $(document).on('click', '.option-tree-ui-remove-media', function(event) {
489
- event.preventDefault();
490
- var agree = confirm(option_tree.remove_agree);
491
- if (agree) {
492
- OT_UI.remove_image(this);
493
- return false;
494
- }
495
- return false;
496
- });
497
- },
498
- init_upload_fix: function(elm) {
499
- var id = $(elm).attr('id'),
500
- val = $(elm).val(),
501
- img = $(elm).parent().next('.option-tree-ui-media-wrap').find('img'),
502
- src = img.attr('src'),
503
- btnContent = '';
504
- if ( val == src ) {
505
- return;
506
- }
507
- if ( val != src ) {
508
- img.attr('src', val);
509
- }
510
- if ( val !== '' && ( typeof src == 'undefined' || src == false ) && OT_UI.url_exists(val) ) {
511
- var image = /\.(?:jpe?g|png|gif|ico)$/i;
512
- if (val.match(image)) {
513
- btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+val+'" alt="" /></div>';
514
- }
515
- btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle">'+option_tree.remove_media_text+'</span></a>';
516
- $('#'+id).val(val);
517
- $('#'+id+'_media').remove();
518
- $('#'+id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+id+'_media" />');
519
- $('#'+id+'_media').append(btnContent).slideDown();
520
- } else if ( val == '' || ! OT_UI.url_exists(val) ) {
521
- $(elm).parent().next('.option-tree-ui-media-wrap').remove();
522
- }
523
- },
524
- init_numeric_slider: function(scope) {
525
- scope = scope || document;
526
- $(".ot-numeric-slider-wrap", scope).each(function() {
527
- var hidden = $(".ot-numeric-slider-hidden-input", this),
528
- value = hidden.val(),
529
- helper = $(".ot-numeric-slider-helper-input", this);
530
- if ( ! value ) {
531
- value = hidden.data("min");
532
- helper.val(value)
533
- }
534
- $(".ot-numeric-slider", this).slider({
535
- min: hidden.data("min"),
536
- max: hidden.data("max"),
537
- step: hidden.data("step"),
538
- value: value,
539
- slide: function(event, ui) {
540
- hidden.add(helper).val(ui.value).trigger('change');
541
- },
542
- create: function() {
543
- hidden.val($(this).slider('value'));
544
- },
545
- change: function() {
546
- OT_UI.parse_condition();
547
- }
548
- });
549
- });
550
- },
551
- init_tabs: function() {
552
- $(".wrap.settings-wrap .ui-tabs").tabs({
553
- fx: {
554
- opacity: "toggle",
555
- duration: "fast"
556
- },
557
- activate: function(event, ui) {
558
- localStorage.setItem('nifty-active-tab', $('.wrap.settings-wrap .ui-tabs').tabs('option', 'active'));
559
- },
560
- active: localStorage.getItem('nifty-active-tab'),
561
- });
562
-
563
- $(".wrap.settings-wrap .ui-tabs a.ui-tabs-anchor").on("click", function(event, ui) {
564
- var obj = "input[name='_wp_http_referer']";
565
- if ( $(obj).length > 0 ) {
566
- var url = $(obj).val(),
567
- hash = $(this).attr('href');
568
- if ( url.indexOf("#") != -1 ) {
569
- var o = url.split("#")[1],
570
- n = hash.split("#")[1];
571
- url = url.replace(o, n);
572
- } else {
573
- url = url + hash;
574
- }
575
- $(obj).val(url);
576
- }
577
- });
578
- },
579
- init_radio_image_select: function() {
580
- $(document).on('click', '.option-tree-ui-radio-image', function() {
581
- $(this).closest('.type-radio-image').find('.option-tree-ui-radio-image').removeClass('option-tree-ui-radio-image-selected');
582
- $(this).toggleClass('option-tree-ui-radio-image-selected');
583
- $(this).parent().find('.option-tree-ui-radio').prop('checked', true).trigger('change');
584
- });
585
- },
586
- init_select_wrapper: function(scope) {
587
- scope = scope || document;
588
- $('.option-tree-ui-select', scope).each(function () {
589
- if ( ! $(this).parent().hasClass('select-wrapper') ) {
590
- $(this).wrap('<div class="select-wrapper" />');
591
- $(this).parent('.select-wrapper').prepend('<span>' + $(this).find('option:selected').text() + '</span>');
592
- }
593
- });
594
- },
595
- bind_select_wrapper: function() {
596
- $(document).on('change', '.option-tree-ui-select', function () {
597
- $(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
598
- });
599
- },
600
- init_google_fonts: function() {
601
- var update_items = function(input, items, element) {
602
- var itemsUI = input.closest('.type-google-font-group').find(element);
603
- if ( itemsUI.length ) {
604
- itemsUI.empty();
605
- itemsUI.append($.map(items, function(item) {
606
- var input = document.createElement('input'),
607
- label = document.createElement('label');
608
- input.type = 'checkbox';
609
- input.id = ( itemsUI.data('field-id-prefix') || '' ) + item;
610
- input.name = ( itemsUI.data('field-name') || '' ) + '[]';
611
- input.value = item;
612
- label.innerHTML = item;
613
- $( label ).attr( 'for', input.id );
614
- return $( document.createElement('p') ).addClass('checkbox-wrap').append([input, label]);
615
- }));
616
- }
617
- };
618
- $(document).on('change', '.option-tree-google-font-family select', function() {
619
- var input = $(this);
620
- $.ajax({
621
- url: option_tree.ajax,
622
- type: 'POST',
623
- dataType: 'json',
624
- data: {
625
- action: 'ot_google_font',
626
- family: input.val(),
627
- field_id: input.attr('id')
628
- }
629
- }).done(function(response) {
630
- if ( response.hasOwnProperty('variants') ) {
631
- update_items( input, response.variants, '.option-tree-google-font-variants' );
632
- }
633
- if ( response.hasOwnProperty('subsets') ) {
634
- update_items( input, response.subsets, '.option-tree-google-font-subsets' );
635
- }
636
- });
637
- });
638
- $('.js-add-google-font').on('click', function (event) {
639
- var $group = $(this).parent('.format-setting-inner').find('.type-google-font-group'),
640
- $el_clone = $(this).prev('.type-google-font-group-clone'),
641
- $clone = $el_clone.clone(true),
642
- $count = $group.length ? $group.length : 0;
643
- $clone.attr('class', 'type-google-font-group');
644
- var replacer = function(index, elm) {
645
- return elm.replace('%key%', $count);
646
- }
647
- $('select', $clone).each( function() {
648
- $(this).attr('id', replacer ).attr('name', replacer );
649
- });
650
- $('.option-tree-google-font-variants', $clone).each( function() {
651
- $(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
652
- });
653
- $('.option-tree-google-font-subsets', $clone).each( function() {
654
- $(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
655
- });
656
- $el_clone.before($clone)
657
- event.preventDefault()
658
- });
659
- $('.js-remove-google-font').on('click', function (event) {
660
- $(this).parents('.type-google-font-group').remove();
661
- event.preventDefault();
662
- });
663
- },
664
- bind_colorpicker: function(field_id) {
665
- $('#'+field_id).wpColorPicker({
666
- change: function() {
667
- OT_UI.parse_condition();
668
- },
669
- clear: function() {
670
- OT_UI.parse_condition();
671
- }
672
- });
673
- },
674
- bind_date_picker: function(field_id, date_format) {
675
- $('#'+field_id).datepicker({
676
- showOtherMonths: true,
677
- showButtonPanel: true,
678
- currentText: option_tree.date_current,
679
- closeText: option_tree.date_close,
680
- dateFormat: date_format
681
- });
682
- },
683
- bind_date_time_picker: function(field_id, date_format) {
684
- $('#'+field_id).datetimepicker({
685
- showOtherMonths: true,
686
- closeText: option_tree.date_close,
687
- dateFormat: date_format
688
- });
689
- },
690
- fix_upload_parent: function() {
691
- $('.option-tree-ui-upload-input').not('.ot-upload-attachment-id').on('focus blur', function(){
692
- $(this).parent('.option-tree-ui-upload-parent').toggleClass('focus');
693
- OT_UI.init_upload_fix(this);
694
- });
695
- },
696
- remove_image: function(e) {
697
- $(e).parent().parent().find('.option-tree-ui-upload-input').attr('value','');
698
- $(e).parent('.option-tree-ui-media-wrap').remove();
699
- },
700
- fix_textarea: function() {
701
- $('.wp-editor-area').focus( function(){
702
- $(this).parent('div').css({borderColor:'#bbb'});
703
- }).blur( function(){
704
- $(this).parent('div').css({borderColor:'#ccc'});
705
- });
706
- },
707
- replicate_ajax: function() {
708
- if (location.href.indexOf("#") != -1) {
709
- var url = $("input[name=\'_wp_http_referer\']").val(),
710
- hash = location.href.substr(location.href.indexOf("#"));
711
- $("input[name=\'_wp_http_referer\']").val( url + hash );
712
- this.scroll_to_top();
713
- }
714
- setTimeout( function() {
715
- $(".wrap.settings-wrap .fade").fadeOut("fast");
716
- }, 3000 );
717
- },
718
- reset_settings: function() {
719
- $(document).on("click", ".reset-settings", function(event){
720
- var agree = confirm(option_tree.reset_agree);
721
- if (agree) {
722
- return true;
723
- } else {
724
- return false;
725
- }
726
- event.preventDefault();
727
- });
728
- },
729
- css_editor_mode: function() {
730
- $('.ot-css-editor').each(function() {
731
- var editor = ace.edit($(this).attr('id'));
732
- var this_textarea = $('#textarea_' + $(this).attr('id'));
733
- editor.setTheme("ace/theme/chrome");
734
- editor.getSession().setMode("ace/mode/css");
735
- editor.setShowPrintMargin( false );
736
-
737
- editor.getSession().setValue(this_textarea.val());
738
- editor.getSession().on('change', function(){
739
- this_textarea.val(editor.getSession().getValue());
740
- });
741
- this_textarea.on('change', function(){
742
- editor.getSession().setValue(this_textarea.val());
743
- });
744
- });
745
- },
746
- javascript_editor_mode: function() {
747
- $('.ot-javascript-editor').each(function() {
748
- var editor = ace.edit($(this).attr('id'));
749
- var this_textarea = $('#textarea_' + $(this).attr('id'));
750
- editor.setTheme("ace/theme/chrome");
751
- editor.getSession().setMode("ace/mode/javascript");
752
- editor.setShowPrintMargin( false );
753
-
754
- editor.getSession().setValue(this_textarea.val());
755
- editor.getSession().on('change', function(){
756
- this_textarea.val(editor.getSession().getValue());
757
- });
758
- this_textarea.on('change', function(){
759
- editor.getSession().setValue(this_textarea.val());
760
- });
761
- });
762
- },
763
- load_editors: function() {
764
- OT_UI.css_editor_mode();
765
- OT_UI.javascript_editor_mode();
766
- },
767
- url_exists: function(url) {
768
- var link = document.createElement('a')
769
- link.href = url
770
- if ( link.hostname != window.location.hostname ) {
771
- return true; // Stop the code from checking across domains.
772
- }
773
- var http = new XMLHttpRequest();
774
- http.open('HEAD', url, false);
775
- http.send();
776
- return http.status!=404;
777
- },
778
- scroll_to_top: function() {
779
- setTimeout( function() {
780
- $(this).scrollTop(0);
781
- }, 50 );
782
- }
783
- };
784
- $(document).ready( function() {
785
- OT_UI.init();
786
- });
787
- })(jQuery);
788
-
789
- /* Gallery */
790
- !function ($) {
791
-
792
- ot_gallery = {
793
-
794
- frame: function (elm) {
795
-
796
- var selection = this.select(elm)
797
-
798
- this._frame = wp.media({
799
- id: 'ot-gallery-frame'
800
- , frame: 'post'
801
- , state: 'gallery-edit'
802
- , title: wp.media.view.l10n.editGalleryTitle
803
- , editing: true
804
- , multiple: true
805
- , selection: selection
806
- })
807
-
808
- this._frame.on('update', function () {
809
- var controller = ot_gallery._frame.states.get('gallery-edit')
810
- , library = controller.get('library')
811
- , ids = library.pluck('id')
812
- , parent = $(elm).parents('.format-setting-inner')
813
- , input = parent.children('.ot-gallery-value')
814
- , shortcode = wp.media.gallery.shortcode( selection ).string().replace(/\"/g,"'")
815
-
816
- input.attr('value', ids)
817
-
818
- if ( parent.children('.ot-gallery-list').length <= 0 )
819
- input.after('<ul class="ot-gallery-list" />')
820
-
821
- $.ajax({
822
- type: 'POST',
823
- url: ajaxurl,
824
- dataType: 'html',
825
- data: {
826
- action: 'gallery_update'
827
- , ids: ids
828
- },
829
- success: function(res) {
830
- parent.children('.ot-gallery-list').html(res);
831
- if ( input.hasClass('ot-gallery-shortcode') ) {
832
- input.val(shortcode);
833
- }
834
- if ( $(elm).parent().children('.ot-gallery-delete').length <= 0 ) {
835
- $(elm).parent().append('<a href="#" class="option-tree-ui-button button button-secondary hug-left ot-gallery-delete">' + option_tree.delete + '</a>');
836
- }
837
- $(elm).text(option_tree.edit);
838
- OT_UI.parse_condition();
839
- }
840
- })
841
- })
842
-
843
- return this._frame
844
-
845
- }
846
-
847
- , select: function (elm) {
848
- var input = $(elm).parents('.format-setting-inner').children('.ot-gallery-value')
849
- , ids = input.attr('value')
850
- , _shortcode = input.hasClass('ot-gallery-shortcode') ? ids : '[gallery ids=\'' + ids + '\]'
851
- , shortcode = wp.shortcode.next('gallery', ( ids ? _shortcode : wp.media.view.settings.ot_gallery.shortcode ) )
852
- , defaultPostId = wp.media.gallery.defaults.id
853
- , attachments
854
- , selection
855
-
856
- // Bail if we didn't match the shortcode or all of the content.
857
- if ( ! shortcode )
858
- return
859
-
860
- // Ignore the rest of the match object.
861
- shortcode = shortcode.shortcode
862
-
863
- if ( _.isUndefined( shortcode.get('id') ) && ! _.isUndefined( defaultPostId ) )
864
- shortcode.set( 'id', defaultPostId )
865
-
866
- if ( _.isUndefined( shortcode.get('ids') ) && ! input.hasClass('ot-gallery-shortcode') && ids )
867
- shortcode.set( 'ids', ids )
868
-
869
- if ( _.isUndefined( shortcode.get('ids') ) )
870
- shortcode.set( 'ids', '0' )
871
-
872
- attachments = wp.media.gallery.attachments( shortcode )
873
-
874
- selection = new wp.media.model.Selection( attachments.models, {
875
- props: attachments.props.toJSON()
876
- , multiple: true
877
- })
878
-
879
- selection.gallery = attachments.gallery
880
-
881
- // Fetch the query's attachments, and then break ties from the query to allow for sorting.
882
- selection.more().done( function () {
883
- selection.props.set({ query: false })
884
- selection.unmirror()
885
- selection.props.unset('orderby')
886
- })
887
-
888
- return selection
889
-
890
- }
891
-
892
- , open: function (elm) {
893
-
894
- ot_gallery.frame(elm).open()
895
-
896
- }
897
-
898
- , remove: function (elm) {
899
-
900
- if ( confirm( option_tree.confirm ) ) {
901
-
902
- $(elm).parents('.format-setting-inner').children('.ot-gallery-value').attr('value', '');
903
- $(elm).parents('.format-setting-inner').children('.ot-gallery-list').remove();
904
- $(elm).next('.ot-gallery-edit').text( option_tree.create );
905
- $(elm).remove();
906
- OT_UI.parse_condition();
907
-
908
- }
909
-
910
- }
911
-
912
- }
913
-
914
- // Gallery delete
915
- $(document).on('click.ot_gallery.data-api', '.ot-gallery-delete', function (e) {
916
- e.preventDefault()
917
- ot_gallery.remove($(this))
918
- })
919
-
920
- // Gallery edit
921
- $(document).on('click.ot_gallery.data-api', '.ot-gallery-edit', function (e) {
922
- e.preventDefault()
923
- ot_gallery.open($(this))
924
- })
925
-
926
- }(window.jQuery);
927
-
928
- /*!
929
- * Adds metabox tabs
930
- */
931
- !function ($) {
932
-
933
- $(document).on('ready', function () {
934
-
935
- // Loop over the metaboxes
936
- $('.ot-metabox-wrapper').each( function() {
937
-
938
- // Only if there is a tab option
939
- if ( $(this).find('.type-tab').length ) {
940
-
941
- // Add .ot-metabox-panels
942
- $(this).find('.type-tab').parents('.ot-metabox-wrapper').wrapInner('<div class="ot-metabox-panels" />')
943
-
944
- // Wrapp with .ot-metabox-tabs & add .ot-metabox-nav before .ot-metabox-panels
945
- $(this).find('.ot-metabox-panels').wrap('<div class="ot-metabox-tabs" />').before('<ul class="ot-metabox-nav" />')
946
-
947
- // Loop over settings and build the tabs nav
948
- $(this).find('.format-settings').each( function() {
949
-
950
- if ( $(this).find('.type-tab').length > 0 ) {
951
- var title = $(this).find('.type-tab').prev().find('label').text()
952
- , id = $(this).attr('id')
953
-
954
- // Add a class, hide & append nav item
955
- $(this).addClass('is-panel').hide()
956
- $(this).parents('.ot-metabox-panels').prev('.ot-metabox-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
957
-
958
- }
959
-
960
- })
961
-
962
- // Loop over the panels and wrap and ID them.
963
- $(this).find('.is-panel').each( function() {
964
- var id = $(this).attr('id')
965
-
966
- $(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
967
-
968
- })
969
-
970
- // Create the tabs
971
- $(this).find('.ot-metabox-tabs').tabs({
972
- activate: function( event, ui ) {
973
- var parent = $(this).outerHeight(),
974
- child = $(this).find('.ot-metabox-panels').outerHeight() + 8,
975
- minHeight = parent - 34
976
- if ( $(this).find('.ot-metabox-panels').css('padding') == '12px' && child < parent ) {
977
- $(this).find('.ot-metabox-panels').css({ minHeight: minHeight })
978
- }
979
- OT_UI.load_editors();
980
- }
981
- })
982
-
983
- // Move the orphaned settings to the top
984
- $(this).find('.ot-metabox-panels > .format-settings').prependTo($(this))
985
-
986
- // Remove a bunch of classes to stop style conflicts.
987
- $(this).find('.ot-metabox-tabs').removeClass('ui-widget ui-widget-content ui-corner-all')
988
- $(this).find('.ot-metabox-nav').removeClass('ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all')
989
- $(this).find('.ot-metabox-nav li').removeClass('ui-state-default ui-corner-top ui-tabs-active ui-tabs-active')
990
- $(this).find('.ot-metabox-nav li').on('mouseenter mouseleave', function() { $(this).removeClass('ui-state-hover') })
991
-
992
- }
993
-
994
- })
995
-
996
- })
997
-
998
- }(window.jQuery);
999
-
1000
- /*!
1001
- * Adds theme option tabs
1002
- */
1003
- !function ($) {
1004
-
1005
- $(document).on('ready', function () {
1006
-
1007
- // Loop over the theme options
1008
- $('#option-tree-settings-api .inside').each( function() {
1009
-
1010
- // Only if there is a tab option
1011
- if ( $(this).find('.type-tab').length ) {
1012
-
1013
- // Add .ot-theme-option-panels
1014
- $(this).find('.type-tab').parents('.inside').wrapInner('<div class="ot-theme-option-panels" />')
1015
-
1016
- // Wrap with .ot-theme-option-tabs & add .ot-theme-option-nav before .ot-theme-option-panels
1017
- $(this).find('.ot-theme-option-panels').wrap('<div class="ot-theme-option-tabs" />').before('<ul class="ot-theme-option-nav" />')
1018
-
1019
- // Loop over settings and build the tabs nav
1020
- $(this).find('.format-settings').each( function() {
1021
-
1022
- if ( $(this).find('.type-tab').length > 0 ) {
1023
- var title = $(this).find('.type-tab').prev().find('.label').text()
1024
- , id = $(this).attr('id')
1025
-
1026
- // Add a class, hide & append nav item
1027
- $(this).addClass('is-panel').hide()
1028
- $(this).parents('.ot-theme-option-panels').prev('.ot-theme-option-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
1029
-
1030
- } else {
1031
-
1032
- }
1033
-
1034
- })
1035
-
1036
- // Loop over the panels and wrap and ID them.
1037
- $(this).find('.is-panel').each( function() {
1038
- var id = $(this).attr('id')
1039
-
1040
- $(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
1041
-
1042
- })
1043
-
1044
- // Create the tabs
1045
- $(this).find('.ot-theme-option-tabs').tabs({
1046
- activate: function( event, ui ) {
1047
- OT_UI.load_editors();
1048
- }
1049
- })
1050
-
1051
- // Move the orphaned settings to the top
1052
- $(this).find('.ot-theme-option-panels > .format-settings').prependTo($(this).find('.ot-theme-option-tabs'))
1053
-
1054
- }
1055
-
1056
- })
1057
-
1058
- })
1059
-
1060
- }(window.jQuery);
1061
-
1062
- /*!
1063
- * Fixes the state of metabox radio buttons after a Drag & Drop event.
1064
- */
1065
- !function ($) {
1066
-
1067
- $(document).on('ready', function () {
1068
-
1069
- // detect mousedown and store all checked radio buttons
1070
- $('.hndle').on('mousedown', function () {
1071
-
1072
- // get parent element of .hndle selected.
1073
- // We only need to monitor radios insde the object that is being moved.
1074
- var parent_id = $(this).closest('div').attr('id')
1075
-
1076
- // set live event listener for mouse up on the content .wrap
1077
- // then give the dragged div time to settle before firing the reclick function
1078
- $('.wrap').on('mouseup', function () {
1079
-
1080
- var ot_checked_radios = {}
1081
-
1082
- // loop over all checked radio buttons inside of parent element
1083
- $('#' + parent_id + ' input[type="radio"]').each( function () {
1084
-
1085
- // stores checked radio buttons
1086
- if ( $(this).is(':checked') ) {
1087
-
1088
- ot_checked_radios[$(this).attr('name')] = $(this).val()
1089
-
1090
- }
1091
-
1092
- // write to the object
1093
- $(document).data('ot_checked_radios', ot_checked_radios)
1094
-
1095
- })
1096
-
1097
- // restore all checked radio buttons
1098
- setTimeout( function () {
1099
-
1100
- // get object of checked radio button names and values
1101
- var checked = $(document).data('ot_checked_radios')
1102
-
1103
- // step thru each object element and trigger a click on it's corresponding radio button
1104
- for ( key in checked ) {
1105
-
1106
- $('input[name="' + key + '"]').filter('[value="' + checked[key] + '"]').trigger('click')
1107
-
1108
- }
1109
-
1110
- $('.wrap').unbind('mouseup')
1111
-
1112
- }, 50 )
1113
-
1114
- })
1115
-
1116
- })
1117
-
1118
- })
1119
-
1120
- }(window.jQuery);
1121
-
1122
- /*!
1123
- * Adds opacity to the default colorpicker
1124
- *
1125
- * Derivative work of the Codestar WP Color Picker.
1126
- */
1127
- ;(function ( $, window, document, undefined ) {
1128
- 'use strict';
1129
-
1130
- // adding alpha support for Automattic Color.js toString function.
1131
- if( typeof Color.fn.toString !== undefined ) {
1132
-
1133
- Color.fn.toString = function () {
1134
-
1135
- // check for alpha
1136
- if ( this._alpha < 1 ) {
1137
- return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');
1138
- }
1139
-
1140
- var hex = parseInt( this._color, 10 ).toString( 16 );
1141
-
1142
- if ( this.error ) { return ''; }
1143
-
1144
- // maybe left pad it
1145
- if ( hex.length < 6 ) {
1146
- for (var i = 6 - hex.length - 1; i >= 0; i--) {
1147
- hex = '0' + hex;
1148
- }
1149
- }
1150
-
1151
- return '#' + hex;
1152
-
1153
- };
1154
-
1155
- }
1156
-
1157
- $.ot_ParseColorValue = function( val ) {
1158
-
1159
- var value = val.replace(/\s+/g, ''),
1160
- alpha = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,
1161
- rgba = ( alpha < 100 ) ? true : false;
1162
-
1163
- return { value: value, alpha: alpha, rgba: rgba };
1164
-
1165
- };
1166
-
1167
- $.fn.ot_wpColorPicker = function() {
1168
-
1169
- return this.each(function() {
1170
-
1171
- var $this = $(this);
1172
-
1173
- // check for rgba enabled/disable
1174
- if( $this.data('rgba') !== false ) {
1175
-
1176
- // parse value
1177
- var picker = $.ot_ParseColorValue( $this.val() );
1178
-
1179
- // wpColorPicker core
1180
- $this.wpColorPicker({
1181
-
1182
- // wpColorPicker: change
1183
- change: function( event, ui ) {
1184
-
1185
- // update checkerboard background color
1186
- $this.closest('.wp-picker-container').find('.option-tree-opacity-slider-offset').css('background-color', ui.color.toString());
1187
- $this.trigger('keyup');
1188
-
1189
- },
1190
-
1191
- // wpColorPicker: create
1192
- create: function( event, ui ) {
1193
-
1194
- // set variables for alpha slider
1195
- var a8cIris = $this.data('a8cIris'),
1196
- $container = $this.closest('.wp-picker-container'),
1197
-
1198
- // appending alpha wrapper
1199
- $alpha_wrap = $('<div class="option-tree-opacity-wrap">' +
1200
- '<div class="option-tree-opacity-slider"></div>' +
1201
- '<div class="option-tree-opacity-slider-offset"></div>' +
1202
- '<div class="option-tree-opacity-text"></div>' +
1203
- '</div>').appendTo( $container.find('.wp-picker-holder') ),
1204
-
1205
- $alpha_slider = $alpha_wrap.find('.option-tree-opacity-slider'),
1206
- $alpha_text = $alpha_wrap.find('.option-tree-opacity-text'),
1207
- $alpha_offset = $alpha_wrap.find('.option-tree-opacity-slider-offset');
1208
-
1209
- // alpha slider
1210
- $alpha_slider.slider({
1211
-
1212
- // slider: slide
1213
- slide: function( event, ui ) {
1214
-
1215
- var slide_value = parseFloat( ui.value / 100 );
1216
-
1217
- // update iris data alpha && wpColorPicker color option && alpha text
1218
- a8cIris._color._alpha = slide_value;
1219
- $this.wpColorPicker( 'color', a8cIris._color.toString() );
1220
- $alpha_text.text( ( slide_value < 1 ? slide_value : '' ) );
1221
-
1222
- },
1223
-
1224
- // slider: create
1225
- create: function() {
1226
-
1227
- var slide_value = parseFloat( picker.alpha / 100 ),
1228
- alpha_text_value = slide_value < 1 ? slide_value : '';
1229
-
1230
- // update alpha text && checkerboard background color
1231
- $alpha_text.text(alpha_text_value);
1232
- $alpha_offset.css('background-color', picker.value);
1233
-
1234
- // wpColorPicker clear button for update iris data alpha && alpha text && slider color option
1235
- $container.on('click', '.wp-picker-clear', function() {
1236
-
1237
- a8cIris._color._alpha = 1;
1238
- $alpha_text.text('');
1239
- $alpha_slider.slider('option', 'value', 100).trigger('slide');
1240
-
1241
- });
1242
-
1243
- // wpColorPicker default button for update iris data alpha && alpha text && slider color option
1244
- $container.on('click', '.wp-picker-default', function() {
1245
-
1246
- var default_picker = $.ot_ParseColorValue( $this.data('default-color') ),
1247
- default_value = parseFloat( default_picker.alpha / 100 ),
1248
- default_text = default_value < 1 ? default_value : '';
1249
-
1250
- a8cIris._color._alpha = default_value;
1251
- $alpha_text.text(default_text);
1252
- $alpha_slider.slider('option', 'value', default_picker.alpha).trigger('slide');
1253
-
1254
- });
1255
-
1256
- // show alpha wrapper on click color picker button
1257
- $container.on('click', '.wp-color-result', function() {
1258
- $alpha_wrap.toggle();
1259
- });
1260
-
1261
- // hide alpha wrapper on click body
1262
- $('body').on( 'click.wpcolorpicker', function() {
1263
- $alpha_wrap.hide();
1264
- });
1265
-
1266
- },
1267
-
1268
- // slider: options
1269
- value: picker.alpha,
1270
- step: 1,
1271
- min: 1,
1272
- max: 100
1273
-
1274
- });
1275
- }
1276
-
1277
- });
1278
-
1279
- } else {
1280
-
1281
- // wpColorPicker default picker
1282
- $this.wpColorPicker({
1283
- change: function() {
1284
- $this.trigger('keyup');
1285
- }
1286
- });
1287
-
1288
- }
1289
-
1290
- });
1291
-
1292
- };
1293
-
1294
- $(document).ready( function(){
1295
- $('.hide-color-picker.ot-colorpicker-opacity').ot_wpColorPicker();
1296
-
1297
-
1298
- function ot_fix_dialog_close(event, ui) {
1299
- jQuery('.ui-widget-overlay').bind('click', function(){
1300
- jQuery('#' + event.target.id).dialog('close');
1301
- });
1302
- } // ot_fix_dialog_close
1303
-
1304
- $('#page-niftycs_options').on('click', '.change_tab', function(e) {
1305
- e.preventDefault();
1306
-
1307
- $(".wrap.settings-wrap .ui-tabs").tabs('option', 'active', $(this).data('tab'));
1308
-
1309
- // get the link anchor and scroll to it
1310
- var target = this.href.split('#')[1];
1311
- if (target) {
1312
- jQuery.scrollTo('#' + target, 500, {offset: {top:-100, left:0}});
1313
- }
1314
-
1315
- return false;
1316
- });
1317
-
1318
-
1319
-
1320
-
1321
- });
1322
-
1323
-
1324
-
1325
-
1326
- })( jQuery, window, document );
1327
-
1328
-
1329
- /**
1330
- * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
1331
- * Licensed under MIT
1332
- * @author Ariel Flesler
1333
- * @version 2.1.2
1334
- */
1335
- ;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
1
+ /**
2
+ * Option Tree UI
3
+ *
4
+ * Dependencies: jQuery, jQuery UI, ColorPicker
5
+ *
6
+ * @author Derek Herman (derek@valendesigns.com)
7
+ */
8
+ ;(function($) {
9
+ OT_UI = {
10
+ processing: false,
11
+ init: function() {
12
+ this.init_hide_body();
13
+ this.init_sortable();
14
+ this.init_add();
15
+ this.init_edit();
16
+ this.init_remove();
17
+ this.init_edit_title();
18
+ this.init_edit_id();
19
+ this.init_activate_layout();
20
+ this.init_conditions();
21
+ this.init_upload();
22
+ this.init_upload_remove();
23
+ this.init_numeric_slider();
24
+ this.init_tabs();
25
+ this.init_radio_image_select();
26
+ this.init_select_wrapper();
27
+ this.bind_select_wrapper();
28
+ this.init_google_fonts();
29
+ this.fix_upload_parent();
30
+ this.fix_textarea();
31
+ this.replicate_ajax();
32
+ this.reset_settings();
33
+ this.css_editor_mode();
34
+ this.javascript_editor_mode();
35
+ },
36
+ init_hide_body: function(elm,type) {
37
+ var css = '.option-tree-setting-body';
38
+ if ( type == 'parent' ) {
39
+ $(css).not( elm.parent().parent().children(css) ).hide();
40
+ } else if ( type == 'child' ) {
41
+ elm.closest('ul').find(css).not( elm.parent().parent().children(css) ).hide();
42
+ } else if ( type == 'child-add' ) {
43
+ elm.children().find(css).hide();
44
+ } else if ( type == 'toggle' ) {
45
+ elm.parent().parent().children(css).toggle();
46
+ } else {
47
+ $(css).hide();
48
+ }
49
+ },
50
+ init_remove_active: function(elm,type) {
51
+ var css = '.option-tree-setting-edit';
52
+ if ( type == 'parent' ) {
53
+ $(css).not(elm).removeClass('active');
54
+ } else if ( type == 'child' ) {
55
+ elm.closest('ul').find(css).not(elm).removeClass('active');
56
+ } else if ( type == 'child-add' ) {
57
+ elm.children().find(css).removeClass('active');
58
+ } else {
59
+ $(css).removeClass('active');
60
+ }
61
+ },
62
+ init_sortable: function(scope) {
63
+ scope = scope || document;
64
+ $('.option-tree-sortable', scope).each( function() {
65
+ if ( $(this).children('li').length ) {
66
+ var elm = $(this);
67
+ elm.show();
68
+ elm.sortable({
69
+ items: 'li:not(.ui-state-disabled)',
70
+ handle: 'div.open',
71
+ placeholder: 'ui-state-highlight',
72
+ start: function (event, ui) {
73
+ ui.placeholder.height(ui.item.height()-2);
74
+ },
75
+ stop: function(evt, ui) {
76
+ setTimeout(
77
+ function(){
78
+ OT_UI.update_ids(elm);
79
+ },
80
+ 200
81
+ )
82
+ }
83
+ });
84
+ }
85
+ });
86
+ },
87
+ init_add: function() {
88
+ $(document).on('click', '.option-tree-section-add', function(e) {
89
+ e.preventDefault();
90
+ OT_UI.add(this,'section');
91
+ });
92
+ $(document).on('click', '.option-tree-setting-add', function(e) {
93
+ e.preventDefault();
94
+ OT_UI.add(this,'setting');
95
+ });
96
+ $(document).on('click', '.option-tree-help-add', function(e) {
97
+ e.preventDefault();
98
+ OT_UI.add(this,'the_contextual_help');
99
+ });
100
+ $(document).on('click', '.option-tree-choice-add', function(e) {
101
+ e.preventDefault();
102
+ OT_UI.add(this,'choice');
103
+ });
104
+ $(document).on('click', '.option-tree-list-item-add', function(e) {
105
+ e.preventDefault();
106
+ OT_UI.add(this,'list_item');
107
+ });
108
+ $(document).on('click', '.option-tree-social-links-add', function(e) {
109
+ e.preventDefault();
110
+ OT_UI.add(this,'social_links');
111
+ });
112
+ $(document).on('click', '.option-tree-list-item-setting-add', function(e) {
113
+ e.preventDefault();
114
+ if ( $(this).parents('ul').parents('ul').hasClass('ui-sortable') ) {
115
+ alert(option_tree.setting_limit);
116
+ return false;
117
+ }
118
+ OT_UI.add(this,'list_item_setting');
119
+ });
120
+ },
121
+ init_edit: function() {
122
+ $(document).on('click', '.option-tree-setting-edit', function(e) {
123
+ e.preventDefault();
124
+ if ( $(this).parents().hasClass('option-tree-setting-body') ) {
125
+ OT_UI.init_remove_active($(this),'child');
126
+ OT_UI.init_hide_body($(this),'child');
127
+ } else {
128
+ OT_UI.init_remove_active($(this),'parent');
129
+ OT_UI.init_hide_body($(this), 'parent');
130
+ }
131
+ $(this).toggleClass('active');
132
+ OT_UI.init_hide_body($(this), 'toggle');
133
+ });
134
+ },
135
+ init_remove: function() {
136
+ $(document).on('click', '.option-tree-setting-remove', function(event) {
137
+ event.preventDefault();
138
+ if ( $(this).parents('li').hasClass('ui-state-disabled') ) {
139
+ alert(option_tree.remove_no);
140
+ return false;
141
+ }
142
+ var agree = confirm(option_tree.remove_agree);
143
+ if (agree) {
144
+ var list = $(this).parents('ul');
145
+ OT_UI.remove(this);
146
+ setTimeout( function() {
147
+ OT_UI.update_ids(list);
148
+ }, 200 );
149
+ }
150
+ return false;
151
+ });
152
+ },
153
+ init_edit_title: function() {
154
+ $(document).on('keyup', '.option-tree-setting-title', function() {
155
+ OT_UI.edit_title(this);
156
+ });
157
+ // Automatically fill option IDs with clean versions of their respective option labels
158
+ $(document).on('blur', '.option-tree-setting-title', function() {
159
+ var optionId = $(this).parents('.option-tree-setting-body').find('[type="text"][name$="id]"]')
160
+ if ( optionId.val() === '' ) {
161
+ optionId.val($(this).val().replace(/[^a-z0-9]/gi,'_').toLowerCase());
162
+ }
163
+ });
164
+ },
165
+ init_edit_id: function() {
166
+ $(document).on('keyup', '.section-id', function(){
167
+ OT_UI.update_id(this);
168
+ });
169
+ },
170
+ init_activate_layout: function() {
171
+ $(document).on('click', '.option-tree-layout-activate', function() {
172
+ var active = $(this).parents('.option-tree-setting').find('.open').text();
173
+ $('.option-tree-layout-activate').removeClass('active');
174
+ $(this).toggleClass('active');
175
+ $('.active-layout-input').attr({'value':active});
176
+ });
177
+ $(document).on('change', '#option-tree-options-layouts-form select', function() {
178
+ var agree = confirm(option_tree.activate_layout_agree);
179
+ if (agree) {
180
+ $('#option-tree-options-layouts-form').submit();
181
+ } else {
182
+ var active = $('#the_current_layout').attr('value');
183
+ $('#option-tree-options-layouts-form select option[value="' + active + '"]').attr({'selected':'selected'});
184
+ $('#option-tree-options-layouts-form select').prev('span').replaceWith('<span>' + active + '</span>');
185
+ }
186
+ });
187
+ },
188
+ add: function(elm,type) {
189
+ var self = this,
190
+ list = '',
191
+ list_class = '',
192
+ name = '',
193
+ post_id = 0,
194
+ get_option = '',
195
+ settings = '';
196
+ if ( type == 'the_contextual_help' ) {
197
+ list = $(elm).parent().find('ul:last');
198
+ list_class = 'list-contextual-help';
199
+ } else if ( type == 'choice' ) {
200
+ list = $(elm).parent().children('ul');
201
+ list_class = 'list-choice';
202
+ } else if ( type == 'list_item' ) {
203
+ list = $(elm).parent().children('ul');
204
+ list_class = 'list-sub-setting';
205
+ } else if ( type == 'list_item_setting' ) {
206
+ list = $(elm).parent().children('ul');
207
+ list_class = 'list-sub-setting';
208
+ } else if ( type == 'social_links' ) {
209
+ list = $(elm).parent().children('ul');
210
+ list_class = 'list-sub-setting';
211
+ } else {
212
+ list = $(elm).parent().find('ul:first');
213
+ list_class = ( type == 'section' ) ? 'list-section' : 'list-setting';
214
+ }
215
+ name = list.data('name');
216
+ post_id = list.data('id');
217
+ get_option = list.data('getOption');
218
+ settings = $('#'+name+'_settings_array').val();
219
+ if ( this.processing === false ) {
220
+ this.processing = true;
221
+ var count = parseInt(list.children('li').length);
222
+ if ( type == 'list_item' || type == 'social_links' ) {
223
+ list.find('li input.option-tree-setting-title', self).each(function(){
224
+ var setting = $(this).attr('name'),
225
+ regex = /\[([0-9]+)\]/,
226
+ matches = setting.match(regex),
227
+ id = null != matches ? parseInt(matches[1]) : 0;
228
+ id++;
229
+ if ( id > count) {
230
+ count = id;
231
+ }
232
+ });
233
+ }
234
+ $.ajax({
235
+ url: option_tree.ajax,
236
+ type: 'post',
237
+ data: {
238
+ action: 'add_' + type,
239
+ count: count,
240
+ name: name,
241
+ post_id: post_id,
242
+ get_option: get_option,
243
+ settings: settings,
244
+ type: type,
245
+ nonce: option_tree.nonce
246
+ },
247
+ complete: function( data ) {
248
+ if ( type == 'choice' || type == 'list_item_setting' ) {
249
+ OT_UI.init_remove_active(list,'child-add');
250
+ OT_UI.init_hide_body(list,'child-add');
251
+ } else {
252
+ OT_UI.init_remove_active();
253
+ OT_UI.init_hide_body();
254
+ }
255
+ var listItem = $('<li class="ui-state-default ' + list_class + '">' + data.responseText + '</li>');
256
+ list.append(listItem);
257
+ list.children().last().find('.option-tree-setting-edit').toggleClass('active');
258
+ list.children().last().find('.option-tree-setting-body').toggle();
259
+ list.children().last().find('.option-tree-setting-title').focus();
260
+ if ( type != 'the_contextual_help' ) {
261
+ OT_UI.update_ids(list);
262
+ }
263
+ OT_UI.init_sortable(listItem);
264
+ OT_UI.init_select_wrapper(listItem);
265
+ OT_UI.init_numeric_slider(listItem);
266
+ OT_UI.parse_condition();
267
+ self.processing = false;
268
+ }
269
+ });
270
+ }
271
+ },
272
+ remove: function(e) {
273
+ $(e).parent().parent().parent('li').remove();
274
+ },
275
+ edit_title: function(e) {
276
+ if ( this.timer ) {
277
+ clearTimeout(e.timer);
278
+ }
279
+ this.timer = setTimeout( function() {
280
+ $(e).parent().parent().parent().parent().parent().children('.open').text(e.value);
281
+ }, 100);
282
+ return true;
283
+ },
284
+ update_id: function(e) {
285
+ if ( this.timer ) {
286
+ clearTimeout(e.timer);
287
+ }
288
+ this.timer = setTimeout( function() {
289
+ OT_UI.update_ids($(e).parents('ul'));
290
+ }, 100);
291
+ return true;
292
+ },
293
+ update_ids: function(list) {
294
+ var last_section, section, list_items = list.children('li');
295
+ list_items.each(function(index) {
296
+ if ( $(this).hasClass('list-section') ) {
297
+ section = $(this).find('.section-id').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
298
+ if (!section) {
299
+ section = $(this).find('.section-title').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
300
+ }
301
+ if (!section) {
302
+ section = last_section;
303
+ }
304
+ }
305
+ if ($(this).hasClass('list-setting') ) {
306
+ $(this).find('.hidden-section').attr({'value':section});
307
+ }
308
+ last_section = section;
309
+ });
310
+ },
311
+ condition_objects: function() {
312
+ return 'select, input[type="radio"]:checked, input[type="text"], input[type="hidden"], input.ot-numeric-slider-hidden-input';
313
+ },
314
+ match_conditions: function(condition) {
315
+ var match;
316
+ var regex = /(.+?):(is|not|contains|less_than|less_than_or_equal_to|greater_than|greater_than_or_equal_to)\((.*?)\),?/g;
317
+ var conditions = [];
318
+
319
+ while( match = regex.exec( condition ) ) {
320
+ conditions.push({
321
+ 'check': match[1],
322
+ 'rule': match[2],
323
+ 'value': match[3] || ''
324
+ });
325
+ }
326
+
327
+ return conditions;
328
+ },
329
+ parse_condition: function() {
330
+ $( '.format-settings[id^="setting_"][data-condition]' ).each(function() {
331
+
332
+ var passed;
333
+ var conditions = OT_UI.match_conditions( $( this ).data( 'condition' ) );
334
+ var operator = ( $( this ).data( 'operator' ) || 'and' ).toLowerCase();
335
+
336
+ $.each( conditions, function( index, condition ) {
337
+
338
+ var target = $( '#setting_' + condition.check );
339
+ var targetEl = !! target.length && target.find( OT_UI.condition_objects() ).first();
340
+
341
+ if ( ! target.length || ( ! targetEl.length && condition.value.toString() != '' ) ) {
342
+ return;
343
+ }
344
+
345
+ var v1 = targetEl.length ? targetEl.val().toString() : '';
346
+ var v2 = condition.value.toString();
347
+ var result;
348
+
349
+ switch ( condition.rule ) {
350
+ case 'less_than':
351
+ result = ( parseInt( v1 ) < parseInt( v2 ) );
352
+ break;
353
+ case 'less_than_or_equal_to':
354
+ result = ( parseInt( v1 ) <= parseInt( v2 ) );
355
+ break;
356
+ case 'greater_than':
357
+ result = ( parseInt( v1 ) > parseInt( v2 ) );
358
+ break;
359
+ case 'greater_than_or_equal_to':
360
+ result = ( parseInt( v1 ) >= parseInt( v2 ) );
361
+ break;
362
+ case 'contains':
363
+ result = ( v1.indexOf(v2) !== -1 ? true : false );
364
+ break;
365
+ case 'is':
366
+ result = ( v1 == v2 );
367
+ break;
368
+ case 'not':
369
+ result = ( v1 != v2 );
370
+ break;
371
+ }
372
+
373
+ if ( 'undefined' == typeof passed ) {
374
+ passed = result;
375
+ }
376
+
377
+ switch ( operator ) {
378
+ case 'or':
379
+ passed = ( passed || result );
380
+ break;
381
+ case 'and':
382
+ default:
383
+ passed = ( passed && result );
384
+ break;
385
+ }
386
+
387
+ });
388
+
389
+ if ( passed ) {
390
+ $(this).animate({opacity: 'show' , height: 'show'}, 200);
391
+ } else {
392
+ $(this).animate({opacity: 'hide' , height: 'hide'}, 200);
393
+ }
394
+
395
+ delete passed;
396
+
397
+ });
398
+ },
399
+ init_conditions: function() {
400
+ var delay = (function() {
401
+ var timer = 0;
402
+ return function(callback, ms) {
403
+ clearTimeout(timer);
404
+ timer = setTimeout(callback, ms);
405
+ };
406
+ })();
407
+
408
+ $('.format-settings[id^="setting_"]').on( 'change.conditionals, keyup.conditionals', OT_UI.condition_objects(), function(e) {
409
+ if (e.type === 'keyup') {
410
+ // handle keyup event only once every 500ms
411
+ delay(function() {
412
+ OT_UI.parse_condition();
413
+ }, 500);
414
+ } else {
415
+ OT_UI.parse_condition();
416
+ }
417
+ OT_UI.load_editors();
418
+ });
419
+ OT_UI.parse_condition();
420
+ },
421
+ init_upload: function() {
422
+ $(document).on('click', '.ot_upload_media', function() {
423
+ var field_id = $(this).parent('.option-tree-ui-upload-parent').find('input').attr('id'),
424
+ post_id = $(this).attr('rel'),
425
+ save_attachment_id = $('#'+field_id).hasClass('ot-upload-attachment-id'),
426
+ btnContent = '';
427
+ if ( window.wp && wp.media ) {
428
+ window.ot_media_frame = window.ot_media_frame || new wp.media.view.MediaFrame.Select({
429
+ title: $(this).attr('title'),
430
+ button: {
431
+ text: option_tree.upload_text
432
+ },
433
+ multiple: false
434
+ });
435
+ window.ot_media_frame.on('select', function() {
436
+ var attachment = window.ot_media_frame.state().get('selection').first(),
437
+ href = attachment.attributes.url,
438
+ attachment_id = attachment.attributes.id,
439
+ mime = attachment.attributes.mime,
440
+ regex = /^image\/(?:jpe?g|png|gif|x-icon)$/i;
441
+ if ( mime.match(regex) ) {
442
+ btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
443
+ }
444
+ btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
445
+ $('#'+field_id).val( ( save_attachment_id ? attachment_id : href ) );
446
+ $('#'+field_id+'_media').remove();
447
+ $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
448
+ $('#'+field_id+'_media').append(btnContent).slideDown();
449
+ window.ot_media_frame.off('select');
450
+ }).open();
451
+ } else {
452
+ var backup = window.send_to_editor,
453
+ intval = window.setInterval(
454
+ function() {
455
+ if ( $('#TB_iframeContent').length > 0 && $('#TB_iframeContent').attr('src').indexOf( "&field_id=" ) !== -1 ) {
456
+ $('#TB_iframeContent').contents().find('#tab-type_url').hide();
457
+ }
458
+ $('#TB_iframeContent').contents().find('.savesend .button').val(option_tree.upload_text);
459
+ }, 50);
460
+ tb_show('', 'media-upload.php?post_id='+post_id+'&field_id='+field_id+'&type=image&TB_iframe=1');
461
+ window.send_to_editor = function(html) {
462
+ var href = $(html).find('img').attr('src');
463
+ if ( typeof href == 'undefined') {
464
+ href = $(html).attr('src');
465
+ }
466
+ if ( typeof href == 'undefined') {
467
+ href = $(html).attr('href');
468
+ }
469
+ var image = /\.(?:jpe?g|png|gif|ico)$/i;
470
+ if (href.match(image) && OT_UI.url_exists(href)) {
471
+ btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
472
+ }
473
+ btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
474
+ $('#'+field_id).val(href);
475
+ $('#'+field_id+'_media').remove();
476
+ $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
477
+ $('#'+field_id+'_media').append(btnContent).slideDown();
478
+ OT_UI.fix_upload_parent();
479
+ tb_remove();
480
+ window.clearInterval(intval);
481
+ window.send_to_editor = backup;
482
+ };
483
+ }
484
+ return false;
485
+ });
486
+ },
487
+ init_upload_remove: function() {
488
+ $(document).on('click', '.option-tree-ui-remove-media', function(event) {
489
+ event.preventDefault();
490
+ var agree = confirm(option_tree.remove_agree);
491
+ if (agree) {
492
+ OT_UI.remove_image(this);
493
+ return false;
494
+ }
495
+ return false;
496
+ });
497
+ },
498
+ init_upload_fix: function(elm) {
499
+ var id = $(elm).attr('id'),
500
+ val = $(elm).val(),
501
+ img = $(elm).parent().next('.option-tree-ui-media-wrap').find('img'),
502
+ src = img.attr('src'),
503
+ btnContent = '';
504
+ if ( val == src ) {
505
+ return;
506
+ }
507
+ if ( val != src ) {
508
+ img.attr('src', val);
509
+ }
510
+ if ( val !== '' && ( typeof src == 'undefined' || src == false ) && OT_UI.url_exists(val) ) {
511
+ var image = /\.(?:jpe?g|png|gif|ico)$/i;
512
+ if (val.match(image)) {
513
+ btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+val+'" alt="" /></div>';
514
+ }
515
+ btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle">'+option_tree.remove_media_text+'</span></a>';
516
+ $('#'+id).val(val);
517
+ $('#'+id+'_media').remove();
518
+ $('#'+id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+id+'_media" />');
519
+ $('#'+id+'_media').append(btnContent).slideDown();
520
+ } else if ( val == '' || ! OT_UI.url_exists(val) ) {
521
+ $(elm).parent().next('.option-tree-ui-media-wrap').remove();
522
+ }
523
+ },
524
+ init_numeric_slider: function(scope) {
525
+ scope = scope || document;
526
+ $(".ot-numeric-slider-wrap", scope).each(function() {
527
+ var hidden = $(".ot-numeric-slider-hidden-input", this),
528
+ value = hidden.val(),
529
+ helper = $(".ot-numeric-slider-helper-input", this);
530
+ if ( ! value ) {
531
+ value = hidden.data("min");
532
+ helper.val(value)
533
+ }
534
+ $(".ot-numeric-slider", this).slider({
535
+ min: hidden.data("min"),
536
+ max: hidden.data("max"),
537
+ step: hidden.data("step"),
538
+ value: value,
539
+ slide: function(event, ui) {
540
+ hidden.add(helper).val(ui.value).trigger('change');
541
+ },
542
+ create: function() {
543
+ hidden.val($(this).slider('value'));
544
+ },
545
+ change: function() {
546
+ OT_UI.parse_condition();
547
+ }
548
+ });
549
+ });
550
+ },
551
+ init_tabs: function() {
552
+ $(".wrap.settings-wrap .ui-tabs").tabs({
553
+ fx: {
554
+ opacity: "toggle",
555
+ duration: "fast"
556
+ },
557
+ activate: function(event, ui) {
558
+ localStorage.setItem('nifty-active-tab', $('.wrap.settings-wrap .ui-tabs').tabs('option', 'active'));
559
+ },
560
+ active: localStorage.getItem('nifty-active-tab'),
561
+ });
562
+
563
+ $(".wrap.settings-wrap .ui-tabs a.ui-tabs-anchor").on("click", function(event, ui) {
564
+ var obj = "input[name='_wp_http_referer']";
565
+ if ( $(obj).length > 0 ) {
566
+ var url = $(obj).val(),
567
+ hash = $(this).attr('href');
568
+ if ( url.indexOf("#") != -1 ) {
569
+ var o = url.split("#")[1],
570
+ n = hash.split("#")[1];
571
+ url = url.replace(o, n);
572
+ } else {
573
+ url = url + hash;
574
+ }
575
+ $(obj).val(url);
576
+ }
577
+ });
578
+ },
579
+ init_radio_image_select: function() {
580
+ $(document).on('click', '.option-tree-ui-radio-image', function() {
581
+ $(this).closest('.type-radio-image').find('.option-tree-ui-radio-image').removeClass('option-tree-ui-radio-image-selected');
582
+ $(this).toggleClass('option-tree-ui-radio-image-selected');
583
+ $(this).parent().find('.option-tree-ui-radio').prop('checked', true).trigger('change');
584
+ });
585
+ },
586
+ init_select_wrapper: function(scope) {
587
+ scope = scope || document;
588
+ $('.option-tree-ui-select', scope).each(function () {
589
+ if ( ! $(this).parent().hasClass('select-wrapper') ) {
590
+ $(this).wrap('<div class="select-wrapper" />');
591
+ $(this).parent('.select-wrapper').prepend('<span>' + $(this).find('option:selected').text() + '</span>');
592
+ }
593
+ });
594
+ },
595
+ bind_select_wrapper: function() {
596
+ $(document).on('change', '.option-tree-ui-select', function () {
597
+ $(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
598
+ });
599
+ },
600
+ init_google_fonts: function() {
601
+ var update_items = function(input, items, element) {
602
+ var itemsUI = input.closest('.type-google-font-group').find(element);
603
+ if ( itemsUI.length ) {
604
+ itemsUI.empty();
605
+ itemsUI.append($.map(items, function(item) {
606
+ var input = document.createElement('input'),
607
+ label = document.createElement('label');
608
+ input.type = 'checkbox';
609
+ input.id = ( itemsUI.data('field-id-prefix') || '' ) + item;
610
+ input.name = ( itemsUI.data('field-name') || '' ) + '[]';
611
+ input.value = item;
612
+ label.innerHTML = item;
613
+ $( label ).attr( 'for', input.id );
614
+ return $( document.createElement('p') ).addClass('checkbox-wrap').append([input, label]);
615
+ }));
616
+ }
617
+ };
618
+ $(document).on('change', '.option-tree-google-font-family select', function() {
619
+ var input = $(this);
620
+ $.ajax({
621
+ url: option_tree.ajax,
622
+ type: 'POST',
623
+ dataType: 'json',
624
+ data: {
625
+ action: 'ot_google_font',
626
+ family: input.val(),
627
+ field_id: input.attr('id')
628
+ }
629
+ }).done(function(response) {
630
+ if ( response.hasOwnProperty('variants') ) {
631
+ update_items( input, response.variants, '.option-tree-google-font-variants' );
632
+ }
633
+ if ( response.hasOwnProperty('subsets') ) {
634
+ update_items( input, response.subsets, '.option-tree-google-font-subsets' );
635
+ }
636
+ });
637
+ });
638
+ $('.js-add-google-font').on('click', function (event) {
639
+ var $group = $(this).parent('.format-setting-inner').find('.type-google-font-group'),
640
+ $el_clone = $(this).prev('.type-google-font-group-clone'),
641
+ $clone = $el_clone.clone(true),
642
+ $count = $group.length ? $group.length : 0;
643
+ $clone.attr('class', 'type-google-font-group');
644
+ var replacer = function(index, elm) {
645
+ return elm.replace('%key%', $count);
646
+ }
647
+ $('select', $clone).each( function() {
648
+ $(this).attr('id', replacer ).attr('name', replacer );
649
+ });
650
+ $('.option-tree-google-font-variants', $clone).each( function() {
651
+ $(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
652
+ });
653
+ $('.option-tree-google-font-subsets', $clone).each( function() {
654
+ $(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
655
+ });
656
+ $el_clone.before($clone)
657
+ event.preventDefault()
658
+ });
659
+ $('.js-remove-google-font').on('click', function (event) {
660
+ $(this).parents('.type-google-font-group').remove();
661
+ event.preventDefault();
662
+ });
663
+ },
664
+ bind_colorpicker: function(field_id) {
665
+ $('#'+field_id).wpColorPicker({
666
+ change: function() {
667
+ OT_UI.parse_condition();
668
+ },
669
+ clear: function() {
670
+ OT_UI.parse_condition();
671
+ }
672
+ });
673
+ },
674
+ bind_date_picker: function(field_id, date_format) {
675
+ $('#'+field_id).datepicker({
676
+ showOtherMonths: true,
677
+ showButtonPanel: true,
678
+ currentText: option_tree.date_current,
679
+ closeText: option_tree.date_close,
680
+ dateFormat: date_format
681
+ });
682
+ },
683
+ bind_date_time_picker: function(field_id, date_format) {
684
+ $('#'+field_id).datetimepicker({
685
+ showOtherMonths: true,
686
+ closeText: option_tree.date_close,
687
+ dateFormat: date_format
688
+ });
689
+ },
690
+ fix_upload_parent: function() {
691
+ $('.option-tree-ui-upload-input').not('.ot-upload-attachment-id').on('focus blur', function(){
692
+ $(this).parent('.option-tree-ui-upload-parent').toggleClass('focus');
693
+ OT_UI.init_upload_fix(this);
694
+ });
695
+ },
696
+ remove_image: function(e) {
697
+ $(e).parent().parent().find('.option-tree-ui-upload-input').attr('value','');
698
+ $(e).parent('.option-tree-ui-media-wrap').remove();
699
+ },
700
+ fix_textarea: function() {
701
+ $('.wp-editor-area').focus( function(){
702
+ $(this).parent('div').css({borderColor:'#bbb'});
703
+ }).blur( function(){
704
+ $(this).parent('div').css({borderColor:'#ccc'});
705
+ });
706
+ },
707
+ replicate_ajax: function() {
708
+ if (location.href.indexOf("#") != -1) {
709
+ var url = $("input[name=\'_wp_http_referer\']").val(),
710
+ hash = location.href.substr(location.href.indexOf("#"));
711
+ $("input[name=\'_wp_http_referer\']").val( url + hash );
712
+ this.scroll_to_top();
713
+ }
714
+ setTimeout( function() {
715
+ $(".wrap.settings-wrap .fade").fadeOut("fast");
716
+ }, 3000 );
717
+ },
718
+ reset_settings: function() {
719
+ $(document).on("click", ".reset-settings", function(event){
720
+ var agree = confirm(option_tree.reset_agree);
721
+ if (agree) {
722
+ return true;
723
+ } else {
724
+ return false;
725
+ }
726
+ event.preventDefault();
727
+ });
728
+ },
729
+ css_editor_mode: function() {
730
+ $('.ot-css-editor').each(function() {
731
+ var editor = ace.edit($(this).attr('id'));
732
+ var this_textarea = $('#textarea_' + $(this).attr('id'));
733
+ editor.setTheme("ace/theme/chrome");
734
+ editor.getSession().setMode("ace/mode/css");
735
+ editor.setShowPrintMargin( false );
736
+
737
+ editor.getSession().setValue(this_textarea.val());
738
+ editor.getSession().on('change', function(){
739
+ this_textarea.val(editor.getSession().getValue());
740
+ });
741
+ this_textarea.on('change', function(){
742
+ editor.getSession().setValue(this_textarea.val());
743
+ });
744
+ });
745
+ },
746
+ javascript_editor_mode: function() {
747
+ $('.ot-javascript-editor').each(function() {
748
+ var editor = ace.edit($(this).attr('id'));
749
+ var this_textarea = $('#textarea_' + $(this).attr('id'));
750
+ editor.setTheme("ace/theme/chrome");
751
+ editor.getSession().setMode("ace/mode/javascript");
752
+ editor.setShowPrintMargin( false );
753
+
754
+ editor.getSession().setValue(this_textarea.val());
755
+ editor.getSession().on('change', function(){
756
+ this_textarea.val(editor.getSession().getValue());
757
+ });
758
+ this_textarea.on('change', function(){
759
+ editor.getSession().setValue(this_textarea.val());
760
+ });
761
+ });
762
+ },
763
+ load_editors: function() {
764
+ OT_UI.css_editor_mode();
765
+ OT_UI.javascript_editor_mode();
766
+ },
767
+ url_exists: function(url) {
768
+ var link = document.createElement('a')
769
+ link.href = url
770
+ if ( link.hostname != window.location.hostname ) {
771
+ return true; // Stop the code from checking across domains.
772
+ }
773
+ var http = new XMLHttpRequest();
774
+ http.open('HEAD', url, false);
775
+ http.send();
776
+ return http.status!=404;
777
+ },
778
+ scroll_to_top: function() {
779
+ setTimeout( function() {
780
+ $(this).scrollTop(0);
781
+ }, 50 );
782
+ }
783
+ };
784
+ $(document).ready( function() {
785
+ OT_UI.init();
786
+ });
787
+ })(jQuery);
788
+
789
+ /* Gallery */
790
+ !function ($) {
791
+
792
+ ot_gallery = {
793
+
794
+ frame: function (elm) {
795
+
796
+ var selection = this.select(elm)
797
+
798
+ this._frame = wp.media({
799
+ id: 'ot-gallery-frame'
800
+ , frame: 'post'
801
+ , state: 'gallery-edit'
802
+ , title: wp.media.view.l10n.editGalleryTitle
803
+ , editing: true
804
+ , multiple: true
805
+ , selection: selection
806
+ })
807
+
808
+ this._frame.on('update', function () {
809
+ var controller = ot_gallery._frame.states.get('gallery-edit')
810
+ , library = controller.get('library')
811
+ , ids = library.pluck('id')
812
+ , parent = $(elm).parents('.format-setting-inner')
813
+ , input = parent.children('.ot-gallery-value')
814
+ , shortcode = wp.media.gallery.shortcode( selection ).string().replace(/\"/g,"'")
815
+
816
+ input.attr('value', ids)
817
+
818
+ if ( parent.children('.ot-gallery-list').length <= 0 )
819
+ input.after('<ul class="ot-gallery-list" />')
820
+
821
+ $.ajax({
822
+ type: 'POST',
823
+ url: ajaxurl,
824
+ dataType: 'html',
825
+ data: {
826
+ action: 'gallery_update'
827
+ , ids: ids
828
+ },
829
+ success: function(res) {
830
+ parent.children('.ot-gallery-list').html(res);
831
+ if ( input.hasClass('ot-gallery-shortcode') ) {
832
+ input.val(shortcode);
833
+ }
834
+ if ( $(elm).parent().children('.ot-gallery-delete').length <= 0 ) {
835
+ $(elm).parent().append('<a href="#" class="option-tree-ui-button button button-secondary hug-left ot-gallery-delete">' + option_tree.delete + '</a>');
836
+ }
837
+ $(elm).text(option_tree.edit);
838
+ OT_UI.parse_condition();
839
+ }
840
+ })
841
+ })
842
+
843
+ return this._frame
844
+
845
+ }
846
+
847
+ , select: function (elm) {
848
+ var input = $(elm).parents('.format-setting-inner').children('.ot-gallery-value')
849
+ , ids = input.attr('value')
850
+ , _shortcode = input.hasClass('ot-gallery-shortcode') ? ids : '[gallery ids=\'' + ids + '\]'
851
+ , shortcode = wp.shortcode.next('gallery', ( ids ? _shortcode : wp.media.view.settings.ot_gallery.shortcode ) )
852
+ , defaultPostId = wp.media.gallery.defaults.id
853
+ , attachments
854
+ , selection
855
+
856
+ // Bail if we didn't match the shortcode or all of the content.
857
+ if ( ! shortcode )
858
+ return
859
+
860
+ // Ignore the rest of the match object.
861
+ shortcode = shortcode.shortcode
862
+
863
+ if ( _.isUndefined( shortcode.get('id') ) && ! _.isUndefined( defaultPostId ) )
864
+ shortcode.set( 'id', defaultPostId )
865
+
866
+ if ( _.isUndefined( shortcode.get('ids') ) && ! input.hasClass('ot-gallery-shortcode') && ids )
867
+ shortcode.set( 'ids', ids )
868
+
869
+ if ( _.isUndefined( shortcode.get('ids') ) )
870
+ shortcode.set( 'ids', '0' )
871
+
872
+ attachments = wp.media.gallery.attachments( shortcode )
873
+
874
+ selection = new wp.media.model.Selection( attachments.models, {
875
+ props: attachments.props.toJSON()
876
+ , multiple: true
877
+ })
878
+
879
+ selection.gallery = attachments.gallery
880
+
881
+ // Fetch the query's attachments, and then break ties from the query to allow for sorting.
882
+ selection.more().done( function () {
883
+ selection.props.set({ query: false })
884
+ selection.unmirror()
885
+ selection.props.unset('orderby')
886
+ })
887
+
888
+ return selection
889
+
890
+ }
891
+
892
+ , open: function (elm) {
893
+
894
+ ot_gallery.frame(elm).open()
895
+
896
+ }
897
+
898
+ , remove: function (elm) {
899
+
900
+ if ( confirm( option_tree.confirm ) ) {
901
+
902
+ $(elm).parents('.format-setting-inner').children('.ot-gallery-value').attr('value', '');
903
+ $(elm).parents('.format-setting-inner').children('.ot-gallery-list').remove();
904
+ $(elm).next('.ot-gallery-edit').text( option_tree.create );
905
+ $(elm).remove();
906
+ OT_UI.parse_condition();
907
+
908
+ }
909
+
910
+ }
911
+
912
+ }
913
+
914
+ // Gallery delete
915
+ $(document).on('click.ot_gallery.data-api', '.ot-gallery-delete', function (e) {
916
+ e.preventDefault()
917
+ ot_gallery.remove($(this))
918
+ })
919
+
920
+ // Gallery edit
921
+ $(document).on('click.ot_gallery.data-api', '.ot-gallery-edit', function (e) {
922
+ e.preventDefault()
923
+ ot_gallery.open($(this))
924
+ })
925
+
926
+ }(window.jQuery);
927
+
928
+ /*!
929
+ * Adds metabox tabs
930
+ */
931
+ !function ($) {
932
+
933
+ $(document).on('ready', function () {
934
+
935
+ // Loop over the metaboxes
936
+ $('.ot-metabox-wrapper').each( function() {
937
+
938
+ // Only if there is a tab option
939
+ if ( $(this).find('.type-tab').length ) {
940
+
941
+ // Add .ot-metabox-panels
942
+ $(this).find('.type-tab').parents('.ot-metabox-wrapper').wrapInner('<div class="ot-metabox-panels" />')
943
+
944
+ // Wrapp with .ot-metabox-tabs & add .ot-metabox-nav before .ot-metabox-panels
945
+ $(this).find('.ot-metabox-panels').wrap('<div class="ot-metabox-tabs" />').before('<ul class="ot-metabox-nav" />')
946
+
947
+ // Loop over settings and build the tabs nav
948
+ $(this).find('.format-settings').each( function() {
949
+
950
+ if ( $(this).find('.type-tab').length > 0 ) {
951
+ var title = $(this).find('.type-tab').prev().find('label').text()
952
+ , id = $(this).attr('id')
953
+
954
+ // Add a class, hide & append nav item
955
+ $(this).addClass('is-panel').hide()
956
+ $(this).parents('.ot-metabox-panels').prev('.ot-metabox-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
957
+
958
+ }
959
+
960
+ })
961
+
962
+ // Loop over the panels and wrap and ID them.
963
+ $(this).find('.is-panel').each( function() {
964
+ var id = $(this).attr('id')
965
+
966
+ $(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
967
+
968
+ })
969
+
970
+ // Create the tabs
971
+ $(this).find('.ot-metabox-tabs').tabs({
972
+ activate: function( event, ui ) {
973
+ var parent = $(this).outerHeight(),
974
+ child = $(this).find('.ot-metabox-panels').outerHeight() + 8,
975
+ minHeight = parent - 34
976
+ if ( $(this).find('.ot-metabox-panels').css('padding') == '12px' && child < parent ) {
977
+ $(this).find('.ot-metabox-panels').css({ minHeight: minHeight })
978
+ }
979
+ OT_UI.load_editors();
980
+ }
981
+ })
982
+
983
+ // Move the orphaned settings to the top
984
+ $(this).find('.ot-metabox-panels > .format-settings').prependTo($(this))
985
+
986
+ // Remove a bunch of classes to stop style conflicts.
987
+ $(this).find('.ot-metabox-tabs').removeClass('ui-widget ui-widget-content ui-corner-all')
988
+ $(this).find('.ot-metabox-nav').removeClass('ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all')
989
+ $(this).find('.ot-metabox-nav li').removeClass('ui-state-default ui-corner-top ui-tabs-active ui-tabs-active')
990
+ $(this).find('.ot-metabox-nav li').on('mouseenter mouseleave', function() { $(this).removeClass('ui-state-hover') })
991
+
992
+ }
993
+
994
+ })
995
+
996
+ })
997
+
998
+ }(window.jQuery);
999
+
1000
+ /*!
1001
+ * Adds theme option tabs
1002
+ */
1003
+ !function ($) {
1004
+
1005
+ $(document).on('ready', function () {
1006
+
1007
+ // Loop over the theme options
1008
+ $('#option-tree-settings-api .inside').each( function() {
1009
+
1010
+ // Only if there is a tab option
1011
+ if ( $(this).find('.type-tab').length ) {
1012
+
1013
+ // Add .ot-theme-option-panels
1014
+ $(this).find('.type-tab').parents('.inside').wrapInner('<div class="ot-theme-option-panels" />')
1015
+
1016
+ // Wrap with .ot-theme-option-tabs & add .ot-theme-option-nav before .ot-theme-option-panels
1017
+ $(this).find('.ot-theme-option-panels').wrap('<div class="ot-theme-option-tabs" />').before('<ul class="ot-theme-option-nav" />')
1018
+
1019
+ // Loop over settings and build the tabs nav
1020
+ $(this).find('.format-settings').each( function() {
1021
+
1022
+ if ( $(this).find('.type-tab').length > 0 ) {
1023
+ var title = $(this).find('.type-tab').prev().find('.label').text()
1024
+ , id = $(this).attr('id')
1025
+
1026
+ // Add a class, hide & append nav item
1027
+ $(this).addClass('is-panel').hide()
1028
+ $(this).parents('.ot-theme-option-panels').prev('.ot-theme-option-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
1029
+
1030
+ } else {
1031
+
1032
+ }
1033
+
1034
+ })
1035
+
1036
+ // Loop over the panels and wrap and ID them.
1037
+ $(this).find('.is-panel').each( function() {
1038
+ var id = $(this).attr('id')
1039
+
1040
+ $(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
1041
+
1042
+ })
1043
+
1044
+ // Create the tabs
1045
+ $(this).find('.ot-theme-option-tabs').tabs({
1046
+ activate: function( event, ui ) {
1047
+ OT_UI.load_editors();
1048
+ }
1049
+ })
1050
+
1051
+ // Move the orphaned settings to the top
1052
+ $(this).find('.ot-theme-option-panels > .format-settings').prependTo($(this).find('.ot-theme-option-tabs'))
1053
+
1054
+ }
1055
+
1056
+ })
1057
+
1058
+ })
1059
+
1060
+ }(window.jQuery);
1061
+
1062
+ /*!
1063
+ * Fixes the state of metabox radio buttons after a Drag & Drop event.
1064
+ */
1065
+ !function ($) {
1066
+
1067
+ $(document).on('ready', function () {
1068
+
1069
+ // detect mousedown and store all checked radio buttons
1070
+ $('.hndle').on('mousedown', function () {
1071
+
1072
+ // get parent element of .hndle selected.
1073
+ // We only need to monitor radios insde the object that is being moved.
1074
+ var parent_id = $(this).closest('div').attr('id')
1075
+
1076
+ // set live event listener for mouse up on the content .wrap
1077
+ // then give the dragged div time to settle before firing the reclick function
1078
+ $('.wrap').on('mouseup', function () {
1079
+
1080
+ var ot_checked_radios = {}
1081
+
1082
+ // loop over all checked radio buttons inside of parent element
1083
+ $('#' + parent_id + ' input[type="radio"]').each( function () {
1084
+
1085
+ // stores checked radio buttons
1086
+ if ( $(this).is(':checked') ) {
1087
+
1088
+ ot_checked_radios[$(this).attr('name')] = $(this).val()
1089
+
1090
+ }
1091
+
1092
+ // write to the object
1093
+ $(document).data('ot_checked_radios', ot_checked_radios)
1094
+
1095
+ })
1096
+
1097
+ // restore all checked radio buttons
1098
+ setTimeout( function () {
1099
+
1100
+ // get object of checked radio button names and values
1101
+ var checked = $(document).data('ot_checked_radios')
1102
+
1103
+ // step thru each object element and trigger a click on it's corresponding radio button
1104
+ for ( key in checked ) {
1105
+
1106
+ $('input[name="' + key + '"]').filter('[value="' + checked[key] + '"]').trigger('click')
1107
+
1108
+ }
1109
+
1110
+ $('.wrap').unbind('mouseup')
1111
+
1112
+ }, 50 )
1113
+
1114
+ })
1115
+
1116
+ })
1117
+
1118
+ })
1119
+
1120
+ }(window.jQuery);
1121
+
1122
+ /*!
1123
+ * Adds opacity to the default colorpicker
1124
+ *
1125
+ * Derivative work of the Codestar WP Color Picker.
1126
+ */
1127
+ ;(function ( $, window, document, undefined ) {
1128
+ 'use strict';
1129
+
1130
+ // adding alpha support for Automattic Color.js toString function.
1131
+ if( typeof Color.fn.toString !== undefined ) {
1132
+
1133
+ Color.fn.toString = function () {
1134
+
1135
+ // check for alpha
1136
+ if ( this._alpha < 1 ) {
1137
+ return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');
1138
+ }
1139
+
1140
+ var hex = parseInt( this._color, 10 ).toString( 16 );
1141
+
1142
+ if ( this.error ) { return ''; }
1143
+
1144
+ // maybe left pad it
1145
+ if ( hex.length < 6 ) {
1146
+ for (var i = 6 - hex.length - 1; i >= 0; i--) {
1147
+ hex = '0' + hex;
1148
+ }
1149
+ }
1150
+
1151
+ return '#' + hex;
1152
+
1153
+ };
1154
+
1155
+ }
1156
+
1157
+ $.ot_ParseColorValue = function( val ) {
1158
+
1159
+ var value = val.replace(/\s+/g, ''),
1160
+ alpha = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,
1161
+ rgba = ( alpha < 100 ) ? true : false;
1162
+
1163
+ return { value: value, alpha: alpha, rgba: rgba };
1164
+
1165
+ };
1166
+
1167
+ $.fn.ot_wpColorPicker = function() {
1168
+
1169
+ return this.each(function() {
1170
+
1171
+ var $this = $(this);
1172
+
1173
+ // check for rgba enabled/disable
1174
+ if( $this.data('rgba') !== false ) {
1175
+
1176
+ // parse value
1177
+ var picker = $.ot_ParseColorValue( $this.val() );
1178
+
1179
+ // wpColorPicker core
1180
+ $this.wpColorPicker({
1181
+
1182
+ // wpColorPicker: change
1183
+ change: function( event, ui ) {
1184
+
1185
+ // update checkerboard background color
1186
+ $this.closest('.wp-picker-container').find('.option-tree-opacity-slider-offset').css('background-color', ui.color.toString());
1187
+ $this.trigger('keyup');
1188
+
1189
+ },
1190
+
1191
+ // wpColorPicker: create
1192
+ create: function( event, ui ) {
1193
+
1194
+ // set variables for alpha slider
1195
+ var a8cIris = $this.data('a8cIris'),
1196
+ $container = $this.closest('.wp-picker-container'),
1197
+
1198
+ // appending alpha wrapper
1199
+ $alpha_wrap = $('<div class="option-tree-opacity-wrap">' +
1200
+ '<div class="option-tree-opacity-slider"></div>' +
1201
+ '<div class="option-tree-opacity-slider-offset"></div>' +
1202
+ '<div class="option-tree-opacity-text"></div>' +
1203
+ '</div>').appendTo( $container.find('.wp-picker-holder') ),
1204
+
1205
+ $alpha_slider = $alpha_wrap.find('.option-tree-opacity-slider'),
1206
+ $alpha_text = $alpha_wrap.find('.option-tree-opacity-text'),
1207
+ $alpha_offset = $alpha_wrap.find('.option-tree-opacity-slider-offset');
1208
+
1209
+ // alpha slider
1210
+ $alpha_slider.slider({
1211
+
1212
+ // slider: slide
1213
+ slide: function( event, ui ) {
1214
+
1215
+ var slide_value = parseFloat( ui.value / 100 );
1216
+
1217
+ // update iris data alpha && wpColorPicker color option && alpha text
1218
+ a8cIris._color._alpha = slide_value;
1219
+ $this.wpColorPicker( 'color', a8cIris._color.toString() );
1220
+ $alpha_text.text( ( slide_value < 1 ? slide_value : '' ) );
1221
+
1222
+ },
1223
+
1224
+ // slider: create
1225
+ create: function() {
1226
+
1227
+ var slide_value = parseFloat( picker.alpha / 100 ),
1228
+ alpha_text_value = slide_value < 1 ? slide_value : '';
1229
+
1230
+ // update alpha text && checkerboard background color
1231
+ $alpha_text.text(alpha_text_value);
1232
+ $alpha_offset.css('background-color', picker.value);
1233
+
1234
+ // wpColorPicker clear button for update iris data alpha && alpha text && slider color option
1235
+ $container.on('click', '.wp-picker-clear', function() {
1236
+
1237
+ a8cIris._color._alpha = 1;
1238
+ $alpha_text.text('');
1239
+ $alpha_slider.slider('option', 'value', 100).trigger('slide');
1240
+
1241
+ });
1242
+
1243
+ // wpColorPicker default button for update iris data alpha && alpha text && slider color option
1244
+ $container.on('click', '.wp-picker-default', function() {
1245
+
1246
+ var default_picker = $.ot_ParseColorValue( $this.data('default-color') ),
1247
+ default_value = parseFloat( default_picker.alpha / 100 ),
1248
+ default_text = default_value < 1 ? default_value : '';
1249
+
1250
+ a8cIris._color._alpha = default_value;
1251
+ $alpha_text.text(default_text);
1252
+ $alpha_slider.slider('option', 'value', default_picker.alpha).trigger('slide');
1253
+
1254
+ });
1255
+
1256
+ // show alpha wrapper on click color picker button
1257
+ $container.on('click', '.wp-color-result', function() {
1258
+ $alpha_wrap.toggle();
1259
+ });
1260
+
1261
+ // hide alpha wrapper on click body
1262
+ $('body').on( 'click.wpcolorpicker', function() {
1263
+ $alpha_wrap.hide();
1264
+ });
1265
+
1266
+ },
1267
+
1268
+ // slider: options
1269
+ value: picker.alpha,
1270
+ step: 1,
1271
+ min: 1,
1272
+ max: 100
1273
+
1274
+ });
1275
+ }
1276
+
1277
+ });
1278
+
1279
+ } else {
1280
+
1281
+ // wpColorPicker default picker
1282
+ $this.wpColorPicker({
1283
+ change: function() {
1284
+ $this.trigger('keyup');
1285
+ }
1286
+ });
1287
+
1288
+ }
1289
+
1290
+ });
1291
+
1292
+ };
1293
+
1294
+ $(document).ready( function(){
1295
+ $('.hide-color-picker.ot-colorpicker-opacity').ot_wpColorPicker();
1296
+
1297
+
1298
+ function ot_fix_dialog_close(event, ui) {
1299
+ jQuery('.ui-widget-overlay').bind('click', function(){
1300
+ jQuery('#' + event.target.id).dialog('close');
1301
+ });
1302
+ } // ot_fix_dialog_close
1303
+
1304
+ $('#page-niftycs_options').on('click', '.change_tab', function(e) {
1305
+ e.preventDefault();
1306
+
1307
+ $(".wrap.settings-wrap .ui-tabs").tabs('option', 'active', $(this).data('tab'));
1308
+
1309
+ // get the link anchor and scroll to it
1310
+ var target = this.href.split('#')[1];
1311
+ if (target) {
1312
+ jQuery.scrollTo('#' + target, 500, {offset: {top:-100, left:0}});
1313
+ }
1314
+
1315
+ return false;
1316
+ });
1317
+
1318
+
1319
+
1320
+
1321
+ });
1322
+
1323
+
1324
+
1325
+
1326
+ })( jQuery, window, document );
1327
+
1328
+
1329
+ /**
1330
+ * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
1331
+ * Licensed under MIT
1332
+ * @author Ariel Flesler
1333
+ * @version 2.1.2
1334
+ */
1335
+ ;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
admin/includes/google-fonts.php CHANGED
@@ -1,5961 +1,5961 @@
1
- <?php
2
-
3
- /*
4
- * Get Google Webfonts List
5
- * https://www.googleapis.com/webfonts/v1/webfonts?key=YOUR-API-KEY
6
- *
7
- */
8
-
9
- function nifty_cs_get_google_webfonts(){
10
-
11
- $google_webfonts = '{
12
- "kind": "webfonts#webfontList",
13
- "items": [
14
- {
15
- "kind": "webfonts#webfont",
16
- "family": "Abel",
17
- "variants": [
18
- "regular"
19
- ],
20
- "subsets": [
21
- "latin"
22
- ]
23
- },
24
- {
25
- "kind": "webfonts#webfont",
26
- "family": "Abril Fatface",
27
- "variants": [
28
- "regular"
29
- ],
30
- "subsets": [
31
- "latin",
32
- "latin-ext"
33
- ]
34
- },
35
- {
36
- "kind": "webfonts#webfont",
37
- "family": "Aclonica",
38
- "variants": [
39
- "regular"
40
- ],
41
- "subsets": [
42
- "latin"
43
- ]
44
- },
45
- {
46
- "kind": "webfonts#webfont",
47
- "family": "Acme",
48
- "variants": [
49
- "regular"
50
- ],
51
- "subsets": [
52
- "latin"
53
- ]
54
- },
55
- {
56
- "kind": "webfonts#webfont",
57
- "family": "Actor",
58
- "variants": [
59
- "regular"
60
- ],
61
- "subsets": [
62
- "latin"
63
- ]
64
- },
65
- {
66
- "kind": "webfonts#webfont",
67
- "family": "Adamina",
68
- "variants": [
69
- "regular"
70
- ],
71
- "subsets": [
72
- "latin"
73
- ]
74
- },
75
- {
76
- "kind": "webfonts#webfont",
77
- "family": "Advent Pro",
78
- "variants": [
79
- "100",
80
- "200",
81
- "300",
82
- "regular",
83
- "500",
84
- "600",
85
- "700"
86
- ],
87
- "subsets": [
88
- "latin",
89
- "latin-ext",
90
- "greek"
91
- ]
92
- },
93
- {
94
- "kind": "webfonts#webfont",
95
- "family": "Aguafina Script",
96
- "variants": [
97
- "regular"
98
- ],
99
- "subsets": [
100
- "latin",
101
- "latin-ext"
102
- ]
103
- },
104
- {
105
- "kind": "webfonts#webfont",
106
- "family": "Aladin",
107
- "variants": [
108
- "regular"
109
- ],
110
- "subsets": [
111
- "latin",
112
- "latin-ext"
113
- ]
114
- },
115
- {
116
- "kind": "webfonts#webfont",
117
- "family": "Aldrich",
118
- "variants": [
119
- "regular"
120
- ],
121
- "subsets": [
122
- "latin"
123
- ]
124
- },
125
- {
126
- "kind": "webfonts#webfont",
127
- "family": "Alegreya",
128
- "variants": [
129
- "regular",
130
- "italic",
131
- "700",
132
- "700italic",
133
- "900",
134
- "900italic"
135
- ],
136
- "subsets": [
137
- "latin",
138
- "latin-ext"
139
- ]
140
- },
141
- {
142
- "kind": "webfonts#webfont",
143
- "family": "Alegreya SC",
144
- "variants": [
145
- "regular",
146
- "italic",
147
- "700",
148
- "700italic",
149
- "900",
150
- "900italic"
151
- ],
152
- "subsets": [
153
- "latin",
154
- "latin-ext"
155
- ]
156
- },
157
- {
158
- "kind": "webfonts#webfont",
159
- "family": "Alex Brush",
160
- "variants": [
161
- "regular"
162
- ],
163
- "subsets": [
164
- "latin",
165
- "latin-ext"
166
- ]
167
- },
168
- {
169
- "kind": "webfonts#webfont",
170
- "family": "Alfa Slab One",
171
- "variants": [
172
- "regular"
173
- ],
174
- "subsets": [
175
- "latin"
176
- ]
177
- },
178
- {
179
- "kind": "webfonts#webfont",
180
- "family": "Alice",
181
- "variants": [
182
- "regular"
183
- ],
184
- "subsets": [
185
- "latin"
186
- ]
187
- },
188
- {
189
- "kind": "webfonts#webfont",
190
- "family": "Alike",
191
- "variants": [
192
- "regular"
193
- ],
194
- "subsets": [
195
- "latin"
196
- ]
197
- },
198
- {
199
- "kind": "webfonts#webfont",
200
- "family": "Alike Angular",
201
- "variants": [
202
- "regular"
203
- ],
204
- "subsets": [
205
- "latin"
206
- ]
207
- },
208
- {
209
- "kind": "webfonts#webfont",
210
- "family": "Allan",
211
- "variants": [
212
- "700"
213
- ],
214
- "subsets": [
215
- "latin"
216
- ]
217
- },
218
- {
219
- "kind": "webfonts#webfont",
220
- "family": "Allerta",
221
- "variants": [
222
- "regular"
223
- ],
224
- "subsets": [
225
- "latin"
226
- ]
227
- },
228
- {
229
- "kind": "webfonts#webfont",
230
- "family": "Allerta Stencil",
231
- "variants": [
232
- "regular"
233
- ],
234
- "subsets": [
235
- "latin"
236
- ]
237
- },
238
- {
239
- "kind": "webfonts#webfont",
240
- "family": "Allura",
241
- "variants": [
242
- "regular"
243
- ],
244
- "subsets": [
245
- "latin",
246
- "latin-ext"
247
- ]
248
- },
249
- {
250
- "kind": "webfonts#webfont",
251
- "family": "Almendra",
252
- "variants": [
253
- "regular",
254
- "italic",
255
- "700"
256
- ],
257
- "subsets": [
258
- "latin",
259
- "latin-ext"
260
- ]
261
- },
262
- {
263
- "kind": "webfonts#webfont",
264
- "family": "Almendra SC",
265
- "variants": [
266
- "regular"
267
- ],
268
- "subsets": [
269
- "latin"
270
- ]
271
- },
272
- {
273
- "kind": "webfonts#webfont",
274
- "family": "Amarante",
275
- "variants": [
276
- "regular"
277
- ],
278
- "subsets": [
279
- "latin",
280
- "latin-ext"
281
- ]
282
- },
283
- {
284
- "kind": "webfonts#webfont",
285
- "family": "Amaranth",
286
- "variants": [
287
- "regular",
288
- "italic",
289
- "700",
290
- "700italic"
291
- ],
292
- "subsets": [
293
- "latin"
294
- ]
295
- },
296
- {
297
- "kind": "webfonts#webfont",
298
- "family": "Amatic SC",
299
- "variants": [
300
- "regular",
301
- "700"
302
- ],
303
- "subsets": [
304
- "latin"
305
- ]
306
- },
307
- {
308
- "kind": "webfonts#webfont",
309
- "family": "Amethysta",
310
- "variants": [
311
- "regular"
312
- ],
313
- "subsets": [
314
- "latin"
315
- ]
316
- },
317
- {
318
- "kind": "webfonts#webfont",
319
- "family": "Andada",
320
- "variants": [
321
- "regular"
322
- ],
323
- "subsets": [
324
- "latin",
325
- "latin-ext"
326
- ]
327
- },
328
- {
329
- "kind": "webfonts#webfont",
330
- "family": "Andika",
331
- "variants": [
332
- "regular"
333
- ],
334
- "subsets": [
335
- "latin",
336
- "cyrillic-ext",
337
- "latin-ext",
338
- "cyrillic"
339
- ]
340
- },
341
- {
342
- "kind": "webfonts#webfont",
343
- "family": "Angkor",
344
- "variants": [
345
- "regular"
346
- ],
347
- "subsets": [
348
- "khmer"
349
- ]
350
- },
351
- {
352
- "kind": "webfonts#webfont",
353
- "family": "Annie Use Your Telescope",
354
- "variants": [
355
- "regular"
356
- ],
357
- "subsets": [
358
- "latin"
359
- ]
360
- },
361
- {
362
- "kind": "webfonts#webfont",
363
- "family": "Anonymous Pro",
364
- "variants": [
365
- "regular",
366
- "italic",
367
- "700",
368
- "700italic"
369
- ],
370
- "subsets": [
371
- "greek-ext",
372
- "latin",
373
- "cyrillic-ext",
374
- "latin-ext",
375
- "cyrillic",
376
- "greek"
377
- ]
378
- },
379
- {
380
- "kind": "webfonts#webfont",
381
- "family": "Antic",
382
- "variants": [
383
- "regular"
384
- ],
385
- "subsets": [
386
- "latin"
387
- ]
388
- },
389
- {
390
- "kind": "webfonts#webfont",
391
- "family": "Antic Didone",
392
- "variants": [
393
- "regular"
394
- ],
395
- "subsets": [
396
- "latin"
397
- ]
398
- },
399
- {
400
- "kind": "webfonts#webfont",
401
- "family": "Antic Slab",
402
- "variants": [
403
- "regular"
404
- ],
405
- "subsets": [
406
- "latin"
407
- ]
408
- },
409
- {
410
- "kind": "webfonts#webfont",
411
- "family": "Anton",
412
- "variants": [
413
- "regular"
414
- ],
415
- "subsets": [
416
- "latin",
417
- "latin-ext"
418
- ]
419
- },
420
- {
421
- "kind": "webfonts#webfont",
422
- "family": "Arapey",
423
- "variants": [
424
- "regular",
425
- "italic"
426
- ],
427
- "subsets": [
428
- "latin"
429
- ]
430
- },
431
- {
432
- "kind": "webfonts#webfont",
433
- "family": "Arbutus",
434
- "variants": [
435
- "regular"
436
- ],
437
- "subsets": [
438
- "latin",
439
- "latin-ext"
440
- ]
441
- },
442
- {
443
- "kind": "webfonts#webfont",
444
- "family": "Architects Daughter",
445
- "variants": [
446
- "regular"
447
- ],
448
- "subsets": [
449
- "latin"
450
- ]
451
- },
452
- {
453
- "kind": "webfonts#webfont",
454
- "family": "Arimo",
455
- "variants": [
456
- "regular",
457
- "italic",
458
- "700",
459
- "700italic"
460
- ],
461
- "subsets": [
462
- "latin"
463
- ]
464
- },
465
- {
466
- "kind": "webfonts#webfont",
467
- "family": "Arizonia",
468
- "variants": [
469
- "regular"
470
- ],
471
- "subsets": [
472
- "latin",
473
- "latin-ext"
474
- ]
475
- },
476
- {
477
- "kind": "webfonts#webfont",
478
- "family": "Armata",
479
- "variants": [
480
- "regular"
481
- ],
482
- "subsets": [
483
- "latin",
484
- "latin-ext"
485
- ]
486
- },
487
- {
488
- "kind": "webfonts#webfont",
489
- "family": "Artifika",
490
- "variants": [
491
- "regular"
492
- ],
493
- "subsets": [
494
- "latin"
495
- ]
496
- },
497
- {
498
- "kind": "webfonts#webfont",
499
- "family": "Arvo",
500
- "variants": [
501
- "regular",
502
- "italic",
503
- "700",
504
- "700italic"
505
- ],
506
- "subsets": [
507
- "latin"
508
- ]
509
- },
510
- {
511
- "kind": "webfonts#webfont",
512
- "family": "Asap",
513
- "variants": [
514
- "regular",
515
- "italic",
516
- "700",
517
- "700italic"
518
- ],
519
- "subsets": [
520
- "latin",
521
- "latin-ext"
522
- ]
523
- },
524
- {
525
- "kind": "webfonts#webfont",
526
- "family": "Asset",
527
- "variants": [
528
- "regular"
529
- ],
530
- "subsets": [
531
- "latin"
532
- ]
533
- },
534
- {
535
- "kind": "webfonts#webfont",
536
- "family": "Astloch",
537
- "variants": [
538
- "regular",
539
- "700"
540
- ],
541
- "subsets": [
542
- "latin"
543
- ]
544
- },
545
- {
546
- "kind": "webfonts#webfont",
547
- "family": "Asul",
548
- "variants": [
549
- "regular",
550
- "700"
551
- ],
552
- "subsets": [
553
- "latin"
554
- ]
555
- },
556
- {
557
- "kind": "webfonts#webfont",
558
- "family": "Atomic Age",
559
- "variants": [
560
- "regular"
561
- ],
562
- "subsets": [
563
- "latin"
564
- ]
565
- },
566
- {
567
- "kind": "webfonts#webfont",
568
- "family": "Aubrey",
569
- "variants": [
570
- "regular"
571
- ],
572
- "subsets": [
573
- "latin"
574
- ]
575
- },
576
- {
577
- "kind": "webfonts#webfont",
578
- "family": "Audiowide",
579
- "variants": [
580
- "regular"
581
- ],
582
- "subsets": [
583
- "latin",
584
- "latin-ext"
585
- ]
586
- },
587
- {
588
- "kind": "webfonts#webfont",
589
- "family": "Average",
590
- "variants": [
591
- "regular"
592
- ],
593
- "subsets": [
594
- "latin",
595
- "latin-ext"
596
- ]
597
- },
598
- {
599
- "kind": "webfonts#webfont",
600
- "family": "Averia Gruesa Libre",
601
- "variants": [
602
- "regular"
603
- ],
604
- "subsets": [
605
- "latin",
606
- "latin-ext"
607
- ]
608
- },
609
- {
610
- "kind": "webfonts#webfont",
611
- "family": "Averia Libre",
612
- "variants": [
613
- "300",
614
- "300italic",
615
- "regular",
616
- "italic",
617
- "700",
618
- "700italic"
619
- ],
620
- "subsets": [
621
- "latin"
622
- ]
623
- },
624
- {
625
- "kind": "webfonts#webfont",
626
- "family": "Averia Sans Libre",
627
- "variants": [
628
- "300",
629
- "300italic",
630
- "regular",
631
- "italic",
632
- "700",
633
- "700italic"
634
- ],
635
- "subsets": [
636
- "latin"
637
- ]
638
- },
639
- {
640
- "kind": "webfonts#webfont",
641
- "family": "Averia Serif Libre",
642
- "variants": [
643
- "300",
644
- "300italic",
645
- "regular",
646
- "italic",
647
- "700",
648
- "700italic"
649
- ],
650
- "subsets": [
651
- "latin"
652
- ]
653
- },
654
- {
655
- "kind": "webfonts#webfont",
656
- "family": "Bad Script",
657
- "variants": [
658
- "regular"
659
- ],
660
- "subsets": [
661
- "latin",
662
- "cyrillic"
663
- ]
664
- },
665
- {
666
- "kind": "webfonts#webfont",
667
- "family": "Balthazar",
668
- "variants": [
669
- "regular"
670
- ],
671
- "subsets": [
672
- "latin"
673
- ]
674
- },
675
- {
676
- "kind": "webfonts#webfont",
677
- "family": "Bangers",
678
- "variants": [
679
- "regular"
680
- ],
681
- "subsets": [
682
- "latin"
683
- ]
684
- },
685
- {
686
- "kind": "webfonts#webfont",
687
- "family": "Basic",
688
- "variants": [
689
- "regular"
690
- ],
691
- "subsets": [
692
- "latin",
693
- "latin-ext"
694
- ]
695
- },
696
- {
697
- "kind": "webfonts#webfont",
698
- "family": "Battambang",
699
- "variants": [
700
- "regular",
701
- "700"
702
- ],
703
- "subsets": [
704
- "khmer"
705
- ]
706
- },
707
- {
708
- "kind": "webfonts#webfont",
709
- "family": "Baumans",
710
- "variants": [
711
- "regular"
712
- ],
713
- "subsets": [
714
- "latin"
715
- ]
716
- },
717
- {
718
- "kind": "webfonts#webfont",
719
- "family": "Bayon",
720
- "variants": [
721
- "regular"
722
- ],
723
- "subsets": [
724
- "khmer"
725
- ]
726
- },
727
- {
728
- "kind": "webfonts#webfont",
729
- "family": "Belgrano",
730
- "variants": [
731
- "regular"
732
- ],
733
- "subsets": [
734
- "latin"
735
- ]
736
- },
737
- {
738
- "kind": "webfonts#webfont",
739
- "family": "Belleza",
740
- "variants": [
741
- "regular"
742
- ],
743
- "subsets": [
744
- "latin",
745
- "latin-ext"
746
- ]
747
- },
748
- {
749
- "kind": "webfonts#webfont",
750
- "family": "Bentham",
751
- "variants": [
752
- "regular"
753
- ],
754
- "subsets": [
755
- "latin"
756
- ]
757
- },
758
- {
759
- "kind": "webfonts#webfont",
760
- "family": "Berkshire Swash",
761
- "variants": [
762
- "regular"
763
- ],
764
- "subsets": [
765
- "latin",
766
- "latin-ext"
767
- ]
768
- },
769
- {
770
- "kind": "webfonts#webfont",
771
- "family": "Bevan",
772
- "variants": [
773
- "regular"
774
- ],
775
- "subsets": [
776
- "latin"
777
- ]
778
- },
779
- {
780
- "kind": "webfonts#webfont",
781
- "family": "Bigshot One",
782
- "variants": [
783
- "regular"
784
- ],
785
- "subsets": [
786
- "latin"
787
- ]
788
- },
789
- {
790
- "kind": "webfonts#webfont",
791
- "family": "Bilbo",
792
- "variants": [
793
- "regular"
794
- ],
795
- "subsets": [
796
- "latin",
797
- "latin-ext"
798
- ]
799
- },
800
- {
801
- "kind": "webfonts#webfont",
802
- "family": "Bilbo Swash Caps",
803
- "variants": [
804
- "regular"
805
- ],
806
- "subsets": [
807
- "latin",
808
- "latin-ext"
809
- ]
810
- },
811
- {
812
- "kind": "webfonts#webfont",
813
- "family": "Bitter",
814
- "variants": [
815
- "regular",
816
- "italic",
817
- "700"
818
- ],
819
- "subsets": [
820
- "latin",
821
- "latin-ext"
822
- ]
823
- },
824
- {
825
- "kind": "webfonts#webfont",
826
- "family": "Black Ops One",
827
- "variants": [
828
- "regular"
829
- ],
830
- "subsets": [
831
- "latin"
832
- ]
833
- },
834
- {
835
- "kind": "webfonts#webfont",
836
- "family": "Bokor",
837
- "variants": [
838
- "regular"
839
- ],
840
- "subsets": [
841
- "khmer"
842
- ]
843
- },
844
- {
845
- "kind": "webfonts#webfont",
846
- "family": "Bonbon",
847
- "variants": [
848
- "regular"
849
- ],
850
- "subsets": [
851
- "latin"
852
- ]
853
- },
854
- {
855
- "kind": "webfonts#webfont",
856
- "family": "Boogaloo",
857
- "variants": [
858
- "regular"
859
- ],
860
- "subsets": [
861
- "latin"
862
- ]
863
- },
864
- {
865
- "kind": "webfonts#webfont",
866
- "family": "Bowlby One",
867
- "variants": [
868
- "regular"
869
- ],
870
- "subsets": [
871
- "latin"
872
- ]
873
- },
874
- {
875
- "kind": "webfonts#webfont",
876
- "family": "Bowlby One SC",
877
- "variants": [
878
- "regular"
879
- ],
880
- "subsets": [
881
- "latin",
882
- "latin-ext"
883
- ]
884
- },
885
- {
886
- "kind": "webfonts#webfont",
887
- "family": "Brawler",
888
- "variants": [
889
- "regular"
890
- ],
891
- "subsets": [
892
- "latin"
893
- ]
894
- },
895
- {
896
- "kind": "webfonts#webfont",
897
- "family": "Bree Serif",
898
- "variants": [
899
- "regular"
900
- ],
901
- "subsets": [
902
- "latin",
903
- "latin-ext"
904
- ]
905
- },
906
- {
907
- "kind": "webfonts#webfont",
908
- "family": "Bubblegum Sans",
909
- "variants": [
910
- "regular"
911
- ],
912
- "subsets": [
913
- "latin",
914
- "latin-ext"
915
- ]
916
- },
917
- {
918
- "kind": "webfonts#webfont",
919
- "family": "Buda",
920
- "variants": [
921
- "300"
922
- ],
923
- "subsets": [
924
- "latin"
925
- ]
926
- },
927
- {
928
- "kind": "webfonts#webfont",
929
- "family": "Buenard",
930
- "variants": [
931
- "regular",
932
- "700"
933
- ],
934
- "subsets": [
935
- "latin",
936
- "latin-ext"
937
- ]
938
- },
939
- {
940
- "kind": "webfonts#webfont",
941
- "family": "Butcherman",
942
- "variants": [
943
- "regular"
944
- ],
945
- "subsets": [
946
- "latin",
947
- "latin-ext"
948
- ]
949
- },
950
- {
951
- "kind": "webfonts#webfont",
952
- "family": "Butterfly Kids",
953
- "variants": [
954
- "regular"
955
- ],
956
- "subsets": [
957
- "latin",
958
- "latin-ext"
959
- ]
960
- },
961
- {
962
- "kind": "webfonts#webfont",
963
- "family": "Cabin",
964
- "variants": [
965
- "regular",
966
- "italic",
967
- "500",
968
- "500italic",
969
- "600",
970
- "600italic",
971
- "700",
972
- "700italic"
973
- ],
974
- "subsets": [
975
- "latin"
976
- ]
977
- },
978
- {
979
- "kind": "webfonts#webfont",
980
- "family": "Cabin Condensed",
981
- "variants": [
982
- "regular",
983
- "500",
984
- "600",
985
- "700"
986
- ],
987
- "subsets": [
988
- "latin"
989
- ]
990
- },
991
- {
992
- "kind": "webfonts#webfont",
993
- "family": "Cabin Sketch",
994
- "variants": [
995
- "regular",
996
- "700"
997
- ],
998
- "subsets": [
999
- "latin"
1000
- ]
1001
- },
1002
- {
1003
- "kind": "webfonts#webfont",
1004
- "family": "Caesar Dressing",
1005
- "variants": [
1006
- "regular"
1007
- ],
1008
- "subsets": [
1009
- "latin"
1010
- ]
1011
- },
1012
- {
1013
- "kind": "webfonts#webfont",
1014
- "family": "Cagliostro",
1015
- "variants": [
1016
- "regular"
1017
- ],
1018
- "subsets": [
1019
- "latin"
1020
- ]
1021
- },
1022
- {
1023
- "kind": "webfonts#webfont",
1024
- "family": "Calligraffitti",
1025
- "variants": [
1026
- "regular"
1027
- ],
1028
- "subsets": [
1029
- "latin"
1030
- ]
1031
- },
1032
- {
1033
- "kind": "webfonts#webfont",
1034
- "family": "Cambo",
1035
- "variants": [
1036
- "regular"
1037
- ],
1038
- "subsets": [
1039
- "latin"
1040
- ]
1041
- },
1042
- {
1043
- "kind": "webfonts#webfont",
1044
- "family": "Candal",
1045
- "variants": [
1046
- "regular"
1047
- ],
1048
- "subsets": [
1049
- "latin"
1050
- ]
1051
- },
1052
- {
1053
- "kind": "webfonts#webfont",
1054
- "family": "Cantarell",
1055
- "variants": [
1056
- "regular",
1057
- "italic",
1058
- "700",
1059
- "700italic"
1060
- ],
1061
- "subsets": [
1062
- "latin"
1063
- ]
1064
- },
1065
- {
1066
- "kind": "webfonts#webfont",
1067
- "family": "Cantata One",
1068
- "variants": [
1069
- "regular"
1070
- ],
1071
- "subsets": [
1072
- "latin",
1073
- "latin-ext"
1074
- ]
1075
- },
1076
- {
1077
- "kind": "webfonts#webfont",
1078
- "family": "Capriola",
1079
- "variants": [
1080
- "regular"
1081
- ],
1082
- "subsets": [
1083
- "latin",
1084
- "latin-ext"
1085
- ]
1086
- },
1087
- {
1088
- "kind": "webfonts#webfont",
1089
- "family": "Cardo",
1090
- "variants": [
1091
- "regular",
1092
- "italic",
1093
- "700"
1094
- ],
1095
- "subsets": [
1096
- "greek-ext",
1097
- "latin",
1098
- "latin-ext",
1099
- "greek"
1100
- ]
1101
- },
1102
- {
1103
- "kind": "webfonts#webfont",
1104
- "family": "Carme",
1105
- "variants": [
1106
- "regular"
1107
- ],
1108
- "subsets": [
1109
- "latin"
1110
- ]
1111
- },
1112
- {
1113
- "kind": "webfonts#webfont",
1114
- "family": "Carter One",
1115
- "variants": [
1116
- "regular"
1117
- ],
1118
- "subsets": [
1119
- "latin"
1120
- ]
1121
- },
1122
- {
1123
- "kind": "webfonts#webfont",
1124
- "family": "Caudex",
1125
- "variants": [
1126
- "regular",
1127
- "italic",
1128
- "700",
1129
- "700italic"
1130
- ],
1131
- "subsets": [
1132
- "greek-ext",
1133
- "latin",
1134
- "latin-ext",
1135
- "greek"
1136
- ]
1137
- },
1138
- {
1139
- "kind": "webfonts#webfont",
1140
- "family": "Cedarville Cursive",
1141
- "variants": [
1142
- "regular"
1143
- ],
1144
- "subsets": [
1145
- "latin"
1146
- ]
1147
- },
1148
- {
1149
- "kind": "webfonts#webfont",
1150
- "family": "Ceviche One",
1151
- "variants": [
1152
- "regular"
1153
- ],
1154
- "subsets": [
1155
- "latin"
1156
- ]
1157
- },
1158
- {
1159
- "kind": "webfonts#webfont",
1160
- "family": "Changa One",
1161
- "variants": [
1162
- "regular",
1163
- "italic"
1164
- ],
1165
- "subsets": [
1166
- "latin"
1167
- ]
1168
- },
1169
- {
1170
- "kind": "webfonts#webfont",
1171
- "family": "Chango",
1172
- "variants": [
1173
- "regular"
1174
- ],
1175
- "subsets": [
1176
- "latin",
1177
- "latin-ext"
1178
- ]
1179
- },
1180
- {
1181
- "kind": "webfonts#webfont",
1182
- "family": "Chau Philomene One",
1183
- "variants": [
1184
- "regular",
1185
- "italic"
1186
- ],
1187
- "subsets": [
1188
- "latin",
1189
- "latin-ext"
1190
- ]
1191
- },
1192
- {
1193
- "kind": "webfonts#webfont",
1194
- "family": "Chelsea Market",
1195
- "variants": [
1196
- "regular"
1197
- ],
1198
- "subsets": [
1199
- "latin",
1200
- "latin-ext"
1201
- ]
1202
- },
1203
- {
1204
- "kind": "webfonts#webfont",
1205
- "family": "Chenla",
1206
- "variants": [
1207
- "regular"
1208
- ],
1209
- "subsets": [
1210
- "khmer"
1211
- ]
1212
- },
1213
- {
1214
- "kind": "webfonts#webfont",
1215
- "family": "Cherry Cream Soda",
1216
- "variants": [
1217
- "regular"
1218
- ],
1219
- "subsets": [
1220
- "latin"
1221
- ]
1222
- },
1223
- {
1224
- "kind": "webfonts#webfont",
1225
- "family": "Chewy",
1226
- "variants": [
1227
- "regular"
1228
- ],
1229
- "subsets": [
1230
- "latin"
1231
- ]
1232
- },
1233
- {
1234
- "kind": "webfonts#webfont",
1235
- "family": "Chicle",
1236
- "variants": [
1237
- "regular"
1238
- ],
1239
- "subsets": [
1240
- "latin",
1241
- "latin-ext"
1242
- ]
1243
- },
1244
- {
1245
- "kind": "webfonts#webfont",
1246
- "family": "Chivo",
1247
- "variants": [
1248
- "regular",
1249
- "italic",
1250
- "900",
1251
- "900italic"
1252
- ],
1253
- "subsets": [
1254
- "latin"
1255
- ]
1256
- },
1257
- {
1258
- "kind": "webfonts#webfont",
1259
- "family": "Coda",
1260
- "variants": [
1261
- "regular",
1262
- "800"
1263
- ],
1264
- "subsets": [
1265
- "latin"
1266
- ]
1267
- },
1268
- {
1269
- "kind": "webfonts#webfont",
1270
- "family": "Coda Caption",
1271
- "variants": [
1272
- "800"
1273
- ],
1274
- "subsets": [
1275
- "latin"
1276
- ]
1277
- },
1278
- {
1279
- "kind": "webfonts#webfont",
1280
- "family": "Codystar",
1281
- "variants": [
1282
- "300",
1283
- "regular"
1284
- ],
1285
- "subsets": [
1286
- "latin",
1287
- "latin-ext"
1288
- ]
1289
- },
1290
- {
1291
- "kind": "webfonts#webfont",
1292
- "family": "Comfortaa",
1293
- "variants": [
1294
- "300",
1295
- "regular",
1296
- "700"
1297
- ],
1298
- "subsets": [
1299
- "latin",
1300
- "cyrillic-ext",
1301
- "latin-ext",
1302
- "cyrillic",
1303
- "greek"
1304
- ]
1305
- },
1306
- {
1307
- "kind": "webfonts#webfont",
1308
- "family": "Coming Soon",
1309
- "variants": [
1310
- "regular"
1311
- ],
1312
- "subsets": [
1313
- "latin"
1314
- ]
1315
- },
1316
- {
1317
- "kind": "webfonts#webfont",
1318
- "family": "Concert One",
1319
- "variants": [
1320
- "regular"
1321
- ],
1322
- "subsets": [
1323
- "latin",
1324
- "latin-ext"
1325
- ]
1326
- },
1327
- {
1328
- "kind": "webfonts#webfont",
1329
- "family": "Condiment",
1330
- "variants": [
1331
- "regular"
1332
- ],
1333
- "subsets": [
1334
- "latin",
1335
- "latin-ext"
1336
- ]
1337
- },
1338
- {
1339
- "kind": "webfonts#webfont",
1340
- "family": "Content",
1341
- "variants": [
1342
- "regular",
1343
- "700"
1344
- ],
1345
- "subsets": [
1346
- "khmer"
1347
- ]
1348
- },
1349
- {
1350
- "kind": "webfonts#webfont",
1351
- "family": "Contrail One",
1352
- "variants": [
1353
- "regular"
1354
- ],
1355
- "subsets": [
1356
- "latin"
1357
- ]
1358
- },
1359
- {
1360
- "kind": "webfonts#webfont",
1361
- "family": "Convergence",
1362
- "variants": [
1363
- "regular"
1364
- ],
1365
- "subsets": [
1366
- "latin"
1367
- ]
1368
- },
1369
- {
1370
- "kind": "webfonts#webfont",
1371
- "family": "Cookie",
1372
- "variants": [
1373
- "regular"
1374
- ],
1375
- "subsets": [
1376
- "latin"
1377
- ]
1378
- },
1379
- {
1380
- "kind": "webfonts#webfont",
1381
- "family": "Copse",
1382
- "variants": [
1383
- "regular"
1384
- ],
1385
- "subsets": [
1386
- "latin"
1387
- ]
1388
- },
1389
- {
1390
- "kind": "webfonts#webfont",
1391
- "family": "Corben",
1392
- "variants": [
1393
- "regular",
1394
- "700"
1395
- ],
1396
- "subsets": [
1397
- "latin"
1398
- ]
1399
- },
1400
- {
1401
- "kind": "webfonts#webfont",
1402
- "family": "Courgette",
1403
- "variants": [
1404
- "regular"
1405
- ],
1406
- "subsets": [
1407
- "latin",
1408
- "latin-ext"
1409
- ]
1410
- },
1411
- {
1412
- "kind": "webfonts#webfont",
1413
- "family": "Cousine",
1414
- "variants": [
1415
- "regular",
1416
- "italic",
1417
- "700",
1418
- "700italic"
1419
- ],
1420
- "subsets": [
1421
- "latin"
1422
- ]
1423
- },
1424
- {
1425
- "kind": "webfonts#webfont",
1426
- "family": "Coustard",
1427
- "variants": [
1428
- "regular",
1429
- "900"
1430
- ],
1431
- "subsets": [
1432
- "latin"
1433
- ]
1434
- },
1435
- {
1436
- "kind": "webfonts#webfont",
1437
- "family": "Covered By Your Grace",
1438
- "variants": [
1439
- "regular"
1440
- ],
1441
- "subsets": [
1442
- "latin"
1443
- ]
1444
- },
1445
- {
1446
- "kind": "webfonts#webfont",
1447
- "family": "Crafty Girls",
1448
- "variants": [
1449
- "regular"
1450
- ],
1451
- "subsets": [
1452
- "latin"
1453
- ]
1454
- },
1455
- {
1456
- "kind": "webfonts#webfont",
1457
- "family": "Creepster",
1458
- "variants": [
1459
- "regular"
1460
- ],
1461
- "subsets": [
1462
- "latin"
1463
- ]
1464
- },
1465
- {
1466
- "kind": "webfonts#webfont",
1467
- "family": "Crete Round",
1468
- "variants": [
1469
- "regular",
1470
- "italic"
1471
- ],
1472
- "subsets": [
1473
- "latin",
1474
- "latin-ext"
1475
- ]
1476
- },
1477
- {
1478
- "kind": "webfonts#webfont",
1479
- "family": "Crimson Text",
1480
- "variants": [
1481
- "regular",
1482
- "italic",
1483
- "600",
1484
- "600italic",
1485
- "700",
1486
- "700italic"
1487
- ],
1488
- "subsets": [
1489
- "latin"
1490
- ]
1491
- },
1492
- {
1493
- "kind": "webfonts#webfont",
1494
- "family": "Crushed",
1495
- "variants": [
1496
- "regular"
1497
- ],
1498
- "subsets": [
1499
- "latin"
1500
- ]
1501
- },
1502
- {
1503
- "kind": "webfonts#webfont",
1504
- "family": "Cuprum",
1505
- "variants": [
1506
- "regular",
1507
- "italic",
1508
- "700",
1509
- "700italic"
1510
- ],
1511
- "subsets": [
1512
- "latin",
1513
- "latin-ext",
1514
- "cyrillic"
1515
- ]
1516
- },
1517
- {
1518
- "kind": "webfonts#webfont",
1519
- "family": "Cutive",
1520
- "variants": [
1521
- "regular"
1522
- ],
1523
- "subsets": [
1524
- "latin",
1525
- "latin-ext"
1526
- ]
1527
- },
1528
- {
1529
- "kind": "webfonts#webfont",
1530
- "family": "Damion",
1531
- "variants": [
1532
- "regular"
1533
- ],
1534
- "subsets": [
1535
- "latin"
1536
- ]
1537
- },
1538
- {
1539
- "kind": "webfonts#webfont",
1540
- "family": "Dancing Script",
1541
- "variants": [
1542
- "regular",
1543
- "700"
1544
- ],
1545
- "subsets": [
1546
- "latin"
1547
- ]
1548
- },
1549
- {
1550
- "kind": "webfonts#webfont",
1551
- "family": "Dangrek",
1552
- "variants": [
1553
- "regular"
1554
- ],
1555
- "subsets": [
1556
- "khmer"
1557
- ]
1558
- },
1559
- {
1560
- "kind": "webfonts#webfont",
1561
- "family": "Dawning of a New Day",
1562
- "variants": [
1563
- "regular"
1564
- ],
1565
- "subsets": [
1566
- "latin"
1567
- ]
1568
- },
1569
- {
1570
- "kind": "webfonts#webfont",
1571
- "family": "Days One",
1572
- "variants": [
1573
- "regular"
1574
- ],
1575
- "subsets": [
1576
- "latin"
1577
- ]
1578
- },
1579
- {
1580
- "kind": "webfonts#webfont",
1581
- "family": "Delius",
1582
- "variants": [
1583
- "regular"
1584
- ],
1585
- "subsets": [
1586
- "latin"
1587
- ]
1588
- },
1589
- {
1590
- "kind": "webfonts#webfont",
1591
- "family": "Delius Swash Caps",
1592
- "variants": [
1593
- "regular"
1594
- ],
1595
- "subsets": [
1596
- "latin"
1597
- ]
1598
- },
1599
- {
1600
- "kind": "webfonts#webfont",
1601
- "family": "Delius Unicase",
1602
- "variants": [
1603
- "regular",
1604
- "700"
1605
- ],
1606
- "subsets": [
1607
- "latin"
1608
- ]
1609
- },
1610
- {
1611
- "kind": "webfonts#webfont",
1612
- "family": "Della Respira",
1613
- "variants": [
1614
- "regular"
1615
- ],
1616
- "subsets": [
1617
- "latin"
1618
- ]
1619
- },
1620
- {
1621
- "kind": "webfonts#webfont",
1622
- "family": "Devonshire",
1623
- "variants": [
1624
- "regular"
1625
- ],
1626
- "subsets": [
1627
- "latin",
1628
- "latin-ext"
1629
- ]
1630
- },
1631
- {
1632
- "kind": "webfonts#webfont",
1633
- "family": "Didact Gothic",
1634
- "variants": [
1635
- "regular"
1636
- ],
1637
- "subsets": [
1638
- "greek-ext",
1639
- "latin",
1640
- "cyrillic-ext",
1641
- "latin-ext",
1642
- "cyrillic",
1643
- "greek"
1644
- ]
1645
- },
1646
- {
1647
- "kind": "webfonts#webfont",
1648
- "family": "Diplomata",
1649
- "variants": [
1650
- "regular"
1651
- ],
1652
- "subsets": [
1653
- "latin",
1654
- "latin-ext"
1655
- ]
1656
- },
1657
- {
1658
- "kind": "webfonts#webfont",
1659
- "family": "Diplomata SC",
1660
- "variants": [
1661
- "regular"
1662
- ],
1663
- "subsets": [
1664
- "latin",
1665
- "latin-ext"
1666
- ]
1667
- },
1668
- {
1669
- "kind": "webfonts#webfont",
1670
- "family": "Doppio One",
1671
- "variants": [
1672
- "regular"
1673
- ],
1674
- "subsets": [
1675
- "latin",
1676
- "latin-ext"
1677
- ]
1678
- },
1679
- {
1680
- "kind": "webfonts#webfont",
1681
- "family": "Dorsa",
1682
- "variants": [
1683
- "regular"
1684
- ],
1685
- "subsets": [
1686
- "latin"
1687
- ]
1688
- },
1689
- {
1690
- "kind": "webfonts#webfont",
1691
- "family": "Dosis",
1692
- "variants": [
1693
- "200",
1694
- "300",
1695
- "regular",
1696
- "500",
1697
- "600",
1698
- "700",
1699
- "800"
1700
- ],
1701
- "subsets": [
1702
- "latin",
1703
- "latin-ext"
1704
- ]
1705
- },
1706
- {
1707
- "kind": "webfonts#webfont",
1708
- "family": "Dr Sugiyama",
1709
- "variants": [
1710
- "regular"
1711
- ],
1712
- "subsets": [
1713
- "latin",
1714
- "latin-ext"
1715
- ]
1716
- },
1717
- {
1718
- "kind": "webfonts#webfont",
1719
- "family": "Droid Sans",
1720
- "variants": [
1721
- "regular",
1722
- "700"
1723
- ],
1724
- "subsets": [
1725
- "latin"
1726
- ]
1727
- },
1728
- {
1729
- "kind": "webfonts#webfont",
1730
- "family": "Droid Sans Mono",
1731
- "variants": [
1732
- "regular"
1733
- ],
1734
- "subsets": [
1735
- "latin"
1736
- ]
1737
- },
1738
- {
1739
- "kind": "webfonts#webfont",
1740
- "family": "Droid Serif",
1741
- "variants": [
1742
- "regular",
1743
- "italic",
1744
- "700",
1745
- "700italic"
1746
- ],
1747
- "subsets": [
1748
- "latin"
1749
- ]
1750
- },
1751
- {
1752
- "kind": "webfonts#webfont",
1753
- "family": "Duru Sans",
1754
- "variants": [
1755
- "regular"
1756
- ],
1757
- "subsets": [
1758
- "latin",
1759
- "latin-ext"
1760
- ]
1761
- },
1762
- {
1763
- "kind": "webfonts#webfont",
1764
- "family": "Dynalight",
1765
- "variants": [
1766
- "regular"
1767
- ],
1768
- "subsets": [
1769
- "latin",
1770
- "latin-ext"
1771
- ]
1772
- },
1773
- {
1774
- "kind": "webfonts#webfont",
1775
- "family": "EB Garamond",
1776
- "variants": [
1777
- "regular"
1778
- ],
1779
- "subsets": [
1780
- "latin",
1781
- "vietnamese",
1782
- "cyrillic-ext",
1783
- "latin-ext",
1784
- "cyrillic"
1785
- ]
1786
- },
1787
- {
1788
- "kind": "webfonts#webfont",
1789
- "family": "Eagle Lake",
1790
- "variants": [
1791
- "regular"
1792
- ],
1793
- "subsets": [
1794
- "latin",
1795
- "latin-ext"
1796
- ]
1797
- },
1798
- {
1799
- "kind": "webfonts#webfont",
1800
- "family": "Eater",
1801
- "variants": [
1802
- "regular"
1803
- ],
1804
- "subsets": [
1805
- "latin",
1806
- "latin-ext"
1807
- ]
1808
- },
1809
- {
1810
- "kind": "webfonts#webfont",
1811
- "family": "Economica",
1812
- "variants": [
1813
- "regular",
1814
- "italic",
1815
- "700",
1816
- "700italic"
1817
- ],
1818
- "subsets": [
1819
- "latin",
1820
- "latin-ext"
1821
- ]
1822
- },
1823
- {
1824
- "kind": "webfonts#webfont",
1825
- "family": "Electrolize",
1826
- "variants": [
1827
- "regular"
1828
- ],
1829
- "subsets": [
1830
- "latin"
1831
- ]
1832
- },
1833
- {
1834
- "kind": "webfonts#webfont",
1835
- "family": "Emblema One",
1836
- "variants": [
1837
- "regular"
1838
- ],
1839
- "subsets": [
1840
- "latin",
1841
- "latin-ext"
1842
- ]
1843
- },
1844
- {
1845
- "kind": "webfonts#webfont",
1846
- "family": "Emilys Candy",
1847
- "variants": [
1848
- "regular"
1849
- ],
1850
- "subsets": [
1851
- "latin",
1852
- "latin-ext"
1853
- ]
1854
- },
1855
- {
1856
- "kind": "webfonts#webfont",
1857
- "family": "Engagement",
1858
- "variants": [
1859
- "regular"
1860
- ],
1861
- "subsets": [
1862
- "latin"
1863
- ]
1864
- },
1865
- {
1866
- "kind": "webfonts#webfont",
1867
- "family": "Enriqueta",
1868
- "variants": [
1869
- "regular",
1870
- "700"
1871
- ],
1872
- "subsets": [
1873
- "latin",
1874
- "latin-ext"
1875
- ]
1876
- },
1877
- {
1878
- "kind": "webfonts#webfont",
1879
- "family": "Erica One",
1880
- "variants": [
1881
- "regular"
1882
- ],
1883
- "subsets": [
1884
- "latin"
1885
- ]
1886
- },
1887
- {
1888
- "kind": "webfonts#webfont",
1889
- "family": "Esteban",
1890
- "variants": [
1891
- "regular"
1892
- ],
1893
- "subsets": [
1894
- "latin",
1895
- "latin-ext"
1896
- ]
1897
- },
1898
- {
1899
- "kind": "webfonts#webfont",
1900
- "family": "Euphoria Script",
1901
- "variants": [
1902
- "regular"
1903
- ],
1904
- "subsets": [
1905
- "latin",
1906
- "latin-ext"
1907
- ]
1908
- },
1909
- {
1910
- "kind": "webfonts#webfont",
1911
- "family": "Ewert",
1912
- "variants": [
1913
- "regular"
1914
- ],
1915
- "subsets": [
1916
- "latin",
1917
- "latin-ext"
1918
- ]
1919
- },
1920
- {
1921
- "kind": "webfonts#webfont",
1922
- "family": "Exo",
1923
- "variants": [
1924
- "100",
1925
- "100italic",
1926
- "200",
1927
- "200italic",
1928
- "300",
1929
- "300italic",
1930
- "regular",
1931
- "italic",
1932
- "500",
1933
- "500italic",
1934
- "600",
1935
- "600italic",
1936
- "700",
1937
- "700italic",
1938
- "800",
1939
- "800italic",
1940
- "900",
1941
- "900italic"
1942
- ],
1943
- "subsets": [
1944
- "latin",
1945
- "latin-ext"
1946
- ]
1947
- },
1948
- {
1949
- "kind": "webfonts#webfont",
1950
- "family": "Expletus Sans",
1951
- "variants": [
1952
- "regular",
1953
- "italic",
1954
- "500",
1955
- "500italic",
1956
- "600",
1957
- "600italic",
1958
- "700",
1959
- "700italic"
1960
- ],
1961
- "subsets": [
1962
- "latin"
1963
- ]
1964
- },
1965
- {
1966
- "kind": "webfonts#webfont",
1967
- "family": "Fanwood Text",
1968
- "variants": [
1969
- "regular",
1970
- "italic"
1971
- ],
1972
- "subsets": [
1973
- "latin"
1974
- ]
1975
- },
1976
- {
1977
- "kind": "webfonts#webfont",
1978
- "family": "Fascinate",
1979
- "variants": [
1980
- "regular"
1981
- ],
1982
- "subsets": [
1983
- "latin"
1984
- ]
1985
- },
1986
- {
1987
- "kind": "webfonts#webfont",
1988
- "family": "Fascinate Inline",
1989
- "variants": [
1990
- "regular"
1991
- ],
1992
- "subsets": [
1993
- "latin"
1994
- ]
1995
- },
1996
- {
1997
- "kind": "webfonts#webfont",
1998
- "family": "Federant",
1999
- "variants": [
2000
- "regular"
2001
- ],
2002
- "subsets": [
2003
- "latin"
2004
- ]
2005
- },
2006
- {
2007
- "kind": "webfonts#webfont",
2008
- "family": "Federo",
2009
- "variants": [
2010
- "regular"
2011
- ],
2012
- "subsets": [
2013
- "latin"
2014
- ]
2015
- },
2016
- {
2017
- "kind": "webfonts#webfont",
2018
- "family": "Felipa",
2019
- "variants": [
2020
- "regular"
2021
- ],
2022
- "subsets": [
2023
- "latin",
2024
- "latin-ext"
2025
- ]
2026
- },
2027
- {
2028
- "kind": "webfonts#webfont",
2029
- "family": "Fjord One",
2030
- "variants": [
2031
- "regular"
2032
- ],
2033
- "subsets": [
2034
- "latin"
2035
- ]
2036
- },
2037
- {
2038
- "kind": "webfonts#webfont",
2039
- "family": "Flamenco",
2040
- "variants": [
2041
- "300",
2042
- "regular"
2043
- ],
2044
- "subsets": [
2045
- "latin"
2046
- ]
2047
- },
2048
- {
2049
- "kind": "webfonts#webfont",
2050
- "family": "Flavors",
2051
- "variants": [
2052
- "regular"
2053
- ],
2054
- "subsets": [
2055
- "latin"
2056
- ]
2057
- },
2058
- {
2059
- "kind": "webfonts#webfont",
2060
- "family": "Fondamento",
2061
- "variants": [
2062
- "regular",
2063
- "italic"
2064
- ],
2065
- "subsets": [
2066
- "latin",
2067
- "latin-ext"
2068
- ]
2069
- },
2070
- {
2071
- "kind": "webfonts#webfont",
2072
- "family": "Fontdiner Swanky",
2073
- "variants": [
2074
- "regular"
2075
- ],
2076
- "subsets": [
2077
- "latin"
2078
- ]
2079
- },
2080
- {
2081
- "kind": "webfonts#webfont",
2082
- "family": "Forum",
2083
- "variants": [
2084
- "regular"
2085
- ],
2086
- "subsets": [
2087
- "latin",
2088
- "cyrillic-ext",
2089
- "latin-ext",
2090
- "cyrillic"
2091
- ]
2092
- },
2093
- {
2094
- "kind": "webfonts#webfont",
2095
- "family": "Francois One",
2096
- "variants": [
2097
- "regular"
2098
- ],
2099
- "subsets": [
2100
- "latin",
2101
- "latin-ext"
2102
- ]
2103
- },
2104
- {
2105
- "kind": "webfonts#webfont",
2106
- "family": "Fredericka the Great",
2107
- "variants": [
2108
- "regular"
2109
- ],
2110
- "subsets": [
2111
- "latin"
2112
- ]
2113
- },
2114
- {
2115
- "kind": "webfonts#webfont",
2116
- "family": "Fredoka One",
2117
- "variants": [
2118
- "regular"
2119
- ],
2120
- "subsets": [
2121
- "latin"
2122
- ]
2123
- },
2124
- {
2125
- "kind": "webfonts#webfont",
2126
- "family": "Freehand",
2127
- "variants": [
2128
- "regular"
2129
- ],
2130
- "subsets": [
2131
- "khmer"
2132
- ]
2133
- },
2134
- {
2135
- "kind": "webfonts#webfont",
2136
- "family": "Fresca",
2137
- "variants": [
2138
- "regular"
2139
- ],
2140
- "subsets": [
2141
- "latin",
2142
- "latin-ext"
2143
- ]
2144
- },
2145
- {
2146
- "kind": "webfonts#webfont",
2147
- "family": "Frijole",
2148
- "variants": [
2149
- "regular"
2150
- ],
2151
- "subsets": [
2152
- "latin"
2153
- ]
2154
- },
2155
- {
2156
- "kind": "webfonts#webfont",
2157
- "family": "Fugaz One",
2158
- "variants": [
2159
- "regular"
2160
- ],
2161
- "subsets": [
2162
- "latin"
2163
- ]
2164
- },
2165
- {
2166
- "kind": "webfonts#webfont",
2167
- "family": "GFS Didot",
2168
- "variants": [
2169
- "regular"
2170
- ],
2171
- "subsets": [
2172
- "greek"
2173
- ]
2174
- },
2175
- {
2176
- "kind": "webfonts#webfont",
2177
- "family": "GFS Neohellenic",
2178
- "variants": [
2179
- "regular",
2180
- "italic",
2181
- "700",
2182
- "700italic"
2183
- ],
2184
- "subsets": [
2185
- "greek"
2186
- ]
2187
- },
2188
- {
2189
- "kind": "webfonts#webfont",
2190
- "family": "Galdeano",
2191
- "variants": [
2192
- "regular"
2193
- ],
2194
- "subsets": [
2195
- "latin"
2196
- ]
2197
- },
2198
- {
2199
- "kind": "webfonts#webfont",
2200
- "family": "Gentium Basic",
2201
- "variants": [
2202
- "regular",
2203
- "italic",
2204
- "700",
2205
- "700italic"
2206
- ],
2207
- "subsets": [
2208
- "latin",
2209
- "latin-ext"
2210
- ]
2211
- },
2212
- {
2213
- "kind": "webfonts#webfont",
2214
- "family": "Gentium Book Basic",
2215
- "variants": [
2216
- "regular",
2217
- "italic",
2218
- "700",
2219
- "700italic"
2220
- ],
2221
- "subsets": [
2222
- "latin",
2223
- "latin-ext"
2224
- ]
2225
- },
2226
- {
2227
- "kind": "webfonts#webfont",
2228
- "family": "Geo",
2229
- "variants": [
2230
- "regular"
2231
- ],
2232
- "subsets": [
2233
- "latin"
2234
- ]
2235
- },
2236
- {
2237
- "kind": "webfonts#webfont",
2238
- "family": "Geostar",
2239
- "variants": [
2240
- "regular"
2241
- ],
2242
- "subsets": [
2243
- "latin"
2244
- ]
2245
- },
2246
- {
2247
- "kind": "webfonts#webfont",
2248
- "family": "Geostar Fill",
2249
- "variants": [
2250
- "regular"
2251
- ],
2252
- "subsets": [
2253
- "latin"
2254
- ]
2255
- },
2256
- {
2257
- "kind": "webfonts#webfont",
2258
- "family": "Germania One",
2259
- "variants": [
2260
- "regular"
2261
- ],
2262
- "subsets": [
2263
- "latin"
2264
- ]
2265
- },
2266
- {
2267
- "kind": "webfonts#webfont",
2268
- "family": "Give You Glory",
2269
- "variants": [
2270
- "regular"
2271
- ],
2272
- "subsets": [
2273
- "latin"
2274
- ]
2275
- },
2276
- {
2277
- "kind": "webfonts#webfont",
2278
- "family": "Glass Antiqua",
2279
- "variants": [
2280
- "regular"
2281
- ],
2282
- "subsets": [
2283
- "latin",
2284
- "latin-ext"
2285
- ]
2286
- },
2287
- {
2288
- "kind": "webfonts#webfont",
2289
- "family": "Glegoo",
2290
- "variants": [
2291
- "regular"
2292
- ],
2293
- "subsets": [
2294
- "latin",
2295
- "latin-ext"
2296
- ]
2297
- },
2298
- {
2299
- "kind": "webfonts#webfont",
2300
- "family": "Gloria Hallelujah",
2301
- "variants": [
2302
- "regular"
2303
- ],
2304
- "subsets": [
2305
- "latin"
2306
- ]
2307
- },
2308
- {
2309
- "kind": "webfonts#webfont",
2310
- "family": "Goblin One",
2311
- "variants": [
2312
- "regular"
2313
- ],
2314
- "subsets": [
2315
- "latin"
2316
- ]
2317
- },
2318
- {
2319
- "kind": "webfonts#webfont",
2320
- "family": "Gochi Hand",
2321
- "variants": [
2322
- "regular"
2323
- ],
2324
- "subsets": [
2325
- "latin"
2326
- ]
2327
- },
2328
- {
2329
- "kind": "webfonts#webfont",
2330
- "family": "Gorditas",
2331
- "variants": [
2332
- "regular",
2333
- "700"
2334
- ],
2335
- "subsets": [
2336
- "latin"
2337
- ]
2338
- },
2339
- {
2340
- "kind": "webfonts#webfont",
2341
- "family": "Goudy Bookletter 1911",
2342
- "variants": [
2343
- "regular"
2344
- ],
2345
- "subsets": [
2346
- "latin"
2347
- ]
2348
- },
2349
- {
2350
- "kind": "webfonts#webfont",
2351
- "family": "Graduate",
2352
- "variants": [
2353
- "regular"
2354
- ],
2355
- "subsets": [
2356
- "latin"
2357
- ]
2358
- },
2359
- {
2360
- "kind": "webfonts#webfont",
2361
- "family": "Gravitas One",
2362
- "variants": [
2363
- "regular"
2364
- ],
2365
- "subsets": [
2366
- "latin"
2367
- ]
2368
- },
2369
- {
2370
- "kind": "webfonts#webfont",
2371
- "family": "Great Vibes",
2372
- "variants": [
2373
- "regular"
2374
- ],
2375
- "subsets": [
2376
- "latin",
2377
- "latin-ext"
2378
- ]
2379
- },
2380
- {
2381
- "kind": "webfonts#webfont",
2382
- "family": "Gruppo",
2383
- "variants": [
2384
- "regular"
2385
- ],
2386
- "subsets": [
2387
- "latin",
2388
- "latin-ext"
2389
- ]
2390
- },
2391
- {
2392
- "kind": "webfonts#webfont",
2393
- "family": "Gudea",
2394
- "variants": [
2395
- "regular",
2396
- "italic",
2397
- "700"
2398
- ],
2399
- "subsets": [
2400
- "latin",
2401
- "latin-ext"
2402
- ]
2403
- },
2404
- {
2405
- "kind": "webfonts#webfont",
2406
- "family": "Habibi",
2407
- "variants": [
2408
- "regular"
2409
- ],
2410
- "subsets": [
2411
- "latin",
2412
- "latin-ext"
2413
- ]
2414
- },
2415
- {
2416
- "kind": "webfonts#webfont",
2417
- "family": "Hammersmith One",
2418
- "variants": [
2419
- "regular"
2420
- ],
2421
- "subsets": [
2422
- "latin"
2423
- ]
2424
- },
2425
- {
2426
- "kind": "webfonts#webfont",
2427
- "family": "Handlee",
2428
- "variants": [
2429
- "regular"
2430
- ],
2431
- "subsets": [
2432
- "latin"
2433
- ]
2434
- },
2435
- {
2436
- "kind": "webfonts#webfont",
2437
- "family": "Hanuman",
2438
- "variants": [
2439
- "regular",
2440
- "700"
2441
- ],
2442
- "subsets": [
2443
- "khmer"
2444
- ]
2445
- },
2446
- {
2447
- "kind": "webfonts#webfont",
2448
- "family": "Happy Monkey",
2449
- "variants": [
2450
- "regular"
2451
- ],
2452
- "subsets": [
2453
- "latin",
2454
- "latin-ext"
2455
- ]
2456
- },
2457
- {
2458
- "kind": "webfonts#webfont",
2459
- "family": "Henny Penny",
2460
- "variants": [
2461
- "regular"
2462
- ],
2463
- "subsets": [
2464
- "latin"
2465
- ]
2466
- },
2467
- {
2468
- "kind": "webfonts#webfont",
2469
- "family": "Herr Von Muellerhoff",
2470
- "variants": [
2471
- "regular"
2472
- ],
2473
- "subsets": [
2474
- "latin",
2475
- "latin-ext"
2476
- ]
2477
- },
2478
- {
2479
- "kind": "webfonts#webfont",
2480
- "family": "Holtwood One SC",
2481
- "variants": [
2482
- "regular"
2483
- ],
2484
- "subsets": [
2485
- "latin"
2486
- ]
2487
- },
2488
- {
2489
- "kind": "webfonts#webfont",
2490
- "family": "Homemade Apple",
2491
- "variants": [
2492
- "regular"
2493
- ],
2494
- "subsets": [
2495
- "latin"
2496
- ]
2497
- },
2498
- {
2499
- "kind": "webfonts#webfont",
2500
- "family": "Homenaje",
2501
- "variants": [
2502
- "regular"
2503
- ],
2504
- "subsets": [
2505
- "latin"
2506
- ]
2507
- },
2508
- {
2509
- "kind": "webfonts#webfont",
2510
- "family": "IM Fell DW Pica",
2511
- "variants": [
2512
- "regular",
2513
- "italic"
2514
- ],
2515
- "subsets": [
2516
- "latin"
2517
- ]
2518
- },
2519
- {
2520
- "kind": "webfonts#webfont",
2521
- "family": "IM Fell DW Pica SC",
2522
- "variants": [
2523
- "regular"
2524
- ],
2525
- "subsets": [
2526
- "latin"
2527
- ]
2528
- },
2529
- {
2530
- "kind": "webfonts#webfont",
2531
- "family": "IM Fell Double Pica",
2532
- "variants": [
2533
- "regular",
2534
- "italic"
2535
- ],
2536
- "subsets": [
2537
- "latin"
2538
- ]
2539
- },
2540
- {
2541
- "kind": "webfonts#webfont",
2542
- "family": "IM Fell Double Pica SC",
2543
- "variants": [
2544
- "regular"
2545
- ],
2546
- "subsets": [
2547
- "latin"
2548
- ]
2549
- },
2550
- {
2551
- "kind": "webfonts#webfont",
2552
- "family": "IM Fell English",
2553
- "variants": [
2554
- "regular",
2555
- "italic"
2556
- ],
2557
- "subsets": [
2558
- "latin"
2559
- ]
2560
- },
2561
- {
2562
- "kind": "webfonts#webfont",
2563
- "family": "IM Fell English SC",
2564
- "variants": [
2565
- "regular"
2566
- ],
2567
- "subsets": [
2568
- "latin"
2569
- ]
2570
- },
2571
- {
2572
- "kind": "webfonts#webfont",
2573
- "family": "IM Fell French Canon",
2574
- "variants": [
2575
- "regular",
2576
- "italic"
2577
- ],
2578
- "subsets": [
2579
- "latin"
2580
- ]
2581
- },
2582
- {
2583
- "kind": "webfonts#webfont",
2584
- "family": "IM Fell French Canon SC",
2585
- "variants": [
2586
- "regular"
2587
- ],
2588
- "subsets": [
2589
- "latin"
2590
- ]
2591
- },
2592
- {
2593
- "kind": "webfonts#webfont",
2594
- "family": "IM Fell Great Primer",
2595
- "variants": [
2596
- "regular",
2597
- "italic"
2598
- ],
2599
- "subsets": [
2600
- "latin"
2601
- ]
2602
- },
2603
- {
2604
- "kind": "webfonts#webfont",
2605
- "family": "IM Fell Great Primer SC",
2606
- "variants": [
2607
- "regular"
2608
- ],
2609
- "subsets": [
2610
- "latin"
2611
- ]
2612
- },
2613
- {
2614
- "kind": "webfonts#webfont",
2615
- "family": "Iceberg",
2616
- "variants": [
2617
- "regular"
2618
- ],
2619
- "subsets": [
2620
- "latin"
2621
- ]
2622
- },
2623
- {
2624
- "kind": "webfonts#webfont",
2625
- "family": "Iceland",
2626
- "variants": [
2627
- "regular"
2628
- ],
2629
- "subsets": [
2630
- "latin"
2631
- ]
2632
- },
2633
- {
2634
- "kind": "webfonts#webfont",
2635
- "family": "Imprima",
2636
- "variants": [
2637
- "regular"
2638
- ],
2639
- "subsets": [
2640
- "latin",
2641
- "latin-ext"
2642
- ]
2643
- },
2644
- {
2645
- "kind": "webfonts#webfont",
2646
- "family": "Inconsolata",
2647
- "variants": [
2648
- "regular"
2649
- ],
2650
- "subsets": [
2651
- "latin"
2652
- ]
2653
- },
2654
- {
2655
- "kind": "webfonts#webfont",
2656
- "family": "Inder",
2657
- "variants": [
2658
- "regular"
2659
- ],
2660
- "subsets": [
2661
- "latin",
2662
- "latin-ext"
2663
- ]
2664
- },
2665
- {
2666
- "kind": "webfonts#webfont",
2667
- "family": "Indie Flower",
2668
- "variants": [
2669
- "regular"
2670
- ],
2671
- "subsets": [
2672
- "latin"
2673
- ]
2674
- },
2675
- {
2676
- "kind": "webfonts#webfont",
2677
- "family": "Inika",
2678
- "variants": [
2679
- "regular",
2680
- "700"
2681
- ],
2682
- "subsets": [
2683
- "latin",
2684
- "latin-ext"
2685
- ]
2686
- },
2687
- {
2688
- "kind": "webfonts#webfont",
2689
- "family": "Irish Grover",
2690
- "variants": [
2691
- "regular"
2692
- ],
2693
- "subsets": [
2694
- "latin"
2695
- ]
2696
- },
2697
- {
2698
- "kind": "webfonts#webfont",
2699
- "family": "Istok Web",
2700
- "variants": [
2701
- "regular",
2702
- "italic",
2703
- "700",
2704
- "700italic"
2705
- ],
2706
- "subsets": [
2707
- "latin",
2708
- "cyrillic-ext",
2709
- "latin-ext",
2710
- "cyrillic"
2711
- ]
2712
- },
2713
- {
2714
- "kind": "webfonts#webfont",
2715
- "family": "Italiana",
2716
- "variants": [
2717
- "regular"
2718
- ],
2719
- "subsets": [
2720
- "latin"
2721
- ]
2722
- },
2723
- {
2724
- "kind": "webfonts#webfont",
2725
- "family": "Italianno",
2726
- "variants": [
2727
- "regular"
2728
- ],
2729
- "subsets": [
2730
- "latin",
2731
- "latin-ext"
2732
- ]
2733
- },
2734
- {
2735
- "kind": "webfonts#webfont",
2736
- "family": "Jim Nightshade",
2737
- "variants": [
2738
- "regular"
2739
- ],
2740
- "subsets": [
2741
- "latin",
2742
- "latin-ext"
2743
- ]
2744
- },
2745
- {
2746
- "kind": "webfonts#webfont",
2747
- "family": "Jockey One",
2748
- "variants": [
2749
- "regular"
2750
- ],
2751
- "subsets": [
2752
- "latin",
2753
- "latin-ext"
2754
- ]
2755
- },
2756
- {
2757
- "kind": "webfonts#webfont",
2758
- "family": "Jolly Lodger",
2759
- "variants": [
2760
- "regular"
2761
- ],
2762
- "subsets": [
2763
- "latin",
2764
- "latin-ext"
2765
- ]
2766
- },
2767
- {
2768
- "kind": "webfonts#webfont",
2769
- "family": "Josefin Sans",
2770
- "variants": [
2771
- "100",
2772
- "100italic",
2773
- "300",
2774
- "300italic",
2775
- "regular",
2776
- "italic",
2777
- "600",
2778
- "600italic",
2779
- "700",
2780
- "700italic"
2781
- ],
2782
- "subsets": [
2783
- "latin"
2784
- ]
2785
- },
2786
- {
2787
- "kind": "webfonts#webfont",
2788
- "family": "Josefin Slab",
2789
- "variants": [
2790
- "100",
2791
- "100italic",
2792
- "300",
2793
- "300italic",
2794
- "regular",
2795
- "italic",
2796
- "600",
2797
- "600italic",
2798
- "700",
2799
- "700italic"
2800
- ],
2801
- "subsets": [
2802
- "latin"
2803
- ]
2804
- },
2805
- {
2806
- "kind": "webfonts#webfont",
2807
- "family": "Judson",
2808
- "variants": [
2809
- "regular",
2810
- "italic",
2811
- "700"
2812
- ],
2813
- "subsets": [
2814
- "latin"
2815
- ]
2816
- },
2817
- {
2818
- "kind": "webfonts#webfont",
2819
- "family": "Julee",
2820
- "variants": [
2821
- "regular"
2822
- ],
2823
- "subsets": [
2824
- "latin"
2825
- ]
2826
- },
2827
- {
2828
- "kind": "webfonts#webfont",
2829
- "family": "Junge",
2830
- "variants": [
2831
- "regular"
2832
- ],
2833
- "subsets": [
2834
- "latin"
2835
- ]
2836
- },
2837
- {
2838
- "kind": "webfonts#webfont",
2839
- "family": "Jura",
2840
- "variants": [
2841
- "300",
2842
- "regular",
2843
- "500",
2844
- "600"
2845
- ],
2846
- "subsets": [
2847
- "greek-ext",
2848
- "latin",
2849
- "cyrillic-ext",
2850
- "latin-ext",
2851
- "cyrillic",
2852
- "greek"
2853
- ]
2854
- },
2855
- {
2856
- "kind": "webfonts#webfont",
2857
- "family": "Just Another Hand",
2858
- "variants": [
2859
- "regular"
2860
- ],
2861
- "subsets": [
2862
- "latin"
2863
- ]
2864
- },
2865
- {
2866
- "kind": "webfonts#webfont",
2867
- "family": "Just Me Again Down Here",
2868
- "variants": [
2869
- "regular"
2870
- ],
2871
- "subsets": [
2872
- "latin"
2873
- ]
2874
- },
2875
- {
2876
- "kind": "webfonts#webfont",
2877
- "family": "Kameron",
2878
- "variants": [
2879
- "regular",
2880
- "700"
2881
- ],
2882
- "subsets": [
2883
- "latin"
2884
- ]
2885
- },
2886
- {
2887
- "kind": "webfonts#webfont",
2888
- "family": "Karla",
2889
- "variants": [
2890
- "regular",
2891
- "italic",
2892
- "700",
2893
- "700italic"
2894
- ],
2895
- "subsets": [
2896
- "latin"
2897
- ]
2898
- },
2899
- {
2900
- "kind": "webfonts#webfont",
2901
- "family": "Kaushan Script",
2902
- "variants": [
2903
- "regular"
2904
- ],
2905
- "subsets": [
2906
- "latin",
2907
- "latin-ext"
2908
- ]
2909
- },
2910
- {
2911
- "kind": "webfonts#webfont",
2912
- "family": "Kelly Slab",
2913
- "variants": [
2914
- "regular"
2915
- ],
2916
- "subsets": [
2917
- "latin",
2918
- "latin-ext",
2919
- "cyrillic"
2920
- ]
2921
- },
2922
- {
2923
- "kind": "webfonts#webfont",
2924
- "family": "Kenia",
2925
- "variants": [
2926
- "regular"
2927
- ],
2928
- "subsets": [
2929
- "latin"
2930
- ]
2931
- },
2932
- {
2933
- "kind": "webfonts#webfont",
2934
- "family": "Khmer",
2935
- "variants": [
2936
- "regular"
2937
- ],
2938
- "subsets": [
2939
- "khmer"
2940
- ]
2941
- },
2942
- {
2943
- "kind": "webfonts#webfont",
2944
- "family": "Knewave",
2945
- "variants": [
2946
- "regular"
2947
- ],
2948
- "subsets": [
2949
- "latin",
2950
- "latin-ext"
2951
- ]
2952
- },
2953
- {
2954
- "kind": "webfonts#webfont",
2955
- "family": "Kotta One",
2956
- "variants": [
2957
- "regular"
2958
- ],
2959
- "subsets": [
2960
- "latin",
2961
- "latin-ext"
2962
- ]
2963
- },
2964
- {
2965
- "kind": "webfonts#webfont",
2966
- "family": "Koulen",
2967
- "variants": [
2968
- "regular"
2969
- ],
2970
- "subsets": [
2971
- "khmer"
2972
- ]
2973
- },
2974
- {
2975
- "kind": "webfonts#webfont",
2976
- "family": "Kranky",
2977
- "variants": [
2978
- "regular"
2979
- ],
2980
- "subsets": [
2981
- "latin"
2982
- ]
2983
- },
2984
- {
2985
- "kind": "webfonts#webfont",
2986
- "family": "Kreon",
2987
- "variants": [
2988
- "300",
2989
- "regular",
2990
- "700"
2991
- ],
2992
- "subsets": [
2993
- "latin"
2994
- ]
2995
- },
2996
- {
2997
- "kind": "webfonts#webfont",
2998
- "family": "Kristi",
2999
- "variants": [
3000
- "regular"
3001
- ],
3002
- "subsets": [
3003
- "latin"
3004
- ]
3005
- },
3006
- {
3007
- "kind": "webfonts#webfont",
3008
- "family": "Krona One",
3009
- "variants": [
3010
- "regular"
3011
- ],
3012
- "subsets": [
3013
- "latin",
3014
- "latin-ext"
3015
- ]
3016
- },
3017
- {
3018
- "kind": "webfonts#webfont",
3019
- "family": "La Belle Aurore",
3020
- "variants": [
3021
- "regular"
3022
- ],
3023
- "subsets": [
3024
- "latin"
3025
- ]
3026
- },
3027
- {
3028
- "kind": "webfonts#webfont",
3029
- "family": "Lancelot",
3030
- "variants": [
3031
- "regular"
3032
- ],
3033
- "subsets": [
3034
- "latin"
3035
- ]
3036
- },
3037
- {
3038
- "kind": "webfonts#webfont",
3039
- "family": "Lato",
3040
- "variants": [
3041
- "100",
3042
- "100italic",
3043
- "300",
3044
- "300italic",
3045
- "regular",
3046
- "italic",
3047
- "700",
3048
- "700italic",
3049
- "900",
3050
- "900italic"
3051
- ],
3052
- "subsets": [
3053
- "latin"
3054
- ]
3055
- },
3056
- {
3057
- "kind": "webfonts#webfont",
3058
- "family": "League Script",
3059
- "variants": [
3060
- "regular"
3061
- ],
3062
- "subsets": [
3063
- "latin"
3064
- ]
3065
- },
3066
- {
3067
- "kind": "webfonts#webfont",
3068
- "family": "Leckerli One",
3069
- "variants": [
3070
- "regular"
3071
- ],
3072
- "subsets": [
3073
- "latin"
3074
- ]
3075
- },
3076
- {
3077
- "kind": "webfonts#webfont",
3078
- "family": "Ledger",
3079
- "variants": [
3080
- "regular"
3081
- ],
3082
- "subsets": [
3083
- "latin",
3084
- "latin-ext",
3085
- "cyrillic"
3086
- ]
3087
- },
3088
- {
3089
- "kind": "webfonts#webfont",
3090
- "family": "Lekton",
3091
- "variants": [
3092
- "regular",
3093
- "italic",
3094
- "700"
3095
- ],
3096
- "subsets": [
3097
- "latin"
3098
- ]
3099
- },
3100
- {
3101
- "kind": "webfonts#webfont",
3102
- "family": "Lemon",
3103
- "variants": [
3104
- "regular"
3105
- ],
3106
- "subsets": [
3107
- "latin"
3108
- ]
3109
- },
3110
- {
3111
- "kind": "webfonts#webfont",
3112
- "family": "Lilita One",
3113
- "variants": [
3114
- "regular"
3115
- ],
3116
- "subsets": [
3117
- "latin",
3118
- "latin-ext"
3119
- ]
3120
- },
3121
- {
3122
- "kind": "webfonts#webfont",
3123
- "family": "Limelight",
3124
- "variants": [
3125
- "regular"
3126
- ],
3127
- "subsets": [
3128
- "latin"
3129
- ]
3130
- },
3131
- {
3132
- "kind": "webfonts#webfont",
3133
- "family": "Linden Hill",
3134
- "variants": [
3135
- "regular",
3136
- "italic"
3137
- ],
3138
- "subsets": [
3139
- "latin"
3140
- ]
3141
- },
3142
- {
3143
- "kind": "webfonts#webfont",
3144
- "family": "Lobster",
3145
- "variants": [
3146
- "regular"
3147
- ],
3148
- "subsets": [
3149
- "latin",
3150
- "cyrillic-ext",
3151
- "latin-ext",
3152
- "cyrillic"
3153
- ]
3154
- },
3155
- {
3156
- "kind": "webfonts#webfont",
3157
- "family": "Lobster Two",
3158
- "variants": [
3159
- "regular",
3160
- "italic",
3161
- "700",
3162
- "700italic"
3163
- ],
3164
- "subsets": [
3165
- "latin"
3166
- ]
3167
- },
3168
- {
3169
- "kind": "webfonts#webfont",
3170
- "family": "Londrina Outline",
3171
- "variants": [
3172
- "regular"
3173
- ],
3174
- "subsets": [
3175
- "latin"
3176
- ]
3177
- },
3178
- {
3179
- "kind": "webfonts#webfont",
3180
- "family": "Londrina Shadow",
3181
- "variants": [
3182
- "regular"
3183
- ],
3184
- "subsets": [
3185
- "latin"
3186
- ]
3187
- },
3188
- {
3189
- "kind": "webfonts#webfont",
3190
- "family": "Londrina Sketch",
3191
- "variants": [
3192
- "regular"
3193
- ],
3194
- "subsets": [
3195
- "latin"
3196
- ]
3197
- },
3198
- {
3199
- "kind": "webfonts#webfont",
3200
- "family": "Londrina Solid",
3201
- "variants": [
3202
- "regular"
3203
- ],
3204
- "subsets": [
3205
- "latin"
3206
- ]
3207
- },
3208
- {
3209
- "kind": "webfonts#webfont",
3210
- "family": "Lora",
3211
- "variants": [
3212
- "regular",
3213
- "italic",
3214
- "700",
3215
- "700italic"
3216
- ],
3217
- "subsets": [
3218
- "latin"
3219
- ]
3220
- },
3221
- {
3222
- "kind": "webfonts#webfont",
3223
- "family": "Love Ya Like A Sister",
3224
- "variants": [
3225
- "regular"
3226
- ],
3227
- "subsets": [
3228
- "latin"
3229
- ]
3230
- },
3231
- {
3232
- "kind": "webfonts#webfont",
3233
- "family": "Loved by the King",
3234
- "variants": [
3235
- "regular"
3236
- ],
3237
- "subsets": [
3238
- "latin"
3239
- ]
3240
- },
3241
- {
3242
- "kind": "webfonts#webfont",
3243
- "family": "Lovers Quarrel",
3244
- "variants": [
3245
- "regular"
3246
- ],
3247
- "subsets": [
3248
- "latin",
3249
- "latin-ext"
3250
- ]
3251
- },
3252
- {
3253
- "kind": "webfonts#webfont",
3254
- "family": "Luckiest Guy",
3255
- "variants": [
3256
- "regular"
3257
- ],
3258
- "subsets": [
3259
- "latin"
3260
- ]
3261
- },
3262
- {
3263
- "kind": "webfonts#webfont",
3264
- "family": "Lusitana",
3265
- "variants": [
3266
- "regular",
3267
- "700"
3268
- ],
3269
- "subsets": [
3270
- "latin"
3271
- ]
3272
- },
3273
- {
3274
- "kind": "webfonts#webfont",
3275
- "family": "Lustria",
3276
- "variants": [
3277
- "regular"
3278
- ],
3279
- "subsets": [
3280
- "latin"
3281
- ]
3282
- },
3283
- {
3284
- "kind": "webfonts#webfont",
3285
- "family": "Macondo",
3286
- "variants": [
3287
- "regular"
3288
- ],
3289
- "subsets": [
3290
- "latin"
3291
- ]
3292
- },
3293
- {
3294
- "kind": "webfonts#webfont",
3295
- "family": "Macondo Swash Caps",
3296
- "variants": [
3297
- "regular"
3298
- ],
3299
- "subsets": [
3300
- "latin"
3301
- ]
3302
- },
3303
- {
3304
- "kind": "webfonts#webfont",
3305
- "family": "Magra",
3306
- "variants": [
3307
- "regular",
3308
- "700"
3309
- ],
3310
- "subsets": [
3311
- "latin",
3312
- "latin-ext"
3313
- ]
3314
- },
3315
- {
3316
- "kind": "webfonts#webfont",
3317
- "family": "Maiden Orange",
3318
- "variants": [
3319
- "regular"
3320
- ],
3321
- "subsets": [
3322
- "latin"
3323
- ]
3324
- },
3325
- {
3326
- "kind": "webfonts#webfont",
3327
- "family": "Mako",
3328
- "variants": [
3329
- "regular"
3330
- ],
3331
- "subsets": [
3332
- "latin"
3333
- ]
3334
- },
3335
- {
3336
- "kind": "webfonts#webfont",
3337
- "family": "Marck Script",
3338
- "variants": [
3339
- "regular"
3340
- ],
3341
- "subsets": [
3342
- "latin",
3343
- "latin-ext",
3344
- "cyrillic"
3345
- ]
3346
- },
3347
- {
3348
- "kind": "webfonts#webfont",
3349
- "family": "Marko One",
3350
- "variants": [
3351
- "regular"
3352
- ],
3353
- "subsets": [
3354
- "latin"
3355
- ]
3356
- },
3357
- {
3358
- "kind": "webfonts#webfont",
3359
- "family": "Marmelad",
3360
- "variants": [
3361
- "regular"
3362
- ],
3363
- "subsets": [
3364
- "latin",
3365
- "latin-ext",
3366
- "cyrillic"
3367
- ]
3368
- },
3369
- {
3370
- "kind": "webfonts#webfont",
3371
- "family": "Marvel",
3372
- "variants": [
3373
- "regular",
3374
- "italic",
3375
- "700",
3376
- "700italic"
3377
- ],
3378
- "subsets": [
3379
- "latin"
3380
- ]
3381
- },
3382
- {
3383
- "kind": "webfonts#webfont",
3384
- "family": "Mate",
3385
- "variants": [
3386
- "regular",
3387
- "italic"
3388
- ],
3389
- "subsets": [
3390
- "latin"
3391
- ]
3392
- },
3393
- {
3394
- "kind": "webfonts#webfont",
3395
- "family": "Mate SC",
3396
- "variants": [
3397
- "regular"
3398
- ],
3399
- "subsets": [
3400
- "latin"
3401
- ]
3402
- },
3403
- {
3404
- "kind": "webfonts#webfont",
3405
- "family": "Maven Pro",
3406
- "variants": [
3407
- "regular",
3408
- "500",
3409
- "700",
3410
- "900"
3411
- ],
3412
- "subsets": [
3413
- "latin"
3414
- ]
3415
- },
3416
- {
3417
- "kind": "webfonts#webfont",
3418
- "family": "Meddon",
3419
- "variants": [
3420
- "regular"
3421
- ],
3422
- "subsets": [
3423
- "latin"
3424
- ]
3425
- },
3426
- {
3427
- "kind": "webfonts#webfont",
3428
- "family": "MedievalSharp",
3429
- "variants": [
3430
- "regular"
3431
- ],
3432
- "subsets": [
3433
- "latin",
3434
- "latin-ext"
3435
- ]
3436
- },
3437
- {
3438
- "kind": "webfonts#webfont",
3439
- "family": "Medula One",
3440
- "variants": [
3441
- "regular"
3442
- ],
3443
- "subsets": [
3444
- "latin"
3445
- ]
3446
- },
3447
- {
3448
- "kind": "webfonts#webfont",
3449
- "family": "Megrim",
3450
- "variants": [
3451
- "regular"
3452
- ],
3453
- "subsets": [
3454
- "latin"
3455
- ]
3456
- },
3457
- {
3458
- "kind": "webfonts#webfont",
3459
- "family": "Merienda One",
3460
- "variants": [
3461
- "regular"
3462
- ],
3463
- "subsets": [
3464
- "latin"
3465
- ]
3466
- },
3467
- {
3468
- "kind": "webfonts#webfont",
3469
- "family": "Merriweather",
3470
- "variants": [
3471
- "300",
3472
- "regular",
3473
- "700",
3474
- "900"
3475
- ],
3476
- "subsets": [
3477
- "latin"
3478
- ]
3479
- },
3480
- {
3481
- "kind": "webfonts#webfont",
3482
- "family": "Metal",
3483
- "variants": [
3484
- "regular"
3485
- ],
3486
- "subsets": [
3487
- "khmer"
3488
- ]
3489
- },
3490
- {
3491
- "kind": "webfonts#webfont",
3492
- "family": "Metal Mania",
3493
- "variants": [
3494
- "regular"
3495
- ],
3496
- "subsets": [
3497
- "latin",
3498
- "latin-ext"
3499
- ]
3500
- },
3501
- {
3502
- "kind": "webfonts#webfont",
3503
- "family": "Metamorphous",
3504
- "variants": [
3505
- "regular"
3506
- ],
3507
- "subsets": [
3508
- "latin",
3509
- "latin-ext"
3510
- ]
3511
- },
3512
- {
3513
- "kind": "webfonts#webfont",
3514
- "family": "Metrophobic",
3515
- "variants": [
3516
- "regular"
3517
- ],
3518
- "subsets": [
3519
- "latin"
3520
- ]
3521
- },
3522
- {
3523
- "kind": "webfonts#webfont",
3524
- "family": "Michroma",
3525
- "variants": [
3526
- "regular"
3527
- ],
3528
- "subsets": [
3529
- "latin"
3530
- ]
3531
- },
3532
- {
3533
- "kind": "webfonts#webfont",
3534
- "family": "Miltonian",
3535
- "variants": [
3536
- "regular"
3537
- ],
3538
- "subsets": [
3539
- "latin"
3540
- ]
3541
- },
3542
- {
3543
- "kind": "webfonts#webfont",
3544
- "family": "Miltonian Tattoo",
3545
- "variants": [
3546
- "regular"
3547
- ],
3548
- "subsets": [
3549
- "latin"
3550
- ]
3551
- },
3552
- {
3553
- "kind": "webfonts#webfont",
3554
- "family": "Miniver",
3555
- "variants": [
3556
- "regular"
3557
- ],
3558
- "subsets": [
3559
- "latin"
3560
- ]
3561
- },
3562
- {
3563
- "kind": "webfonts#webfont",
3564
- "family": "Miss Fajardose",
3565
- "variants": [
3566
- "regular"
3567
- ],
3568
- "subsets": [
3569
- "latin",
3570
- "latin-ext"
3571
- ]
3572
- },
3573
- {
3574
- "kind": "webfonts#webfont",
3575
- "family": "Modern Antiqua",
3576
- "variants": [
3577
- "regular"
3578
- ],
3579
- "subsets": [
3580
- "latin",
3581
- "latin-ext"
3582
- ]
3583
- },
3584
- {
3585
- "kind": "webfonts#webfont",
3586
- "family": "Molengo",
3587
- "variants": [
3588
- "regular"
3589
- ],
3590
- "subsets": [
3591
- "latin",
3592
- "latin-ext"
3593
- ]
3594
- },
3595
- {
3596
- "kind": "webfonts#webfont",
3597
- "family": "Monofett",
3598
- "variants": [
3599
- "regular"
3600
- ],
3601
- "subsets": [
3602
- "latin"
3603
- ]
3604
- },
3605
- {
3606
- "kind": "webfonts#webfont",
3607
- "family": "Monoton",
3608
- "variants": [
3609
- "regular"
3610
- ],
3611
- "subsets": [
3612
- "latin"
3613
- ]
3614
- },
3615
- {
3616
- "kind": "webfonts#webfont",
3617
- "family": "Monsieur La Doulaise",
3618
- "variants": [
3619
- "regular"
3620
- ],
3621
- "subsets": [
3622
- "latin",
3623
- "latin-ext"
3624
- ]
3625
- },
3626
- {
3627
- "kind": "webfonts#webfont",
3628
- "family": "Montaga",
3629
- "variants": [
3630
- "regular"
3631
- ],
3632
- "subsets": [
3633
- "latin"
3634
- ]
3635
- },
3636
- {
3637
- "kind": "webfonts#webfont",
3638
- "family": "Montez",
3639
- "variants": [
3640
- "regular"
3641
- ],
3642
- "subsets": [
3643
- "latin"
3644
- ]
3645
- },
3646
- {
3647
- "kind": "webfonts#webfont",
3648
- "family": "Montserrat",
3649
- "variants": [
3650
- "regular"
3651
- ],
3652
- "subsets": [
3653
- "latin"
3654
- ]
3655
- },
3656
- {
3657
- "kind": "webfonts#webfont",
3658
- "family": "Moul",
3659
- "variants": [
3660
- "regular"
3661
- ],
3662
- "subsets": [
3663
- "khmer"
3664
- ]
3665
- },
3666
- {
3667
- "kind": "webfonts#webfont",
3668
- "family": "Moulpali",
3669
- "variants": [
3670
- "regular"
3671
- ],
3672
- "subsets": [
3673
- "khmer"
3674
- ]
3675
- },
3676
- {
3677
- "kind": "webfonts#webfont",
3678
- "family": "Mountains of Christmas",
3679
- "variants": [
3680
- "regular",
3681
- "700"
3682
- ],
3683
- "subsets": [
3684
- "latin"
3685
- ]
3686
- },
3687
- {
3688
- "kind": "webfonts#webfont",
3689
- "family": "Mr Bedfort",
3690
- "variants": [
3691
- "regular"
3692
- ],
3693
- "subsets": [
3694
- "latin",
3695
- "latin-ext"
3696
- ]
3697
- },
3698
- {
3699
- "kind": "webfonts#webfont",
3700
- "family": "Mr Dafoe",
3701
- "variants": [
3702
- "regular"
3703
- ],
3704
- "subsets": [
3705
- "latin",
3706
- "latin-ext"
3707
- ]
3708
- },
3709
- {
3710
- "kind": "webfonts#webfont",
3711
- "family": "Mr De Haviland",
3712
- "variants": [
3713
- "regular"
3714
- ],
3715
- "subsets": [
3716
- "latin",
3717
- "latin-ext"
3718
- ]
3719
- },
3720
- {
3721
- "kind": "webfonts#webfont",
3722
- "family": "Mrs Saint Delafield",
3723
- "variants": [
3724
- "regular"
3725
- ],
3726
- "subsets": [
3727
- "latin",
3728
- "latin-ext"
3729
- ]
3730
- },
3731
- {
3732
- "kind": "webfonts#webfont",
3733
- "family": "Mrs Sheppards",
3734
- "variants": [
3735
- "regular"
3736
- ],
3737
- "subsets": [
3738
- "latin",
3739
- "latin-ext"
3740
- ]
3741
- },
3742
- {
3743
- "kind": "webfonts#webfont",
3744
- "family": "Muli",
3745
- "variants": [
3746
- "300",
3747
- "300italic",
3748
- "regular",
3749
- "italic"
3750
- ],
3751
- "subsets": [
3752
- "latin"
3753
- ]
3754
- },
3755
- {
3756
- "kind": "webfonts#webfont",
3757
- "family": "Mystery Quest",
3758
- "variants": [
3759
- "regular"
3760
- ],
3761
- "subsets": [
3762
- "latin",
3763
- "latin-ext"
3764
- ]
3765
- },
3766
- {
3767
- "kind": "webfonts#webfont",
3768
- "family": "Neucha",
3769
- "variants": [
3770
- "regular"
3771
- ],
3772
- "subsets": [
3773
- "latin",
3774
- "cyrillic"
3775
- ]
3776
- },
3777
- {
3778
- "kind": "webfonts#webfont",
3779
- "family": "Neuton",
3780
- "variants": [
3781
- "200",
3782
- "300",
3783
- "regular",
3784
- "italic",
3785
- "700",
3786
- "800"
3787
- ],
3788
- "subsets": [
3789
- "latin",
3790
- "latin-ext"
3791
- ]
3792
- },
3793
- {
3794
- "kind": "webfonts#webfont",
3795
- "family": "News Cycle",
3796
- "variants": [
3797
- "regular",
3798
- "700"
3799
- ],
3800
- "subsets": [
3801
- "latin"
3802
- ]
3803
- },
3804
- {
3805
- "kind": "webfonts#webfont",
3806
- "family": "Niconne",
3807
- "variants": [
3808
- "regular"
3809
- ],
3810
- "subsets": [
3811
- "latin",
3812
- "latin-ext"
3813
- ]
3814
- },
3815
- {
3816
- "kind": "webfonts#webfont",
3817
- "family": "Nixie One",
3818
- "variants": [
3819
- "regular"
3820
- ],
3821
- "subsets": [
3822
- "latin"
3823
- ]
3824
- },
3825
- {
3826
- "kind": "webfonts#webfont",
3827
- "family": "Nobile",
3828
- "variants": [
3829
- "regular",
3830
- "italic",
3831
- "700",
3832
- "700italic"
3833
- ],
3834
- "subsets": [
3835
- "latin"
3836
- ]
3837
- },
3838
- {
3839
- "kind": "webfonts#webfont",
3840
- "family": "Nokora",
3841
- "variants": [
3842
- "regular",
3843
- "700"
3844
- ],
3845
- "subsets": [
3846
- "khmer"
3847
- ]
3848
- },
3849
- {
3850
- "kind": "webfonts#webfont",
3851
- "family": "Norican",
3852
- "variants": [
3853
- "regular"
3854
- ],
3855
- "subsets": [
3856
- "latin",
3857
- "latin-ext"
3858
- ]
3859
- },
3860
- {
3861
- "kind": "webfonts#webfont",
3862
- "family": "Nosifer",
3863
- "variants": [
3864
- "regular"
3865
- ],
3866
- "subsets": [
3867
- "latin",
3868
- "latin-ext"
3869
- ]
3870
- },
3871
- {
3872
- "kind": "webfonts#webfont",
3873
- "family": "Nothing You Could Do",
3874
- "variants": [
3875
- "regular"
3876
- ],
3877
- "subsets": [
3878
- "latin"
3879
- ]
3880
- },
3881
- {
3882
- "kind": "webfonts#webfont",
3883
- "family": "Noticia Text",
3884
- "variants": [
3885
- "regular",
3886
- "italic",
3887
- "700",
3888
- "700italic"
3889
- ],
3890
- "subsets": [
3891
- "latin",
3892
- "vietnamese",
3893
- "latin-ext"
3894
- ]
3895
- },
3896
- {
3897
- "kind": "webfonts#webfont",
3898
- "family": "Nova Cut",
3899
- "variants": [
3900
- "regular"
3901
- ],
3902
- "subsets": [
3903
- "latin"
3904
- ]
3905
- },
3906
- {
3907
- "kind": "webfonts#webfont",
3908
- "family": "Nova Flat",
3909
- "variants": [
3910
- "regular"
3911
- ],
3912
- "subsets": [
3913
- "latin"
3914
- ]
3915
- },
3916
- {
3917
- "kind": "webfonts#webfont",
3918
- "family": "Nova Mono",
3919
- "variants": [
3920
- "regular"
3921
- ],
3922
- "subsets": [
3923
- "latin",
3924
- "greek"
3925
- ]
3926
- },
3927
- {
3928
- "kind": "webfonts#webfont",
3929
- "family": "Nova Oval",
3930
- "variants": [
3931
- "regular"
3932
- ],
3933
- "subsets": [
3934
- "latin"
3935
- ]
3936
- },
3937
- {
3938
- "kind": "webfonts#webfont",
3939
- "family": "Nova Round",
3940
- "variants": [
3941
- "regular"
3942
- ],
3943
- "subsets": [
3944
- "latin"
3945
- ]
3946
- },
3947
- {
3948
- "kind": "webfonts#webfont",
3949
- "family": "Nova Script",
3950
- "variants": [
3951
- "regular"
3952
- ],
3953
- "subsets": [
3954
- "latin"
3955
- ]
3956
- },
3957
- {
3958
- "kind": "webfonts#webfont",
3959
- "family": "Nova Slim",
3960
- "variants": [
3961
- "regular"
3962
- ],
3963
- "subsets": [
3964
- "latin"
3965
- ]
3966
- },
3967
- {
3968
- "kind": "webfonts#webfont",
3969
- "family": "Nova Square",
3970
- "variants": [
3971
- "regular"
3972
- ],
3973
- "subsets": [
3974
- "latin"
3975
- ]
3976
- },
3977
- {
3978
- "kind": "webfonts#webfont",
3979
- "family": "Numans",
3980
- "variants": [
3981
- "regular"
3982
- ],
3983
- "subsets": [
3984
- "latin"
3985
- ]
3986
- },
3987
- {
3988
- "kind": "webfonts#webfont",
3989
- "family": "Nunito",
3990
- "variants": [
3991
- "300",
3992
- "regular",
3993
- "700"
3994
- ],
3995
- "subsets": [
3996
- "latin"
3997
- ]
3998
- },
3999
- {
4000
- "kind": "webfonts#webfont",
4001
- "family": "Odor Mean Chey",
4002
- "variants": [
4003
- "regular"
4004
- ],
4005
- "subsets": [
4006
- "khmer"
4007
- ]
4008
- },
4009
- {
4010
- "kind": "webfonts#webfont",
4011
- "family": "Old Standard TT",
4012
- "variants": [
4013
- "regular",
4014
- "italic",
4015
- "700"
4016
- ],
4017
- "subsets": [
4018
- "latin"
4019
- ]
4020
- },
4021
- {
4022
- "kind": "webfonts#webfont",
4023
- "family": "Oldenburg",
4024
- "variants": [
4025
- "regular"
4026
- ],
4027
- "subsets": [
4028
- "latin",
4029
- "latin-ext"
4030
- ]
4031
- },
4032
- {
4033
- "kind": "webfonts#webfont",
4034
- "family": "Oleo Script",
4035
- "variants": [
4036
- "regular",
4037
- "700"
4038
- ],
4039
- "subsets": [
4040
- "latin",
4041
- "latin-ext"
4042
- ]
4043
- },
4044
- {
4045
- "kind": "webfonts#webfont",
4046
- "family": "Open Sans",
4047
- "variants": [
4048
- "300",
4049
- "300italic",
4050
- "regular",
4051
- "italic",
4052
- "600",
4053
- "600italic",
4054
- "700",
4055
- "700italic",
4056
- "800",
4057
- "800italic"
4058
- ],
4059
- "subsets": [
4060
- "greek-ext",
4061
- "latin",
4062
- "vietnamese",
4063
- "cyrillic-ext",
4064
- "latin-ext",
4065
- "cyrillic",
4066
- "greek"
4067
- ]
4068
- },
4069
- {
4070
- "kind": "webfonts#webfont",
4071
- "family": "Open Sans Condensed",
4072
- "variants": [
4073
- "300",
4074
- "300italic",
4075
- "700"
4076
- ],
4077
- "subsets": [
4078
- "greek-ext",
4079
- "latin",
4080
- "vietnamese",
4081
- "cyrillic-ext",
4082
- "latin-ext",
4083
- "cyrillic",
4084
- "greek"
4085
- ]
4086
- },
4087
- {
4088
- "kind": "webfonts#webfont",
4089
- "family": "Orbitron",
4090
- "variants": [
4091
- "regular",
4092
- "500",
4093
- "700",
4094
- "900"
4095
- ],
4096
- "subsets": [
4097
- "latin"
4098
- ]
4099
- },
4100
- {
4101
- "kind": "webfonts#webfont",
4102
- "family": "Original Surfer",
4103
- "variants": [
4104
- "regular"
4105
- ],
4106
- "subsets": [
4107
- "latin"
4108
- ]
4109
- },
4110
- {
4111
- "kind": "webfonts#webfont",
4112
- "family": "Oswald",
4113
- "variants": [
4114
- "300",
4115
- "regular",
4116
- "700"
4117
- ],
4118
- "subsets": [
4119
- "latin",
4120
- "latin-ext"
4121
- ]
4122
- },
4123
- {
4124
- "kind": "webfonts#webfont",
4125
- "family": "Over the Rainbow",
4126
- "variants": [
4127
- "regular"
4128
- ],
4129
- "subsets": [
4130
- "latin"
4131
- ]
4132
- },
4133
- {
4134
- "kind": "webfonts#webfont",
4135
- "family": "Overlock",
4136
- "variants": [
4137
- "regular",
4138
- "italic",
4139
- "700",
4140
- "700italic",
4141
- "900",
4142
- "900italic"
4143
- ],
4144
- "subsets": [
4145
- "latin",
4146
- "latin-ext"
4147
- ]
4148
- },
4149
- {
4150
- "kind": "webfonts#webfont",
4151
- "family": "Overlock SC",
4152
- "variants": [
4153
- "regular"
4154
- ],
4155
- "subsets": [
4156
- "latin",
4157
- "latin-ext"
4158
- ]
4159
- },
4160
- {
4161
- "kind": "webfonts#webfont",
4162
- "family": "Ovo",
4163
- "variants": [
4164
- "regular"
4165
- ],
4166
- "subsets": [
4167
- "latin"
4168
- ]
4169
- },
4170
- {
4171
- "kind": "webfonts#webfont",
4172
- "family": "Oxygen",
4173
- "variants": [
4174
- "regular"
4175
- ],
4176
- "subsets": [
4177
- "latin",
4178
- "latin-ext"
4179
- ]
4180
- },
4181
- {
4182
- "kind": "webfonts#webfont",
4183
- "family": "PT Mono",
4184
- "variants": [
4185
- "regular"
4186
- ],
4187
- "subsets": [
4188
- "latin",
4189
- "cyrillic-ext",
4190
- "latin-ext",
4191
- "cyrillic"
4192
- ]
4193
- },
4194
- {
4195
- "kind": "webfonts#webfont",
4196
- "family": "PT Sans",
4197
- "variants": [
4198
- "regular",
4199
- "italic",
4200
- "700",
4201
- "700italic"
4202
- ],
4203
- "subsets": [
4204
- "latin",
4205
- "latin-ext",
4206
- "cyrillic"
4207
- ]
4208
- },
4209
- {
4210
- "kind": "webfonts#webfont",
4211
- "family": "PT Sans Caption",
4212
- "variants": [
4213
- "regular",
4214
- "700"
4215
- ],
4216
- "subsets": [
4217
- "latin",
4218
- "latin-ext",
4219
- "cyrillic"
4220
- ]
4221
- },
4222
- {
4223
- "kind": "webfonts#webfont",
4224
- "family": "PT Sans Narrow",
4225
- "variants": [
4226
- "regular",
4227
- "700"
4228
- ],
4229
- "subsets": [
4230
- "latin",
4231
- "latin-ext",
4232
- "cyrillic"
4233
- ]
4234
- },
4235
- {
4236
- "kind": "webfonts#webfont",
4237
- "family": "PT Serif",
4238
- "variants": [
4239
- "regular",
4240
- "italic",
4241
- "700",
4242
- "700italic"
4243
- ],
4244
- "subsets": [
4245
- "latin",
4246
- "cyrillic"
4247
- ]
4248
- },
4249
- {
4250
- "kind": "webfonts#webfont",
4251
- "family": "PT Serif Caption",
4252
- "variants": [
4253
- "regular",
4254
- "italic"
4255
- ],
4256
- "subsets": [
4257
- "latin",
4258
- "cyrillic"
4259
- ]
4260
- },
4261
- {
4262
- "kind": "webfonts#webfont",
4263
- "family": "Pacifico",
4264
- "variants": [
4265
- "regular"
4266
- ],
4267
- "subsets": [
4268
- "latin"
4269
- ]
4270
- },
4271
- {
4272
- "kind": "webfonts#webfont",
4273
- "family": "Parisienne",
4274
- "variants": [
4275
- "regular"
4276
- ],
4277
- "subsets": [
4278
- "latin",
4279
- "latin-ext"
4280
- ]
4281
- },
4282
- {
4283
- "kind": "webfonts#webfont",
4284
- "family": "Passero One",
4285
- "variants": [
4286
- "regular"
4287
- ],
4288
- "subsets": [
4289
- "latin",
4290
- "latin-ext"
4291
- ]
4292
- },
4293
- {
4294
- "kind": "webfonts#webfont",
4295
- "family": "Passion One",
4296
- "variants": [
4297
- "regular",
4298
- "700",
4299
- "900"
4300
- ],
4301
- "subsets": [
4302
- "latin",
4303
- "latin-ext"
4304
- ]
4305
- },
4306
- {
4307
- "kind": "webfonts#webfont",
4308
- "family": "Patrick Hand",
4309
- "variants": [
4310
- "regular"
4311
- ],
4312
- "subsets": [
4313
- "latin",
4314
- "latin-ext"
4315
- ]
4316
- },
4317
- {
4318
- "kind": "webfonts#webfont",
4319
- "family": "Patua One",
4320
- "variants": [
4321
- "regular"
4322
- ],
4323
- "subsets": [
4324
- "latin"
4325
- ]
4326
- },
4327
- {
4328
- "kind": "webfonts#webfont",
4329
- "family": "Paytone One",
4330
- "variants": [
4331
- "regular"
4332
- ],
4333
- "subsets": [
4334
- "latin"
4335
- ]
4336
- },
4337
- {
4338
- "kind": "webfonts#webfont",
4339
- "family": "Permanent Marker",
4340
- "variants": [
4341
- "regular"
4342
- ],
4343
- "subsets": [
4344
- "latin"
4345
- ]
4346
- },
4347
- {
4348
- "kind": "webfonts#webfont",
4349
- "family": "Petrona",
4350
- "variants": [
4351
- "regular"
4352
- ],
4353
- "subsets": [
4354
- "latin"
4355
- ]
4356
- },
4357
- {
4358
- "kind": "webfonts#webfont",
4359
- "family": "Philosopher",
4360
- "variants": [
4361
- "regular",
4362
- "italic",
4363
- "700",
4364
- "700italic"
4365
- ],
4366
- "subsets": [
4367
- "latin",
4368
- "cyrillic"
4369
- ]
4370
- },
4371
- {
4372
- "kind": "webfonts#webfont",
4373
- "family": "Piedra",
4374
- "variants": [
4375
- "regular"
4376
- ],
4377
- "subsets": [
4378
- "latin",
4379
- "latin-ext"
4380
- ]
4381
- },
4382
- {
4383
- "kind": "webfonts#webfont",
4384
- "family": "Pinyon Script",
4385
- "variants": [
4386
- "regular"
4387
- ],
4388
- "subsets": [
4389
- "latin"
4390
- ]
4391
- },
4392
- {
4393
- "kind": "webfonts#webfont",
4394
- "family": "Plaster",
4395
- "variants": [
4396
- "regular"
4397
- ],
4398
- "subsets": [
4399
- "latin",
4400
- "latin-ext"
4401
- ]
4402
- },
4403
- {
4404
- "kind": "webfonts#webfont",
4405
- "family": "Play",
4406
- "variants": [
4407
- "regular",
4408
- "700"
4409
- ],
4410
- "subsets": [
4411
- "greek-ext",
4412
- "latin",
4413
- "cyrillic-ext",
4414
- "latin-ext",
4415
- "cyrillic",
4416
- "greek"
4417
- ]
4418
- },
4419
- {
4420
- "kind": "webfonts#webfont",
4421
- "family": "Playball",
4422
- "variants": [
4423
- "regular"
4424
- ],
4425
- "subsets": [
4426
- "latin",
4427
- "latin-ext"
4428
- ]
4429
- },
4430
- {
4431
- "kind": "webfonts#webfont",
4432
- "family": "Playfair Display",
4433
- "variants": [
4434
- "regular",
4435
- "italic"
4436
- ],
4437
- "subsets": [
4438
- "latin",
4439
- "latin-ext"
4440
- ]
4441
- },
4442
- {
4443
- "kind": "webfonts#webfont",
4444
- "family": "Podkova",
4445
- "variants": [
4446
- "regular",
4447
- "700"
4448
- ],
4449
- "subsets": [
4450
- "latin"
4451
- ]
4452
- },
4453
- {
4454
- "kind": "webfonts#webfont",
4455
- "family": "Poiret One",
4456
- "variants": [
4457
- "regular"
4458
- ],
4459
- "subsets": [
4460
- "latin",
4461
- "latin-ext",
4462
- "cyrillic"
4463
- ]
4464
- },
4465
- {
4466
- "kind": "webfonts#webfont",
4467
- "family": "Poller One",
4468
- "variants": [
4469
- "regular"
4470
- ],
4471
- "subsets": [
4472
- "latin"
4473
- ]
4474
- },
4475
- {
4476
- "kind": "webfonts#webfont",
4477
- "family": "Poly",
4478
- "variants": [
4479
- "regular",
4480
- "italic"
4481
- ],
4482
- "subsets": [
4483
- "latin"
4484
- ]
4485
- },
4486
- {
4487
- "kind": "webfonts#webfont",
4488
- "family": "Pompiere",
4489
- "variants": [
4490
- "regular"
4491
- ],
4492
- "subsets": [
4493
- "latin"
4494
- ]
4495
- },
4496
- {
4497
- "kind": "webfonts#webfont",
4498
- "family": "Pontano Sans",
4499
- "variants": [
4500
- "regular"
4501
- ],
4502
- "subsets": [
4503
- "latin",
4504
- "latin-ext"
4505
- ]
4506
- },
4507
- {
4508
- "kind": "webfonts#webfont",
4509
- "family": "Port Lligat Sans",
4510
- "variants": [
4511
- "regular"
4512
- ],
4513
- "subsets": [
4514
- "latin"
4515
- ]
4516
- },
4517
- {
4518
- "kind": "webfonts#webfont",
4519
- "family": "Port Lligat Slab",
4520
- "variants": [
4521
- "regular"
4522
- ],
4523
- "subsets": [
4524
- "latin"
4525
- ]
4526
- },
4527
- {
4528
- "kind": "webfonts#webfont",
4529
- "family": "Prata",
4530
- "variants": [
4531
- "regular"
4532
- ],
4533
- "subsets": [
4534
- "latin"
4535
- ]
4536
- },
4537
- {
4538
- "kind": "webfonts#webfont",
4539
- "family": "Preahvihear",
4540
- "variants": [
4541
- "regular"
4542
- ],
4543
- "subsets": [
4544
- "khmer"
4545
- ]
4546
- },
4547
- {
4548
- "kind": "webfonts#webfont",
4549
- "family": "Press Start 2P",
4550
- "variants": [
4551
- "regular"
4552
- ],
4553
- "subsets": [
4554
- "latin",
4555
- "latin-ext",
4556
- "cyrillic",
4557
- "greek"
4558
- ]
4559
- },
4560
- {
4561
- "kind": "webfonts#webfont",
4562
- "family": "Princess Sofia",
4563
- "variants": [
4564
- "regular"
4565
- ],
4566
- "subsets": [
4567
- "latin",
4568
- "latin-ext"
4569
- ]
4570
- },
4571
- {
4572
- "kind": "webfonts#webfont",
4573
- "family": "Prociono",
4574
- "variants": [
4575
- "regular"
4576
- ],
4577
- "subsets": [
4578
- "latin"
4579
- ]
4580
- },
4581
- {
4582
- "kind": "webfonts#webfont",
4583
- "family": "Prosto One",
4584
- "variants": [
4585
- "regular"
4586
- ],
4587
- "subsets": [
4588
- "latin",
4589
- "latin-ext",
4590
- "cyrillic"
4591
- ]
4592
- },
4593
- {
4594
- "kind": "webfonts#webfont",
4595
- "family": "Puritan",
4596
- "variants": [
4597
- "regular",
4598
- "italic",
4599
- "700",
4600
- "700italic"
4601
- ],
4602
- "subsets": [
4603
- "latin"
4604
- ]
4605
- },
4606
- {
4607
- "kind": "webfonts#webfont",
4608
- "family": "Quando",
4609
- "variants": [
4610
- "regular"
4611
- ],
4612
- "subsets": [
4613
- "latin",
4614
- "latin-ext"
4615
- ]
4616
- },
4617
- {
4618
- "kind": "webfonts#webfont",
4619
- "family": "Quantico",
4620
- "variants": [
4621
- "regular",
4622
- "italic",
4623
- "700",
4624
- "700italic"
4625
- ],
4626
- "subsets": [
4627
- "latin"
4628
- ]
4629
- },
4630
- {
4631
- "kind": "webfonts#webfont",
4632
- "family": "Quattrocento",
4633
- "variants": [
4634
- "regular",
4635
- "700"
4636
- ],
4637
- "subsets": [
4638
- "latin",
4639
- "latin-ext"
4640
- ]
4641
- },
4642
- {
4643
- "kind": "webfonts#webfont",
4644
- "family": "Quattrocento Sans",
4645
- "variants": [
4646
- "regular",
4647
- "italic",
4648
- "700",
4649
- "700italic"
4650
- ],
4651
- "subsets": [
4652
- "latin",
4653
- "latin-ext"
4654
- ]
4655
- },
4656
- {
4657
- "kind": "webfonts#webfont",
4658
- "family": "Questrial",
4659
- "variants": [
4660
- "regular"
4661
- ],
4662
- "subsets": [
4663
- "latin"
4664
- ]
4665
- },
4666
- {
4667
- "kind": "webfonts#webfont",
4668
- "family": "Quicksand",
4669
- "variants": [
4670
- "300",
4671
- "regular",
4672
- "700"
4673
- ],
4674
- "subsets": [
4675
- "latin"
4676
- ]
4677
- },
4678
- {
4679
- "kind": "webfonts#webfont",
4680
- "family": "Qwigley",
4681
- "variants": [
4682
- "regular"
4683
- ],
4684
- "subsets": [
4685
- "latin",
4686
- "latin-ext"
4687
- ]
4688
- },
4689
- {
4690
- "kind": "webfonts#webfont",
4691
- "family": "Radley",
4692
- "variants": [
4693
- "regular",
4694
- "italic"
4695
- ],
4696
- "subsets": [
4697
- "latin",
4698
- "latin-ext"
4699
- ]
4700
- },
4701
- {
4702
- "kind": "webfonts#webfont",
4703
- "family": "Raleway",
4704
- "variants": [
4705
- "100"
4706
- ],
4707
- "subsets": [
4708
- "latin"
4709
- ]
4710
- },
4711
- {
4712
- "kind": "webfonts#webfont",
4713
- "family": "Rammetto One",
4714
- "variants": [
4715
- "regular"
4716
- ],
4717
- "subsets": [
4718
- "latin",
4719
- "latin-ext"
4720
- ]
4721
- },
4722
- {
4723
- "kind": "webfonts#webfont",
4724
- "family": "Rancho",
4725
- "variants": [
4726
- "regular"
4727
- ],
4728
- "subsets": [
4729
- "latin"
4730
- ]
4731
- },
4732
- {
4733
- "kind": "webfonts#webfont",
4734
- "family": "Rationale",
4735
- "variants": [
4736
- "regular"
4737
- ],
4738
- "subsets": [
4739
- "latin"
4740
- ]
4741
- },
4742
- {
4743
- "kind": "webfonts#webfont",
4744
- "family": "Redressed",
4745
- "variants": [
4746
- "regular"
4747
- ],
4748
- "subsets": [
4749
- "latin"
4750
- ]
4751
- },
4752
- {
4753
- "kind": "webfonts#webfont",
4754
- "family": "Reenie Beanie",
4755
- "variants": [
4756
- "regular"
4757
- ],
4758
- "subsets": [
4759
- "latin"
4760
- ]
4761
- },
4762
- {
4763
- "kind": "webfonts#webfont",
4764
- "family": "Revalia",
4765
- "variants": [
4766
- "regular"
4767
- ],
4768
- "subsets": [
4769
- "latin",
4770
- "latin-ext"
4771
- ]
4772
- },
4773
- {
4774
- "kind": "webfonts#webfont",
4775
- "family": "Ribeye",
4776
- "variants": [
4777
- "regular"
4778
- ],
4779
- "subsets": [
4780
- "latin",
4781
- "latin-ext"
4782
- ]
4783
- },
4784
- {
4785
- "kind": "webfonts#webfont",
4786
- "family": "Ribeye Marrow",
4787
- "variants": [
4788
- "regular"
4789
- ],
4790
- "subsets": [
4791
- "latin",
4792
- "latin-ext"
4793
- ]
4794
- },
4795
- {
4796
- "kind": "webfonts#webfont",
4797
- "family": "Righteous",
4798
- "variants": [
4799
- "regular"
4800
- ],
4801
- "subsets": [
4802
- "latin",
4803
- "latin-ext"
4804
- ]
4805
- },
4806
- {
4807
- "kind": "webfonts#webfont",
4808
- "family": "Rochester",
4809
- "variants": [
4810
- "regular"
4811
- ],
4812
- "subsets": [
4813
- "latin"
4814
- ]
4815
- },
4816
- {
4817
- "kind": "webfonts#webfont",
4818
- "family": "Rock Salt",
4819
- "variants": [
4820
- "regular"
4821
- ],
4822
- "subsets": [
4823
- "latin"
4824
- ]
4825
- },
4826
- {
4827
- "kind": "webfonts#webfont",
4828
- "family": "Rokkitt",
4829
- "variants": [
4830
- "regular",
4831
- "700"
4832
- ],
4833
- "subsets": [
4834
- "latin"
4835
- ]
4836
- },
4837
- {
4838
- "kind": "webfonts#webfont",
4839
- "family": "Ropa Sans",
4840
- "variants": [
4841
- "regular",
4842
- "italic"
4843
- ],
4844
- "subsets": [
4845
- "latin",
4846
- "latin-ext"
4847
- ]
4848
- },
4849
- {
4850
- "kind": "webfonts#webfont",
4851
- "family": "Rosario",
4852
- "variants": [
4853
- "regular",
4854
- "italic",
4855
- "700",
4856
- "700italic"
4857
- ],
4858
- "subsets": [
4859
- "latin"
4860
- ]
4861
- },
4862
- {
4863
- "kind": "webfonts#webfont",
4864
- "family": "Rosarivo",
4865
- "variants": [
4866
- "regular",
4867
- "italic"
4868
- ],
4869
- "subsets": [
4870
- "latin",
4871
- "latin-ext"
4872
- ]
4873
- },
4874
- {
4875
- "kind": "webfonts#webfont",
4876
- "family": "Rouge Script",
4877
- "variants": [
4878
- "regular"
4879
- ],
4880
- "subsets": [
4881
-
4882
- "latin"
4883
- ]
4884
- },
4885
- {
4886
- "kind": "webfonts#webfont",
4887
- "family": "Ruda",
4888
- "variants": [
4889
- "regular",
4890
- "700",
4891
- "900"
4892
- ],
4893
- "subsets": [
4894
- "latin",
4895
- "latin-ext"
4896
- ]
4897
- },
4898
- {
4899
- "kind": "webfonts#webfont",
4900
- "family": "Ruge Boogie",
4901
- "variants": [
4902
- "regular"
4903
- ],
4904
- "subsets": [
4905
- "latin",
4906
- "latin-ext"
4907
- ]
4908
- },
4909
- {
4910
- "kind": "webfonts#webfont",
4911
- "family": "Ruluko",
4912
- "variants": [
4913
- "regular"
4914
- ],
4915
- "subsets": [
4916
- "latin",
4917
- "latin-ext"
4918
- ]
4919
- },
4920
- {
4921
- "kind": "webfonts#webfont",
4922
- "family": "Ruslan Display",
4923
- "variants": [
4924
- "regular"
4925
- ],
4926
- "subsets": [
4927
- "latin",
4928
- "cyrillic-ext",
4929
- "latin-ext",
4930
- "cyrillic"
4931
- ]
4932
- },
4933
- {
4934
- "kind": "webfonts#webfont",
4935
- "family": "Russo One",
4936
- "variants": [
4937
- "regular"
4938
- ],
4939
- "subsets": [
4940
- "latin",
4941
- "latin-ext",
4942
- "cyrillic"
4943
- ]
4944
- },
4945
- {
4946
- "kind": "webfonts#webfont",
4947
- "family": "Ruthie",
4948
- "variants": [
4949
- "regular"
4950
- ],
4951
- "subsets": [
4952
- "latin",
4953
- "latin-ext"
4954
- ]
4955
- },
4956
- {
4957
- "kind": "webfonts#webfont",
4958
- "family": "Sail",
4959
- "variants": [
4960
- "regular"
4961
- ],
4962
- "subsets": [
4963
- "latin"
4964
- ]
4965
- },
4966
- {
4967
- "kind": "webfonts#webfont",
4968
- "family": "Salsa",
4969
- "variants": [
4970
- "regular"
4971
- ],
4972
- "subsets": [
4973
- "latin"
4974
- ]
4975
- },
4976
- {
4977
- "kind": "webfonts#webfont",
4978
- "family": "Sancreek",
4979
- "variants": [
4980
- "regular"
4981
- ],
4982
- "subsets": [
4983
- "latin",
4984
- "latin-ext"
4985
- ]
4986
- },
4987
- {
4988
- "kind": "webfonts#webfont",
4989
- "family": "Sansita One",
4990
- "variants": [
4991
- "regular"
4992
- ],
4993
- "subsets": [
4994
- "latin"
4995
- ]
4996
- },
4997
- {
4998
- "kind": "webfonts#webfont",
4999
- "family": "Sarina",
5000
- "variants": [
5001
- "regular"
5002
- ],
5003
- "subsets": [
5004
- "latin",
5005
- "latin-ext"
5006
- ]
5007
- },
5008
- {
5009
- "kind": "webfonts#webfont",
5010
- "family": "Satisfy",
5011
- "variants": [
5012
- "regular"
5013
- ],
5014
- "subsets": [
5015
- "latin"
5016
- ]
5017
- },
5018
- {
5019
- "kind": "webfonts#webfont",
5020
- "family": "Schoolbell",
5021
- "variants": [
5022
- "regular"
5023
- ],
5024
- "subsets": [
5025
- "latin"
5026
- ]
5027
- },
5028
- {
5029
- "kind": "webfonts#webfont",
5030
- "family": "Seaweed Script",
5031
- "variants": [
5032
- "regular"
5033
- ],
5034
- "subsets": [
5035
- "latin",
5036
- "latin-ext"
5037
- ]
5038
- },
5039
- {
5040
- "kind": "webfonts#webfont",
5041
- "family": "Sevillana",
5042
- "variants": [
5043
- "regular"
5044
- ],
5045
- "subsets": [
5046
- "latin",
5047
- "latin-ext"
5048
- ]
5049
- },
5050
- {
5051
- "kind": "webfonts#webfont",
5052
- "family": "Shadows Into Light",
5053
- "variants": [
5054
- "regular"
5055
- ],
5056
- "subsets": [
5057
- "latin"
5058
- ]
5059
- },
5060
- {
5061
- "kind": "webfonts#webfont",
5062
- "family": "Shadows Into Light Two",
5063
- "variants": [
5064
- "regular"
5065
- ],
5066
- "subsets": [
5067
- "latin",
5068
- "latin-ext"
5069
- ]
5070
- },
5071
- {
5072
- "kind": "webfonts#webfont",
5073
- "family": "Shanti",
5074
- "variants": [
5075
- "regular"
5076
- ],
5077
- "subsets": [
5078
- "latin"
5079
- ]
5080
- },
5081
- {
5082
- "kind": "webfonts#webfont",
5083
- "family": "Share",
5084
- "variants": [
5085
- "regular",
5086
- "italic",
5087
- "700",
5088
- "700italic"
5089
- ],
5090
- "subsets": [
5091
- "latin",
5092
- "latin-ext"
5093
- ]
5094
- },
5095
- {
5096
- "kind": "webfonts#webfont",
5097
- "family": "Shojumaru",
5098
- "variants": [
5099
- "regular"
5100
- ],
5101
- "subsets": [
5102
- "latin",
5103
- "latin-ext"
5104
- ]
5105
- },
5106
- {
5107
- "kind": "webfonts#webfont",
5108
- "family": "Short Stack",
5109
- "variants": [
5110
- "regular"
5111
- ],
5112
- "subsets": [
5113
- "latin"
5114
- ]
5115
- },
5116
- {
5117
- "kind": "webfonts#webfont",
5118
- "family": "Siemreap",
5119
- "variants": [
5120
- "regular"
5121
- ],
5122
- "subsets": [
5123
- "khmer"
5124
- ]
5125
- },
5126
- {
5127
- "kind": "webfonts#webfont",
5128
- "family": "Sigmar One",
5129
- "variants": [
5130
- "regular"
5131
- ],
5132
- "subsets": [
5133
- "latin"
5134
- ]
5135
- },
5136
- {
5137
- "kind": "webfonts#webfont",
5138
- "family": "Signika",
5139
- "variants": [
5140
- "300",
5141
- "regular",
5142
- "600",
5143
- "700"
5144
- ],
5145
- "subsets": [
5146
- "latin",
5147
- "latin-ext"
5148
- ]
5149
- },
5150
- {
5151
- "kind": "webfonts#webfont",
5152
- "family": "Signika Negative",
5153
- "variants": [
5154
- "300",
5155
- "regular",
5156
- "600",
5157
- "700"
5158
- ],
5159
- "subsets": [
5160
- "latin",
5161
- "latin-ext"
5162
- ]
5163
- },
5164
- {
5165
- "kind": "webfonts#webfont",
5166
- "family": "Simonetta",
5167
- "variants": [
5168
- "regular",
5169
- "italic",
5170
- "900",
5171
- "900italic"
5172
- ],
5173
- "subsets": [
5174
- "latin",
5175
- "latin-ext"
5176
- ]
5177
- },
5178
- {
5179
- "kind": "webfonts#webfont",
5180
- "family": "Sirin Stencil",
5181
- "variants": [
5182
- "regular"
5183
- ],
5184
- "subsets": [
5185
- "latin"
5186
- ]
5187
- },
5188
- {
5189
- "kind": "webfonts#webfont",
5190
- "family": "Six Caps",
5191
- "variants": [
5192
- "regular"
5193
- ],
5194
- "subsets": [
5195
- "latin"
5196
- ]
5197
- },
5198
- {
5199
- "kind": "webfonts#webfont",
5200
- "family": "Slackey",
5201
- "variants": [
5202
- "regular"
5203
- ],
5204
- "subsets": [
5205
- "latin"
5206
- ]
5207
- },
5208
- {
5209
- "kind": "webfonts#webfont",
5210
- "family": "Smokum",
5211
- "variants": [
5212
- "regular"
5213
- ],
5214
- "subsets": [
5215
- "latin"
5216
- ]
5217
- },
5218
- {
5219
- "kind": "webfonts#webfont",
5220
- "family": "Smythe",
5221
- "variants": [
5222
- "regular"
5223
- ],
5224
- "subsets": [
5225
- "latin"
5226
- ]
5227
- },
5228
- {
5229
- "kind": "webfonts#webfont",
5230
- "family": "Sniglet",
5231
- "variants": [
5232
- "800"
5233
- ],
5234
- "subsets": [
5235
- "latin"
5236
- ]
5237
- },
5238
- {
5239
- "kind": "webfonts#webfont",
5240
- "family": "Snippet",
5241
- "variants": [
5242
- "regular"
5243
- ],
5244
- "subsets": [
5245
- "latin"
5246
- ]
5247
- },
5248
- {
5249
- "kind": "webfonts#webfont",
5250
- "family": "Sofia",
5251
- "variants": [
5252
- "regular"
5253
- ],
5254
- "subsets": [
5255
- "latin"
5256
- ]
5257
- },
5258
- {
5259
- "kind": "webfonts#webfont",
5260
- "family": "Sonsie One",
5261
- "variants": [
5262
- "regular"
5263
- ],
5264
- "subsets": [
5265
- "latin",
5266
- "latin-ext"
5267
- ]
5268
- },
5269
- {
5270
- "kind": "webfonts#webfont",
5271
- "family": "Sorts Mill Goudy",
5272
- "variants": [
5273
- "regular",
5274
- "italic"
5275
- ],
5276
- "subsets": [
5277
- "latin",
5278
- "latin-ext"
5279
- ]
5280
- },
5281
- {
5282
- "kind": "webfonts#webfont",
5283
- "family": "Source Sans Pro",
5284
- "variants": [
5285
- "200",
5286
- "200italic",
5287
- "300",
5288
- "300italic",
5289
- "regular",
5290
- "italic",
5291
- "600",
5292
- "600italic",
5293
- "700",
5294
- "700italic",
5295
- "900",
5296
- "900italic"
5297
- ],
5298
- "subsets": [
5299
- "latin",
5300
- "latin-ext"
5301
- ]
5302
- },
5303
- {
5304
- "kind": "webfonts#webfont",
5305
- "family": "Special Elite",
5306
- "variants": [
5307
- "regular"
5308
- ],
5309
- "subsets": [
5310
- "latin"
5311
- ]
5312
- },
5313
- {
5314
- "kind": "webfonts#webfont",
5315
- "family": "Spicy Rice",
5316
- "variants": [
5317
- "regular"
5318
- ],
5319
- "subsets": [
5320
- "latin"
5321
- ]
5322
- },
5323
- {
5324
- "kind": "webfonts#webfont",
5325
- "family": "Spinnaker",
5326
- "variants": [
5327
- "regular"
5328
- ],
5329
- "subsets": [
5330
- "latin",
5331
- "latin-ext"
5332
- ]
5333
- },
5334
- {
5335
- "kind": "webfonts#webfont",
5336
- "family": "Spirax",
5337
- "variants": [
5338
- "regular"
5339
- ],
5340
- "subsets": [
5341
- "latin"
5342
- ]
5343
- },
5344
- {
5345
- "kind": "webfonts#webfont",
5346
- "family": "Squada One",
5347
- "variants": [
5348
- "regular"
5349
- ],
5350
- "subsets": [
5351
- "latin"
5352
- ]
5353
- },
5354
- {
5355
- "kind": "webfonts#webfont",
5356
- "family": "Stardos Stencil",
5357
- "variants": [
5358
- "regular",
5359
- "700"
5360
- ],
5361
- "subsets": [
5362
- "latin"
5363
- ]
5364
- },
5365
- {
5366
- "kind": "webfonts#webfont",
5367
- "family": "Stint Ultra Condensed",
5368
- "variants": [
5369
- "regular"
5370
- ],
5371
- "subsets": [
5372
- "latin",
5373
- "latin-ext"
5374
- ]
5375
- },
5376
- {
5377
- "kind": "webfonts#webfont",
5378
- "family": "Stint Ultra Expanded",
5379
- "variants": [
5380
- "regular"
5381
- ],
5382
- "subsets": [
5383
- "latin",
5384
- "latin-ext"
5385
- ]
5386
- },
5387
- {
5388
- "kind": "webfonts#webfont",
5389
- "family": "Stoke",
5390
- "variants": [
5391
- "regular"
5392
- ],
5393
- "subsets": [
5394
- "latin",
5395
- "latin-ext"
5396
- ]
5397
- },
5398
- {
5399
- "kind": "webfonts#webfont",
5400
- "family": "Sue Ellen Francisco",
5401
- "variants": [
5402
- "regular"
5403
- ],
5404
- "subsets": [
5405
- "latin"
5406
- ]
5407
- },
5408
- {
5409
- "kind": "webfonts#webfont",
5410
- "family": "Sunshiney",
5411
- "variants": [
5412
- "regular"
5413
- ],
5414
- "subsets": [
5415
- "latin"
5416
- ]
5417
- },
5418
- {
5419
- "kind": "webfonts#webfont",
5420
- "family": "Supermercado One",
5421
- "variants": [
5422
- "regular"
5423
- ],
5424
- "subsets": [
5425
- "latin"
5426
- ]
5427
- },
5428
- {
5429
- "kind": "webfonts#webfont",
5430
- "family": "Suwannaphum",
5431
- "variants": [
5432
- "regular"
5433
- ],
5434
- "subsets": [
5435
- "khmer"
5436
- ]
5437
- },
5438
- {
5439
- "kind": "webfonts#webfont",
5440
- "family": "Swanky and Moo Moo",
5441
- "variants": [
5442
- "regular"
5443
- ],
5444
- "subsets": [
5445
- "latin"
5446
- ]
5447
- },
5448
- {
5449
- "kind": "webfonts#webfont",
5450
- "family": "Syncopate",
5451
- "variants": [
5452
- "regular",
5453
- "700"
5454
- ],
5455
- "subsets": [
5456
- "latin"
5457
- ]
5458
- },
5459
- {
5460
- "kind": "webfonts#webfont",
5461
- "family": "Tangerine",
5462
- "variants": [
5463
- "regular",
5464
- "700"
5465
- ],
5466
- "subsets": [
5467
- "latin"
5468
- ]
5469
- },
5470
- {
5471
- "kind": "webfonts#webfont",
5472
- "family": "Taprom",
5473
- "variants": [
5474
- "regular"
5475
- ],
5476
- "subsets": [
5477
- "khmer"
5478
- ]
5479
- },
5480
- {
5481
- "kind": "webfonts#webfont",
5482
- "family": "Telex",
5483
- "variants": [
5484
- "regular"
5485
- ],
5486
- "subsets": [
5487
- "latin"
5488
- ]
5489
- },
5490
- {
5491
- "kind": "webfonts#webfont",
5492
- "family": "Tenor Sans",
5493
- "variants": [
5494
- "regular"
5495
- ],
5496
- "subsets": [
5497
- "latin",
5498
- "cyrillic-ext",
5499
- "latin-ext",
5500
- "cyrillic"
5501
- ]
5502
- },
5503
- {
5504
- "kind": "webfonts#webfont",
5505
- "family": "The Girl Next Door",
5506
- "variants": [
5507
- "regular"
5508
- ],
5509
- "subsets": [
5510
- "latin"
5511
- ]
5512
- },
5513
- {
5514
- "kind": "webfonts#webfont",
5515
- "family": "Tienne",
5516
- "variants": [
5517
- "regular",
5518
- "700",
5519
- "900"
5520
- ],
5521
- "subsets": [
5522
- "latin"
5523
- ]
5524
- },
5525
- {
5526
- "kind": "webfonts#webfont",
5527
- "family": "Tinos",
5528
- "variants": [
5529
- "regular",
5530
- "italic",
5531
- "700",
5532
- "700italic"
5533
- ],
5534
- "subsets": [
5535
- "latin"
5536
- ]
5537
- },
5538
- {
5539
- "kind": "webfonts#webfont",
5540
- "family": "Titan One",
5541
- "variants": [
5542
- "regular"
5543
- ],
5544
- "subsets": [
5545
- "latin",
5546
- "latin-ext"
5547
- ]
5548
- },
5549
- {
5550
- "kind": "webfonts#webfont",
5551
- "family": "Trade Winds",
5552
- "variants": [
5553
- "regular"
5554
- ],
5555
- "subsets": [
5556
- "latin"
5557
- ]
5558
- },
5559
- {
5560
- "kind": "webfonts#webfont",
5561
- "family": "Trocchi",
5562
- "variants": [
5563
- "regular"
5564
- ],
5565
- "subsets": [
5566
- "latin",
5567
- "latin-ext"
5568
- ]
5569
- },
5570
- {
5571
- "kind": "webfonts#webfont",
5572
- "family": "Trochut",
5573
- "variants": [
5574
- "regular",
5575
- "italic",
5576
- "700"
5577
- ],
5578
- "subsets": [
5579
- "latin"
5580
- ]
5581
- },
5582
- {
5583
- "kind": "webfonts#webfont",
5584
- "family": "Trykker",
5585
- "variants": [
5586
- "regular"
5587
- ],
5588
- "subsets": [
5589
- "latin",
5590
- "latin-ext"
5591
- ]
5592
- },
5593
- {
5594
- "kind": "webfonts#webfont",
5595
- "family": "Tulpen One",
5596
- "variants": [
5597
- "regular"
5598
- ],
5599
- "subsets": [
5600
- "latin"
5601
- ]
5602
- },
5603
- {
5604
- "kind": "webfonts#webfont",
5605
- "family": "Ubuntu",
5606
- "variants": [
5607
- "300",
5608
- "300italic",
5609
- "regular",
5610
- "italic",
5611
- "500",
5612
- "500italic",
5613
- "700",
5614
- "700italic"
5615
- ],
5616
- "subsets": [
5617
- "greek-ext",
5618
- "latin",
5619
- "cyrillic-ext",
5620
- "latin-ext",
5621
- "cyrillic",
5622
- "greek"
5623
- ]
5624
- },
5625
- {
5626
- "kind": "webfonts#webfont",
5627
- "family": "Ubuntu Condensed",
5628
- "variants": [
5629
- "regular"
5630
- ],
5631
- "subsets": [
5632
- "greek-ext",
5633
- "latin",
5634
- "cyrillic-ext",
5635
- "latin-ext",
5636
- "cyrillic",
5637
- "greek"
5638
- ]
5639
- },
5640
- {
5641
- "kind": "webfonts#webfont",
5642
- "family": "Ubuntu Mono",
5643
- "variants": [
5644
- "regular",
5645
- "italic",
5646
- "700",
5647
- "700italic"
5648
- ],
5649
- "subsets": [
5650
- "greek-ext",
5651
- "latin",
5652
-
5653
- "cyrillic-ext",
5654
- "latin-ext",
5655
- "cyrillic",
5656
- "greek"
5657
- ]
5658
- },
5659
- {
5660
- "kind": "webfonts#webfont",
5661
- "family": "Ultra",
5662
- "variants": [
5663
- "regular"
5664
- ],
5665
- "subsets": [
5666
- "latin"
5667
- ]
5668
- },
5669
- {
5670
- "kind": "webfonts#webfont",
5671
- "family": "Uncial Antiqua",
5672
- "variants": [
5673
- "regular"
5674
- ],
5675
- "subsets": [
5676
- "latin"
5677
- ]
5678
- },
5679
- {
5680
- "kind": "webfonts#webfont",
5681
- "family": "UnifrakturCook",
5682
- "variants": [
5683
- "700"
5684
- ],
5685
- "subsets": [
5686
- "latin"
5687
- ]
5688
- },
5689
- {
5690
- "kind": "webfonts#webfont",
5691
- "family": "UnifrakturMaguntia",
5692
- "variants": [
5693
- "regular"
5694
- ],
5695
- "subsets": [
5696
- "latin"
5697
- ]
5698
- },
5699
- {
5700
- "kind": "webfonts#webfont",
5701
- "family": "Unkempt",
5702
- "variants": [
5703
- "regular",
5704
- "700"
5705
- ],
5706
- "subsets": [
5707
- "latin"
5708
- ]
5709
- },
5710
- {
5711
- "kind": "webfonts#webfont",
5712
- "family": "Unlock",
5713
- "variants": [
5714
- "regular"
5715
- ],
5716
- "subsets": [
5717
- "latin"
5718
- ]
5719
- },
5720
- {
5721
- "kind": "webfonts#webfont",
5722
- "family": "Unna",
5723
- "variants": [
5724
- "regular"
5725
- ],
5726
- "subsets": [
5727
- "latin"
5728
- ]
5729
- },
5730
- {
5731
- "kind": "webfonts#webfont",
5732
- "family": "VT323",
5733
- "variants": [
5734
- "regular"
5735
- ],
5736
- "subsets": [
5737
- "latin"
5738
- ]
5739
- },
5740
- {
5741
- "kind": "webfonts#webfont",
5742
- "family": "Varela",
5743
- "variants": [
5744
- "regular"
5745
- ],
5746
- "subsets": [
5747
- "latin",
5748
- "latin-ext"
5749
- ]
5750
- },
5751
- {
5752
- "kind": "webfonts#webfont",
5753
- "family": "Varela Round",
5754
- "variants": [
5755
- "regular"
5756
- ],
5757
- "subsets": [
5758
- "latin"
5759
- ]
5760
- },
5761
- {
5762
- "kind": "webfonts#webfont",
5763
- "family": "Vast Shadow",
5764
- "variants": [
5765
- "regular"
5766
- ],
5767
- "subsets": [
5768
- "latin"
5769
- ]
5770
- },
5771
- {
5772
- "kind": "webfonts#webfont",
5773
- "family": "Vibur",
5774
- "variants": [
5775
- "regular"
5776
- ],
5777
- "subsets": [
5778
- "latin"
5779
- ]
5780
- },
5781
- {
5782
- "kind": "webfonts#webfont",
5783
- "family": "Vidaloka",
5784
- "variants": [
5785
- "regular"
5786
- ],
5787
- "subsets": [
5788
- "latin"
5789
- ]
5790
- },
5791
- {
5792
- "kind": "webfonts#webfont",
5793
- "family": "Viga",
5794
- "variants": [
5795
- "regular"
5796
- ],
5797
- "subsets": [
5798
- "latin",
5799
- "latin-ext"
5800
- ]
5801
- },
5802
- {
5803
- "kind": "webfonts#webfont",
5804
- "family": "Voces",
5805
- "variants": [
5806
- "regular"
5807
- ],
5808
- "subsets": [
5809
- "latin",
5810
- "latin-ext"
5811
- ]
5812
- },
5813
- {
5814
- "kind": "webfonts#webfont",
5815
- "family": "Volkhov",
5816
- "variants": [
5817
- "regular",
5818
- "italic",
5819
- "700",
5820
- "700italic"
5821
- ],
5822
- "subsets": [
5823
- "latin"
5824
- ]
5825
- },
5826
- {
5827
- "kind": "webfonts#webfont",
5828
- "family": "Vollkorn",
5829
- "variants": [
5830
- "regular",
5831
- "italic",
5832
- "700",
5833
- "700italic"
5834
- ],
5835
- "subsets": [
5836
- "latin"
5837
- ]
5838
- },
5839
- {
5840
- "kind": "webfonts#webfont",
5841
- "family": "Voltaire",
5842
- "variants": [
5843
- "regular"
5844
- ],
5845
- "subsets": [
5846
- "latin"
5847
- ]
5848
- },
5849
- {
5850
- "kind": "webfonts#webfont",
5851
- "family": "Waiting for the Sunrise",
5852
- "variants": [
5853
- "regular"
5854
- ],
5855
- "subsets": [
5856
- "latin"
5857
- ]
5858
- },
5859
- {
5860
- "kind": "webfonts#webfont",
5861
- "family": "Wallpoet",
5862
- "variants": [
5863
- "regular"
5864
- ],
5865
- "subsets": [
5866
- "latin"
5867
- ]
5868
- },
5869
- {
5870
- "kind": "webfonts#webfont",
5871
- "family": "Walter Turncoat",
5872
- "variants": [
5873
- "regular"
5874
- ],
5875
- "subsets": [
5876
- "latin"
5877
- ]
5878
- },
5879
- {
5880
- "kind": "webfonts#webfont",
5881
- "family": "Wellfleet",
5882
- "variants": [
5883
- "regular"
5884
- ],
5885
- "subsets": [
5886
- "latin",
5887
- "latin-ext"
5888
- ]
5889
- },
5890
- {
5891
- "kind": "webfonts#webfont",
5892
- "family": "Wire One",
5893
- "variants": [
5894
- "regular"
5895
- ],
5896
- "subsets": [
5897
- "latin"
5898
- ]
5899
- },
5900
- {
5901
- "kind": "webfonts#webfont",
5902
- "family": "Yanone Kaffeesatz",
5903
- "variants": [
5904
- "200",
5905
- "300",
5906
- "regular",
5907
- "700"
5908
- ],
5909
- "subsets": [
5910
-
5911
- "latin",
5912
- "latin-ext"
5913
- ]
5914
- },
5915
- {
5916
- "kind": "webfonts#webfont",
5917
- "family": "Yellowtail",
5918
- "variants": [
5919
- "regular"
5920
- ],
5921
- "subsets": [
5922
- "latin"
5923
- ]
5924
- },
5925
- {
5926
- "kind": "webfonts#webfont",
5927
- "family": "Yeseva One",
5928
- "variants": [
5929
- "regular"
5930
- ],
5931
- "subsets": [
5932
- "latin"
5933
- ]
5934
- },
5935
- {
5936
- "kind": "webfonts#webfont",
5937
- "family": "Yesteryear",
5938
- "variants": [
5939
- "regular"
5940
- ],
5941
- "subsets": [
5942
- "latin"
5943
- ]
5944
- },
5945
- {
5946
- "kind": "webfonts#webfont",
5947
- "family": "Zeyada",
5948
- "variants": [
5949
- "regular"
5950
- ],
5951
- "subsets": [
5952
- "latin"
5953
- ]
5954
- }
5955
- ]
5956
- }';
5957
-
5958
- $google_fonts_array = json_decode( $google_webfonts, TRUE );
5959
- return $google_fonts_array['items'];
5960
- }
5961
  ?>
1
+ <?php
2
+
3
+ /*
4
+ * Get Google Webfonts List
5
+ * https://www.googleapis.com/webfonts/v1/webfonts?key=YOUR-API-KEY
6
+ *
7
+ */
8
+
9
+ function nifty_cs_get_google_webfonts(){
10
+
11
+ $google_webfonts = '{
12
+ "kind": "webfonts#webfontList",
13
+ "items": [
14
+ {
15
+ "kind": "webfonts#webfont",
16
+ "family": "Abel",
17
+ "variants": [
18
+ "regular"
19
+ ],
20
+ "subsets": [
21
+ "latin"
22
+ ]
23
+ },
24
+ {
25
+ "kind": "webfonts#webfont",
26
+ "family": "Abril Fatface",
27
+ "variants": [
28
+ "regular"
29
+ ],
30
+ "subsets": [
31
+ "latin",
32
+ "latin-ext"
33
+ ]
34
+ },
35
+ {
36
+ "kind": "webfonts#webfont",
37
+ "family": "Aclonica",
38
+ "variants": [
39
+ "regular"
40
+ ],
41
+ "subsets": [
42
+ "latin"
43
+ ]
44
+ },
45
+ {
46
+ "kind": "webfonts#webfont",
47
+ "family": "Acme",
48
+ "variants": [
49
+ "regular"
50
+ ],
51
+ "subsets": [
52
+ "latin"
53
+ ]
54
+ },
55
+ {
56
+ "kind": "webfonts#webfont",
57
+ "family": "Actor",
58
+ "variants": [
59
+ "regular"
60
+ ],
61
+ "subsets": [
62
+ "latin"
63
+ ]
64
+ },
65
+ {
66
+ "kind": "webfonts#webfont",
67
+ "family": "Adamina",
68
+ "variants": [
69
+ "regular"
70
+ ],
71
+ "subsets": [
72
+ "latin"
73
+ ]
74
+ },
75
+ {
76
+ "kind": "webfonts#webfont",
77
+ "family": "Advent Pro",
78
+ "variants": [
79
+ "100",
80
+ "200",
81
+ "300",
82
+ "regular",
83
+ "500",
84
+ "600",
85
+ "700"
86
+ ],
87
+ "subsets": [
88
+ "latin",
89
+ "latin-ext",
90
+ "greek"
91
+ ]
92
+ },
93
+ {
94
+ "kind": "webfonts#webfont",
95
+ "family": "Aguafina Script",
96
+ "variants": [
97
+ "regular"
98
+ ],
99
+ "subsets": [
100
+ "latin",
101
+ "latin-ext"
102
+ ]
103
+ },
104
+ {
105
+ "kind": "webfonts#webfont",
106
+ "family": "Aladin",
107
+ "variants": [
108
+ "regular"
109
+ ],
110
+ "subsets": [
111
+ "latin",
112
+ "latin-ext"
113
+ ]
114
+ },
115
+ {
116
+ "kind": "webfonts#webfont",
117
+ "family": "Aldrich",
118
+ "variants": [
119
+ "regular"
120
+ ],
121
+ "subsets": [
122
+ "latin"
123
+ ]
124
+ },
125
+ {
126
+ "kind": "webfonts#webfont",
127
+ "family": "Alegreya",
128
+ "variants": [
129
+ "regular",
130
+ "italic",
131
+ "700",
132
+ "700italic",
133
+ "900",
134
+ "900italic"
135
+ ],
136
+ "subsets": [
137
+ "latin",
138
+ "latin-ext"
139
+ ]
140
+ },
141
+ {
142
+ "kind": "webfonts#webfont",
143
+ "family": "Alegreya SC",
144
+ "variants": [
145
+ "regular",
146
+ "italic",
147
+ "700",
148
+ "700italic",
149
+ "900",
150
+ "900italic"
151
+ ],
152
+ "subsets": [
153
+ "latin",
154
+ "latin-ext"
155
+ ]
156
+ },
157
+ {
158
+ "kind": "webfonts#webfont",
159
+ "family": "Alex Brush",
160
+ "variants": [
161
+ "regular"
162
+ ],
163
+ "subsets": [
164
+ "latin",
165
+ "latin-ext"
166
+ ]
167
+ },
168
+ {
169
+ "kind": "webfonts#webfont",
170
+ "family": "Alfa Slab One",
171
+ "variants": [
172
+ "regular"
173
+ ],
174
+ "subsets": [
175
+ "latin"
176
+ ]
177
+ },
178
+ {
179
+ "kind": "webfonts#webfont",
180
+ "family": "Alice",
181
+ "variants": [
182
+ "regular"
183
+ ],
184
+ "subsets": [
185
+ "latin"
186
+ ]
187
+ },
188
+ {
189
+ "kind": "webfonts#webfont",
190
+ "family": "Alike",
191
+ "variants": [
192
+ "regular"
193
+ ],
194
+ "subsets": [
195
+ "latin"
196
+ ]
197
+ },
198
+ {
199
+ "kind": "webfonts#webfont",
200
+ "family": "Alike Angular",
201
+ "variants": [
202
+ "regular"
203
+ ],
204
+ "subsets": [
205
+ "latin"
206
+ ]
207
+ },
208
+ {
209
+ "kind": "webfonts#webfont",
210
+ "family": "Allan",
211
+ "variants": [
212
+ "700"
213
+ ],
214
+ "subsets": [
215
+ "latin"
216
+ ]
217
+ },
218
+ {
219
+ "kind": "webfonts#webfont",
220
+ "family": "Allerta",
221
+ "variants": [
222
+ "regular"
223
+ ],
224
+ "subsets": [
225
+ "latin"
226
+ ]
227
+ },
228
+ {
229
+ "kind": "webfonts#webfont",
230
+ "family": "Allerta Stencil",
231
+ "variants": [
232
+ "regular"
233
+ ],
234
+ "subsets": [
235
+ "latin"
236
+ ]
237
+ },
238
+ {
239
+ "kind": "webfonts#webfont",
240
+ "family": "Allura",
241
+ "variants": [
242
+ "regular"
243
+ ],
244
+ "subsets": [
245
+ "latin",
246
+ "latin-ext"
247
+ ]
248
+ },
249
+ {
250
+ "kind": "webfonts#webfont",
251
+ "family": "Almendra",
252
+ "variants": [
253
+ "regular",
254
+ "italic",
255
+ "700"
256
+ ],
257
+ "subsets": [
258
+ "latin",
259
+ "latin-ext"
260
+ ]
261
+ },
262
+ {
263
+ "kind": "webfonts#webfont",
264
+ "family": "Almendra SC",
265
+ "variants": [
266
+ "regular"
267
+ ],
268
+ "subsets": [
269
+ "latin"
270
+ ]
271
+ },
272
+ {
273
+ "kind": "webfonts#webfont",
274
+ "family": "Amarante",
275
+ "variants": [
276
+ "regular"
277
+ ],
278
+ "subsets": [
279
+ "latin",
280
+ "latin-ext"
281
+ ]
282
+ },
283
+ {
284
+ "kind": "webfonts#webfont",
285
+ "family": "Amaranth",
286
+ "variants": [
287
+ "regular",
288
+ "italic",
289
+ "700",
290
+ "700italic"
291
+ ],
292
+ "subsets": [
293
+ "latin"
294
+ ]
295
+ },
296
+ {
297
+ "kind": "webfonts#webfont",
298
+ "family": "Amatic SC",
299
+ "variants": [
300
+ "regular",
301
+ "700"
302
+ ],
303
+ "subsets": [
304
+ "latin"
305
+ ]
306
+ },
307
+ {
308
+ "kind": "webfonts#webfont",
309
+ "family": "Amethysta",
310
+ "variants": [
311
+ "regular"
312
+ ],
313
+ "subsets": [
314
+ "latin"
315
+ ]
316
+ },
317
+ {
318
+ "kind": "webfonts#webfont",
319
+ "family": "Andada",
320
+ "variants": [
321
+ "regular"
322
+ ],
323
+ "subsets": [
324
+ "latin",
325
+ "latin-ext"
326
+ ]
327
+ },
328
+ {
329
+ "kind": "webfonts#webfont",
330
+ "family": "Andika",
331
+ "variants": [
332
+ "regular"
333
+ ],
334
+ "subsets": [
335
+ "latin",
336
+ "cyrillic-ext",
337
+ "latin-ext",
338
+ "cyrillic"
339
+ ]
340
+ },
341
+ {
342
+ "kind": "webfonts#webfont",
343
+ "family": "Angkor",
344
+ "variants": [
345
+ "regular"
346
+ ],
347
+ "subsets": [
348
+ "khmer"
349
+ ]
350
+ },
351
+ {
352
+ "kind": "webfonts#webfont",
353
+ "family": "Annie Use Your Telescope",
354
+ "variants": [
355
+ "regular"
356
+ ],
357
+ "subsets": [
358
+ "latin"
359
+ ]
360
+ },
361
+ {
362
+ "kind": "webfonts#webfont",
363
+ "family": "Anonymous Pro",
364
+ "variants": [
365
+ "regular",
366
+ "italic",
367
+ "700",
368
+ "700italic"
369
+ ],
370
+ "subsets": [
371
+ "greek-ext",
372
+ "latin",
373
+ "cyrillic-ext",
374
+ "latin-ext",
375
+ "cyrillic",
376
+ "greek"
377
+ ]
378
+ },
379
+ {
380
+ "kind": "webfonts#webfont",
381
+ "family": "Antic",
382
+ "variants": [
383
+ "regular"
384
+ ],
385
+ "subsets": [
386
+ "latin"
387
+ ]
388
+ },
389
+ {
390
+ "kind": "webfonts#webfont",
391
+ "family": "Antic Didone",
392
+ "variants": [
393
+ "regular"
394
+ ],
395
+ "subsets": [
396
+ "latin"
397
+ ]
398
+ },
399
+ {
400
+ "kind": "webfonts#webfont",
401
+ "family": "Antic Slab",
402
+ "variants": [
403
+ "regular"
404
+ ],
405
+ "subsets": [
406
+ "latin"
407
+ ]
408
+ },
409
+ {
410
+ "kind": "webfonts#webfont",
411
+ "family": "Anton",
412
+ "variants": [
413
+ "regular"
414
+ ],
415
+ "subsets": [
416
+ "latin",
417
+ "latin-ext"
418
+ ]
419
+ },
420
+ {
421
+ "kind": "webfonts#webfont",
422
+ "family": "Arapey",
423
+ "variants": [
424
+ "regular",
425
+ "italic"
426
+ ],
427
+ "subsets": [
428
+ "latin"
429
+ ]
430
+ },
431
+ {
432
+ "kind": "webfonts#webfont",
433
+ "family": "Arbutus",
434
+ "variants": [
435
+ "regular"
436
+ ],
437
+ "subsets": [
438
+ "latin",
439
+ "latin-ext"
440
+ ]
441
+ },
442
+ {
443
+ "kind": "webfonts#webfont",
444
+ "family": "Architects Daughter",
445
+ "variants": [
446
+ "regular"
447
+ ],
448
+ "subsets": [
449
+ "latin"
450
+ ]
451
+ },
452
+ {
453
+ "kind": "webfonts#webfont",
454
+ "family": "Arimo",
455
+ "variants": [
456
+ "regular",
457
+ "italic",
458
+ "700",
459
+ "700italic"
460
+ ],
461
+ "subsets": [
462
+ "latin"
463
+ ]
464
+ },
465
+ {
466
+ "kind": "webfonts#webfont",
467
+ "family": "Arizonia",
468
+ "variants": [
469
+ "regular"
470
+ ],
471
+ "subsets": [
472
+ "latin",
473
+ "latin-ext"
474
+ ]
475
+ },
476
+ {
477
+ "kind": "webfonts#webfont",
478
+ "family": "Armata",
479
+ "variants": [
480
+ "regular"
481
+ ],
482
+ "subsets": [
483
+ "latin",
484
+ "latin-ext"
485
+ ]
486
+ },
487
+ {
488
+ "kind": "webfonts#webfont",
489
+ "family": "Artifika",
490
+ "variants": [
491
+ "regular"
492
+ ],
493
+ "subsets": [
494
+ "latin"
495
+ ]
496
+ },
497
+ {
498
+ "kind": "webfonts#webfont",
499
+ "family": "Arvo",
500
+ "variants": [
501
+ "regular",
502
+ "italic",
503
+ "700",
504
+ "700italic"
505
+ ],
506
+ "subsets": [
507
+ "latin"
508
+ ]
509
+ },
510
+ {
511
+ "kind": "webfonts#webfont",
512
+ "family": "Asap",
513
+ "variants": [
514
+ "regular",
515
+ "italic",
516
+ "700",
517
+ "700italic"
518
+ ],
519
+ "subsets": [
520
+ "latin",
521
+ "latin-ext"
522
+ ]
523
+ },
524
+ {
525
+ "kind": "webfonts#webfont",
526
+ "family": "Asset",
527
+ "variants": [
528
+ "regular"
529
+ ],
530
+ "subsets": [
531
+ "latin"
532
+ ]
533
+ },
534
+ {
535
+ "kind": "webfonts#webfont",
536
+ "family": "Astloch",
537
+ "variants": [
538
+ "regular",
539
+ "700"
540
+ ],
541
+ "subsets": [
542
+ "latin"
543
+ ]
544
+ },
545
+ {
546
+ "kind": "webfonts#webfont",
547
+ "family": "Asul",
548
+ "variants": [
549
+ "regular",
550
+ "700"
551
+ ],
552
+ "subsets": [
553
+ "latin"
554
+ ]
555
+ },
556
+ {
557
+ "kind": "webfonts#webfont",
558
+ "family": "Atomic Age",
559
+ "variants": [
560
+ "regular"
561
+ ],
562
+ "subsets": [
563
+ "latin"
564
+ ]
565
+ },
566
+ {
567
+ "kind": "webfonts#webfont",
568
+ "family": "Aubrey",
569
+ "variants": [
570
+ "regular"
571
+ ],
572
+ "subsets": [
573
+ "latin"
574
+ ]
575
+ },
576
+ {
577
+ "kind": "webfonts#webfont",
578
+ "family": "Audiowide",
579
+ "variants": [
580
+ "regular"
581
+ ],
582
+ "subsets": [
583
+ "latin",
584
+ "latin-ext"
585
+ ]
586
+ },
587
+ {
588
+ "kind": "webfonts#webfont",
589
+ "family": "Average",
590
+ "variants": [
591
+ "regular"
592
+ ],
593
+ "subsets": [
594
+ "latin",
595
+ "latin-ext"
596
+ ]
597
+ },
598
+ {
599
+ "kind": "webfonts#webfont",
600
+ "family": "Averia Gruesa Libre",
601
+ "variants": [
602
+ "regular"
603
+ ],
604
+ "subsets": [
605
+ "latin",
606
+ "latin-ext"
607
+ ]
608
+ },
609
+ {
610
+ "kind": "webfonts#webfont",
611
+ "family": "Averia Libre",
612
+ "variants": [
613
+ "300",
614
+ "300italic",
615
+ "regular",
616
+ "italic",
617
+ "700",
618
+ "700italic"
619
+ ],
620
+ "subsets": [
621
+ "latin"
622
+ ]
623
+ },
624
+ {
625
+ "kind": "webfonts#webfont",
626
+ "family": "Averia Sans Libre",
627
+ "variants": [
628
+ "300",
629
+ "300italic",
630
+ "regular",
631
+ "italic",
632
+ "700",
633
+ "700italic"
634
+ ],
635
+ "subsets": [
636
+ "latin"
637
+ ]
638
+ },
639
+ {
640
+ "kind": "webfonts#webfont",
641
+ "family": "Averia Serif Libre",
642
+ "variants": [
643
+ "300",
644
+ "300italic",
645
+ "regular",
646
+ "italic",
647
+ "700",
648
+ "700italic"
649
+ ],
650
+ "subsets": [
651
+ "latin"
652
+ ]
653
+ },
654
+ {
655
+ "kind": "webfonts#webfont",
656
+ "family": "Bad Script",
657
+ "variants": [
658
+ "regular"
659
+ ],
660
+ "subsets": [
661
+ "latin",
662
+ "cyrillic"
663
+ ]
664
+ },
665
+ {
666
+ "kind": "webfonts#webfont",
667
+ "family": "Balthazar",
668
+ "variants": [
669
+ "regular"
670
+ ],
671
+ "subsets": [
672
+ "latin"
673
+ ]
674
+ },
675
+ {
676
+ "kind": "webfonts#webfont",
677
+ "family": "Bangers",
678
+ "variants": [
679
+ "regular"
680
+ ],
681
+ "subsets": [
682
+ "latin"
683
+ ]
684
+ },
685
+ {
686
+ "kind": "webfonts#webfont",
687
+ "family": "Basic",
688
+ "variants": [
689
+ "regular"
690
+ ],
691
+ "subsets": [
692
+ "latin",
693
+ "latin-ext"
694
+ ]
695
+ },
696
+ {
697
+ "kind": "webfonts#webfont",
698
+ "family": "Battambang",
699
+ "variants": [
700
+ "regular",
701
+ "700"
702
+ ],
703
+ "subsets": [
704
+ "khmer"
705
+ ]
706
+ },
707
+ {
708
+ "kind": "webfonts#webfont",
709
+ "family": "Baumans",
710
+ "variants": [
711
+ "regular"
712
+ ],
713
+ "subsets": [
714
+ "latin"
715
+ ]
716
+ },
717
+ {
718
+ "kind": "webfonts#webfont",
719
+ "family": "Bayon",
720
+ "variants": [
721
+ "regular"
722
+ ],
723
+ "subsets": [
724
+ "khmer"
725
+ ]
726
+ },
727
+ {
728
+ "kind": "webfonts#webfont",
729
+ "family": "Belgrano",
730
+ "variants": [
731
+ "regular"
732
+ ],
733
+ "subsets": [
734
+ "latin"
735
+ ]
736
+ },
737
+ {
738
+ "kind": "webfonts#webfont",
739
+ "family": "Belleza",
740
+ "variants": [
741
+ "regular"
742
+ ],
743
+ "subsets": [
744
+ "latin",
745
+ "latin-ext"
746
+ ]
747
+ },
748
+ {
749
+ "kind": "webfonts#webfont",
750
+ "family": "Bentham",
751
+ "variants": [
752
+ "regular"
753
+ ],
754
+ "subsets": [
755
+ "latin"
756
+ ]
757
+ },
758
+ {
759
+ "kind": "webfonts#webfont",
760
+ "family": "Berkshire Swash",
761
+ "variants": [
762
+ "regular"
763
+ ],
764
+ "subsets": [
765
+ "latin",
766
+ "latin-ext"
767
+ ]
768
+ },
769
+ {
770
+ "kind": "webfonts#webfont",
771
+ "family": "Bevan",
772
+ "variants": [
773
+ "regular"
774
+ ],
775
+ "subsets": [
776
+ "latin"
777
+ ]
778
+ },
779
+ {
780
+ "kind": "webfonts#webfont",
781
+ "family": "Bigshot One",
782
+ "variants": [
783
+ "regular"
784
+ ],
785
+ "subsets": [
786
+ "latin"
787
+ ]
788
+ },
789
+ {
790
+ "kind": "webfonts#webfont",
791
+ "family": "Bilbo",
792
+ "variants": [
793
+ "regular"
794
+ ],
795
+ "subsets": [
796
+ "latin",
797
+ "latin-ext"
798
+ ]
799
+ },
800
+ {
801
+ "kind": "webfonts#webfont",
802
+ "family": "Bilbo Swash Caps",
803
+ "variants": [
804
+ "regular"
805
+ ],
806
+ "subsets": [
807
+ "latin",
808
+ "latin-ext"
809
+ ]
810
+ },
811
+ {
812
+ "kind": "webfonts#webfont",
813
+ "family": "Bitter",
814
+ "variants": [
815
+ "regular",
816
+ "italic",
817
+ "700"
818
+ ],
819
+ "subsets": [
820
+ "latin",
821
+ "latin-ext"
822
+ ]
823
+ },
824
+ {
825
+ "kind": "webfonts#webfont",
826
+ "family": "Black Ops One",
827
+ "variants": [
828
+ "regular"
829
+ ],
830
+ "subsets": [
831
+ "latin"
832
+ ]
833
+ },
834
+ {
835
+ "kind": "webfonts#webfont",
836
+ "family": "Bokor",
837
+ "variants": [
838
+ "regular"
839
+ ],
840
+ "subsets": [
841
+ "khmer"
842
+ ]
843
+ },
844
+ {
845
+ "kind": "webfonts#webfont",
846
+ "family": "Bonbon",
847
+ "variants": [
848
+ "regular"
849
+ ],
850
+ "subsets": [
851
+ "latin"
852
+ ]
853
+ },
854
+ {
855
+ "kind": "webfonts#webfont",
856
+ "family": "Boogaloo",
857
+ "variants": [
858
+ "regular"
859
+ ],
860
+ "subsets": [
861
+ "latin"
862
+ ]
863
+ },
864
+ {
865
+ "kind": "webfonts#webfont",
866
+ "family": "Bowlby One",
867
+ "variants": [
868
+ "regular"
869
+ ],
870
+ "subsets": [
871
+ "latin"
872
+ ]
873
+ },
874
+ {
875
+ "kind": "webfonts#webfont",
876
+ "family": "Bowlby One SC",
877
+ "variants": [
878
+ "regular"
879
+ ],
880
+ "subsets": [
881
+ "latin",
882
+ "latin-ext"
883
+ ]
884
+ },
885
+ {
886
+ "kind": "webfonts#webfont",
887
+ "family": "Brawler",
888
+ "variants": [
889
+ "regular"
890
+ ],
891
+ "subsets": [
892
+ "latin"
893
+ ]
894
+ },
895
+ {
896
+ "kind": "webfonts#webfont",
897
+ "family": "Bree Serif",
898
+ "variants": [
899
+ "regular"
900
+ ],
901
+ "subsets": [
902
+ "latin",
903
+ "latin-ext"
904
+ ]
905
+ },
906
+ {
907
+ "kind": "webfonts#webfont",
908
+ "family": "Bubblegum Sans",
909
+ "variants": [
910
+ "regular"
911
+ ],
912
+ "subsets": [
913
+ "latin",
914
+ "latin-ext"
915
+ ]
916
+ },
917
+ {
918
+ "kind": "webfonts#webfont",
919
+ "family": "Buda",
920
+ "variants": [
921
+ "300"
922
+ ],
923
+ "subsets": [
924
+ "latin"
925
+ ]
926
+ },
927
+ {
928
+ "kind": "webfonts#webfont",
929
+ "family": "Buenard",
930
+ "variants": [
931
+ "regular",
932
+ "700"
933
+ ],
934
+ "subsets": [
935
+ "latin",
936
+ "latin-ext"
937
+ ]
938
+ },
939
+ {
940
+ "kind": "webfonts#webfont",
941
+ "family": "Butcherman",
942
+ "variants": [
943
+ "regular"
944
+ ],
945
+ "subsets": [
946
+ "latin",
947
+ "latin-ext"
948
+ ]
949
+ },
950
+ {
951
+ "kind": "webfonts#webfont",
952
+ "family": "Butterfly Kids",
953
+ "variants": [
954
+ "regular"
955
+ ],
956
+ "subsets": [
957
+ "latin",
958
+ "latin-ext"
959
+ ]
960
+ },
961
+ {
962
+ "kind": "webfonts#webfont",
963
+ "family": "Cabin",
964
+ "variants": [
965
+ "regular",
966
+ "italic",
967
+ "500",
968
+ "500italic",
969
+ "600",
970
+ "600italic",
971
+ "700",
972
+ "700italic"
973
+ ],
974
+ "subsets": [
975
+ "latin"
976
+ ]
977
+ },
978
+ {
979
+ "kind": "webfonts#webfont",
980
+ "family": "Cabin Condensed",
981
+ "variants": [
982
+ "regular",
983
+ "500",
984
+ "600",
985
+ "700"
986
+ ],
987
+ "subsets": [
988
+ "latin"
989
+ ]
990
+ },
991
+ {
992
+ "kind": "webfonts#webfont",
993
+ "family": "Cabin Sketch",
994
+ "variants": [
995
+ "regular",
996
+ "700"
997
+ ],
998
+ "subsets": [
999
+ "latin"
1000
+ ]
1001
+ },
1002
+ {
1003
+ "kind": "webfonts#webfont",
1004
+ "family": "Caesar Dressing",
1005
+ "variants": [
1006
+ "regular"
1007
+ ],
1008
+ "subsets": [
1009
+ "latin"
1010
+ ]
1011
+ },
1012
+ {
1013
+ "kind": "webfonts#webfont",
1014
+ "family": "Cagliostro",
1015
+ "variants": [
1016
+ "regular"
1017
+ ],
1018
+ "subsets": [
1019
+ "latin"
1020
+ ]
1021
+ },
1022
+ {
1023
+ "kind": "webfonts#webfont",
1024
+ "family": "Calligraffitti",
1025
+ "variants": [
1026
+ "regular"
1027
+ ],
1028
+ "subsets": [
1029
+ "latin"
1030
+ ]
1031
+ },
1032
+ {
1033
+ "kind": "webfonts#webfont",
1034
+ "family": "Cambo",
1035
+ "variants": [
1036
+ "regular"
1037
+ ],
1038
+ "subsets": [
1039
+ "latin"
1040
+ ]
1041
+ },
1042
+ {
1043
+ "kind": "webfonts#webfont",
1044
+ "family": "Candal",
1045
+ "variants": [
1046
+ "regular"
1047
+ ],
1048
+ "subsets": [
1049
+ "latin"
1050
+ ]
1051
+ },
1052
+ {
1053
+ "kind": "webfonts#webfont",
1054
+ "family": "Cantarell",
1055
+ "variants": [
1056
+ "regular",
1057
+ "italic",
1058
+ "700",
1059
+ "700italic"
1060
+ ],
1061
+ "subsets": [
1062
+ "latin"
1063
+ ]
1064
+ },
1065
+ {
1066
+ "kind": "webfonts#webfont",
1067
+ "family": "Cantata One",
1068
+ "variants": [
1069
+ "regular"
1070
+ ],
1071
+ "subsets": [
1072
+ "latin",
1073
+ "latin-ext"
1074
+ ]
1075
+ },
1076
+ {
1077
+ "kind": "webfonts#webfont",
1078
+ "family": "Capriola",
1079
+ "variants": [
1080
+ "regular"
1081
+ ],
1082
+ "subsets": [
1083
+ "latin",
1084
+ "latin-ext"
1085
+ ]
1086
+ },
1087
+ {
1088
+ "kind": "webfonts#webfont",
1089
+ "family": "Cardo",
1090
+ "variants": [
1091
+ "regular",
1092
+ "italic",
1093
+ "700"
1094
+ ],
1095
+ "subsets": [
1096
+ "greek-ext",
1097
+ "latin",
1098
+ "latin-ext",
1099
+ "greek"
1100
+ ]
1101
+ },
1102
+ {
1103
+ "kind": "webfonts#webfont",
1104
+ "family": "Carme",
1105
+ "variants": [
1106
+ "regular"
1107
+ ],
1108
+ "subsets": [
1109
+ "latin"
1110
+ ]
1111
+ },
1112
+ {
1113
+ "kind": "webfonts#webfont",
1114
+ "family": "Carter One",
1115
+ "variants": [
1116
+ "regular"
1117
+ ],
1118
+ "subsets": [
1119
+ "latin"
1120
+ ]
1121
+ },
1122
+ {
1123
+ "kind": "webfonts#webfont",
1124
+ "family": "Caudex",
1125
+ "variants": [
1126
+ "regular",
1127
+ "italic",
1128
+ "700",
1129
+ "700italic"
1130
+ ],
1131
+ "subsets": [
1132
+ "greek-ext",
1133
+ "latin",
1134
+ "latin-ext",
1135
+ "greek"
1136
+ ]
1137
+ },
1138
+ {
1139
+ "kind": "webfonts#webfont",
1140
+ "family": "Cedarville Cursive",
1141
+ "variants": [
1142
+ "regular"
1143
+ ],
1144
+ "subsets": [
1145
+ "latin"
1146
+ ]
1147
+ },
1148
+ {
1149
+ "kind": "webfonts#webfont",
1150
+ "family": "Ceviche One",
1151
+ "variants": [
1152
+ "regular"
1153
+ ],
1154
+ "subsets": [
1155
+ "latin"
1156
+ ]
1157
+ },
1158
+ {
1159
+ "kind": "webfonts#webfont",
1160
+ "family": "Changa One",
1161
+ "variants": [
1162
+ "regular",
1163
+ "italic"
1164
+ ],
1165
+ "subsets": [
1166
+ "latin"
1167
+ ]
1168
+ },
1169
+ {
1170
+ "kind": "webfonts#webfont",
1171
+ "family": "Chango",
1172
+ "variants": [
1173
+ "regular"
1174
+ ],
1175
+ "subsets": [
1176
+ "latin",
1177
+ "latin-ext"
1178
+ ]
1179
+ },
1180
+ {
1181
+ "kind": "webfonts#webfont",
1182
+ "family": "Chau Philomene One",
1183
+ "variants": [
1184
+ "regular",
1185
+ "italic"
1186
+ ],
1187
+ "subsets": [
1188
+ "latin",
1189
+ "latin-ext"
1190
+ ]
1191
+ },
1192
+ {
1193
+ "kind": "webfonts#webfont",
1194
+ "family": "Chelsea Market",
1195
+ "variants": [
1196
+ "regular"
1197
+ ],
1198
+ "subsets": [
1199
+ "latin",
1200
+ "latin-ext"
1201
+ ]
1202
+ },
1203
+ {
1204
+ "kind": "webfonts#webfont",
1205
+ "family": "Chenla",
1206
+ "variants": [
1207
+ "regular"
1208
+ ],
1209
+ "subsets": [
1210
+ "khmer"
1211
+ ]
1212
+ },
1213
+ {
1214
+ "kind": "webfonts#webfont",
1215
+ "family": "Cherry Cream Soda",
1216
+ "variants": [
1217
+ "regular"
1218
+ ],
1219
+ "subsets": [
1220
+ "latin"
1221
+ ]
1222
+ },
1223
+ {
1224
+ "kind": "webfonts#webfont",
1225
+ "family": "Chewy",
1226
+ "variants": [
1227
+ "regular"
1228
+ ],
1229
+ "subsets": [
1230
+ "latin"
1231
+ ]
1232
+ },
1233
+ {
1234
+ "kind": "webfonts#webfont",
1235
+ "family": "Chicle",
1236
+ "variants": [
1237
+ "regular"
1238
+ ],
1239
+ "subsets": [
1240
+ "latin",
1241
+ "latin-ext"
1242
+ ]
1243
+ },
1244
+ {
1245
+ "kind": "webfonts#webfont",
1246
+ "family": "Chivo",
1247
+ "variants": [
1248
+ "regular",
1249
+ "italic",
1250
+ "900",
1251
+ "900italic"
1252
+ ],
1253
+ "subsets": [
1254
+ "latin"
1255
+ ]
1256
+ },
1257
+ {
1258
+ "kind": "webfonts#webfont",
1259
+ "family": "Coda",
1260
+ "variants": [
1261
+ "regular",
1262
+ "800"
1263
+ ],
1264
+ "subsets": [
1265
+ "latin"
1266
+ ]
1267
+ },
1268
+ {
1269
+ "kind": "webfonts#webfont",
1270
+ "family": "Coda Caption",
1271
+ "variants": [
1272
+ "800"
1273
+ ],
1274
+ "subsets": [
1275
+ "latin"
1276
+ ]
1277
+ },
1278
+ {
1279
+ "kind": "webfonts#webfont",
1280
+ "family": "Codystar",
1281
+ "variants": [
1282
+ "300",
1283
+ "regular"
1284
+ ],
1285
+ "subsets": [
1286
+ "latin",
1287
+ "latin-ext"
1288
+ ]
1289
+ },
1290
+ {
1291
+ "kind": "webfonts#webfont",
1292
+ "family": "Comfortaa",
1293
+ "variants": [
1294
+ "300",
1295
+ "regular",
1296
+ "700"
1297
+ ],
1298
+ "subsets": [
1299
+ "latin",
1300
+ "cyrillic-ext",
1301
+ "latin-ext",
1302
+ "cyrillic",
1303
+ "greek"
1304
+ ]
1305
+ },
1306
+ {
1307
+ "kind": "webfonts#webfont",
1308
+ "family": "Coming Soon",
1309
+ "variants": [
1310
+ "regular"
1311
+ ],
1312
+ "subsets": [
1313
+ "latin"
1314
+ ]
1315
+ },
1316
+ {
1317
+ "kind": "webfonts#webfont",
1318
+ "family": "Concert One",
1319
+ "variants": [
1320
+ "regular"
1321
+ ],
1322
+ "subsets": [
1323
+ "latin",
1324
+ "latin-ext"
1325
+ ]
1326
+ },
1327
+ {
1328
+ "kind": "webfonts#webfont",
1329
+ "family": "Condiment",
1330
+ "variants": [
1331
+ "regular"
1332
+ ],
1333
+ "subsets": [
1334
+ "latin",
1335
+ "latin-ext"
1336
+ ]
1337
+ },
1338
+ {
1339
+ "kind": "webfonts#webfont",
1340
+ "family": "Content",
1341
+ "variants": [
1342
+ "regular",
1343
+ "700"
1344
+ ],
1345
+ "subsets": [
1346
+ "khmer"
1347
+ ]
1348
+ },
1349
+ {
1350
+ "kind": "webfonts#webfont",
1351
+ "family": "Contrail One",
1352
+ "variants": [
1353
+ "regular"
1354
+ ],
1355
+ "subsets": [
1356
+ "latin"
1357
+ ]
1358
+ },
1359
+ {
1360
+ "kind": "webfonts#webfont",
1361
+ "family": "Convergence",
1362
+ "variants": [
1363
+ "regular"
1364
+ ],
1365
+ "subsets": [
1366
+ "latin"
1367
+ ]
1368
+ },
1369
+ {
1370
+ "kind": "webfonts#webfont",
1371
+ "family": "Cookie",
1372
+ "variants": [
1373
+ "regular"
1374
+ ],
1375
+ "subsets": [
1376
+ "latin"
1377
+ ]
1378
+ },
1379
+ {
1380
+ "kind": "webfonts#webfont",
1381
+ "family": "Copse",
1382
+ "variants": [
1383
+ "regular"
1384
+ ],
1385
+ "subsets": [
1386
+ "latin"
1387
+ ]
1388
+ },
1389
+ {
1390
+ "kind": "webfonts#webfont",
1391
+ "family": "Corben",
1392
+ "variants": [
1393
+ "regular",
1394
+ "700"
1395
+ ],
1396
+ "subsets": [
1397
+ "latin"
1398
+ ]
1399
+ },
1400
+ {
1401
+ "kind": "webfonts#webfont",
1402
+ "family": "Courgette",
1403
+ "variants": [
1404
+ "regular"
1405
+ ],
1406
+ "subsets": [
1407
+ "latin",
1408
+ "latin-ext"
1409
+ ]
1410
+ },
1411
+ {
1412
+ "kind": "webfonts#webfont",
1413
+ "family": "Cousine",
1414
+ "variants": [
1415
+ "regular",
1416
+ "italic",
1417
+ "700",
1418
+ "700italic"
1419
+ ],
1420
+ "subsets": [
1421
+ "latin"
1422
+ ]
1423
+ },
1424
+ {
1425
+ "kind": "webfonts#webfont",
1426
+ "family": "Coustard",
1427
+ "variants": [
1428
+ "regular",
1429
+ "900"
1430
+ ],
1431
+ "subsets": [
1432
+ "latin"
1433
+ ]
1434
+ },
1435
+ {
1436
+ "kind": "webfonts#webfont",
1437
+ "family": "Covered By Your Grace",
1438
+ "variants": [
1439
+ "regular"
1440
+ ],
1441
+ "subsets": [
1442
+ "latin"
1443
+ ]
1444
+ },
1445
+ {
1446
+ "kind": "webfonts#webfont",
1447
+ "family": "Crafty Girls",
1448
+ "variants": [
1449
+ "regular"
1450
+ ],
1451
+ "subsets": [
1452
+ "latin"
1453
+ ]
1454
+ },
1455
+ {
1456
+ "kind": "webfonts#webfont",
1457
+ "family": "Creepster",
1458
+ "variants": [
1459
+ "regular"
1460
+ ],
1461
+ "subsets": [
1462
+ "latin"
1463
+ ]
1464
+ },
1465
+ {
1466
+ "kind": "webfonts#webfont",
1467
+ "family": "Crete Round",
1468
+ "variants": [
1469
+ "regular",
1470
+ "italic"
1471
+ ],
1472
+ "subsets": [
1473
+ "latin",
1474
+ "latin-ext"
1475
+ ]
1476
+ },
1477
+ {
1478
+ "kind": "webfonts#webfont",
1479
+ "family": "Crimson Text",
1480
+ "variants": [
1481
+ "regular",
1482
+ "italic",
1483
+ "600",
1484
+ "600italic",
1485
+ "700",
1486
+ "700italic"
1487
+ ],
1488
+ "subsets": [
1489
+ "latin"
1490
+ ]
1491
+ },
1492
+ {
1493
+ "kind": "webfonts#webfont",
1494
+ "family": "Crushed",
1495
+ "variants": [
1496
+ "regular"
1497
+ ],
1498
+ "subsets": [
1499
+ "latin"
1500
+ ]
1501
+ },
1502
+ {
1503
+ "kind": "webfonts#webfont",
1504
+ "family": "Cuprum",
1505
+ "variants": [
1506
+ "regular",
1507
+ "italic",
1508
+ "700",
1509
+ "700italic"
1510
+ ],
1511
+ "subsets": [
1512
+ "latin",
1513
+ "latin-ext",
1514
+ "cyrillic"
1515
+ ]
1516
+ },
1517
+ {
1518
+ "kind": "webfonts#webfont",
1519
+ "family": "Cutive",
1520
+ "variants": [
1521
+ "regular"
1522
+ ],
1523
+ "subsets": [
1524
+ "latin",
1525
+ "latin-ext"
1526
+ ]
1527
+ },
1528
+ {
1529
+ "kind": "webfonts#webfont",
1530
+ "family": "Damion",
1531
+ "variants": [
1532
+ "regular"
1533
+ ],
1534
+ "subsets": [
1535
+ "latin"
1536
+ ]
1537
+ },
1538
+ {
1539
+ "kind": "webfonts#webfont",
1540
+ "family": "Dancing Script",
1541
+ "variants": [
1542
+ "regular",
1543
+ "700"
1544
+ ],
1545
+ "subsets": [
1546
+ "latin"
1547
+ ]
1548
+ },
1549
+ {
1550
+ "kind": "webfonts#webfont",
1551
+ "family": "Dangrek",
1552
+ "variants": [
1553
+ "regular"
1554
+ ],
1555
+ "subsets": [
1556
+ "khmer"
1557
+ ]
1558
+ },
1559
+ {
1560
+ "kind": "webfonts#webfont",
1561
+ "family": "Dawning of a New Day",
1562
+ "variants": [
1563
+ "regular"
1564
+ ],
1565
+ "subsets": [
1566
+ "latin"
1567
+ ]
1568
+ },
1569
+ {
1570
+ "kind": "webfonts#webfont",
1571
+ "family": "Days One",
1572
+ "variants": [
1573
+ "regular"
1574
+ ],
1575
+ "subsets": [
1576
+ "latin"
1577
+ ]
1578
+ },
1579
+ {
1580
+ "kind": "webfonts#webfont",
1581
+ "family": "Delius",
1582
+ "variants": [
1583
+ "regular"
1584
+ ],
1585
+ "subsets": [
1586
+ "latin"
1587
+ ]
1588
+ },
1589
+ {
1590
+ "kind": "webfonts#webfont",
1591
+ "family": "Delius Swash Caps",
1592
+ "variants": [
1593
+ "regular"
1594
+ ],
1595
+ "subsets": [
1596
+ "latin"
1597
+ ]
1598
+ },
1599
+ {
1600
+ "kind": "webfonts#webfont",
1601
+ "family": "Delius Unicase",
1602
+ "variants": [
1603
+ "regular",
1604
+ "700"
1605
+ ],
1606
+ "subsets": [
1607
+ "latin"
1608
+ ]
1609
+ },
1610
+ {
1611
+ "kind": "webfonts#webfont",
1612
+ "family": "Della Respira",
1613
+ "variants": [
1614
+ "regular"
1615
+ ],
1616
+ "subsets": [
1617
+ "latin"
1618
+ ]
1619
+ },
1620
+ {
1621
+ "kind": "webfonts#webfont",
1622
+ "family": "Devonshire",
1623
+ "variants": [
1624
+ "regular"
1625
+ ],
1626
+ "subsets": [
1627
+ "latin",
1628
+ "latin-ext"
1629
+ ]
1630
+ },
1631
+ {
1632
+ "kind": "webfonts#webfont",
1633
+ "family": "Didact Gothic",
1634
+ "variants": [
1635
+ "regular"
1636
+ ],
1637
+ "subsets": [
1638
+ "greek-ext",
1639
+ "latin",
1640
+ "cyrillic-ext",
1641
+ "latin-ext",
1642
+ "cyrillic",
1643
+ "greek"
1644
+ ]
1645
+ },
1646
+ {
1647
+ "kind": "webfonts#webfont",
1648
+ "family": "Diplomata",
1649
+ "variants": [
1650
+ "regular"
1651
+ ],
1652
+ "subsets": [
1653
+ "latin",
1654
+ "latin-ext"
1655
+ ]
1656
+ },
1657
+ {
1658
+ "kind": "webfonts#webfont",
1659
+ "family": "Diplomata SC",
1660
+ "variants": [
1661
+ "regular"
1662
+ ],
1663
+ "subsets": [
1664
+ "latin",
1665
+ "latin-ext"
1666
+ ]
1667
+ },
1668
+ {
1669
+ "kind": "webfonts#webfont",
1670
+ "family": "Doppio One",
1671
+ "variants": [
1672
+ "regular"
1673
+ ],
1674
+ "subsets": [
1675
+ "latin",
1676
+ "latin-ext"
1677
+ ]
1678
+ },
1679
+ {
1680
+ "kind": "webfonts#webfont",
1681
+ "family": "Dorsa",
1682
+ "variants": [
1683
+ "regular"
1684
+ ],
1685
+ "subsets": [
1686
+ "latin"
1687
+ ]
1688
+ },
1689
+ {
1690
+ "kind": "webfonts#webfont",
1691
+ "family": "Dosis",
1692
+ "variants": [
1693
+ "200",
1694
+ "300",
1695
+ "regular",
1696
+ "500",
1697
+ "600",
1698
+ "700",
1699
+ "800"
1700
+ ],
1701
+ "subsets": [
1702
+ "latin",
1703
+ "latin-ext"
1704
+ ]
1705
+ },
1706
+ {
1707
+ "kind": "webfonts#webfont",
1708
+ "family": "Dr Sugiyama",
1709
+ "variants": [
1710
+ "regular"
1711
+ ],
1712
+ "subsets": [
1713
+ "latin",
1714
+ "latin-ext"
1715
+ ]
1716
+ },
1717
+ {
1718
+ "kind": "webfonts#webfont",
1719
+ "family": "Droid Sans",
1720
+ "variants": [
1721
+ "regular",
1722
+ "700"
1723
+ ],
1724
+ "subsets": [
1725
+ "latin"
1726
+ ]
1727
+ },
1728
+ {
1729
+ "kind": "webfonts#webfont",
1730
+ "family": "Droid Sans Mono",
1731
+ "variants": [
1732
+ "regular"
1733
+ ],
1734
+ "subsets": [
1735
+ "latin"
1736
+ ]
1737
+ },
1738
+ {
1739
+ "kind": "webfonts#webfont",
1740
+ "family": "Droid Serif",
1741
+ "variants": [
1742
+ "regular",
1743
+ "italic",
1744
+ "700",
1745
+ "700italic"
1746
+ ],
1747
+ "subsets": [
1748
+ "latin"
1749
+ ]
1750
+ },
1751
+ {
1752
+ "kind": "webfonts#webfont",
1753
+ "family": "Duru Sans",
1754
+ "variants": [
1755
+ "regular"
1756
+ ],
1757
+ "subsets": [
1758
+ "latin",
1759
+ "latin-ext"
1760
+ ]
1761
+ },
1762
+ {
1763
+ "kind": "webfonts#webfont",
1764
+ "family": "Dynalight",
1765
+ "variants": [
1766
+ "regular"
1767
+ ],
1768
+ "subsets": [
1769
+ "latin",
1770
+ "latin-ext"
1771
+ ]
1772
+ },
1773
+ {
1774
+ "kind": "webfonts#webfont",
1775
+ "family": "EB Garamond",
1776
+ "variants": [
1777
+ "regular"
1778
+ ],
1779
+ "subsets": [
1780
+ "latin",
1781
+ "vietnamese",
1782
+ "cyrillic-ext",
1783
+ "latin-ext",
1784
+ "cyrillic"
1785
+ ]
1786
+ },
1787
+ {
1788
+ "kind": "webfonts#webfont",
1789
+ "family": "Eagle Lake",
1790
+ "variants": [
1791
+ "regular"
1792
+ ],
1793
+ "subsets": [
1794
+ "latin",
1795
+ "latin-ext"
1796
+ ]
1797
+ },
1798
+ {
1799
+ "kind": "webfonts#webfont",
1800
+ "family": "Eater",
1801
+ "variants": [
1802
+ "regular"
1803
+ ],
1804
+ "subsets": [
1805
+ "latin",
1806
+ "latin-ext"
1807
+ ]
1808
+ },
1809
+ {
1810
+ "kind": "webfonts#webfont",
1811
+ "family": "Economica",
1812
+ "variants": [
1813
+ "regular",
1814
+ "italic",
1815
+ "700",
1816
+ "700italic"
1817
+ ],
1818
+ "subsets": [
1819
+ "latin",
1820
+ "latin-ext"
1821
+ ]
1822
+ },
1823
+ {
1824
+ "kind": "webfonts#webfont",
1825
+ "family": "Electrolize",
1826
+ "variants": [
1827
+ "regular"
1828
+ ],
1829
+ "subsets": [
1830
+ "latin"
1831
+ ]
1832
+ },
1833
+ {
1834
+ "kind": "webfonts#webfont",
1835
+ "family": "Emblema One",
1836
+ "variants": [
1837
+ "regular"
1838
+ ],
1839
+ "subsets": [
1840
+ "latin",
1841
+ "latin-ext"
1842
+ ]
1843
+ },
1844
+ {
1845
+ "kind": "webfonts#webfont",
1846
+ "family": "Emilys Candy",
1847
+ "variants": [
1848
+ "regular"
1849
+ ],
1850
+ "subsets": [
1851
+ "latin",
1852
+ "latin-ext"
1853
+ ]
1854
+ },
1855
+ {
1856
+ "kind": "webfonts#webfont",
1857
+ "family": "Engagement",
1858
+ "variants": [
1859
+ "regular"
1860
+ ],
1861
+ "subsets": [
1862
+ "latin"
1863
+ ]
1864
+ },
1865
+ {
1866
+ "kind": "webfonts#webfont",
1867
+ "family": "Enriqueta",
1868
+ "variants": [
1869
+ "regular",
1870
+ "700"
1871
+ ],
1872
+ "subsets": [
1873
+ "latin",
1874
+ "latin-ext"
1875
+ ]
1876
+ },
1877
+ {
1878
+ "kind": "webfonts#webfont",
1879
+ "family": "Erica One",
1880
+ "variants": [
1881
+ "regular"
1882
+ ],
1883
+ "subsets": [
1884
+ "latin"
1885
+ ]
1886
+ },
1887
+ {
1888
+ "kind": "webfonts#webfont",
1889
+ "family": "Esteban",
1890
+ "variants": [
1891
+ "regular"
1892
+ ],
1893
+ "subsets": [
1894
+ "latin",
1895
+ "latin-ext"
1896
+ ]
1897
+ },
1898
+ {
1899
+ "kind": "webfonts#webfont",
1900
+ "family": "Euphoria Script",
1901
+ "variants": [
1902
+ "regular"
1903
+ ],
1904
+ "subsets": [
1905
+ "latin",
1906
+ "latin-ext"
1907
+ ]
1908
+ },
1909
+ {
1910
+ "kind": "webfonts#webfont",
1911
+ "family": "Ewert",
1912
+ "variants": [
1913
+ "regular"
1914
+ ],
1915
+ "subsets": [
1916
+ "latin",
1917
+ "latin-ext"
1918
+ ]
1919
+ },
1920
+ {
1921
+ "kind": "webfonts#webfont",
1922
+ "family": "Exo",
1923
+ "variants": [
1924
+ "100",
1925
+ "100italic",
1926
+ "200",
1927
+ "200italic",
1928
+ "300",
1929
+ "300italic",
1930
+ "regular",
1931
+ "italic",
1932
+ "500",
1933
+ "500italic",
1934
+ "600",
1935
+ "600italic",
1936
+ "700",
1937
+ "700italic",
1938
+ "800",
1939
+ "800italic",
1940
+ "900",
1941
+ "900italic"
1942
+ ],
1943
+ "subsets": [
1944
+ "latin",
1945
+ "latin-ext"
1946
+ ]
1947
+ },
1948
+ {
1949
+ "kind": "webfonts#webfont",
1950
+ "family": "Expletus Sans",
1951
+ "variants": [
1952
+ "regular",
1953
+ "italic",
1954
+ "500",
1955
+ "500italic",
1956
+ "600",
1957
+ "600italic",
1958
+ "700",
1959
+ "700italic"
1960
+ ],
1961
+ "subsets": [
1962
+ "latin"
1963
+ ]
1964
+ },
1965
+ {
1966
+ "kind": "webfonts#webfont",
1967
+ "family": "Fanwood Text",
1968
+ "variants": [
1969
+ "regular",
1970
+ "italic"
1971
+ ],
1972
+ "subsets": [
1973
+ "latin"
1974
+ ]
1975
+ },
1976
+ {
1977
+ "kind": "webfonts#webfont",
1978
+ "family": "Fascinate",
1979
+ "variants": [
1980
+ "regular"
1981
+ ],
1982
+ "subsets": [
1983
+ "latin"
1984
+ ]
1985
+ },
1986
+ {
1987
+ "kind": "webfonts#webfont",
1988
+ "family": "Fascinate Inline",
1989
+ "variants": [
1990
+ "regular"
1991
+ ],
1992
+ "subsets": [
1993
+ "latin"
1994
+ ]
1995
+ },
1996
+ {
1997
+ "kind": "webfonts#webfont",
1998
+ "family": "Federant",
1999
+ "variants": [
2000
+ "regular"
2001
+ ],
2002
+ "subsets": [
2003
+ "latin"
2004
+ ]
2005
+ },
2006
+ {
2007
+ "kind": "webfonts#webfont",
2008
+ "family": "Federo",
2009
+ "variants": [
2010
+ "regular"
2011
+ ],
2012
+ "subsets": [
2013
+ "latin"
2014
+ ]
2015
+ },
2016
+ {
2017
+ "kind": "webfonts#webfont",
2018
+ "family": "Felipa",
2019
+ "variants": [
2020
+ "regular"
2021
+ ],
2022
+ "subsets": [
2023
+ "latin",
2024
+ "latin-ext"
2025
+ ]
2026
+ },
2027
+ {
2028
+ "kind": "webfonts#webfont",
2029
+ "family": "Fjord One",
2030
+ "variants": [
2031
+ "regular"
2032
+ ],
2033
+ "subsets": [
2034
+ "latin"
2035
+ ]
2036
+ },
2037
+ {
2038
+ "kind": "webfonts#webfont",
2039
+ "family": "Flamenco",
2040
+ "variants": [
2041
+ "300",
2042
+ "regular"
2043
+ ],
2044
+ "subsets": [
2045
+ "latin"
2046
+ ]
2047
+ },
2048
+ {
2049
+ "kind": "webfonts#webfont",
2050
+ "family": "Flavors",
2051
+ "variants": [
2052
+ "regular"
2053
+ ],
2054
+ "subsets": [
2055
+ "latin"
2056
+ ]
2057
+ },
2058
+ {
2059
+ "kind": "webfonts#webfont",
2060
+ "family": "Fondamento",
2061
+ "variants": [
2062
+ "regular",
2063
+ "italic"
2064
+ ],
2065
+ "subsets": [
2066
+ "latin",
2067
+ "latin-ext"
2068
+ ]
2069
+ },
2070
+ {
2071
+ "kind": "webfonts#webfont",
2072
+ "family": "Fontdiner Swanky",
2073
+ "variants": [
2074
+ "regular"
2075
+ ],
2076
+ "subsets": [
2077
+ "latin"
2078
+ ]
2079
+ },
2080
+ {
2081
+ "kind": "webfonts#webfont",
2082
+ "family": "Forum",
2083
+ "variants": [
2084
+ "regular"
2085
+ ],
2086
+ "subsets": [
2087
+ "latin",
2088
+ "cyrillic-ext",
2089
+ "latin-ext",
2090
+ "cyrillic"
2091
+ ]
2092
+ },
2093
+ {
2094
+ "kind": "webfonts#webfont",
2095
+ "family": "Francois One",
2096
+ "variants": [
2097
+ "regular"
2098
+ ],
2099
+ "subsets": [
2100
+ "latin",
2101
+ "latin-ext"
2102
+ ]
2103
+ },
2104
+ {
2105
+ "kind": "webfonts#webfont",
2106
+ "family": "Fredericka the Great",
2107
+ "variants": [
2108
+ "regular"
2109
+ ],
2110
+ "subsets": [
2111
+ "latin"
2112
+ ]
2113
+ },
2114
+ {
2115
+ "kind": "webfonts#webfont",
2116
+ "family": "Fredoka One",
2117
+ "variants": [
2118
+ "regular"
2119
+ ],
2120
+ "subsets": [
2121
+ "latin"
2122
+ ]
2123
+ },
2124
+ {
2125
+ "kind": "webfonts#webfont",
2126
+ "family": "Freehand",
2127
+ "variants": [
2128
+ "regular"
2129
+ ],
2130
+ "subsets": [
2131
+ "khmer"
2132
+ ]
2133
+ },
2134
+ {
2135
+ "kind": "webfonts#webfont",
2136
+ "family": "Fresca",
2137
+ "variants": [
2138
+ "regular"
2139
+ ],
2140
+ "subsets": [
2141
+ "latin",
2142
+ "latin-ext"
2143
+ ]
2144
+ },
2145
+ {
2146
+ "kind": "webfonts#webfont",
2147
+ "family": "Frijole",
2148
+ "variants": [
2149
+ "regular"
2150
+ ],
2151
+ "subsets": [
2152
+ "latin"
2153
+ ]
2154
+ },
2155
+ {
2156
+ "kind": "webfonts#webfont",
2157
+ "family": "Fugaz One",
2158
+ "variants": [
2159
+ "regular"
2160
+ ],
2161
+ "subsets": [
2162
+ "latin"
2163
+ ]
2164
+ },
2165
+ {
2166
+ "kind": "webfonts#webfont",
2167
+ "family": "GFS Didot",
2168
+ "variants": [
2169
+ "regular"
2170
+ ],
2171
+ "subsets": [
2172
+ "greek"
2173
+ ]
2174
+ },
2175
+ {
2176
+ "kind": "webfonts#webfont",
2177
+ "family": "GFS Neohellenic",
2178
+ "variants": [
2179
+ "regular",
2180
+ "italic",
2181
+ "700",
2182
+ "700italic"
2183
+ ],
2184
+ "subsets": [
2185
+ "greek"
2186
+ ]
2187
+ },
2188
+ {
2189
+ "kind": "webfonts#webfont",
2190
+ "family": "Galdeano",
2191
+ "variants": [
2192
+ "regular"
2193
+ ],
2194
+ "subsets": [
2195
+ "latin"
2196
+ ]
2197
+ },
2198
+ {
2199
+ "kind": "webfonts#webfont",
2200
+ "family": "Gentium Basic",
2201
+ "variants": [
2202
+ "regular",
2203
+ "italic",
2204
+ "700",
2205
+ "700italic"
2206
+ ],
2207
+ "subsets": [
2208
+ "latin",
2209
+ "latin-ext"
2210
+ ]
2211
+ },
2212
+ {
2213
+ "kind": "webfonts#webfont",
2214
+ "family": "Gentium Book Basic",
2215
+ "variants": [
2216
+ "regular",
2217
+ "italic",
2218
+ "700",
2219
+ "700italic"
2220
+ ],
2221
+ "subsets": [
2222
+ "latin",
2223
+ "latin-ext"
2224
+ ]
2225
+ },
2226
+ {
2227
+ "kind": "webfonts#webfont",
2228
+ "family": "Geo",
2229
+ "variants": [
2230
+ "regular"
2231
+ ],
2232
+ "subsets": [
2233
+ "latin"
2234
+ ]
2235
+ },
2236
+ {
2237
+ "kind": "webfonts#webfont",
2238
+ "family": "Geostar",
2239
+ "variants": [
2240
+ "regular"
2241
+ ],
2242
+ "subsets": [
2243
+ "latin"
2244
+ ]
2245
+ },
2246
+ {
2247
+ "kind": "webfonts#webfont",
2248
+ "family": "Geostar Fill",
2249
+ "variants": [
2250
+ "regular"
2251
+ ],
2252
+ "subsets": [
2253
+ "latin"
2254
+ ]
2255
+ },
2256
+ {
2257
+ "kind": "webfonts#webfont",
2258
+ "family": "Germania One",
2259
+ "variants": [
2260
+ "regular"
2261
+ ],
2262
+ "subsets": [
2263
+ "latin"
2264
+ ]
2265
+ },
2266
+ {
2267
+ "kind": "webfonts#webfont",
2268
+ "family": "Give You Glory",
2269
+ "variants": [
2270
+ "regular"
2271
+ ],
2272
+ "subsets": [
2273
+ "latin"
2274
+ ]
2275
+ },
2276
+ {
2277
+ "kind": "webfonts#webfont",
2278
+ "family": "Glass Antiqua",
2279
+ "variants": [
2280
+ "regular"
2281
+ ],
2282
+ "subsets": [
2283
+ "latin",
2284
+ "latin-ext"
2285
+ ]
2286
+ },
2287
+ {
2288
+ "kind": "webfonts#webfont",
2289
+ "family": "Glegoo",
2290
+ "variants": [
2291
+ "regular"
2292
+ ],
2293
+ "subsets": [
2294
+ "latin",
2295
+ "latin-ext"
2296
+ ]
2297
+ },
2298
+ {
2299
+ "kind": "webfonts#webfont",
2300
+ "family": "Gloria Hallelujah",
2301
+ "variants": [
2302
+ "regular"
2303
+ ],
2304
+ "subsets": [
2305
+ "latin"
2306
+ ]
2307
+ },
2308
+ {
2309
+ "kind": "webfonts#webfont",
2310
+ "family": "Goblin One",
2311
+ "variants": [
2312
+ "regular"
2313
+ ],
2314
+ "subsets": [
2315
+ "latin"
2316
+ ]
2317
+ },
2318
+ {
2319
+ "kind": "webfonts#webfont",
2320
+ "family": "Gochi Hand",
2321
+ "variants": [
2322
+ "regular"
2323
+ ],
2324
+ "subsets": [
2325
+ "latin"
2326
+ ]
2327
+ },
2328
+ {
2329
+ "kind": "webfonts#webfont",
2330
+ "family": "Gorditas",
2331
+ "variants": [
2332
+ "regular",
2333
+ "700"
2334
+ ],
2335
+ "subsets": [
2336
+ "latin"
2337
+ ]
2338
+ },
2339
+ {
2340
+ "kind": "webfonts#webfont",
2341
+ "family": "Goudy Bookletter 1911",
2342
+ "variants": [
2343
+ "regular"
2344
+ ],
2345
+ "subsets": [
2346
+ "latin"
2347
+ ]
2348
+ },
2349
+ {
2350
+ "kind": "webfonts#webfont",
2351
+ "family": "Graduate",
2352
+ "variants": [
2353
+ "regular"
2354
+ ],
2355
+ "subsets": [
2356
+ "latin"
2357
+ ]
2358
+ },
2359
+ {
2360
+ "kind": "webfonts#webfont",
2361
+ "family": "Gravitas One",
2362
+ "variants": [
2363
+ "regular"
2364
+ ],
2365
+ "subsets": [
2366
+ "latin"
2367
+ ]
2368
+ },
2369
+ {
2370
+ "kind": "webfonts#webfont",
2371
+ "family": "Great Vibes",
2372
+ "variants": [
2373
+ "regular"
2374
+ ],
2375
+ "subsets": [
2376
+ "latin",
2377
+ "latin-ext"
2378
+ ]
2379
+ },
2380
+ {
2381
+ "kind": "webfonts#webfont",
2382
+ "family": "Gruppo",
2383
+ "variants": [
2384
+ "regular"
2385
+ ],
2386
+ "subsets": [
2387
+ "latin",
2388
+ "latin-ext"
2389
+ ]
2390
+ },
2391
+ {
2392
+ "kind": "webfonts#webfont",
2393
+ "family": "Gudea",
2394
+ "variants": [
2395
+ "regular",
2396
+ "italic",
2397
+ "700"
2398
+ ],
2399
+ "subsets": [
2400
+ "latin",
2401
+ "latin-ext"
2402
+ ]
2403
+ },
2404
+ {
2405
+ "kind": "webfonts#webfont",
2406
+ "family": "Habibi",
2407
+ "variants": [
2408
+ "regular"
2409
+ ],
2410
+ "subsets": [
2411
+ "latin",
2412
+ "latin-ext"
2413
+ ]
2414
+ },
2415
+ {
2416
+ "kind": "webfonts#webfont",
2417
+ "family": "Hammersmith One",
2418
+ "variants": [
2419
+ "regular"
2420
+ ],
2421
+ "subsets": [
2422
+ "latin"
2423
+ ]
2424
+ },
2425
+ {
2426
+ "kind": "webfonts#webfont",
2427
+ "family": "Handlee",
2428
+ "variants": [
2429
+ "regular"
2430
+ ],
2431
+ "subsets": [
2432
+ "latin"
2433
+ ]
2434
+ },
2435
+ {
2436
+ "kind": "webfonts#webfont",
2437
+ "family": "Hanuman",
2438
+ "variants": [
2439
+ "regular",
2440
+ "700"
2441
+ ],
2442
+ "subsets": [
2443
+ "khmer"
2444
+ ]
2445
+ },
2446
+ {
2447
+ "kind": "webfonts#webfont",
2448
+ "family": "Happy Monkey",
2449
+ "variants": [
2450
+ "regular"
2451
+ ],
2452
+ "subsets": [
2453
+ "latin",
2454
+ "latin-ext"
2455
+ ]
2456
+ },
2457
+ {
2458
+ "kind": "webfonts#webfont",
2459
+ "family": "Henny Penny",
2460
+ "variants": [
2461
+ "regular"
2462
+ ],
2463
+ "subsets": [
2464
+ "latin"
2465
+ ]
2466
+ },
2467
+ {
2468
+ "kind": "webfonts#webfont",
2469
+ "family": "Herr Von Muellerhoff",
2470
+ "variants": [
2471
+ "regular"
2472
+ ],
2473
+ "subsets": [
2474
+ "latin",
2475
+ "latin-ext"
2476
+ ]
2477
+ },
2478
+ {
2479
+ "kind": "webfonts#webfont",
2480
+ "family": "Holtwood One SC",
2481
+ "variants": [
2482
+ "regular"
2483
+ ],
2484
+ "subsets": [
2485
+ "latin"
2486
+ ]
2487
+ },
2488
+ {
2489
+ "kind": "webfonts#webfont",
2490
+ "family": "Homemade Apple",
2491
+ "variants": [
2492
+ "regular"
2493
+ ],
2494
+ "subsets": [
2495
+ "latin"
2496
+ ]
2497
+ },
2498
+ {
2499
+ "kind": "webfonts#webfont",
2500
+ "family": "Homenaje",
2501
+ "variants": [
2502
+ "regular"
2503
+ ],
2504
+ "subsets": [
2505
+ "latin"
2506
+ ]
2507
+ },
2508
+ {
2509
+ "kind": "webfonts#webfont",
2510
+ "family": "IM Fell DW Pica",
2511
+ "variants": [
2512
+ "regular",
2513
+ "italic"
2514
+ ],
2515
+ "subsets": [
2516
+ "latin"
2517
+ ]
2518
+ },
2519
+ {
2520
+ "kind": "webfonts#webfont",
2521
+ "family": "IM Fell DW Pica SC",
2522
+ "variants": [
2523
+ "regular"
2524
+ ],
2525
+ "subsets": [
2526
+ "latin"
2527
+ ]
2528
+ },
2529
+ {
2530
+ "kind": "webfonts#webfont",
2531
+ "family": "IM Fell Double Pica",
2532
+ "variants": [
2533
+ "regular",
2534
+ "italic"
2535
+ ],
2536
+ "subsets": [
2537
+ "latin"
2538
+ ]
2539
+ },
2540
+ {
2541
+ "kind": "webfonts#webfont",
2542
+ "family": "IM Fell Double Pica SC",
2543
+ "variants": [
2544
+ "regular"
2545
+ ],
2546
+ "subsets": [
2547
+ "latin"
2548
+ ]
2549
+ },
2550
+ {
2551
+ "kind": "webfonts#webfont",
2552
+ "family": "IM Fell English",
2553
+ "variants": [
2554
+ "regular",
2555
+ "italic"
2556
+ ],
2557
+ "subsets": [
2558
+ "latin"
2559
+ ]
2560
+ },
2561
+ {
2562
+ "kind": "webfonts#webfont",
2563
+ "family": "IM Fell English SC",
2564
+ "variants": [
2565
+ "regular"
2566
+ ],
2567
+ "subsets": [
2568
+ "latin"
2569
+ ]
2570
+ },
2571
+ {
2572
+ "kind": "webfonts#webfont",
2573
+ "family": "IM Fell French Canon",
2574
+ "variants": [
2575
+ "regular",
2576
+ "italic"
2577
+ ],
2578
+ "subsets": [
2579
+ "latin"
2580
+ ]
2581
+ },
2582
+ {
2583
+ "kind": "webfonts#webfont",
2584
+ "family": "IM Fell French Canon SC",
2585
+ "variants": [
2586
+ "regular"
2587
+ ],
2588
+ "subsets": [
2589
+ "latin"
2590
+ ]
2591
+ },
2592
+ {
2593
+ "kind": "webfonts#webfont",
2594
+ "family": "IM Fell Great Primer",
2595
+ "variants": [
2596
+ "regular",
2597
+ "italic"
2598
+ ],
2599
+ "subsets": [
2600
+ "latin"
2601
+ ]
2602
+ },
2603
+ {
2604
+ "kind": "webfonts#webfont",
2605
+ "family": "IM Fell Great Primer SC",
2606
+ "variants": [
2607
+ "regular"
2608
+ ],
2609
+ "subsets": [
2610
+ "latin"
2611
+ ]
2612
+ },
2613
+ {
2614
+ "kind": "webfonts#webfont",
2615
+ "family": "Iceberg",
2616
+ "variants": [
2617
+ "regular"
2618
+ ],
2619
+ "subsets": [
2620
+ "latin"
2621
+ ]
2622
+ },
2623
+ {
2624
+ "kind": "webfonts#webfont",
2625
+ "family": "Iceland",
2626
+ "variants": [
2627
+ "regular"
2628
+ ],
2629
+ "subsets": [
2630
+ "latin"
2631
+ ]
2632
+ },
2633
+ {
2634
+ "kind": "webfonts#webfont",
2635
+ "family": "Imprima",
2636
+ "variants": [
2637
+ "regular"
2638
+ ],
2639
+ "subsets": [
2640
+ "latin",
2641
+ "latin-ext"
2642
+ ]
2643
+ },
2644
+ {
2645
+ "kind": "webfonts#webfont",
2646
+ "family": "Inconsolata",
2647
+ "variants": [
2648
+ "regular"
2649
+ ],
2650
+ "subsets": [
2651
+ "latin"
2652
+ ]
2653
+ },
2654
+ {
2655
+ "kind": "webfonts#webfont",
2656
+ "family": "Inder",
2657
+ "variants": [
2658
+ "regular"
2659
+ ],
2660
+ "subsets": [
2661
+ "latin",
2662
+ "latin-ext"
2663
+ ]
2664
+ },
2665
+ {
2666
+ "kind": "webfonts#webfont",
2667
+ "family": "Indie Flower",
2668
+ "variants": [
2669
+ "regular"
2670
+ ],
2671
+ "subsets": [
2672
+ "latin"
2673
+ ]
2674
+ },
2675
+ {
2676
+ "kind": "webfonts#webfont",
2677
+ "family": "Inika",
2678
+ "variants": [
2679
+ "regular",
2680
+ "700"
2681
+ ],
2682
+ "subsets": [
2683
+ "latin",
2684
+ "latin-ext"
2685
+ ]
2686
+ },
2687
+ {
2688
+ "kind": "webfonts#webfont",
2689
+ "family": "Irish Grover",
2690
+ "variants": [
2691
+ "regular"
2692
+ ],
2693
+ "subsets": [
2694
+ "latin"
2695
+ ]
2696
+ },
2697
+ {
2698
+ "kind": "webfonts#webfont",
2699
+ "family": "Istok Web",
2700
+ "variants": [
2701
+ "regular",
2702
+ "italic",
2703
+ "700",
2704
+ "700italic"
2705
+ ],
2706
+ "subsets": [
2707
+ "latin",
2708
+ "cyrillic-ext",
2709
+ "latin-ext",
2710
+ "cyrillic"
2711
+ ]
2712
+ },
2713
+ {
2714
+ "kind": "webfonts#webfont",
2715
+ "family": "Italiana",
2716
+ "variants": [
2717
+ "regular"
2718
+ ],
2719
+ "subsets": [
2720
+ "latin"
2721
+ ]
2722
+ },
2723
+ {
2724
+ "kind": "webfonts#webfont",
2725
+ "family": "Italianno",
2726
+ "variants": [
2727
+ "regular"
2728
+ ],
2729
+ "subsets": [
2730
+ "latin",
2731
+ "latin-ext"
2732
+ ]
2733
+ },
2734
+ {
2735
+ "kind": "webfonts#webfont",
2736
+ "family": "Jim Nightshade",
2737
+ "variants": [
2738
+ "regular"
2739
+ ],
2740
+ "subsets": [
2741
+ "latin",
2742
+ "latin-ext"
2743
+ ]
2744
+ },
2745
+ {
2746
+ "kind": "webfonts#webfont",
2747
+ "family": "Jockey One",
2748
+ "variants": [
2749
+ "regular"
2750
+ ],
2751
+ "subsets": [
2752
+ "latin",
2753
+ "latin-ext"
2754
+ ]
2755
+ },
2756
+ {
2757
+ "kind": "webfonts#webfont",
2758
+ "family": "Jolly Lodger",
2759
+ "variants": [
2760
+ "regular"
2761
+ ],
2762
+ "subsets": [
2763
+ "latin",
2764
+ "latin-ext"
2765
+ ]
2766
+ },
2767
+ {
2768
+ "kind": "webfonts#webfont",
2769
+ "family": "Josefin Sans",
2770
+ "variants": [
2771
+ "100",
2772
+ "100italic",
2773
+ "300",
2774
+ "300italic",
2775
+ "regular",
2776
+ "italic",
2777
+ "600",
2778
+ "600italic",
2779
+ "700",
2780
+ "700italic"
2781
+ ],
2782
+ "subsets": [
2783
+ "latin"
2784
+ ]
2785
+ },
2786
+ {
2787
+ "kind": "webfonts#webfont",
2788
+ "family": "Josefin Slab",
2789
+ "variants": [
2790
+ "100",
2791
+ "100italic",
2792
+ "300",
2793
+ "300italic",
2794
+ "regular",
2795
+ "italic",
2796
+ "600",
2797
+ "600italic",
2798
+ "700",
2799
+ "700italic"
2800
+ ],
2801
+ "subsets": [
2802
+ "latin"
2803
+ ]
2804
+ },
2805
+ {
2806
+ "kind": "webfonts#webfont",
2807
+ "family": "Judson",
2808
+ "variants": [
2809
+ "regular",
2810
+ "italic",
2811
+ "700"
2812
+ ],
2813
+ "subsets": [
2814
+ "latin"
2815
+ ]
2816
+ },
2817
+ {
2818
+ "kind": "webfonts#webfont",
2819
+ "family": "Julee",
2820
+ "variants": [
2821
+ "regular"
2822
+ ],
2823
+ "subsets": [
2824
+ "latin"
2825
+ ]
2826
+ },
2827
+ {
2828
+ "kind": "webfonts#webfont",
2829
+ "family": "Junge",
2830
+ "variants": [
2831
+ "regular"
2832
+ ],
2833
+ "subsets": [
2834
+ "latin"
2835
+ ]
2836
+ },
2837
+ {
2838
+ "kind": "webfonts#webfont",
2839
+ "family": "Jura",
2840
+ "variants": [
2841
+ "300",
2842
+ "regular",
2843
+ "500",
2844
+ "600"
2845
+ ],
2846
+ "subsets": [
2847
+ "greek-ext",
2848
+ "latin",
2849
+ "cyrillic-ext",
2850
+ "latin-ext",
2851
+ "cyrillic",
2852
+ "greek"
2853
+ ]
2854
+ },
2855
+ {
2856
+ "kind": "webfonts#webfont",
2857
+ "family": "Just Another Hand",
2858
+ "variants": [
2859
+ "regular"
2860
+ ],
2861
+ "subsets": [
2862
+ "latin"
2863
+ ]
2864
+ },
2865
+ {
2866
+ "kind": "webfonts#webfont",
2867
+ "family": "Just Me Again Down Here",
2868
+ "variants": [
2869
+ "regular"
2870
+ ],
2871
+ "subsets": [
2872
+ "latin"
2873
+ ]
2874
+ },
2875
+ {
2876
+ "kind": "webfonts#webfont",
2877
+ "family": "Kameron",
2878
+ "variants": [
2879
+ "regular",
2880
+ "700"
2881
+ ],
2882
+ "subsets": [
2883
+ "latin"
2884
+ ]
2885
+ },
2886
+ {
2887
+ "kind": "webfonts#webfont",
2888
+ "family": "Karla",
2889
+ "variants": [
2890
+ "regular",
2891
+ "italic",
2892
+ "700",
2893
+ "700italic"
2894
+ ],
2895
+ "subsets": [
2896
+ "latin"
2897
+ ]
2898
+ },
2899
+ {
2900
+ "kind": "webfonts#webfont",
2901
+ "family": "Kaushan Script",
2902
+ "variants": [
2903
+ "regular"
2904
+ ],
2905
+ "subsets": [
2906
+ "latin",
2907
+ "latin-ext"
2908
+ ]
2909
+ },
2910
+ {
2911
+ "kind": "webfonts#webfont",
2912
+ "family": "Kelly Slab",
2913
+ "variants": [
2914
+ "regular"
2915
+ ],
2916
+ "subsets": [
2917
+ "latin",
2918
+ "latin-ext",
2919
+ "cyrillic"
2920
+ ]
2921
+ },
2922
+ {
2923
+ "kind": "webfonts#webfont",
2924
+ "family": "Kenia",
2925
+ "variants": [
2926
+ "regular"
2927
+ ],
2928
+ "subsets": [
2929
+ "latin"
2930
+ ]
2931
+ },
2932
+ {
2933
+ "kind": "webfonts#webfont",
2934
+ "family": "Khmer",
2935
+ "variants": [
2936
+ "regular"
2937
+ ],
2938
+ "subsets": [
2939
+ "khmer"
2940
+ ]
2941
+ },
2942
+ {
2943
+ "kind": "webfonts#webfont",
2944
+ "family": "Knewave",
2945
+ "variants": [
2946
+ "regular"
2947
+ ],
2948
+ "subsets": [
2949
+ "latin",
2950
+ "latin-ext"
2951
+ ]
2952
+ },
2953
+ {
2954
+ "kind": "webfonts#webfont",
2955
+ "family": "Kotta One",
2956
+ "variants": [
2957
+ "regular"
2958
+ ],
2959
+ "subsets": [
2960
+ "latin",
2961
+ "latin-ext"
2962
+ ]
2963
+ },
2964
+ {
2965
+ "kind": "webfonts#webfont",
2966
+ "family": "Koulen",
2967
+ "variants": [
2968
+ "regular"
2969
+ ],
2970
+ "subsets": [
2971
+ "khmer"
2972
+ ]
2973
+ },
2974
+ {
2975
+ "kind": "webfonts#webfont",
2976
+ "family": "Kranky",
2977
+ "variants": [
2978
+ "regular"
2979
+ ],
2980
+ "subsets": [
2981
+ "latin"
2982
+ ]
2983
+ },
2984
+ {
2985
+ "kind": "webfonts#webfont",
2986
+ "family": "Kreon",
2987
+ "variants": [
2988
+ "300",
2989
+ "regular",
2990
+ "700"
2991
+ ],
2992
+ "subsets": [
2993
+ "latin"
2994
+ ]
2995
+ },
2996
+ {
2997
+ "kind": "webfonts#webfont",
2998
+ "family": "Kristi",
2999
+ "variants": [
3000
+ "regular"
3001
+ ],
3002
+ "subsets": [
3003
+ "latin"
3004
+ ]
3005
+ },
3006
+ {
3007
+ "kind": "webfonts#webfont",
3008
+ "family": "Krona One",
3009
+ "variants": [
3010
+ "regular"
3011
+ ],
3012
+ "subsets": [
3013
+ "latin",
3014
+ "latin-ext"
3015
+ ]
3016
+ },
3017
+ {
3018
+ "kind": "webfonts#webfont",
3019
+ "family": "La Belle Aurore",
3020
+ "variants": [
3021
+ "regular"
3022
+ ],
3023
+ "subsets": [
3024
+ "latin"
3025
+ ]
3026
+ },
3027
+ {
3028
+ "kind": "webfonts#webfont",
3029
+ "family": "Lancelot",
3030
+ "variants": [
3031
+ "regular"
3032
+ ],
3033
+ "subsets": [
3034
+ "latin"
3035
+ ]
3036
+ },
3037
+ {
3038
+ "kind": "webfonts#webfont",
3039
+ "family": "Lato",
3040
+ "variants": [
3041
+ "100",
3042
+ "100italic",
3043
+ "300",
3044
+ "300italic",
3045
+ "regular",
3046
+ "italic",
3047
+ "700",
3048
+ "700italic",
3049
+ "900",
3050
+ "900italic"
3051
+ ],
3052
+ "subsets": [
3053
+ "latin"
3054
+ ]
3055
+ },
3056
+ {
3057
+ "kind": "webfonts#webfont",
3058
+ "family": "League Script",
3059
+ "variants": [
3060
+ "regular"
3061
+ ],
3062
+ "subsets": [
3063
+ "latin"
3064
+ ]
3065
+ },
3066
+ {
3067
+ "kind": "webfonts#webfont",
3068
+ "family": "Leckerli One",
3069
+ "variants": [
3070
+ "regular"
3071
+ ],
3072
+ "subsets": [
3073
+ "latin"
3074
+ ]
3075
+ },
3076
+ {
3077
+ "kind": "webfonts#webfont",
3078
+ "family": "Ledger",
3079
+ "variants": [
3080
+ "regular"
3081
+ ],
3082
+ "subsets": [
3083
+ "latin",
3084
+ "latin-ext",
3085
+ "cyrillic"
3086
+ ]
3087
+ },
3088
+ {
3089
+ "kind": "webfonts#webfont",
3090
+ "family": "Lekton",
3091
+ "variants": [
3092
+ "regular",
3093
+ "italic",
3094
+ "700"
3095
+ ],
3096
+ "subsets": [
3097
+ "latin"
3098
+ ]
3099
+ },
3100
+ {
3101
+ "kind": "webfonts#webfont",
3102
+ "family": "Lemon",
3103
+ "variants": [
3104
+ "regular"
3105
+ ],
3106
+ "subsets": [
3107
+ "latin"
3108
+ ]
3109
+ },
3110
+ {
3111
+ "kind": "webfonts#webfont",
3112
+ "family": "Lilita One",
3113
+ "variants": [
3114
+ "regular"
3115
+ ],
3116
+ "subsets": [
3117
+ "latin",
3118
+ "latin-ext"
3119
+ ]
3120
+ },
3121
+ {
3122
+ "kind": "webfonts#webfont",
3123
+ "family": "Limelight",
3124
+ "variants": [
3125
+ "regular"
3126
+ ],
3127
+ "subsets": [
3128
+ "latin"
3129
+ ]
3130
+ },
3131
+ {
3132
+ "kind": "webfonts#webfont",
3133
+ "family": "Linden Hill",
3134
+ "variants": [
3135
+ "regular",
3136
+ "italic"
3137
+ ],
3138
+ "subsets": [
3139
+ "latin"
3140
+ ]
3141
+ },
3142
+ {
3143
+ "kind": "webfonts#webfont",
3144
+ "family": "Lobster",
3145
+ "variants": [
3146
+ "regular"
3147
+ ],
3148
+ "subsets": [
3149
+ "latin",
3150
+ "cyrillic-ext",
3151
+ "latin-ext",
3152
+ "cyrillic"
3153
+ ]
3154
+ },
3155
+ {
3156
+ "kind": "webfonts#webfont",
3157
+ "family": "Lobster Two",
3158
+ "variants": [
3159
+ "regular",
3160
+ "italic",
3161
+ "700",
3162
+ "700italic"
3163
+ ],
3164
+ "subsets": [
3165
+ "latin"
3166
+ ]
3167
+ },
3168
+ {
3169
+ "kind": "webfonts#webfont",
3170
+ "family": "Londrina Outline",
3171
+ "variants": [
3172
+ "regular"
3173
+ ],
3174
+ "subsets": [
3175
+ "latin"
3176
+ ]
3177
+ },
3178
+ {
3179
+ "kind": "webfonts#webfont",
3180
+ "family": "Londrina Shadow",
3181
+ "variants": [
3182
+ "regular"
3183
+ ],
3184
+ "subsets": [
3185
+ "latin"
3186
+ ]
3187
+ },
3188
+ {
3189
+ "kind": "webfonts#webfont",
3190
+ "family": "Londrina Sketch",
3191
+ "variants": [
3192
+ "regular"
3193
+ ],
3194
+ "subsets": [
3195
+ "latin"
3196
+ ]
3197
+ },
3198
+ {
3199
+ "kind": "webfonts#webfont",
3200
+ "family": "Londrina Solid",
3201
+ "variants": [
3202
+ "regular"
3203
+ ],
3204
+ "subsets": [
3205
+ "latin"
3206
+ ]
3207
+ },
3208
+ {
3209
+ "kind": "webfonts#webfont",
3210
+ "family": "Lora",
3211
+ "variants": [
3212
+ "regular",
3213
+ "italic",
3214
+ "700",
3215
+ "700italic"
3216
+ ],
3217
+ "subsets": [
3218
+ "latin"
3219
+ ]
3220
+ },
3221
+ {
3222
+ "kind": "webfonts#webfont",
3223
+ "family": "Love Ya Like A Sister",
3224
+ "variants": [
3225
+ "regular"
3226
+ ],
3227
+ "subsets": [
3228
+ "latin"
3229
+ ]
3230
+ },
3231
+ {
3232
+ "kind": "webfonts#webfont",
3233
+ "family": "Loved by the King",
3234
+ "variants": [
3235
+ "regular"
3236
+ ],
3237
+ "subsets": [
3238
+ "latin"
3239
+ ]
3240
+ },
3241
+ {
3242
+ "kind": "webfonts#webfont",
3243
+ "family": "Lovers Quarrel",
3244
+ "variants": [
3245
+ "regular"
3246
+ ],
3247
+ "subsets": [
3248
+ "latin",
3249
+ "latin-ext"
3250
+ ]
3251
+ },
3252
+ {
3253
+ "kind": "webfonts#webfont",
3254
+ "family": "Luckiest Guy",
3255
+ "variants": [
3256
+ "regular"
3257
+ ],
3258
+ "subsets": [
3259
+ "latin"
3260
+ ]
3261
+ },
3262
+ {
3263
+ "kind": "webfonts#webfont",
3264
+ "family": "Lusitana",
3265
+ "variants": [
3266
+ "regular",
3267
+ "700"
3268
+ ],
3269
+ "subsets": [
3270
+ "latin"
3271
+ ]
3272
+ },
3273
+ {
3274
+ "kind": "webfonts#webfont",
3275
+ "family": "Lustria",
3276
+ "variants": [
3277
+ "regular"
3278
+ ],
3279
+ "subsets": [
3280
+ "latin"
3281
+ ]
3282
+ },
3283
+ {
3284
+ "kind": "webfonts#webfont",
3285
+ "family": "Macondo",
3286
+ "variants": [
3287
+ "regular"
3288
+ ],
3289
+ "subsets": [
3290
+ "latin"
3291
+ ]
3292
+ },
3293
+ {
3294
+ "kind": "webfonts#webfont",
3295
+ "family": "Macondo Swash Caps",
3296
+ "variants": [
3297
+ "regular"
3298
+ ],
3299
+ "subsets": [
3300
+ "latin"
3301
+ ]
3302
+ },
3303
+ {
3304
+ "kind": "webfonts#webfont",
3305
+ "family": "Magra",
3306
+ "variants": [
3307
+ "regular",
3308
+ "700"
3309
+ ],
3310
+ "subsets": [
3311
+ "latin",
3312
+ "latin-ext"
3313
+ ]
3314
+ },
3315
+ {
3316
+ "kind": "webfonts#webfont",
3317
+ "family": "Maiden Orange",
3318
+ "variants": [
3319
+ "regular"
3320
+ ],
3321
+ "subsets": [
3322
+ "latin"
3323
+ ]
3324
+ },
3325
+ {
3326
+ "kind": "webfonts#webfont",
3327
+ "family": "Mako",
3328
+ "variants": [
3329
+ "regular"
3330
+ ],
3331
+ "subsets": [
3332
+ "latin"
3333
+ ]
3334
+ },
3335
+ {
3336
+ "kind": "webfonts#webfont",
3337
+ "family": "Marck Script",
3338
+ "variants": [
3339
+ "regular"
3340
+ ],
3341
+ "subsets": [
3342
+ "latin",
3343
+ "latin-ext",
3344
+ "cyrillic"
3345
+ ]
3346
+ },
3347
+ {
3348
+ "kind": "webfonts#webfont",
3349
+ "family": "Marko One",
3350
+ "variants": [
3351
+ "regular"
3352
+ ],
3353
+ "subsets": [
3354
+ "latin"
3355
+ ]
3356
+ },
3357
+ {
3358
+ "kind": "webfonts#webfont",
3359
+ "family": "Marmelad",
3360
+ "variants": [
3361
+ "regular"
3362
+ ],
3363
+ "subsets": [
3364
+ "latin",
3365
+ "latin-ext",
3366
+ "cyrillic"
3367
+ ]
3368
+ },
3369
+ {
3370
+ "kind": "webfonts#webfont",
3371
+ "family": "Marvel",
3372
+ "variants": [
3373
+ "regular",
3374
+ "italic",
3375
+ "700",
3376
+ "700italic"
3377
+ ],
3378
+ "subsets": [
3379
+ "latin"
3380
+ ]
3381
+ },
3382
+ {
3383
+ "kind": "webfonts#webfont",
3384
+ "family": "Mate",
3385
+ "variants": [
3386
+ "regular",
3387
+ "italic"
3388
+ ],
3389
+ "subsets": [
3390
+ "latin"
3391
+ ]
3392
+ },
3393
+ {
3394
+ "kind": "webfonts#webfont",
3395
+ "family": "Mate SC",
3396
+ "variants": [
3397
+ "regular"
3398
+ ],
3399
+ "subsets": [
3400
+ "latin"
3401
+ ]
3402
+ },
3403
+ {
3404
+ "kind": "webfonts#webfont",
3405
+ "family": "Maven Pro",
3406
+ "variants": [
3407
+ "regular",
3408
+ "500",
3409
+ "700",
3410
+ "900"
3411
+ ],
3412
+ "subsets": [
3413
+ "latin"
3414
+ ]
3415
+ },
3416
+ {
3417
+ "kind": "webfonts#webfont",
3418
+ "family": "Meddon",
3419
+ "variants": [
3420
+ "regular"
3421
+ ],
3422
+ "subsets": [
3423
+ "latin"
3424
+ ]
3425
+ },
3426
+ {
3427
+ "kind": "webfonts#webfont",
3428
+ "family": "MedievalSharp",
3429
+ "variants": [
3430
+ "regular"
3431
+ ],
3432
+ "subsets": [
3433
+ "latin",
3434
+ "latin-ext"
3435
+ ]
3436
+ },
3437
+ {
3438
+ "kind": "webfonts#webfont",
3439
+ "family": "Medula One",
3440
+ "variants": [
3441
+ "regular"
3442
+ ],
3443
+ "subsets": [
3444
+ "latin"
3445
+ ]
3446
+ },
3447
+ {
3448
+ "kind": "webfonts#webfont",
3449
+ "family": "Megrim",
3450
+ "variants": [
3451
+ "regular"
3452
+ ],
3453
+ "subsets": [
3454
+ "latin"
3455
+ ]
3456
+ },
3457
+ {
3458
+ "kind": "webfonts#webfont",
3459
+ "family": "Merienda One",
3460
+ "variants": [
3461
+ "regular"
3462
+ ],
3463
+ "subsets": [
3464
+ "latin"
3465
+ ]
3466
+ },
3467
+ {
3468
+ "kind": "webfonts#webfont",
3469
+ "family": "Merriweather",
3470
+ "variants": [
3471
+ "300",
3472
+ "regular",
3473
+ "700",
3474
+ "900"
3475
+ ],
3476
+ "subsets": [
3477
+ "latin"
3478
+ ]
3479
+ },
3480
+ {
3481
+ "kind": "webfonts#webfont",
3482
+ "family": "Metal",
3483
+ "variants": [
3484
+ "regular"
3485
+ ],
3486
+ "subsets": [
3487
+ "khmer"
3488
+ ]
3489
+ },
3490
+ {
3491
+ "kind": "webfonts#webfont",
3492
+ "family": "Metal Mania",
3493
+ "variants": [
3494
+ "regular"
3495
+ ],
3496
+ "subsets": [
3497
+ "latin",
3498
+ "latin-ext"
3499
+ ]
3500
+ },
3501
+ {
3502
+ "kind": "webfonts#webfont",
3503
+ "family": "Metamorphous",
3504
+ "variants": [
3505
+ "regular"
3506
+ ],
3507
+ "subsets": [
3508
+ "latin",
3509
+ "latin-ext"
3510
+ ]
3511
+ },
3512
+ {
3513
+ "kind": "webfonts#webfont",
3514
+ "family": "Metrophobic",
3515
+ "variants": [
3516
+ "regular"
3517
+ ],
3518
+ "subsets": [
3519
+ "latin"
3520
+ ]
3521
+ },
3522
+ {
3523
+ "kind": "webfonts#webfont",
3524
+ "family": "Michroma",
3525
+ "variants": [
3526
+ "regular"
3527
+ ],
3528
+ "subsets": [
3529
+ "latin"
3530
+ ]
3531
+ },
3532
+ {
3533
+ "kind": "webfonts#webfont",
3534
+ "family": "Miltonian",
3535
+ "variants": [
3536
+ "regular"
3537
+ ],
3538
+ "subsets": [
3539
+ "latin"
3540
+ ]
3541
+ },
3542
+ {
3543
+ "kind": "webfonts#webfont",
3544
+ "family": "Miltonian Tattoo",
3545
+ "variants": [
3546
+ "regular"
3547
+ ],
3548
+ "subsets": [
3549
+ "latin"
3550
+ ]
3551
+ },
3552
+ {
3553
+ "kind": "webfonts#webfont",
3554
+ "family": "Miniver",
3555
+ "variants": [
3556
+ "regular"
3557
+ ],
3558
+ "subsets": [
3559
+ "latin"
3560
+ ]
3561
+ },
3562
+ {
3563
+ "kind": "webfonts#webfont",
3564
+ "family": "Miss Fajardose",
3565
+ "variants": [
3566
+ "regular"
3567
+ ],
3568
+ "subsets": [
3569
+ "latin",
3570
+ "latin-ext"
3571
+ ]
3572
+ },
3573
+ {
3574
+ "kind": "webfonts#webfont",
3575
+ "family": "Modern Antiqua",
3576
+ "variants": [
3577
+ "regular"
3578
+ ],
3579
+ "subsets": [
3580
+ "latin",
3581
+ "latin-ext"
3582
+ ]
3583
+ },
3584
+ {
3585
+ "kind": "webfonts#webfont",
3586
+ "family": "Molengo",
3587
+ "variants": [
3588
+ "regular"
3589
+ ],
3590
+ "subsets": [
3591
+ "latin",
3592
+ "latin-ext"
3593
+ ]
3594
+ },
3595
+ {
3596
+ "kind": "webfonts#webfont",
3597
+ "family": "Monofett",
3598
+ "variants": [
3599
+ "regular"
3600
+ ],
3601
+ "subsets": [
3602
+ "latin"
3603
+ ]
3604
+ },
3605
+ {
3606
+ "kind": "webfonts#webfont",
3607
+ "family": "Monoton",
3608
+ "variants": [
3609
+ "regular"
3610
+ ],
3611
+ "subsets": [
3612
+ "latin"
3613
+ ]
3614
+ },
3615
+ {
3616
+ "kind": "webfonts#webfont",
3617
+ "family": "Monsieur La Doulaise",
3618
+ "variants": [
3619
+ "regular"
3620
+ ],
3621
+ "subsets": [
3622
+ "latin",
3623
+ "latin-ext"
3624
+ ]
3625
+ },
3626
+ {
3627
+ "kind": "webfonts#webfont",
3628
+ "family": "Montaga",
3629
+ "variants": [
3630
+ "regular"
3631
+ ],
3632
+ "subsets": [
3633
+ "latin"
3634
+ ]
3635
+ },
3636
+ {
3637
+ "kind": "webfonts#webfont",
3638
+ "family": "Montez",
3639
+ "variants": [
3640
+ "regular"
3641
+ ],
3642
+ "subsets": [
3643
+ "latin"
3644
+ ]
3645
+ },
3646
+ {
3647
+ "kind": "webfonts#webfont",
3648
+ "family": "Montserrat",
3649
+ "variants": [
3650
+ "regular"
3651
+ ],
3652
+ "subsets": [
3653
+ "latin"
3654
+ ]
3655
+ },
3656
+ {
3657
+ "kind": "webfonts#webfont",
3658
+ "family": "Moul",
3659
+ "variants": [
3660
+ "regular"
3661
+ ],
3662
+ "subsets": [
3663
+ "khmer"
3664
+ ]
3665
+ },
3666
+ {
3667
+ "kind": "webfonts#webfont",
3668
+ "family": "Moulpali",
3669
+ "variants": [
3670
+ "regular"
3671
+ ],
3672
+ "subsets": [
3673
+ "khmer"
3674
+ ]
3675
+ },
3676
+ {
3677
+ "kind": "webfonts#webfont",
3678
+ "family": "Mountains of Christmas",
3679
+ "variants": [
3680
+ "regular",
3681
+ "700"
3682
+ ],
3683
+ "subsets": [
3684
+ "latin"
3685
+ ]
3686
+ },
3687
+ {
3688
+ "kind": "webfonts#webfont",
3689
+ "family": "Mr Bedfort",
3690
+ "variants": [
3691
+ "regular"
3692
+ ],
3693
+ "subsets": [
3694
+ "latin",
3695
+ "latin-ext"
3696
+ ]
3697
+ },
3698
+ {
3699
+ "kind": "webfonts#webfont",
3700
+ "family": "Mr Dafoe",
3701
+ "variants": [
3702
+ "regular"
3703
+ ],
3704
+ "subsets": [
3705
+ "latin",
3706
+ "latin-ext"
3707
+ ]
3708
+ },
3709
+ {
3710
+ "kind": "webfonts#webfont",
3711
+ "family": "Mr De Haviland",
3712
+ "variants": [
3713
+ "regular"
3714
+ ],
3715
+ "subsets": [
3716
+ "latin",
3717
+ "latin-ext"
3718
+ ]
3719
+ },
3720
+ {
3721
+ "kind": "webfonts#webfont",
3722
+ "family": "Mrs Saint Delafield",
3723
+ "variants": [
3724
+ "regular"
3725
+ ],
3726
+ "subsets": [
3727
+ "latin",
3728
+ "latin-ext"
3729
+ ]
3730
+ },
3731
+ {
3732
+ "kind": "webfonts#webfont",
3733
+ "family": "Mrs Sheppards",
3734
+ "variants": [
3735
+ "regular"
3736
+ ],
3737
+ "subsets": [
3738
+ "latin",
3739
+ "latin-ext"
3740
+ ]
3741
+ },
3742
+ {
3743
+ "kind": "webfonts#webfont",
3744
+ "family": "Muli",
3745
+ "variants": [
3746
+ "300",
3747
+ "300italic",
3748
+ "regular",
3749
+ "italic"
3750
+ ],
3751
+ "subsets": [
3752
+ "latin"
3753
+ ]
3754
+ },
3755
+ {
3756
+ "kind": "webfonts#webfont",
3757
+ "family": "Mystery Quest",
3758
+ "variants": [
3759
+ "regular"
3760
+ ],
3761
+ "subsets": [
3762
+ "latin",
3763
+ "latin-ext"
3764
+ ]
3765
+ },
3766
+ {
3767
+ "kind": "webfonts#webfont",
3768
+ "family": "Neucha",
3769
+ "variants": [
3770
+ "regular"
3771
+ ],
3772
+ "subsets": [
3773
+ "latin",
3774
+ "cyrillic"
3775
+ ]
3776
+ },
3777
+ {
3778
+ "kind": "webfonts#webfont",
3779
+ "family": "Neuton",
3780
+ "variants": [
3781
+ "200",
3782
+ "300",
3783
+ "regular",
3784
+ "italic",
3785
+ "700",
3786
+ "800"
3787
+ ],
3788
+ "subsets": [
3789
+ "latin",
3790
+ "latin-ext"
3791
+ ]
3792
+ },
3793
+ {
3794
+ "kind": "webfonts#webfont",
3795
+ "family": "News Cycle",
3796
+ "variants": [
3797
+ "regular",
3798
+ "700"
3799
+ ],
3800
+ "subsets": [
3801
+ "latin"
3802
+ ]
3803
+ },
3804
+ {
3805
+ "kind": "webfonts#webfont",
3806
+ "family": "Niconne",
3807
+ "variants": [
3808
+ "regular"
3809
+ ],
3810
+ "subsets": [
3811
+ "latin",
3812
+ "latin-ext"
3813
+ ]
3814
+ },
3815
+ {
3816
+ "kind": "webfonts#webfont",
3817
+ "family": "Nixie One",
3818
+ "variants": [
3819
+ "regular"
3820
+ ],
3821
+ "subsets": [
3822
+ "latin"
3823
+ ]
3824
+ },
3825
+ {
3826
+ "kind": "webfonts#webfont",
3827
+ "family": "Nobile",
3828
+ "variants": [
3829
+ "regular",
3830
+ "italic",
3831
+ "700",
3832
+ "700italic"
3833
+ ],
3834
+ "subsets": [
3835
+ "latin"
3836
+ ]
3837
+ },
3838
+ {
3839
+ "kind": "webfonts#webfont",
3840
+ "family": "Nokora",
3841
+ "variants": [
3842
+ "regular",
3843
+ "700"
3844
+ ],
3845
+ "subsets": [
3846
+ "khmer"
3847
+ ]
3848
+ },
3849
+ {
3850
+ "kind": "webfonts#webfont",
3851
+ "family": "Norican",
3852
+ "variants": [
3853
+ "regular"
3854
+ ],
3855
+ "subsets": [
3856
+ "latin",
3857
+ "latin-ext"
3858
+ ]
3859
+ },
3860
+ {
3861
+ "kind": "webfonts#webfont",
3862
+ "family": "Nosifer",
3863
+ "variants": [
3864
+ "regular"
3865
+ ],
3866
+ "subsets": [
3867
+ "latin",
3868
+ "latin-ext"
3869
+ ]
3870
+ },
3871
+ {
3872
+ "kind": "webfonts#webfont",
3873
+ "family": "Nothing You Could Do",
3874
+ "variants": [
3875
+ "regular"
3876
+ ],
3877
+ "subsets": [
3878
+ "latin"
3879
+ ]
3880
+ },
3881
+ {
3882
+ "kind": "webfonts#webfont",
3883
+ "family": "Noticia Text",
3884
+ "variants": [
3885
+ "regular",
3886
+ "italic",
3887
+ "700",
3888
+ "700italic"
3889
+ ],
3890
+ "subsets": [
3891
+ "latin",
3892
+ "vietnamese",
3893
+ "latin-ext"
3894
+ ]
3895
+ },
3896
+ {
3897
+ "kind": "webfonts#webfont",
3898
+ "family": "Nova Cut",
3899
+ "variants": [
3900
+ "regular"
3901
+ ],
3902
+ "subsets": [
3903
+ "latin"
3904
+ ]
3905
+ },
3906
+ {
3907
+ "kind": "webfonts#webfont",
3908
+ "family": "Nova Flat",
3909
+ "variants": [
3910
+ "regular"
3911
+ ],
3912
+ "subsets": [
3913
+ "latin"
3914
+ ]
3915
+ },
3916
+ {
3917
+ "kind": "webfonts#webfont",
3918
+ "family": "Nova Mono",
3919
+ "variants": [
3920
+ "regular"
3921
+ ],
3922
+ "subsets": [
3923
+ "latin",
3924
+ "greek"
3925
+ ]
3926
+ },
3927
+ {
3928
+ "kind": "webfonts#webfont",
3929
+ "family": "Nova Oval",
3930
+ "variants": [
3931
+ "regular"
3932
+ ],
3933
+ "subsets": [
3934
+ "latin"
3935
+ ]
3936
+ },
3937
+ {
3938
+ "kind": "webfonts#webfont",
3939
+ "family": "Nova Round",
3940
+ "variants": [
3941
+ "regular"
3942
+ ],
3943
+ "subsets": [
3944
+ "latin"
3945
+ ]
3946
+ },
3947
+ {
3948
+ "kind": "webfonts#webfont",
3949
+ "family": "Nova Script",
3950
+ "variants": [
3951
+ "regular"
3952
+ ],
3953
+ "subsets": [
3954
+ "latin"
3955
+ ]
3956
+ },
3957
+ {
3958
+ "kind": "webfonts#webfont",
3959
+ "family": "Nova Slim",
3960
+ "variants": [
3961
+ "regular"
3962
+ ],
3963
+ "subsets": [
3964
+ "latin"
3965
+ ]
3966
+ },
3967
+ {
3968
+ "kind": "webfonts#webfont",
3969
+ "family": "Nova Square",
3970
+ "variants": [
3971
+ "regular"
3972
+ ],
3973
+ "subsets": [
3974
+ "latin"
3975
+ ]
3976
+ },
3977
+ {
3978
+ "kind": "webfonts#webfont",
3979
+ "family": "Numans",
3980
+ "variants": [
3981
+ "regular"
3982
+ ],
3983
+ "subsets": [
3984
+ "latin"
3985
+ ]
3986
+ },
3987
+ {
3988
+ "kind": "webfonts#webfont",
3989
+ "family": "Nunito",
3990
+ "variants": [
3991
+ "300",
3992
+ "regular",
3993
+ "700"
3994
+ ],
3995
+ "subsets": [
3996
+ "latin"
3997
+ ]
3998
+ },
3999
+ {
4000
+ "kind": "webfonts#webfont",
4001
+ "family": "Odor Mean Chey",
4002
+ "variants": [
4003
+ "regular"
4004
+ ],
4005
+ "subsets": [
4006
+ "khmer"
4007
+ ]
4008
+ },
4009
+ {
4010
+ "kind": "webfonts#webfont",
4011
+ "family": "Old Standard TT",
4012
+ "variants": [
4013
+ "regular",
4014
+ "italic",
4015
+ "700"
4016
+ ],
4017
+ "subsets": [
4018
+ "latin"
4019
+ ]
4020
+ },
4021
+ {
4022
+ "kind": "webfonts#webfont",
4023
+ "family": "Oldenburg",
4024
+ "variants": [
4025
+ "regular"
4026
+ ],
4027
+ "subsets": [
4028
+ "latin",
4029
+ "latin-ext"
4030
+ ]
4031
+ },
4032
+ {
4033
+ "kind": "webfonts#webfont",
4034
+ "family": "Oleo Script",
4035
+ "variants": [
4036
+ "regular",
4037
+ "700"
4038
+ ],
4039
+ "subsets": [
4040
+ "latin",
4041
+ "latin-ext"
4042
+ ]
4043
+ },
4044
+ {
4045
+ "kind": "webfonts#webfont",
4046
+ "family": "Open Sans",
4047
+ "variants": [
4048
+ "300",
4049
+ "300italic",
4050
+ "regular",
4051
+ "italic",
4052
+ "600",
4053
+ "600italic",
4054
+ "700",
4055
+ "700italic",
4056
+ "800",
4057
+ "800italic"
4058
+ ],
4059
+ "subsets": [
4060
+ "greek-ext",
4061
+ "latin",
4062
+ "vietnamese",
4063
+ "cyrillic-ext",
4064
+ "latin-ext",
4065
+ "cyrillic",
4066
+ "greek"
4067
+ ]
4068
+ },
4069
+ {
4070
+ "kind": "webfonts#webfont",
4071
+ "family": "Open Sans Condensed",
4072
+ "variants": [
4073
+ "300",
4074
+ "300italic",
4075
+ "700"
4076
+ ],
4077
+ "subsets": [
4078
+ "greek-ext",
4079
+ "latin",
4080
+ "vietnamese",
4081
+ "cyrillic-ext",
4082
+ "latin-ext",
4083
+ "cyrillic",
4084
+ "greek"
4085
+ ]
4086
+ },
4087
+ {
4088
+ "kind": "webfonts#webfont",
4089
+ "family": "Orbitron",
4090
+ "variants": [
4091
+ "regular",
4092
+ "500",
4093
+ "700",
4094
+ "900"
4095
+ ],
4096
+ "subsets": [
4097
+ "latin"
4098
+ ]
4099
+ },
4100
+ {
4101
+ "kind": "webfonts#webfont",
4102
+ "family": "Original Surfer",
4103
+ "variants": [
4104
+ "regular"
4105
+ ],
4106
+ "subsets": [
4107
+ "latin"
4108
+ ]
4109
+ },
4110
+ {
4111
+ "kind": "webfonts#webfont",
4112
+ "family": "Oswald",
4113
+ "variants": [
4114
+ "300",
4115
+ "regular",
4116
+ "700"
4117
+ ],
4118
+ "subsets": [
4119
+ "latin",
4120
+ "latin-ext"
4121
+ ]
4122
+ },
4123
+ {
4124
+ "kind": "webfonts#webfont",
4125
+ "family": "Over the Rainbow",
4126
+ "variants": [
4127
+ "regular"
4128
+ ],
4129
+ "subsets": [
4130
+ "latin"
4131
+ ]
4132
+ },
4133
+ {
4134
+ "kind": "webfonts#webfont",
4135
+ "family": "Overlock",
4136
+ "variants": [
4137
+ "regular",
4138
+ "italic",
4139
+ "700",
4140
+ "700italic",
4141
+ "900",
4142
+ "900italic"
4143
+ ],
4144
+ "subsets": [
4145
+ "latin",
4146
+ "latin-ext"
4147
+ ]
4148
+ },
4149
+ {
4150
+ "kind": "webfonts#webfont",
4151
+ "family": "Overlock SC",
4152
+ "variants": [
4153
+ "regular"
4154
+ ],
4155
+ "subsets": [
4156
+ "latin",
4157
+ "latin-ext"
4158
+ ]
4159
+ },
4160
+ {
4161
+ "kind": "webfonts#webfont",
4162
+ "family": "Ovo",
4163
+ "variants": [
4164
+ "regular"
4165
+ ],
4166
+ "subsets": [
4167
+ "latin"
4168
+ ]
4169
+ },
4170
+ {
4171
+ "kind": "webfonts#webfont",
4172
+ "family": "Oxygen",
4173
+ "variants": [
4174
+ "regular"
4175
+ ],
4176
+ "subsets": [
4177
+ "latin",
4178
+ "latin-ext"
4179
+ ]
4180
+ },
4181
+ {
4182
+ "kind": "webfonts#webfont",
4183
+ "family": "PT Mono",
4184
+ "variants": [
4185
+ "regular"
4186
+ ],
4187
+ "subsets": [
4188
+ "latin",
4189
+ "cyrillic-ext",
4190
+ "latin-ext",
4191
+ "cyrillic"
4192
+ ]
4193
+ },
4194
+ {
4195
+ "kind": "webfonts#webfont",
4196
+ "family": "PT Sans",
4197
+ "variants": [
4198
+ "regular",
4199
+ "italic",
4200
+ "700",
4201
+ "700italic"
4202
+ ],
4203
+ "subsets": [
4204
+ "latin",
4205
+ "latin-ext",
4206
+ "cyrillic"
4207
+ ]
4208
+ },
4209
+ {
4210
+ "kind": "webfonts#webfont",
4211
+ "family": "PT Sans Caption",
4212
+ "variants": [
4213
+ "regular",
4214
+ "700"
4215
+ ],
4216
+ "subsets": [
4217
+ "latin",
4218
+ "latin-ext",
4219
+ "cyrillic"
4220
+ ]
4221
+ },
4222
+ {
4223
+ "kind": "webfonts#webfont",
4224
+ "family": "PT Sans Narrow",
4225
+ "variants": [
4226
+ "regular",
4227
+ "700"
4228
+ ],
4229
+ "subsets": [
4230
+ "latin",
4231
+ "latin-ext",
4232
+ "cyrillic"
4233
+ ]
4234
+ },
4235
+ {
4236
+ "kind": "webfonts#webfont",
4237
+ "family": "PT Serif",
4238
+ "variants": [
4239
+ "regular",
4240
+ "italic",
4241
+ "700",
4242
+ "700italic"
4243
+ ],
4244
+ "subsets": [
4245
+ "latin",
4246
+ "cyrillic"
4247
+ ]
4248
+ },
4249
+ {
4250
+ "kind": "webfonts#webfont",
4251
+ "family": "PT Serif Caption",
4252
+ "variants": [
4253
+ "regular",
4254
+ "italic"
4255
+ ],
4256
+ "subsets": [
4257
+ "latin",
4258
+ "cyrillic"
4259
+ ]
4260
+ },
4261
+ {
4262
+ "kind": "webfonts#webfont",
4263
+ "family": "Pacifico",
4264
+ "variants": [
4265
+ "regular"
4266
+ ],
4267
+ "subsets": [
4268
+ "latin"
4269
+ ]
4270
+ },
4271
+ {
4272
+ "kind": "webfonts#webfont",
4273
+ "family": "Parisienne",
4274
+ "variants": [
4275
+ "regular"
4276
+ ],
4277
+ "subsets": [
4278
+ "latin",
4279
+ "latin-ext"
4280
+ ]
4281
+ },
4282
+ {
4283
+ "kind": "webfonts#webfont",
4284
+ "family": "Passero One",
4285
+ "variants": [
4286
+ "regular"
4287
+ ],
4288
+ "subsets": [
4289
+ "latin",
4290
+ "latin-ext"
4291
+ ]
4292
+ },
4293
+ {
4294
+ "kind": "webfonts#webfont",
4295
+ "family": "Passion One",
4296
+ "variants": [
4297
+ "regular",
4298
+ "700",
4299
+ "900"
4300
+ ],
4301
+ "subsets": [
4302
+ "latin",
4303
+ "latin-ext"
4304
+ ]
4305
+ },
4306
+ {
4307
+ "kind": "webfonts#webfont",
4308
+ "family": "Patrick Hand",
4309
+ "variants": [
4310
+ "regular"
4311
+ ],
4312
+ "subsets": [
4313
+ "latin",
4314
+ "latin-ext"
4315
+ ]
4316
+ },
4317
+ {
4318
+ "kind": "webfonts#webfont",
4319
+ "family": "Patua One",
4320
+ "variants": [
4321
+ "regular"
4322
+ ],
4323
+ "subsets": [
4324
+ "latin"
4325
+ ]
4326
+ },
4327
+ {
4328
+ "kind": "webfonts#webfont",
4329
+ "family": "Paytone One",
4330
+ "variants": [
4331
+ "regular"
4332
+ ],
4333
+ "subsets": [
4334
+ "latin"
4335
+ ]
4336
+ },
4337
+ {
4338
+ "kind": "webfonts#webfont",
4339
+ "family": "Permanent Marker",
4340
+ "variants": [
4341
+ "regular"
4342
+ ],
4343
+ "subsets": [
4344
+ "latin"
4345
+ ]
4346
+ },
4347
+ {
4348
+ "kind": "webfonts#webfont",
4349
+ "family": "Petrona",
4350
+ "variants": [
4351
+ "regular"
4352
+ ],
4353
+ "subsets": [
4354
+ "latin"
4355
+ ]
4356
+ },
4357
+ {
4358
+ "kind": "webfonts#webfont",
4359
+ "family": "Philosopher",
4360
+ "variants": [
4361
+ "regular",
4362
+ "italic",
4363
+ "700",
4364
+ "700italic"
4365
+ ],
4366
+ "subsets": [
4367
+ "latin",
4368
+ "cyrillic"
4369
+ ]
4370
+ },
4371
+ {
4372
+ "kind": "webfonts#webfont",
4373
+ "family": "Piedra",
4374
+ "variants": [
4375
+ "regular"
4376
+ ],
4377
+ "subsets": [
4378
+ "latin",
4379
+ "latin-ext"
4380
+ ]
4381
+ },
4382
+ {
4383
+ "kind": "webfonts#webfont",
4384
+ "family": "Pinyon Script",
4385
+ "variants": [
4386
+ "regular"
4387
+ ],
4388
+ "subsets": [
4389
+ "latin"
4390
+ ]
4391
+ },
4392
+ {
4393
+ "kind": "webfonts#webfont",
4394
+ "family": "Plaster",
4395
+ "variants": [
4396
+ "regular"
4397
+ ],
4398
+ "subsets": [
4399
+ "latin",
4400
+ "latin-ext"
4401
+ ]
4402
+ },
4403
+ {
4404
+ "kind": "webfonts#webfont",
4405
+ "family": "Play",
4406
+ "variants": [
4407
+ "regular",
4408
+ "700"
4409
+ ],
4410
+ "subsets": [
4411
+ "greek-ext",
4412
+ "latin",
4413
+ "cyrillic-ext",
4414
+ "latin-ext",
4415
+ "cyrillic",
4416
+ "greek"
4417
+ ]
4418
+ },
4419
+ {
4420
+ "kind": "webfonts#webfont",
4421
+ "family": "Playball",
4422
+ "variants": [
4423
+ "regular"
4424
+ ],
4425
+ "subsets": [
4426
+ "latin",
4427
+ "latin-ext"
4428
+ ]
4429
+ },
4430
+ {
4431
+ "kind": "webfonts#webfont",
4432
+ "family": "Playfair Display",
4433
+ "variants": [
4434
+ "regular",
4435
+ "italic"
4436
+ ],
4437
+ "subsets": [
4438
+ "latin",
4439
+ "latin-ext"
4440
+ ]
4441
+ },
4442
+ {
4443
+ "kind": "webfonts#webfont",
4444
+ "family": "Podkova",
4445
+ "variants": [
4446
+ "regular",
4447
+ "700"
4448
+ ],
4449
+ "subsets": [
4450
+ "latin"
4451
+ ]
4452
+ },
4453
+ {
4454
+ "kind": "webfonts#webfont",
4455
+ "family": "Poiret One",
4456
+ "variants": [
4457
+ "regular"
4458
+ ],
4459
+ "subsets": [
4460
+ "latin",
4461
+ "latin-ext",
4462
+ "cyrillic"
4463
+ ]
4464
+ },
4465
+ {
4466
+ "kind": "webfonts#webfont",
4467
+ "family": "Poller One",
4468
+ "variants": [
4469
+ "regular"
4470
+ ],
4471
+ "subsets": [
4472
+ "latin"
4473
+ ]
4474
+ },
4475
+ {
4476
+ "kind": "webfonts#webfont",
4477
+ "family": "Poly",
4478
+ "variants": [
4479
+ "regular",
4480
+ "italic"
4481
+ ],
4482
+ "subsets": [
4483
+ "latin"
4484
+ ]
4485
+ },
4486
+ {
4487
+ "kind": "webfonts#webfont",
4488
+ "family": "Pompiere",
4489
+ "variants": [
4490
+ "regular"
4491
+ ],
4492
+ "subsets": [
4493
+ "latin"
4494
+ ]
4495
+ },
4496
+ {
4497
+ "kind": "webfonts#webfont",
4498
+ "family": "Pontano Sans",
4499
+ "variants": [
4500
+ "regular"
4501
+ ],
4502
+ "subsets": [
4503
+ "latin",
4504
+ "latin-ext"
4505
+ ]
4506
+ },
4507
+ {
4508
+ "kind": "webfonts#webfont",
4509
+ "family": "Port Lligat Sans",
4510
+ "variants": [
4511
+ "regular"
4512
+ ],
4513
+ "subsets": [
4514
+ "latin"
4515
+ ]
4516
+ },
4517
+ {
4518
+ "kind": "webfonts#webfont",
4519
+ "family": "Port Lligat Slab",
4520
+ "variants": [
4521
+ "regular"
4522
+ ],
4523
+ "subsets": [
4524
+ "latin"
4525
+ ]
4526
+ },
4527
+ {
4528
+ "kind": "webfonts#webfont",
4529
+ "family": "Prata",
4530
+ "variants": [
4531
+ "regular"
4532
+ ],
4533
+ "subsets": [
4534
+ "latin"
4535
+ ]
4536
+ },
4537
+ {
4538
+ "kind": "webfonts#webfont",
4539
+ "family": "Preahvihear",
4540
+ "variants": [
4541
+ "regular"
4542
+ ],
4543
+ "subsets": [
4544
+ "khmer"
4545
+ ]
4546
+ },
4547
+ {
4548
+ "kind": "webfonts#webfont",
4549
+ "family": "Press Start 2P",
4550
+ "variants": [
4551
+ "regular"
4552
+ ],
4553
+ "subsets": [
4554
+ "latin",
4555
+ "latin-ext",
4556
+ "cyrillic",
4557
+ "greek"
4558
+ ]
4559
+ },
4560
+ {
4561
+ "kind": "webfonts#webfont",
4562
+ "family": "Princess Sofia",
4563
+ "variants": [
4564
+ "regular"
4565
+ ],
4566
+ "subsets": [
4567
+ "latin",
4568
+ "latin-ext"
4569
+ ]
4570
+ },
4571
+ {
4572
+ "kind": "webfonts#webfont",
4573
+ "family": "Prociono",
4574
+ "variants": [
4575
+ "regular"
4576
+ ],
4577
+ "subsets": [
4578
+ "latin"
4579
+ ]
4580
+ },
4581
+ {
4582
+ "kind": "webfonts#webfont",
4583
+ "family": "Prosto One",
4584
+ "variants": [
4585
+ "regular"
4586
+ ],
4587
+ "subsets": [
4588
+ "latin",
4589
+ "latin-ext",
4590
+ "cyrillic"
4591
+ ]
4592
+ },
4593
+ {
4594
+ "kind": "webfonts#webfont",
4595
+ "family": "Puritan",
4596
+ "variants": [
4597
+ "regular",
4598
+ "italic",
4599
+ "700",
4600
+ "700italic"
4601
+ ],
4602
+ "subsets": [
4603
+ "latin"
4604
+ ]
4605
+ },
4606
+ {
4607
+ "kind": "webfonts#webfont",
4608
+ "family": "Quando",
4609
+ "variants": [
4610
+ "regular"
4611
+ ],
4612
+ "subsets": [
4613
+ "latin",
4614
+ "latin-ext"
4615
+ ]
4616
+ },
4617
+ {
4618
+ "kind": "webfonts#webfont",
4619
+ "family": "Quantico",
4620
+ "variants": [
4621
+ "regular",
4622
+ "italic",
4623
+ "700",
4624
+ "700italic"
4625
+ ],
4626
+ "subsets": [
4627
+ "latin"
4628
+ ]
4629
+ },
4630
+ {
4631
+ "kind": "webfonts#webfont",
4632
+ "family": "Quattrocento",
4633
+ "variants": [
4634
+ "regular",
4635
+ "700"
4636
+ ],
4637
+ "subsets": [
4638
+ "latin",
4639
+ "latin-ext"
4640
+ ]
4641
+ },
4642
+ {
4643
+ "kind": "webfonts#webfont",
4644
+ "family": "Quattrocento Sans",
4645
+ "variants": [
4646
+ "regular",
4647
+ "italic",
4648
+ "700",
4649
+ "700italic"
4650
+ ],
4651
+ "subsets": [
4652
+ "latin",
4653
+ "latin-ext"
4654
+ ]
4655
+ },
4656
+ {
4657
+ "kind": "webfonts#webfont",
4658
+ "family": "Questrial",
4659
+ "variants": [
4660
+ "regular"
4661
+ ],
4662
+ "subsets": [
4663
+ "latin"
4664
+ ]
4665
+ },
4666
+ {
4667
+ "kind": "webfonts#webfont",
4668
+ "family": "Quicksand",
4669
+ "variants": [
4670
+ "300",
4671
+ "regular",
4672
+ "700"
4673
+ ],
4674
+ "subsets": [
4675
+ "latin"
4676
+ ]
4677
+ },
4678
+ {
4679
+ "kind": "webfonts#webfont",
4680
+ "family": "Qwigley",
4681
+ "variants": [
4682
+ "regular"
4683
+ ],
4684
+ "subsets": [
4685
+ "latin",
4686
+ "latin-ext"
4687
+ ]
4688
+ },
4689
+ {
4690
+ "kind": "webfonts#webfont",
4691
+ "family": "Radley",
4692
+ "variants": [
4693
+ "regular",
4694
+ "italic"
4695
+ ],
4696
+ "subsets": [
4697
+ "latin",
4698
+ "latin-ext"
4699
+ ]
4700
+ },
4701
+ {
4702
+ "kind": "webfonts#webfont",
4703
+ "family": "Raleway",
4704
+ "variants": [
4705
+ "100"
4706
+ ],
4707
+ "subsets": [
4708
+ "latin"
4709
+ ]
4710
+ },
4711
+ {
4712
+ "kind": "webfonts#webfont",
4713
+ "family": "Rammetto One",
4714
+ "variants": [
4715
+ "regular"
4716
+ ],
4717
+ "subsets": [
4718
+ "latin",
4719
+ "latin-ext"
4720
+ ]
4721
+ },
4722
+ {
4723
+ "kind": "webfonts#webfont",
4724
+ "family": "Rancho",
4725
+ "variants": [
4726
+ "regular"
4727
+ ],
4728
+ "subsets": [
4729
+ "latin"
4730
+ ]
4731
+ },
4732
+ {
4733
+ "kind": "webfonts#webfont",
4734
+ "family": "Rationale",
4735
+ "variants": [
4736
+ "regular"
4737
+ ],
4738
+ "subsets": [
4739
+ "latin"
4740
+ ]
4741
+ },
4742
+ {
4743
+ "kind": "webfonts#webfont",
4744
+ "family": "Redressed",
4745
+ "variants": [
4746
+ "regular"
4747
+ ],
4748
+ "subsets": [
4749
+ "latin"
4750
+ ]
4751
+ },
4752
+ {
4753
+ "kind": "webfonts#webfont",
4754
+ "family": "Reenie Beanie",
4755
+ "variants": [
4756
+ "regular"
4757
+ ],
4758
+ "subsets": [
4759
+ "latin"
4760
+ ]
4761
+ },
4762
+ {
4763
+ "kind": "webfonts#webfont",
4764
+ "family": "Revalia",
4765
+ "variants": [
4766
+ "regular"
4767
+ ],
4768
+ "subsets": [
4769
+ "latin",
4770
+ "latin-ext"
4771
+ ]
4772
+ },
4773
+ {
4774
+ "kind": "webfonts#webfont",
4775
+ "family": "Ribeye",
4776
+ "variants": [
4777
+ "regular"
4778
+ ],
4779
+ "subsets": [
4780
+ "latin",
4781
+ "latin-ext"
4782
+ ]
4783
+ },
4784
+ {
4785
+ "kind": "webfonts#webfont",
4786
+ "family": "Ribeye Marrow",
4787
+ "variants": [
4788
+ "regular"
4789
+ ],
4790
+ "subsets": [
4791
+ "latin",
4792
+ "latin-ext"
4793
+ ]
4794
+ },
4795
+ {
4796
+ "kind": "webfonts#webfont",
4797
+ "family": "Righteous",
4798
+ "variants": [
4799
+ "regular"
4800
+ ],
4801
+ "subsets": [
4802
+ "latin",
4803
+ "latin-ext"
4804
+ ]
4805
+ },
4806
+ {
4807
+ "kind": "webfonts#webfont",
4808
+ "family": "Rochester",
4809
+ "variants": [
4810
+ "regular"
4811
+ ],
4812
+ "subsets": [
4813
+ "latin"
4814
+ ]
4815
+ },
4816
+ {
4817
+ "kind": "webfonts#webfont",
4818
+ "family": "Rock Salt",
4819
+ "variants": [
4820
+ "regular"
4821
+ ],
4822
+ "subsets": [
4823
+ "latin"
4824
+ ]
4825
+ },
4826
+ {
4827
+ "kind": "webfonts#webfont",
4828
+ "family": "Rokkitt",
4829
+ "variants": [
4830
+ "regular",
4831
+ "700"
4832
+ ],
4833
+ "subsets": [
4834
+ "latin"
4835
+ ]
4836
+ },
4837
+ {
4838
+ "kind": "webfonts#webfont",
4839
+ "family": "Ropa Sans",
4840
+ "variants": [
4841
+ "regular",
4842
+ "italic"
4843
+ ],
4844
+ "subsets": [
4845
+ "latin",
4846
+ "latin-ext"
4847
+ ]
4848
+ },
4849
+ {
4850
+ "kind": "webfonts#webfont",
4851
+ "family": "Rosario",
4852
+ "variants": [
4853
+ "regular",
4854
+ "italic",
4855
+ "700",
4856
+ "700italic"
4857
+ ],
4858
+ "subsets": [
4859
+ "latin"
4860
+ ]
4861
+ },
4862
+ {
4863
+ "kind": "webfonts#webfont",
4864
+ "family": "Rosarivo",
4865
+ "variants": [
4866
+ "regular",
4867
+ "italic"
4868
+ ],
4869
+ "subsets": [
4870
+ "latin",
4871
+ "latin-ext"
4872
+ ]
4873
+ },
4874
+ {
4875
+ "kind": "webfonts#webfont",
4876
+ "family": "Rouge Script",
4877
+ "variants": [
4878
+ "regular"
4879
+ ],
4880
+ "subsets": [
4881
+
4882
+ "latin"
4883
+ ]
4884
+ },
4885
+ {
4886
+ "kind": "webfonts#webfont",
4887
+ "family": "Ruda",
4888
+ "variants": [
4889
+ "regular",
4890
+ "700",
4891
+ "900"
4892
+ ],
4893
+ "subsets": [
4894
+ "latin",
4895
+ "latin-ext"
4896
+ ]
4897
+ },
4898
+ {
4899
+ "kind": "webfonts#webfont",
4900
+ "family": "Ruge Boogie",
4901
+ "variants": [
4902
+ "regular"
4903
+ ],
4904
+ "subsets": [
4905
+ "latin",
4906
+ "latin-ext"
4907
+ ]
4908
+ },
4909
+ {
4910
+ "kind": "webfonts#webfont",
4911
+ "family": "Ruluko",
4912
+ "variants": [
4913
+ "regular"
4914
+ ],
4915
+ "subsets": [
4916
+ "latin",
4917
+ "latin-ext"
4918
+ ]
4919
+ },
4920
+ {
4921
+ "kind": "webfonts#webfont",
4922
+ "family": "Ruslan Display",
4923
+ "variants": [
4924
+ "regular"
4925
+ ],
4926
+ "subsets": [
4927
+ "latin",
4928
+ "cyrillic-ext",
4929
+ "latin-ext",
4930
+ "cyrillic"
4931
+ ]
4932
+ },
4933
+ {
4934
+ "kind": "webfonts#webfont",
4935
+ "family": "Russo One",
4936
+ "variants": [
4937
+ "regular"
4938
+ ],
4939
+ "subsets": [
4940
+ "latin",
4941
+ "latin-ext",
4942
+ "cyrillic"
4943
+ ]
4944
+ },
4945
+ {
4946
+ "kind": "webfonts#webfont",
4947
+ "family": "Ruthie",
4948
+ "variants": [
4949
+ "regular"
4950
+ ],
4951
+ "subsets": [
4952
+ "latin",
4953
+ "latin-ext"
4954
+ ]
4955
+ },
4956
+ {
4957
+ "kind": "webfonts#webfont",
4958
+ "family": "Sail",
4959
+ "variants": [
4960
+ "regular"
4961
+ ],
4962
+ "subsets": [
4963
+ "latin"
4964
+ ]
4965
+ },
4966
+ {
4967
+ "kind": "webfonts#webfont",
4968
+ "family": "Salsa",
4969
+ "variants": [
4970
+ "regular"
4971
+ ],
4972
+ "subsets": [
4973
+ "latin"
4974
+ ]
4975
+ },
4976
+ {
4977
+ "kind": "webfonts#webfont",
4978
+ "family": "Sancreek",
4979
+ "variants": [
4980
+ "regular"
4981
+ ],
4982
+ "subsets": [
4983
+ "latin",
4984
+ "latin-ext"
4985
+ ]
4986
+ },
4987
+ {
4988
+ "kind": "webfonts#webfont",
4989
+ "family": "Sansita One",
4990
+ "variants": [
4991
+ "regular"
4992
+ ],
4993
+ "subsets": [
4994
+ "latin"
4995
+ ]
4996
+ },
4997
+ {
4998
+ "kind": "webfonts#webfont",
4999
+ "family": "Sarina",
5000
+ "variants": [
5001
+ "regular"
5002
+ ],
5003
+ "subsets": [
5004
+ "latin",
5005
+ "latin-ext"
5006
+ ]
5007
+ },
5008
+ {
5009
+ "kind": "webfonts#webfont",
5010
+ "family": "Satisfy",
5011
+ "variants": [
5012
+ "regular"
5013
+ ],
5014
+ "subsets": [
5015
+ "latin"
5016
+ ]
5017
+ },
5018
+ {
5019
+ "kind": "webfonts#webfont",
5020
+ "family": "Schoolbell",
5021
+ "variants": [
5022
+ "regular"
5023
+ ],
5024
+ "subsets": [
5025
+ "latin"
5026
+ ]
5027
+ },
5028
+ {
5029
+ "kind": "webfonts#webfont",
5030
+ "family": "Seaweed Script",
5031
+ "variants": [
5032
+ "regular"
5033
+ ],
5034
+ "subsets": [
5035
+ "latin",
5036
+ "latin-ext"
5037
+ ]
5038
+ },
5039
+ {
5040
+ "kind": "webfonts#webfont",
5041
+ "family": "Sevillana",
5042
+ "variants": [
5043
+ "regular"
5044
+ ],
5045
+ "subsets": [
5046
+ "latin",
5047
+ "latin-ext"
5048
+ ]
5049
+ },
5050
+ {
5051
+ "kind": "webfonts#webfont",
5052
+ "family": "Shadows Into Light",
5053
+ "variants": [
5054
+ "regular"
5055
+ ],
5056
+ "subsets": [
5057
+ "latin"
5058
+ ]
5059
+ },
5060
+ {
5061
+ "kind": "webfonts#webfont",
5062
+ "family": "Shadows Into Light Two",
5063
+ "variants": [
5064
+ "regular"
5065
+ ],
5066
+ "subsets": [
5067
+ "latin",
5068
+ "latin-ext"
5069
+ ]
5070
+ },
5071
+ {
5072
+ "kind": "webfonts#webfont",
5073
+ "family": "Shanti",
5074
+ "variants": [
5075
+ "regular"
5076
+ ],
5077
+ "subsets": [
5078
+ "latin"
5079
+ ]
5080
+ },
5081
+ {
5082
+ "kind": "webfonts#webfont",
5083
+ "family": "Share",
5084
+ "variants": [
5085
+ "regular",
5086
+ "italic",
5087
+ "700",
5088
+ "700italic"
5089
+ ],
5090
+ "subsets": [
5091
+ "latin",
5092
+ "latin-ext"
5093
+ ]
5094
+ },
5095
+ {
5096
+ "kind": "webfonts#webfont",
5097
+ "family": "Shojumaru",
5098
+ "variants": [
5099
+ "regular"
5100
+ ],
5101
+ "subsets": [
5102
+ "latin",
5103
+ "latin-ext"
5104
+ ]
5105
+ },
5106
+ {
5107
+ "kind": "webfonts#webfont",
5108
+ "family": "Short Stack",
5109
+ "variants": [
5110
+ "regular"
5111
+ ],
5112
+ "subsets": [
5113
+ "latin"
5114
+ ]
5115
+ },
5116
+ {
5117
+ "kind": "webfonts#webfont",
5118
+ "family": "Siemreap",
5119
+ "variants": [
5120
+ "regular"
5121
+ ],
5122
+ "subsets": [
5123
+ "khmer"
5124
+ ]
5125
+ },
5126
+ {
5127
+ "kind": "webfonts#webfont",
5128
+ "family": "Sigmar One",
5129
+ "variants": [
5130
+ "regular"
5131
+ ],
5132
+ "subsets": [
5133
+ "latin"
5134
+ ]
5135
+ },
5136
+ {
5137
+ "kind": "webfonts#webfont",
5138
+ "family": "Signika",
5139
+ "variants": [
5140
+ "300",
5141
+ "regular",
5142
+ "600",
5143
+ "700"
5144
+ ],
5145
+ "subsets": [
5146
+ "latin",
5147
+ "latin-ext"
5148
+ ]
5149
+ },
5150
+ {
5151
+ "kind": "webfonts#webfont",
5152
+ "family": "Signika Negative",
5153
+ "variants": [
5154
+ "300",
5155
+ "regular",
5156
+ "600",
5157
+ "700"
5158
+ ],
5159
+ "subsets": [
5160
+ "latin",
5161
+ "latin-ext"
5162
+ ]
5163
+ },
5164
+ {
5165
+ "kind": "webfonts#webfont",
5166
+ "family": "Simonetta",
5167
+ "variants": [
5168
+ "regular",
5169
+ "italic",
5170
+ "900",
5171
+ "900italic"
5172
+ ],
5173
+ "subsets": [
5174
+ "latin",
5175
+ "latin-ext"
5176
+ ]
5177
+ },
5178
+ {
5179
+ "kind": "webfonts#webfont",
5180
+ "family": "Sirin Stencil",
5181
+ "variants": [
5182
+ "regular"
5183
+ ],
5184
+ "subsets": [
5185
+ "latin"
5186
+ ]
5187
+ },
5188
+ {
5189
+ "kind": "webfonts#webfont",
5190
+ "family": "Six Caps",
5191
+ "variants": [
5192
+ "regular"
5193
+ ],
5194
+ "subsets": [
5195
+ "latin"
5196
+ ]
5197
+ },
5198
+ {
5199
+ "kind": "webfonts#webfont",
5200
+ "family": "Slackey",
5201
+ "variants": [
5202
+ "regular"
5203
+ ],
5204
+ "subsets": [
5205
+ "latin"
5206
+ ]
5207
+ },
5208
+ {
5209
+ "kind": "webfonts#webfont",
5210
+ "family": "Smokum",
5211
+ "variants": [
5212
+ "regular"
5213
+ ],
5214
+ "subsets": [
5215
+ "latin"
5216
+ ]
5217
+ },
5218
+ {
5219
+ "kind": "webfonts#webfont",
5220
+ "family": "Smythe",
5221
+ "variants": [
5222
+ "regular"
5223
+ ],
5224
+ "subsets": [
5225
+ "latin"
5226
+ ]
5227
+ },
5228
+ {
5229
+ "kind": "webfonts#webfont",
5230
+ "family": "Sniglet",
5231
+ "variants": [
5232
+ "800"
5233
+ ],
5234
+ "subsets": [
5235
+ "latin"
5236
+ ]
5237
+ },
5238
+ {
5239
+ "kind": "webfonts#webfont",
5240
+ "family": "Snippet",
5241
+ "variants": [
5242
+ "regular"
5243
+ ],
5244
+ "subsets": [
5245
+ "latin"
5246
+ ]
5247
+ },
5248
+ {
5249
+ "kind": "webfonts#webfont",
5250
+ "family": "Sofia",
5251
+ "variants": [
5252
+ "regular"
5253
+ ],
5254
+ "subsets": [
5255
+ "latin"
5256
+ ]
5257
+ },
5258
+ {
5259
+ "kind": "webfonts#webfont",
5260
+ "family": "Sonsie One",
5261
+ "variants": [
5262
+ "regular"
5263
+ ],
5264
+ "subsets": [
5265
+ "latin",
5266
+ "latin-ext"
5267
+ ]
5268
+ },
5269
+ {
5270
+ "kind": "webfonts#webfont",
5271
+ "family": "Sorts Mill Goudy",
5272
+ "variants": [
5273
+ "regular",
5274
+ "italic"
5275
+ ],
5276
+ "subsets": [
5277
+ "latin",
5278
+ "latin-ext"
5279
+ ]
5280
+ },
5281
+ {
5282
+ "kind": "webfonts#webfont",
5283
+ "family": "Source Sans Pro",
5284
+ "variants": [
5285
+ "200",
5286
+ "200italic",
5287
+ "300",
5288
+ "300italic",
5289
+ "regular",
5290
+ "italic",
5291
+ "600",
5292
+ "600italic",
5293
+ "700",
5294
+ "700italic",
5295
+ "900",
5296
+ "900italic"
5297
+ ],
5298
+ "subsets": [
5299
+ "latin",
5300
+ "latin-ext"
5301
+ ]
5302
+ },
5303
+ {
5304
+ "kind": "webfonts#webfont",
5305
+ "family": "Special Elite",
5306
+ "variants": [
5307
+ "regular"
5308
+ ],
5309
+ "subsets": [
5310
+ "latin"
5311
+ ]
5312
+ },
5313
+ {
5314
+ "kind": "webfonts#webfont",
5315
+ "family": "Spicy Rice",
5316
+ "variants": [
5317
+ "regular"
5318
+ ],
5319
+ "subsets": [
5320
+ "latin"
5321
+ ]
5322
+ },
5323
+ {
5324
+ "kind": "webfonts#webfont",
5325
+ "family": "Spinnaker",
5326
+ "variants": [
5327
+ "regular"
5328
+ ],
5329
+ "subsets": [
5330
+ "latin",
5331
+ "latin-ext"
5332
+ ]
5333
+ },
5334
+ {
5335
+ "kind": "webfonts#webfont",
5336
+ "family": "Spirax",
5337
+ "variants": [
5338
+ "regular"
5339
+ ],
5340
+ "subsets": [
5341
+ "latin"
5342
+ ]
5343
+ },
5344
+ {
5345
+ "kind": "webfonts#webfont",
5346
+ "family": "Squada One",
5347
+ "variants": [
5348
+ "regular"
5349
+ ],
5350
+ "subsets": [
5351
+ "latin"
5352
+ ]
5353
+ },
5354
+ {
5355
+ "kind": "webfonts#webfont",
5356
+ "family": "Stardos Stencil",
5357
+ "variants": [
5358
+ "regular",
5359
+ "700"
5360
+ ],
5361
+ "subsets": [
5362
+ "latin"
5363
+ ]
5364
+ },
5365
+ {
5366
+ "kind": "webfonts#webfont",
5367
+ "family": "Stint Ultra Condensed",
5368
+ "variants": [
5369
+ "regular"
5370
+ ],
5371
+ "subsets": [
5372
+ "latin",
5373
+ "latin-ext"
5374
+ ]
5375
+ },
5376
+ {
5377
+ "kind": "webfonts#webfont",
5378
+ "family": "Stint Ultra Expanded",
5379
+ "variants": [
5380
+ "regular"
5381
+ ],
5382
+ "subsets": [
5383
+ "latin",
5384
+ "latin-ext"
5385
+ ]
5386
+ },
5387
+ {
5388
+ "kind": "webfonts#webfont",
5389
+ "family": "Stoke",
5390
+ "variants": [
5391
+ "regular"
5392
+ ],
5393
+ "subsets": [
5394
+ "latin",
5395
+ "latin-ext"
5396
+ ]
5397
+ },
5398
+ {
5399
+ "kind": "webfonts#webfont",
5400
+ "family": "Sue Ellen Francisco",
5401
+ "variants": [
5402
+ "regular"
5403
+ ],
5404
+ "subsets": [
5405
+ "latin"
5406
+ ]
5407
+ },
5408
+ {
5409
+ "kind": "webfonts#webfont",
5410
+ "family": "Sunshiney",
5411
+ "variants": [
5412
+ "regular"
5413
+ ],
5414
+ "subsets": [
5415
+ "latin"
5416
+ ]
5417
+ },
5418
+ {
5419
+ "kind": "webfonts#webfont",
5420
+ "family": "Supermercado One",
5421
+ "variants": [
5422
+ "regular"
5423
+ ],
5424
+ "subsets": [
5425
+ "latin"
5426
+ ]
5427
+ },
5428
+ {
5429
+ "kind": "webfonts#webfont",
5430
+ "family": "Suwannaphum",
5431
+ "variants": [
5432
+ "regular"
5433
+ ],
5434
+ "subsets": [
5435
+ "khmer"
5436
+ ]
5437
+ },
5438
+ {
5439
+ "kind": "webfonts#webfont",
5440
+ "family": "Swanky and Moo Moo",
5441
+ "variants": [
5442
+ "regular"
5443
+ ],
5444
+ "subsets": [
5445
+ "latin"
5446
+ ]
5447
+ },
5448
+ {
5449
+ "kind": "webfonts#webfont",
5450
+ "family": "Syncopate",
5451
+ "variants": [
5452
+ "regular",
5453
+ "700"
5454
+ ],
5455
+ "subsets": [
5456
+ "latin"
5457
+ ]
5458
+ },
5459
+ {
5460
+ "kind": "webfonts#webfont",
5461
+ "family": "Tangerine",
5462
+ "variants": [
5463
+ "regular",
5464
+ "700"
5465
+ ],
5466
+ "subsets": [
5467
+ "latin"
5468
+ ]
5469
+ },
5470
+ {
5471
+ "kind": "webfonts#webfont",
5472
+ "family": "Taprom",
5473
+ "variants": [
5474
+ "regular"
5475
+ ],
5476
+ "subsets": [
5477
+ "khmer"
5478
+ ]
5479
+ },
5480
+ {
5481
+ "kind": "webfonts#webfont",
5482
+ "family": "Telex",
5483
+ "variants": [
5484
+ "regular"
5485
+ ],
5486
+ "subsets": [
5487
+ "latin"
5488
+ ]
5489
+ },
5490
+ {
5491
+ "kind": "webfonts#webfont",
5492
+ "family": "Tenor Sans",
5493
+ "variants": [
5494
+ "regular"
5495
+ ],
5496
+ "subsets": [
5497
+ "latin",
5498
+ "cyrillic-ext",
5499
+ "latin-ext",
5500
+ "cyrillic"
5501
+ ]
5502
+ },
5503
+ {
5504
+ "kind": "webfonts#webfont",
5505
+ "family": "The Girl Next Door",
5506
+ "variants": [
5507
+ "regular"
5508
+ ],
5509
+ "subsets": [
5510
+ "latin"
5511
+ ]
5512
+ },
5513
+ {
5514
+ "kind": "webfonts#webfont",
5515
+ "family": "Tienne",
5516
+ "variants": [
5517
+ "regular",
5518
+ "700",
5519
+ "900"
5520
+ ],
5521
+ "subsets": [
5522
+ "latin"
5523
+ ]
5524
+ },
5525
+ {
5526
+ "kind": "webfonts#webfont",
5527
+ "family": "Tinos",
5528
+ "variants": [
5529
+ "regular",
5530
+ "italic",
5531
+ "700",
5532
+ "700italic"
5533
+ ],
5534
+ "subsets": [
5535
+ "latin"
5536
+ ]
5537
+ },
5538
+ {
5539
+ "kind": "webfonts#webfont",
5540
+ "family": "Titan One",
5541
+ "variants": [
5542
+ "regular"
5543
+ ],
5544
+ "subsets": [
5545
+ "latin",
5546
+ "latin-ext"
5547
+ ]
5548
+ },
5549
+ {
5550
+ "kind": "webfonts#webfont",
5551
+ "family": "Trade Winds",
5552
+ "variants": [
5553
+ "regular"
5554
+ ],
5555
+ "subsets": [
5556
+ "latin"
5557
+ ]
5558
+ },
5559
+ {
5560
+ "kind": "webfonts#webfont",
5561
+ "family": "Trocchi",
5562
+ "variants": [
5563
+ "regular"
5564
+ ],
5565
+ "subsets": [
5566
+ "latin",
5567
+ "latin-ext"
5568
+ ]
5569
+ },
5570
+ {
5571
+ "kind": "webfonts#webfont",
5572
+ "family": "Trochut",
5573
+ "variants": [
5574
+ "regular",
5575
+ "italic",
5576
+ "700"
5577
+ ],
5578
+ "subsets": [
5579
+ "latin"
5580
+ ]
5581
+ },
5582
+ {
5583
+ "kind": "webfonts#webfont",
5584
+ "family": "Trykker",
5585
+ "variants": [
5586
+ "regular"
5587
+ ],
5588
+ "subsets": [
5589
+ "latin",
5590
+ "latin-ext"
5591
+ ]
5592
+ },
5593
+ {
5594
+ "kind": "webfonts#webfont",
5595
+ "family": "Tulpen One",
5596
+ "variants": [
5597
+ "regular"
5598
+ ],
5599
+ "subsets": [
5600
+ "latin"
5601
+ ]
5602
+ },
5603
+ {
5604
+ "kind": "webfonts#webfont",
5605
+ "family": "Ubuntu",
5606
+ "variants": [
5607
+ "300",
5608
+ "300italic",
5609
+ "regular",
5610
+ "italic",
5611
+ "500",
5612
+ "500italic",
5613
+ "700",
5614
+ "700italic"
5615
+ ],
5616
+ "subsets": [
5617
+ "greek-ext",
5618
+ "latin",
5619
+ "cyrillic-ext",
5620
+ "latin-ext",
5621
+ "cyrillic",
5622
+ "greek"
5623
+ ]
5624
+ },
5625
+ {
5626
+ "kind": "webfonts#webfont",
5627
+ "family": "Ubuntu Condensed",
5628
+ "variants": [
5629
+ "regular"
5630
+ ],
5631
+ "subsets": [
5632
+ "greek-ext",
5633
+ "latin",
5634
+ "cyrillic-ext",
5635
+ "latin-ext",
5636
+ "cyrillic",
5637
+ "greek"
5638
+ ]
5639
+ },
5640
+ {
5641
+ "kind": "webfonts#webfont",
5642
+ "family": "Ubuntu Mono",
5643
+ "variants": [
5644
+ "regular",
5645
+ "italic",
5646
+ "700",
5647
+ "700italic"
5648
+ ],
5649
+ "subsets": [
5650
+ "greek-ext",
5651
+ "latin",
5652
+
5653
+ "cyrillic-ext",
5654
+ "latin-ext",
5655
+ "cyrillic",
5656
+ "greek"
5657
+ ]
5658
+ },
5659
+ {
5660
+ "kind": "webfonts#webfont",
5661
+ "family": "Ultra",
5662
+ "variants": [
5663
+ "regular"
5664
+ ],
5665
+ "subsets": [
5666
+ "latin"
5667
+ ]
5668
+ },
5669
+ {
5670
+ "kind": "webfonts#webfont",
5671
+ "family": "Uncial Antiqua",
5672
+ "variants": [
5673
+ "regular"
5674
+ ],
5675
+ "subsets": [
5676
+ "latin"
5677
+ ]
5678
+ },
5679
+ {
5680
+ "kind": "webfonts#webfont",
5681
+ "family": "UnifrakturCook",
5682
+ "variants": [
5683
+ "700"
5684
+ ],
5685
+ "subsets": [
5686
+ "latin"
5687
+ ]
5688
+ },
5689
+ {
5690
+ "kind": "webfonts#webfont",
5691
+ "family": "UnifrakturMaguntia",
5692
+ "variants": [
5693
+ "regular"
5694
+ ],
5695
+ "subsets": [
5696
+ "latin"
5697
+ ]
5698
+ },
5699
+ {
5700
+ "kind": "webfonts#webfont",
5701
+ "family": "Unkempt",
5702
+ "variants": [
5703
+ "regular",
5704
+ "700"
5705
+ ],
5706
+ "subsets": [
5707
+ "latin"
5708
+ ]
5709
+ },
5710
+ {
5711
+ "kind": "webfonts#webfont",
5712
+ "family": "Unlock",
5713
+ "variants": [
5714
+ "regular"
5715
+ ],
5716
+ "subsets": [
5717
+ "latin"
5718
+ ]
5719
+ },
5720
+ {
5721
+ "kind": "webfonts#webfont",
5722
+ "family": "Unna",
5723
+ "variants": [
5724
+ "regular"
5725
+ ],
5726
+ "subsets": [
5727
+ "latin"
5728
+ ]
5729
+ },
5730
+ {
5731
+ "kind": "webfonts#webfont",
5732
+ "family": "VT323",
5733
+ "variants": [
5734
+ "regular"
5735
+ ],
5736
+ "subsets": [
5737
+ "latin"
5738
+ ]
5739
+ },
5740
+ {
5741
+ "kind": "webfonts#webfont",
5742
+ "family": "Varela",
5743
+ "variants": [
5744
+ "regular"
5745
+ ],
5746
+ "subsets": [
5747
+ "latin",
5748
+ "latin-ext"
5749
+ ]
5750
+ },
5751
+ {
5752
+ "kind": "webfonts#webfont",
5753
+ "family": "Varela Round",
5754
+ "variants": [
5755
+ "regular"
5756
+ ],
5757
+ "subsets": [
5758
+ "latin"
5759
+ ]
5760
+ },
5761
+ {
5762
+ "kind": "webfonts#webfont",
5763
+ "family": "Vast Shadow",
5764
+ "variants": [
5765
+ "regular"
5766
+ ],
5767
+ "subsets": [
5768
+ "latin"
5769
+ ]
5770
+ },
5771
+ {
5772
+ "kind": "webfonts#webfont",
5773
+ "family": "Vibur",
5774
+ "variants": [
5775
+ "regular"
5776
+ ],
5777
+ "subsets": [
5778
+ "latin"
5779
+ ]
5780
+ },
5781
+ {
5782
+ "kind": "webfonts#webfont",
5783
+ "family": "Vidaloka",
5784
+ "variants": [
5785
+ "regular"
5786
+ ],
5787
+ "subsets": [
5788
+ "latin"
5789
+ ]
5790
+ },
5791
+ {
5792
+ "kind": "webfonts#webfont",
5793
+ "family": "Viga",
5794
+ "variants": [
5795
+ "regular"
5796
+ ],
5797
+ "subsets": [
5798
+ "latin",
5799
+ "latin-ext"
5800
+ ]
5801
+ },
5802
+ {
5803
+ "kind": "webfonts#webfont",
5804
+ "family": "Voces",
5805
+ "variants": [
5806
+ "regular"
5807
+ ],
5808
+ "subsets": [
5809
+ "latin",
5810
+ "latin-ext"
5811
+ ]
5812
+ },
5813
+ {
5814
+ "kind": "webfonts#webfont",
5815
+ "family": "Volkhov",
5816
+ "variants": [
5817
+ "regular",
5818
+ "italic",
5819
+ "700",
5820
+ "700italic"
5821
+ ],
5822
+ "subsets": [
5823
+ "latin"
5824
+ ]
5825
+ },
5826
+ {
5827
+ "kind": "webfonts#webfont",
5828
+ "family": "Vollkorn",
5829
+ "variants": [
5830
+ "regular",
5831
+ "italic",
5832
+ "700",
5833
+ "700italic"
5834
+ ],
5835
+ "subsets": [
5836
+ "latin"
5837
+ ]
5838
+ },
5839
+ {
5840
+ "kind": "webfonts#webfont",
5841
+ "family": "Voltaire",
5842
+ "variants": [
5843
+ "regular"
5844
+ ],
5845
+ "subsets": [
5846
+ "latin"
5847
+ ]
5848
+ },
5849
+ {
5850
+ "kind": "webfonts#webfont",
5851
+ "family": "Waiting for the Sunrise",
5852
+ "variants": [
5853
+ "regular"
5854
+ ],
5855
+ "subsets": [
5856
+ "latin"
5857
+ ]
5858
+ },
5859
+ {
5860
+ "kind": "webfonts#webfont",
5861
+ "family": "Wallpoet",
5862
+ "variants": [
5863
+ "regular"
5864
+ ],
5865
+ "subsets": [
5866
+ "latin"
5867
+ ]
5868
+ },
5869
+ {
5870
+ "kind": "webfonts#webfont",
5871
+ "family": "Walter Turncoat",
5872
+ "variants": [
5873
+ "regular"
5874
+ ],
5875
+ "subsets": [
5876
+ "latin"
5877
+ ]
5878
+ },
5879
+ {
5880
+ "kind": "webfonts#webfont",
5881
+ "family": "Wellfleet",
5882
+ "variants": [
5883
+ "regular"
5884
+ ],
5885
+ "subsets": [
5886
+ "latin",
5887
+ "latin-ext"
5888
+ ]
5889
+ },
5890
+ {
5891
+ "kind": "webfonts#webfont",
5892
+ "family": "Wire One",
5893
+ "variants": [
5894
+ "regular"
5895
+ ],
5896
+ "subsets": [
5897
+ "latin"
5898
+ ]
5899
+ },
5900
+ {
5901
+ "kind": "webfonts#webfont",
5902
+ "family": "Yanone Kaffeesatz",
5903
+ "variants": [
5904
+ "200",
5905
+ "300",
5906
+ "regular",
5907
+ "700"
5908
+ ],
5909
+ "subsets": [
5910
+
5911
+ "latin",
5912
+ "latin-ext"
5913
+ ]
5914
+ },
5915
+ {
5916
+ "kind": "webfonts#webfont",
5917
+ "family": "Yellowtail",
5918
+ "variants": [
5919
+ "regular"
5920
+ ],
5921
+ "subsets": [
5922
+ "latin"
5923
+ ]
5924
+ },
5925
+ {
5926
+ "kind": "webfonts#webfont",
5927
+ "family": "Yeseva One",
5928
+ "variants": [
5929
+ "regular"
5930
+ ],
5931
+ "subsets": [
5932
+ "latin"
5933
+ ]
5934
+ },
5935
+ {
5936
+ "kind": "webfonts#webfont",
5937
+ "family": "Yesteryear",
5938
+ "variants": [
5939
+ "regular"
5940
+ ],
5941
+ "subsets": [
5942
+ "latin"
5943
+ ]
5944
+ },
5945
+ {
5946
+ "kind": "webfonts#webfont",
5947
+ "family": "Zeyada",
5948
+ "variants": [
5949
+ "regular"
5950
+ ],
5951
+ "subsets": [
5952
+ "latin"
5953
+ ]
5954
+ }
5955
+ ]
5956
+ }';
5957
+
5958
+ $google_fonts_array = json_decode( $google_webfonts, TRUE );
5959
+ return $google_fonts_array['items'];
5960
+ }
5961
  ?>
admin/includes/ot-functions-admin.php CHANGED
@@ -1,6111 +1,6111 @@
1
- <?php
2
- /**
3
- * Functions used only while viewing the admin UI.
4
- *
5
- * Limit loading these function only when needed
6
- * and not in the front end.
7
- *
8
- * @package OptionTree
9
- */
10
-
11
- if ( ! defined( 'OT_VERSION' ) ) {
12
- exit( 'No direct script access allowed' );
13
- }
14
-
15
- if ( ! function_exists( 'ot_register_theme_options_page' ) ) {
16
-
17
- /**
18
- * Registers the Theme Option page
19
- *
20
- * @uses ot_register_settings()
21
- *
22
- * @access public
23
- * @since 2.1
24
- */
25
- function ot_register_theme_options_page() {
26
-
27
- // Get the settings array.
28
- $get_settings = get_option( ot_settings_id() );
29
-
30
- // Sections array.
31
- $sections = isset( $get_settings['sections'] ) ? $get_settings['sections'] : array();
32
-
33
- // Settings array.
34
- $settings = isset( $get_settings['settings'] ) ? $get_settings['settings'] : array();
35
-
36
- // Contexual help array.
37
- $contextual_help = isset( $get_settings['contextual_help'] ) ? $get_settings['contextual_help'] : array();
38
-
39
- // Build the Theme Options.
40
- if ( function_exists( 'ot_register_settings' ) && OT_USE_THEME_OPTIONS ) {
41
-
42
- $caps = apply_filters( 'ot_theme_options_capability', 'edit_theme_options' );
43
-
44
- ot_register_settings(
45
- array(
46
- array(
47
- 'id' => ot_options_id(),
48
- 'pages' => array(
49
- array(
50
- 'id' => 'niftycs_options',
51
- 'parent_slug' => apply_filters( 'niftycs_options_parent_slug', null ),
52
- 'page_title' => apply_filters( 'niftycs_options_page_title', __( 'Nifty Coming Soon, Maintenance &amp; Under Construction Options', 'option-tree' ) ),
53
- 'menu_title' => apply_filters( 'niftycs_options_menu_title', __( 'Nifty Options', 'option-tree' ) ),
54
- 'capability' => $caps = apply_filters( 'niftycs_options_capability', 'edit_theme_options' ),
55
- 'menu_slug' => apply_filters( 'niftycs_options_menu_slug', 'niftycs-options' ),
56
- 'icon_url' => apply_filters( 'niftycs_options_icon_url', OT_URL .'/assets/images/nifty_ot.png' ),
57
- 'position' => apply_filters( 'niftycs_options_position', null ),
58
- 'updated_message' => apply_filters( 'niftycs_options_updated_message', __( 'Nifty Options updated.', 'option-tree' ) ),
59
- 'reset_message' => apply_filters( 'niftycs_options_reset_message', __( 'Nifty Options restored to default value.', 'option-tree' ) ),
60
- 'button_text' => apply_filters( 'niftycs_options_button_text', __( 'Save Changes', 'option-tree' ) ),
61
- 'contextual_help' => apply_filters( 'niftycs_options_contextual_help', $contextual_help ),
62
- 'sections' => apply_filters( 'niftycs_options_sections', $sections ),
63
- 'settings' => apply_filters( 'niftycs_options_settings', $settings )
64
- ),
65
- ),
66
- ),
67
- )
68
- );
69
-
70
- // Filters the options.php to add the minimum user capabilities.
71
- add_filter(
72
- 'option_page_capability_' . ot_options_id(),
73
- function() use ( $caps ) {
74
- return $caps;
75
- },
76
- 999
77
- );
78
-
79
- }
80
-
81
- }
82
-
83
- }
84
-
85
- if ( ! function_exists( 'ot_register_settings_page' ) ) {
86
-
87
- /**
88
- * Registers the Settings page.
89
- *
90
- * @access public
91
- * @since 2.1
92
- */
93
- function ot_register_settings_page() {
94
- global $ot_has_custom_theme_options;
95
-
96
- $custom_options = ( true === $ot_has_custom_theme_options || has_action( 'admin_init', 'custom_theme_options' ) || has_action( 'init', 'custom_theme_options' ) );
97
-
98
- // Display UI Builder admin notice.
99
- if ( true === OT_SHOW_OPTIONS_UI && isset( $_REQUEST['page'] ) && 'ot-settings' === $_REQUEST['page'] && $custom_options ) { // phpcs:ignore
100
-
101
- /**
102
- * Error message for custom theme options.
103
- */
104
- function ot_has_custom_theme_options() {
105
- echo '<div class="error"><p>' . esc_html__( 'The Theme Options UI Builder is being overridden by a custom file in your theme. Any changes you make via the UI Builder will not be saved.', 'option-tree' ) . '</p></div>';
106
- }
107
-
108
- add_action( 'admin_notices', 'ot_has_custom_theme_options' );
109
- }
110
-
111
- // Create the filterable pages array.
112
- $ot_register_pages_array = array(
113
- array(
114
- 'id' => 'ot',
115
- 'page_title' => esc_html__( 'OptionTree', 'option-tree' ),
116
- 'menu_title' => esc_html__( 'OptionTree', 'option-tree' ),
117
- 'capability' => 'edit_theme_options',
118
- 'menu_slug' => 'ot-settings',
119
- 'icon_url' => null,
120
- 'position' => 61,
121
- 'hidden_page' => true,
122
- ),
123
- array(
124
- 'id' => 'settings',
125
- 'parent_slug' => 'ot-settings',
126
- 'page_title' => esc_html__( 'Settings', 'option-tree' ),
127
- 'menu_title' => esc_html__( 'Settings', 'option-tree' ),
128
- 'capability' => 'edit_theme_options',
129
- 'menu_slug' => 'ot-settings',
130
- 'icon_url' => null,
131
- 'position' => null,
132
- 'updated_message' => esc_html__( 'Theme Options updated.', 'option-tree' ),
133
- 'reset_message' => esc_html__( 'Theme Options reset.', 'option-tree' ),
134
- 'button_text' => esc_html__( 'Save Settings', 'option-tree' ),
135
- 'show_buttons' => false,
136
- 'sections' => array(
137
- array(
138
- 'id' => 'create_setting',
139
- 'title' => esc_html__( 'Theme Options UI', 'option-tree' ),
140
- ),
141
- array(
142
- 'id' => 'import',
143
- 'title' => esc_html__( 'Import', 'option-tree' ),
144
- ),
145
- array(
146
- 'id' => 'export',
147
- 'title' => esc_html__( 'Export', 'option-tree' ),
148
- ),
149
- array(
150
- 'id' => 'layouts',
151
- 'title' => esc_html__( 'Layouts', 'option-tree' ),
152
- ),
153
- ),
154
- 'settings' => array(
155
- array(
156
- 'id' => 'theme_options_ui_text',
157
- 'label' => esc_html__( 'Theme Options UI Builder', 'option-tree' ),
158
- 'type' => 'theme_options_ui',
159
- 'section' => 'create_setting',
160
- ),
161
- array(
162
- 'id' => 'import_settings_text',
163
- 'label' => esc_html__( 'Settings', 'option-tree' ),
164
- 'type' => 'import-settings',
165
- 'section' => 'import',
166
- ),
167
- array(
168
- 'id' => 'import_data_text',
169
- 'label' => esc_html__( 'Theme Options', 'option-tree' ),
170
- 'type' => 'import-data',
171
- 'section' => 'import',
172
- ),
173
- array(
174
- 'id' => 'import_layouts_text',
175
- 'label' => esc_html__( 'Layouts', 'option-tree' ),
176
- 'type' => 'import-layouts',
177
- 'section' => 'import',
178
- ),
179
- array(
180
- 'id' => 'export_settings_file_text',
181
- 'label' => esc_html__( 'Settings PHP File', 'option-tree' ),
182
- 'type' => 'export-settings-file',
183
- 'section' => 'export',
184
- ),
185
- array(
186
- 'id' => 'export_settings_text',
187
- 'label' => esc_html__( 'Settings', 'option-tree' ),
188
- 'type' => 'export-settings',
189
- 'section' => 'export',
190
- ),
191
- array(
192
- 'id' => 'export_data_text',
193
- 'label' => esc_html__( 'Theme Options', 'option-tree' ),
194
- 'type' => 'export-data',
195
- 'section' => 'export',
196
- ),
197
- array(
198
- 'id' => 'export_layout_text',
199
- 'label' => esc_html__( 'Layouts', 'option-tree' ),
200
- 'type' => 'export-layouts',
201
- 'section' => 'export',
202
- ),
203
- array(
204
- 'id' => 'modify_layouts_text',
205
- 'label' => esc_html__( 'Layout Management', 'option-tree' ),
206
- 'type' => 'modify-layouts',
207
- 'section' => 'layouts',
208
- ),
209
- ),
210
- ),
211
- array(
212
- 'id' => 'documentation',
213
- 'parent_slug' => 'ot-settings',
214
- 'page_title' => esc_html__( 'Documentation', 'option-tree' ),
215
- 'menu_title' => esc_html__( 'Documentation', 'option-tree' ),
216
- 'capability' => 'edit_theme_options',
217
- 'menu_slug' => 'ot-documentation',
218
- 'icon_url' => null,
219
- 'position' => null,
220
- 'updated_message' => esc_html__( 'Theme Options updated.', 'option-tree' ),
221
- 'reset_message' => esc_html__( 'Theme Options reset.', 'option-tree' ),
222
- 'button_text' => esc_html__( 'Save Settings', 'option-tree' ),
223
- 'show_buttons' => false,
224
- 'sections' => array(
225
- array(
226
- 'id' => 'creating_options',
227
- 'title' => esc_html__( 'Creating Options', 'option-tree' ),
228
- ),
229
- array(
230
- 'id' => 'option_types',
231
- 'title' => esc_html__( 'Option Types', 'option-tree' ),
232
- ),
233
- array(
234
- 'id' => 'functions',
235
- 'title' => esc_html__( 'Function References', 'option-tree' ),
236
- ),
237
- array(
238
- 'id' => 'theme_mode',
239
- 'title' => esc_html__( 'Theme Mode', 'option-tree' ),
240
- ),
241
- array(
242
- 'id' => 'meta_boxes',
243
- 'title' => esc_html__( 'Meta Boxes', 'option-tree' ),
244
- ),
245
- array(
246
- 'id' => 'examples',
247
- 'title' => esc_html__( 'Code Examples', 'option-tree' ),
248
- ),
249
- array(
250
- 'id' => 'layouts_overview',
251
- 'title' => esc_html__( 'Layouts Overview', 'option-tree' ),
252
- ),
253
- ),
254
- 'settings' => array(
255
- array(
256
- 'id' => 'creating_options_text',
257
- 'label' => esc_html__( 'Overview of available Theme Option fields.', 'option-tree' ),
258
- 'type' => 'creating-options',
259
- 'section' => 'creating_options',
260
- ),
261
- array(
262
- 'id' => 'option_types_text',
263
- 'label' => esc_html__( 'Option types in alphabetical order & hooks to filter them.', 'option-tree' ),
264
- 'type' => 'option-types',
265
- 'section' => 'option_types',
266
- ),
267
- array(
268
- 'id' => 'functions_ot_get_option',
269
- 'label' => esc_html__( 'Function Reference:ot_get_option()', 'option-tree' ),
270
- 'type' => 'ot-get-option',
271
- 'section' => 'functions',
272
- ),
273
- array(
274
- 'id' => 'functions_get_option_tree',
275
- 'label' => esc_html__( 'Function Reference:get_option_tree()', 'option-tree' ),
276
- 'type' => 'get-option-tree',
277
- 'section' => 'functions',
278
- ),
279
- array(
280
- 'id' => 'theme_mode_text',
281
- 'label' => esc_html__( 'Theme Mode', 'option-tree' ),
282
- 'type' => 'theme-mode',
283
- 'section' => 'theme_mode',
284
- ),
285
- array(
286
- 'id' => 'meta_boxes_text',
287
- 'label' => esc_html__( 'Meta Boxes', 'option-tree' ),
288
- 'type' => 'meta-boxes',
289
- 'section' => 'meta_boxes',
290
- ),
291
- array(
292
- 'id' => 'example_text',
293
- 'label' => esc_html__( 'Code examples for front-end development.', 'option-tree' ),
294
- 'type' => 'examples',
295
- 'section' => 'examples',
296
- ),
297
- array(
298
- 'id' => 'layouts_overview_text',
299
- 'label' => esc_html__( 'What\'s a layout anyhow?', 'option-tree' ),
300
- 'type' => 'layouts-overview',
301
- 'section' => 'layouts_overview',
302
- ),
303
- ),
304
- ),
305
- );
306
-
307
- // Loop over the settings and remove as needed.
308
- foreach ( $ot_register_pages_array as $key => $page ) {
309
-
310
- // Remove various options from the Settings UI.
311
- if ( 'settings' === $page['id'] ) {
312
-
313
- // Remove the Theme Options UI.
314
- if ( false === OT_SHOW_OPTIONS_UI ) {
315
-
316
- foreach ( $page['sections'] as $section_key => $section ) {
317
- if ( 'create_setting' === $section['id'] ) {
318
- unset( $ot_register_pages_array[ $key ]['sections'][ $section_key ] );
319
- }
320
- }
321
-
322
- foreach ( $page['settings'] as $setting_key => $setting ) {
323
- if ( 'create_setting' === $setting['section'] ) {
324
- unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
325
- }
326
- }
327
- }
328
-
329
- // Remove parts of the Imports UI.
330
- if ( false === OT_SHOW_SETTINGS_IMPORT ) {
331
-
332
- foreach ( $page['settings'] as $setting_key => $setting ) {
333
- if ( 'import' === $setting['section'] && in_array( $setting['id'], array( 'import_xml_text', 'import_settings_text' ), true ) ) {
334
- unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
335
- }
336
- }
337
- }
338
-
339
- // Remove parts of the Export UI.
340
- if ( false === OT_SHOW_SETTINGS_EXPORT ) {
341
-
342
- foreach ( $page['settings'] as $setting_key => $setting ) {
343
- if ( 'export' === $setting['section'] && in_array( $setting['id'], array( 'export_settings_file_text', 'export_settings_text' ), true ) ) {
344
- unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
345
- }
346
- }
347
- }
348
-
349
- // Remove the Layouts UI.
350
- if ( false === OT_SHOW_NEW_LAYOUT ) {
351
-
352
- foreach ( $page['sections'] as $section_key => $section ) {
353
- if ( 'layouts' === $section['id'] ) {
354
- unset( $ot_register_pages_array[ $key ]['sections'][ $section_key ] );
355
- }
356
- }
357
-
358
- foreach ( $page['settings'] as $setting_key => $setting ) {
359
- if ( 'layouts' === $setting['section'] ) {
360
- unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
361
- }
362
- }
363
- }
364
- }
365
-
366
- // Remove the Documentation UI.
367
- if ( false === OT_SHOW_DOCS && 'documentation' === $page['id'] ) {
368
- unset( $ot_register_pages_array[ $key ] );
369
- }
370
- }
371
-
372
- $ot_register_pages_array = apply_filters( 'ot_register_pages_array', $ot_register_pages_array );
373
-
374
- // Register the pages.
375
- ot_register_settings(
376
- array(
377
- array(
378
- 'id' => ot_settings_id(),
379
- 'pages' => $ot_register_pages_array,
380
- ),
381
- )
382
- );
383
-
384
- }
385
- }
386
-
387
- if ( ! function_exists( 'ot_after_theme_options_save' ) ) {
388
-
389
- /**
390
- * Runs directly after the Theme Options are save.
391
- *
392
- * @access public
393
- * @since 2.0
394
- */
395
- function ot_after_theme_options_save() {
396
-
397
- $page = isset( $_REQUEST['page'] ) ? esc_attr( wp_unslash( $_REQUEST['page'] ) ) : ''; // phpcs:ignore
398
- $updated = isset( $_REQUEST['settings-updated'] ) && true === filter_var( wp_unslash( $_REQUEST['settings-updated'] ), FILTER_VALIDATE_BOOLEAN ); // phpcs:ignore
399
-
400
- // Only execute after the theme options are saved.
401
- if ( apply_filters( 'ot_theme_options_menu_slug', 'ot-theme-options' ) === $page && $updated ) {
402
-
403
- // Grab a copy of the theme options.
404
- $options = get_option( ot_options_id() );
405
-
406
- // Execute the action hook and pass the theme options to it.
407
- do_action( 'ot_after_theme_options_save', $options );
408
- }
409
- }
410
- }
411
-
412
- if ( ! function_exists( 'ot_validate_setting' ) ) {
413
-
414
- /**
415
- * Validate the options by type before saving.
416
- *
417
- * This function will run on only some of the option types
418
- * as all of them don't need to be validated, just the
419
- * ones users are going to input data into; because they
420
- * can't be trusted.
421
- *
422
- * @param mixed $input Setting value.
423
- * @param string $type Setting type.
424
- * @param string $field_id Setting field ID.
425
- * @param string $wmpl_id WPML field ID.
426
- * @return mixed
427
- *
428
- * @access public
429
- * @since 2.0
430
- */
431
- function ot_validate_setting( $input, $type, $field_id, $wmpl_id = '' ) {
432
-
433
- // Exit early if missing data.
434
- if ( ! $input || ! $type || ! $field_id ) {
435
- return $input;
436
- }
437
-
438
- /**
439
- * Filter to modify a setting field value before validation.
440
- *
441
- * This cannot be used to filter the returned value of a custom
442
- * setting type. You must use the `ot_validate_setting_input_safe`
443
- * filter to ensure custom setting types are saved to the database.
444
- *
445
- * @param mixed $input The setting field value.
446
- * @param string $type The setting field type.
447
- * @param string $field_id The setting field ID.
448
- */
449
- $input = apply_filters( 'ot_validate_setting', $input, $type, $field_id );
450
-
451
- /**
452
- * Filter to validate a setting field value.
453
- *
454
- * @param mixed $input_safe This is either null, or the filtered input value.
455
- * @param mixed $input The setting field value.
456
- * @param string $type The setting field type.
457
- * @param string $field_id The setting field ID.
458
- */
459
- $input_safe = apply_filters( 'ot_validate_setting_input_safe', null, $input, $type, $field_id );
460
-
461
- // The value was filtered and is safe to return.
462
- if ( ! is_null( $input_safe ) ) {
463
- return $input_safe;
464
- }
465
-
466
- /* translators: %1$s: the input id, %2$s: the field id */
467
- $string_nums = esc_html__( 'The %1$s input field for %2$s only allows numeric values.', 'option-tree' );
468
-
469
- if ( 'background' === $type ) {
470
-
471
- $input_safe = array();
472
-
473
- // Loop over array and check for values.
474
- foreach ( (array) $input as $key => $value ) {
475
- if ( 'background-color' === $key ) {
476
- $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
477
- } elseif ( 'background-image' === $key ) {
478
- $input_safe[ $key ] = ot_validate_setting( $value, 'upload', $field_id );
479
- } else {
480
- $input_safe[ $key ] = sanitize_text_field( $value );
481
- }
482
- }
483
- } elseif ( 'border' === $type ) {
484
-
485
- $input_safe = array();
486
-
487
- // Loop over array and set errors or unset key from array.
488
- foreach ( $input as $key => $value ) {
489
-
490
- if ( empty( $value ) ) {
491
- continue;
492
- }
493
-
494
- // Validate width.
495
- if ( 'width' === $key ) {
496
- if ( ! is_numeric( $value ) ) {
497
- add_settings_error( 'option-tree', 'invalid_border_width', sprintf( $string_nums, '<code>width</code>', '<code>' . $field_id . '</code>' ), 'error' );
498
- } else {
499
- $input_safe[ $key ] = absint( $value );
500
- }
501
- } elseif ( 'color' === $key ) {
502
- $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
503
- } else {
504
- $input_safe[ $key ] = sanitize_text_field( $value );
505
- }
506
- }
507
- } elseif ( 'box-shadow' === $type ) {
508
-
509
- $input_safe = array();
510
-
511
- // Loop over array and check for values.
512
- foreach ( (array) $input as $key => $value ) {
513
- if ( 'inset' === $key ) {
514
- $input_safe[ $key ] = 'inset';
515
- } elseif ( 'color' === $key ) {
516
- $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
517
- } else {
518
- $input_safe[ $key ] = sanitize_text_field( $value );
519
- }
520
- }
521
- } elseif ( 'checkbox' === $type ) {
522
-
523
- $input_safe = array();
524
-
525
- // Loop over array and check for values.
526
- foreach ( (array) $input as $key => $value ) {
527
- if ( ! empty( $value ) ) {
528
- $input_safe[ $key ] = sanitize_text_field( $value );
529
- }
530
- }
531
- } elseif ( 'colorpicker' === $type ) {
532
-
533
- $input_safe = '';
534
-
535
- // Only strings are allowed.
536
- if ( is_string( $input ) ) {
537
-
538
- /* translators: %s: the field id */
539
- $string_color = esc_html__( 'The %s Colorpicker only allows valid hexadecimal or rgba values depending on the setting type.', 'option-tree' );
540
-
541
- if ( 0 === preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})$/i', $input ) && 0 === preg_match( '/^rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]{1,4})\s*\)/i', $input ) ) {
542
- add_settings_error( 'option-tree', 'invalid_hex_or_rgba', sprintf( $string_color, '<code>' . $field_id . '</code>' ), 'error' );
543
- } else {
544
- $input_safe = $input;
545
- }
546
- }
547
- } elseif ( 'colorpicker-opacity' === $type ) {
548
- $input_safe = ot_validate_setting( $input, 'colorpicker', $field_id );
549
- } elseif ( in_array( $type, array( 'category-checkbox', 'custom-post-type-checkbox', 'page-checkbox', 'post-checkbox', 'tag-checkbox', 'taxonomy-checkbox' ), true ) ) {
550
-
551
- $input_safe = array();
552
-
553
- // Loop over array and check for values.
554
- foreach ( (array) $input as $key => $value ) {
555
- if ( filter_var( $value, FILTER_VALIDATE_INT ) && 0 < $value ) {
556
- $input_safe[ $key ] = absint( $value );
557
- }
558
- }
559
- } elseif ( in_array( $type, array( 'category-select', 'custom-post-type-select', 'page-select', 'post-select', 'tag-select', 'taxonomy-select' ), true ) ) {
560
-
561
- $input_safe = '';
562
-
563
- if ( filter_var( $input, FILTER_VALIDATE_INT ) && 0 < $input ) {
564
- $input_safe = absint( $input );
565
- }
566
- } elseif ( in_array( $type, array( 'css', 'javascript', 'text', 'textarea', 'textarea-simple' ), true ) ) {
567
- if ( ! function_exists( '_filter_wp_kses_post' ) ) {
568
- /**
569
- * Filter the allowed HTML and safe CSS styles.
570
- *
571
- * @since 2.7.2
572
- *
573
- * @param bool $add Whether to add or remove the filter.
574
- */
575
- function _filter_wp_kses_post( $add = true ) {
576
- $css_filter = function ( $attr ) {
577
- array_push( $attr, 'display', 'visibility' );
578
-
579
- $attr = apply_filters( 'ot_safe_style_css', $attr );
580
-
581
- return $attr;
582
- };
583
-
584
- $html_filter = function ( $tags, $context ) {
585
- if ( 'post' === $context ) {
586
- if ( current_user_can( 'unfiltered_html' ) || true === OT_ALLOW_UNFILTERED_HTML ) {
587
- $tags['script'] = array_fill_keys( array( 'async', 'charset', 'defer', 'src', 'type' ), true );
588
- $tags['style'] = array_fill_keys( array( 'media', 'type' ), true );
589
- $tags['iframe'] = array_fill_keys( array( 'align', 'allowfullscreen', 'class', 'frameborder', 'height', 'id', 'longdesc', 'marginheight', 'marginwidth', 'name', 'sandbox', 'scrolling', 'src', 'srcdoc', 'style', 'width' ), true );
590
- $tags['noscript'] = true;
591
-
592
- $tags = apply_filters( 'ot_allowed_html', $tags );
593
- }
594
- }
595
-
596
- return $tags;
597
- };
598
-
599
- if ( $add ) {
600
- add_filter( 'safe_style_css', $css_filter );
601
- add_filter( 'wp_kses_allowed_html', $html_filter, 10, 2 );
602
- } else {
603
- remove_filter( 'safe_style_css', $css_filter );
604
- remove_filter( 'wp_kses_allowed_html', $html_filter );
605
- }
606
- }
607
- }
608
-
609
- _filter_wp_kses_post( true );
610
- $input_safe = wp_kses_post( $input );
611
- _filter_wp_kses_post( false );
612
- } elseif ( 'date-picker' === $type || 'date-time-picker' === $type ) {
613
- if ( ! empty( $input ) && (bool) strtotime( $input ) ) {
614
- $input_safe = sanitize_text_field( $input );
615
- }
616
- } elseif ( 'dimension' === $type ) {
617
-
618
- $input_safe = array();
619
-
620
- // Loop over array and set errors.
621
- foreach ( $input as $key => $value ) {
622
- if ( ! empty( $value ) ) {
623
- if ( ! is_numeric( $value ) && 'unit' !== $key ) {
624
- add_settings_error( 'option-tree', 'invalid_dimension_' . $key, sprintf( $string_nums, '<code>' . $key . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
625
- } else {
626
- $input_safe[ $key ] = sanitize_text_field( $value );
627
- }
628
- }
629
- }
630
- } elseif ( 'gallery' === $type ) {
631
-
632
- $input_safe = '';
633
-
634
- if ( '' !== trim( $input ) ) {
635
- $input_safe = sanitize_text_field( $input );
636
- }
637
- } elseif ( 'google-fonts' === $type ) {
638
-
639
- $input_safe = array();
640
-
641
- // Loop over array.
642
- foreach ( $input as $key => $value ) {
643
- if ( '%key%' === $key ) {
644
- continue;
645
- }
646
-
647
- foreach ( $value as $fk => $fvalue ) {
648
- if ( is_array( $fvalue ) ) {
649
- foreach ( $fvalue as $sk => $svalue ) {
650
- $input_safe[ $key ][ $fk ][ $sk ] = sanitize_text_field( $svalue );
651
- }
652
- } else {
653
- $input_safe[ $key ][ $fk ] = sanitize_text_field( $fvalue );
654
- }
655
- }
656
- }
657
-
658
- array_values( $input_safe );
659
- } elseif ( 'link-color' === $type ) {
660
-
661
- $input_safe = array();
662
-
663
- // Loop over array and check for values.
664
- if ( is_array( $input ) && ! empty( $input ) ) {
665
- foreach ( $input as $key => $value ) {
666
- if ( ! empty( $value ) ) {
667
- $input_safe[ $key ] = ot_validate_setting( $input[ $key ], 'colorpicker', $field_id . '-' . $key );
668
- }
669
- }
670
- }
671
-
672
- array_filter( $input_safe );
673
- } elseif ( 'measurement' === $type ) {
674
-
675
- $input_safe = array();
676
-
677
- foreach ( $input as $key => $value ) {
678
- if ( ! empty( $value ) ) {
679
- $input_safe[ $key ] = sanitize_text_field( $value );
680
- }
681
- }
682
- } elseif ( 'numeric-slider' === $type ) {
683
- $input_safe = '';
684
-
685
- if ( ! empty( $input ) ) {
686
- if ( ! is_numeric( $input ) ) {
687
- add_settings_error( 'option-tree', 'invalid_numeric_slider', sprintf( $string_nums, '<code>' . esc_html__( 'slider', 'option-tree' ) . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
688
- } else {
689
- $input_safe = sanitize_text_field( $input );
690
- }
691
- }
692
- } elseif ( 'on-off' === $type ) {
693
- $input_safe = '';
694
-
695
- if ( ! empty( $input ) ) {
696
- $input_safe = sanitize_text_field( $input );
697
- }
698
- } elseif ( 'radio' === $type || 'radio-image' === $type || 'select' === $type || 'sidebar-select' === $type ) {
699
- $input_safe = '';
700
-
701
- if ( ! empty( $input ) ) {
702
- $input_safe = sanitize_text_field( $input );
703
- }
704
- } elseif ( 'spacing' === $type ) {
705
-
706
- $input_safe = array();
707
-
708
- // Loop over array and set errors.
709
- foreach ( $input as $key => $value ) {
710
- if ( ! empty( $value ) ) {
711
- if ( ! is_numeric( $value ) && 'unit' !== $key ) {
712
- add_settings_error( 'option-tree', 'invalid_spacing_' . $key, sprintf( $string_nums, '<code>' . $key . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
713
- } else {
714
- $input_safe[ $key ] = sanitize_text_field( $value );
715
- }
716
- }
717
- }
718
- } elseif ( 'typography' === $type && isset( $input['font-color'] ) ) {
719
-
720
- $input_safe = array();
721
-
722
- // Loop over array and check for values.
723
- foreach ( $input as $key => $value ) {
724
- if ( 'font-color' === $key ) {
725
- $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
726
- } else {
727
- $input_safe[ $key ] = sanitize_text_field( $value );
728
- }
729
- }
730
- } elseif ( 'upload' === $type ) {
731
-
732
- $input_safe = filter_var( $input, FILTER_VALIDATE_INT );
733
-
734
- if ( false === $input_safe && is_string( $input ) ) {
735
- $input_safe = esc_url_raw( $input );
736
- }
737
- } elseif ( 'url' === $type ) {
738
-
739
- $input_safe = '';
740
-
741
- if ( ! empty( $input ) ) {
742
- $input_safe = esc_url_raw( $input );
743
- }
744
- } elseif ( 'weforms' === $type ) {
745
-
746
- $input_safe = '';
747
-
748
- if ( ! empty( $input ) ) {
749
- $input_safe = (int)$input;
750
- }
751
- } else {
752
-
753
- /* translators: %1$s: the calling function, %2$s the filter name, %3$s the option type, %4$s the version number */
754
- $string_error = esc_html__( 'Notice: %1$s was called incorrectly. All stored data must be filtered through %2$s, the %3$s option type is not using this filter. This is required since version %4$s.', 'option-tree' );
755
-
756
- // Log a user notice that things have changed since the last version.
757
- //add_settings_error( 'option-tree', 'ot_validate_setting_error', sprintf( $string_error, '<code>ot_validate_setting</code>', '<code>ot_validate_setting_input_safe</code>', '<code>' . $type . '</code>', '<code>2.7.0</code>' ), 'error' );
758
-
759
- $input_safe = '';
760
-
761
- /*
762
- * We don't know what the setting type is, so fallback to `sanitize_textarea_field`
763
- * on all values and do a best-effort sanitize of the user data before saving it.
764
- */
765
- if ( ! is_object( $input ) ) {
766
-
767
- // Contains an integer, float, string or boolean.
768
- if ( is_scalar( $input ) ) {
769
- $input_safe = sanitize_textarea_field( $input );
770
- } else {
771
- if ( ! function_exists( '_sanitize_recursive' ) ) {
772
- /**
773
- * Filter the array values recursively.
774
- *
775
- * @param array $values The value to sanitize.
776
- *
777
- * @return array
778
- */
779
- function _sanitize_recursive( $values = array() ) {
780
- $result = array();
781
- foreach ( $values as $key => $value ) {
782
- if ( ! is_object( $value ) ) {
783
- if ( is_scalar( $value ) ) {
784
- $result[ $key ] = sanitize_textarea_field( $value );
785
- } else {
786
- $result[ $key ] = _sanitize_recursive( $value );
787
- }
788
- }
789
- }
790
-
791
- return $result;
792
- }
793
- }
794
- $input_safe = _sanitize_recursive( $input );
795
- }
796
- }
797
- }
798
-
799
- // WPML Register and Unregister strings.
800
- if ( ! empty( $wmpl_id ) ) {
801
-
802
- // Allow filtering on the WPML option types.
803
- $single_string_types = apply_filters( 'ot_wpml_option_types', array( 'text', 'textarea', 'textarea-simple' ) );
804
-
805
- if ( in_array( $type, $single_string_types, true ) ) {
806
- if ( ! empty( $input_safe ) ) {
807
- ot_wpml_register_string( $wmpl_id, $input_safe );
808
- } else {
809
- ot_wpml_unregister_string( $wmpl_id );
810
- }
811
- }
812
- }
813
-
814
- /**
815
- * Filter to modify the validated setting field value.
816
- *
817
- * It's important to note that the filter does not have access to
818
- * the original value and can only modify the validated input value.
819
- * This is a breaking change as of version 2.7.0.
820
- *
821
- * @param mixed $input_safe The setting field value.
822
- * @param string $type The setting field type.
823
- * @param string $field_id The setting field ID.
824
- */
825
- $input_safe = apply_filters( 'ot_after_validate_setting', $input_safe, $type, $field_id );
826
-
827
- return $input_safe;
828
- }
829
- }
830
-
831
- if ( ! function_exists( 'ot_admin_styles' ) ) {
832
-
833
- /**
834
- * Setup the default admin styles
835
- *
836
- * @access public
837
- * @since 2.0
838
- */
839
- function ot_admin_styles() {
840
- global $wp_styles, $post;
841
-
842
- wp_enqueue_style('wp-jquery-ui-dialog');
843
-
844
- // Execute styles before actions.
845
- do_action( 'ot_admin_styles_before' );
846
-
847
- // Load WP colorpicker.
848
- wp_enqueue_style( 'wp-color-picker' );
849
-
850
-
851
- // Load admin styles.
852
- wp_enqueue_style( 'ot-admin-css', OT_URL . 'assets/css/ot-admin.css', false, OT_VERSION );
853
-
854
- // Load the RTL stylesheet.
855
- $wp_styles->add_data( 'ot-admin-css', 'rtl', true );
856
-
857
- // Remove styles added by the Easy Digital Downloads plugin.
858
- if ( isset( $post->post_type ) && 'post' === $post->post_type ) {
859
- wp_dequeue_style( 'jquery-ui-css' );
860
- }
861
-
862
- /**
863
- * Filter the screen IDs used to dequeue `jquery-ui-css`.
864
- *
865
- * @since 2.5.0
866
- *
867
- * @param array $screen_ids An array of screen IDs.
868
- */
869
- $screen_ids = apply_filters(
870
- 'ot_dequeue_jquery_ui_css_screen_ids',
871
- array(
872
- 'toplevel_page_ot-settings',
873
- 'optiontree_page_ot-documentation',
874
- 'appearance_page_ot-theme-options',
875
- )
876
- );
877
-
878
- // Remove styles added by the WP Review plugin and any custom pages added through filtering.
879
- $screen = get_current_screen();
880
- if ( in_array( $screen->id, $screen_ids, true ) ) {
881
- wp_dequeue_style( 'plugin_name-admin-ui-css' );
882
- wp_dequeue_style( 'jquery-ui-css' );
883
- }
884
-
885
- if ($screen->id !== 'toplevel_page_niftycs-options') {
886
- wp_dequeue_style( 'ot-admin-css' );
887
- }
888
-
889
- // Execute styles after actions.
890
- do_action( 'ot_admin_styles_after' );
891
- }
892
- }
893
-
894
- if ( ! function_exists( 'ot_admin_scripts' ) ) {
895
-
896
- /**
897
- * Setup the default admin scripts.
898
- *
899
- * @uses add_thickbox() Include Thickbox for file uploads.
900
- * @uses wp_enqueue_script() Add OptionTree scripts.
901
- * @uses wp_localize_script() Used to include arbitrary Javascript data.
902
- *
903
- * @access public
904
- * @since 2.0
905
- */
906
- function ot_admin_scripts() {
907
-
908
- // Execute scripts before actions.
909
- do_action( 'ot_admin_scripts_before' );
910
-
911
- if ( function_exists( 'wp_enqueue_media' ) ) {
912
- // WP 3.5 Media Uploader.
913
- wp_enqueue_media();
914
- } else {
915
- // Legacy Thickbox.
916
- add_thickbox();
917
- }
918
-
919
- // Load jQuery-ui slider.
920
- wp_enqueue_script( 'jquery-ui-slider' );
921
-
922
- // Load jQuery-ui datepicker.
923
- wp_enqueue_script( 'jquery-ui-datepicker' );
924
-
925
- // Load WP colorpicker.
926
- wp_enqueue_script( 'wp-color-picker' );
927
-
928
- // Load Ace Editor for CSS Editing.
929
- wp_enqueue_script( 'ace-editor', 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.3/ace.js', null, '1.1.3', false );
930
-
931
- // Load jQuery UI timepicker addon.
932
- wp_enqueue_script( 'jquery-ui-timepicker', OT_URL . 'assets/js/vendor/jquery/jquery-ui-timepicker.js', array( 'jquery', 'jquery-ui-slider', 'jquery-ui-datepicker' ), '1.4.3', false );
933
-
934
- // Load the post formats.
935
- if ( true === OT_META_BOXES && true === OT_POST_FORMATS ) {
936
- wp_enqueue_script( 'ot-postformats', OT_URL . 'assets/js/ot-postformats.js', array( 'jquery' ), '1.0.1', false );
937
- }
938
-
939
-
940
-
941
-
942
- // Load all the required scripts.
943
- wp_enqueue_script('jquery-ui-dialog');
944
- wp_enqueue_script( 'ot-admin-js', OT_URL . 'assets/js/ot-admin.js', array( 'jquery', 'jquery-ui-tabs', 'jquery-ui-sortable', 'jquery-ui-slider', 'wp-color-picker', 'ace-editor', 'jquery-ui-datepicker', 'jquery-ui-timepicker','jquery-ui-dialog' ), OT_VERSION, false );
945
-
946
- // Create localized JS array.
947
- $localized_array = array(
948
- 'ajax' => admin_url( 'admin-ajax.php' ),
949
- 'nonce' => wp_create_nonce( 'option_tree' ),
950
- 'upload_text' => apply_filters( 'ot_upload_text', __( 'Send to OptionTree', 'option-tree' ) ),
951
- 'remove_media_text' => esc_html__( 'Remove Media', 'option-tree' ),
952
- 'reset_agree' => esc_html__( 'Are you sure you want to reset back to the defaults?', 'option-tree' ),
953
- 'remove_no' => esc_html__( 'You can\'t remove this! But you can edit the values.', 'option-tree' ),
954
- 'remove_agree' => esc_html__( 'Are you sure you want to remove this?', 'option-tree' ),
955
- 'activate_layout_agree' => esc_html__( 'Are you sure you want to activate this layout?', 'option-tree' ),
956
- 'setting_limit' => esc_html__( 'Sorry, you can\'t have settings three levels deep.', 'option-tree' ),
957
- 'delete' => esc_html__( 'Delete Gallery', 'option-tree' ),
958
- 'edit' => esc_html__( 'Edit Gallery', 'option-tree' ),
959
- 'create' => esc_html__( 'Create Gallery', 'option-tree' ),
960
- 'confirm' => esc_html__( 'Are you sure you want to delete this Gallery?', 'option-tree' ),
961
- 'date_current' => esc_html__( 'Today', 'option-tree' ),
962
- 'date_time_current' => esc_html__( 'Now', 'option-tree' ),
963
- 'date_close' => esc_html__( 'Close', 'option-tree' ),
964
- 'replace' => esc_html__( 'Featured Image', 'option-tree' ),
965
- 'with' => esc_html__( 'Image', 'option-tree' ),
966
- 'weforms_dialog_upsell_title' => '<img alt="' . __('weForms', 'option-tree') . '" title="' . __('weForms', 'option-tree') . '" src="' . OT_URL . '/assets/images/weforms-logo-white.png' . '">',
967
- 'weforms_install_url' => add_query_arg(array('action' => 'install_weforms'), admin_url('admin.php')),
968
- );
969
-
970
- // Localized script attached to 'option_tree'.
971
- wp_localize_script( 'ot-admin-js', 'option_tree', $localized_array );
972
-
973
- // Execute scripts after actions.
974
- do_action( 'ot_admin_scripts_after' );
975
- }
976
- }
977
-
978
- if ( ! function_exists( 'ot_get_media_post_ID' ) ) {
979
-
980
- /**
981
- * Returns the ID of a custom post type by post_title.
982
- *
983
- * @return int
984
- *
985
- * @access public
986
- * @since 2.0
987
- * @updated 2.7.0
988
- */
989
- function ot_get_media_post_ID() { // phpcs:ignore
990
-
991
- // Option ID.
992
- $option_id = 'ot_media_post_ID';
993
-
994
- // Get the media post ID.
995
- $post_ID = get_option( $option_id, false );
996
-
997
- // Add $post_ID to the DB.
998
- if ( false === $post_ID || empty( $post_ID ) || ! is_integer( $post_ID ) ) {
999
- global $wpdb;
1000
-
1001
- // Get the media post ID.
1002
- $post_ID = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts p WHERE p.post_title = %s AND p.post_type = %s AND p.post_status = %s", 'Media', 'option-tree', 'private' ) ); // phpcs:ignore
1003
-
1004
- // Add to the DB.
1005
- if ( null !== $post_ID && 0 < $post_ID ) {
1006
- update_option( $option_id, $post_ID );
1007
- } else {
1008
- $post_ID = 0;
1009
- }
1010
- }
1011
-
1012
- return $post_ID;
1013
- }
1014
- }
1015
-
1016
- if ( ! function_exists( 'ot_create_media_post' ) ) {
1017
-
1018
- /**
1019
- * Register custom post type & create the media post used to attach images.
1020
- *
1021
- * @access public
1022
- * @since 2.0
1023
- */
1024
- function ot_create_media_post() {
1025
-
1026
- register_post_type(
1027
- 'option-tree',
1028
- array(
1029
- 'labels' => array( 'name' => esc_html__( 'Option Tree', 'option-tree' ) ),
1030
- 'public' => false,
1031
- 'show_ui' => false,
1032
- 'capability_type' => 'post',
1033
- 'exclude_from_search' => true,
1034
- 'hierarchical' => false,
1035
- 'rewrite' => false,
1036
- 'supports' => array( 'title', 'editor' ),
1037
- 'can_export' => false,
1038
- 'show_in_nav_menus' => false,
1039
- )
1040
- );
1041
-
1042
- // Look for custom page.
1043
- $post_id = ot_get_media_post_ID();
1044
-
1045
- // No post exists.
1046
- if ( 0 === $post_id ) {
1047
-
1048
- // Insert the post into the database.
1049
- wp_insert_post(
1050
- array(
1051
- 'post_title' => 'Media',
1052
- 'post_name' => 'media',
1053
- 'post_status' => 'private',
1054
- 'post_type' => 'option-tree',
1055
- 'comment_status' => 'closed',
1056
- 'ping_status' => 'closed',
1057
- )
1058
- );
1059
- }
1060
- }
1061
- }
1062
-
1063
- if ( ! function_exists( 'ot_default_settings' ) ) {
1064
-
1065
- /**
1066
- * Setup default settings array.
1067
- *
1068
- * @access public
1069
- * @since 2.0
1070
- */
1071
- function ot_default_settings() {
1072
- global $wpdb;
1073
-
1074
- if ( ! get_option( ot_settings_id() ) ) {
1075
-
1076
- $section_count = 0;
1077
- $settings_count = 0;
1078
- $settings = array();
1079
- $table_name = $wpdb->prefix . 'option_tree';
1080
-
1081
- $find_table = wp_cache_get( 'find_table', 'option_tree' );
1082
- if ( false === $find_table ) {
1083
- $find_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ); // phpcs:ignore
1084
- wp_cache_set( 'find_table', $find_table, 'option_tree', 86400 );
1085
- }
1086
-
1087
- if ( $find_table === $table_name ) {
1088
-
1089
- $old_settings = wp_cache_get( 'old_settings', 'option_tree' );
1090
- if ( false === $old_settings ) {
1091
- $old_settings = $wpdb->get_results( "SELECT * FROM ${table_name} ORDER BY item_sort ASC" ); // phpcs:ignore
1092
- wp_cache_set( 'old_settings', $old_settings, 'option_tree', 86400 );
1093
- }
1094
-
1095
- if ( ! $old_settings ) {
1096
- return;
1097
- }
1098
-
1099
- foreach ( $old_settings as $setting ) {
1100
-
1101
- // Heading is a section now.
1102
- if ( 'heading' === $setting->item_type ) {
1103
-
1104
- // Add section to the sections array.
1105
- $settings['sections'][ $section_count ]['id'] = $setting->item_id;
1106
- $settings['sections'][ $section_count ]['title'] = $setting->item_title;
1107
-
1108
- // Ssave the last section id to use in creating settings.
1109
- $section = $setting->item_id;
1110
-
1111
- // Increment the section count.
1112
- $section_count++;
1113
-
1114
- } else {
1115
-
1116
- // Add setting to the settings array.
1117
- $settings['settings'][ $settings_count ]['id'] = $setting->item_id;
1118
- $settings['settings'][ $settings_count ]['label'] = $setting->item_title;
1119
- $settings['settings'][ $settings_count ]['desc'] = $setting->item_desc;
1120
- $settings['settings'][ $settings_count ]['section'] = $section;
1121
- $settings['settings'][ $settings_count ]['type'] = ot_map_old_option_types( $setting->item_type );
1122
- $settings['settings'][ $settings_count ]['std'] = '';
1123
- $settings['settings'][ $settings_count ]['class'] = '';
1124
-
1125
- // Textarea rows.
1126
- $rows = '';
1127
- if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'css', 'javascript', 'textarea' ), true ) ) {
1128
- if ( (int) $setting->item_options > 0 ) {
1129
- $rows = (int) $setting->item_options;
1130
- } else {
1131
- $rows = 15;
1132
- }
1133
- }
1134
- $settings['settings'][ $settings_count ]['rows'] = $rows;
1135
-
1136
- // Post type.
1137
- $post_type = '';
1138
- if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'custom-post-type-select', 'custom-post-type-checkbox' ), true ) ) {
1139
- if ( '' !== $setting->item_options ) {
1140
- $post_type = $setting->item_options;
1141
- } else {
1142
- $post_type = 'post';
1143
- }
1144
- }
1145
- $settings['settings'][ $settings_count ]['post_type'] = $post_type;
1146
-
1147
- // Cchoices.
1148
- $choices = array();
1149
- if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'checkbox', 'radio', 'select' ), true ) ) {
1150
- if ( '' !== $setting->item_options ) {
1151
- $choices = ot_convert_string_to_array( $setting->item_options );
1152
- }
1153
- }
1154
- $settings['settings'][ $settings_count ]['choices'] = $choices;
1155
-
1156
- $settings_count++;
1157
- }
1158
- }
1159
-
1160
- // Make sure each setting has a section just in case.
1161
- if ( isset( $settings['sections'] ) && isset( $settings['settings'] ) ) {
1162
- foreach ( $settings['settings'] as $k => $setting ) {
1163
- if ( '' === $setting['section'] ) {
1164
- $settings['settings'][ $k ]['section'] = $settings['sections'][0]['id'];
1165
- }
1166
- }
1167
- }
1168
- }
1169
-
1170
- // If array if not properly formed create fallback settings array.
1171
- if ( ! isset( $settings['sections'] ) || ! isset( $settings['settings'] ) ) {
1172
-
1173
- $settings = array(
1174
- 'sections' => array(
1175
- array(
1176
- 'id' => 'general',
1177
- 'title' => esc_html__( 'General', 'option-tree' ),
1178
- ),
1179
- ),
1180
- 'settings' => array(
1181
- array(
1182
- 'id' => 'sample_text',
1183
- 'label' => esc_html__( 'Sample Text Field Label', 'option-tree' ),
1184
- 'desc' => esc_html__( 'Description for the sample text field.', 'option-tree' ),
1185
- 'section' => 'general',
1186
- 'type' => 'text',
1187
- 'std' => '',
1188
- 'class' => '',
1189
- 'rows' => '',
1190
- 'post_type' => '',
1191
- 'choices' => array(),
1192
- ),
1193
- ),
1194
- );
1195
- }
1196
-
1197
- // Update the settings array.
1198
- update_option( ot_settings_id(), $settings );
1199
-
1200
- // Get option tree array.
1201
- $options = get_option( ot_options_id() );
1202
-
1203
- $options_safe = array();
1204
-
1205
- // Validate options.
1206
- if ( is_array( $options ) ) {
1207
-
1208
- foreach ( $settings['settings'] as $setting ) {
1209
- if ( isset( $options[ $setting['id'] ] ) ) {
1210
- $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1211
- }
1212
- }
1213
-
1214
- // Execute the action hook and pass the theme options to it.
1215
- do_action( 'ot_before_theme_options_save', $options_safe );
1216
-
1217
- // Update the option tree array.
1218
- update_option( ot_options_id(), $options_safe );
1219
- }
1220
- }
1221
- }
1222
- }
1223
-
1224
- if ( ! function_exists( 'ot_save_css' ) ) {
1225
-
1226
- /**
1227
- * Helper function to update the CSS option type after save.
1228
- *
1229
- * This function is called during the `ot_after_theme_options_save` hook,
1230
- * which is passed the currently stored options array.
1231
- *
1232
- * @param array $options The current stored options array.
1233
- *
1234
- * @access public
1235
- * @since 2.0
1236
- */
1237
- function ot_save_css( $options ) {
1238
-
1239
- // Grab a copy of the settings.
1240
- $settings = get_option( ot_settings_id() );
1241
-
1242
- // Has settings.
1243
- if ( isset( $settings['settings'] ) ) {
1244
-
1245
- // Loop through sections and insert CSS when needed.
1246
- foreach ( $settings['settings'] as $k => $setting ) {
1247
-
1248
- // Is the CSS option type.
1249
- if ( isset( $setting['type'] ) && 'css' === $setting['type'] ) {
1250
-
1251
- // Insert CSS into dynamic.css.
1252
- if ( isset( $options[ $setting['id'] ] ) && '' !== $options[ $setting['id'] ] ) {
1253
- ot_insert_css_with_markers( $setting['id'], $options[ $setting['id'] ] );
1254
-
1255
- // Remove old CSS from dynamic.css.
1256
- } else {
1257
- ot_remove_old_css( $setting['id'] );
1258
- }
1259
- }
1260
- }
1261
- }
1262
- }
1263
- }
1264
-
1265
- if ( ! function_exists( 'ot_import' ) ) {
1266
-
1267
- /**
1268
- * Import before the screen is displayed.
1269
- *
1270
- * @access public
1271
- * @since 2.0
1272
- */
1273
- function ot_import() {
1274
-
1275
- // Check and verify import settings nonce.
1276
- if ( isset( $_POST['import_settings_nonce'] ) && wp_verify_nonce( $_POST['import_settings_nonce'], 'import_settings_form' ) ) { // phpcs:ignore
1277
-
1278
- // Default message.
1279
- $message = 'failed';
1280
-
1281
- $settings = isset( $_POST['import_settings'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_settings'] ) ) ) : array();
1282
-
1283
- if ( is_array( $settings ) && ! empty( $settings ) ) {
1284
-
1285
- $settings_safe = ot_validate_settings( $settings );
1286
-
1287
- // Save & show success message.
1288
- if ( is_array( $settings_safe ) ) {
1289
- update_option( ot_settings_id(), $settings_safe );
1290
- $message = 'success';
1291
- }
1292
- }
1293
-
1294
- // Redirect back to self.
1295
- wp_safe_redirect(
1296
- esc_url_raw(
1297
- add_query_arg(
1298
- array(
1299
- 'action' => 'import-settings',
1300
- 'message' => $message,
1301
- ),
1302
- wp_get_referer()
1303
- )
1304
- )
1305
- );
1306
- exit;
1307
- }
1308
-
1309
- // Check and verify import theme options data nonce.
1310
- if ( isset( $_POST['import_data_nonce'] ) && wp_verify_nonce( $_POST['import_data_nonce'], 'import_data_form' ) ) { // phpcs:ignore
1311
-
1312
- // Default message.
1313
- $message = 'failed';
1314
- $options = isset( $_POST['import_data'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_data'] ) ) ) : array();
1315
-
1316
- if ( $options ) {
1317
-
1318
- $options_safe = array();
1319
-
1320
- // Get settings array.
1321
- $settings = get_option( ot_settings_id() );
1322
-
1323
- // Has options.
1324
- if ( is_array( $options ) ) {
1325
-
1326
- // Validate options.
1327
- if ( is_array( $settings ) ) {
1328
- foreach ( $settings['settings'] as $setting ) {
1329
- if ( isset( $options[ $setting['id'] ] ) ) {
1330
- $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1331
- }
1332
- }
1333
- }
1334
-
1335
- // Execute the action hook and pass the theme options to it.
1336
- do_action( 'ot_before_theme_options_save', $options_safe );
1337
-
1338
- // Update the option tree array.
1339
- update_option( ot_options_id(), $options_safe );
1340
-
1341
- $message = 'success';
1342
- }
1343
- }
1344
-
1345
- // Redirect back to self.
1346
- wp_safe_redirect(
1347
- esc_url_raw(
1348
- add_query_arg(
1349
- array(
1350
- 'action' => 'import-data',
1351
- 'message' => $message,
1352
- ),
1353
- wp_get_referer()
1354
- )
1355
- )
1356
- );
1357
- exit;
1358
- }
1359
-
1360
- // Check and verify import layouts nonce.
1361
- if ( isset( $_POST['import_layouts_nonce'] ) && wp_verify_nonce( $_POST['import_layouts_nonce'], 'import_layouts_form' ) ) { // phpcs:ignore
1362
-
1363
- // Default message.
1364
- $message = 'failed';
1365
- $layouts = isset( $_POST['import_layouts'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_layouts'] ) ) ) : array();
1366
-
1367
- if ( $layouts ) {
1368
-
1369
- // Get settings array.
1370
- $settings = get_option( ot_settings_id() );
1371
-
1372
- // Has layouts.
1373
- if ( is_array( $layouts ) && ! empty( $layouts ) && ! empty( $layouts['active_layout'] ) ) {
1374
-
1375
- $layouts_safe = array(
1376
- 'active_layout' => esc_attr( $layouts['active_layout'] ),
1377
- );
1378
-
1379
- // Validate options.
1380
- if ( is_array( $settings ) ) {
1381
-
1382
- foreach ( $layouts as $key => $value ) {
1383
-
1384
- if ( 'active_layout' === $key ) {
1385
- continue;
1386
- }
1387
-
1388
- // Convert the options to an array.
1389
- $options = ot_decode( $value );
1390
-
1391
- $options_safe = array();
1392
-
1393
- foreach ( $settings['settings'] as $setting ) {
1394
- if ( isset( $options[ $setting['id'] ] ) ) {
1395
- $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1396
- }
1397
- }
1398
-
1399
- // Store the sanitized values for later.
1400
- if ( $key === $layouts['active_layout'] ) {
1401
- $new_options_safe = $options_safe;
1402
- }
1403
-
1404
- $layouts_safe[ $key ] = ot_encode( $options_safe );
1405
- }
1406
- }
1407
-
1408
- // Update the option tree array with sanitized values.
1409
- if ( isset( $new_options_safe ) ) {
1410
-
1411
- // Execute the action hook and pass the theme options to it.
1412
- do_action( 'ot_before_theme_options_save', $new_options_safe );
1413
-
1414
- update_option( ot_options_id(), $new_options_safe );
1415
- }
1416
-
1417
- // Update the option tree layouts array.
1418
- update_option( ot_layouts_id(), $layouts_safe );
1419
-
1420
- $message = 'success';
1421
- }
1422
- }
1423
-
1424
- // Redirect back to self.
1425
- wp_safe_redirect(
1426
- esc_url_raw(
1427
- add_query_arg(
1428
- array(
1429
- 'action' => 'import-layouts',
1430
- 'message' => $message,
1431
- ),
1432
- wp_get_referer()
1433
- )
1434
- )
1435
- );
1436
- exit;
1437
- }
1438
-
1439
- return false;
1440
- }
1441
- }
1442
-
1443
- if ( ! function_exists( 'ot_export' ) ) {
1444
-
1445
- /**
1446
- * Export before the screen is displayed.
1447
- *
1448
- * @return void
1449
- *
1450
- * @access public
1451
- * @since 2.0.8
1452
- */
1453
- function ot_export() {
1454
-
1455
- // Check and verify export settings file nonce.
1456
- if ( isset( $_POST['export_settings_file_nonce'] ) && wp_verify_nonce( $_POST['export_settings_file_nonce'], 'export_settings_file_form' ) ) { // phpcs:ignore
1457
- ot_export_php_settings_array();
1458
- }
1459
- }
1460
- }
1461
-
1462
- if ( ! function_exists( 'ot_export_php_settings_array' ) ) {
1463
-
1464
- /**
1465
- * Export the Theme Mode theme-options.php
1466
- *
1467
- * @access public
1468
- * @since 2.0.8
1469
- */
1470
- function ot_export_php_settings_array() {
1471
-
1472
- $content = '';
1473
- $build_settings = '';
1474
- $contextual_help = '';
1475
- $sections = '';
1476
- $settings = '';
1477
- $option_tree_settings = get_option( ot_settings_id(), array() );
1478
-
1479
- /**
1480
- * Domain string helper.
1481
- *
1482
- * @param string $string A string.
1483
- * @return string
1484
- */
1485
- function ot_i18n_string( $string ) {
1486
- if ( ! empty( $string ) && isset( $_POST['domain'] ) && ! empty( $_POST['domain'] ) ) { // phpcs:ignore
1487
- $domain = str_replace( ' ', '-', trim( sanitize_text_field( wp_unslash( $_POST['domain'] ) ) ) ); // phpcs:ignore
1488
- return "esc_html__( '$string', '$domain' )";
1489
- }
1490
- return "'$string'";
1491
- }
1492
-
1493
- header( 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' );
1494
- header( 'Pragma: no-cache ' );
1495
- header( 'Content-Description: File Transfer' );
1496
- header( 'Content-Disposition: attachment; filename="theme-options.php"' );
1497
- header( 'Content-Type: application/octet-stream' );
1498
- header( 'Content-Transfer-Encoding: binary' );
1499
-
1500
- // Build contextual help content.
1501
- if ( isset( $option_tree_settings['contextual_help']['content'] ) ) {
1502
- $help = '';
1503
- foreach ( $option_tree_settings['contextual_help']['content'] as $value ) {
1504
- $_id = isset( $value['id'] ) ? $value['id'] : '';
1505
- $_title = ot_i18n_string( isset( $value['title'] ) ? str_replace( "'", "\'", $value['title'] ) : '' );
1506
- $_content = ot_i18n_string( isset( $value['content'] ) ? html_entity_decode( str_replace( "'", "\'", $value['content'] ) ) : '' );
1507
- $help .= "
1508
- array(
1509
- 'id' => '$_id',
1510
- 'title' => $_title,
1511
- 'content' => $_content,
1512
- ),";
1513
- }
1514
- $contextual_help = "
1515
- 'content' => array($help
1516
- ),";
1517
- }
1518
-
1519
- // Build contextual help sidebar.
1520
- if ( isset( $option_tree_settings['contextual_help']['sidebar'] ) ) {
1521
- $_sidebar = ot_i18n_string( html_entity_decode( str_replace( "'", "\'", $option_tree_settings['contextual_help']['sidebar'] ) ) );
1522
- $contextual_help .= "
1523
- 'sidebar' => $_sidebar,";
1524
- }
1525
-
1526
- // Check that $contexual_help has a value and add to $build_settings.
1527
- if ( '' !== $contextual_help ) {
1528
- $build_settings .= "
1529
- 'contextual_help' => array($contextual_help
1530
- ),";
1531
- }
1532
-
1533
- // Build sections.
1534
- if ( isset( $option_tree_settings['sections'] ) ) {
1535
- foreach ( $option_tree_settings['sections'] as $value ) {
1536
- $_id = isset( $value['id'] ) ? $value['id'] : '';
1537
- $_title = ot_i18n_string( isset( $value['title'] ) ? str_replace( "'", "\'", $value['title'] ) : '' );
1538
- $sections .= "
1539
- array(
1540
- 'id' => '$_id',
1541
- 'title' => $_title,
1542
- ),";
1543
- }
1544
- }
1545
-
1546
- // Check that $sections has a value and add to $build_settings.
1547
- if ( '' !== $sections ) {
1548
- $build_settings .= "
1549
- 'sections' => array($sections
1550
- )";
1551
- }
1552
-
1553
- /* build settings */
1554
- if ( isset( $option_tree_settings['settings'] ) ) {
1555
- foreach ( $option_tree_settings['settings'] as $value ) {
1556
- $_id = isset( $value['id'] ) ? $value['id'] : '';
1557
- $_label = ot_i18n_string( isset( $value['label'] ) ? str_replace( "'", "\'", $value['label'] ) : '' );
1558
- $_desc = ot_i18n_string( isset( $value['desc'] ) ? str_replace( "'", "\'", $value['desc'] ) : '' );
1559
- $_std = isset( $value['std'] ) ? str_replace( "'", "\'", $value['std'] ) : '';
1560
- $_type = isset( $value['type'] ) ? $value['type'] : '';
1561
- $_section = isset( $value['section'] ) ? $value['section'] : '';
1562
- $_rows = isset( $value['rows'] ) ? $value['rows'] : '';
1563
- $_post_type = isset( $value['post_type'] ) ? $value['post_type'] : '';
1564
- $_taxonomy = isset( $value['taxonomy'] ) ? $value['taxonomy'] : '';
1565
- $_min_max_step = isset( $value['min_max_step'] ) ? $value['min_max_step'] : '';
1566
- $_class = isset( $value['class'] ) ? $value['class'] : '';
1567
- $_condition = isset( $value['condition'] ) ? $value['condition'] : '';
1568
- $_operator = isset( $value['operator'] ) ? $value['operator'] : '';
1569
-
1570
- $choices = '';
1571
- if ( isset( $value['choices'] ) && ! empty( $value['choices'] ) ) {
1572
- foreach ( $value['choices'] as $choice ) {
1573
- $_choice_value = isset( $choice['value'] ) ? str_replace( "'", "\'", $choice['value'] ) : '';
1574
- $_choice_label = ot_i18n_string( isset( $choice['label'] ) ? str_replace( "'", "\'", $choice['label'] ) : '' );
1575
- $_choice_src = isset( $choice['src'] ) ? str_replace( "'", "\'", $choice['src'] ) : '';
1576
- $choices .= "
1577
- array(
1578
- 'value' => '$_choice_value',
1579
- 'label' => $_choice_label,
1580
- 'src' => '$_choice_src',
1581
- ),";
1582
- }
1583
- $choices = "
1584
- 'choices' => array($choices
1585
- ),";
1586
- }
1587
-
1588
- $std = "'$_std'";
1589
- if ( is_array( $_std ) ) {
1590
- $std_array = array();
1591
- foreach ( $_std as $_sk => $_sv ) {
1592
- $std_array[] = "'$_sk' => '$_sv',";
1593
- }
1594
- $std = 'array(
1595
- ' . implode( ",\n", $std_array ) . '
1596
- )';
1597
- }
1598
-
1599
- $setting_settings = '';
1600
- if ( isset( $value['settings'] ) && ! empty( $value['settings'] ) ) {
1601
- foreach ( $value['settings'] as $setting ) {
1602
- $_setting_id = isset( $setting['id'] ) ? $setting['id'] : '';
1603
- $_setting_label = ot_i18n_string( isset( $setting['label'] ) ? str_replace( "'", "\'", $setting['label'] ) : '' );
1604
- $_setting_desc = ot_i18n_string( isset( $setting['desc'] ) ? str_replace( "'", "\'", $setting['desc'] ) : '' );
1605
- $_setting_std = isset( $setting['std'] ) ? $setting['std'] : '';
1606
- $_setting_type = isset( $setting['type'] ) ? $setting['type'] : '';
1607
- $_setting_rows = isset( $setting['rows'] ) ? $setting['rows'] : '';
1608
- $_setting_post_type = isset( $setting['post_type'] ) ? $setting['post_type'] : '';
1609
- $_setting_taxonomy = isset( $setting['taxonomy'] ) ? $setting['taxonomy'] : '';
1610
- $_setting_min_max_step = isset( $setting['min_max_step'] ) ? $setting['min_max_step'] : '';
1611
- $_setting_class = isset( $setting['class'] ) ? $setting['class'] : '';
1612
- $_setting_condition = isset( $setting['condition'] ) ? $setting['condition'] : '';
1613
- $_setting_operator = isset( $setting['operator'] ) ? $setting['operator'] : '';
1614
-
1615
- $setting_choices = '';
1616
- if ( isset( $setting['choices'] ) && ! empty( $setting['choices'] ) ) {
1617
- foreach ( $setting['choices'] as $setting_choice ) {
1618
- $_setting_choice_value = isset( $setting_choice['value'] ) ? $setting_choice['value'] : '';
1619
- $_setting_choice_label = ot_i18n_string( isset( $setting_choice['label'] ) ? str_replace( "'", "\'", $setting_choice['label'] ) : '' );
1620
- $_setting_choice_src = isset( $setting_choice['src'] ) ? str_replace( "'", "\'", $setting_choice['src'] ) : '';
1621
- $setting_choices .= "
1622
- array(
1623
- 'value' => '$_setting_choice_value',
1624
- 'label' => $_setting_choice_label,
1625
- 'src' => '$_setting_choice_src',
1626
- ),";
1627
- }
1628
- $setting_choices = "
1629
- 'choices' => array($setting_choices
1630
- ),";
1631
- }
1632
-
1633
- $setting_std = "'$_setting_std'";
1634
- if ( is_array( $_setting_std ) ) {
1635
- $setting_std_array = array();
1636
- foreach ( $_setting_std as $_ssk => $_ssv ) {
1637
- $setting_std_array[] = "'$_ssk' => '$_ssv'";
1638
- }
1639
- $setting_std = 'array(
1640
- ' . implode( ",\n", $setting_std_array ) . '
1641
- )';
1642
- }
1643
-
1644
- $setting_settings .= "
1645
- array(
1646
- 'id' => '$_setting_id',
1647
- 'label' => $_setting_label,
1648
- 'desc' => $_setting_desc,
1649
- 'std' => $setting_std,
1650
- 'type' => '$_setting_type',
1651
- 'rows' => '$_setting_rows',
1652
- 'post_type' => '$_setting_post_type',
1653
- 'taxonomy' => '$_setting_taxonomy',
1654
- 'min_max_step' => '$_setting_min_max_step',
1655
- 'class' => '$_setting_class',
1656
- 'condition' => '$_setting_condition',
1657
- 'operator' => '$_setting_operator',$setting_choices
1658
- ),";
1659
- }
1660
- $setting_settings = "
1661
- 'settings' => array( $setting_settings
1662
- ),";
1663
- }
1664
- $settings .= "
1665
- array(
1666
- 'id' => '$_id',
1667
- 'label' => $_label,
1668
- 'desc' => $_desc,
1669
- 'std' => $std,
1670
- 'type' => '$_type',
1671
- 'section' => '$_section',
1672
- 'rows' => '$_rows',
1673
- 'post_type' => '$_post_type',
1674
- 'taxonomy' => '$_taxonomy',
1675
- 'min_max_step' => '$_min_max_step',
1676
- 'class' => '$_class',
1677
- 'condition' => '$_condition',
1678
- 'operator' => '$_operator',$choices$setting_settings
1679
- ),";
1680
- }
1681
- }
1682
-
1683
- // Check that $sections has a value and add to $build_settings.
1684
- if ( '' !== $settings ) {
1685
- $build_settings .= ",
1686
- 'settings' => array($settings
1687
- )";
1688
- }
1689
-
1690
- $content .= "<?php
1691
- /**
1692
- * Initialize the custom theme options.
1693
- */
1694
- add_action( 'init', 'custom_theme_options' );
1695
-
1696
- /**
1697
- * Build the custom settings & update OptionTree.
1698
- */
1699
- function custom_theme_options() {
1700
-
1701
- // OptionTree is not loaded yet, or this is not an admin request.
1702
- if ( ! function_exists( 'ot_settings_id' ) || ! is_admin() ) {
1703
- return false;
1704
- }
1705
-
1706
- // Get a copy of the saved settings array.
1707
- \$saved_settings = get_option( ot_settings_id(), array() );
1708
-
1709
- // Custom settings array that will eventually be passes to the OptionTree Settings API Class.
1710
- \$custom_settings = array($build_settings
1711
- );
1712
-
1713
- // Allow settings to be filtered before saving.
1714
- \$custom_settings = apply_filters( ot_settings_id() . '_args', \$custom_settings );
1715
-
1716
- // Settings are not the same update the DB.
1717
- if ( \$saved_settings !== \$custom_settings ) {
1718
- update_option( ot_settings_id(), \$custom_settings );
1719
- }
1720
-
1721
- // Lets OptionTree know the UI Builder is being overridden.
1722
- global \$ot_has_custom_theme_options;
1723
- \$ot_has_custom_theme_options = true;
1724
- }
1725
- ";
1726
-
1727
- echo $content; // phpcs:ignore
1728
- die();
1729
- }
1730
- }
1731
-
1732
- if ( ! function_exists( 'ot_save_settings' ) ) {
1733
-
1734
- /**
1735
- * Save settings array before the screen is displayed.
1736
- *
1737
- * @return bool Redirects on save, false on failure.
1738
- *
1739
- * @access public
1740
- * @since 2.0
1741
- */
1742
- function ot_save_settings() {
1743
-
1744
- // Check and verify import settings nonce.
1745
- if ( isset( $_POST['option_tree_settings_nonce'] ) && wp_verify_nonce( $_POST['option_tree_settings_nonce'], 'option_tree_settings_form' ) ) { // phpcs:ignore
1746
-
1747
- // Settings value.
1748
- $settings = isset( $_POST[ ot_settings_id() ] ) ? wp_unslash( $_POST[ ot_settings_id() ] ) : array(); // phpcs:ignore
1749
-
1750
- $settings_safe = ot_validate_settings( $settings );
1751
-
1752
- // Default message.
1753
- $message = 'failed';
1754
-
1755
- // Save & show success message.
1756
- if ( ! empty( $settings_safe ) ) {
1757
- ot_wpml_unregister( $settings_safe );
1758
-
1759
- update_option( ot_settings_id(), $settings_safe );
1760
- $message = 'success';
1761
- }
1762
-
1763
- // Redirect.
1764
- wp_safe_redirect(
1765
- esc_url_raw(
1766
- add_query_arg(
1767
- array(
1768
- 'action' => 'save-settings',
1769
- 'message' => $message,
1770
- ),
1771
- wp_get_referer()
1772
- )
1773
- )
1774
- );
1775
- exit;
1776
- }
1777
-
1778
- return false;
1779
- }
1780
- }
1781
-
1782
- if ( ! function_exists( 'ot_wpml_unregister' ) ) {
1783
-
1784
- /**
1785
- * Unregister WPML strings based on settings changing.
1786
- *
1787
- * @param array $settings The array of settings.
1788
- *
1789
- * @access public
1790
- * @since 2.7.0
1791
- */
1792
- function ot_wpml_unregister( $settings = array() ) {
1793
-
1794
- // WPML unregister ID's that have been removed.
1795
- if ( function_exists( 'icl_unregister_string' ) ) {
1796
-
1797
- $current = get_option( ot_settings_id() );
1798
- $options = get_option( ot_options_id() );
1799
-
1800
- if ( isset( $current['settings'] ) ) {
1801
-
1802
- // Empty ID array.
1803
- $new_ids = array();
1804
-
1805
- // Build the WPML IDs array.
1806
- foreach ( $settings['settings'] as $setting ) {
1807
- if ( $setting['id'] ) {
1808
- $new_ids[] = $setting['id'];
1809
- }
1810
- }
1811
-
1812
- // Remove missing IDs from WPML.
1813
- foreach ( $current['settings'] as $current_setting ) {
1814
- if ( ! in_array( $current_setting['id'], $new_ids, true ) ) {
1815
- if ( ! empty( $options[ $current_setting['id'] ] ) && in_array( $current_setting['type'], array( 'list-item', 'slider' ), true ) ) {
1816
- foreach ( $options[ $current_setting['id'] ] as $key => $value ) {
1817
- foreach ( $value as $ckey => $cvalue ) {
1818
- ot_wpml_unregister_string( $current_setting['id'] . '_' . $ckey . '_' . $key );
1819
- }
1820
- }
1821
- } elseif ( ! empty( $options[ $current_setting['id'] ] ) && 'social-icons' === $current_setting['type'] ) {
1822
- foreach ( $options[ $current_setting['id'] ] as $key => $value ) {
1823
- foreach ( $value as $ckey => $cvalue ) {
1824
- ot_wpml_unregister_string( $current_setting['id'] . '_' . $ckey . '_' . $key );
1825
- }
1826
- }
1827
- } else {
1828
- ot_wpml_unregister_string( $current_setting['id'] );
1829
- }
1830
- }
1831
- }
1832
- }
1833
- }
1834
- }
1835
- }
1836
-
1837
- if ( ! function_exists( 'ot_validate_settings' ) ) {
1838
-
1839
- /**
1840
- * Helper function to validate all settings.
1841
- *
1842
- * This includes the `sections`, `settings`, and `contextual_help` arrays.
1843
- *
1844
- * @param array $settings The array of settings.
1845
- *
1846
- * @return array
1847
- *
1848
- * @access public
1849
- * @since 2.7.0
1850
- */
1851
- function ot_validate_settings( $settings = array() ) {
1852
-
1853
- // Store the validated settings.
1854
- $settings_safe = array();
1855
-
1856
- // Validate sections.
1857
- if ( isset( $settings['sections'] ) ) {
1858
-
1859
- // Fix numeric keys since drag & drop will change them.
1860
- $settings['sections'] = array_values( $settings['sections'] );
1861
-
1862
- // Loop through sections.
1863
- foreach ( $settings['sections'] as $k => $section ) {
1864
-
1865
- // Skip if missing values.
1866
- if ( ( ! isset( $section['title'] ) && ! isset( $section['id'] ) ) || ( '' === $section['title'] && '' === $section['id'] ) ) {
1867
- continue;
1868
- }
1869
-
1870
- // Validate label.
1871
- if ( '' !== $section['title'] ) {
1872
- $settings_safe['sections'][ $k ]['title'] = wp_kses_post( $section['title'] );
1873
- }
1874
-
1875
- // Missing title set to unfiltered ID.
1876
- if ( ! isset( $section['title'] ) || '' === $section['title'] ) {
1877
-
1878
- $settings_safe['sections'][ $k ]['title'] = wp_kses_post( $section['id'] );
1879
-
1880
- // Missing ID set to title.
1881
- } elseif ( ! isset( $section['id'] ) || '' === $section['id'] ) {
1882
-
1883
- $settings_safe['id'] = wp_kses_post( $section['title'] );
1884
- }
1885
-
1886
- // Sanitize ID once everything has been checked first.
1887
- $settings_safe['sections'][ $k ]['id'] = ot_sanitize_option_id( wp_kses_post( $section['id'] ) );
1888
- }
1889
- }
1890
-
1891
- // Validate settings by looping over array as many times as it takes.
1892
- if ( isset( $settings['settings'] ) ) {
1893
- $settings_safe['settings'] = ot_validate_settings_array( $settings['settings'] );
1894
- }
1895
-
1896
- // Validate contextual_help.
1897
- if ( isset( $settings['contextual_help']['content'] ) ) {
1898
-
1899
- // Fix numeric keys since drag & drop will change them.
1900
- $settings['contextual_help']['content'] = array_values( $settings['contextual_help']['content'] );
1901
-
1902
- // Loop through content.
1903
- foreach ( $settings['contextual_help']['content'] as $k => $content ) {
1904
-
1905
- // Skip if missing values.
1906
- if ( ( ! isset( $content['title'] ) && ! isset( $content['id'] ) ) || ( '' === $content['title'] && '' === $content['id'] ) ) {
1907
- continue;
1908
- }
1909
-
1910
- // Validate label.
1911
- if ( '' !== $content['title'] ) {
1912
- $settings_safe['contextual_help']['content'][ $k ]['title'] = wp_kses_post( $content['title'] );
1913
- }
1914
-
1915
- // Missing title set to unfiltered ID.
1916
- if ( ! isset( $content['title'] ) || '' === $content['title'] ) {
1917
-
1918
- $settings_safe['contextual_help']['content'][ $k ]['title'] = wp_kses_post( $content['id'] );
1919
-
1920
- // Missing ID set to title.
1921
- } elseif ( ! isset( $content['id'] ) || '' === $content['id'] ) {
1922
-
1923
- $content['id'] = wp_kses_post( $content['title'] );
1924
- }
1925
-
1926
- // Sanitize ID once everything has been checked first.
1927
- $settings_safe['contextual_help']['content'][ $k ]['id'] = ot_sanitize_option_id( wp_kses_post( $content['id'] ) );
1928
-
1929
- // Validate textarea description.
1930
- if ( isset( $content['content'] ) ) {
1931
- $settings_safe['contextual_help']['content'][ $k ]['content'] = wp_kses_post( $content['content'] );
1932
- }
1933
- }
1934
- }
1935
-
1936
- // Validate contextual_help sidebar.
1937
- if ( isset( $settings['contextual_help']['sidebar'] ) ) {
1938
- $settings_safe['contextual_help']['sidebar'] = wp_kses_post( $settings['contextual_help']['sidebar'] );
1939
- }
1940
-
1941
- return $settings_safe;
1942
- }
1943
- }
1944
-
1945
- if ( ! function_exists( 'ot_validate_settings_array' ) ) {
1946
-
1947
- /**
1948
- * Validate a settings array before save.
1949
- *
1950
- * This function will loop over a settings array as many
1951
- * times as it takes to validate every sub setting.
1952
- *
1953
- * @param array $settings The array of settings.
1954
- * @return array
1955
- *
1956
- * @access public
1957
- * @since 2.0
1958
- * @updated 2.7.0
1959
- */
1960
- function ot_validate_settings_array( $settings = array() ) {
1961
-
1962
- // Field types mapped to their sanitize function.
1963
- $field_types = array(
1964
- 'label' => 'wp_kses_post',
1965
- 'id' => 'ot_sanitize_option_id',
1966
- 'type' => 'sanitize_text_field',
1967
- 'desc' => 'wp_kses_post',
1968
- 'settings' => 'ot_validate_settings_array',
1969
- 'choices' => array(
1970
- 'label' => 'wp_kses_post',
1971
- 'value' => 'sanitize_text_field',
1972
- 'src' => 'sanitize_text_field',
1973
- ),
1974
- 'std' => 'sanitize_text_field',
1975
- 'rows' => 'absint',
1976
- 'post_type' => 'sanitize_text_field',
1977
- 'taxonomy' => 'sanitize_text_field',
1978
- 'min_max_step' => 'sanitize_text_field',
1979
- 'class' => 'sanitize_text_field',
1980
- 'condition' => 'sanitize_text_field',
1981
- 'operator' => 'sanitize_text_field',
1982
- 'section' => 'sanitize_text_field',
1983
- );
1984
-
1985
- // Store the validated settings.
1986
- $settings_safe = array();
1987
-
1988
- // Validate settings.
1989
- if ( 0 < count( $settings ) ) {
1990
-
1991
- // Fix numeric keys since drag & drop will change them.
1992
- $settings = array_values( $settings );
1993
-
1994
- // Loop through settings.
1995
- foreach ( $settings as $sk => $setting ) {
1996
- foreach ( $setting as $fk => $field ) {
1997
- if ( isset( $field_types[ $fk ] ) ) {
1998
- if ( 'choices' === $fk ) {
1999
- foreach ( $field as $ck => $choice ) {
2000
- foreach ( $choice as $vk => $value ) {
2001
- $settings_safe[ $sk ][ $fk ][ $ck ][ $vk ] = call_user_func( $field_types[ $fk ][ $vk ], $value );
2002
- }
2003
- }
2004
- } elseif ( 'std' === $fk && is_array( $field ) ) {
2005
- $callback = $field_types[ $fk ];
2006
- $array_map = function( $item ) use ( $array_map, $callback ) {
2007
- return is_array( $item ) ? array_map( $array_map, $item ) : call_user_func( $callback, $item );
2008
- };
2009
-
2010
- $settings_safe[ $sk ][ $fk ] = array_map( $array_map, $field );
2011
- } else {
2012
- $sanitized = call_user_func( $field_types[ $fk ], $field );
2013
- if ( 'rows' === $fk && 0 === $sanitized ) {
2014
- $sanitized = '';
2015
- }
2016
- $settings_safe[ $sk ][ $fk ] = $sanitized;
2017
- }
2018
- }
2019
- }
2020
- }
2021
- }
2022
-
2023
- return $settings_safe;
2024
- }
2025
- }
2026
-
2027
- if ( ! function_exists( 'ot_modify_layouts' ) ) {
2028
-
2029
- /**
2030
- * Save layouts array before the screen is displayed.
2031
- *
2032
- * @return bool Returns false or redirects.
2033
- *
2034
- * @access public
2035
- * @since 2.0
2036
- */
2037
- function ot_modify_layouts() {
2038
-
2039
- // Check and verify modify layouts nonce.
2040
- if ( isset( $_POST['option_tree_modify_layouts_nonce'] ) && wp_verify_nonce( $_POST['option_tree_modify_layouts_nonce'], 'option_tree_modify_layouts_form' ) ) { // phpcs:ignore
2041
-
2042
- // Previous layouts value.
2043
- $option_tree_layouts = get_option( ot_layouts_id() );
2044
-
2045
- // New layouts value.
2046
- $layouts = isset( $_POST[ ot_layouts_id() ] ) ? $_POST[ ot_layouts_id() ] : ''; // phpcs:ignore
2047
-
2048
- // Rebuild layout array.
2049
- $rebuild = array();
2050
-
2051
- // Validate layouts.
2052
- if ( is_array( $layouts ) && ! empty( $layouts ) ) {
2053
-
2054
- // Setup active layout.
2055
- if ( isset( $layouts['active_layout'] ) && ! empty( $layouts['active_layout'] ) ) {
2056
- $rebuild['active_layout'] = $layouts['active_layout'];
2057
- }
2058
-
2059
- // Add new and overwrite active layout.
2060
- if ( isset( $layouts['_add_new_layout_'] ) && ! empty( $layouts['_add_new_layout_'] ) ) {
2061
- $rebuild['active_layout'] = ot_sanitize_layout_id( $layouts['_add_new_layout_'] );
2062
- $rebuild[ $rebuild['active_layout'] ] = ot_encode( get_option( ot_options_id(), array() ) );
2063
- }
2064
-
2065
- $first_layout = '';
2066
-
2067
- // Loop through layouts.
2068
- foreach ( $layouts as $key => $layout ) {
2069
-
2070
- // Skip over active layout key.
2071
- if ( 'active_layout' === $key ) {
2072
- continue;
2073
- }
2074
-
2075
- // Check if the key exists then set value.
2076
- if ( isset( $option_tree_layouts[ $key ] ) && ! empty( $option_tree_layouts[ $key ] ) ) {
2077
- $rebuild[ $key ] = $option_tree_layouts[ $key ];
2078
- if ( '' === $first_layout ) {
2079
- $first_layout = $key;
2080
- }
2081
- }
2082
- }
2083
-
2084
- if ( isset( $rebuild['active_layout'] ) && ! isset( $rebuild[ $rebuild['active_layout'] ] ) && ! empty( $first_layout ) ) {
2085
- $rebuild['active_layout'] = $first_layout;
2086
- }
2087
- }
2088
-
2089
- // Default message.
2090
- $message = 'failed';
2091
-
2092
- // Save & show success message.
2093
- if ( is_array( $rebuild ) && 1 < count( $rebuild ) ) {
2094
-
2095
- $options = ot_decode( $rebuild[ $rebuild['active_layout'] ] );
2096
-
2097
- if ( $options ) {
2098
-
2099
- $options_safe = array();
2100
-
2101
- // Get settings array.
2102
- $settings = get_option( ot_settings_id() );
2103
-
2104
- // Has options.
2105
- if ( is_array( $options ) ) {
2106
-
2107
- // Validate options.
2108
- if ( is_array( $settings ) ) {
2109
- foreach ( $settings['settings'] as $setting ) {
2110
- if ( isset( $options[ $setting['id'] ] ) ) {
2111
- $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
2112
- }
2113
- }
2114
- }
2115
-
2116
- // Execute the action hook and pass the theme options to it.
2117
- do_action( 'ot_before_theme_options_save', $options_safe );
2118
-
2119
- update_option( ot_options_id(), $options_safe );
2120
- }
2121
- }
2122
-
2123
- // Rebuild the layouts.
2124
- update_option( ot_layouts_id(), $rebuild );
2125
-
2126
- // Change message.
2127
- $message = 'success';
2128
- } elseif ( 1 >= count( $rebuild ) ) {
2129
-
2130
- // Delete layouts option.
2131
- delete_option( ot_layouts_id() );
2132
-
2133
- // Change message.
2134
- $message = 'deleted';
2135
- }
2136
-
2137
- // Redirect.
2138
- if ( isset( $_REQUEST['page'] ) && apply_filters( 'ot_theme_options_menu_slug', 'ot-theme-options' ) === $_REQUEST['page'] ) {
2139
- $query_args = esc_url_raw(
2140
- add_query_arg(
2141
- array(
2142
- 'settings-updated' => 'layout',
2143
- ),
2144
- remove_query_arg(
2145
- array(
2146
- 'action',
2147
- 'message',
2148
- ),
2149
- wp_get_referer()
2150
- )
2151
- )
2152
- );
2153
- } else {
2154
- $query_args = esc_url_raw(
2155
- add_query_arg(
2156
- array(
2157
- 'action' => 'save-layouts',
2158
- 'message' => $message,
2159
- ),
2160
- wp_get_referer()
2161
- )
2162
- );
2163
- }
2164
- wp_safe_redirect( $query_args );
2165
- exit;
2166
- }
2167
-
2168
- return false;
2169
- }
2170
- }
2171
-
2172
- if ( ! function_exists( 'ot_alert_message' ) ) {
2173
-
2174
- /**
2175
- * Helper function to display alert messages.
2176
- *
2177
- * @param array $page Page array.
2178
- * @return mixed
2179
- *
2180
- * @access public
2181
- * @since 2.0
2182
- */
2183
- function ot_alert_message( $page = array() ) {
2184
-
2185
- if ( empty( $page ) ) {
2186
- return false;
2187
- }
2188
-
2189
- $before = apply_filters( 'ot_before_page_messages', '', $page );
2190
-
2191
- if ( $before ) {
2192
- return $before;
2193
- }
2194
-
2195
- $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; // phpcs:ignore
2196
- $message = isset( $_REQUEST['message'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['message'] ) ) : ''; // phpcs:ignore
2197
- $updated = isset( $_REQUEST['settings-updated'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['settings-updated'] ) ) : ''; // phpcs:ignore
2198
-
2199
- if ( 'save-settings' === $action ) {
2200
-
2201
- if ( 'success' === $message ) {
2202
-
2203
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Settings updated.', 'option-tree' ) . '</p></div>';
2204
-
2205
- } elseif ( 'failed' === $message ) {
2206
-
2207
- return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Settings could not be saved.', 'option-tree' ) . '</p></div>';
2208
-
2209
- }
2210
- } elseif ( 'import-xml' === $action || 'import-settings' === $action ) {
2211
-
2212
- if ( 'success' === $message ) {
2213
-
2214
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Settings Imported.', 'option-tree' ) . '</p></div>';
2215
-
2216
- } elseif ( 'failed' === $message ) {
2217
-
2218
- return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Settings could not be imported.', 'option-tree' ) . '</p></div>';
2219
-
2220
- }
2221
- } elseif ( 'import-data' === $action ) {
2222
-
2223
- if ( 'success' === $message ) {
2224
-
2225
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Data Imported.', 'option-tree' ) . '</p></div>';
2226
-
2227
- } elseif ( 'failed' === $message ) {
2228
-
2229
- return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Data could not be imported.', 'option-tree' ) . '</p></div>';
2230
-
2231
- }
2232
- } elseif ( 'import-layouts' === $action ) {
2233
-
2234
- if ( 'success' === $message ) {
2235
-
2236
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts Imported.', 'option-tree' ) . '</p></div>';
2237
-
2238
- } elseif ( 'failed' === $message ) {
2239
-
2240
- return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Layouts could not be imported.', 'option-tree' ) . '</p></div>';
2241
-
2242
- }
2243
- } elseif ( 'save-layouts' === $action ) {
2244
-
2245
- if ( 'success' === $message ) {
2246
-
2247
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts Updated.', 'option-tree' ) . '</p></div>';
2248
-
2249
- } elseif ( 'failed' === $message ) {
2250
-
2251
- return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Layouts could not be updated.', 'option-tree' ) . '</p></div>';
2252
-
2253
- } elseif ( 'deleted' === $message ) {
2254
-
2255
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts have been deleted.', 'option-tree' ) . '</p></div>';
2256
-
2257
- }
2258
- } elseif ( 'layout' === $updated ) {
2259
-
2260
- return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layout activated.', 'option-tree' ) . '</p></div>';
2261
-
2262
- } elseif ( 'reset' === $action ) {
2263
-
2264
- return '<div id="message" class="updated fade below-h2"><p>' . $page['reset_message'] . '</p></div>';
2265
-
2266
- }
2267
-
2268
- do_action( 'ot_custom_page_messages', $page );
2269
-
2270
- if ( 'true' === $updated || true === $updated ) {
2271
- return '<div id="message" class="updated fade below-h2"><p>' . $page['updated_message'] . '</p></div>';
2272
- }
2273
-
2274
- return false;
2275
- }
2276
- }
2277
-
2278
- if ( ! function_exists( 'ot_option_types_array' ) ) {
2279
-
2280
- /**
2281
- * Setup the default option types.
2282
- *
2283
- * The returned option types are filterable so you can add your own.
2284
- * This is not a task for a beginner as you'll need to add the function
2285
- * that displays the option to the user and validate the saved data.
2286
- *
2287
- * @return array
2288
- *
2289
- * @access public
2290
- * @since 2.0
2291
- */
2292
- function ot_option_types_array() {
2293
-
2294
- return apply_filters(
2295
- 'ot_option_types_array',
2296
- array(
2297
- 'background' => esc_html__( 'Background', 'option-tree' ),
2298
- 'border' => esc_html__( 'Border', 'option-tree' ),
2299
- 'box-shadow' => esc_html__( 'Box Shadow', 'option-tree' ),
2300
- 'category-checkbox' => esc_html__( 'Category Checkbox', 'option-tree' ),
2301
- 'category-select' => esc_html__( 'Category Select', 'option-tree' ),
2302
- 'checkbox' => esc_html__( 'Checkbox', 'option-tree' ),
2303
- 'colorpicker' => esc_html__( 'Colorpicker', 'option-tree' ),
2304
- 'colorpicker-opacity' => esc_html__( 'Colorpicker Opacity', 'option-tree' ),
2305
- 'css' => esc_html__( 'CSS', 'option-tree' ),
2306
- 'custom-post-type-checkbox' => esc_html__( 'Custom Post Type Checkbox', 'option-tree' ),
2307
- 'custom-post-type-select' => esc_html__( 'Custom Post Type Select', 'option-tree' ),
2308
- 'date-picker' => esc_html__( 'Date Picker', 'option-tree' ),
2309
- 'date-time-picker' => esc_html__( 'Date Time Picker', 'option-tree' ),
2310
- 'dimension' => esc_html__( 'Dimension', 'option-tree' ),
2311
- 'gallery' => esc_html__( 'Gallery', 'option-tree' ),
2312
- 'google-fonts' => esc_html__( 'Google Fonts', 'option-tree' ),
2313
- 'javascript' => esc_html__( 'JavaScript', 'option-tree' ),
2314
- 'link-color' => esc_html__( 'Link Color', 'option-tree' ),
2315
- 'list-item' => esc_html__( 'List Item', 'option-tree' ),
2316
- 'measurement' => esc_html__( 'Measurement', 'option-tree' ),
2317
- 'numeric-slider' => esc_html__( 'Numeric Slider', 'option-tree' ),
2318
- 'on-off' => esc_html__( 'On/Off', 'option-tree' ),
2319
- 'page-checkbox' => esc_html__( 'Page Checkbox', 'option-tree' ),
2320
- 'page-select' => esc_html__( 'Page Select', 'option-tree' ),
2321
- 'post-checkbox' => esc_html__( 'Post Checkbox', 'option-tree' ),
2322
- 'post-select' => esc_html__( 'Post Select', 'option-tree' ),
2323
- 'radio' => esc_html__( 'Radio', 'option-tree' ),
2324
- 'radio-image' => esc_html__( 'Radio Image', 'option-tree' ),
2325
- 'select' => esc_html__( 'Select', 'option-tree' ),
2326
- 'sidebar-select' => esc_html__( 'Sidebar Select', 'option-tree' ),
2327
- 'slider' => esc_html__( 'Slider', 'option-tree' ),
2328
- 'social-links' => esc_html__( 'Social Links', 'option-tree' ),
2329
- 'spacing' => esc_html__( 'Spacing', 'option-tree' ),
2330
- 'tab' => esc_html__( 'Tab', 'option-tree' ),
2331
- 'tag-checkbox' => esc_html__( 'Tag Checkbox', 'option-tree' ),
2332
- 'tag-select' => esc_html__( 'Tag Select', 'option-tree' ),
2333
- 'taxonomy-checkbox' => esc_html__( 'Taxonomy Checkbox', 'option-tree' ),
2334
- 'taxonomy-select' => esc_html__( 'Taxonomy Select', 'option-tree' ),
2335
- 'text' => esc_html__( 'Text', 'option-tree' ),
2336
- 'textarea' => esc_html__( 'Textarea', 'option-tree' ),
2337
- 'textarea-simple' => esc_html__( 'Textarea Simple', 'option-tree' ),
2338
- 'textblock' => esc_html__( 'Textblock', 'option-tree' ),
2339
- 'textblock-titled' => esc_html__( 'Textblock Titled', 'option-tree' ),
2340
- 'typography' => esc_html__( 'Typography', 'option-tree' ),
2341
- 'upload' => esc_html__( 'Upload', 'option-tree' ),
2342
- )
2343
- );
2344
- }
2345
- }
2346
-
2347
- if ( ! function_exists( 'ot_map_old_option_types' ) ) {
2348
-
2349
- /**
2350
- * Map old option types for rebuilding XML and Table data.
2351
- *
2352
- * @param string $type The old option type.
2353
- * @return string The new option type
2354
- *
2355
- * @access public
2356
- * @since 2.0
2357
- */
2358
- function ot_map_old_option_types( $type = '' ) {
2359
-
2360
- if ( empty( $type ) ) {
2361
- return 'text';
2362
- }
2363
-
2364
- $types = array(
2365
- 'background' => 'background',
2366
- 'category' => 'category-select',
2367
- 'categories' => 'category-checkbox',
2368
- 'checkbox' => 'checkbox',
2369
- 'colorpicker' => 'colorpicker',
2370
- 'css' => 'css',
2371
- 'custom_post' => 'custom-post-type-select',
2372
- 'custom_posts' => 'custom-post-type-checkbox',
2373
- 'input' => 'text',
2374
- 'image' => 'upload',
2375
- 'measurement' => 'measurement',
2376
- 'page' => 'page-select',
2377
- 'pages' => 'page-checkbox',
2378
- 'post' => 'post-select',
2379
- 'posts' => 'post-checkbox',
2380
- 'radio' => 'radio',
2381
- 'select' => 'select',
2382
- 'slider' => 'slider',
2383
- 'tag' => 'tag-select',
2384
- 'tags' => 'tag-checkbox',
2385
- 'textarea' => 'textarea',
2386
- 'textblock' => 'textblock',
2387
- 'typography' => 'typography',
2388
- 'upload' => 'upload',
2389
- );
2390
-
2391
- if ( isset( $types[ $type ] ) ) {
2392
- return $types[ $type ];
2393
- }
2394
-
2395
- return false;
2396
- }
2397
- }
2398
-
2399
- if ( ! function_exists( 'ot_google_font_stack' ) ) {
2400
-
2401
- /**
2402
- * Filters the typography font-family to add Google fonts dynamically.
2403
- *
2404
- * @param array $families An array of all recognized font families.
2405
- * @param string $field_id ID of the field being filtered.
2406
- *
2407
- * @return array
2408
- *
2409
- * @access public
2410
- * @since 2.5.0
2411
- */
2412
- function ot_google_font_stack( $families, $field_id ) {
2413
-
2414
- if ( ! is_array( $families ) ) {
2415
- return array();
2416
- }
2417
-
2418
- $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
2419
- $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
2420
-
2421
- if ( ! empty( $ot_set_google_fonts ) ) {
2422
- foreach ( $ot_set_google_fonts as $id => $sets ) {
2423
- foreach ( $sets as $value ) {
2424
- $family = isset( $value['family'] ) ? $value['family'] : '';
2425
- if ( $family && isset( $ot_google_fonts[ $family ] ) ) {
2426
- $spaces = explode( ' ', $ot_google_fonts[ $family ]['family'] );
2427
- $font_stack = count( $spaces ) > 1 ? '"' . $ot_google_fonts[ $family ]['family'] . '"' : $ot_google_fonts[ $family ]['family'];
2428
- $families[ $family ] = apply_filters( 'ot_google_font_stack', $font_stack, $family, $field_id );
2429
- }
2430
- }
2431
- }
2432
- }
2433
-
2434
- return $families;
2435
- }
2436
-
2437
- add_filter( 'ot_recognized_font_families', 'ot_google_font_stack', 1, 2 );
2438
- }
2439
-
2440
- if ( ! function_exists( 'ot_recognized_font_families' ) ) {
2441
-
2442
- /**
2443
- * Recognized font families
2444
- *
2445
- * Returns an array of all recognized font families.
2446
- * Keys are intended to be stored in the database
2447
- * while values are ready for display in html.
2448
- * Renamed in version 2.0 to avoid name collisions.
2449
- *
2450
- * @uses apply_filters()
2451
- *
2452
- * @param string $field_id ID that's passed to the filter.
2453
- *
2454
- * @return array
2455
- *
2456
- * @access public
2457
- * @since 1.1.8
2458
- * @updated 2.0
2459
- */
2460
- function ot_recognized_font_families( $field_id ) {
2461
-
2462
- $families = array(
2463
- 'arial' => 'Arial',
2464
- 'georgia' => 'Georgia',
2465
- 'helvetica' => 'Helvetica',
2466
- 'palatino' => 'Palatino',
2467
- 'tahoma' => 'Tahoma',
2468
- 'times' => '"Times New Roman", sans-serif',
2469
- 'trebuchet' => 'Trebuchet',
2470
- 'verdana' => 'Verdana',
2471
- );
2472
-
2473
- return apply_filters( 'ot_recognized_font_families', $families, $field_id );
2474
- }
2475
- }
2476
-
2477
- if ( ! function_exists( 'ot_recognized_font_sizes' ) ) {
2478
-
2479
- /**
2480
- * Recognized font sizes
2481
- *
2482
- * Returns an array of all recognized font sizes.
2483
- *
2484
- * @uses apply_filters()
2485
- *
2486
- * @param string $field_id ID that's passed to the filter.
2487
- *
2488
- * @return array
2489
- *
2490
- * @access public
2491
- * @since 2.0.12
2492
- */
2493
- function ot_recognized_font_sizes( $field_id ) {
2494
-
2495
- $range = ot_range(
2496
- apply_filters( 'ot_font_size_low_range', 0, $field_id ),
2497
- apply_filters( 'ot_font_size_high_range', 150, $field_id ),
2498
- apply_filters( 'ot_font_size_range_interval', 1, $field_id )
2499
- );
2500
-
2501
- $unit = apply_filters( 'ot_font_size_unit_type', 'px', $field_id );
2502
-
2503
- foreach ( $range as $k => $v ) {
2504
- $range[ $k ] = $v . $unit;
2505
- }
2506
-
2507
- return apply_filters( 'ot_recognized_font_sizes', $range, $field_id );
2508
- }
2509
- }
2510
-
2511
- if ( ! function_exists( 'ot_recognized_font_styles' ) ) {
2512
-
2513
- /**
2514
- * Recognized font styles
2515
- *
2516
- * Returns an array of all recognized font styles.
2517
- * Renamed in version 2.0 to avoid name collisions.
2518
- *
2519
- * @uses apply_filters()
2520
- *
2521
- * @param string $field_id ID that's passed to the filter.
2522
- *
2523
- * @return array
2524
- *
2525
- * @access public
2526
- * @since 1.1.8
2527
- * @updated 2.0
2528
- */
2529
- function ot_recognized_font_styles( $field_id ) {
2530
-
2531
- return apply_filters(
2532
- 'ot_recognized_font_styles',
2533
- array(
2534
- 'normal' => 'Normal',
2535
- 'italic' => 'Italic',
2536
- 'oblique' => 'Oblique',
2537
- 'inherit' => 'Inherit',
2538
- ),
2539
- $field_id
2540
- );
2541
- }
2542
- }
2543
-
2544
- if ( ! function_exists( 'ot_recognized_font_variants' ) ) {
2545
-
2546
- /**
2547
- * Recognized font variants
2548
- *
2549
- * Returns an array of all recognized font variants.
2550
- * Renamed in version 2.0 to avoid name collisions.
2551
- *
2552
- * @uses apply_filters()
2553
- *
2554
- * @param string $field_id ID that's passed to the filter.
2555
- *
2556
- * @return array
2557
- *
2558
- * @access public
2559
- * @since 1.1.8
2560
- * @updated 2.0
2561
- */
2562
- function ot_recognized_font_variants( $field_id ) {
2563
-
2564
- return apply_filters(
2565
- 'ot_recognized_font_variants',
2566
- array(
2567
- 'normal' => 'Normal',
2568
- 'small-caps' => 'Small Caps',
2569
- 'inherit' => 'Inherit',
2570
- ),
2571
- $field_id
2572
- );
2573
- }
2574
- }
2575
-
2576
- if ( ! function_exists( 'ot_recognized_font_weights' ) ) {
2577
-
2578
- /**
2579
- * Recognized font weights
2580
- *
2581
- * Returns an array of all recognized font weights.
2582
- * Renamed in version 2.0 to avoid name collisions.
2583
- *
2584
- * @uses apply_filters()
2585
- *
2586
- * @param string $field_id ID that's passed to the filter.
2587
- *
2588
- * @return array
2589
- *
2590
- * @access public
2591
- * @since 1.1.8
2592
- * @updated 2.0
2593
- */
2594
- function ot_recognized_font_weights( $field_id ) {
2595
-
2596
- return apply_filters(
2597
- 'ot_recognized_font_weights',
2598
- array(
2599
- 'normal' => 'Normal',
2600
- 'bold' => 'Bold',
2601
- 'bolder' => 'Bolder',
2602
- 'lighter' => 'Lighter',
2603
- '100' => '100',
2604
- '200' => '200',
2605
- '300' => '300',
2606
- '400' => '400',
2607
- '500' => '500',
2608
- '600' => '600',
2609
- '700' => '700',
2610
- '800' => '800',
2611
- '900' => '900',
2612
- 'inherit' => 'Inherit',
2613
- ),
2614
- $field_id
2615
- );
2616
- }
2617
- }
2618
-
2619
- if ( ! function_exists( 'ot_recognized_letter_spacing' ) ) {
2620
-
2621
- /**
2622
- * Recognized letter spacing
2623
- *
2624
- * Returns an array of all recognized line heights.
2625
- *
2626
- * @uses apply_filters()
2627
- *
2628
- * @param string $field_id ID that's passed to the filter.
2629
- *
2630
- * @return array
2631
- *
2632
- * @access public
2633
- * @since 2.0.12
2634
- */
2635
- function ot_recognized_letter_spacing( $field_id ) {
2636
-
2637
- $range = ot_range(
2638
- apply_filters( 'ot_letter_spacing_low_range', -0.1, $field_id ),
2639
- apply_filters( 'ot_letter_spacing_high_range', 0.1, $field_id ),
2640
- apply_filters( 'ot_letter_spacing_range_interval', 0.01, $field_id )
2641
- );
2642
-
2643
- $unit = apply_filters( 'ot_letter_spacing_unit_type', 'em', $field_id );
2644
-
2645
- foreach ( $range as $k => $v ) {
2646
- $range[ $k ] = $v . $unit;
2647
- }
2648
-
2649
- return apply_filters( 'ot_recognized_letter_spacing', $range, $field_id );
2650
- }
2651
- }
2652
-
2653
- if ( ! function_exists( 'ot_recognized_line_heights' ) ) {
2654
-
2655
- /**
2656
- * Recognized line heights
2657
- *
2658
- * Returns an array of all recognized line heights.
2659
- *
2660
- * @uses apply_filters()
2661
- *
2662
- * @param string $field_id ID that's passed to the filter.
2663
- *
2664
- * @return array
2665
- *
2666
- * @access public
2667
- * @since 2.0.12
2668
- */
2669
- function ot_recognized_line_heights( $field_id ) {
2670
-
2671
- $range = ot_range(
2672
- apply_filters( 'ot_line_height_low_range', 0, $field_id ),
2673
- apply_filters( 'ot_line_height_high_range', 150, $field_id ),
2674
- apply_filters( 'ot_line_height_range_interval', 1, $field_id )
2675
- );
2676
-
2677
- $unit = apply_filters( 'ot_line_height_unit_type', 'px', $field_id );
2678
-
2679
- foreach ( $range as $k => $v ) {
2680
- $range[ $k ] = $v . $unit;
2681
- }
2682
-
2683
- return apply_filters( 'ot_recognized_line_heights', $range, $field_id );
2684
- }
2685
- }
2686
-
2687
- if ( ! function_exists( 'ot_recognized_text_decorations' ) ) {
2688
-
2689
- /**
2690
- * Recognized text decorations
2691
- *
2692
- * Returns an array of all recognized text decorations.
2693
- * Keys are intended to be stored in the database
2694
- * while values are ready for display in html.
2695
- *
2696
- * @uses apply_filters()
2697
- *
2698
- * @param string $field_id ID that's passed to the filter.
2699
- *
2700
- * @return array
2701
- *
2702
- * @access public
2703
- * @since 2.0.10
2704
- */
2705
- function ot_recognized_text_decorations( $field_id ) {
2706
-
2707
- return apply_filters(
2708
- 'ot_recognized_text_decorations',
2709
- array(
2710
- 'blink' => 'Blink',
2711
- 'inherit' => 'Inherit',
2712
- 'line-through' => 'Line Through',
2713
- 'none' => 'None',
2714
- 'overline' => 'Overline',
2715
- 'underline' => 'Underline',
2716
- ),
2717
- $field_id
2718
- );
2719
- }
2720
- }
2721
-
2722
- if ( ! function_exists( 'ot_recognized_text_transformations' ) ) {
2723
-
2724
- /**
2725
- * Recognized text transformations
2726
- *
2727
- * Returns an array of all recognized text transformations.
2728
- * Keys are intended to be stored in the database
2729
- * while values are ready for display in html.
2730
- *
2731
- * @uses apply_filters()
2732
- *
2733
- * @param string $field_id ID that's passed to the filter.
2734
- *
2735
- * @return array
2736
- *
2737
- * @access public
2738
- * @since 2.0.10
2739
- */
2740
- function ot_recognized_text_transformations( $field_id ) {
2741
-
2742
- return apply_filters(
2743
- 'ot_recognized_text_transformations',
2744
- array(
2745
- 'capitalize' => 'Capitalize',
2746
- 'inherit' => 'Inherit',
2747
- 'lowercase' => 'Lowercase',
2748
- 'none' => 'None',
2749
- 'uppercase' => 'Uppercase',
2750
- ),
2751
- $field_id
2752
- );
2753
- }
2754
- }
2755
-
2756
- if ( ! function_exists( 'ot_recognized_background_repeat' ) ) {
2757
-
2758
- /**
2759
- * Recognized background repeat
2760
- *
2761
- * Returns an array of all recognized background repeat values.
2762
- * Renamed in version 2.0 to avoid name collisions.
2763
- *
2764
- * @uses apply_filters()
2765
- *
2766
- * @param string $field_id ID that's passed to the filter.
2767
- *
2768
- * @return array
2769
- *
2770
- * @access public
2771
- * @since 1.1.8
2772
- * @updated 2.0
2773
- */
2774
- function ot_recognized_background_repeat( $field_id ) {
2775
-
2776
- return apply_filters(
2777
- 'ot_recognized_background_repeat',
2778
- array(
2779
- 'no-repeat' => 'No Repeat',
2780
- 'repeat' => 'Repeat All',
2781
- 'repeat-x' => 'Repeat Horizontally',
2782
- 'repeat-y' => 'Repeat Vertically',
2783
- 'inherit' => 'Inherit',
2784
- ),
2785
- $field_id
2786
- );
2787
- }
2788
- }
2789
-
2790
- if ( ! function_exists( 'ot_recognized_background_attachment' ) ) {
2791
-
2792
- /**
2793
- * Recognized background attachment
2794
- *
2795
- * Returns an array of all recognized background attachment values.
2796
- * Renamed in version 2.0 to avoid name collisions.
2797
- *
2798
- * @uses apply_filters()
2799
- *
2800
- * @param string $field_id ID that's passed to the filter.
2801
- *
2802
- * @return array
2803
- *
2804
- * @access public
2805
- * @since 1.1.8
2806
- * @updated 2.0
2807
- */
2808
- function ot_recognized_background_attachment( $field_id ) {
2809
-
2810
- return apply_filters(
2811
- 'ot_recognized_background_attachment',
2812
- array(
2813
- 'fixed' => 'Fixed',
2814
- 'scroll' => 'Scroll',
2815
- 'inherit' => 'Inherit',
2816
- ),
2817
- $field_id
2818
- );
2819
- }
2820
- }
2821
-
2822
- if ( ! function_exists( 'ot_recognized_background_position' ) ) {
2823
-
2824
- /**
2825
- * Recognized background position
2826
- *
2827
- * Returns an array of all recognized background position values.
2828
- * Renamed in version 2.0 to avoid name collisions.
2829
- *
2830
- * @uses apply_filters()
2831
- *
2832
- * @param string $field_id ID that's passed to the filter.
2833
- *
2834
- * @return array
2835
- *
2836
- * @access public
2837
- * @since 1.1.8
2838
- * @updated 2.0
2839
- */
2840
- function ot_recognized_background_position( $field_id ) {
2841
-
2842
- return apply_filters(
2843
- 'ot_recognized_background_position',
2844
- array(
2845
- 'left top' => 'Left Top',
2846
- 'left center' => 'Left Center',
2847
- 'left bottom' => 'Left Bottom',
2848
- 'center top' => 'Center Top',
2849
- 'center center' => 'Center Center',
2850
- 'center bottom' => 'Center Bottom',
2851
- 'right top' => 'Right Top',
2852
- 'right center' => 'Right Center',
2853
- 'right bottom' => 'Right Bottom',
2854
- ),
2855
- $field_id
2856
- );
2857
-
2858
- }
2859
- }
2860
-
2861
- if ( ! function_exists( 'ot_recognized_border_style_types' ) ) {
2862
-
2863
- /**
2864
- * Returns an array of all available border style types.
2865
- *
2866
- * @uses apply_filters()
2867
- *
2868
- * @param string $field_id ID that's passed to the filter.
2869
- *
2870
- * @return array
2871
- *
2872
- * @access public
2873
- * @since 2.5.0
2874
- */
2875
- function ot_recognized_border_style_types( $field_id ) {
2876
-
2877
- return apply_filters(
2878
- 'ot_recognized_border_style_types',
2879
- array(
2880
- 'hidden' => 'Hidden',
2881
- 'dashed' => 'Dashed',
2882
- 'solid' => 'Solid',
2883
- 'double' => 'Double',
2884
- 'groove' => 'Groove',
2885
- 'ridge' => 'Ridge',
2886
- 'inset' => 'Inset',
2887
- 'outset' => 'Outset',
2888
- ),
2889
- $field_id
2890
- );
2891
-
2892
- }
2893
- }
2894
-
2895
- if ( ! function_exists( 'ot_recognized_border_unit_types' ) ) {
2896
-
2897
- /**
2898
- * Returns an array of all available border unit types.
2899
- *
2900
- * @uses apply_filters()
2901
- *
2902
- * @param string $field_id ID that's passed to the filter.
2903
- *
2904
- * @return array
2905
- *
2906
- * @access public
2907
- * @since 2.5.0
2908
- */
2909
- function ot_recognized_border_unit_types( $field_id ) {
2910
-
2911
- return apply_filters(
2912
- 'ot_recognized_border_unit_types',
2913
- array(
2914
- 'px' => 'px',
2915
- '%' => '%',
2916
- 'em' => 'em',
2917
- 'pt' => 'pt',
2918
- ),
2919
- $field_id
2920
- );
2921
- }
2922
- }
2923
-
2924
- if ( ! function_exists( 'ot_recognized_dimension_unit_types' ) ) {
2925
-
2926
- /**
2927
- * Returns an array of all available dimension unit types.
2928
- *
2929
- * @uses apply_filters()
2930
- *
2931
- * @param string $field_id ID that's passed to the filter.
2932
- *
2933
- * @return array
2934
- *
2935
- * @access public
2936
- * @since 2.5.0
2937
- */
2938
- function ot_recognized_dimension_unit_types( $field_id = '' ) {
2939
-
2940
- return apply_filters(
2941
- 'ot_recognized_dimension_unit_types',
2942
- array(
2943
- 'px' => 'px',
2944
- '%' => '%',
2945
- 'em' => 'em',
2946
- 'pt' => 'pt',
2947
- ),
2948
- $field_id
2949
- );
2950
- }
2951
- }
2952
-
2953
- if ( ! function_exists( 'ot_recognized_spacing_unit_types' ) ) {
2954
-
2955
- /**
2956
- * Returns an array of all available spacing unit types.
2957
- *
2958
- * @uses apply_filters()
2959
- *
2960
- * @param string $field_id ID that's passed to the filter.
2961
- *
2962
- * @return array
2963
- *
2964
- * @access public
2965
- * @since 2.5.0
2966
- */
2967
- function ot_recognized_spacing_unit_types( $field_id ) {
2968
-
2969
- return apply_filters(
2970
- 'ot_recognized_spacing_unit_types',
2971
- array(
2972
- 'px' => 'px',
2973
- '%' => '%',
2974
- 'em' => 'em',
2975
- 'pt' => 'pt',
2976
- ),
2977
- $field_id
2978
- );
2979
-
2980
- }
2981
- }
2982
-
2983
- if ( ! function_exists( 'ot_recognized_google_font_families' ) ) {
2984
-
2985
- /**
2986
- * Recognized Google font families
2987
- *
2988
- * @uses apply_filters()
2989
- *
2990
- * @param string $field_id ID that's passed to the filter.
2991
- *
2992
- * @return array
2993
- *
2994
- * @access public
2995
- * @since 2.5.0
2996
- */
2997
- function ot_recognized_google_font_families( $field_id ) {
2998
-
2999
- $families = array();
3000
- $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3001
-
3002
- // Forces an array rebuild when we switch themes.
3003
- if ( empty( $ot_google_fonts ) ) {
3004
- $ot_google_fonts = ot_fetch_google_fonts( true, true );
3005
- }
3006
-
3007
- foreach ( (array) $ot_google_fonts as $key => $item ) {
3008
-
3009
- if ( isset( $item['family'] ) ) {
3010
- $families[ $key ] = $item['family'];
3011
- }
3012
- }
3013
-
3014
- return apply_filters( 'ot_recognized_google_font_families', $families, $field_id );
3015
- }
3016
- }
3017
-
3018
- if ( ! function_exists( 'ot_recognized_google_font_variants' ) ) {
3019
-
3020
- /**
3021
- * Recognized Google font variants
3022
- *
3023
- * @uses apply_filters()
3024
- *
3025
- * @param string $field_id ID that's passed to the filter.
3026
- * @param string $family The font family.
3027
- *
3028
- * @return array
3029
- *
3030
- * @access public
3031
- * @since 2.5.0
3032
- */
3033
- function ot_recognized_google_font_variants( $field_id, $family ) {
3034
-
3035
- $variants = array();
3036
- $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3037
-
3038
- if ( isset( $ot_google_fonts[ $family ]['variants'] ) ) {
3039
- $variants = $ot_google_fonts[ $family ]['variants'];
3040
- }
3041
-
3042
- return apply_filters( 'ot_recognized_google_font_variants', $variants, $field_id, $family );
3043
- }
3044
- }
3045
-
3046
- if ( ! function_exists( 'ot_recognized_google_font_subsets' ) ) {
3047
-
3048
- /**
3049
- * Recognized Google font subsets
3050
- *
3051
- * @uses apply_filters()
3052
- *
3053
- * @param string $field_id ID that's passed to the filter.
3054
- * @param string $family The font family.
3055
- *
3056
- * @return array
3057
- *
3058
- * @access public
3059
- * @since 2.5.0
3060
- */
3061
- function ot_recognized_google_font_subsets( $field_id, $family ) {
3062
-
3063
- $subsets = array();
3064
- $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3065
-
3066
- if ( isset( $ot_google_fonts[ $family ]['subsets'] ) ) {
3067
- $subsets = $ot_google_fonts[ $family ]['subsets'];
3068
- }
3069
-
3070
- return apply_filters( 'ot_recognized_google_font_subsets', $subsets, $field_id, $family );
3071
- }
3072
- }
3073
-
3074
- if ( ! function_exists( 'ot_measurement_unit_types' ) ) {
3075
-
3076
- /**
3077
- * Measurement Units
3078
- *
3079
- * Returns an array of all available unit types.
3080
- * Renamed in version 2.0 to avoid name collisions.
3081
- *
3082
- * @uses apply_filters()
3083
- *
3084
- * @param string $field_id ID that's passed to the filter.
3085
- *
3086
- * @return array
3087
- *
3088
- * @access public
3089
- * @since 1.1.8
3090
- * @since 2.0
3091
- */
3092
- function ot_measurement_unit_types( $field_id = '' ) {
3093
-
3094
- return apply_filters(
3095
- 'ot_measurement_unit_types',
3096
- array(
3097
- 'px' => 'px',
3098
- '%' => '%',
3099
- 'em' => 'em',
3100
- 'pt' => 'pt',
3101
- ),
3102
- $field_id
3103
- );
3104
-
3105
- }
3106
- }
3107
-
3108
- if ( ! function_exists( 'ot_radio_images' ) ) {
3109
-
3110
- /**
3111
- * Radio Images default array.
3112
- *
3113
- * Returns an array of all available radio images.
3114
- * You can filter this function to change the images
3115
- * on a per option basis.
3116
- *
3117
- * @uses apply_filters()
3118
- *
3119
- * @param string $field_id ID that's passed to the filter.
3120
- *
3121
- * @return array
3122
- *
3123
- * @access public
3124
- * @since 2.0
3125
- */
3126
- function ot_radio_images( $field_id ) {
3127
-
3128
- return apply_filters(
3129
- 'ot_radio_images',
3130
- array(
3131
- array(
3132
- 'value' => 'left-sidebar',
3133
- 'label' => esc_html__( 'Left Sidebar', 'option-tree' ),
3134
- 'src' => OT_URL . 'assets/images/layout/left-sidebar.png',
3135
- ),
3136
- array(
3137
- 'value' => 'right-sidebar',
3138
- 'label' => esc_html__( 'Right Sidebar', 'option-tree' ),
3139
- 'src' => OT_URL . 'assets/images/layout/right-sidebar.png',
3140
- ),
3141
- array(
3142
- 'value' => 'full-width',
3143
- 'label' => esc_html__( 'Full Width (no sidebar)', 'option-tree' ),
3144
- 'src' => OT_URL . 'assets/images/layout/full-width.png',
3145
- ),
3146
- array(
3147
- 'value' => 'dual-sidebar',
3148
- 'label' => esc_html__( 'Dual Sidebar', 'option-tree' ),
3149
- 'src' => OT_URL . 'assets/images/layout/dual-sidebar.png',
3150
- ),
3151
- array(
3152
- 'value' => 'left-dual-sidebar',
3153
- 'label' => esc_html__( 'Left Dual Sidebar', 'option-tree' ),
3154
- 'src' => OT_URL . 'assets/images/layout/left-dual-sidebar.png',
3155
- ),
3156
- array(
3157
- 'value' => 'right-dual-sidebar',
3158
- 'label' => esc_html__( 'Right Dual Sidebar', 'option-tree' ),
3159
- 'src' => OT_URL . 'assets/images/layout/right-dual-sidebar.png',
3160
- ),
3161
- ),
3162
- $field_id
3163
- );
3164
-
3165
- }
3166
- }
3167
-
3168
- if ( ! function_exists( 'ot_list_item_settings' ) ) {
3169
-
3170
- /**
3171
- * Default List Item Settings array.
3172
- *
3173
- * Returns an array of the default list item settings.
3174
- * You can filter this function to change the settings
3175
- * on a per option basis.
3176
- *
3177
- * @uses apply_filters()
3178
- *
3179
- * @param string $field_id ID that's passed to the filter.
3180
- *
3181
- * @return array
3182
- *
3183
- * @access public
3184
- * @since 2.0
3185
- */
3186
- function ot_list_item_settings( $field_id ) {
3187
-
3188
- $settings = apply_filters(
3189
- 'ot_list_item_settings',
3190
- array(
3191
- array(
3192
- 'id' => 'image',
3193
- 'label' => esc_html__( 'Image', 'option-tree' ),
3194
- 'desc' => '',
3195
- 'std' => '',
3196
- 'type' => 'upload',
3197
- 'rows' => '',
3198
- 'class' => '',
3199
- 'post_type' => '',
3200
- 'choices' => array(),
3201
- ),
3202
- array(
3203
- 'id' => 'link',
3204
- 'label' => esc_html__( 'Link', 'option-tree' ),
3205
- 'desc' => '',
3206
- 'std' => '',
3207
- 'type' => 'text',
3208
- 'rows' => '',
3209
- 'class' => '',
3210
- 'post_type' => '',
3211
- 'choices' => array(),
3212
- ),
3213
- array(
3214
- 'id' => 'description',
3215
- 'label' => esc_html__( 'Description', 'option-tree' ),
3216
- 'desc' => '',
3217
- 'std' => '',
3218
- 'type' => 'textarea-simple',
3219
- 'rows' => 10,
3220
- 'class' => '',
3221
- 'post_type' => '',
3222
- 'choices' => array(),
3223
- ),
3224
- ),
3225
- $field_id
3226
- );
3227
-
3228
- return $settings;
3229
- }
3230
- }
3231
-
3232
- if ( ! function_exists( 'ot_slider_settings' ) ) {
3233
-
3234
- /**
3235
- * Default Slider Settings array.
3236
- *
3237
- * Returns an array of the default slider settings.
3238
- * You can filter this function to change the settings
3239
- * on a per option basis.
3240
- *
3241
- * @uses apply_filters()
3242
- *
3243
- * @param string $field_id ID that's passed to the filter.
3244
- *
3245
- * @return array
3246
- *
3247
- * @access public
3248
- * @since 2.0
3249
- */
3250
- function ot_slider_settings( $field_id ) {
3251
-
3252
- $settings = apply_filters(
3253
- 'image_slider_fields',
3254
- array(
3255
- array(
3256
- 'name' => 'image',
3257
- 'type' => 'image',
3258
- 'label' => esc_html__( 'Image', 'option-tree' ),
3259
- 'class' => '',
3260
- ),
3261
- array(
3262
- 'name' => 'link',
3263
- 'type' => 'text',
3264
- 'label' => esc_html__( 'Link', 'option-tree' ),
3265
- 'class' => '',
3266
- ),
3267
- array(
3268
- 'name' => 'description',
3269
- 'type' => 'textarea',
3270
- 'label' => esc_html__( 'Description', 'option-tree' ),
3271
- 'class' => '',
3272
- ),
3273
- ),
3274
- $field_id
3275
- );
3276
-
3277
- // Fix the array keys, values, and just get it 2.0 ready.
3278
- foreach ( $settings as $_k => $setting ) {
3279
-
3280
- foreach ( $setting as $s_key => $s_value ) {
3281
-
3282
- if ( 'name' === $s_key ) {
3283
-
3284
- $settings[ $_k ]['id'] = $s_value;
3285
- unset( $settings[ $_k ]['name'] );
3286
- } elseif ( 'type' === $s_key ) {
3287
-
3288
- if ( 'input' === $s_value ) {
3289
-
3290
- $settings[ $_k ]['type'] = 'text';
3291
- } elseif ( 'textarea' === $s_value ) {
3292
-
3293
- $settings[ $_k ]['type'] = 'textarea-simple';
3294
- } elseif ( 'image' === $s_value ) {
3295
-
3296
- $settings[ $_k ]['type'] = 'upload';
3297
- }
3298
- }
3299
- }
3300
- }
3301
-
3302
- return $settings;
3303
- }
3304
- }
3305
-
3306
- if ( ! function_exists( 'ot_social_links_settings' ) ) {
3307
-
3308
- /**
3309
- * Default Social Links Settings array.
3310
- *
3311
- * Returns an array of the default social links settings.
3312
- * You can filter this function to change the settings
3313
- * on a per option basis.
3314
- *
3315
- * @uses apply_filters()
3316
- *
3317
- * @param string $field_id ID that's passed to the filter.
3318
- *
3319
- * @return array
3320
- *
3321
- * @access public
3322
- * @since 2.4.0
3323
- */
3324
- function ot_social_links_settings( $field_id ) {
3325
-
3326
- /* translators: %s: the http protocol */
3327
- $string = esc_html__( 'Enter a link to the profile or page on the social website. Remember to add the %s part to the front of the link.', 'option-tree' );
3328
- $settings = apply_filters(
3329
- 'ot_social_links_settings',
3330
- array(
3331
- array(
3332
- 'id' => 'name',
3333
- 'label' => esc_html__( 'Name', 'option-tree' ),
3334
- 'desc' => esc_html__( 'Enter the name of the social website.', 'option-tree' ),
3335
- 'std' => '',
3336
- 'type' => 'text',
3337
- 'class' => 'option-tree-setting-title',
3338
- ),
3339
- array(
3340
- 'id' => 'title',
3341
- 'label' => 'Title',
3342
- 'desc' => esc_html__( 'Enter the text shown in the title attribute of the link.', 'option-tree' ),
3343
- 'type' => 'text',
3344
- ),
3345
- array(
3346
- 'id' => 'href',
3347
- 'label' => 'Link',
3348
- 'desc' => sprintf( $string, '<code>http:// or https://</code>' ),
3349
- 'type' => 'text',
3350
- ),
3351
- ),
3352
- $field_id
3353
- );
3354
-
3355
- return $settings;
3356
- }
3357
- }
3358
-
3359
- if ( ! function_exists( 'ot_insert_css_with_markers' ) ) {
3360
-
3361
- /**
3362
- * Inserts CSS with field_id markers.
3363
- *
3364
- * Inserts CSS into a dynamic.css file, placing it between
3365
- * BEGIN and END field_id markers. Replaces existing marked info,
3366
- * but still retains surrounding data.
3367
- *
3368
- * @param string $field_id The CSS option field ID.
3369
- * @param string $insertion The current option_tree array.
3370
- * @param bool $meta Whether or not the value is stored in meta.
3371
- * @return bool True on write success, false on failure.
3372
- *
3373
- * @access public
3374
- * @since 1.1.8
3375
- * @updated 2.5.3
3376
- */
3377
- function ot_insert_css_with_markers( $field_id = '', $insertion = '', $meta = false ) {
3378
-
3379
- // Missing $field_id or $insertion exit early.
3380
- if ( '' === $field_id || '' === $insertion ) {
3381
- return;
3382
- }
3383
-
3384
- // Path to the dynamic.css file.
3385
- $filepath = get_stylesheet_directory() . '/dynamic.css';
3386
- if ( is_multisite() ) {
3387
- $multisite_filepath = get_stylesheet_directory() . '/dynamic-' . get_current_blog_id() . '.css';
3388
- if ( file_exists( $multisite_filepath ) ) {
3389
- $filepath = $multisite_filepath;
3390
- }
3391
- }
3392
-
3393
- // Allow filter on path.
3394
- $filepath = apply_filters( 'css_option_file_path', $filepath, $field_id );
3395
-
3396
- // Grab a copy of the paths array.
3397
- $ot_css_file_paths = get_option( 'ot_css_file_paths', array() );
3398
- if ( is_multisite() ) {
3399
- $ot_css_file_paths = get_blog_option( get_current_blog_id(), 'ot_css_file_paths', $ot_css_file_paths );
3400
- }
3401
-
3402
- // Set the path for this field.
3403
- $ot_css_file_paths[ $field_id ] = $filepath;
3404
-
3405
- /* update the paths */
3406
- if ( is_multisite() ) {
3407
- update_blog_option( get_current_blog_id(), 'ot_css_file_paths', $ot_css_file_paths );
3408
- } else {
3409
- update_option( 'ot_css_file_paths', $ot_css_file_paths );
3410
- }
3411
-
3412
- // Remove CSS from file, but ensure the file is actually CSS first.
3413
- $file_parts = explode( '.', basename( $filepath ) );
3414
- $file_ext = end( $file_parts );
3415
- if ( is_writeable( $filepath ) && 'css' === $file_ext ) {
3416
-
3417
- $insertion = ot_normalize_css( $insertion );
3418
- $regex = '/{{([a-zA-Z0-9\_\-\#\|\=]+)}}/';
3419
- $marker = $field_id;
3420
-
3421
- // Match custom CSS.
3422
- preg_match_all( $regex, $insertion, $matches );
3423
-
3424
- // Loop through CSS.
3425
- foreach ( $matches[0] as $option ) {
3426
-
3427
- $value = '';
3428
- $option_array = explode( '|', str_replace( array( '{{', '}}' ), '', $option ) );
3429
- $option_id = isset( $option_array[0] ) ? $option_array[0] : '';
3430
- $option_key = isset( $option_array[1] ) ? $option_array[1] : '';
3431
- $option_type = ot_get_option_type_by_id( $option_id );
3432
- $fallback = '';
3433
-
3434
- // Get the meta array value.
3435
- if ( $meta ) {
3436
- global $post;
3437
-
3438
- $value = get_post_meta( $post->ID, $option_id, true );
3439
-
3440
- // Get the options array value.
3441
- } else {
3442
- $options = get_option( ot_options_id() );
3443
-
3444
- if ( isset( $options[ $option_id ] ) ) {
3445
- $value = $options[ $option_id ];
3446
- }
3447
- }
3448
-
3449
- // This in an array of values.
3450
- if ( is_array( $value ) ) {
3451
-
3452
- if ( empty( $option_key ) ) {
3453
-
3454
- // Measurement.
3455
- if ( 'measurement' === $option_type ) {
3456
- $unit = ! empty( $value[1] ) ? $value[1] : 'px';
3457
-
3458
- // Set $value with measurement properties.
3459
- if ( isset( $value[0] ) && strlen( $value[0] ) > 0 ) {
3460
- $value = $value[0] . $unit;
3461
- }
3462
-
3463
- // Border.
3464
- } elseif ( 'border' === $option_type ) {
3465
- $border = array();
3466
-
3467
- $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3468
-
3469
- if ( isset( $value['width'] ) && strlen( $value['width'] ) > 0 ) {
3470
- $border[] = $value['width'] . $unit;
3471
- }
3472
-
3473
- if ( ! empty( $value['style'] ) ) {
3474
- $border[] = $value['style'];
3475
- }
3476
-
3477
- if ( ! empty( $value['color'] ) ) {
3478
- $border[] = $value['color'];
3479
- }
3480
-
3481
- // Set $value with border properties or empty string.
3482
- $value = ! empty( $border ) ? implode( ' ', $border ) : '';
3483
-
3484
- // Box Shadow.
3485
- } elseif ( 'box-shadow' === $option_type ) {
3486
-
3487
- $value_safe = array();
3488
- foreach ( $value as $val ) {
3489
- if ( ! empty( $val ) ) {
3490
- $value_safe[] = $val;
3491
- }
3492
- }
3493
- // Set $value with box-shadow properties or empty string.
3494
- $value = ! empty( $value_safe ) ? implode( ' ', $value_safe ) : '';
3495
-
3496
- // Dimension.
3497
- } elseif ( 'dimension' === $option_type ) {
3498
- $dimension = array();
3499
-
3500
- $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3501
-
3502
- if ( isset( $value['width'] ) && strlen( $value['width'] ) > 0 ) {
3503
- $dimension[] = $value['width'] . $unit;
3504
- }
3505
-
3506
- if ( isset( $value['height'] ) && strlen( $value['height'] ) > 0 ) {
3507
- $dimension[] = $value['height'] . $unit;
3508
- }
3509
-
3510
- // Set $value with dimension properties or empty string.
3511
- $value = ! empty( $dimension ) ? implode( ' ', $dimension ) : '';
3512
-
3513
- // Spacing.
3514
- } elseif ( 'spacing' === $option_type ) {
3515
- $spacing = array();
3516
-
3517
- $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3518
-
3519
- if ( isset( $value['top'] ) && strlen( $value['top'] ) > 0 ) {
3520
- $spacing[] = $value['top'] . $unit;
3521
- }
3522
-
3523
- if ( isset( $value['right'] ) && strlen( $value['right'] ) > 0 ) {
3524
- $spacing[] = $value['right'] . $unit;
3525
- }
3526
-
3527
- if ( isset( $value['bottom'] ) && strlen( $value['bottom'] ) > 0 ) {
3528
- $spacing[] = $value['bottom'] . $unit;
3529
- }
3530
-
3531
- if ( isset( $value['left'] ) && strlen( $value['left'] ) > 0 ) {
3532
- $spacing[] = $value['left'] . $unit;
3533
- }
3534
-
3535
- // Set $value with spacing properties or empty string.
3536
- $value = ! empty( $spacing ) ? implode( ' ', $spacing ) : '';
3537
-
3538
- // Typography.
3539
- } elseif ( 'typography' === $option_type ) {
3540
- $font = array();
3541
-
3542
- if ( ! empty( $value['font-color'] ) ) {
3543
- $font[] = 'color: ' . $value['font-color'] . ';';
3544
- }
3545
-
3546
- if ( ! empty( $value['font-family'] ) ) {
3547
- foreach ( ot_recognized_font_families( $marker ) as $key => $v ) {
3548
- if ( $key === $value['font-family'] ) {
3549
- $font[] = 'font-family: ' . $v . ';';
3550
- }
3551
- }
3552
- }
3553
-
3554
- if ( ! empty( $value['font-size'] ) ) {
3555
- $font[] = 'font-size: ' . $value['font-size'] . ';';
3556
- }
3557
-
3558
- if ( ! empty( $value['font-style'] ) ) {
3559
- $font[] = 'font-style: ' . $value['font-style'] . ';';
3560
- }
3561
-
3562
- if ( ! empty( $value['font-variant'] ) ) {
3563
- $font[] = 'font-variant: ' . $value['font-variant'] . ';';
3564
- }
3565
-
3566
- if ( ! empty( $value['font-weight'] ) ) {
3567
- $font[] = 'font-weight: ' . $value['font-weight'] . ';';
3568
- }
3569
-
3570
- if ( ! empty( $value['letter-spacing'] ) ) {
3571
- $font[] = 'letter-spacing: ' . $value['letter-spacing'] . ';';
3572
- }
3573
-
3574
- if ( ! empty( $value['line-height'] ) ) {
3575
- $font[] = 'line-height: ' . $value['line-height'] . ';';
3576
- }
3577
-
3578
- if ( ! empty( $value['text-decoration'] ) ) {
3579
- $font[] = 'text-decoration: ' . $value['text-decoration'] . ';';
3580
- }
3581
-
3582
- if ( ! empty( $value['text-transform'] ) ) {
3583
- $font[] = 'text-transform: ' . $value['text-transform'] . ';';
3584
- }
3585
-
3586
- // Set $value with font properties or empty string.
3587
- $value = ! empty( $font ) ? implode( "\n", $font ) : '';
3588
-
3589
- // Background.
3590
- } elseif ( 'background' === $option_type ) {
3591
- $bg = array();
3592
-
3593
- if ( ! empty( $value['background-color'] ) ) {
3594
- $bg[] = $value['background-color'];
3595
- }
3596
-
3597
- if ( ! empty( $value['background-image'] ) ) {
3598
-
3599
- // If an attachment ID is stored here fetch its URL and replace the value.
3600
- if ( wp_attachment_is_image( $value['background-image'] ) ) {
3601
-
3602
- $attachment_data = wp_get_attachment_image_src( $value['background-image'], 'original' );
3603
-
3604
- // Check for attachment data.
3605
- if ( $attachment_data ) {
3606
- $value['background-image'] = $attachment_data[0];
3607
- }
3608
- }
3609
-
3610
- $bg[] = 'url("' . $value['background-image'] . '")';
3611
- }
3612
-
3613
- if ( ! empty( $value['background-repeat'] ) ) {
3614
- $bg[] = $value['background-repeat'];
3615
- }
3616
-
3617
- if ( ! empty( $value['background-attachment'] ) ) {
3618
- $bg[] = $value['background-attachment'];
3619
- }
3620
-
3621
- if ( ! empty( $value['background-position'] ) ) {
3622
- $bg[] = $value['background-position'];
3623
- }
3624
-
3625
- if ( ! empty( $value['background-size'] ) ) {
3626
- $size = $value['background-size'];
3627
- }
3628
-
3629
- // Set $value with background properties or empty string.
3630
- $value = ! empty( $bg ) ? 'background: ' . implode( ' ', $bg ) . ';' : '';
3631
-
3632
- if ( isset( $size ) ) {
3633
- if ( ! empty( $bg ) ) {
3634
- $value .= apply_filters( 'ot_insert_css_with_markers_bg_size_white_space', "\n\x20\x20", $option_id );
3635
- }
3636
- $value .= "background-size: $size;";
3637
- }
3638
- }
3639
- } elseif ( ! empty( $value[ $option_key ] ) ) {
3640
- $value = $value[ $option_key ];
3641
- }
3642
- }
3643
-
3644
- // If an attachment ID is stored here fetch its URL and replace the value.
3645
- if ( 'upload' === $option_type && wp_attachment_is_image( $value ) ) {
3646
-
3647
- $attachment_data = wp_get_attachment_image_src( $value, 'original' );
3648
-
3649
- // Check for attachment data.
3650
- if ( $attachment_data ) {
3651
- $value = $attachment_data[0];
3652
- }
3653
- }
3654
-
3655
- // Attempt to fallback when `$value` is empty.
3656
- if ( empty( $value ) ) {
3657
-
3658
- // We're trying to access a single array key.
3659
- if ( ! empty( $option_key ) ) {
3660
-
3661
- // Link Color `inherit`.
3662
- if ( 'link-color' === $option_type ) {
3663
- $fallback = 'inherit';
3664
- }
3665
- } else {
3666
-
3667
- // Border.
3668
- if ( 'border' === $option_type ) {
3669
- $fallback = 'inherit';
3670
- }
3671
-
3672
- // Box Shadow.
3673
- if ( 'box-shadow' === $option_type ) {
3674
- $fallback = 'none';
3675
- }
3676
-
3677
- // Colorpicker.
3678
- if ( 'colorpicker' === $option_type ) {
3679
- $fallback = 'inherit';
3680
- }
3681
-
3682
- // Colorpicker Opacity.
3683
- if ( 'colorpicker-opacity' === $option_type ) {
3684
- $fallback = 'inherit';
3685
- }
3686
- }
3687
-
3688
- /**
3689
- * Filter the `dynamic.css` fallback value.
3690
- *
3691
- * @since 2.5.3
3692
- *
3693
- * @param string $fallback The default CSS fallback value.
3694
- * @param string $option_id The option ID.
3695
- * @param string $option_type The option type.
3696
- * @param string $option_key The option array key.
3697
- */
3698
- $fallback = apply_filters( 'ot_insert_css_with_markers_fallback', $fallback, $option_id, $option_type, $option_key );
3699
- }
3700
-
3701
- // Let's fallback!
3702
- if ( ! empty( $fallback ) ) {
3703
- $value = $fallback;
3704
- }
3705
-
3706
- // Filter the CSS.
3707
- $value = apply_filters( 'ot_insert_css_with_markers_value', $value, $option_id );
3708
-
3709
- // Insert CSS, even if the value is empty.
3710
- $insertion = stripslashes( str_replace( $option, $value, $insertion ) );
3711
- }
3712
-
3713
- // Can't write to the file so we error out.
3714
- if ( ! is_writable( $filepath ) ) {
3715
- /* translators: %s: file path */
3716
- $string = esc_html__( 'Unable to write to file %s.', 'option-tree' );
3717
- add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3718
- return false;
3719
- }
3720
-
3721
- // Open file.
3722
- $f = @fopen( $filepath, 'w' ); // phpcs:ignore
3723
-
3724
- // Can't write to the file return false.
3725
- if ( ! $f ) {
3726
- /* translators: %s: file path */
3727
- $string = esc_html__( 'Unable to open the %s file in write mode.', 'option-tree' );
3728
- add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3729
- return false;
3730
- }
3731
-
3732
- // Create array from the lines of code.
3733
- $markerdata = explode( "\n", implode( '', file( $filepath ) ) );
3734
-
3735
- $searching = true;
3736
- $foundit = false;
3737
-
3738
- // Has array of lines.
3739
- if ( ! empty( $markerdata ) ) {
3740
-
3741
- // Foreach line of code.
3742
- foreach ( $markerdata as $n => $markerline ) {
3743
-
3744
- // Found begining of marker, set $searching to false.
3745
- if ( "/* BEGIN {$marker} */" === $markerline ) {
3746
- $searching = false;
3747
- }
3748
-
3749
- // Keep searching each line of CSS.
3750
- if ( true === $searching ) {
3751
- if ( $n + 1 < count( $markerdata ) ) {
3752
- fwrite( $f, "{$markerline}\n" ); // phpcs:ignore
3753
- } else {
3754
- fwrite( $f, "{$markerline}" ); // phpcs:ignore
3755
- }
3756
- }
3757
-
3758
- // Found end marker write code.
3759
- if ( "/* END {$marker} */" === $markerline ) {
3760
- fwrite( $f, "/* BEGIN {$marker} */\n" ); // phpcs:ignore
3761
- fwrite( $f, "{$insertion}\n" ); // phpcs:ignore
3762
- fwrite( $f, "/* END {$marker} */\n" ); // phpcs:ignore
3763
- $searching = true;
3764
- $foundit = true;
3765
- }
3766
- }
3767
- }
3768
-
3769
- // Nothing inserted, write code. DO IT, DO IT!
3770
- if ( ! $foundit ) {
3771
- fwrite( $f, "/* BEGIN {$marker} */\n" ); // phpcs:ignore
3772
- fwrite( $f, "{$insertion}\n" ); // phpcs:ignore
3773
- fwrite( $f, "/* END {$marker} */\n" ); // phpcs:ignore
3774
- }
3775
-
3776
- // Close file.
3777
- fclose( $f ); // phpcs:ignore
3778
- return true;
3779
- }
3780
-
3781
- return false;
3782
- }
3783
- }
3784
-
3785
- if ( ! function_exists( 'ot_remove_old_css' ) ) {
3786
-
3787
- /**
3788
- * Remove old CSS.
3789
- *
3790
- * Removes CSS when the textarea is empty, but still retains surrounding styles.
3791
- *
3792
- * @param string $field_id The CSS option field ID.
3793
- * @return bool True on write success, false on failure.
3794
- *
3795
- * @access public
3796
- * @since 2.0
3797
- */
3798
- function ot_remove_old_css( $field_id = '' ) {
3799
-
3800
- // Missing $field_id string.
3801
- if ( '' === $field_id ) {
3802
- return false;
3803
- }
3804
-
3805
- // Path to the dynamic.css file.
3806
- $filepath = get_stylesheet_directory() . '/dynamic.css';
3807
-
3808
- // Allow filter on path.
3809
- $filepath = apply_filters( 'css_option_file_path', $filepath, $field_id );
3810
-
3811
- // Remove CSS from file, but ensure the file is actually CSS first.
3812
- if ( is_writeable( $filepath ) && 'css' === end( explode( '.', basename( $filepath ) ) ) ) {
3813
-
3814
- // Open the file.
3815
- $f = @fopen( $filepath, 'w' ); // phpcs:ignore
3816
-
3817
- // Can't write to the file return false.
3818
- if ( ! $f ) {
3819
- /* translators: %s: file path */
3820
- $string = esc_html__( 'Unable to open the %s file in write mode.', 'option-tree' );
3821
- add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3822
- return false;
3823
- }
3824
-
3825
- // Get each line in the file.
3826
- $markerdata = explode( "\n", implode( '', file( $filepath ) ) );
3827
-
3828
- $searching = true;
3829
-
3830
- // Has array of lines.
3831
- if ( ! empty( $markerdata ) ) {
3832
-
3833
- // Foreach line of code.
3834
- foreach ( $markerdata as $n => $markerline ) {
3835
-
3836
- // Found beginning of marker, set $searching to false.
3837
- if ( "/* BEGIN {$field_id} */" === $markerline ) {
3838
- $searching = false;
3839
- }
3840
-
3841
- // Searching is true, keep writing each line of CSS.
3842
- if ( true === $searching ) {
3843
- if ( $n + 1 < count( $markerdata ) ) {
3844
- fwrite( $f, "{$markerline}\n" ); // phpcs:ignore
3845
- } else {
3846
- fwrite( $f, "{$markerline}" ); // phpcs:ignore
3847
- }
3848
- }
3849
-
3850
- // Found end marker delete old CSS.
3851
- if ( "/* END {$field_id} */" === $markerline ) {
3852
- fwrite( $f, '' ); // phpcs:ignore
3853
- $searching = true;
3854
- }
3855
- }
3856
- }
3857
-
3858
- // Close file.
3859
- fclose( $f ); // phpcs:ignore
3860
- return true;
3861
- }
3862
-
3863
- return false;
3864
- }
3865
- }
3866
-
3867
- if ( ! function_exists( 'ot_normalize_css' ) ) {
3868
-
3869
- /**
3870
- * Normalize CSS
3871
- *
3872
- * Normalize & Convert all line-endings to UNIX format.
3873
- *
3874
- * @param string $css The CSS styles.
3875
- *
3876
- * @return string
3877
- *
3878
- * @access public
3879
- * @since 1.1.8
3880
- * @updated 2.0
3881
- */
3882
- function ot_normalize_css( $css ) {
3883
-
3884
- // Normalize & Convert.
3885
- $css = str_replace( "\r\n", "\n", $css );
3886
- $css = str_replace( "\r", "\n", $css );
3887
-
3888
- // Don't allow out-of-control blank lines .
3889
- $css = preg_replace( "/\n{2,}/", "\n\n", $css );
3890
-
3891
- return $css;
3892
- }
3893
- }
3894
-
3895
- if ( ! function_exists( 'ot_loop_through_option_types' ) ) {
3896
-
3897
- /**
3898
- * Helper function to loop over the option types.
3899
- *
3900
- * @param string $type The current option type.
3901
- * @param bool $child Whether of not there are children elements.
3902
- *
3903
- * @return string
3904
- *
3905
- * @access public
3906
- * @since 2.0
3907
- */
3908
- function ot_loop_through_option_types( $type = '', $child = false ) {
3909
-
3910
- $content = '';
3911
- $types = ot_option_types_array();
3912
-
3913
- if ( $child ) {
3914
- unset( $types['list-item'] );
3915
- }
3916
-
3917
- foreach ( $types as $key => $value ) {
3918
- $content .= '<option value="' . esc_attr( $key ) . '" ' . selected( $type, $key, false ) . '>' . esc_html( $value ) . '</option>';
3919
- }
3920
-
3921
- return $content;
3922
-
3923
- }
3924
- }
3925
-
3926
- if ( ! function_exists( 'ot_loop_through_choices' ) ) {
3927
-
3928
- /**
3929
- * Helper function to loop over choices.
3930
- *
3931
- * @param string $name The form element name.
3932
- * @param array $choices The array of choices.
3933
- *
3934
- * @return string
3935
- *
3936
- * @access public
3937
- * @since 2.0
3938
- */
3939
- function ot_loop_through_choices( $name, $choices = array() ) {
3940
-
3941
- $content = '';
3942
-
3943
- foreach ( (array) $choices as $key => $choice ) {
3944
- if ( is_array( $choice ) ) {
3945
- $content .= '<li class="ui-state-default list-choice">' . ot_choices_view( $name, $key, $choice ) . '</li>';
3946
- }
3947
- }
3948
-
3949
- return $content;
3950
- }
3951
- }
3952
-
3953
- if ( ! function_exists( 'ot_loop_through_sub_settings' ) ) {
3954
-
3955
- /**
3956
- * Helper function to loop over sub settings.
3957
- *
3958
- * @param string $name The form element name.
3959
- * @param array $settings The array of settings.
3960
- *
3961
- * @return string
3962
- *
3963
- * @access public
3964
- * @since 2.0
3965
- */
3966
- function ot_loop_through_sub_settings( $name, $settings = array() ) {
3967
-
3968
- $content = '';
3969
-
3970
- foreach ( $settings as $key => $setting ) {
3971
- if ( is_array( $setting ) ) {
3972
- $content .= '<li class="ui-state-default list-sub-setting">' . ot_settings_view( $name, $key, $setting ) . '</li>';
3973
- }
3974
- }
3975
-
3976
- return $content;
3977
- }
3978
- }
3979
-
3980
- if ( ! function_exists( 'ot_sections_view' ) ) {
3981
-
3982
- /**
3983
- * Helper function to display sections.
3984
- *
3985
- * This function is used in AJAX to add a new section
3986
- * and when section have already been added and saved.
3987
- *
3988
- * @param string $name The form element name.
3989
- * @param int $key The array key for the current element.
3990
- * @param array $section An array of values for the current section.
3991
- *
3992
- * @return string
3993
- *
3994
- * @access public
3995
- * @since 2.0
3996
- */
3997
- function ot_sections_view( $name, $key, $section = array() ) {
3998
-
3999
- /* translators: %s: Section Title emphasized */
4000
- $str_title = esc_html__( '%s: Displayed as a menu item on the Theme Options page.', 'option-tree' );
4001
-
4002
- /* translators: %s: Section ID emphasized */
4003
- $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4004
-
4005
- return '
4006
- <div class="option-tree-setting is-section">
4007
- <div class="open">' . ( isset( $section['title'] ) ? esc_attr( $section['title'] ) : 'Section ' . ( absint( $key ) + 1 ) ) . '</div>
4008
- <div class="button-section">
4009
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'edit', 'option-tree' ) . '">
4010
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4011
- </a>
4012
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4013
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4014
- </a>
4015
- </div>
4016
- <div class="option-tree-setting-body">
4017
- <div class="format-settings">
4018
- <div class="format-setting type-text">
4019
- <div class="description">' . sprintf( $str_title, '<strong>' . esc_html__( 'Section Title', 'option-tree' ) . '</strong>', 'option-tree' ) . '</div>
4020
- <div class="format-setting-inner">
4021
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][title]" value="' . ( isset( $section['title'] ) ? esc_attr( $section['title'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title section-title" autocomplete="off" />
4022
- </div>
4023
- </div>
4024
- </div>
4025
- <div class="format-settings">
4026
- <div class="format-setting type-text">
4027
- <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'Section ID', 'option-tree' ) . '</strong>', 'option-tree' ) . '</div>
4028
- <div class="format-setting-inner">
4029
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $section['id'] ) ? esc_attr( $section['id'] ) : '' ) . '" class="widefat option-tree-ui-input section-id" autocomplete="off" />
4030
- </div>
4031
- </div>
4032
- </div>
4033
- </div>
4034
- </div>';
4035
- }
4036
- }
4037
-
4038
- if ( ! function_exists( 'ot_settings_view' ) ) {
4039
-
4040
- /**
4041
- * Helper function to display settings.
4042
- *
4043
- * This function is used in AJAX to add a new setting
4044
- * and when settings have already been added and saved.
4045
- *
4046
- * @param string $name The form element name.
4047
- * @param int $key The array key for the current element.
4048
- * @param array $setting An array of values for the current setting.
4049
- *
4050
- * @return string
4051
- *
4052
- * @access public
4053
- * @since 2.0
4054
- */
4055
- function ot_settings_view( $name, $key, $setting = array() ) {
4056
-
4057
- $child = ( false !== strpos( $name, '][settings]' ) ) ? true : false;
4058
- $type = isset( $setting['type'] ) ? $setting['type'] : '';
4059
- $std = isset( $setting['std'] ) ? $setting['std'] : '';
4060
- $operator = isset( $setting['operator'] ) ? esc_attr( $setting['operator'] ) : 'and';
4061
-
4062
- // Serialize the standard value just in case.
4063
- if ( is_array( $std ) ) {
4064
- $std = maybe_serialize( $std );
4065
- }
4066
-
4067
- if ( in_array( $type, array( 'css', 'javascript', 'textarea', 'textarea-simple' ), true ) ) {
4068
- $std_form_element = '<textarea class="textarea" rows="10" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][std]">' . esc_html( $std ) . '</textarea>';
4069
- } else {
4070
- $std_form_element = '<input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][std]" value="' . esc_attr( $std ) . '" class="widefat option-tree-ui-input" autocomplete="off" />';
4071
- }
4072
-
4073
- /* translators: %s: Label emphasized */
4074
- $str_label = esc_html__( '%s: Displayed as the label of a form element on the Theme Options page.', 'option-tree' );
4075
-
4076
- /* translators: %s: ID emphasized */
4077
- $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4078
-
4079
- /* translators: %s: Type emphasized */
4080
- $str_type = esc_html__( '%s: Choose one of the available option types from the dropdown.', 'option-tree' );
4081
-
4082
- /* translators: %s: Description emphasized */
4083
- $str_desc = esc_html__( '%s: Enter a detailed description for the users to read on the Theme Options page, HTML is allowed. This is also where you enter content for both the Textblock & Textblock Titled option types.', 'option-tree' );
4084
-
4085
- /* translators: %s: Choices emphasized */
4086
- $str_choices = esc_html__( '%s: This will only affect the following option types: Checkbox, Radio, Select & Select Image.', 'option-tree' );
4087
-
4088
- /* translators: %s: Settings emphasized */
4089
- $str_settings = esc_html__( '%s: This will only affect the List Item option type.', 'option-tree' );
4090
-
4091
- /* translators: %1$s: Standard emphasized, %2$s: visual path to documentation */
4092
- $str_standard = esc_html__( '%1$s: Setting the standard value for your option only works for some option types. Read the %2$s for more information on which ones.', 'option-tree' );
4093
-
4094
- /* translators: %s: Rows emphasized */
4095
- $str_rows = esc_html__( '%s: Enter a numeric value for the number of rows in your textarea. This will only affect the following option types: CSS, Textarea, & Textarea Simple.', 'option-tree' );
4096
-
4097
- /* translators: %s: Post Type emphasized */
4098
- $str_post_type = esc_html__( '%s: Add a comma separated list of post type like \'post,page\'. This will only affect the following option types: Custom Post Type Checkbox, & Custom Post Type Select.', 'option-tree' );
4099
-
4100
- /* translators: %s: Taxonomy emphasized */
4101
- $str_taxonomy = esc_html__( '%s: Add a comma separated list of any registered taxonomy like \'category,post_tag\'. This will only affect the following option types: Taxonomy Checkbox, & Taxonomy Select.', 'option-tree' );
4102
-
4103
- /* translators: %1$s: Min, Max, & Step emphasized, %2$s: format, %3$s: range, %4$s: minimum interval */
4104
- $str_min_max_step = esc_html__( '%1$s: Add a comma separated list of options in the following format %2$s (slide from %3$s in intervals of %4$s). The three values represent the minimum, maximum, and step options and will only affect the Numeric Slider option type.', 'option-tree' );
4105
-
4106
- /* translators: %s: CSS Class emphasized */
4107
- $str_css_class = esc_html__( '%s: Add and optional class to this option type.', 'option-tree' );
4108
-
4109
- /* translators: %1$s: Condition emphasized, %2$s: example value, %3$s: list of valid conditions */
4110
- $str_condition = esc_html__( '%1$s: Add a comma separated list (no spaces) of conditions in which the field will be visible, leave this setting empty to always show the field. In these examples, %2$s is a placeholder for your condition, which can be in the form of %3$s.', 'option-tree' );
4111
-
4112
- /* translators: %s: Operator emphasized */
4113
- $str_operator = esc_html__( '%s: Choose the logical operator to compute the result of the conditions.', 'option-tree' );
4114
-
4115
- return '
4116
- <div class="option-tree-setting">
4117
- <div class="open">' . ( isset( $setting['label'] ) ? esc_attr( $setting['label'] ) : 'Setting ' . ( absint( $key ) + 1 ) ) . '</div>
4118
- <div class="button-section">
4119
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4120
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4121
- </a>
4122
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4123
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4124
- </a>
4125
- </div>
4126
- <div class="option-tree-setting-body">
4127
- <div class="format-settings">
4128
- <div class="format-setting type-text wide-desc">
4129
- <div class="description">' . sprintf( $str_label, '<strong>' . esc_html__( 'Label', 'option-tree' ) . '</strong>' ) . '</div>
4130
- <div class="format-setting-inner">
4131
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][label]" value="' . ( isset( $setting['label'] ) ? esc_attr( $setting['label'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4132
- </div>
4133
- </div>
4134
- </div>
4135
- <div class="format-settings">
4136
- <div class="format-setting type-text wide-desc">
4137
- <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'ID', 'option-tree' ) . '</strong>' ) . '</div>
4138
- <div class="format-setting-inner">
4139
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $setting['id'] ) ? esc_attr( $setting['id'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4140
- </div>
4141
- </div>
4142
- </div>
4143
- <div class="format-settings">
4144
- <div class="format-setting type-select wide-desc">
4145
- <div class="description">' . sprintf( $str_type, '<strong>' . esc_html__( 'Type', 'option-tree' ) . '</strong>' ) . '</div>
4146
- <div class="format-setting-inner">
4147
- <select name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][type]" value="' . esc_attr( $type ) . '" class="option-tree-ui-select">
4148
- ' . ot_loop_through_option_types( $type, $child ) . '
4149
- </select>
4150
- </div>
4151
- </div>
4152
- </div>
4153
- <div class="format-settings">
4154
- <div class="format-setting type-textarea wide-desc">
4155
- <div class="description">' . sprintf( $str_desc, '<strong>' . esc_html__( 'Description', 'option-tree' ) . '</strong>' ) . '</div>
4156
- <div class="format-setting-inner">
4157
- <textarea class="textarea" rows="10" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][desc]">' . ( isset( $setting['desc'] ) ? esc_html( $setting['desc'] ) : '' ) . '</textarea>
4158
- </div>
4159
- </div>
4160
- </div>
4161
- <div class="format-settings">
4162
- <div class="format-setting type-textblock wide-desc">
4163
- <div class="description">' . sprintf( $str_choices, '<strong>' . esc_html__( 'Choices', 'option-tree' ) . '</strong>' ) . '</div>
4164
- <div class="format-setting-inner">
4165
- <ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . ']">
4166
- ' . ( isset( $setting['choices'] ) ? ot_loop_through_choices( $name . '[' . $key . ']', $setting['choices'] ) : '' ) . '
4167
- </ul>
4168
- <a href="javascript:void(0);" class="option-tree-choice-add option-tree-ui-button button hug-left">' . esc_html__( 'Add Choice', 'option-tree' ) . '</a>
4169
- </div>
4170
- </div>
4171
- </div>
4172
- <div class="format-settings">
4173
- <div class="format-setting type-textblock wide-desc">
4174
- <div class="description">' . sprintf( $str_settings, '<strong>' . esc_html__( 'Settings', 'option-tree' ) . '</strong>' ) . '</div>
4175
- <div class="format-setting-inner">
4176
- <ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . ']">
4177
- ' . ( isset( $setting['settings'] ) ? ot_loop_through_sub_settings( $name . '[' . $key . '][settings]', $setting['settings'] ) : '' ) . '
4178
- </ul>
4179
- <a href="javascript:void(0);" class="option-tree-list-item-setting-add option-tree-ui-button button hug-left">' . esc_html__( 'Add Setting', 'option-tree' ) . '</a>
4180
- </div>
4181
- </div>
4182
- </div>
4183
- <div class="format-settings">
4184
- <div class="format-setting type-text wide-desc">
4185
- <div class="description">' . sprintf( $str_standard, '<strong>' . esc_html__( 'Standard', 'option-tree' ) . '</strong>', '<code>' . esc_html__( 'OptionTree->Documentation', 'option-tree' ) . '</code>' ) . '</div>
4186
- <div class="format-setting-inner">
4187
- ' . $std_form_element . '
4188
- </div>
4189
- </div>
4190
- </div>
4191
- <div class="format-settings">
4192
- <div class="format-setting type-text wide-desc">
4193
- <div class="description">' . sprintf( $str_rows, '<strong>' . esc_html__( 'Rows', 'option-tree' ) . '</strong>' ) . '</div>
4194
- <div class="format-setting-inner">
4195
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][rows]" value="' . ( isset( $setting['rows'] ) ? esc_attr( $setting['rows'] ) : '' ) . '" class="widefat option-tree-ui-input" />
4196
- </div>
4197
- </div>
4198
- </div>
4199
- <div class="format-settings">
4200
- <div class="format-setting type-text wide-desc">
4201
- <div class="description">' . sprintf( $str_post_type, '<strong>' . esc_html__( 'Post Type', 'option-tree' ) . '</strong>' ) . '</div>
4202
- <div class="format-setting-inner">
4203
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][post_type]" value="' . ( isset( $setting['post_type'] ) ? esc_attr( $setting['post_type'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4204
- </div>
4205
- </div>
4206
- </div>
4207
- <div class="format-settings">
4208
- <div class="format-setting type-text wide-desc">
4209
- <div class="description">' . sprintf( $str_taxonomy, '<strong>' . esc_html__( 'Taxonomy', 'option-tree' ) . '</strong>' ) . '</div>
4210
- <div class="format-setting-inner">
4211
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][taxonomy]" value="' . ( isset( $setting['taxonomy'] ) ? esc_attr( $setting['taxonomy'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4212
- </div>
4213
- </div>
4214
- </div>
4215
- <div class="format-settings">
4216
- <div class="format-setting type-text wide-desc">
4217
- <div class="description">' . sprintf( $str_min_max_step, '<strong>' . esc_html__( 'Min, Max, & Step', 'option-tree' ) . '</strong>', '<code>0,100,1</code>', '<code>0-100</code>', '<code>1</code>' ) . '</div>
4218
- <div class="format-setting-inner">
4219
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][min_max_step]" value="' . ( isset( $setting['min_max_step'] ) ? esc_attr( $setting['min_max_step'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4220
- </div>
4221
- </div>
4222
- </div>
4223
- <div class="format-settings">
4224
- <div class="format-setting type-text wide-desc">
4225
- <div class="description">' . sprintf( $str_css_class, '<strong>' . esc_html__( 'CSS Class', 'option-tree' ) . '</strong>' ) . '</div>
4226
- <div class="format-setting-inner">
4227
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][class]" value="' . ( isset( $setting['class'] ) ? esc_attr( $setting['class'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4228
- </div>
4229
- </div>
4230
- </div>
4231
- <div class="format-settings">
4232
- <div class="format-setting type-text wide-desc">
4233
- <div class="description">' . sprintf( $str_condition, '<strong>' . esc_html__( 'Condition', 'option-tree' ) . '</strong>', '<code>value</code>', '<code>field_id:is(value)</code>, <code>field_id:not(value)</code>, <code>field_id:contains(value)</code>, <code>field_id:less_than(value)</code>, <code>field_id:less_than_or_equal_to(value)</code>, <code>field_id:greater_than(value)</code>, or <code>field_id:greater_than_or_equal_to(value)</code>' ) . '</div>
4234
- <div class="format-setting-inner">
4235
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][condition]" value="' . ( isset( $setting['condition'] ) ? esc_attr( $setting['condition'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4236
- </div>
4237
- </div>
4238
- </div>
4239
- <div class="format-settings">
4240
- <div class="format-setting type-select wide-desc">
4241
- <div class="description">' . sprintf( $str_operator, '<strong>' . esc_html__( 'Operator', 'option-tree' ) . '</strong>' ) . '</div>
4242
- <div class="format-setting-inner">
4243
- <select name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][operator]" value="' . esc_attr( $operator ) . '" class="option-tree-ui-select">
4244
- <option value="and" ' . selected( $operator, 'and', false ) . '>' . esc_html__( 'and', 'option-tree' ) . '</option>
4245
- <option value="or" ' . selected( $operator, 'or', false ) . '>' . esc_html__( 'or', 'option-tree' ) . '</option>
4246
- </select>
4247
- </div>
4248
- </div>
4249
- </div>
4250
- </div>
4251
- </div>
4252
- ' . ( ! $child ? '<input type="hidden" class="hidden-section" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][section]" value="' . ( isset( $setting['section'] ) ? esc_attr( $setting['section'] ) : '' ) . '" />' : '' );
4253
- }
4254
- }
4255
-
4256
- if ( ! function_exists( 'ot_choices_view' ) ) {
4257
-
4258
- /**
4259
- * Helper function to display setting choices.
4260
- *
4261
- * This function is used in AJAX to add a new choice
4262
- * and when choices have already been added and saved.
4263
- *
4264
- * @param string $name The form element name.
4265
- * @param int $key The array key for the current element.
4266
- * @param array $choice An array of values for the current choice.
4267
- *
4268
- * @return string
4269
- *
4270
- * @access public
4271
- * @since 2.0
4272
- */
4273
- function ot_choices_view( $name, $key, $choice = array() ) {
4274
-
4275
- return '
4276
- <div class="option-tree-setting">
4277
- <div class="open">' . ( isset( $choice['label'] ) ? esc_attr( $choice['label'] ) : 'Choice ' . ( absint( $key ) + 1 ) ) . '</div>
4278
- <div class="button-section">
4279
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4280
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4281
- </a>
4282
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4283
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4284
- </a>
4285
- </div>
4286
- <div class="option-tree-setting-body">
4287
- <div class="format-settings">
4288
- <div class="format-setting-label">
4289
- <h5>' . esc_html__( 'Label', 'option-tree' ) . '</h5>
4290
- </div>
4291
- <div class="format-setting type-text wide-desc">
4292
- <div class="format-setting-inner">
4293
- <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][label]" value="' . ( isset( $choice['label'] ) ? esc_attr( $choice['label'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4294
- </div>
4295
- </div>
4296
- </div>
4297
- <div class="format-settings">
4298
- <div class="format-setting-label">
4299
- <h5>' . esc_html__( 'Value', 'option-tree' ) . '</h5>
4300
- </div>
4301
- <div class="format-setting type-text wide-desc">
4302
- <div class="format-setting-inner">
4303
- <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][value]" value="' . ( isset( $choice['value'] ) ? esc_attr( $choice['value'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4304
- </div>
4305
- </div>
4306
- </div>
4307
- <div class="format-settings">
4308
- <div class="format-setting-label">
4309
- <h5>' . esc_html__( 'Image Source (Radio Image only)', 'option-tree' ) . '</h5>
4310
- </div>
4311
- <div class="format-setting type-text wide-desc">
4312
- <div class="format-setting-inner">
4313
- <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][src]" value="' . ( isset( $choice['src'] ) ? esc_attr( $choice['src'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4314
- </div>
4315
- </div>
4316
- </div>
4317
- </div>
4318
- </div>';
4319
-
4320
- }
4321
- }
4322
-
4323
- if ( ! function_exists( 'ot_contextual_help_view' ) ) {
4324
-
4325
- /**
4326
- * Helper function to display sections.
4327
- *
4328
- * This function is used in AJAX to add a new section
4329
- * and when section have already been added and saved.
4330
- *
4331
- * @param string $name The name/ID of the help page.
4332
- * @param int $key The array key for the current element.
4333
- * @param array $content An array of values for the current section.
4334
- *
4335
- * @return string
4336
- *
4337
- * @access public
4338
- * @since 2.0
4339
- */
4340
- function ot_contextual_help_view( $name, $key, $content = array() ) {
4341
-
4342
- /* translators: %s: Title emphasized */
4343
- $str_title = esc_html__( '%s: Displayed as a contextual help menu item on the Theme Options page.', 'option-tree' );
4344
-
4345
- /* translators: %s: ID emphasized */
4346
- $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4347
-
4348
- /* translators: %s: Content emphasized */
4349
- $str_content = esc_html__( '%s: Enter the HTML content about this contextual help item displayed on the Theme Option page for end users to read.', 'option-tree' );
4350
-
4351
- return '
4352
- <div class="option-tree-setting">
4353
- <div class="open">' . ( isset( $content['title'] ) ? esc_attr( $content['title'] ) : 'Content ' . ( absint( $key ) + 1 ) ) . '</div>
4354
- <div class="button-section">
4355
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4356
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4357
- </a>
4358
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4359
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4360
- </a>
4361
- </div>
4362
- <div class="option-tree-setting-body">
4363
- <div class="format-settings">
4364
- <div class="format-setting type-text no-desc">
4365
- <div class="description">' . sprintf( $str_title, '<strong>' . esc_html__( 'Title', 'option-tree' ) . '</strong>' ) . '</div>
4366
- <div class="format-setting-inner">
4367
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][title]" value="' . ( isset( $content['title'] ) ? esc_attr( $content['title'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4368
- </div>
4369
- </div>
4370
- </div>
4371
- <div class="format-settings">
4372
- <div class="format-setting type-text no-desc">
4373
- <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'ID', 'option-tree' ) . '</strong>' ) . '</div>
4374
- <div class="format-setting-inner">
4375
- <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $content['id'] ) ? esc_attr( $content['id'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4376
- </div>
4377
- </div>
4378
- </div>
4379
- <div class="format-settings">
4380
- <div class="format-setting type-textarea no-desc">
4381
- <div class="description">' . sprintf( $str_content, '<strong>' . esc_html__( 'Content', 'option-tree' ) . '</strong>' ) . '</div>
4382
- <div class="format-setting-inner">
4383
- <textarea class="textarea" rows="15" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][content]">' . ( isset( $content['content'] ) ? esc_textarea( $content['content'] ) : '' ) . '</textarea>
4384
- </div>
4385
- </div>
4386
- </div>
4387
- </div>
4388
- </div>';
4389
-
4390
- }
4391
- }
4392
-
4393
- if ( ! function_exists( 'ot_layout_view' ) ) {
4394
-
4395
- /**
4396
- * Helper function to display sections.
4397
- *
4398
- * @param string $key Layout ID.
4399
- * @param string $data Layout encoded value.
4400
- * @param string $active_layout Active layout ID.
4401
- *
4402
- * @return string
4403
- *
4404
- * @access public
4405
- * @since 2.0
4406
- */
4407
- function ot_layout_view( $key, $data = '', $active_layout = '' ) {
4408
-
4409
- return '
4410
- <div class="option-tree-setting">
4411
- <div class="open">' . ( isset( $key ) ? esc_attr( $key ) : esc_html__( 'Layout', 'option-tree' ) ) . '</div>
4412
- <div class="button-section">
4413
- <a href="javascript:void(0);" class="option-tree-layout-activate option-tree-ui-button button left-item' . ( $active_layout === $key ? ' active' : '' ) . '" title="' . esc_html__( 'Activate', 'option-tree' ) . '">
4414
- <span class="icon ot-icon-square-o"></span>' . esc_html__( 'Activate', 'option-tree' ) . '
4415
- </a>
4416
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4417
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4418
- </a>
4419
- </div>
4420
- <input type="hidden" name="' . esc_attr( ot_layouts_id() ) . '[' . esc_attr( $key ) . ']" value="' . esc_attr( $data ) . '" />
4421
- </div>';
4422
- }
4423
- }
4424
-
4425
- if ( ! function_exists( 'ot_list_item_view' ) ) {
4426
-
4427
- /**
4428
- * Helper function to display list items.
4429
- *
4430
- * This function is used in AJAX to add a new list items
4431
- * and when they have already been added and saved.
4432
- *
4433
- * @param string $name The form field name.
4434
- * @param int $key The array key for the current element.
4435
- * @param array $list_item An array of values for the current list item.
4436
- * @param int $post_id The post ID.
4437
- * @param string $get_option The option page ID.
4438
- * @param array $settings The settings.
4439
- * @param string $type The list type.
4440
- *
4441
- * @access public
4442
- * @since 2.0
4443
- */
4444
- function ot_list_item_view( $name, $key, $list_item = array(), $post_id = 0, $get_option = '', $settings = array(), $type = '' ) {
4445
-
4446
- // Required title setting.
4447
- $required_setting = array(
4448
- array(
4449
- 'id' => 'title',
4450
- 'label' => __( 'Title', 'option-tree' ),
4451
- 'desc' => '',
4452
- 'std' => '',
4453
- 'type' => 'text',
4454
- 'rows' => '',
4455
- 'class' => 'option-tree-setting-title',
4456
- 'post_type' => '',
4457
- 'choices' => array(),
4458
- ),
4459
- );
4460
-
4461
- // Load the old filterable slider settings.
4462
- if ( 'slider' === $type ) {
4463
- $settings = ot_slider_settings( $name );
4464
- }
4465
-
4466
- // If no settings array load the filterable list item settings.
4467
- if ( empty( $settings ) ) {
4468
- $settings = ot_list_item_settings( $name );
4469
- }
4470
-
4471
- // Merge the two settings array.
4472
- $settings = array_merge( $required_setting, $settings );
4473
-
4474
- echo '
4475
- <div class="option-tree-setting">
4476
- <div class="open">' . ( isset( $list_item['title'] ) ? esc_attr( $list_item['title'] ) : '' ) . '</div>
4477
- <div class="button-section">
4478
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4479
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4480
- </a>
4481
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4482
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4483
- </a>
4484
- </div>
4485
- <div class="option-tree-setting-body">
4486
- ';
4487
-
4488
- foreach ( $settings as $field ) {
4489
-
4490
- // Set field value.
4491
- $field_value = isset( $list_item[ $field['id'] ] ) ? $list_item[ $field['id'] ] : '';
4492
-
4493
- // Set default to standard value.
4494
- if ( isset( $field['std'] ) ) {
4495
- $field_value = ot_filter_std_value( $field_value, $field['std'] );
4496
- }
4497
-
4498
- // filter the title label and description.
4499
- if ( 'title' === $field['id'] ) {
4500
-
4501
- // filter the label.
4502
- $field['label'] = apply_filters( 'ot_list_item_title_label', $field['label'], $name );
4503
-
4504
- // filter the description.
4505
- $field['desc'] = apply_filters( 'ot_list_item_title_desc', $field['desc'], $name );
4506
- }
4507
-
4508
- // Make life easier.
4509
- $_field_name = $get_option ? $get_option . '[' . $name . ']' : $name;
4510
-
4511
- // Build the arguments array.
4512
- $_args = array(
4513
- 'type' => $field['type'],
4514
- 'field_id' => $name . '_' . $field['id'] . '_' . $key,
4515
- 'field_name' => $_field_name . '[' . $key . '][' . $field['id'] . ']',
4516
- 'field_value' => $field_value,
4517
- 'field_desc' => isset( $field['desc'] ) ? $field['desc'] : '',
4518
- 'field_std' => isset( $field['std'] ) ? $field['std'] : '',
4519
- 'field_rows' => isset( $field['rows'] ) ? $field['rows'] : 10,
4520
- 'field_post_type' => isset( $field['post_type'] ) && ! empty( $field['post_type'] ) ? $field['post_type'] : 'post',
4521
- 'field_taxonomy' => isset( $field['taxonomy'] ) && ! empty( $field['taxonomy'] ) ? $field['taxonomy'] : 'category',
4522
- 'field_min_max_step' => isset( $field['min_max_step'] ) && ! empty( $field['min_max_step'] ) ? $field['min_max_step'] : '0,100,1',
4523
- 'field_class' => isset( $field['class'] ) ? $field['class'] : '',
4524
- 'field_condition' => isset( $field['condition'] ) ? $field['condition'] : '',
4525
- 'field_operator' => isset( $field['operator'] ) ? $field['operator'] : 'and',
4526
- 'field_choices' => isset( $field['choices'] ) && ! empty( $field['choices'] ) ? $field['choices'] : array(),
4527
- 'field_settings' => isset( $field['settings'] ) && ! empty( $field['settings'] ) ? $field['settings'] : array(),
4528
- 'post_id' => $post_id,
4529
- 'get_option' => $get_option,
4530
- );
4531
-
4532
- $conditions = '';
4533
-
4534
- // Setup the conditions.
4535
- if ( isset( $field['condition'] ) && ! empty( $field['condition'] ) ) {
4536
-
4537
- /* doing magic on the conditions so they work in a list item */
4538
- $conditionals = explode( ',', $field['condition'] );
4539
- foreach ( $conditionals as $condition ) {
4540
- $parts = explode( ':', $condition );
4541
- if ( isset( $parts[0] ) ) {
4542
- $field['condition'] = str_replace( $condition, $name . '_' . $parts[0] . '_' . $key . ':' . $parts[1], $field['condition'] );
4543
- }
4544
- }
4545
-
4546
- $conditions = ' data-condition="' . esc_attr( $field['condition'] ) . '"';
4547
- $conditions .= isset( $field['operator'] ) && in_array( $field['operator'], array( 'and', 'AND', 'or', 'OR' ), true ) ? ' data-operator="' . esc_attr( $field['operator'] ) . '"' : '';
4548
- }
4549
-
4550
- // Build the setting CSS class.
4551
- if ( ! empty( $_args['field_class'] ) ) {
4552
- $classes = explode( ' ', $_args['field_class'] );
4553
-
4554
- foreach ( $classes as $_key => $value ) {
4555
- $classes[ $_key ] = $value . '-wrap';
4556
- }
4557
-
4558
- $class = 'format-settings ' . implode( ' ', $classes );
4559
- } else {
4560
- $class = 'format-settings';
4561
- }
4562
-
4563
- // Option label.
4564
- echo '<div id="setting_' . esc_attr( $_args['field_id'] ) . '" class="' . esc_attr( $class ) . '"' . $conditions . '>'; // phpcs:ignore
4565
-
4566
- // Don't show title with textblocks.
4567
- if ( 'textblock' !== $_args['type'] && ! empty( $field['label'] ) ) {
4568
- echo '<div class="format-setting-label">';
4569
- echo '<h3 class="label">' . esc_attr( $field['label'] ) . '</h3>';
4570
- echo '</div>';
4571
- }
4572
-
4573
- // Only allow simple textarea inside a list-item due to known DOM issues with wp_editor().
4574
- if ( false === apply_filters( 'ot_override_forced_textarea_simple', false, $field['id'] ) && 'textarea' === $_args['type'] ) {
4575
- $_args['type'] = 'textarea-simple';
4576
- }
4577
-
4578
- // Option body, list-item is not allowed inside another list-item.
4579
- if ( 'list-item' !== $_args['type'] && 'slider' !== $_args['type'] ) {
4580
- echo ot_display_by_type( $_args ); // phpcs:ignore
4581
- }
4582
-
4583
- echo '</div>';
4584
- }
4585
-
4586
- echo '</div>';
4587
-
4588
- echo '</div>';
4589
- }
4590
- }
4591
-
4592
- if ( ! function_exists( 'ot_social_links_view' ) ) {
4593
-
4594
- /**
4595
- * Helper function to display social links.
4596
- *
4597
- * This function is used in AJAX to add a new list items
4598
- * and when they have already been added and saved.
4599
- *
4600
- * @param string $name The form field name.
4601
- * @param int $key The array key for the current element.
4602
- * @param array $list_item An array of values for the current list item.
4603
- * @param int $post_id The post ID.
4604
- * @param string $get_option The option page ID.
4605
- * @param array $settings The settings.
4606
- *
4607
- * @access public
4608
- * @since 2.4.0
4609
- */
4610
- function ot_social_links_view( $name, $key, $list_item = array(), $post_id = 0, $get_option = '', $settings = array() ) {
4611
-
4612
- // If no settings array load the filterable social links settings.
4613
- if ( empty( $settings ) ) {
4614
- $settings = ot_social_links_settings( $name );
4615
- }
4616
-
4617
- echo '
4618
- <div class="option-tree-setting">
4619
- <div class="open">' . ( isset( $list_item['name'] ) ? esc_attr( $list_item['name'] ) : '' ) . '</div>
4620
- <div class="button-section">
4621
- <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4622
- <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4623
- </a>
4624
- <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4625
- <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4626
- </a>
4627
- </div>
4628
- <div class="option-tree-setting-body">
4629
- ';
4630
-
4631
- foreach ( $settings as $field ) {
4632
-
4633
- // Set field value.
4634
- $field_value = isset( $list_item[ $field['id'] ] ) ? $list_item[ $field['id'] ] : '';
4635
-
4636
- // Set default to standard value.
4637
- if ( isset( $field['std'] ) ) {
4638
- $field_value = ot_filter_std_value( $field_value, $field['std'] );
4639
- }
4640
-
4641
- // Make life easier.
4642
- $_field_name = $get_option ? $get_option . '[' . $name . ']' : $name;
4643
-
4644
- // Build the arguments array.
4645
- $_args = array(
4646
- 'type' => $field['type'],
4647
- 'field_id' => $name . '_' . $field['id'] . '_' . $key,
4648
- 'field_name' => $_field_name . '[' . $key . '][' . $field['id'] . ']',
4649
- 'field_value' => $field_value,
4650
- 'field_desc' => isset( $field['desc'] ) ? $field['desc'] : '',
4651
- 'field_std' => isset( $field['std'] ) ? $field['std'] : '',
4652
- 'field_rows' => isset( $field['rows'] ) ? $field['rows'] : 10,
4653
- 'field_post_type' => isset( $field['post_type'] ) && ! empty( $field['post_type'] ) ? $field['post_type'] : 'post',
4654
- 'field_taxonomy' => isset( $field['taxonomy'] ) && ! empty( $field['taxonomy'] ) ? $field['taxonomy'] : 'category',
4655
- 'field_min_max_step' => isset( $field['min_max_step'] ) && ! empty( $field['min_max_step'] ) ? $field['min_max_step'] : '0,100,1',
4656
- 'field_class' => isset( $field['class'] ) ? $field['class'] : '',
4657
- 'field_condition' => isset( $field['condition'] ) ? $field['condition'] : '',
4658
- 'field_operator' => isset( $field['operator'] ) ? $field['operator'] : 'and',
4659
- 'field_choices' => isset( $field['choices'] ) && ! empty( $field['choices'] ) ? $field['choices'] : array(),
4660
- 'field_settings' => isset( $field['settings'] ) && ! empty( $field['settings'] ) ? $field['settings'] : array(),
4661
- 'post_id' => $post_id,
4662
- 'get_option' => $get_option,
4663
- );
4664
-
4665
- $conditions = '';
4666
-
4667
- // Setup the conditions.
4668
- if ( isset( $field['condition'] ) && ! empty( $field['condition'] ) ) {
4669
-
4670
- // Doing magic on the conditions so they work in a list item.
4671
- $conditionals = explode( ',', $field['condition'] );
4672
- foreach ( $conditionals as $condition ) {
4673
- $parts = explode( ':', $condition );
4674
- if ( isset( $parts[0] ) ) {
4675
- $field['condition'] = str_replace( $condition, $name . '_' . $parts[0] . '_' . $key . ':' . $parts[1], $field['condition'] );
4676
- }
4677
- }
4678
-
4679
- $conditions = ' data-condition="' . esc_attr( $field['condition'] ) . '"';
4680
- $conditions .= isset( $field['operator'] ) && in_array( $field['operator'], array( 'and', 'AND', 'or', 'OR' ), true ) ? ' data-operator="' . esc_attr( $field['operator'] ) . '"' : '';
4681
- }
4682
-
4683
- // Option label.
4684
- echo '<div id="setting_' . esc_attr( $_args['field_id'] ) . '" class="format-settings"' . $conditions . '>'; // phpcs:ignore
4685
-
4686
- // Don't show title with textblocks.
4687
- if ( 'textblock' !== $_args['type'] && ! empty( $field['label'] ) ) {
4688
- echo '<div class="format-setting-label">';
4689
- echo '<h3 class="label">' . esc_attr( $field['label'] ) . '</h3>';
4690
- echo '</div>';
4691
- }
4692
-
4693
- // Only allow simple textarea inside a list-item due to known DOM issues with wp_editor().
4694
- if ( 'textarea' === $_args['type'] ) {
4695
- $_args['type'] = 'textarea-simple';
4696
- }
4697
-
4698
- // Option body, list-item is not allowed inside another list-item.
4699
- if ( 'list-item' !== $_args['type'] && 'slider' !== $_args['type'] && 'social-links' !== $_args['type'] ) {
4700
- echo ot_display_by_type( $_args ); // phpcs:ignore
4701
- }
4702
-
4703
- echo '</div>';
4704
- }
4705
-
4706
- echo '</div>';
4707
-
4708
- echo '</div>';
4709
- }
4710
- }
4711
-
4712
- if ( ! function_exists( 'ot_theme_options_layouts_form' ) ) {
4713
-
4714
- /**
4715
- * Helper function to display Theme Options layouts form.
4716
- *
4717
- * @access public
4718
- * @since 2.0
4719
- */
4720
- function ot_theme_options_layouts_form() {
4721
-
4722
- echo '<form method="post" id="option-tree-options-layouts-form">';
4723
-
4724
- // Form nonce.
4725
- wp_nonce_field( 'option_tree_modify_layouts_form', 'option_tree_modify_layouts_nonce' );
4726
-
4727
- // Get the saved layouts.
4728
- $layouts = get_option( ot_layouts_id() );
4729
-
4730
- // Set active layout.
4731
- $active_layout = isset( $layouts['active_layout'] ) ? $layouts['active_layout'] : '';
4732
-
4733
- if ( is_array( $layouts ) && 1 < count( $layouts ) ) {
4734
-
4735
- $active_layout = $layouts['active_layout'];
4736
-
4737
- echo '<input type="hidden" id="the_current_layout" value="' . esc_attr( $active_layout ) . '" />';
4738
-
4739
- echo '<div class="option-tree-active-layout">';
4740
-
4741
- echo '<select name="' . esc_attr( ot_layouts_id() ) . '[active_layout]" class="option-tree-ui-select">';
4742
-
4743
- $hidden = '';
4744
-
4745
- foreach ( $layouts as $key => $data ) {
4746
-
4747
- if ( 'active_layout' === $key ) {
4748
- continue;
4749
- }
4750
-
4751
- echo '<option ' . selected( $key, $active_layout, false ) . ' value="' . esc_attr( $key ) . '">' . esc_attr( $key ) . '</option>';
4752
- $hidden_safe .= '<input type="hidden" name="' . esc_attr( ot_layouts_id() ) . '[' . esc_attr( $key ) . ']" value="' . esc_attr( isset( $data ) ? $data : '' ) . '" />';
4753
- }
4754
-
4755
- echo '</select>';
4756
-
4757
- echo '</div>';
4758
-
4759
- echo $hidden_safe; // phpcs:ignore
4760
- }
4761
-
4762
- /* new layout wrapper */
4763
- echo '<div class="option-tree-save-layout' . ( ! empty( $active_layout ) ? ' active-layout' : '' ) . '">';
4764
-
4765
- /* add new layout */
4766
- echo '<input type="text" name="' . esc_attr( ot_layouts_id() ) . '[_add_new_layout_]" value="" class="widefat option-tree-ui-input" autocomplete="off" />';
4767
-
4768
- echo '<button type="submit" class="option-tree-ui-button button button-primary save-layout" title="' . esc_html__( 'New Layout', 'option-tree' ) . '">' . esc_html__( 'New Layout', 'option-tree' ) . '</button>';
4769
-
4770
- echo '</div>';
4771
-
4772
- echo '</form>';
4773
- }
4774
- }
4775
-
4776
- if ( ! function_exists( 'ot_sanitize_option_id' ) ) {
4777
-
4778
- /**
4779
- * Helper function to sanitize the option ID's.
4780
- *
4781
- * @param string $input The string to sanitize.
4782
- * @return string
4783
- *
4784
- * @access public
4785
- * @since 2.0
4786
- */
4787
- function ot_sanitize_option_id( $input ) {
4788
- return preg_replace( '/[^a-z0-9]/', '_', trim( strtolower( $input ) ) );
4789
- }
4790
- }
4791
-
4792
- if ( ! function_exists( 'ot_sanitize_layout_id' ) ) {
4793
-
4794
- /**
4795
- * Helper function to sanitize the layout ID's.
4796
- *
4797
- * @param string $input The string to sanitize.
4798
- * @return string
4799
- *
4800
- * @access public
4801
- * @since 2.0
4802
- */
4803
- function ot_sanitize_layout_id( $input ) {
4804
- return preg_replace( '/[^a-z0-9]/', '-', trim( strtolower( $input ) ) );
4805
- }
4806
- }
4807
-
4808
- if ( ! function_exists( 'ot_convert_array_to_string' ) ) {
4809
-
4810
- /**
4811
- * Convert choices array to string.
4812
- *
4813
- * @param array $input The array to convert to a string.
4814
- *
4815
- * @return bool|string
4816
- *
4817
- * @access public
4818
- * @since 2.0
4819
- */
4820
- function ot_convert_array_to_string( $input ) {
4821
-
4822
- if ( is_array( $input ) ) {
4823
-
4824
- foreach ( $input as $k => $choice ) {
4825
- $choices[ $k ] = $choice['value'] . '|' . $choice['label'];
4826
-
4827
- if ( isset( $choice['src'] ) ) {
4828
- $choices[ $k ] .= '|' . $choice['src'];
4829
- }
4830
- }
4831
-
4832
- return implode( ',', $choices );
4833
- }
4834
-
4835
- return false;
4836
- }
4837
- }
4838
-
4839
- if ( ! function_exists( 'ot_convert_string_to_array' ) ) {
4840
-
4841
- /**
4842
- * Convert choices string to array.
4843
- *
4844
- * @param string $input The string to convert to an array.
4845
- *
4846
- * @return bool|array
4847
- *
4848
- * @access public
4849
- * @since 2.0
4850
- */
4851
- function ot_convert_string_to_array( $input ) {
4852
-
4853
- if ( '' !== $input ) {
4854
-
4855
- // Empty choices array.
4856
- $choices = array();
4857
-
4858
- // Exlode the string into an array.
4859
- foreach ( explode( ',', $input ) as $k => $choice ) {
4860
-
4861
- // If ":" is splitting the string go deeper.
4862
- if ( preg_match( '/\|/', $choice ) ) {
4863
- $split = explode( '|', $choice );
4864
-
4865
- if ( 2 > count( $split ) ) {
4866
- continue;
4867
- }
4868
-
4869
- $choices[ $k ]['value'] = trim( $split[0] );
4870
- $choices[ $k ]['label'] = trim( $split[1] );
4871
-
4872
- // If radio image there are three values.
4873
- if ( isset( $split[2] ) ) {
4874
- $choices[ $k ]['src'] = trim( $split[2] );
4875
- }
4876
- } else {
4877
- $choices[ $k ]['value'] = trim( $choice );
4878
- $choices[ $k ]['label'] = trim( $choice );
4879
- }
4880
- }
4881
-
4882
- // Return a formatted choices array.
4883
- return $choices;
4884
- }
4885
-
4886
- return false;
4887
- }
4888
- }
4889
-
4890
- if ( ! function_exists( 'ot_strpos_array' ) ) {
4891
-
4892
- /**
4893
- * Helper function - strpos() in array recursively.
4894
- *
4895
- * @param string $haystack The string to search in.
4896
- * @param array $needles Keys to search for.
4897
- * @return bool
4898
- *
4899
- * @access public
4900
- * @since 2.0
4901
- */
4902
- function ot_strpos_array( $haystack, $needles = array() ) {
4903
-
4904
- foreach ( $needles as $needle ) {
4905
- if ( false !== strpos( $haystack, $needle ) ) {
4906
- return true;
4907
- }
4908
- }
4909
-
4910
- return false;
4911
- }
4912
- }
4913
-
4914
- if ( ! function_exists( 'ot_array_keys_exists' ) ) {
4915
-
4916
- /**
4917
- * Helper function - array_key_exists() recursively.
4918
- *
4919
- * @param array $haystack The array to search in.
4920
- * @param array $needles Keys to search for.
4921
- * @return bool
4922
- *
4923
- * @access public
4924
- * @since 2.0
4925
- */
4926
- function ot_array_keys_exists( $haystack, $needles = array() ) {
4927
-
4928
- foreach ( $needles as $k ) {
4929
- if ( isset( $haystack[ $k ] ) ) {
4930
- return true;
4931
- }
4932
- }
4933
-
4934
- return false;
4935
- }
4936
- }
4937
-
4938
- if ( ! function_exists( 'ot_stripslashes' ) ) {
4939
-
4940
- /**
4941
- * Custom stripslashes from single value or array.
4942
- *
4943
- * @param mixed $input The string or array to stripslashes from.
4944
- * @return mixed
4945
- *
4946
- * @access public
4947
- * @since 2.0
4948
- */
4949
- function ot_stripslashes( $input ) {
4950
-
4951
- if ( is_array( $input ) ) {
4952
-
4953
- foreach ( $input as &$val ) {
4954
-
4955
- if ( is_array( $val ) ) {
4956
- $val = ot_stripslashes( $val );
4957
- } else {
4958
- $val = stripslashes( trim( $val ) );
4959
- }
4960
- }
4961
- } else {
4962
- $input = stripslashes( trim( $input ) );
4963
- }
4964
-
4965
- return $input;
4966
- }
4967
- }
4968
-
4969
- if ( ! function_exists( 'ot_reverse_wpautop' ) ) {
4970
-
4971
- /**
4972
- * Reverse wpautop.
4973
- *
4974
- * @param string $string The string to be filtered.
4975
- * @return string
4976
- *
4977
- * @access public
4978
- * @since 2.0.9
4979
- */
4980
- function ot_reverse_wpautop( $string = '' ) {
4981
-
4982
- // Return if string is empty.
4983
- if ( '' === trim( $string ) ) {
4984
- return '';
4985
- }
4986
-
4987
- // Remove all new lines & <p> tags.
4988
- $string = str_replace( array( "\n", '<p>' ), '', $string );
4989
-
4990
- // Replace <br /> with \r.
4991
- $string = str_replace( array( '<br />', '<br>', '<br/>' ), "\r", $string );
4992
-
4993
- // Replace </p> with \r\n.
4994
- $string = str_replace( '</p>', "\r\n", $string );
4995
-
4996
- // Return clean string.
4997
- return trim( $string );
4998
- }
4999
- }
5000
-
5001
- if ( ! function_exists( 'ot_range' ) ) {
5002
-
5003
- /**
5004
- * Returns an array of elements from start to limit, inclusive.
5005
- *
5006
- * Occasionally zero will be some impossibly large number to
5007
- * the "E" power when creating a range from negative to positive.
5008
- * This function attempts to fix that by setting that number back to "0".
5009
- *
5010
- * @param string $start First value of the sequence.
5011
- * @param string $limit The sequence is ended upon reaching the limit value.
5012
- * @param int $step If a step value is given, it will be used as the increment
5013
- * between elements in the sequence. step should be given as a
5014
- * positive number. If not specified, step will default to 1.
5015
- *
5016
- * @return array
5017
- *
5018
- * @access public
5019
- * @since 2.0.12
5020
- */
5021
- function ot_range( $start, $limit, $step = 1 ) {
5022
-
5023
- if ( $step < 0 ) {
5024
- $step = 1;
5025
- }
5026
-
5027
- $range = range( $start, $limit, $step );
5028
-
5029
- foreach ( $range as $k => $v ) {
5030
- if ( strpos( $v, 'E' ) ) {
5031
- $range[ $k ] = 0;
5032
- }
5033
- }
5034
-
5035
- return $range;
5036
- }
5037
- }
5038
-
5039
- if ( ! function_exists( 'ot_encode' ) ) {
5040
-
5041
- /**
5042
- * Helper function to return encoded strings.
5043
- *
5044
- * @param array $value The array to encode.
5045
- *
5046
- * @return string|bool
5047
- *
5048
- * @access public
5049
- * @since 2.0.13
5050
- * @updated 2.7.0
5051
- */
5052
- function ot_encode( $value ) {
5053
- if ( is_array( $value ) ) {
5054
- return base64_encode( maybe_serialize( $value ) ); // phpcs:ignore
5055
- }
5056
-
5057
- return false;
5058
- }
5059
- }
5060
-
5061
- if ( ! function_exists( 'ot_decode' ) ) {
5062
-
5063
- /**
5064
- * Helper function to return decoded arrays.
5065
- *
5066
- * @param string $value Encoded serialized array.
5067
- *
5068
- * @return array
5069
- *
5070
- * @access public
5071
- * @since 2.0.13
5072
- */
5073
- function ot_decode( $value ) {
5074
-
5075
- $fallback = array();
5076
- $decoded = base64_decode( $value ); // phpcs:ignore
5077
-
5078
- // Search for an array.
5079
- preg_match( '/a:\d+:{.*?}/', $decoded, $array_matches, PREG_OFFSET_CAPTURE, 0 );
5080
-
5081
- // Search for an object.
5082
- preg_match( '/O|C:\+?\d+:"[a-z0-9_]+”:\+?\d+:/i', $decoded, $obj_matches, PREG_OFFSET_CAPTURE, 0 );
5083
-
5084
- // Prevent object injection or non arrays.
5085
- if ( $obj_matches || ! $array_matches ) {
5086
- return $fallback;
5087
- }
5088
-
5089
- // Convert the options to an array.
5090
- $decoded = maybe_unserialize( $decoded );
5091
-
5092
- if ( is_array( $decoded ) ) {
5093
- return $decoded;
5094
- }
5095
-
5096
- return $fallback;
5097
- }
5098
- }
5099
-
5100
- if ( ! function_exists( 'ot_filter_std_value' ) ) {
5101
-
5102
- /**
5103
- * Helper function to filter standard option values.
5104
- *
5105
- * @param mixed $value Saved string or array value.
5106
- * @param mixed $std Standard string or array value.
5107
- *
5108
- * @return mixed String or array.
5109
- *
5110
- * @access public
5111
- * @since 2.0.15
5112
- */
5113
- function ot_filter_std_value( $value = '', $std = '' ) {
5114
-
5115
- if ( is_string( $std ) && ! empty( $std ) ) {
5116
-
5117
- // Search for an array.
5118
- preg_match( '/a:\d+:{.*?}/', $std, $array_matches, PREG_OFFSET_CAPTURE, 0 );
5119
-
5120
- // Search for an object.
5121
- preg_match( '/O:\d+:"[a-z0-9_]+":\d+:{.*?}/i', $std, $obj_matches, PREG_OFFSET_CAPTURE, 0 );
5122
-
5123
- // Prevent object injection.
5124
- if ( $array_matches && ! $obj_matches ) {
5125
- $std = maybe_unserialize( $std );
5126
- } elseif ( $obj_matches ) {
5127
- $std = '';
5128
- }
5129
- }
5130
-
5131
- if ( is_array( $value ) && is_array( $std ) ) {
5132
- foreach ( $value as $k => $v ) {
5133
- if ( '' === $value[ $k ] && isset( $std[ $k ] ) ) {
5134
- $value[ $k ] = $std[ $k ];
5135
- }
5136
- }
5137
- } elseif ( '' === $value && ! empty( $std ) ) {
5138
- $value = $std;
5139
- }
5140
-
5141
- return $value;
5142
- }
5143
- }
5144
-
5145
- if ( ! function_exists( 'ot_set_google_fonts' ) ) {
5146
-
5147
- /**
5148
- * Helper function to set the Google fonts array.
5149
- *
5150
- * @param string $id The option ID.
5151
- * @param bool $value The option value.
5152
- *
5153
- * @access public
5154
- * @since 2.5.0
5155
- */
5156
- function ot_set_google_fonts( $id = '', $value = '' ) {
5157
-
5158
- $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
5159
-
5160
- if ( is_array( $value ) && ! empty( $value ) ) {
5161
- $ot_set_google_fonts[ $id ] = $value;
5162
- } elseif ( isset( $ot_set_google_fonts[ $id ] ) ) {
5163
- unset( $ot_set_google_fonts[ $id ] );
5164
- }
5165
-
5166
- set_theme_mod( 'ot_set_google_fonts', $ot_set_google_fonts );
5167
- }
5168
- }
5169
-
5170
- if ( ! function_exists( 'ot_update_google_fonts_after_save' ) ) {
5171
-
5172
- /**
5173
- * Helper function to remove unused options from the Google fonts array.
5174
- *
5175
- * @param array $options The array of saved options.
5176
- *
5177
- * @access public
5178
- * @since 2.5.0
5179
- */
5180
- function ot_update_google_fonts_after_save( $options = array() ) {
5181
-
5182
- $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
5183
-
5184
- foreach ( $ot_set_google_fonts as $key => $set ) {
5185
- if ( ! isset( $options[ $key ] ) ) {
5186
- unset( $ot_set_google_fonts[ $key ] );
5187
- }
5188
- }
5189
- set_theme_mod( 'ot_set_google_fonts', $ot_set_google_fonts );
5190
- }
5191
-
5192
- add_action( 'ot_after_theme_options_save', 'ot_update_google_fonts_after_save', 1 );
5193
- }
5194
-
5195
- if ( ! function_exists( 'ot_fetch_google_fonts' ) ) {
5196
-
5197
- /**
5198
- * Helper function to fetch the Google fonts array.
5199
- *
5200
- * @param bool $normalize Whether or not to return a normalized array. Default 'true'.
5201
- * @param bool $force_rebuild Whether or not to force the array to be rebuilt. Default 'false'.
5202
- *
5203
- * @return array
5204
- *
5205
- * @access public
5206
- * @since 2.5.0
5207
- */
5208
- function ot_fetch_google_fonts( $normalize = true, $force_rebuild = false ) {
5209
-
5210
- // Google Fonts cache key.
5211
- $ot_google_fonts_cache_key = apply_filters( 'ot_google_fonts_cache_key', 'ot_google_fonts_cache' );
5212
-
5213
- // Get the fonts from cache.
5214
- $ot_google_fonts = apply_filters( 'ot_google_fonts_cache', get_transient( $ot_google_fonts_cache_key ) );
5215
-
5216
- if ( $force_rebuild || ! is_array( $ot_google_fonts ) || empty( $ot_google_fonts ) ) {
5217
-
5218
- $ot_google_fonts = array();
5219
-
5220
- // API url and key.
5221
- $ot_google_fonts_api_url = apply_filters( 'ot_google_fonts_api_url', 'https://www.googleapis.com/webfonts/v1/webfonts' );
5222
- $ot_google_fonts_api_key = apply_filters( 'ot_google_fonts_api_key', false );
5223
-
5224
- if ( false === $ot_google_fonts_api_key ) {
5225
- return array();
5226
- }
5227
-
5228
- // API arguments.
5229
- $ot_google_fonts_fields = apply_filters(
5230
- 'ot_google_fonts_fields',
5231
- array(
5232
- 'family',
5233
- 'variants',
5234
- 'subsets',
5235
- )
5236
- );
5237
- $ot_google_fonts_sort = apply_filters( 'ot_google_fonts_sort', 'alpha' );
5238
-
5239
- // Initiate API request.
5240
- $ot_google_fonts_query_args = array(
5241
- 'key' => $ot_google_fonts_api_key,
5242
- 'fields' => 'items(' . implode( ',', $ot_google_fonts_fields ) . ')',
5243
- 'sort' => $ot_google_fonts_sort,
5244
- );
5245
-
5246
- // Build and make the request.
5247
- $ot_google_fonts_query = esc_url_raw( add_query_arg( $ot_google_fonts_query_args, $ot_google_fonts_api_url ) );
5248
- $ot_google_fonts_response = wp_safe_remote_get(
5249
- $ot_google_fonts_query,
5250
- array(
5251
- 'sslverify' => false,
5252
- 'timeout' => 15,
5253
- )
5254
- );
5255
-
5256
- // Continue if we got a valid response.
5257
- if ( 200 === wp_remote_retrieve_response_code( $ot_google_fonts_response ) ) {
5258
-
5259
- $response_body = wp_remote_retrieve_body( $ot_google_fonts_response );
5260
-
5261
- if ( $response_body ) {
5262
-
5263
- // JSON decode the response body and cache the result.
5264
- $ot_google_fonts_data = json_decode( trim( $response_body ), true );
5265
-
5266
- if ( is_array( $ot_google_fonts_data ) && isset( $ot_google_fonts_data['items'] ) ) {
5267
-
5268
- $ot_google_fonts = $ot_google_fonts_data['items'];
5269
-
5270
- // Normalize the array key.
5271
- $ot_google_fonts_tmp = array();
5272
- foreach ( $ot_google_fonts as $key => $value ) {
5273
- if ( ! isset( $value['family'] ) ) {
5274
- continue;
5275
- }
5276
-
5277
- $id = preg_replace( '/[^a-z0-9_\-]/', '', strtolower( remove_accents( $value['family'] ) ) );
5278
-
5279
- if ( $id ) {
5280
- $ot_google_fonts_tmp[ $id ] = $value;
5281
- }
5282
- }
5283
-
5284
- $ot_google_fonts = $ot_google_fonts_tmp;
5285
- set_theme_mod( 'ot_google_fonts', $ot_google_fonts );
5286
- set_transient( $ot_google_fonts_cache_key, $ot_google_fonts, WEEK_IN_SECONDS );
5287
- }
5288
- }
5289
- }
5290
- }
5291
-
5292
- return $normalize ? ot_normalize_google_fonts( $ot_google_fonts ) : $ot_google_fonts;
5293
- }
5294
- }
5295
-
5296
- if ( ! function_exists( 'ot_normalize_google_fonts' ) ) {
5297
-
5298
- /**
5299
- * Helper function to normalize the Google fonts array.
5300
- *
5301
- * @param array $google_fonts An array of fonts to normalize.
5302
- *
5303
- * @return array
5304
- *
5305
- * @access public
5306
- * @since 2.5.0
5307
- */
5308
- function ot_normalize_google_fonts( $google_fonts ) {
5309
-
5310
- $ot_normalized_google_fonts = array();
5311
-
5312
- if ( is_array( $google_fonts ) && ! empty( $google_fonts ) ) {
5313
-
5314
- foreach ( $google_fonts as $google_font ) {
5315
-
5316
- if ( isset( $google_font['family'] ) ) {
5317
-
5318
- $id = str_replace( ' ', '+', $google_font['family'] );
5319
-
5320
- $ot_normalized_google_fonts[ $id ] = array(
5321
- 'family' => $google_font['family'],
5322
- );
5323
-
5324
- if ( isset( $google_font['variants'] ) ) {
5325
- $ot_normalized_google_fonts[ $id ]['variants'] = $google_font['variants'];
5326
- }
5327
-
5328
- if ( isset( $google_font['subsets'] ) ) {
5329
- $ot_normalized_google_fonts[ $id ]['subsets'] = $google_font['subsets'];
5330
- }
5331
- }
5332
- }
5333
- }
5334
-
5335
- return $ot_normalized_google_fonts;
5336
- }
5337
- }
5338
-
5339
- if ( ! function_exists( 'ot_wpml_register_string' ) ) {
5340
-
5341
- /**
5342
- * Helper function to register a WPML string.
5343
- *
5344
- * @param string $id The string ID.
5345
- * @param string $value The string value.
5346
- *
5347
- * @access public
5348
- * @since 2.1
5349
- */
5350
- function ot_wpml_register_string( $id, $value ) {
5351
- if ( function_exists( 'icl_register_string' ) ) {
5352
- icl_register_string( 'Theme Options', $id, $value );
5353
- }
5354
- }
5355
- }
5356
-
5357
- if ( ! function_exists( 'ot_wpml_unregister_string' ) ) {
5358
-
5359
- /**
5360
- * Helper function to unregister a WPML string.
5361
- *
5362
- * @param string $id The string ID.
5363
- *
5364
- * @access public
5365
- * @since 2.1
5366
- */
5367
- function ot_wpml_unregister_string( $id ) {
5368
- if ( function_exists( 'icl_unregister_string' ) ) {
5369
- icl_unregister_string( 'Theme Options', $id );
5370
- }
5371
- }
5372
- }
5373
-
5374
- if ( ! function_exists( 'ot_maybe_migrate_settings' ) ) {
5375
-
5376
- /**
5377
- * Maybe migrate Settings.
5378
- *
5379
- * @access public
5380
- * @since 2.3.3
5381
- */
5382
- function ot_maybe_migrate_settings() {
5383
-
5384
- // Filter the ID to migrate from.
5385
- $settings_id = apply_filters( 'ot_migrate_settings_id', '' );
5386
-
5387
- // Attempt to migrate Settings.
5388
- if ( ! empty( $settings_id ) && false === get_option( ot_settings_id() ) && ot_settings_id() !== $settings_id ) {
5389
-
5390
- // Old settings.
5391
- $settings = get_option( $settings_id );
5392
-
5393
- // Check for array keys.
5394
- if ( isset( $settings['sections'] ) && isset( $settings['settings'] ) ) {
5395
- update_option( ot_settings_id(), $settings );
5396
- }
5397
- }
5398
- }
5399
- }
5400
-
5401
- if ( ! function_exists( 'ot_maybe_migrate_options' ) ) {
5402
-
5403
- /**
5404
- * Maybe migrate Option.
5405
- *
5406
- * @access public
5407
- * @since 2.3.3
5408
- */
5409
- function ot_maybe_migrate_options() {
5410
-
5411
- // Filter the ID to migrate from.
5412
- $options_id = apply_filters( 'ot_migrate_options_id', '' );
5413
-
5414
- // Attempt to migrate Theme Options.
5415
- if ( ! empty( $options_id ) && false === get_option( ot_options_id() ) && ot_options_id() !== $options_id ) {
5416
-
5417
- // Old options.
5418
- $options = get_option( $options_id );
5419
-
5420
- // Migrate to new ID.
5421
- update_option( ot_options_id(), $options );
5422
- }
5423
- }
5424
- }
5425
-
5426
- if ( ! function_exists( 'ot_maybe_migrate_layouts' ) ) {
5427
-
5428
- /**
5429
- * Maybe migrate Layouts.
5430
- *
5431
- * @access public
5432
- * @since 2.3.3
5433
- */
5434
- function ot_maybe_migrate_layouts() {
5435
-
5436
- // Filter the ID to migrate from.
5437
- $layouts_id = apply_filters( 'ot_migrate_layouts_id', '' );
5438
-
5439
- // Attempt to migrate Layouts.
5440
- if ( ! empty( $layouts_id ) && false === get_option( ot_layouts_id() ) && ot_layouts_id() !== $layouts_id ) {
5441
-
5442
- // Old options.
5443
- $layouts = get_option( $layouts_id );
5444
-
5445
- // Migrate to new ID.
5446
- update_option( ot_layouts_id(), $layouts );
5447
- }
5448
- }
5449
- }
5450
-
5451
- if ( ! function_exists( 'ot_meta_box_post_format_gallery' ) ) {
5452
-
5453
- /**
5454
- * Returns an array with the post format gallery meta box.
5455
- *
5456
- * @param mixed $pages Excepts a comma separated string or array of
5457
- * post_types and is what tells the metabox where to
5458
- * display. Default 'post'.
5459
- * @return array
5460
- *
5461
- * @access public
5462
- * @since 2.4.0
5463
- */
5464
- function ot_meta_box_post_format_gallery( $pages = 'post' ) {
5465
-
5466
- if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'gallery', current( get_theme_support( 'post-formats' ) ), true ) ) {
5467
- return false;
5468
- }
5469
-
5470
- if ( is_string( $pages ) ) {
5471
- $pages = explode( ',', $pages );
5472
- }
5473
-
5474
- return apply_filters(
5475
- 'ot_meta_box_post_format_gallery',
5476
- array(
5477
- 'id' => 'ot-post-format-gallery',
5478
- 'title' => esc_html__( 'Gallery', 'option-tree' ),
5479
- 'desc' => '',
5480
- 'pages' => $pages,
5481
- 'context' => 'side',
5482
- 'priority' => 'low',
5483
- 'fields' => array(
5484
- array(
5485
- 'id' => '_format_gallery',
5486
- 'label' => '',
5487
- 'desc' => '',
5488
- 'std' => '',
5489
- 'type' => 'gallery',
5490
- 'class' => 'ot-gallery-shortcode',
5491
- ),
5492
- ),
5493
- ),
5494
- $pages
5495
- );
5496
- }
5497
- }
5498
-
5499
- if ( ! function_exists( 'ot_meta_box_post_format_link' ) ) {
5500
-
5501
- /**
5502
- * Returns an array with the post format link metabox.
5503
- *
5504
- * @param mixed $pages Excepts a comma separated string or array of
5505
- * post_types and is what tells the metabox where to
5506
- * display. Default 'post'.
5507
- * @return array
5508
- *
5509
- * @access public
5510
- * @since 2.4.0
5511
- */
5512
- function ot_meta_box_post_format_link( $pages = 'post' ) {
5513
-
5514
- if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'link', current( get_theme_support( 'post-formats' ) ), true ) ) {
5515
- return false;
5516
- }
5517
-
5518
- if ( is_string( $pages ) ) {
5519
- $pages = explode( ',', $pages );
5520
- }
5521
-
5522
- return apply_filters(
5523
- 'ot_meta_box_post_format_link',
5524
- array(
5525
- 'id' => 'ot-post-format-link',
5526
- 'title' => esc_html__( 'Link', 'option-tree' ),
5527
- 'desc' => '',
5528
- 'pages' => $pages,
5529
- 'context' => 'side',
5530
- 'priority' => 'low',
5531
- 'fields' => array(
5532
- array(
5533
- 'id' => '_format_link_url',
5534
- 'label' => '',
5535
- 'desc' => esc_html__( 'Link URL', 'option-tree' ),
5536
- 'std' => '',
5537
- 'type' => 'text',
5538
- ),
5539
- array(
5540
- 'id' => '_format_link_title',
5541
- 'label' => '',
5542
- 'desc' => esc_html__( 'Link Title', 'option-tree' ),
5543
- 'std' => '',
5544
- 'type' => 'text',
5545
- ),
5546
- ),
5547
- ),
5548
- $pages
5549
- );
5550
- }
5551
- }
5552
-
5553
- if ( ! function_exists( 'ot_meta_box_post_format_quote' ) ) {
5554
-
5555
- /**
5556
- * Returns an array with the post format quote metabox.
5557
- *
5558
- * @param mixed $pages Excepts a comma separated string or array of
5559
- * post_types and is what tells the metabox where to
5560
- * display. Default 'post'.
5561
- * @return array
5562
- *
5563
- * @access public
5564
- * @since 2.4.0
5565
- */
5566
- function ot_meta_box_post_format_quote( $pages = 'post' ) {
5567
-
5568
- if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'quote', current( get_theme_support( 'post-formats' ) ), true ) ) {
5569
- return false;
5570
- }
5571
-
5572
- if ( is_string( $pages ) ) {
5573
- $pages = explode( ',', $pages );
5574
- }
5575
-
5576
- return apply_filters(
5577
- 'ot_meta_box_post_format_quote',
5578
- array(
5579
- 'id' => 'ot-post-format-quote',
5580
- 'title' => esc_html__( 'Quote', 'option-tree' ),
5581
- 'desc' => '',
5582
- 'pages' => $pages,
5583
- 'context' => 'side',
5584
- 'priority' => 'low',
5585
- 'fields' => array(
5586
- array(
5587
- 'id' => '_format_quote_source_name',
5588
- 'label' => '',
5589
- 'desc' => esc_html__( 'Source Name (ex. author, singer, actor)', 'option-tree' ),
5590
- 'std' => '',
5591
- 'type' => 'text',
5592
- ),
5593
- array(
5594
- 'id' => '_format_quote_source_url',
5595
- 'label' => '',
5596
- 'desc' => esc_html__( 'Source URL', 'option-tree' ),
5597
- 'std' => '',
5598
- 'type' => 'text',
5599
- ),
5600
- array(
5601
- 'id' => '_format_quote_source_title',
5602
- 'label' => '',
5603
- 'desc' => esc_html__( 'Source Title (ex. book, song, movie)', 'option-tree' ),
5604
- 'std' => '',
5605
- 'type' => 'text',
5606
- ),
5607
- array(
5608
- 'id' => '_format_quote_source_date',
5609
- 'label' => '',
5610
- 'desc' => esc_html__( 'Source Date', 'option-tree' ),
5611
- 'std' => '',
5612
- 'type' => 'text',
5613
- ),
5614
- ),
5615
- ),
5616
- $pages
5617
- );
5618
-
5619
- }
5620
- }
5621
-
5622
- if ( ! function_exists( 'ot_meta_box_post_format_video' ) ) {
5623
-
5624
- /**
5625
- * Returns an array with the post format video metabox.
5626
- *
5627
- * @param mixed $pages Excepts a comma separated string or array of
5628
- * post_types and is what tells the metabox where to
5629
- * display. Default 'post'.
5630
- * @return array
5631
- *
5632
- * @access public
5633
- * @since 2.4.0
5634
- */
5635
- function ot_meta_box_post_format_video( $pages = 'post' ) {
5636
-
5637
- if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'video', current( get_theme_support( 'post-formats' ) ), true ) ) {
5638
- return false;
5639
- }
5640
-
5641
- if ( is_string( $pages ) ) {
5642
- $pages = explode( ',', $pages );
5643
- }
5644
-
5645
- /* translators: %1$s: link to WorPress Codex, %2$s: video shortcode */
5646
- $string = esc_html__( 'Embed video from services like Youtube, Vimeo, or Hulu. You can find a list of supported oEmbed sites in the %1$s. Alternatively, you could use the built-in %2$s shortcode.', 'option-tree' );
5647
-
5648
- return apply_filters(
5649
- 'ot_meta_box_post_format_video',
5650
- array(
5651
- 'id' => 'ot-post-format-video',
5652
- 'title' => __( 'Video', 'option-tree' ),
5653
- 'desc' => '',
5654
- 'pages' => $pages,
5655
- 'context' => 'side',
5656
- 'priority' => 'low',
5657
- 'fields' => array(
5658
- array(
5659
- 'id' => '_format_video_embed',
5660
- 'label' => '',
5661
- 'desc' => sprintf( $string, '<a href="https://codex.wordpress.org/Embeds" target="_blank">' . esc_html__( 'WordPress Codex', 'option-tree' ) . '</a>', '<code>[video]</code>' ),
5662
- 'std' => '',
5663
- 'type' => 'textarea',
5664
- ),
5665
- ),
5666
- ),
5667
- $pages
5668
- );
5669
- }
5670
- }
5671
-
5672
- if ( ! function_exists( 'ot_meta_box_post_format_audio' ) ) {
5673
-
5674
- /**
5675
- * Returns an array with the post format audio metabox.
5676
- *
5677
- * @param mixed $pages Excepts a comma separated string or array of
5678
- * post_types and is what tells the metabox where to
5679
- * display. Default 'post'.
5680
- * @return array
5681
- *
5682
- * @access public
5683
- * @since 2.4.0
5684
- */
5685
- function ot_meta_box_post_format_audio( $pages = 'post' ) {
5686
-
5687
- if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'audio', current( get_theme_support( 'post-formats' ) ), true ) ) {
5688
- return false;
5689
- }
5690
-
5691
- if ( is_string( $pages ) ) {
5692
- $pages = explode( ',', $pages );
5693
- }
5694
-
5695
- /* translators: %1$s: link to WorPress Codex, %2$s: audio shortcode */
5696
- $string = esc_html__( 'Embed audio from services like SoundCloud and Radio. You can find a list of supported oEmbed sites in the %1$s. Alternatively, you could use the built-in %2$s shortcode.', 'option-tree' );
5697
-
5698
- return apply_filters(
5699
- 'ot_meta_box_post_format_audio',
5700
- array(
5701
- 'id' => 'ot-post-format-audio',
5702
- 'title' => esc_html__( 'Audio', 'option-tree' ),
5703
- 'desc' => '',
5704
- 'pages' => $pages,
5705
- 'context' => 'side',
5706
- 'priority' => 'low',
5707
- 'fields' => array(
5708
- array(
5709
- 'id' => '_format_audio_embed',
5710
- 'label' => '',
5711
- 'desc' => sprintf( $string, '<a href="https://codex.wordpress.org/Embeds" target="_blank">' . esc_html__( 'WordPress Codex', 'option-tree' ) . '</a>', '<code>[audio]</code>' ),
5712
- 'std' => '',
5713
- 'type' => 'textarea',
5714
- ),
5715
- ),
5716
- ),
5717
- $pages
5718
- );
5719
-
5720
- }
5721
- }
5722
-
5723
- if ( ! function_exists( 'ot_get_option_type_by_id' ) ) {
5724
-
5725
- /**
5726
- * Returns the option type by ID.
5727
- *
5728
- * @param string $option_id The option ID.
5729
- * @param string $settings_id The settings array ID.
5730
- * @return string The option type.
5731
- *
5732
- * @access public
5733
- * @since 2.4.2
5734
- */
5735
- function ot_get_option_type_by_id( $option_id, $settings_id = '' ) {
5736
-
5737
- if ( empty( $settings_id ) ) {
5738
- $settings_id = ot_settings_id();
5739
- }
5740
-
5741
- $settings = get_option( $settings_id, array() );
5742
-
5743
- if ( isset( $settings['settings'] ) ) {
5744
-
5745
- foreach ( $settings['settings'] as $value ) {
5746
-
5747
- if ( $option_id === $value['id'] && isset( $value['type'] ) ) {
5748
- return $value['type'];
5749
- }
5750
- }
5751
- }
5752
-
5753
- return false;
5754
- }
5755
- }
5756
-
5757
- if ( ! function_exists( '_ot_settings_potential_shared_terms' ) ) {
5758
-
5759
- /**
5760
- * Build an array of potential Theme Options that could share terms.
5761
- *
5762
- * @return array
5763
- *
5764
- * @access private
5765
- * @since 2.5.4
5766
- */
5767
- function _ot_settings_potential_shared_terms() {
5768
-
5769
- $options = array();
5770
- $settings = get_option( ot_settings_id(), array() );
5771
- $option_types = array(
5772
- 'category-checkbox',
5773
- 'category-select',
5774
- 'tag-checkbox',
5775
- 'tag-select',
5776
- 'taxonomy-checkbox',
5777
- 'taxonomy-select',
5778
- );
5779
-
5780
- if ( isset( $settings['settings'] ) ) {
5781
-
5782
- foreach ( $settings['settings'] as $value ) {
5783
-
5784
- if ( isset( $value['type'] ) ) {
5785
-
5786
- if ( 'list-item' === $value['type'] && isset( $value['settings'] ) ) {
5787
-
5788
- $saved = ot_get_option( $value['id'] );
5789
-
5790
- foreach ( $value['settings'] as $item ) {
5791
-
5792
- if ( isset( $value['id'] ) && isset( $item['type'] ) && in_array( $item['type'], $option_types, true ) ) {
5793
- $sub_options = array();
5794
-
5795
- foreach ( $saved as $sub_key => $sub_value ) {
5796
- if ( isset( $sub_value[ $item['id'] ] ) ) {
5797
- $sub_options[ $sub_key ] = $sub_value[ $item['id'] ];
5798
- }
5799
- }
5800
-
5801
- if ( ! empty( $sub_options ) ) {
5802
- $options[] = array(
5803
- 'id' => $item['id'],
5804
- 'taxonomy' => $value['taxonomy'],
5805
- 'parent' => $value['id'],
5806
- 'value' => $sub_options,
5807
- );
5808
- }
5809
- }
5810
- }
5811
- }
5812
-
5813
- if ( in_array( $value['type'], $option_types, true ) ) {
5814
- $saved = ot_get_option( $value['id'] );
5815
- if ( ! empty( $saved ) ) {
5816
- $options[] = array(
5817
- 'id' => $value['id'],
5818
- 'taxonomy' => $value['taxonomy'],
5819
- 'value' => $saved,
5820
- );
5821
- }
5822
- }
5823
- }
5824
- }
5825
- }
5826
-
5827
- return $options;
5828
- }
5829
- }
5830
-
5831
- if ( ! function_exists( '_ot_meta_box_potential_shared_terms' ) ) {
5832
-
5833
- /**
5834
- * Build an array of potential Meta Box options that could share terms.
5835
- *
5836
- * @return array
5837
- *
5838
- * @access private
5839
- * @since 2.5.4
5840
- */
5841
- function _ot_meta_box_potential_shared_terms() {
5842
- global $ot_meta_boxes;
5843
-
5844
- $options = array();
5845
- $settings = $ot_meta_boxes;
5846
- $option_types = array(
5847
- 'category-checkbox',
5848
- 'category-select',
5849
- 'tag-checkbox',
5850
- 'tag-select',
5851
- 'taxonomy-checkbox',
5852
- 'taxonomy-select',
5853
- );
5854
-
5855
- foreach ( $settings as $setting ) {
5856
-
5857
- if ( isset( $setting['fields'] ) ) {
5858
-
5859
- foreach ( $setting['fields'] as $value ) {
5860
-
5861
- if ( isset( $value['type'] ) ) {
5862
-
5863
- if ( 'list-item' === $value['type'] && isset( $value['settings'] ) ) {
5864
-
5865
- $children = array();
5866
-
5867
- foreach ( $value['settings'] as $item ) {
5868
-
5869
- if ( isset( $value['id'] ) && isset( $item['type'] ) && in_array( $item['type'], $option_types, true ) ) {
5870
- $children[ $value['id'] ][] = $item['id'];
5871
- }
5872
- }
5873
-
5874
- if ( ! empty( $children[ $value['id'] ] ) ) {
5875
- $options[] = array(
5876
- 'id' => $value['id'],
5877
- 'children' => $children[ $value['id'] ],
5878
- 'taxonomy' => $value['taxonomy'],
5879
- );
5880
- }
5881
- }
5882
-
5883
- if ( in_array( $value['type'], $option_types, true ) ) {
5884
- $options[] = array(
5885
- 'id' => $value['id'],
5886
- 'taxonomy' => $value['taxonomy'],
5887
- );
5888
- }
5889
- }
5890
- }
5891
- }
5892
- }
5893
-
5894
- return $options;
5895
- }
5896
- }
5897
-
5898
- if ( ! function_exists( 'ot_split_shared_term' ) ) {
5899
-
5900
- /**
5901
- * Update terms when a term gets split.
5902
- *
5903
- * @param int $term_id ID of the formerly shared term.
5904
- * @param int $new_term_id ID of the new term created for the $term_taxonomy_id.
5905
- * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split.
5906
- * @param string $taxonomy Taxonomy for the split term.
5907
- *
5908
- * @access public
5909
- * @since 2.5.4
5910
- */
5911
- function ot_split_shared_term( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
5912
- unset( $term_taxonomy_id );
5913
-
5914
- // Process the Theme Options.
5915
- $settings = _ot_settings_potential_shared_terms();
5916
- $old_options = get_option( ot_options_id(), array() );
5917
- $new_options = $old_options;
5918
-
5919
- // Process the saved settings.
5920
- if ( ! empty( $settings ) && ! empty( $old_options ) ) {
5921
-
5922
- // Loop over the Theme Options.
5923
- foreach ( $settings as $option ) {
5924
-
5925
- if ( ! is_array( $option['taxonomy'] ) ) {
5926
- $option['taxonomy'] = explode( ',', $option['taxonomy'] );
5927
- }
5928
-
5929
- if ( ! in_array( $taxonomy, $option['taxonomy'], true ) ) {
5930
- continue;
5931
- }
5932
-
5933
- // The option ID was found.
5934
- if ( array_key_exists( $option['id'], $old_options ) || ( isset( $option['parent'] ) && array_key_exists( $option['parent'], $old_options ) ) ) {
5935
-
5936
- // This is a list item, we have to go deeper.
5937
- if ( isset( $option['parent'] ) ) {
5938
-
5939
- // Loop over the array.
5940
- foreach ( $option['value'] as $key => $value ) {
5941
-
5942
- // The value is an array of IDs.
5943
- if ( is_array( $value ) ) {
5944
-
5945
- // Loop over the sub array.
5946
- foreach ( $value as $sub_key => $sub_value ) {
5947
-
5948
- if ( $sub_value === $term_id ) {
5949
- unset( $new_options[ $option['parent'] ][ $key ][ $option['id'] ][ $sub_key ] );
5950
- $new_options[ $option['parent'] ][ $key ][ $option['id'] ][ $new_term_id ] = $new_term_id;
5951
- }
5952
- }
5953
- } elseif ( $value === $term_id ) {
5954
- unset( $new_options[ $option['parent'] ][ $key ][ $option['id'] ] );
5955
- $new_options[ $option['parent'] ][ $key ][ $option['id'] ] = $new_term_id;
5956
- }
5957
- }
5958
- } else {
5959
-
5960
- // The value is an array of IDs.
5961
- if ( is_array( $option['value'] ) ) {
5962
-
5963
- // Loop over the array.
5964
- foreach ( $option['value'] as $key => $value ) {
5965
-
5966
- // It's a single value, just replace it.
5967
- if ( $value === $term_id ) {
5968
- unset( $new_options[ $option['id'] ][ $key ] );
5969
- $new_options[ $option['id'] ][ $new_term_id ] = $new_term_id;
5970
- }
5971
- }
5972
-
5973
- // It's a single value, just replace it.
5974
- } elseif ( $option['value'] === $term_id ) {
5975
- $new_options[ $option['id'] ] = $new_term_id;
5976
- }
5977
- }
5978
- }
5979
- }
5980
- }
5981
-
5982
- // Options need to be updated.
5983
- if ( $old_options !== $new_options ) {
5984
- update_option( ot_options_id(), $new_options );
5985
- }
5986
-
5987
- // Process the Meta Boxes.
5988
- $meta_settings = _ot_meta_box_potential_shared_terms();
5989
-
5990
- if ( ! empty( $meta_settings ) ) {
5991
-
5992
- foreach ( $meta_settings as $option ) {
5993
-
5994
- if ( ! is_array( $option['taxonomy'] ) ) {
5995
- $option['taxonomy'] = explode( ',', $option['taxonomy'] );
5996
- }
5997
-
5998
- if ( ! in_array( $taxonomy, $option['taxonomy'], true ) ) {
5999
- continue;
6000
- }
6001
-
6002
- if ( isset( $option['children'] ) ) {
6003
- $post_ids = get_posts(
6004
- array(
6005
- 'fields' => 'ids',
6006
- 'meta_key' => $option['id'], // phpcs:ignore
6007
- )
6008
- );
6009
-
6010
- if ( $post_ids ) {
6011
-
6012
- foreach ( $post_ids as $post_id ) {
6013
-
6014
- // Get the meta.
6015
- $old_meta = get_post_meta( $post_id, $option['id'], true );
6016
- $new_meta = $old_meta;
6017
-
6018
- // Has a saved value.
6019
- if ( ! empty( $old_meta ) && is_array( $old_meta ) ) {
6020
-
6021
- // Loop over the array.
6022
- foreach ( $old_meta as $key => $value ) {
6023
-
6024
- foreach ( $value as $sub_key => $sub_value ) {
6025
-
6026
- if ( in_array( $sub_key, $option['children'], true ) ) {
6027
-
6028
- // The value is an array of IDs.
6029
- if ( is_array( $sub_value ) ) {
6030
-
6031
- // Loop over the array.
6032
- foreach ( $sub_value as $sub_sub_key => $sub_sub_value ) {
6033
-
6034
- // It's a single value, just replace it.
6035
- if ( $sub_sub_value === $term_id ) {
6036
- unset( $new_meta[ $key ][ $sub_key ][ $sub_sub_key ] );
6037
- $new_meta[ $key ][ $sub_key ][ $new_term_id ] = $new_term_id;
6038
- }
6039
- }
6040
-
6041
- // It's a single value, just replace it.
6042
- } elseif ( $sub_value === $term_id ) {
6043
- $new_meta[ $key ][ $sub_key ] = $new_term_id;
6044
- }
6045
- }
6046
- }
6047
- }
6048
-
6049
- // Update.
6050
- if ( $old_meta !== $new_meta ) {
6051
- update_post_meta( $post_id, $option['id'], $new_meta, $old_meta );
6052
- }
6053
- }
6054
- }
6055
- }
6056
- } else {
6057
- $post_ids = get_posts(
6058
- array(
6059
- 'fields' => 'ids',
6060
- 'meta_query' => array( // phpcs:ignore
6061
- 'key' => $option['id'],
6062
- 'value' => $term_id,
6063
- 'compare' => 'IN',
6064
- ),
6065
- )
6066
- );
6067
-
6068
- if ( $post_ids ) {
6069
-
6070
- foreach ( $post_ids as $post_id ) {
6071
-
6072
- // Get the meta.
6073
- $old_meta = get_post_meta( $post_id, $option['id'], true );
6074
- $new_meta = $old_meta;
6075
-
6076
- // Has a saved value.
6077
- if ( ! empty( $old_meta ) ) {
6078
-
6079
- // The value is an array of IDs.
6080
- if ( is_array( $old_meta ) ) {
6081
-
6082
- // Loop over the array.
6083
- foreach ( $old_meta as $key => $value ) {
6084
-
6085
- // It's a single value, just replace it.
6086
- if ( $value === $term_id ) {
6087
- unset( $new_meta[ $key ] );
6088
- $new_meta[ $new_term_id ] = $new_term_id;
6089
- }
6090
- }
6091
-
6092
- // It's a single value, just replace it.
6093
- } elseif ( $old_meta === $term_id ) {
6094
- $new_meta = $new_term_id;
6095
- }
6096
-
6097
- // Update.
6098
- if ( $old_meta !== $new_meta ) {
6099
- update_post_meta( $post_id, $option['id'], $new_meta, $old_meta );
6100
- }
6101
- }
6102
- }
6103
- }
6104
- }
6105
- }
6106
- }
6107
- }
6108
-
6109
- add_action( 'split_shared_term', 'ot_split_shared_term', 10, 4 );
6110
- }
6111
-
1
+ <?php
2
+ /**
3
+ * Functions used only while viewing the admin UI.
4
+ *
5
+ * Limit loading these function only when needed
6
+ * and not in the front end.
7
+ *
8
+ * @package OptionTree
9
+ */
10
+
11
+ if ( ! defined( 'OT_VERSION' ) ) {
12
+ exit( 'No direct script access allowed' );
13
+ }
14
+
15
+ if ( ! function_exists( 'ot_register_theme_options_page' ) ) {
16
+
17
+ /**
18
+ * Registers the Theme Option page
19
+ *
20
+ * @uses ot_register_settings()
21
+ *
22
+ * @access public
23
+ * @since 2.1
24
+ */
25
+ function ot_register_theme_options_page() {
26
+
27
+ // Get the settings array.
28
+ $get_settings = get_option( ot_settings_id() );
29
+
30
+ // Sections array.
31
+ $sections = isset( $get_settings['sections'] ) ? $get_settings['sections'] : array();
32
+
33
+ // Settings array.
34
+ $settings = isset( $get_settings['settings'] ) ? $get_settings['settings'] : array();
35
+
36
+ // Contexual help array.
37
+ $contextual_help = isset( $get_settings['contextual_help'] ) ? $get_settings['contextual_help'] : array();
38
+
39
+ // Build the Theme Options.
40
+ if ( function_exists( 'ot_register_settings' ) && OT_USE_THEME_OPTIONS ) {
41
+
42
+ $caps = apply_filters( 'ot_theme_options_capability', 'edit_theme_options' );
43
+
44
+ ot_register_settings(
45
+ array(
46
+ array(
47
+ 'id' => ot_options_id(),
48
+ 'pages' => array(
49
+ array(
50
+ 'id' => 'niftycs_options',
51
+ 'parent_slug' => apply_filters( 'niftycs_options_parent_slug', null ),
52
+ 'page_title' => apply_filters( 'niftycs_options_page_title', __( 'Nifty Coming Soon, Maintenance &amp; Under Construction Options', 'option-tree' ) ),
53
+ 'menu_title' => apply_filters( 'niftycs_options_menu_title', __( 'Nifty Options', 'option-tree' ) ),
54
+ 'capability' => $caps = apply_filters( 'niftycs_options_capability', 'edit_theme_options' ),
55
+ 'menu_slug' => apply_filters( 'niftycs_options_menu_slug', 'niftycs-options' ),
56
+ 'icon_url' => apply_filters( 'niftycs_options_icon_url', OT_URL .'/assets/images/nifty_ot.png' ),
57
+ 'position' => apply_filters( 'niftycs_options_position', null ),
58
+ 'updated_message' => apply_filters( 'niftycs_options_updated_message', __( 'Nifty Options updated.', 'option-tree' ) ),
59
+ 'reset_message' => apply_filters( 'niftycs_options_reset_message', __( 'Nifty Options restored to default value.', 'option-tree' ) ),
60
+ 'button_text' => apply_filters( 'niftycs_options_button_text', __( 'Save Changes', 'option-tree' ) ),
61
+ 'contextual_help' => apply_filters( 'niftycs_options_contextual_help', $contextual_help ),
62
+ 'sections' => apply_filters( 'niftycs_options_sections', $sections ),
63
+ 'settings' => apply_filters( 'niftycs_options_settings', $settings )
64
+ ),
65
+ ),
66
+ ),
67
+ )
68
+ );
69
+
70
+ // Filters the options.php to add the minimum user capabilities.
71
+ add_filter(
72
+ 'option_page_capability_' . ot_options_id(),
73
+ function() use ( $caps ) {
74
+ return $caps;
75
+ },
76
+ 999
77
+ );
78
+
79
+ }
80
+
81
+ }
82
+
83
+ }
84
+
85
+ if ( ! function_exists( 'ot_register_settings_page' ) ) {
86
+
87
+ /**
88
+ * Registers the Settings page.
89
+ *
90
+ * @access public
91
+ * @since 2.1
92
+ */
93
+ function ot_register_settings_page() {
94
+ global $ot_has_custom_theme_options;
95
+
96
+ $custom_options = ( true === $ot_has_custom_theme_options || has_action( 'admin_init', 'custom_theme_options' ) || has_action( 'init', 'custom_theme_options' ) );
97
+
98
+ // Display UI Builder admin notice.
99
+ if ( true === OT_SHOW_OPTIONS_UI && isset( $_REQUEST['page'] ) && 'ot-settings' === $_REQUEST['page'] && $custom_options ) { // phpcs:ignore
100
+
101
+ /**
102
+ * Error message for custom theme options.
103
+ */
104
+ function ot_has_custom_theme_options() {
105
+ echo '<div class="error"><p>' . esc_html__( 'The Theme Options UI Builder is being overridden by a custom file in your theme. Any changes you make via the UI Builder will not be saved.', 'option-tree' ) . '</p></div>';
106
+ }
107
+
108
+ add_action( 'admin_notices', 'ot_has_custom_theme_options' );
109
+ }
110
+
111
+ // Create the filterable pages array.
112
+ $ot_register_pages_array = array(
113
+ array(
114
+ 'id' => 'ot',
115
+ 'page_title' => esc_html__( 'OptionTree', 'option-tree' ),
116
+ 'menu_title' => esc_html__( 'OptionTree', 'option-tree' ),
117
+ 'capability' => 'edit_theme_options',
118
+ 'menu_slug' => 'ot-settings',
119
+ 'icon_url' => null,
120
+ 'position' => 61,
121
+ 'hidden_page' => true,
122
+ ),
123
+ array(
124
+ 'id' => 'settings',
125
+ 'parent_slug' => 'ot-settings',
126
+ 'page_title' => esc_html__( 'Settings', 'option-tree' ),
127
+ 'menu_title' => esc_html__( 'Settings', 'option-tree' ),
128
+ 'capability' => 'edit_theme_options',
129
+ 'menu_slug' => 'ot-settings',
130
+ 'icon_url' => null,
131
+ 'position' => null,
132
+ 'updated_message' => esc_html__( 'Theme Options updated.', 'option-tree' ),
133
+ 'reset_message' => esc_html__( 'Theme Options reset.', 'option-tree' ),
134
+ 'button_text' => esc_html__( 'Save Settings', 'option-tree' ),
135
+ 'show_buttons' => false,
136
+ 'sections' => array(
137
+ array(
138
+ 'id' => 'create_setting',
139
+ 'title' => esc_html__( 'Theme Options UI', 'option-tree' ),
140
+ ),
141
+ array(
142
+ 'id' => 'import',
143
+ 'title' => esc_html__( 'Import', 'option-tree' ),
144
+ ),
145
+ array(
146
+ 'id' => 'export',
147
+ 'title' => esc_html__( 'Export', 'option-tree' ),
148
+ ),
149
+ array(
150
+ 'id' => 'layouts',
151
+ 'title' => esc_html__( 'Layouts', 'option-tree' ),
152
+ ),
153
+ ),
154
+ 'settings' => array(
155
+ array(
156
+ 'id' => 'theme_options_ui_text',
157
+ 'label' => esc_html__( 'Theme Options UI Builder', 'option-tree' ),
158
+ 'type' => 'theme_options_ui',
159
+ 'section' => 'create_setting',
160
+ ),
161
+ array(
162
+ 'id' => 'import_settings_text',
163
+ 'label' => esc_html__( 'Settings', 'option-tree' ),
164
+ 'type' => 'import-settings',
165
+ 'section' => 'import',
166
+ ),
167
+ array(
168
+ 'id' => 'import_data_text',
169
+ 'label' => esc_html__( 'Theme Options', 'option-tree' ),
170
+ 'type' => 'import-data',
171
+ 'section' => 'import',
172
+ ),
173
+ array(
174
+ 'id' => 'import_layouts_text',
175
+ 'label' => esc_html__( 'Layouts', 'option-tree' ),
176
+ 'type' => 'import-layouts',
177
+ 'section' => 'import',
178
+ ),
179
+ array(
180
+ 'id' => 'export_settings_file_text',
181
+ 'label' => esc_html__( 'Settings PHP File', 'option-tree' ),
182
+ 'type' => 'export-settings-file',
183
+ 'section' => 'export',
184
+ ),
185
+ array(
186
+ 'id' => 'export_settings_text',
187
+ 'label' => esc_html__( 'Settings', 'option-tree' ),
188
+ 'type' => 'export-settings',
189
+ 'section' => 'export',
190
+ ),
191
+ array(
192
+ 'id' => 'export_data_text',
193
+ 'label' => esc_html__( 'Theme Options', 'option-tree' ),
194
+ 'type' => 'export-data',
195
+ 'section' => 'export',
196
+ ),
197
+ array(
198
+ 'id' => 'export_layout_text',
199
+ 'label' => esc_html__( 'Layouts', 'option-tree' ),
200
+ 'type' => 'export-layouts',
201
+ 'section' => 'export',
202
+ ),
203
+ array(
204
+ 'id' => 'modify_layouts_text',
205
+ 'label' => esc_html__( 'Layout Management', 'option-tree' ),
206
+ 'type' => 'modify-layouts',
207
+ 'section' => 'layouts',
208
+ ),
209
+ ),
210
+ ),
211
+ array(
212
+ 'id' => 'documentation',
213
+ 'parent_slug' => 'ot-settings',
214
+ 'page_title' => esc_html__( 'Documentation', 'option-tree' ),
215
+ 'menu_title' => esc_html__( 'Documentation', 'option-tree' ),
216
+ 'capability' => 'edit_theme_options',
217
+ 'menu_slug' => 'ot-documentation',
218
+ 'icon_url' => null,
219
+ 'position' => null,
220
+ 'updated_message' => esc_html__( 'Theme Options updated.', 'option-tree' ),
221
+ 'reset_message' => esc_html__( 'Theme Options reset.', 'option-tree' ),
222
+ 'button_text' => esc_html__( 'Save Settings', 'option-tree' ),
223
+ 'show_buttons' => false,
224
+ 'sections' => array(
225
+ array(
226
+ 'id' => 'creating_options',
227
+ 'title' => esc_html__( 'Creating Options', 'option-tree' ),
228
+ ),
229
+ array(
230
+ 'id' => 'option_types',
231
+ 'title' => esc_html__( 'Option Types', 'option-tree' ),
232
+ ),
233
+ array(
234
+ 'id' => 'functions',
235
+ 'title' => esc_html__( 'Function References', 'option-tree' ),
236
+ ),
237
+ array(
238
+ 'id' => 'theme_mode',
239
+ 'title' => esc_html__( 'Theme Mode', 'option-tree' ),
240
+ ),
241
+ array(
242
+ 'id' => 'meta_boxes',
243
+ 'title' => esc_html__( 'Meta Boxes', 'option-tree' ),
244
+ ),
245
+ array(
246
+ 'id' => 'examples',
247
+ 'title' => esc_html__( 'Code Examples', 'option-tree' ),
248
+ ),
249
+ array(
250
+ 'id' => 'layouts_overview',
251
+ 'title' => esc_html__( 'Layouts Overview', 'option-tree' ),
252
+ ),
253
+ ),
254
+ 'settings' => array(
255
+ array(
256
+ 'id' => 'creating_options_text',
257
+ 'label' => esc_html__( 'Overview of available Theme Option fields.', 'option-tree' ),
258
+ 'type' => 'creating-options',
259
+ 'section' => 'creating_options',
260
+ ),
261
+ array(
262
+ 'id' => 'option_types_text',
263
+ 'label' => esc_html__( 'Option types in alphabetical order & hooks to filter them.', 'option-tree' ),
264
+ 'type' => 'option-types',
265
+ 'section' => 'option_types',
266
+ ),
267
+ array(
268
+ 'id' => 'functions_ot_get_option',
269
+ 'label' => esc_html__( 'Function Reference:ot_get_option()', 'option-tree' ),
270
+ 'type' => 'ot-get-option',
271
+ 'section' => 'functions',
272
+ ),
273
+ array(
274
+ 'id' => 'functions_get_option_tree',
275
+ 'label' => esc_html__( 'Function Reference:get_option_tree()', 'option-tree' ),
276
+ 'type' => 'get-option-tree',
277
+ 'section' => 'functions',
278
+ ),
279
+ array(
280
+ 'id' => 'theme_mode_text',
281
+ 'label' => esc_html__( 'Theme Mode', 'option-tree' ),
282
+ 'type' => 'theme-mode',
283
+ 'section' => 'theme_mode',
284
+ ),
285
+ array(
286
+ 'id' => 'meta_boxes_text',
287
+ 'label' => esc_html__( 'Meta Boxes', 'option-tree' ),
288
+ 'type' => 'meta-boxes',
289
+ 'section' => 'meta_boxes',
290
+ ),
291
+ array(
292
+ 'id' => 'example_text',
293
+ 'label' => esc_html__( 'Code examples for front-end development.', 'option-tree' ),
294
+ 'type' => 'examples',
295
+ 'section' => 'examples',
296
+ ),
297
+ array(
298
+ 'id' => 'layouts_overview_text',
299
+ 'label' => esc_html__( 'What\'s a layout anyhow?', 'option-tree' ),
300
+ 'type' => 'layouts-overview',
301
+ 'section' => 'layouts_overview',
302
+ ),
303
+ ),
304
+ ),
305
+ );
306
+
307
+ // Loop over the settings and remove as needed.
308
+ foreach ( $ot_register_pages_array as $key => $page ) {
309
+
310
+ // Remove various options from the Settings UI.
311
+ if ( 'settings' === $page['id'] ) {
312
+
313
+ // Remove the Theme Options UI.
314
+ if ( false === OT_SHOW_OPTIONS_UI ) {
315
+
316
+ foreach ( $page['sections'] as $section_key => $section ) {
317
+ if ( 'create_setting' === $section['id'] ) {
318
+ unset( $ot_register_pages_array[ $key ]['sections'][ $section_key ] );
319
+ }
320
+ }
321
+
322
+ foreach ( $page['settings'] as $setting_key => $setting ) {
323
+ if ( 'create_setting' === $setting['section'] ) {
324
+ unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
325
+ }
326
+ }
327
+ }
328
+
329
+ // Remove parts of the Imports UI.
330
+ if ( false === OT_SHOW_SETTINGS_IMPORT ) {
331
+
332
+ foreach ( $page['settings'] as $setting_key => $setting ) {
333
+ if ( 'import' === $setting['section'] && in_array( $setting['id'], array( 'import_xml_text', 'import_settings_text' ), true ) ) {
334
+ unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
335
+ }
336
+ }
337
+ }
338
+
339
+ // Remove parts of the Export UI.
340
+ if ( false === OT_SHOW_SETTINGS_EXPORT ) {
341
+
342
+ foreach ( $page['settings'] as $setting_key => $setting ) {
343
+ if ( 'export' === $setting['section'] && in_array( $setting['id'], array( 'export_settings_file_text', 'export_settings_text' ), true ) ) {
344
+ unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
345
+ }
346
+ }
347
+ }
348
+
349
+ // Remove the Layouts UI.
350
+ if ( false === OT_SHOW_NEW_LAYOUT ) {
351
+
352
+ foreach ( $page['sections'] as $section_key => $section ) {
353
+ if ( 'layouts' === $section['id'] ) {
354
+ unset( $ot_register_pages_array[ $key ]['sections'][ $section_key ] );
355
+ }
356
+ }
357
+
358
+ foreach ( $page['settings'] as $setting_key => $setting ) {
359
+ if ( 'layouts' === $setting['section'] ) {
360
+ unset( $ot_register_pages_array[ $key ]['settings'][ $setting_key ] );
361
+ }
362
+ }
363
+ }
364
+ }
365
+
366
+ // Remove the Documentation UI.
367
+ if ( false === OT_SHOW_DOCS && 'documentation' === $page['id'] ) {
368
+ unset( $ot_register_pages_array[ $key ] );
369
+ }
370
+ }
371
+
372
+ $ot_register_pages_array = apply_filters( 'ot_register_pages_array', $ot_register_pages_array );
373
+
374
+ // Register the pages.
375
+ ot_register_settings(
376
+ array(
377
+ array(
378
+ 'id' => ot_settings_id(),
379
+ 'pages' => $ot_register_pages_array,
380
+ ),
381
+ )
382
+ );
383
+
384
+ }
385
+ }
386
+
387
+ if ( ! function_exists( 'ot_after_theme_options_save' ) ) {
388
+
389
+ /**
390
+ * Runs directly after the Theme Options are save.
391
+ *
392
+ * @access public
393
+ * @since 2.0
394
+ */
395
+ function ot_after_theme_options_save() {
396
+
397
+ $page = isset( $_REQUEST['page'] ) ? esc_attr( wp_unslash( $_REQUEST['page'] ) ) : ''; // phpcs:ignore
398
+ $updated = isset( $_REQUEST['settings-updated'] ) && true === filter_var( wp_unslash( $_REQUEST['settings-updated'] ), FILTER_VALIDATE_BOOLEAN ); // phpcs:ignore
399
+
400
+ // Only execute after the theme options are saved.
401
+ if ( apply_filters( 'ot_theme_options_menu_slug', 'ot-theme-options' ) === $page && $updated ) {
402
+
403
+ // Grab a copy of the theme options.
404
+ $options = get_option( ot_options_id() );
405
+
406
+ // Execute the action hook and pass the theme options to it.
407
+ do_action( 'ot_after_theme_options_save', $options );
408
+ }
409
+ }
410
+ }
411
+
412
+ if ( ! function_exists( 'ot_validate_setting' ) ) {
413
+
414
+ /**
415
+ * Validate the options by type before saving.
416
+ *
417
+ * This function will run on only some of the option types
418
+ * as all of them don't need to be validated, just the
419
+ * ones users are going to input data into; because they
420
+ * can't be trusted.
421
+ *
422
+ * @param mixed $input Setting value.
423
+ * @param string $type Setting type.
424
+ * @param string $field_id Setting field ID.
425
+ * @param string $wmpl_id WPML field ID.
426
+ * @return mixed
427
+ *
428
+ * @access public
429
+ * @since 2.0
430
+ */
431
+ function ot_validate_setting( $input, $type, $field_id, $wmpl_id = '' ) {
432
+
433
+ // Exit early if missing data.
434
+ if ( ! $input || ! $type || ! $field_id ) {
435
+ return $input;
436
+ }
437
+
438
+ /**
439
+ * Filter to modify a setting field value before validation.
440
+ *
441
+ * This cannot be used to filter the returned value of a custom
442
+ * setting type. You must use the `ot_validate_setting_input_safe`
443
+ * filter to ensure custom setting types are saved to the database.
444
+ *
445
+ * @param mixed $input The setting field value.
446
+ * @param string $type The setting field type.
447
+ * @param string $field_id The setting field ID.
448
+ */
449
+ $input = apply_filters( 'ot_validate_setting', $input, $type, $field_id );
450
+
451
+ /**
452
+ * Filter to validate a setting field value.
453
+ *
454
+ * @param mixed $input_safe This is either null, or the filtered input value.
455
+ * @param mixed $input The setting field value.
456
+ * @param string $type The setting field type.
457
+ * @param string $field_id The setting field ID.
458
+ */
459
+ $input_safe = apply_filters( 'ot_validate_setting_input_safe', null, $input, $type, $field_id );
460
+
461
+ // The value was filtered and is safe to return.
462
+ if ( ! is_null( $input_safe ) ) {
463
+ return $input_safe;
464
+ }
465
+
466
+ /* translators: %1$s: the input id, %2$s: the field id */
467
+ $string_nums = esc_html__( 'The %1$s input field for %2$s only allows numeric values.', 'option-tree' );
468
+
469
+ if ( 'background' === $type ) {
470
+
471
+ $input_safe = array();
472
+
473
+ // Loop over array and check for values.
474
+ foreach ( (array) $input as $key => $value ) {
475
+ if ( 'background-color' === $key ) {
476
+ $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
477
+ } elseif ( 'background-image' === $key ) {
478
+ $input_safe[ $key ] = ot_validate_setting( $value, 'upload', $field_id );
479
+ } else {
480
+ $input_safe[ $key ] = sanitize_text_field( $value );
481
+ }
482
+ }
483
+ } elseif ( 'border' === $type ) {
484
+
485
+ $input_safe = array();
486
+
487
+ // Loop over array and set errors or unset key from array.
488
+ foreach ( $input as $key => $value ) {
489
+
490
+ if ( empty( $value ) ) {
491
+ continue;
492
+ }
493
+
494
+ // Validate width.
495
+ if ( 'width' === $key ) {
496
+ if ( ! is_numeric( $value ) ) {
497
+ add_settings_error( 'option-tree', 'invalid_border_width', sprintf( $string_nums, '<code>width</code>', '<code>' . $field_id . '</code>' ), 'error' );
498
+ } else {
499
+ $input_safe[ $key ] = absint( $value );
500
+ }
501
+ } elseif ( 'color' === $key ) {
502
+ $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
503
+ } else {
504
+ $input_safe[ $key ] = sanitize_text_field( $value );
505
+ }
506
+ }
507
+ } elseif ( 'box-shadow' === $type ) {
508
+
509
+ $input_safe = array();
510
+
511
+ // Loop over array and check for values.
512
+ foreach ( (array) $input as $key => $value ) {
513
+ if ( 'inset' === $key ) {
514
+ $input_safe[ $key ] = 'inset';
515
+ } elseif ( 'color' === $key ) {
516
+ $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
517
+ } else {
518
+ $input_safe[ $key ] = sanitize_text_field( $value );
519
+ }
520
+ }
521
+ } elseif ( 'checkbox' === $type ) {
522
+
523
+ $input_safe = array();
524
+
525
+ // Loop over array and check for values.
526
+ foreach ( (array) $input as $key => $value ) {
527
+ if ( ! empty( $value ) ) {
528
+ $input_safe[ $key ] = sanitize_text_field( $value );
529
+ }
530
+ }
531
+ } elseif ( 'colorpicker' === $type ) {
532
+
533
+ $input_safe = '';
534
+
535
+ // Only strings are allowed.
536
+ if ( is_string( $input ) ) {
537
+
538
+ /* translators: %s: the field id */
539
+ $string_color = esc_html__( 'The %s Colorpicker only allows valid hexadecimal or rgba values depending on the setting type.', 'option-tree' );
540
+
541
+ if ( 0 === preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})$/i', $input ) && 0 === preg_match( '/^rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]{1,4})\s*\)/i', $input ) ) {
542
+ add_settings_error( 'option-tree', 'invalid_hex_or_rgba', sprintf( $string_color, '<code>' . $field_id . '</code>' ), 'error' );
543
+ } else {
544
+ $input_safe = $input;
545
+ }
546
+ }
547
+ } elseif ( 'colorpicker-opacity' === $type ) {
548
+ $input_safe = ot_validate_setting( $input, 'colorpicker', $field_id );
549
+ } elseif ( in_array( $type, array( 'category-checkbox', 'custom-post-type-checkbox', 'page-checkbox', 'post-checkbox', 'tag-checkbox', 'taxonomy-checkbox' ), true ) ) {
550
+
551
+ $input_safe = array();
552
+
553
+ // Loop over array and check for values.
554
+ foreach ( (array) $input as $key => $value ) {
555
+ if ( filter_var( $value, FILTER_VALIDATE_INT ) && 0 < $value ) {
556
+ $input_safe[ $key ] = absint( $value );
557
+ }
558
+ }
559
+ } elseif ( in_array( $type, array( 'category-select', 'custom-post-type-select', 'page-select', 'post-select', 'tag-select', 'taxonomy-select' ), true ) ) {
560
+
561
+ $input_safe = '';
562
+
563
+ if ( filter_var( $input, FILTER_VALIDATE_INT ) && 0 < $input ) {
564
+ $input_safe = absint( $input );
565
+ }
566
+ } elseif ( in_array( $type, array( 'css', 'javascript', 'text', 'textarea', 'textarea-simple' ), true ) ) {
567
+ if ( ! function_exists( '_filter_wp_kses_post' ) ) {
568
+ /**
569
+ * Filter the allowed HTML and safe CSS styles.
570
+ *
571
+ * @since 2.7.2
572
+ *
573
+ * @param bool $add Whether to add or remove the filter.
574
+ */
575
+ function _filter_wp_kses_post( $add = true ) {
576
+ $css_filter = function ( $attr ) {
577
+ array_push( $attr, 'display', 'visibility' );
578
+
579
+ $attr = apply_filters( 'ot_safe_style_css', $attr );
580
+
581
+ return $attr;
582
+ };
583
+
584
+ $html_filter = function ( $tags, $context ) {
585
+ if ( 'post' === $context ) {
586
+ if ( current_user_can( 'unfiltered_html' ) || true === OT_ALLOW_UNFILTERED_HTML ) {
587
+ $tags['script'] = array_fill_keys( array( 'async', 'charset', 'defer', 'src', 'type' ), true );
588
+ $tags['style'] = array_fill_keys( array( 'media', 'type' ), true );
589
+ $tags['iframe'] = array_fill_keys( array( 'align', 'allowfullscreen', 'class', 'frameborder', 'height', 'id', 'longdesc', 'marginheight', 'marginwidth', 'name', 'sandbox', 'scrolling', 'src', 'srcdoc', 'style', 'width' ), true );
590
+ $tags['noscript'] = true;
591
+
592
+ $tags = apply_filters( 'ot_allowed_html', $tags );
593
+ }
594
+ }
595
+
596
+ return $tags;
597
+ };
598
+
599
+ if ( $add ) {
600
+ add_filter( 'safe_style_css', $css_filter );
601
+ add_filter( 'wp_kses_allowed_html', $html_filter, 10, 2 );
602
+ } else {
603
+ remove_filter( 'safe_style_css', $css_filter );
604
+ remove_filter( 'wp_kses_allowed_html', $html_filter );
605
+ }
606
+ }
607
+ }
608
+
609
+ _filter_wp_kses_post( true );
610
+ $input_safe = wp_kses_post( $input );
611
+ _filter_wp_kses_post( false );
612
+ } elseif ( 'date-picker' === $type || 'date-time-picker' === $type ) {
613
+ if ( ! empty( $input ) && (bool) strtotime( $input ) ) {
614
+ $input_safe = sanitize_text_field( $input );
615
+ }
616
+ } elseif ( 'dimension' === $type ) {
617
+
618
+ $input_safe = array();
619
+
620
+ // Loop over array and set errors.
621
+ foreach ( $input as $key => $value ) {
622
+ if ( ! empty( $value ) ) {
623
+ if ( ! is_numeric( $value ) && 'unit' !== $key ) {
624
+ add_settings_error( 'option-tree', 'invalid_dimension_' . $key, sprintf( $string_nums, '<code>' . $key . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
625
+ } else {
626
+ $input_safe[ $key ] = sanitize_text_field( $value );
627
+ }
628
+ }
629
+ }
630
+ } elseif ( 'gallery' === $type ) {
631
+
632
+ $input_safe = '';
633
+
634
+ if ( '' !== trim( $input ) ) {
635
+ $input_safe = sanitize_text_field( $input );
636
+ }
637
+ } elseif ( 'google-fonts' === $type ) {
638
+
639
+ $input_safe = array();
640
+
641
+ // Loop over array.
642
+ foreach ( $input as $key => $value ) {
643
+ if ( '%key%' === $key ) {
644
+ continue;
645
+ }
646
+
647
+ foreach ( $value as $fk => $fvalue ) {
648
+ if ( is_array( $fvalue ) ) {
649
+ foreach ( $fvalue as $sk => $svalue ) {
650
+ $input_safe[ $key ][ $fk ][ $sk ] = sanitize_text_field( $svalue );
651
+ }
652
+ } else {
653
+ $input_safe[ $key ][ $fk ] = sanitize_text_field( $fvalue );
654
+ }
655
+ }
656
+ }
657
+
658
+ array_values( $input_safe );
659
+ } elseif ( 'link-color' === $type ) {
660
+
661
+ $input_safe = array();
662
+
663
+ // Loop over array and check for values.
664
+ if ( is_array( $input ) && ! empty( $input ) ) {
665
+ foreach ( $input as $key => $value ) {
666
+ if ( ! empty( $value ) ) {
667
+ $input_safe[ $key ] = ot_validate_setting( $input[ $key ], 'colorpicker', $field_id . '-' . $key );
668
+ }
669
+ }
670
+ }
671
+
672
+ array_filter( $input_safe );
673
+ } elseif ( 'measurement' === $type ) {
674
+
675
+ $input_safe = array();
676
+
677
+ foreach ( $input as $key => $value ) {
678
+ if ( ! empty( $value ) ) {
679
+ $input_safe[ $key ] = sanitize_text_field( $value );
680
+ }
681
+ }
682
+ } elseif ( 'numeric-slider' === $type ) {
683
+ $input_safe = '';
684
+
685
+ if ( ! empty( $input ) ) {
686
+ if ( ! is_numeric( $input ) ) {
687
+ add_settings_error( 'option-tree', 'invalid_numeric_slider', sprintf( $string_nums, '<code>' . esc_html__( 'slider', 'option-tree' ) . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
688
+ } else {
689
+ $input_safe = sanitize_text_field( $input );
690
+ }
691
+ }
692
+ } elseif ( 'on-off' === $type ) {
693
+ $input_safe = '';
694
+
695
+ if ( ! empty( $input ) ) {
696
+ $input_safe = sanitize_text_field( $input );
697
+ }
698
+ } elseif ( 'radio' === $type || 'radio-image' === $type || 'select' === $type || 'sidebar-select' === $type ) {
699
+ $input_safe = '';
700
+
701
+ if ( ! empty( $input ) ) {
702
+ $input_safe = sanitize_text_field( $input );
703
+ }
704
+ } elseif ( 'spacing' === $type ) {
705
+
706
+ $input_safe = array();
707
+
708
+ // Loop over array and set errors.
709
+ foreach ( $input as $key => $value ) {
710
+ if ( ! empty( $value ) ) {
711
+ if ( ! is_numeric( $value ) && 'unit' !== $key ) {
712
+ add_settings_error( 'option-tree', 'invalid_spacing_' . $key, sprintf( $string_nums, '<code>' . $key . '</code>', '<code>' . $field_id . '</code>' ), 'error' );
713
+ } else {
714
+ $input_safe[ $key ] = sanitize_text_field( $value );
715
+ }
716
+ }
717
+ }
718
+ } elseif ( 'typography' === $type && isset( $input['font-color'] ) ) {
719
+
720
+ $input_safe = array();
721
+
722
+ // Loop over array and check for values.
723
+ foreach ( $input as $key => $value ) {
724
+ if ( 'font-color' === $key ) {
725
+ $input_safe[ $key ] = ot_validate_setting( $value, 'colorpicker', $field_id );
726
+ } else {
727
+ $input_safe[ $key ] = sanitize_text_field( $value );
728
+ }
729
+ }
730
+ } elseif ( 'upload' === $type ) {
731
+
732
+ $input_safe = filter_var( $input, FILTER_VALIDATE_INT );
733
+
734
+ if ( false === $input_safe && is_string( $input ) ) {
735
+ $input_safe = esc_url_raw( $input );
736
+ }
737
+ } elseif ( 'url' === $type ) {
738
+
739
+ $input_safe = '';
740
+
741
+ if ( ! empty( $input ) ) {
742
+ $input_safe = esc_url_raw( $input );
743
+ }
744
+ } elseif ( 'weforms' === $type ) {
745
+
746
+ $input_safe = '';
747
+
748
+ if ( ! empty( $input ) ) {
749
+ $input_safe = (int)$input;
750
+ }
751
+ } else {
752
+
753
+ /* translators: %1$s: the calling function, %2$s the filter name, %3$s the option type, %4$s the version number */
754
+ $string_error = esc_html__( 'Notice: %1$s was called incorrectly. All stored data must be filtered through %2$s, the %3$s option type is not using this filter. This is required since version %4$s.', 'option-tree' );
755
+
756
+ // Log a user notice that things have changed since the last version.
757
+ //add_settings_error( 'option-tree', 'ot_validate_setting_error', sprintf( $string_error, '<code>ot_validate_setting</code>', '<code>ot_validate_setting_input_safe</code>', '<code>' . $type . '</code>', '<code>2.7.0</code>' ), 'error' );
758
+
759
+ $input_safe = '';
760
+
761
+ /*
762
+ * We don't know what the setting type is, so fallback to `sanitize_textarea_field`
763
+ * on all values and do a best-effort sanitize of the user data before saving it.
764
+ */
765
+ if ( ! is_object( $input ) ) {
766
+
767
+ // Contains an integer, float, string or boolean.
768
+ if ( is_scalar( $input ) ) {
769
+ $input_safe = sanitize_textarea_field( $input );
770
+ } else {
771
+ if ( ! function_exists( '_sanitize_recursive' ) ) {
772
+ /**
773
+ * Filter the array values recursively.
774
+ *
775
+ * @param array $values The value to sanitize.
776
+ *
777
+ * @return array
778
+ */
779
+ function _sanitize_recursive( $values = array() ) {
780
+ $result = array();
781
+ foreach ( $values as $key => $value ) {
782
+ if ( ! is_object( $value ) ) {
783
+ if ( is_scalar( $value ) ) {
784
+ $result[ $key ] = sanitize_textarea_field( $value );
785
+ } else {
786
+ $result[ $key ] = _sanitize_recursive( $value );
787
+ }
788
+ }
789
+ }
790
+
791
+ return $result;
792
+ }
793
+ }
794
+ $input_safe = _sanitize_recursive( $input );
795
+ }
796
+ }
797
+ }
798
+
799
+ // WPML Register and Unregister strings.
800
+ if ( ! empty( $wmpl_id ) ) {
801
+
802
+ // Allow filtering on the WPML option types.
803
+ $single_string_types = apply_filters( 'ot_wpml_option_types', array( 'text', 'textarea', 'textarea-simple' ) );
804
+
805
+ if ( in_array( $type, $single_string_types, true ) ) {
806
+ if ( ! empty( $input_safe ) ) {
807
+ ot_wpml_register_string( $wmpl_id, $input_safe );
808
+ } else {
809
+ ot_wpml_unregister_string( $wmpl_id );
810
+ }
811
+ }
812
+ }
813
+
814
+ /**
815
+ * Filter to modify the validated setting field value.
816
+ *
817
+ * It's important to note that the filter does not have access to
818
+ * the original value and can only modify the validated input value.
819
+ * This is a breaking change as of version 2.7.0.
820
+ *
821
+ * @param mixed $input_safe The setting field value.
822
+ * @param string $type The setting field type.
823
+ * @param string $field_id The setting field ID.
824
+ */
825
+ $input_safe = apply_filters( 'ot_after_validate_setting', $input_safe, $type, $field_id );
826
+
827
+ return $input_safe;
828
+ }
829
+ }
830
+
831
+ if ( ! function_exists( 'ot_admin_styles' ) ) {
832
+
833
+ /**
834
+ * Setup the default admin styles
835
+ *
836
+ * @access public
837
+ * @since 2.0
838
+ */
839
+ function ot_admin_styles() {
840
+ global $wp_styles, $post;
841
+
842
+ wp_enqueue_style('wp-jquery-ui-dialog');
843
+
844
+ // Execute styles before actions.
845
+ do_action( 'ot_admin_styles_before' );
846
+
847
+ // Load WP colorpicker.
848
+ wp_enqueue_style( 'wp-color-picker' );
849
+
850
+
851
+ // Load admin styles.
852
+ wp_enqueue_style( 'ot-admin-css', OT_URL . 'assets/css/ot-admin.css', false, OT_VERSION );
853
+
854
+ // Load the RTL stylesheet.
855
+ $wp_styles->add_data( 'ot-admin-css', 'rtl', true );
856
+
857
+ // Remove styles added by the Easy Digital Downloads plugin.
858
+ if ( isset( $post->post_type ) && 'post' === $post->post_type ) {
859
+ wp_dequeue_style( 'jquery-ui-css' );
860
+ }
861
+
862
+ /**
863
+ * Filter the screen IDs used to dequeue `jquery-ui-css`.
864
+ *
865
+ * @since 2.5.0
866
+ *
867
+ * @param array $screen_ids An array of screen IDs.
868
+ */
869
+ $screen_ids = apply_filters(
870
+ 'ot_dequeue_jquery_ui_css_screen_ids',
871
+ array(
872
+ 'toplevel_page_ot-settings',
873
+ 'optiontree_page_ot-documentation',
874
+ 'appearance_page_ot-theme-options',
875
+ )
876
+ );
877
+
878
+ // Remove styles added by the WP Review plugin and any custom pages added through filtering.
879
+ $screen = get_current_screen();
880
+ if ( in_array( $screen->id, $screen_ids, true ) ) {
881
+ wp_dequeue_style( 'plugin_name-admin-ui-css' );
882
+ wp_dequeue_style( 'jquery-ui-css' );
883
+ }
884
+
885
+ if ($screen->id !== 'toplevel_page_niftycs-options') {
886
+ wp_dequeue_style( 'ot-admin-css' );
887
+ }
888
+
889
+ // Execute styles after actions.
890
+ do_action( 'ot_admin_styles_after' );
891
+ }
892
+ }
893
+
894
+ if ( ! function_exists( 'ot_admin_scripts' ) ) {
895
+
896
+ /**
897
+ * Setup the default admin scripts.
898
+ *
899
+ * @uses add_thickbox() Include Thickbox for file uploads.
900
+ * @uses wp_enqueue_script() Add OptionTree scripts.
901
+ * @uses wp_localize_script() Used to include arbitrary Javascript data.
902
+ *
903
+ * @access public
904
+ * @since 2.0
905
+ */
906
+ function ot_admin_scripts() {
907
+
908
+ // Execute scripts before actions.
909
+ do_action( 'ot_admin_scripts_before' );
910
+
911
+ if ( function_exists( 'wp_enqueue_media' ) ) {
912
+ // WP 3.5 Media Uploader.
913
+ wp_enqueue_media();
914
+ } else {
915
+ // Legacy Thickbox.
916
+ add_thickbox();
917
+ }
918
+
919
+ // Load jQuery-ui slider.
920
+ wp_enqueue_script( 'jquery-ui-slider' );
921
+
922
+ // Load jQuery-ui datepicker.
923
+ wp_enqueue_script( 'jquery-ui-datepicker' );
924
+
925
+ // Load WP colorpicker.
926
+ wp_enqueue_script( 'wp-color-picker' );
927
+
928
+ // Load Ace Editor for CSS Editing.
929
+ wp_enqueue_script( 'ace-editor', 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.3/ace.js', null, '1.1.3', false );
930
+
931
+ // Load jQuery UI timepicker addon.
932
+ wp_enqueue_script( 'jquery-ui-timepicker', OT_URL . 'assets/js/vendor/jquery/jquery-ui-timepicker.js', array( 'jquery', 'jquery-ui-slider', 'jquery-ui-datepicker' ), '1.4.3', false );
933
+
934
+ // Load the post formats.
935
+ if ( true === OT_META_BOXES && true === OT_POST_FORMATS ) {
936
+ wp_enqueue_script( 'ot-postformats', OT_URL . 'assets/js/ot-postformats.js', array( 'jquery' ), '1.0.1', false );
937
+ }
938
+
939
+
940
+
941
+
942
+ // Load all the required scripts.
943
+ wp_enqueue_script('jquery-ui-dialog');
944
+ wp_enqueue_script( 'ot-admin-js', OT_URL . 'assets/js/ot-admin.js', array( 'jquery', 'jquery-ui-tabs', 'jquery-ui-sortable', 'jquery-ui-slider', 'wp-color-picker', 'ace-editor', 'jquery-ui-datepicker', 'jquery-ui-timepicker','jquery-ui-dialog' ), OT_VERSION, false );
945
+
946
+ // Create localized JS array.
947
+ $localized_array = array(
948
+ 'ajax' => admin_url( 'admin-ajax.php' ),
949
+ 'nonce' => wp_create_nonce( 'option_tree' ),
950
+ 'upload_text' => apply_filters( 'ot_upload_text', __( 'Send to OptionTree', 'option-tree' ) ),
951
+ 'remove_media_text' => esc_html__( 'Remove Media', 'option-tree' ),
952
+ 'reset_agree' => esc_html__( 'Are you sure you want to reset back to the defaults?', 'option-tree' ),
953
+ 'remove_no' => esc_html__( 'You can\'t remove this! But you can edit the values.', 'option-tree' ),
954
+ 'remove_agree' => esc_html__( 'Are you sure you want to remove this?', 'option-tree' ),
955
+ 'activate_layout_agree' => esc_html__( 'Are you sure you want to activate this layout?', 'option-tree' ),
956
+ 'setting_limit' => esc_html__( 'Sorry, you can\'t have settings three levels deep.', 'option-tree' ),
957
+ 'delete' => esc_html__( 'Delete Gallery', 'option-tree' ),
958
+ 'edit' => esc_html__( 'Edit Gallery', 'option-tree' ),
959
+ 'create' => esc_html__( 'Create Gallery', 'option-tree' ),
960
+ 'confirm' => esc_html__( 'Are you sure you want to delete this Gallery?', 'option-tree' ),
961
+ 'date_current' => esc_html__( 'Today', 'option-tree' ),
962
+ 'date_time_current' => esc_html__( 'Now', 'option-tree' ),
963
+ 'date_close' => esc_html__( 'Close', 'option-tree' ),
964
+ 'replace' => esc_html__( 'Featured Image', 'option-tree' ),
965
+ 'with' => esc_html__( 'Image', 'option-tree' ),
966
+ 'weforms_dialog_upsell_title' => '<img alt="' . __('weForms', 'option-tree') . '" title="' . __('weForms', 'option-tree') . '" src="' . OT_URL . '/assets/images/weforms-logo-white.png' . '">',
967
+ 'weforms_install_url' => add_query_arg(array('action' => 'install_weforms'), admin_url('admin.php')),
968
+ );
969
+
970
+ // Localized script attached to 'option_tree'.
971
+ wp_localize_script( 'ot-admin-js', 'option_tree', $localized_array );
972
+
973
+ // Execute scripts after actions.
974
+ do_action( 'ot_admin_scripts_after' );
975
+ }
976
+ }
977
+
978
+ if ( ! function_exists( 'ot_get_media_post_ID' ) ) {
979
+
980
+ /**
981
+ * Returns the ID of a custom post type by post_title.
982
+ *
983
+ * @return int
984
+ *
985
+ * @access public
986
+ * @since 2.0
987
+ * @updated 2.7.0
988
+ */
989
+ function ot_get_media_post_ID() { // phpcs:ignore
990
+
991
+ // Option ID.
992
+ $option_id = 'ot_media_post_ID';
993
+
994
+ // Get the media post ID.
995
+ $post_ID = get_option( $option_id, false );
996
+
997
+ // Add $post_ID to the DB.
998
+ if ( false === $post_ID || empty( $post_ID ) || ! is_integer( $post_ID ) ) {
999
+ global $wpdb;
1000
+
1001
+ // Get the media post ID.
1002
+ $post_ID = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts p WHERE p.post_title = %s AND p.post_type = %s AND p.post_status = %s", 'Media', 'option-tree', 'private' ) ); // phpcs:ignore
1003
+
1004
+ // Add to the DB.
1005
+ if ( null !== $post_ID && 0 < $post_ID ) {
1006
+ update_option( $option_id, $post_ID );
1007
+ } else {
1008
+ $post_ID = 0;
1009
+ }
1010
+ }
1011
+
1012
+ return $post_ID;
1013
+ }
1014
+ }
1015
+
1016
+ if ( ! function_exists( 'ot_create_media_post' ) ) {
1017
+
1018
+ /**
1019
+ * Register custom post type & create the media post used to attach images.
1020
+ *
1021
+ * @access public
1022
+ * @since 2.0
1023
+ */
1024
+ function ot_create_media_post() {
1025
+
1026
+ register_post_type(
1027
+ 'option-tree',
1028
+ array(
1029
+ 'labels' => array( 'name' => esc_html__( 'Option Tree', 'option-tree' ) ),
1030
+ 'public' => false,
1031
+ 'show_ui' => false,
1032
+ 'capability_type' => 'post',
1033
+ 'exclude_from_search' => true,
1034
+ 'hierarchical' => false,
1035
+ 'rewrite' => false,
1036
+ 'supports' => array( 'title', 'editor' ),
1037
+ 'can_export' => false,
1038
+ 'show_in_nav_menus' => false,
1039
+ )
1040
+ );
1041
+
1042
+ // Look for custom page.
1043
+ $post_id = ot_get_media_post_ID();
1044
+
1045
+ // No post exists.
1046
+ if ( 0 === $post_id ) {
1047
+
1048
+ // Insert the post into the database.
1049
+ wp_insert_post(
1050
+ array(
1051
+ 'post_title' => 'Media',
1052
+ 'post_name' => 'media',
1053
+ 'post_status' => 'private',
1054
+ 'post_type' => 'option-tree',
1055
+ 'comment_status' => 'closed',
1056
+ 'ping_status' => 'closed',
1057
+ )
1058
+ );
1059
+ }
1060
+ }
1061
+ }
1062
+
1063
+ if ( ! function_exists( 'ot_default_settings' ) ) {
1064
+
1065
+ /**
1066
+ * Setup default settings array.
1067
+ *
1068
+ * @access public
1069
+ * @since 2.0
1070
+ */
1071
+ function ot_default_settings() {
1072
+ global $wpdb;
1073
+
1074
+ if ( ! get_option( ot_settings_id() ) ) {
1075
+
1076
+ $section_count = 0;
1077
+ $settings_count = 0;
1078
+ $settings = array();
1079
+ $table_name = $wpdb->prefix . 'option_tree';
1080
+
1081
+ $find_table = wp_cache_get( 'find_table', 'option_tree' );
1082
+ if ( false === $find_table ) {
1083
+ $find_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ); // phpcs:ignore
1084
+ wp_cache_set( 'find_table', $find_table, 'option_tree', 86400 );
1085
+ }
1086
+
1087
+ if ( $find_table === $table_name ) {
1088
+
1089
+ $old_settings = wp_cache_get( 'old_settings', 'option_tree' );
1090
+ if ( false === $old_settings ) {
1091
+ $old_settings = $wpdb->get_results( "SELECT * FROM ${table_name} ORDER BY item_sort ASC" ); // phpcs:ignore
1092
+ wp_cache_set( 'old_settings', $old_settings, 'option_tree', 86400 );
1093
+ }
1094
+
1095
+ if ( ! $old_settings ) {
1096
+ return;
1097
+ }
1098
+
1099
+ foreach ( $old_settings as $setting ) {
1100
+
1101
+ // Heading is a section now.
1102
+ if ( 'heading' === $setting->item_type ) {
1103
+
1104
+ // Add section to the sections array.
1105
+ $settings['sections'][ $section_count ]['id'] = $setting->item_id;
1106
+ $settings['sections'][ $section_count ]['title'] = $setting->item_title;
1107
+
1108
+ // Ssave the last section id to use in creating settings.
1109
+ $section = $setting->item_id;
1110
+
1111
+ // Increment the section count.
1112
+ $section_count++;
1113
+
1114
+ } else {
1115
+
1116
+ // Add setting to the settings array.
1117
+ $settings['settings'][ $settings_count ]['id'] = $setting->item_id;
1118
+ $settings['settings'][ $settings_count ]['label'] = $setting->item_title;
1119
+ $settings['settings'][ $settings_count ]['desc'] = $setting->item_desc;
1120
+ $settings['settings'][ $settings_count ]['section'] = $section;
1121
+ $settings['settings'][ $settings_count ]['type'] = ot_map_old_option_types( $setting->item_type );
1122
+ $settings['settings'][ $settings_count ]['std'] = '';
1123
+ $settings['settings'][ $settings_count ]['class'] = '';
1124
+
1125
+ // Textarea rows.
1126
+ $rows = '';
1127
+ if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'css', 'javascript', 'textarea' ), true ) ) {
1128
+ if ( (int) $setting->item_options > 0 ) {
1129
+ $rows = (int) $setting->item_options;
1130
+ } else {
1131
+ $rows = 15;
1132
+ }
1133
+ }
1134
+ $settings['settings'][ $settings_count ]['rows'] = $rows;
1135
+
1136
+ // Post type.
1137
+ $post_type = '';
1138
+ if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'custom-post-type-select', 'custom-post-type-checkbox' ), true ) ) {
1139
+ if ( '' !== $setting->item_options ) {
1140
+ $post_type = $setting->item_options;
1141
+ } else {
1142
+ $post_type = 'post';
1143
+ }
1144
+ }
1145
+ $settings['settings'][ $settings_count ]['post_type'] = $post_type;
1146
+
1147
+ // Cchoices.
1148
+ $choices = array();
1149
+ if ( in_array( $settings['settings'][ $settings_count ]['type'], array( 'checkbox', 'radio', 'select' ), true ) ) {
1150
+ if ( '' !== $setting->item_options ) {
1151
+ $choices = ot_convert_string_to_array( $setting->item_options );
1152
+ }
1153
+ }
1154
+ $settings['settings'][ $settings_count ]['choices'] = $choices;
1155
+
1156
+ $settings_count++;
1157
+ }
1158
+ }
1159
+
1160
+ // Make sure each setting has a section just in case.
1161
+ if ( isset( $settings['sections'] ) && isset( $settings['settings'] ) ) {
1162
+ foreach ( $settings['settings'] as $k => $setting ) {
1163
+ if ( '' === $setting['section'] ) {
1164
+ $settings['settings'][ $k ]['section'] = $settings['sections'][0]['id'];
1165
+ }
1166
+ }
1167
+ }
1168
+ }
1169
+
1170
+ // If array if not properly formed create fallback settings array.
1171
+ if ( ! isset( $settings['sections'] ) || ! isset( $settings['settings'] ) ) {
1172
+
1173
+ $settings = array(
1174
+ 'sections' => array(
1175
+ array(
1176
+ 'id' => 'general',
1177
+ 'title' => esc_html__( 'General', 'option-tree' ),
1178
+ ),
1179
+ ),
1180
+ 'settings' => array(
1181
+ array(
1182
+ 'id' => 'sample_text',
1183
+ 'label' => esc_html__( 'Sample Text Field Label', 'option-tree' ),
1184
+ 'desc' => esc_html__( 'Description for the sample text field.', 'option-tree' ),
1185
+ 'section' => 'general',
1186
+ 'type' => 'text',
1187
+ 'std' => '',
1188
+ 'class' => '',
1189
+ 'rows' => '',
1190
+ 'post_type' => '',
1191
+ 'choices' => array(),
1192
+ ),
1193
+ ),
1194
+ );
1195
+ }
1196
+
1197
+ // Update the settings array.
1198
+ update_option( ot_settings_id(), $settings );
1199
+
1200
+ // Get option tree array.
1201
+ $options = get_option( ot_options_id() );
1202
+
1203
+ $options_safe = array();
1204
+
1205
+ // Validate options.
1206
+ if ( is_array( $options ) ) {
1207
+
1208
+ foreach ( $settings['settings'] as $setting ) {
1209
+ if ( isset( $options[ $setting['id'] ] ) ) {
1210
+ $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1211
+ }
1212
+ }
1213
+
1214
+ // Execute the action hook and pass the theme options to it.
1215
+ do_action( 'ot_before_theme_options_save', $options_safe );
1216
+
1217
+ // Update the option tree array.
1218
+ update_option( ot_options_id(), $options_safe );
1219
+ }
1220
+ }
1221
+ }
1222
+ }
1223
+
1224
+ if ( ! function_exists( 'ot_save_css' ) ) {
1225
+
1226
+ /**
1227
+ * Helper function to update the CSS option type after save.
1228
+ *
1229
+ * This function is called during the `ot_after_theme_options_save` hook,
1230
+ * which is passed the currently stored options array.
1231
+ *
1232
+ * @param array $options The current stored options array.
1233
+ *
1234
+ * @access public
1235
+ * @since 2.0
1236
+ */
1237
+ function ot_save_css( $options ) {
1238
+
1239
+ // Grab a copy of the settings.
1240
+ $settings = get_option( ot_settings_id() );
1241
+
1242
+ // Has settings.
1243
+ if ( isset( $settings['settings'] ) ) {
1244
+
1245
+ // Loop through sections and insert CSS when needed.
1246
+ foreach ( $settings['settings'] as $k => $setting ) {
1247
+
1248
+ // Is the CSS option type.
1249
+ if ( isset( $setting['type'] ) && 'css' === $setting['type'] ) {
1250
+
1251
+ // Insert CSS into dynamic.css.
1252
+ if ( isset( $options[ $setting['id'] ] ) && '' !== $options[ $setting['id'] ] ) {
1253
+ ot_insert_css_with_markers( $setting['id'], $options[ $setting['id'] ] );
1254
+
1255
+ // Remove old CSS from dynamic.css.
1256
+ } else {
1257
+ ot_remove_old_css( $setting['id'] );
1258
+ }
1259
+ }
1260
+ }
1261
+ }
1262
+ }
1263
+ }
1264
+
1265
+ if ( ! function_exists( 'ot_import' ) ) {
1266
+
1267
+ /**
1268
+ * Import before the screen is displayed.
1269
+ *
1270
+ * @access public
1271
+ * @since 2.0
1272
+ */
1273
+ function ot_import() {
1274
+
1275
+ // Check and verify import settings nonce.
1276
+ if ( isset( $_POST['import_settings_nonce'] ) && wp_verify_nonce( $_POST['import_settings_nonce'], 'import_settings_form' ) ) { // phpcs:ignore
1277
+
1278
+ // Default message.
1279
+ $message = 'failed';
1280
+
1281
+ $settings = isset( $_POST['import_settings'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_settings'] ) ) ) : array();
1282
+
1283
+ if ( is_array( $settings ) && ! empty( $settings ) ) {
1284
+
1285
+ $settings_safe = ot_validate_settings( $settings );
1286
+
1287
+ // Save & show success message.
1288
+ if ( is_array( $settings_safe ) ) {
1289
+ update_option( ot_settings_id(), $settings_safe );
1290
+ $message = 'success';
1291
+ }
1292
+ }
1293
+
1294
+ // Redirect back to self.
1295
+ wp_safe_redirect(
1296
+ esc_url_raw(
1297
+ add_query_arg(
1298
+ array(
1299
+ 'action' => 'import-settings',
1300
+ 'message' => $message,
1301
+ ),
1302
+ wp_get_referer()
1303
+ )
1304
+ )
1305
+ );
1306
+ exit;
1307
+ }
1308
+
1309
+ // Check and verify import theme options data nonce.
1310
+ if ( isset( $_POST['import_data_nonce'] ) && wp_verify_nonce( $_POST['import_data_nonce'], 'import_data_form' ) ) { // phpcs:ignore
1311
+
1312
+ // Default message.
1313
+ $message = 'failed';
1314
+ $options = isset( $_POST['import_data'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_data'] ) ) ) : array();
1315
+
1316
+ if ( $options ) {
1317
+
1318
+ $options_safe = array();
1319
+
1320
+ // Get settings array.
1321
+ $settings = get_option( ot_settings_id() );
1322
+
1323
+ // Has options.
1324
+ if ( is_array( $options ) ) {
1325
+
1326
+ // Validate options.
1327
+ if ( is_array( $settings ) ) {
1328
+ foreach ( $settings['settings'] as $setting ) {
1329
+ if ( isset( $options[ $setting['id'] ] ) ) {
1330
+ $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1331
+ }
1332
+ }
1333
+ }
1334
+
1335
+ // Execute the action hook and pass the theme options to it.
1336
+ do_action( 'ot_before_theme_options_save', $options_safe );
1337
+
1338
+ // Update the option tree array.
1339
+ update_option( ot_options_id(), $options_safe );
1340
+
1341
+ $message = 'success';
1342
+ }
1343
+ }
1344
+
1345
+ // Redirect back to self.
1346
+ wp_safe_redirect(
1347
+ esc_url_raw(
1348
+ add_query_arg(
1349
+ array(
1350
+ 'action' => 'import-data',
1351
+ 'message' => $message,
1352
+ ),
1353
+ wp_get_referer()
1354
+ )
1355
+ )
1356
+ );
1357
+ exit;
1358
+ }
1359
+
1360
+ // Check and verify import layouts nonce.
1361
+ if ( isset( $_POST['import_layouts_nonce'] ) && wp_verify_nonce( $_POST['import_layouts_nonce'], 'import_layouts_form' ) ) { // phpcs:ignore
1362
+
1363
+ // Default message.
1364
+ $message = 'failed';
1365
+ $layouts = isset( $_POST['import_layouts'] ) ? ot_decode( sanitize_text_field( wp_unslash( $_POST['import_layouts'] ) ) ) : array();
1366
+
1367
+ if ( $layouts ) {
1368
+
1369
+ // Get settings array.
1370
+ $settings = get_option( ot_settings_id() );
1371
+
1372
+ // Has layouts.
1373
+ if ( is_array( $layouts ) && ! empty( $layouts ) && ! empty( $layouts['active_layout'] ) ) {
1374
+
1375
+ $layouts_safe = array(
1376
+ 'active_layout' => esc_attr( $layouts['active_layout'] ),
1377
+ );
1378
+
1379
+ // Validate options.
1380
+ if ( is_array( $settings ) ) {
1381
+
1382
+ foreach ( $layouts as $key => $value ) {
1383
+
1384
+ if ( 'active_layout' === $key ) {
1385
+ continue;
1386
+ }
1387
+
1388
+ // Convert the options to an array.
1389
+ $options = ot_decode( $value );
1390
+
1391
+ $options_safe = array();
1392
+
1393
+ foreach ( $settings['settings'] as $setting ) {
1394
+ if ( isset( $options[ $setting['id'] ] ) ) {
1395
+ $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
1396
+ }
1397
+ }
1398
+
1399
+ // Store the sanitized values for later.
1400
+ if ( $key === $layouts['active_layout'] ) {
1401
+ $new_options_safe = $options_safe;
1402
+ }
1403
+
1404
+ $layouts_safe[ $key ] = ot_encode( $options_safe );
1405
+ }
1406
+ }
1407
+
1408
+ // Update the option tree array with sanitized values.
1409
+ if ( isset( $new_options_safe ) ) {
1410
+
1411
+ // Execute the action hook and pass the theme options to it.
1412
+ do_action( 'ot_before_theme_options_save', $new_options_safe );
1413
+
1414
+ update_option( ot_options_id(), $new_options_safe );
1415
+ }
1416
+
1417
+ // Update the option tree layouts array.
1418
+ update_option( ot_layouts_id(), $layouts_safe );
1419
+
1420
+ $message = 'success';
1421
+ }
1422
+ }
1423
+
1424
+ // Redirect back to self.
1425
+ wp_safe_redirect(
1426
+ esc_url_raw(
1427
+ add_query_arg(
1428
+ array(
1429
+ 'action' => 'import-layouts',
1430
+ 'message' => $message,
1431
+ ),
1432
+ wp_get_referer()
1433
+ )
1434
+ )
1435
+ );
1436
+ exit;
1437
+ }
1438
+
1439
+ return false;
1440
+ }
1441
+ }
1442
+
1443
+ if ( ! function_exists( 'ot_export' ) ) {
1444
+
1445
+ /**
1446
+ * Export before the screen is displayed.
1447
+ *
1448
+ * @return void
1449
+ *
1450
+ * @access public
1451
+ * @since 2.0.8
1452
+ */
1453
+ function ot_export() {
1454
+
1455
+ // Check and verify export settings file nonce.
1456
+ if ( isset( $_POST['export_settings_file_nonce'] ) && wp_verify_nonce( $_POST['export_settings_file_nonce'], 'export_settings_file_form' ) ) { // phpcs:ignore
1457
+ ot_export_php_settings_array();
1458
+ }
1459
+ }
1460
+ }
1461
+
1462
+ if ( ! function_exists( 'ot_export_php_settings_array' ) ) {
1463
+
1464
+ /**
1465
+ * Export the Theme Mode theme-options.php
1466
+ *
1467
+ * @access public
1468
+ * @since 2.0.8
1469
+ */
1470
+ function ot_export_php_settings_array() {
1471
+
1472
+ $content = '';
1473
+ $build_settings = '';
1474
+ $contextual_help = '';
1475
+ $sections = '';
1476
+ $settings = '';
1477
+ $option_tree_settings = get_option( ot_settings_id(), array() );
1478
+
1479
+ /**
1480
+ * Domain string helper.
1481
+ *
1482
+ * @param string $string A string.
1483
+ * @return string
1484
+ */
1485
+ function ot_i18n_string( $string ) {
1486
+ if ( ! empty( $string ) && isset( $_POST['domain'] ) && ! empty( $_POST['domain'] ) ) { // phpcs:ignore
1487
+ $domain = str_replace( ' ', '-', trim( sanitize_text_field( wp_unslash( $_POST['domain'] ) ) ) ); // phpcs:ignore
1488
+ return "esc_html__( '$string', '$domain' )";
1489
+ }
1490
+ return "'$string'";
1491
+ }
1492
+
1493
+ header( 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' );
1494
+ header( 'Pragma: no-cache ' );
1495
+ header( 'Content-Description: File Transfer' );
1496
+ header( 'Content-Disposition: attachment; filename="theme-options.php"' );
1497
+ header( 'Content-Type: application/octet-stream' );
1498
+ header( 'Content-Transfer-Encoding: binary' );
1499
+
1500
+ // Build contextual help content.
1501
+ if ( isset( $option_tree_settings['contextual_help']['content'] ) ) {
1502
+ $help = '';
1503
+ foreach ( $option_tree_settings['contextual_help']['content'] as $value ) {
1504
+ $_id = isset( $value['id'] ) ? $value['id'] : '';
1505
+ $_title = ot_i18n_string( isset( $value['title'] ) ? str_replace( "'", "\'", $value['title'] ) : '' );
1506
+ $_content = ot_i18n_string( isset( $value['content'] ) ? html_entity_decode( str_replace( "'", "\'", $value['content'] ) ) : '' );
1507
+ $help .= "
1508
+ array(
1509
+ 'id' => '$_id',
1510
+ 'title' => $_title,
1511
+ 'content' => $_content,
1512
+ ),";
1513
+ }
1514
+ $contextual_help = "
1515
+ 'content' => array($help
1516
+ ),";
1517
+ }
1518
+
1519
+ // Build contextual help sidebar.
1520
+ if ( isset( $option_tree_settings['contextual_help']['sidebar'] ) ) {
1521
+ $_sidebar = ot_i18n_string( html_entity_decode( str_replace( "'", "\'", $option_tree_settings['contextual_help']['sidebar'] ) ) );
1522
+ $contextual_help .= "
1523
+ 'sidebar' => $_sidebar,";
1524
+ }
1525
+
1526
+ // Check that $contexual_help has a value and add to $build_settings.
1527
+ if ( '' !== $contextual_help ) {
1528
+ $build_settings .= "
1529
+ 'contextual_help' => array($contextual_help
1530
+ ),";
1531
+ }
1532
+
1533
+ // Build sections.
1534
+ if ( isset( $option_tree_settings['sections'] ) ) {
1535
+ foreach ( $option_tree_settings['sections'] as $value ) {
1536
+ $_id = isset( $value['id'] ) ? $value['id'] : '';
1537
+ $_title = ot_i18n_string( isset( $value['title'] ) ? str_replace( "'", "\'", $value['title'] ) : '' );
1538
+ $sections .= "
1539
+ array(
1540
+ 'id' => '$_id',
1541
+ 'title' => $_title,
1542
+ ),";
1543
+ }
1544
+ }
1545
+
1546
+ // Check that $sections has a value and add to $build_settings.
1547
+ if ( '' !== $sections ) {
1548
+ $build_settings .= "
1549
+ 'sections' => array($sections
1550
+ )";
1551
+ }
1552
+
1553
+ /* build settings */
1554
+ if ( isset( $option_tree_settings['settings'] ) ) {
1555
+ foreach ( $option_tree_settings['settings'] as $value ) {
1556
+ $_id = isset( $value['id'] ) ? $value['id'] : '';
1557
+ $_label = ot_i18n_string( isset( $value['label'] ) ? str_replace( "'", "\'", $value['label'] ) : '' );
1558
+ $_desc = ot_i18n_string( isset( $value['desc'] ) ? str_replace( "'", "\'", $value['desc'] ) : '' );
1559
+ $_std = isset( $value['std'] ) ? str_replace( "'", "\'", $value['std'] ) : '';
1560
+ $_type = isset( $value['type'] ) ? $value['type'] : '';
1561
+ $_section = isset( $value['section'] ) ? $value['section'] : '';
1562
+ $_rows = isset( $value['rows'] ) ? $value['rows'] : '';
1563
+ $_post_type = isset( $value['post_type'] ) ? $value['post_type'] : '';
1564
+ $_taxonomy = isset( $value['taxonomy'] ) ? $value['taxonomy'] : '';
1565
+ $_min_max_step = isset( $value['min_max_step'] ) ? $value['min_max_step'] : '';
1566
+ $_class = isset( $value['class'] ) ? $value['class'] : '';
1567
+ $_condition = isset( $value['condition'] ) ? $value['condition'] : '';
1568
+ $_operator = isset( $value['operator'] ) ? $value['operator'] : '';
1569
+
1570
+ $choices = '';
1571
+ if ( isset( $value['choices'] ) && ! empty( $value['choices'] ) ) {
1572
+ foreach ( $value['choices'] as $choice ) {
1573
+ $_choice_value = isset( $choice['value'] ) ? str_replace( "'", "\'", $choice['value'] ) : '';
1574
+ $_choice_label = ot_i18n_string( isset( $choice['label'] ) ? str_replace( "'", "\'", $choice['label'] ) : '' );
1575
+ $_choice_src = isset( $choice['src'] ) ? str_replace( "'", "\'", $choice['src'] ) : '';
1576
+ $choices .= "
1577
+ array(
1578
+ 'value' => '$_choice_value',
1579
+ 'label' => $_choice_label,
1580
+ 'src' => '$_choice_src',
1581
+ ),";
1582
+ }
1583
+ $choices = "
1584
+ 'choices' => array($choices
1585
+ ),";
1586
+ }
1587
+
1588
+ $std = "'$_std'";
1589
+ if ( is_array( $_std ) ) {
1590
+ $std_array = array();
1591
+ foreach ( $_std as $_sk => $_sv ) {
1592
+ $std_array[] = "'$_sk' => '$_sv',";
1593
+ }
1594
+ $std = 'array(
1595
+ ' . implode( ",\n", $std_array ) . '
1596
+ )';
1597
+ }
1598
+
1599
+ $setting_settings = '';
1600
+ if ( isset( $value['settings'] ) && ! empty( $value['settings'] ) ) {
1601
+ foreach ( $value['settings'] as $setting ) {
1602
+ $_setting_id = isset( $setting['id'] ) ? $setting['id'] : '';
1603
+ $_setting_label = ot_i18n_string( isset( $setting['label'] ) ? str_replace( "'", "\'", $setting['label'] ) : '' );
1604
+ $_setting_desc = ot_i18n_string( isset( $setting['desc'] ) ? str_replace( "'", "\'", $setting['desc'] ) : '' );
1605
+ $_setting_std = isset( $setting['std'] ) ? $setting['std'] : '';
1606
+ $_setting_type = isset( $setting['type'] ) ? $setting['type'] : '';
1607
+ $_setting_rows = isset( $setting['rows'] ) ? $setting['rows'] : '';
1608
+ $_setting_post_type = isset( $setting['post_type'] ) ? $setting['post_type'] : '';
1609
+ $_setting_taxonomy = isset( $setting['taxonomy'] ) ? $setting['taxonomy'] : '';
1610
+ $_setting_min_max_step = isset( $setting['min_max_step'] ) ? $setting['min_max_step'] : '';
1611
+ $_setting_class = isset( $setting['class'] ) ? $setting['class'] : '';
1612
+ $_setting_condition = isset( $setting['condition'] ) ? $setting['condition'] : '';
1613
+ $_setting_operator = isset( $setting['operator'] ) ? $setting['operator'] : '';
1614
+
1615
+ $setting_choices = '';
1616
+ if ( isset( $setting['choices'] ) && ! empty( $setting['choices'] ) ) {
1617
+ foreach ( $setting['choices'] as $setting_choice ) {
1618
+ $_setting_choice_value = isset( $setting_choice['value'] ) ? $setting_choice['value'] : '';
1619
+ $_setting_choice_label = ot_i18n_string( isset( $setting_choice['label'] ) ? str_replace( "'", "\'", $setting_choice['label'] ) : '' );
1620
+ $_setting_choice_src = isset( $setting_choice['src'] ) ? str_replace( "'", "\'", $setting_choice['src'] ) : '';
1621
+ $setting_choices .= "
1622
+ array(
1623
+ 'value' => '$_setting_choice_value',
1624
+ 'label' => $_setting_choice_label,
1625
+ 'src' => '$_setting_choice_src',
1626
+ ),";
1627
+ }
1628
+ $setting_choices = "
1629
+ 'choices' => array($setting_choices
1630
+ ),";
1631
+ }
1632
+
1633
+ $setting_std = "'$_setting_std'";
1634
+ if ( is_array( $_setting_std ) ) {
1635
+ $setting_std_array = array();
1636
+ foreach ( $_setting_std as $_ssk => $_ssv ) {
1637
+ $setting_std_array[] = "'$_ssk' => '$_ssv'";
1638
+ }
1639
+ $setting_std = 'array(
1640
+ ' . implode( ",\n", $setting_std_array ) . '
1641
+ )';
1642
+ }
1643
+
1644
+ $setting_settings .= "
1645
+ array(
1646
+ 'id' => '$_setting_id',
1647
+ 'label' => $_setting_label,
1648
+ 'desc' => $_setting_desc,
1649
+ 'std' => $setting_std,
1650
+ 'type' => '$_setting_type',
1651
+ 'rows' => '$_setting_rows',
1652
+ 'post_type' => '$_setting_post_type',
1653
+ 'taxonomy' => '$_setting_taxonomy',
1654
+ 'min_max_step' => '$_setting_min_max_step',
1655
+ 'class' => '$_setting_class',
1656
+ 'condition' => '$_setting_condition',
1657
+ 'operator' => '$_setting_operator',$setting_choices
1658
+ ),";
1659
+ }
1660
+ $setting_settings = "
1661
+ 'settings' => array( $setting_settings
1662
+ ),";
1663
+ }
1664
+ $settings .= "
1665
+ array(
1666
+ 'id' => '$_id',
1667
+ 'label' => $_label,
1668
+ 'desc' => $_desc,
1669
+ 'std' => $std,
1670
+ 'type' => '$_type',
1671
+ 'section' => '$_section',
1672
+ 'rows' => '$_rows',
1673
+ 'post_type' => '$_post_type',
1674
+ 'taxonomy' => '$_taxonomy',
1675
+ 'min_max_step' => '$_min_max_step',
1676
+ 'class' => '$_class',
1677
+ 'condition' => '$_condition',
1678
+ 'operator' => '$_operator',$choices$setting_settings
1679
+ ),";
1680
+ }
1681
+ }
1682
+
1683
+ // Check that $sections has a value and add to $build_settings.
1684
+ if ( '' !== $settings ) {
1685
+ $build_settings .= ",
1686
+ 'settings' => array($settings
1687
+ )";
1688
+ }
1689
+
1690
+ $content .= "<?php
1691
+ /**
1692
+ * Initialize the custom theme options.
1693
+ */
1694
+ add_action( 'init', 'custom_theme_options' );
1695
+
1696
+ /**
1697
+ * Build the custom settings & update OptionTree.
1698
+ */
1699
+ function custom_theme_options() {
1700
+
1701
+ // OptionTree is not loaded yet, or this is not an admin request.
1702
+ if ( ! function_exists( 'ot_settings_id' ) || ! is_admin() ) {
1703
+ return false;
1704
+ }
1705
+
1706
+ // Get a copy of the saved settings array.
1707
+ \$saved_settings = get_option( ot_settings_id(), array() );
1708
+
1709
+ // Custom settings array that will eventually be passes to the OptionTree Settings API Class.
1710
+ \$custom_settings = array($build_settings
1711
+ );
1712
+
1713
+ // Allow settings to be filtered before saving.
1714
+ \$custom_settings = apply_filters( ot_settings_id() . '_args', \$custom_settings );
1715
+
1716
+ // Settings are not the same update the DB.
1717
+ if ( \$saved_settings !== \$custom_settings ) {
1718
+ update_option( ot_settings_id(), \$custom_settings );
1719
+ }
1720
+
1721
+ // Lets OptionTree know the UI Builder is being overridden.
1722
+ global \$ot_has_custom_theme_options;
1723
+ \$ot_has_custom_theme_options = true;
1724
+ }
1725
+ ";
1726
+
1727
+ echo $content; // phpcs:ignore
1728
+ die();
1729
+ }
1730
+ }
1731
+
1732
+ if ( ! function_exists( 'ot_save_settings' ) ) {
1733
+
1734
+ /**
1735
+ * Save settings array before the screen is displayed.
1736
+ *
1737
+ * @return bool Redirects on save, false on failure.
1738
+ *
1739
+ * @access public
1740
+ * @since 2.0
1741
+ */
1742
+ function ot_save_settings() {
1743
+
1744
+ // Check and verify import settings nonce.
1745
+ if ( isset( $_POST['option_tree_settings_nonce'] ) && wp_verify_nonce( $_POST['option_tree_settings_nonce'], 'option_tree_settings_form' ) ) { // phpcs:ignore
1746
+
1747
+ // Settings value.
1748
+ $settings = isset( $_POST[ ot_settings_id() ] ) ? wp_unslash( $_POST[ ot_settings_id() ] ) : array(); // phpcs:ignore
1749
+
1750
+ $settings_safe = ot_validate_settings( $settings );
1751
+
1752
+ // Default message.
1753
+ $message = 'failed';
1754
+
1755
+ // Save & show success message.
1756
+ if ( ! empty( $settings_safe ) ) {
1757
+ ot_wpml_unregister( $settings_safe );
1758
+
1759
+ update_option( ot_settings_id(), $settings_safe );
1760
+ $message = 'success';
1761
+ }
1762
+
1763
+ // Redirect.
1764
+ wp_safe_redirect(
1765
+ esc_url_raw(
1766
+ add_query_arg(
1767
+ array(
1768
+ 'action' => 'save-settings',
1769
+ 'message' => $message,
1770
+ ),
1771
+ wp_get_referer()
1772
+ )
1773
+ )
1774
+ );
1775
+ exit;
1776
+ }
1777
+
1778
+ return false;
1779
+ }
1780
+ }
1781
+
1782
+ if ( ! function_exists( 'ot_wpml_unregister' ) ) {
1783
+
1784
+ /**
1785
+ * Unregister WPML strings based on settings changing.
1786
+ *
1787
+ * @param array $settings The array of settings.
1788
+ *
1789
+ * @access public
1790
+ * @since 2.7.0
1791
+ */
1792
+ function ot_wpml_unregister( $settings = array() ) {
1793
+
1794
+ // WPML unregister ID's that have been removed.
1795
+ if ( function_exists( 'icl_unregister_string' ) ) {
1796
+
1797
+ $current = get_option( ot_settings_id() );
1798
+ $options = get_option( ot_options_id() );
1799
+
1800
+ if ( isset( $current['settings'] ) ) {
1801
+
1802
+ // Empty ID array.
1803
+ $new_ids = array();
1804
+
1805
+ // Build the WPML IDs array.
1806
+ foreach ( $settings['settings'] as $setting ) {
1807
+ if ( $setting['id'] ) {
1808
+ $new_ids[] = $setting['id'];
1809
+ }
1810
+ }
1811
+
1812
+ // Remove missing IDs from WPML.
1813
+ foreach ( $current['settings'] as $current_setting ) {
1814
+ if ( ! in_array( $current_setting['id'], $new_ids, true ) ) {
1815
+ if ( ! empty( $options[ $current_setting['id'] ] ) && in_array( $current_setting['type'], array( 'list-item', 'slider' ), true ) ) {
1816
+ foreach ( $options[ $current_setting['id'] ] as $key => $value ) {
1817
+ foreach ( $value as $ckey => $cvalue ) {
1818
+ ot_wpml_unregister_string( $current_setting['id'] . '_' . $ckey . '_' . $key );
1819
+ }
1820
+ }
1821
+ } elseif ( ! empty( $options[ $current_setting['id'] ] ) && 'social-icons' === $current_setting['type'] ) {
1822
+ foreach ( $options[ $current_setting['id'] ] as $key => $value ) {
1823
+ foreach ( $value as $ckey => $cvalue ) {
1824
+ ot_wpml_unregister_string( $current_setting['id'] . '_' . $ckey . '_' . $key );
1825
+ }
1826
+ }
1827
+ } else {
1828
+ ot_wpml_unregister_string( $current_setting['id'] );
1829
+ }
1830
+ }
1831
+ }
1832
+ }
1833
+ }
1834
+ }
1835
+ }
1836
+
1837
+ if ( ! function_exists( 'ot_validate_settings' ) ) {
1838
+
1839
+ /**
1840
+ * Helper function to validate all settings.
1841
+ *
1842
+ * This includes the `sections`, `settings`, and `contextual_help` arrays.
1843
+ *
1844
+ * @param array $settings The array of settings.
1845
+ *
1846
+ * @return array
1847
+ *
1848
+ * @access public
1849
+ * @since 2.7.0
1850
+ */
1851
+ function ot_validate_settings( $settings = array() ) {
1852
+
1853
+ // Store the validated settings.
1854
+ $settings_safe = array();
1855
+
1856
+ // Validate sections.
1857
+ if ( isset( $settings['sections'] ) ) {
1858
+
1859
+ // Fix numeric keys since drag & drop will change them.
1860
+ $settings['sections'] = array_values( $settings['sections'] );
1861
+
1862
+ // Loop through sections.
1863
+ foreach ( $settings['sections'] as $k => $section ) {
1864
+
1865
+ // Skip if missing values.
1866
+ if ( ( ! isset( $section['title'] ) && ! isset( $section['id'] ) ) || ( '' === $section['title'] && '' === $section['id'] ) ) {
1867
+ continue;
1868
+ }
1869
+
1870
+ // Validate label.
1871
+ if ( '' !== $section['title'] ) {
1872
+ $settings_safe['sections'][ $k ]['title'] = wp_kses_post( $section['title'] );
1873
+ }
1874
+
1875
+ // Missing title set to unfiltered ID.
1876
+ if ( ! isset( $section['title'] ) || '' === $section['title'] ) {
1877
+
1878
+ $settings_safe['sections'][ $k ]['title'] = wp_kses_post( $section['id'] );
1879
+
1880
+ // Missing ID set to title.
1881
+ } elseif ( ! isset( $section['id'] ) || '' === $section['id'] ) {
1882
+
1883
+ $settings_safe['id'] = wp_kses_post( $section['title'] );
1884
+ }
1885
+
1886
+ // Sanitize ID once everything has been checked first.
1887
+ $settings_safe['sections'][ $k ]['id'] = ot_sanitize_option_id( wp_kses_post( $section['id'] ) );
1888
+ }
1889
+ }
1890
+
1891
+ // Validate settings by looping over array as many times as it takes.
1892
+ if ( isset( $settings['settings'] ) ) {
1893
+ $settings_safe['settings'] = ot_validate_settings_array( $settings['settings'] );
1894
+ }
1895
+
1896
+ // Validate contextual_help.
1897
+ if ( isset( $settings['contextual_help']['content'] ) ) {
1898
+
1899
+ // Fix numeric keys since drag & drop will change them.
1900
+ $settings['contextual_help']['content'] = array_values( $settings['contextual_help']['content'] );
1901
+
1902
+ // Loop through content.
1903
+ foreach ( $settings['contextual_help']['content'] as $k => $content ) {
1904
+
1905
+ // Skip if missing values.
1906
+ if ( ( ! isset( $content['title'] ) && ! isset( $content['id'] ) ) || ( '' === $content['title'] && '' === $content['id'] ) ) {
1907
+ continue;
1908
+ }
1909
+
1910
+ // Validate label.
1911
+ if ( '' !== $content['title'] ) {
1912
+ $settings_safe['contextual_help']['content'][ $k ]['title'] = wp_kses_post( $content['title'] );
1913
+ }
1914
+
1915
+ // Missing title set to unfiltered ID.
1916
+ if ( ! isset( $content['title'] ) || '' === $content['title'] ) {
1917
+
1918
+ $settings_safe['contextual_help']['content'][ $k ]['title'] = wp_kses_post( $content['id'] );
1919
+
1920
+ // Missing ID set to title.
1921
+ } elseif ( ! isset( $content['id'] ) || '' === $content['id'] ) {
1922
+
1923
+ $content['id'] = wp_kses_post( $content['title'] );
1924
+ }
1925
+
1926
+ // Sanitize ID once everything has been checked first.
1927
+ $settings_safe['contextual_help']['content'][ $k ]['id'] = ot_sanitize_option_id( wp_kses_post( $content['id'] ) );
1928
+
1929
+ // Validate textarea description.
1930
+ if ( isset( $content['content'] ) ) {
1931
+ $settings_safe['contextual_help']['content'][ $k ]['content'] = wp_kses_post( $content['content'] );
1932
+ }
1933
+ }
1934
+ }
1935
+
1936
+ // Validate contextual_help sidebar.
1937
+ if ( isset( $settings['contextual_help']['sidebar'] ) ) {
1938
+ $settings_safe['contextual_help']['sidebar'] = wp_kses_post( $settings['contextual_help']['sidebar'] );
1939
+ }
1940
+
1941
+ return $settings_safe;
1942
+ }
1943
+ }
1944
+
1945
+ if ( ! function_exists( 'ot_validate_settings_array' ) ) {
1946
+
1947
+ /**
1948
+ * Validate a settings array before save.
1949
+ *
1950
+ * This function will loop over a settings array as many
1951
+ * times as it takes to validate every sub setting.
1952
+ *
1953
+ * @param array $settings The array of settings.
1954
+ * @return array
1955
+ *
1956
+ * @access public
1957
+ * @since 2.0
1958
+ * @updated 2.7.0
1959
+ */
1960
+ function ot_validate_settings_array( $settings = array() ) {
1961
+
1962
+ // Field types mapped to their sanitize function.
1963
+ $field_types = array(
1964
+ 'label' => 'wp_kses_post',
1965
+ 'id' => 'ot_sanitize_option_id',
1966
+ 'type' => 'sanitize_text_field',
1967
+ 'desc' => 'wp_kses_post',
1968
+ 'settings' => 'ot_validate_settings_array',
1969
+ 'choices' => array(
1970
+ 'label' => 'wp_kses_post',
1971
+ 'value' => 'sanitize_text_field',
1972
+ 'src' => 'sanitize_text_field',
1973
+ ),
1974
+ 'std' => 'sanitize_text_field',
1975
+ 'rows' => 'absint',
1976
+ 'post_type' => 'sanitize_text_field',
1977
+ 'taxonomy' => 'sanitize_text_field',
1978
+ 'min_max_step' => 'sanitize_text_field',
1979
+ 'class' => 'sanitize_text_field',
1980
+ 'condition' => 'sanitize_text_field',
1981
+ 'operator' => 'sanitize_text_field',
1982
+ 'section' => 'sanitize_text_field',
1983
+ );
1984
+
1985
+ // Store the validated settings.
1986
+ $settings_safe = array();
1987
+
1988
+ // Validate settings.
1989
+ if ( 0 < count( $settings ) ) {
1990
+
1991
+ // Fix numeric keys since drag & drop will change them.
1992
+ $settings = array_values( $settings );
1993
+
1994
+ // Loop through settings.
1995
+ foreach ( $settings as $sk => $setting ) {
1996
+ foreach ( $setting as $fk => $field ) {
1997
+ if ( isset( $field_types[ $fk ] ) ) {
1998
+ if ( 'choices' === $fk ) {
1999
+ foreach ( $field as $ck => $choice ) {
2000
+ foreach ( $choice as $vk => $value ) {
2001
+ $settings_safe[ $sk ][ $fk ][ $ck ][ $vk ] = call_user_func( $field_types[ $fk ][ $vk ], $value );
2002
+ }
2003
+ }
2004
+ } elseif ( 'std' === $fk && is_array( $field ) ) {
2005
+ $callback = $field_types[ $fk ];
2006
+ $array_map = function( $item ) use ( $array_map, $callback ) {
2007
+ return is_array( $item ) ? array_map( $array_map, $item ) : call_user_func( $callback, $item );
2008
+ };
2009
+
2010
+ $settings_safe[ $sk ][ $fk ] = array_map( $array_map, $field );
2011
+ } else {
2012
+ $sanitized = call_user_func( $field_types[ $fk ], $field );
2013
+ if ( 'rows' === $fk && 0 === $sanitized ) {
2014
+ $sanitized = '';
2015
+ }
2016
+ $settings_safe[ $sk ][ $fk ] = $sanitized;
2017
+ }
2018
+ }
2019
+ }
2020
+ }
2021
+ }
2022
+
2023
+ return $settings_safe;
2024
+ }
2025
+ }
2026
+
2027
+ if ( ! function_exists( 'ot_modify_layouts' ) ) {
2028
+
2029
+ /**
2030
+ * Save layouts array before the screen is displayed.
2031
+ *
2032
+ * @return bool Returns false or redirects.
2033
+ *
2034
+ * @access public
2035
+ * @since 2.0
2036
+ */
2037
+ function ot_modify_layouts() {
2038
+
2039
+ // Check and verify modify layouts nonce.
2040
+ if ( isset( $_POST['option_tree_modify_layouts_nonce'] ) && wp_verify_nonce( $_POST['option_tree_modify_layouts_nonce'], 'option_tree_modify_layouts_form' ) ) { // phpcs:ignore
2041
+
2042
+ // Previous layouts value.
2043
+ $option_tree_layouts = get_option( ot_layouts_id() );
2044
+
2045
+ // New layouts value.
2046
+ $layouts = isset( $_POST[ ot_layouts_id() ] ) ? $_POST[ ot_layouts_id() ] : ''; // phpcs:ignore
2047
+
2048
+ // Rebuild layout array.
2049
+ $rebuild = array();
2050
+
2051
+ // Validate layouts.
2052
+ if ( is_array( $layouts ) && ! empty( $layouts ) ) {
2053
+
2054
+ // Setup active layout.
2055
+ if ( isset( $layouts['active_layout'] ) && ! empty( $layouts['active_layout'] ) ) {
2056
+ $rebuild['active_layout'] = $layouts['active_layout'];
2057
+ }
2058
+
2059
+ // Add new and overwrite active layout.
2060
+ if ( isset( $layouts['_add_new_layout_'] ) && ! empty( $layouts['_add_new_layout_'] ) ) {
2061
+ $rebuild['active_layout'] = ot_sanitize_layout_id( $layouts['_add_new_layout_'] );
2062
+ $rebuild[ $rebuild['active_layout'] ] = ot_encode( get_option( ot_options_id(), array() ) );
2063
+ }
2064
+
2065
+ $first_layout = '';
2066
+
2067
+ // Loop through layouts.
2068
+ foreach ( $layouts as $key => $layout ) {
2069
+
2070
+ // Skip over active layout key.
2071
+ if ( 'active_layout' === $key ) {
2072
+ continue;
2073
+ }
2074
+
2075
+ // Check if the key exists then set value.
2076
+ if ( isset( $option_tree_layouts[ $key ] ) && ! empty( $option_tree_layouts[ $key ] ) ) {
2077
+ $rebuild[ $key ] = $option_tree_layouts[ $key ];
2078
+ if ( '' === $first_layout ) {
2079
+ $first_layout = $key;
2080
+ }
2081
+ }
2082
+ }
2083
+
2084
+ if ( isset( $rebuild['active_layout'] ) && ! isset( $rebuild[ $rebuild['active_layout'] ] ) && ! empty( $first_layout ) ) {
2085
+ $rebuild['active_layout'] = $first_layout;
2086
+ }
2087
+ }
2088
+
2089
+ // Default message.
2090
+ $message = 'failed';
2091
+
2092
+ // Save & show success message.
2093
+ if ( is_array( $rebuild ) && 1 < count( $rebuild ) ) {
2094
+
2095
+ $options = ot_decode( $rebuild[ $rebuild['active_layout'] ] );
2096
+
2097
+ if ( $options ) {
2098
+
2099
+ $options_safe = array();
2100
+
2101
+ // Get settings array.
2102
+ $settings = get_option( ot_settings_id() );
2103
+
2104
+ // Has options.
2105
+ if ( is_array( $options ) ) {
2106
+
2107
+ // Validate options.
2108
+ if ( is_array( $settings ) ) {
2109
+ foreach ( $settings['settings'] as $setting ) {
2110
+ if ( isset( $options[ $setting['id'] ] ) ) {
2111
+ $options_safe[ $setting['id'] ] = ot_validate_setting( wp_unslash( $options[ $setting['id'] ] ), $setting['type'], $setting['id'] );
2112
+ }
2113
+ }
2114
+ }
2115
+
2116
+ // Execute the action hook and pass the theme options to it.
2117
+ do_action( 'ot_before_theme_options_save', $options_safe );
2118
+
2119
+ update_option( ot_options_id(), $options_safe );
2120
+ }
2121
+ }
2122
+
2123
+ // Rebuild the layouts.
2124
+ update_option( ot_layouts_id(), $rebuild );
2125
+
2126
+ // Change message.
2127
+ $message = 'success';
2128
+ } elseif ( 1 >= count( $rebuild ) ) {
2129
+
2130
+ // Delete layouts option.
2131
+ delete_option( ot_layouts_id() );
2132
+
2133
+ // Change message.
2134
+ $message = 'deleted';
2135
+ }
2136
+
2137
+ // Redirect.
2138
+ if ( isset( $_REQUEST['page'] ) && apply_filters( 'ot_theme_options_menu_slug', 'ot-theme-options' ) === $_REQUEST['page'] ) {
2139
+ $query_args = esc_url_raw(
2140
+ add_query_arg(
2141
+ array(
2142
+ 'settings-updated' => 'layout',
2143
+ ),
2144
+ remove_query_arg(
2145
+ array(
2146
+ 'action',
2147
+ 'message',
2148
+ ),
2149
+ wp_get_referer()
2150
+ )
2151
+ )
2152
+ );
2153
+ } else {
2154
+ $query_args = esc_url_raw(
2155
+ add_query_arg(
2156
+ array(
2157
+ 'action' => 'save-layouts',
2158
+ 'message' => $message,
2159
+ ),
2160
+ wp_get_referer()
2161
+ )
2162
+ );
2163
+ }
2164
+ wp_safe_redirect( $query_args );
2165
+ exit;
2166
+ }
2167
+
2168
+ return false;
2169
+ }
2170
+ }
2171
+
2172
+ if ( ! function_exists( 'ot_alert_message' ) ) {
2173
+
2174
+ /**
2175
+ * Helper function to display alert messages.
2176
+ *
2177
+ * @param array $page Page array.
2178
+ * @return mixed
2179
+ *
2180
+ * @access public
2181
+ * @since 2.0
2182
+ */
2183
+ function ot_alert_message( $page = array() ) {
2184
+
2185
+ if ( empty( $page ) ) {
2186
+ return false;
2187
+ }
2188
+
2189
+ $before = apply_filters( 'ot_before_page_messages', '', $page );
2190
+
2191
+ if ( $before ) {
2192
+ return $before;
2193
+ }
2194
+
2195
+ $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; // phpcs:ignore
2196
+ $message = isset( $_REQUEST['message'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['message'] ) ) : ''; // phpcs:ignore
2197
+ $updated = isset( $_REQUEST['settings-updated'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['settings-updated'] ) ) : ''; // phpcs:ignore
2198
+
2199
+ if ( 'save-settings' === $action ) {
2200
+
2201
+ if ( 'success' === $message ) {
2202
+
2203
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Settings updated.', 'option-tree' ) . '</p></div>';
2204
+
2205
+ } elseif ( 'failed' === $message ) {
2206
+
2207
+ return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Settings could not be saved.', 'option-tree' ) . '</p></div>';
2208
+
2209
+ }
2210
+ } elseif ( 'import-xml' === $action || 'import-settings' === $action ) {
2211
+
2212
+ if ( 'success' === $message ) {
2213
+
2214
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Settings Imported.', 'option-tree' ) . '</p></div>';
2215
+
2216
+ } elseif ( 'failed' === $message ) {
2217
+
2218
+ return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Settings could not be imported.', 'option-tree' ) . '</p></div>';
2219
+
2220
+ }
2221
+ } elseif ( 'import-data' === $action ) {
2222
+
2223
+ if ( 'success' === $message ) {
2224
+
2225
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Data Imported.', 'option-tree' ) . '</p></div>';
2226
+
2227
+ } elseif ( 'failed' === $message ) {
2228
+
2229
+ return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Data could not be imported.', 'option-tree' ) . '</p></div>';
2230
+
2231
+ }
2232
+ } elseif ( 'import-layouts' === $action ) {
2233
+
2234
+ if ( 'success' === $message ) {
2235
+
2236
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts Imported.', 'option-tree' ) . '</p></div>';
2237
+
2238
+ } elseif ( 'failed' === $message ) {
2239
+
2240
+ return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Layouts could not be imported.', 'option-tree' ) . '</p></div>';
2241
+
2242
+ }
2243
+ } elseif ( 'save-layouts' === $action ) {
2244
+
2245
+ if ( 'success' === $message ) {
2246
+
2247
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts Updated.', 'option-tree' ) . '</p></div>';
2248
+
2249
+ } elseif ( 'failed' === $message ) {
2250
+
2251
+ return '<div id="message" class="error fade below-h2"><p>' . esc_html__( 'Layouts could not be updated.', 'option-tree' ) . '</p></div>';
2252
+
2253
+ } elseif ( 'deleted' === $message ) {
2254
+
2255
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layouts have been deleted.', 'option-tree' ) . '</p></div>';
2256
+
2257
+ }
2258
+ } elseif ( 'layout' === $updated ) {
2259
+
2260
+ return '<div id="message" class="updated fade below-h2"><p>' . esc_html__( 'Layout activated.', 'option-tree' ) . '</p></div>';
2261
+
2262
+ } elseif ( 'reset' === $action ) {
2263
+
2264
+ return '<div id="message" class="updated fade below-h2"><p>' . $page['reset_message'] . '</p></div>';
2265
+
2266
+ }
2267
+
2268
+ do_action( 'ot_custom_page_messages', $page );
2269
+
2270
+ if ( 'true' === $updated || true === $updated ) {
2271
+ return '<div id="message" class="updated fade below-h2"><p>' . $page['updated_message'] . '</p></div>';
2272
+ }
2273
+
2274
+ return false;
2275
+ }
2276
+ }
2277
+
2278
+ if ( ! function_exists( 'ot_option_types_array' ) ) {
2279
+
2280
+ /**
2281
+ * Setup the default option types.
2282
+ *
2283
+ * The returned option types are filterable so you can add your own.
2284
+ * This is not a task for a beginner as you'll need to add the function
2285
+ * that displays the option to the user and validate the saved data.
2286
+ *
2287
+ * @return array
2288
+ *
2289
+ * @access public
2290
+ * @since 2.0
2291
+ */
2292
+ function ot_option_types_array() {
2293
+
2294
+ return apply_filters(
2295
+ 'ot_option_types_array',
2296
+ array(
2297
+ 'background' => esc_html__( 'Background', 'option-tree' ),
2298
+ 'border' => esc_html__( 'Border', 'option-tree' ),
2299
+ 'box-shadow' => esc_html__( 'Box Shadow', 'option-tree' ),
2300
+ 'category-checkbox' => esc_html__( 'Category Checkbox', 'option-tree' ),
2301
+ 'category-select' => esc_html__( 'Category Select', 'option-tree' ),
2302
+ 'checkbox' => esc_html__( 'Checkbox', 'option-tree' ),
2303
+ 'colorpicker' => esc_html__( 'Colorpicker', 'option-tree' ),
2304
+ 'colorpicker-opacity' => esc_html__( 'Colorpicker Opacity', 'option-tree' ),
2305
+ 'css' => esc_html__( 'CSS', 'option-tree' ),
2306
+ 'custom-post-type-checkbox' => esc_html__( 'Custom Post Type Checkbox', 'option-tree' ),
2307
+ 'custom-post-type-select' => esc_html__( 'Custom Post Type Select', 'option-tree' ),
2308
+ 'date-picker' => esc_html__( 'Date Picker', 'option-tree' ),
2309
+ 'date-time-picker' => esc_html__( 'Date Time Picker', 'option-tree' ),
2310
+ 'dimension' => esc_html__( 'Dimension', 'option-tree' ),
2311
+ 'gallery' => esc_html__( 'Gallery', 'option-tree' ),
2312
+ 'google-fonts' => esc_html__( 'Google Fonts', 'option-tree' ),
2313
+ 'javascript' => esc_html__( 'JavaScript', 'option-tree' ),
2314
+ 'link-color' => esc_html__( 'Link Color', 'option-tree' ),
2315
+ 'list-item' => esc_html__( 'List Item', 'option-tree' ),
2316
+ 'measurement' => esc_html__( 'Measurement', 'option-tree' ),
2317
+ 'numeric-slider' => esc_html__( 'Numeric Slider', 'option-tree' ),
2318
+ 'on-off' => esc_html__( 'On/Off', 'option-tree' ),
2319
+ 'page-checkbox' => esc_html__( 'Page Checkbox', 'option-tree' ),
2320
+ 'page-select' => esc_html__( 'Page Select', 'option-tree' ),
2321
+ 'post-checkbox' => esc_html__( 'Post Checkbox', 'option-tree' ),
2322
+ 'post-select' => esc_html__( 'Post Select', 'option-tree' ),
2323
+ 'radio' => esc_html__( 'Radio', 'option-tree' ),
2324
+ 'radio-image' => esc_html__( 'Radio Image', 'option-tree' ),
2325
+ 'select' => esc_html__( 'Select', 'option-tree' ),
2326
+ 'sidebar-select' => esc_html__( 'Sidebar Select', 'option-tree' ),
2327
+ 'slider' => esc_html__( 'Slider', 'option-tree' ),
2328
+ 'social-links' => esc_html__( 'Social Links', 'option-tree' ),
2329
+ 'spacing' => esc_html__( 'Spacing', 'option-tree' ),
2330
+ 'tab' => esc_html__( 'Tab', 'option-tree' ),
2331
+ 'tag-checkbox' => esc_html__( 'Tag Checkbox', 'option-tree' ),
2332
+ 'tag-select' => esc_html__( 'Tag Select', 'option-tree' ),
2333
+ 'taxonomy-checkbox' => esc_html__( 'Taxonomy Checkbox', 'option-tree' ),
2334
+ 'taxonomy-select' => esc_html__( 'Taxonomy Select', 'option-tree' ),
2335
+ 'text' => esc_html__( 'Text', 'option-tree' ),
2336
+ 'textarea' => esc_html__( 'Textarea', 'option-tree' ),
2337
+ 'textarea-simple' => esc_html__( 'Textarea Simple', 'option-tree' ),
2338
+ 'textblock' => esc_html__( 'Textblock', 'option-tree' ),
2339
+ 'textblock-titled' => esc_html__( 'Textblock Titled', 'option-tree' ),
2340
+ 'typography' => esc_html__( 'Typography', 'option-tree' ),
2341
+ 'upload' => esc_html__( 'Upload', 'option-tree' ),
2342
+ )
2343
+ );
2344
+ }
2345
+ }
2346
+
2347
+ if ( ! function_exists( 'ot_map_old_option_types' ) ) {
2348
+
2349
+ /**
2350
+ * Map old option types for rebuilding XML and Table data.
2351
+ *
2352
+ * @param string $type The old option type.
2353
+ * @return string The new option type
2354
+ *
2355
+ * @access public
2356
+ * @since 2.0
2357
+ */
2358
+ function ot_map_old_option_types( $type = '' ) {
2359
+
2360
+ if ( empty( $type ) ) {
2361
+ return 'text';
2362
+ }
2363
+
2364
+ $types = array(
2365
+ 'background' => 'background',
2366
+ 'category' => 'category-select',
2367
+ 'categories' => 'category-checkbox',
2368
+ 'checkbox' => 'checkbox',
2369
+ 'colorpicker' => 'colorpicker',
2370
+ 'css' => 'css',
2371
+ 'custom_post' => 'custom-post-type-select',
2372
+ 'custom_posts' => 'custom-post-type-checkbox',
2373
+ 'input' => 'text',
2374
+ 'image' => 'upload',
2375
+ 'measurement' => 'measurement',
2376
+ 'page' => 'page-select',
2377
+ 'pages' => 'page-checkbox',
2378
+ 'post' => 'post-select',
2379
+ 'posts' => 'post-checkbox',
2380
+ 'radio' => 'radio',
2381
+ 'select' => 'select',
2382
+ 'slider' => 'slider',
2383
+ 'tag' => 'tag-select',
2384
+ 'tags' => 'tag-checkbox',
2385
+ 'textarea' => 'textarea',
2386
+ 'textblock' => 'textblock',
2387
+ 'typography' => 'typography',
2388
+ 'upload' => 'upload',
2389
+ );
2390
+
2391
+ if ( isset( $types[ $type ] ) ) {
2392
+ return $types[ $type ];
2393
+ }
2394
+
2395
+ return false;
2396
+ }
2397
+ }
2398
+
2399
+ if ( ! function_exists( 'ot_google_font_stack' ) ) {
2400
+
2401
+ /**
2402
+ * Filters the typography font-family to add Google fonts dynamically.
2403
+ *
2404
+ * @param array $families An array of all recognized font families.
2405
+ * @param string $field_id ID of the field being filtered.
2406
+ *
2407
+ * @return array
2408
+ *
2409
+ * @access public
2410
+ * @since 2.5.0
2411
+ */
2412
+ function ot_google_font_stack( $families, $field_id ) {
2413
+
2414
+ if ( ! is_array( $families ) ) {
2415
+ return array();
2416
+ }
2417
+
2418
+ $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
2419
+ $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
2420
+
2421
+ if ( ! empty( $ot_set_google_fonts ) ) {
2422
+ foreach ( $ot_set_google_fonts as $id => $sets ) {
2423
+ foreach ( $sets as $value ) {
2424
+ $family = isset( $value['family'] ) ? $value['family'] : '';
2425
+ if ( $family && isset( $ot_google_fonts[ $family ] ) ) {
2426
+ $spaces = explode( ' ', $ot_google_fonts[ $family ]['family'] );
2427
+ $font_stack = count( $spaces ) > 1 ? '"' . $ot_google_fonts[ $family ]['family'] . '"' : $ot_google_fonts[ $family ]['family'];
2428
+ $families[ $family ] = apply_filters( 'ot_google_font_stack', $font_stack, $family, $field_id );
2429
+ }
2430
+ }
2431
+ }
2432
+ }
2433
+
2434
+ return $families;
2435
+ }
2436
+
2437
+ add_filter( 'ot_recognized_font_families', 'ot_google_font_stack', 1, 2 );
2438
+ }
2439
+
2440
+ if ( ! function_exists( 'ot_recognized_font_families' ) ) {
2441
+
2442
+ /**
2443
+ * Recognized font families
2444
+ *
2445
+ * Returns an array of all recognized font families.
2446
+ * Keys are intended to be stored in the database
2447
+ * while values are ready for display in html.
2448
+ * Renamed in version 2.0 to avoid name collisions.
2449
+ *
2450
+ * @uses apply_filters()
2451
+ *
2452
+ * @param string $field_id ID that's passed to the filter.
2453
+ *
2454
+ * @return array
2455
+ *
2456
+ * @access public
2457
+ * @since 1.1.8
2458
+ * @updated 2.0
2459
+ */
2460
+ function ot_recognized_font_families( $field_id ) {
2461
+
2462
+ $families = array(
2463
+ 'arial' => 'Arial',
2464
+ 'georgia' => 'Georgia',
2465
+ 'helvetica' => 'Helvetica',
2466
+ 'palatino' => 'Palatino',
2467
+ 'tahoma' => 'Tahoma',
2468
+ 'times' => '"Times New Roman", sans-serif',
2469
+ 'trebuchet' => 'Trebuchet',
2470
+ 'verdana' => 'Verdana',
2471
+ );
2472
+
2473
+ return apply_filters( 'ot_recognized_font_families', $families, $field_id );
2474
+ }
2475
+ }
2476
+
2477
+ if ( ! function_exists( 'ot_recognized_font_sizes' ) ) {
2478
+
2479
+ /**
2480
+ * Recognized font sizes
2481
+ *
2482
+ * Returns an array of all recognized font sizes.
2483
+ *
2484
+ * @uses apply_filters()
2485
+ *
2486
+ * @param string $field_id ID that's passed to the filter.
2487
+ *
2488
+ * @return array
2489
+ *
2490
+ * @access public
2491
+ * @since 2.0.12
2492
+ */
2493
+ function ot_recognized_font_sizes( $field_id ) {
2494
+
2495
+ $range = ot_range(
2496
+ apply_filters( 'ot_font_size_low_range', 0, $field_id ),
2497
+ apply_filters( 'ot_font_size_high_range', 150, $field_id ),
2498
+ apply_filters( 'ot_font_size_range_interval', 1, $field_id )
2499
+ );
2500
+
2501
+ $unit = apply_filters( 'ot_font_size_unit_type', 'px', $field_id );
2502
+
2503
+ foreach ( $range as $k => $v ) {
2504
+ $range[ $k ] = $v . $unit;
2505
+ }
2506
+
2507
+ return apply_filters( 'ot_recognized_font_sizes', $range, $field_id );
2508
+ }
2509
+ }
2510
+
2511
+ if ( ! function_exists( 'ot_recognized_font_styles' ) ) {
2512
+
2513
+ /**
2514
+ * Recognized font styles
2515
+ *
2516
+ * Returns an array of all recognized font styles.
2517
+ * Renamed in version 2.0 to avoid name collisions.
2518
+ *
2519
+ * @uses apply_filters()
2520
+ *
2521
+ * @param string $field_id ID that's passed to the filter.
2522
+ *
2523
+ * @return array
2524
+ *
2525
+ * @access public
2526
+ * @since 1.1.8
2527
+ * @updated 2.0
2528
+ */
2529
+ function ot_recognized_font_styles( $field_id ) {
2530
+
2531
+ return apply_filters(
2532
+ 'ot_recognized_font_styles',
2533
+ array(
2534
+ 'normal' => 'Normal',
2535
+ 'italic' => 'Italic',
2536
+ 'oblique' => 'Oblique',
2537
+ 'inherit' => 'Inherit',
2538
+ ),
2539
+ $field_id
2540
+ );
2541
+ }
2542
+ }
2543
+
2544
+ if ( ! function_exists( 'ot_recognized_font_variants' ) ) {
2545
+
2546
+ /**
2547
+ * Recognized font variants
2548
+ *
2549
+ * Returns an array of all recognized font variants.
2550
+ * Renamed in version 2.0 to avoid name collisions.
2551
+ *
2552
+ * @uses apply_filters()
2553
+ *
2554
+ * @param string $field_id ID that's passed to the filter.
2555
+ *
2556
+ * @return array
2557
+ *
2558
+ * @access public
2559
+ * @since 1.1.8
2560
+ * @updated 2.0
2561
+ */
2562
+ function ot_recognized_font_variants( $field_id ) {
2563
+
2564
+ return apply_filters(
2565
+ 'ot_recognized_font_variants',
2566
+ array(
2567
+ 'normal' => 'Normal',
2568
+ 'small-caps' => 'Small Caps',
2569
+ 'inherit' => 'Inherit',
2570
+ ),
2571
+ $field_id
2572
+ );
2573
+ }
2574
+ }
2575
+
2576
+ if ( ! function_exists( 'ot_recognized_font_weights' ) ) {
2577
+
2578
+ /**
2579
+ * Recognized font weights
2580
+ *
2581
+ * Returns an array of all recognized font weights.
2582
+ * Renamed in version 2.0 to avoid name collisions.
2583
+ *
2584
+ * @uses apply_filters()
2585
+ *
2586
+ * @param string $field_id ID that's passed to the filter.
2587
+ *
2588
+ * @return array
2589
+ *
2590
+ * @access public
2591
+ * @since 1.1.8
2592
+ * @updated 2.0
2593
+ */
2594
+ function ot_recognized_font_weights( $field_id ) {
2595
+
2596
+ return apply_filters(
2597
+ 'ot_recognized_font_weights',
2598
+ array(
2599
+ 'normal' => 'Normal',
2600
+ 'bold' => 'Bold',
2601
+ 'bolder' => 'Bolder',
2602
+ 'lighter' => 'Lighter',
2603
+ '100' => '100',
2604
+ '200' => '200',
2605
+ '300' => '300',
2606
+ '400' => '400',
2607
+ '500' => '500',
2608
+ '600' => '600',
2609
+ '700' => '700',
2610
+ '800' => '800',
2611
+ '900' => '900',
2612
+ 'inherit' => 'Inherit',
2613
+ ),
2614
+ $field_id
2615
+ );
2616
+ }
2617
+ }
2618
+
2619
+ if ( ! function_exists( 'ot_recognized_letter_spacing' ) ) {
2620
+
2621
+ /**
2622
+ * Recognized letter spacing
2623
+ *
2624
+ * Returns an array of all recognized line heights.
2625
+ *
2626
+ * @uses apply_filters()
2627
+ *
2628
+ * @param string $field_id ID that's passed to the filter.
2629
+ *
2630
+ * @return array
2631
+ *
2632
+ * @access public
2633
+ * @since 2.0.12
2634
+ */
2635
+ function ot_recognized_letter_spacing( $field_id ) {
2636
+
2637
+ $range = ot_range(
2638
+ apply_filters( 'ot_letter_spacing_low_range', -0.1, $field_id ),
2639
+ apply_filters( 'ot_letter_spacing_high_range', 0.1, $field_id ),
2640
+ apply_filters( 'ot_letter_spacing_range_interval', 0.01, $field_id )
2641
+ );
2642
+
2643
+ $unit = apply_filters( 'ot_letter_spacing_unit_type', 'em', $field_id );
2644
+
2645
+ foreach ( $range as $k => $v ) {
2646
+ $range[ $k ] = $v . $unit;
2647
+ }
2648
+
2649
+ return apply_filters( 'ot_recognized_letter_spacing', $range, $field_id );
2650
+ }
2651
+ }
2652
+
2653
+ if ( ! function_exists( 'ot_recognized_line_heights' ) ) {
2654
+
2655
+ /**
2656
+ * Recognized line heights
2657
+ *
2658
+ * Returns an array of all recognized line heights.
2659
+ *
2660
+ * @uses apply_filters()
2661
+ *
2662
+ * @param string $field_id ID that's passed to the filter.
2663
+ *
2664
+ * @return array
2665
+ *
2666
+ * @access public
2667
+ * @since 2.0.12
2668
+ */
2669
+ function ot_recognized_line_heights( $field_id ) {
2670
+
2671
+ $range = ot_range(
2672
+ apply_filters( 'ot_line_height_low_range', 0, $field_id ),
2673
+ apply_filters( 'ot_line_height_high_range', 150, $field_id ),
2674
+ apply_filters( 'ot_line_height_range_interval', 1, $field_id )
2675
+ );
2676
+
2677
+ $unit = apply_filters( 'ot_line_height_unit_type', 'px', $field_id );
2678
+
2679
+ foreach ( $range as $k => $v ) {
2680
+ $range[ $k ] = $v . $unit;
2681
+ }
2682
+
2683
+ return apply_filters( 'ot_recognized_line_heights', $range, $field_id );
2684
+ }
2685
+ }
2686
+
2687
+ if ( ! function_exists( 'ot_recognized_text_decorations' ) ) {
2688
+
2689
+ /**
2690
+ * Recognized text decorations
2691
+ *
2692
+ * Returns an array of all recognized text decorations.
2693
+ * Keys are intended to be stored in the database
2694
+ * while values are ready for display in html.
2695
+ *
2696
+ * @uses apply_filters()
2697
+ *
2698
+ * @param string $field_id ID that's passed to the filter.
2699
+ *
2700
+ * @return array
2701
+ *
2702
+ * @access public
2703
+ * @since 2.0.10
2704
+ */
2705
+ function ot_recognized_text_decorations( $field_id ) {
2706
+
2707
+ return apply_filters(
2708
+ 'ot_recognized_text_decorations',
2709
+ array(
2710
+ 'blink' => 'Blink',
2711
+ 'inherit' => 'Inherit',
2712
+ 'line-through' => 'Line Through',
2713
+ 'none' => 'None',
2714
+ 'overline' => 'Overline',
2715
+ 'underline' => 'Underline',
2716
+ ),
2717
+ $field_id
2718
+ );
2719
+ }
2720
+ }
2721
+
2722
+ if ( ! function_exists( 'ot_recognized_text_transformations' ) ) {
2723
+
2724
+ /**
2725
+ * Recognized text transformations
2726
+ *
2727
+ * Returns an array of all recognized text transformations.
2728
+ * Keys are intended to be stored in the database
2729
+ * while values are ready for display in html.
2730
+ *
2731
+ * @uses apply_filters()
2732
+ *
2733
+ * @param string $field_id ID that's passed to the filter.
2734
+ *
2735
+ * @return array
2736
+ *
2737
+ * @access public
2738
+ * @since 2.0.10
2739
+ */
2740
+ function ot_recognized_text_transformations( $field_id ) {
2741
+
2742
+ return apply_filters(
2743
+ 'ot_recognized_text_transformations',
2744
+ array(
2745
+ 'capitalize' => 'Capitalize',
2746
+ 'inherit' => 'Inherit',
2747
+ 'lowercase' => 'Lowercase',
2748
+ 'none' => 'None',
2749
+ 'uppercase' => 'Uppercase',
2750
+ ),
2751
+ $field_id
2752
+ );
2753
+ }
2754
+ }
2755
+
2756
+ if ( ! function_exists( 'ot_recognized_background_repeat' ) ) {
2757
+
2758
+ /**
2759
+ * Recognized background repeat
2760
+ *
2761
+ * Returns an array of all recognized background repeat values.
2762
+ * Renamed in version 2.0 to avoid name collisions.
2763
+ *
2764
+ * @uses apply_filters()
2765
+ *
2766
+ * @param string $field_id ID that's passed to the filter.
2767
+ *
2768
+ * @return array
2769
+ *
2770
+ * @access public
2771
+ * @since 1.1.8
2772
+ * @updated 2.0
2773
+ */
2774
+ function ot_recognized_background_repeat( $field_id ) {
2775
+
2776
+ return apply_filters(
2777
+ 'ot_recognized_background_repeat',
2778
+ array(
2779
+ 'no-repeat' => 'No Repeat',
2780
+ 'repeat' => 'Repeat All',
2781
+ 'repeat-x' => 'Repeat Horizontally',
2782
+ 'repeat-y' => 'Repeat Vertically',
2783
+ 'inherit' => 'Inherit',
2784
+ ),
2785
+ $field_id
2786
+ );
2787
+ }
2788
+ }
2789
+
2790
+ if ( ! function_exists( 'ot_recognized_background_attachment' ) ) {
2791
+
2792
+ /**
2793
+ * Recognized background attachment
2794
+ *
2795
+ * Returns an array of all recognized background attachment values.
2796
+ * Renamed in version 2.0 to avoid name collisions.
2797
+ *
2798
+ * @uses apply_filters()
2799
+ *
2800
+ * @param string $field_id ID that's passed to the filter.
2801
+ *
2802
+ * @return array
2803
+ *
2804
+ * @access public
2805
+ * @since 1.1.8
2806
+ * @updated 2.0
2807
+ */
2808
+ function ot_recognized_background_attachment( $field_id ) {
2809
+
2810
+ return apply_filters(
2811
+ 'ot_recognized_background_attachment',
2812
+ array(
2813
+ 'fixed' => 'Fixed',
2814
+ 'scroll' => 'Scroll',
2815
+ 'inherit' => 'Inherit',
2816
+ ),
2817
+ $field_id
2818
+ );
2819
+ }
2820
+ }
2821
+
2822
+ if ( ! function_exists( 'ot_recognized_background_position' ) ) {
2823
+
2824
+ /**
2825
+ * Recognized background position
2826
+ *
2827
+ * Returns an array of all recognized background position values.
2828
+ * Renamed in version 2.0 to avoid name collisions.
2829
+ *
2830
+ * @uses apply_filters()
2831
+ *
2832
+ * @param string $field_id ID that's passed to the filter.
2833
+ *
2834
+ * @return array
2835
+ *
2836
+ * @access public
2837
+ * @since 1.1.8
2838
+ * @updated 2.0
2839
+ */
2840
+ function ot_recognized_background_position( $field_id ) {
2841
+
2842
+ return apply_filters(
2843
+ 'ot_recognized_background_position',
2844
+ array(
2845
+ 'left top' => 'Left Top',
2846
+ 'left center' => 'Left Center',
2847
+ 'left bottom' => 'Left Bottom',
2848
+ 'center top' => 'Center Top',
2849
+ 'center center' => 'Center Center',
2850
+ 'center bottom' => 'Center Bottom',
2851
+ 'right top' => 'Right Top',
2852
+ 'right center' => 'Right Center',
2853
+ 'right bottom' => 'Right Bottom',
2854
+ ),
2855
+ $field_id
2856
+ );
2857
+
2858
+ }
2859
+ }
2860
+
2861
+ if ( ! function_exists( 'ot_recognized_border_style_types' ) ) {
2862
+
2863
+ /**
2864
+ * Returns an array of all available border style types.
2865
+ *
2866
+ * @uses apply_filters()
2867
+ *
2868
+ * @param string $field_id ID that's passed to the filter.
2869
+ *
2870
+ * @return array
2871
+ *
2872
+ * @access public
2873
+ * @since 2.5.0
2874
+ */
2875
+ function ot_recognized_border_style_types( $field_id ) {
2876
+
2877
+ return apply_filters(
2878
+ 'ot_recognized_border_style_types',
2879
+ array(
2880
+ 'hidden' => 'Hidden',
2881
+ 'dashed' => 'Dashed',
2882
+ 'solid' => 'Solid',
2883
+ 'double' => 'Double',
2884
+ 'groove' => 'Groove',
2885
+ 'ridge' => 'Ridge',
2886
+ 'inset' => 'Inset',
2887
+ 'outset' => 'Outset',
2888
+ ),
2889
+ $field_id
2890
+ );
2891
+
2892
+ }
2893
+ }
2894
+
2895
+ if ( ! function_exists( 'ot_recognized_border_unit_types' ) ) {
2896
+
2897
+ /**
2898
+ * Returns an array of all available border unit types.
2899
+ *
2900
+ * @uses apply_filters()
2901
+ *
2902
+ * @param string $field_id ID that's passed to the filter.
2903
+ *
2904
+ * @return array
2905
+ *
2906
+ * @access public
2907
+ * @since 2.5.0
2908
+ */
2909
+ function ot_recognized_border_unit_types( $field_id ) {
2910
+
2911
+ return apply_filters(
2912
+ 'ot_recognized_border_unit_types',
2913
+ array(
2914
+ 'px' => 'px',
2915
+ '%' => '%',
2916
+ 'em' => 'em',
2917
+ 'pt' => 'pt',
2918
+ ),
2919
+ $field_id
2920
+ );
2921
+ }
2922
+ }
2923
+
2924
+ if ( ! function_exists( 'ot_recognized_dimension_unit_types' ) ) {
2925
+
2926
+ /**
2927
+ * Returns an array of all available dimension unit types.
2928
+ *
2929
+ * @uses apply_filters()
2930
+ *
2931
+ * @param string $field_id ID that's passed to the filter.
2932
+ *
2933
+ * @return array
2934
+ *
2935
+ * @access public
2936
+ * @since 2.5.0
2937
+ */
2938
+ function ot_recognized_dimension_unit_types( $field_id = '' ) {
2939
+
2940
+ return apply_filters(
2941
+ 'ot_recognized_dimension_unit_types',
2942
+ array(
2943
+ 'px' => 'px',
2944
+ '%' => '%',
2945
+ 'em' => 'em',
2946
+ 'pt' => 'pt',
2947
+ ),
2948
+ $field_id
2949
+ );
2950
+ }
2951
+ }
2952
+
2953
+ if ( ! function_exists( 'ot_recognized_spacing_unit_types' ) ) {
2954
+
2955
+ /**
2956
+ * Returns an array of all available spacing unit types.
2957
+ *
2958
+ * @uses apply_filters()
2959
+ *
2960
+ * @param string $field_id ID that's passed to the filter.
2961
+ *
2962
+ * @return array
2963
+ *
2964
+ * @access public
2965
+ * @since 2.5.0
2966
+ */
2967
+ function ot_recognized_spacing_unit_types( $field_id ) {
2968
+
2969
+ return apply_filters(
2970
+ 'ot_recognized_spacing_unit_types',
2971
+ array(
2972
+ 'px' => 'px',
2973
+ '%' => '%',
2974
+ 'em' => 'em',
2975
+ 'pt' => 'pt',
2976
+ ),
2977
+ $field_id
2978
+ );
2979
+
2980
+ }
2981
+ }
2982
+
2983
+ if ( ! function_exists( 'ot_recognized_google_font_families' ) ) {
2984
+
2985
+ /**
2986
+ * Recognized Google font families
2987
+ *
2988
+ * @uses apply_filters()
2989
+ *
2990
+ * @param string $field_id ID that's passed to the filter.
2991
+ *
2992
+ * @return array
2993
+ *
2994
+ * @access public
2995
+ * @since 2.5.0
2996
+ */
2997
+ function ot_recognized_google_font_families( $field_id ) {
2998
+
2999
+ $families = array();
3000
+ $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3001
+
3002
+ // Forces an array rebuild when we switch themes.
3003
+ if ( empty( $ot_google_fonts ) ) {
3004
+ $ot_google_fonts = ot_fetch_google_fonts( true, true );
3005
+ }
3006
+
3007
+ foreach ( (array) $ot_google_fonts as $key => $item ) {
3008
+
3009
+ if ( isset( $item['family'] ) ) {
3010
+ $families[ $key ] = $item['family'];
3011
+ }
3012
+ }
3013
+
3014
+ return apply_filters( 'ot_recognized_google_font_families', $families, $field_id );
3015
+ }
3016
+ }
3017
+
3018
+ if ( ! function_exists( 'ot_recognized_google_font_variants' ) ) {
3019
+
3020
+ /**
3021
+ * Recognized Google font variants
3022
+ *
3023
+ * @uses apply_filters()
3024
+ *
3025
+ * @param string $field_id ID that's passed to the filter.
3026
+ * @param string $family The font family.
3027
+ *
3028
+ * @return array
3029
+ *
3030
+ * @access public
3031
+ * @since 2.5.0
3032
+ */
3033
+ function ot_recognized_google_font_variants( $field_id, $family ) {
3034
+
3035
+ $variants = array();
3036
+ $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3037
+
3038
+ if ( isset( $ot_google_fonts[ $family ]['variants'] ) ) {
3039
+ $variants = $ot_google_fonts[ $family ]['variants'];
3040
+ }
3041
+
3042
+ return apply_filters( 'ot_recognized_google_font_variants', $variants, $field_id, $family );
3043
+ }
3044
+ }
3045
+
3046
+ if ( ! function_exists( 'ot_recognized_google_font_subsets' ) ) {
3047
+
3048
+ /**
3049
+ * Recognized Google font subsets
3050
+ *
3051
+ * @uses apply_filters()
3052
+ *
3053
+ * @param string $field_id ID that's passed to the filter.
3054
+ * @param string $family The font family.
3055
+ *
3056
+ * @return array
3057
+ *
3058
+ * @access public
3059
+ * @since 2.5.0
3060
+ */
3061
+ function ot_recognized_google_font_subsets( $field_id, $family ) {
3062
+
3063
+ $subsets = array();
3064
+ $ot_google_fonts = get_theme_mod( 'ot_google_fonts', array() );
3065
+
3066
+ if ( isset( $ot_google_fonts[ $family ]['subsets'] ) ) {
3067
+ $subsets = $ot_google_fonts[ $family ]['subsets'];
3068
+ }
3069
+
3070
+ return apply_filters( 'ot_recognized_google_font_subsets', $subsets, $field_id, $family );
3071
+ }
3072
+ }
3073
+
3074
+ if ( ! function_exists( 'ot_measurement_unit_types' ) ) {
3075
+
3076
+ /**
3077
+ * Measurement Units
3078
+ *
3079
+ * Returns an array of all available unit types.
3080
+ * Renamed in version 2.0 to avoid name collisions.
3081
+ *
3082
+ * @uses apply_filters()
3083
+ *
3084
+ * @param string $field_id ID that's passed to the filter.
3085
+ *
3086
+ * @return array
3087
+ *
3088
+ * @access public
3089
+ * @since 1.1.8
3090
+ * @since 2.0
3091
+ */
3092
+ function ot_measurement_unit_types( $field_id = '' ) {
3093
+
3094
+ return apply_filters(
3095
+ 'ot_measurement_unit_types',
3096
+ array(
3097
+ 'px' => 'px',
3098
+ '%' => '%',
3099
+ 'em' => 'em',
3100
+ 'pt' => 'pt',
3101
+ ),
3102
+ $field_id
3103
+ );
3104
+
3105
+ }
3106
+ }
3107
+
3108
+ if ( ! function_exists( 'ot_radio_images' ) ) {
3109
+
3110
+ /**
3111
+ * Radio Images default array.
3112
+ *
3113
+ * Returns an array of all available radio images.
3114
+ * You can filter this function to change the images
3115
+ * on a per option basis.
3116
+ *
3117
+ * @uses apply_filters()
3118
+ *
3119
+ * @param string $field_id ID that's passed to the filter.
3120
+ *
3121
+ * @return array
3122
+ *
3123
+ * @access public
3124
+ * @since 2.0
3125
+ */
3126
+ function ot_radio_images( $field_id ) {
3127
+
3128
+ return apply_filters(
3129
+ 'ot_radio_images',
3130
+ array(
3131
+ array(
3132
+ 'value' => 'left-sidebar',
3133
+ 'label' => esc_html__( 'Left Sidebar', 'option-tree' ),
3134
+ 'src' => OT_URL . 'assets/images/layout/left-sidebar.png',
3135
+ ),
3136
+ array(
3137
+ 'value' => 'right-sidebar',
3138
+ 'label' => esc_html__( 'Right Sidebar', 'option-tree' ),
3139
+ 'src' => OT_URL . 'assets/images/layout/right-sidebar.png',
3140
+ ),
3141
+ array(
3142
+ 'value' => 'full-width',
3143
+ 'label' => esc_html__( 'Full Width (no sidebar)', 'option-tree' ),
3144
+ 'src' => OT_URL . 'assets/images/layout/full-width.png',
3145
+ ),
3146
+ array(
3147
+ 'value' => 'dual-sidebar',
3148
+ 'label' => esc_html__( 'Dual Sidebar', 'option-tree' ),
3149
+ 'src' => OT_URL . 'assets/images/layout/dual-sidebar.png',
3150
+ ),
3151
+ array(
3152
+ 'value' => 'left-dual-sidebar',
3153
+ 'label' => esc_html__( 'Left Dual Sidebar', 'option-tree' ),
3154
+ 'src' => OT_URL . 'assets/images/layout/left-dual-sidebar.png',
3155
+ ),
3156
+ array(
3157
+ 'value' => 'right-dual-sidebar',
3158
+ 'label' => esc_html__( 'Right Dual Sidebar', 'option-tree' ),
3159
+ 'src' => OT_URL . 'assets/images/layout/right-dual-sidebar.png',
3160
+ ),
3161
+ ),
3162
+ $field_id
3163
+ );
3164
+
3165
+ }
3166
+ }
3167
+
3168
+ if ( ! function_exists( 'ot_list_item_settings' ) ) {
3169
+
3170
+ /**
3171
+ * Default List Item Settings array.
3172
+ *
3173
+ * Returns an array of the default list item settings.
3174
+ * You can filter this function to change the settings
3175
+ * on a per option basis.
3176
+ *
3177
+ * @uses apply_filters()
3178
+ *
3179
+ * @param string $field_id ID that's passed to the filter.
3180
+ *
3181
+ * @return array
3182
+ *
3183
+ * @access public
3184
+ * @since 2.0
3185
+ */
3186
+ function ot_list_item_settings( $field_id ) {
3187
+
3188
+ $settings = apply_filters(
3189
+ 'ot_list_item_settings',
3190
+ array(
3191
+ array(
3192
+ 'id' => 'image',
3193
+ 'label' => esc_html__( 'Image', 'option-tree' ),
3194
+ 'desc' => '',
3195
+ 'std' => '',
3196
+ 'type' => 'upload',
3197
+ 'rows' => '',
3198
+ 'class' => '',
3199
+ 'post_type' => '',
3200
+ 'choices' => array(),
3201
+ ),
3202
+ array(
3203
+ 'id' => 'link',
3204
+ 'label' => esc_html__( 'Link', 'option-tree' ),
3205
+ 'desc' => '',
3206
+ 'std' => '',
3207
+ 'type' => 'text',
3208
+ 'rows' => '',
3209
+ 'class' => '',
3210
+ 'post_type' => '',
3211
+ 'choices' => array(),
3212
+ ),
3213
+ array(
3214
+ 'id' => 'description',
3215
+ 'label' => esc_html__( 'Description', 'option-tree' ),
3216
+ 'desc' => '',
3217
+ 'std' => '',
3218
+ 'type' => 'textarea-simple',
3219
+ 'rows' => 10,
3220
+ 'class' => '',
3221
+ 'post_type' => '',
3222
+ 'choices' => array(),
3223
+ ),
3224
+ ),
3225
+ $field_id
3226
+ );
3227
+
3228
+ return $settings;
3229
+ }
3230
+ }
3231
+
3232
+ if ( ! function_exists( 'ot_slider_settings' ) ) {
3233
+
3234
+ /**
3235
+ * Default Slider Settings array.
3236
+ *
3237
+ * Returns an array of the default slider settings.
3238
+ * You can filter this function to change the settings
3239
+ * on a per option basis.
3240
+ *
3241
+ * @uses apply_filters()
3242
+ *
3243
+ * @param string $field_id ID that's passed to the filter.
3244
+ *
3245
+ * @return array
3246
+ *
3247
+ * @access public
3248
+ * @since 2.0
3249
+ */
3250
+ function ot_slider_settings( $field_id ) {
3251
+
3252
+ $settings = apply_filters(
3253
+ 'image_slider_fields',
3254
+ array(
3255
+ array(
3256
+ 'name' => 'image',
3257
+ 'type' => 'image',
3258
+ 'label' => esc_html__( 'Image', 'option-tree' ),
3259
+ 'class' => '',
3260
+ ),
3261
+ array(
3262
+ 'name' => 'link',
3263
+ 'type' => 'text',
3264
+ 'label' => esc_html__( 'Link', 'option-tree' ),
3265
+ 'class' => '',
3266
+ ),
3267
+ array(
3268
+ 'name' => 'description',
3269
+ 'type' => 'textarea',
3270
+ 'label' => esc_html__( 'Description', 'option-tree' ),
3271
+ 'class' => '',
3272
+ ),
3273
+ ),
3274
+ $field_id
3275
+ );
3276
+
3277
+ // Fix the array keys, values, and just get it 2.0 ready.
3278
+ foreach ( $settings as $_k => $setting ) {
3279
+
3280
+ foreach ( $setting as $s_key => $s_value ) {
3281
+
3282
+ if ( 'name' === $s_key ) {
3283
+
3284
+ $settings[ $_k ]['id'] = $s_value;
3285
+ unset( $settings[ $_k ]['name'] );
3286
+ } elseif ( 'type' === $s_key ) {
3287
+
3288
+ if ( 'input' === $s_value ) {
3289
+
3290
+ $settings[ $_k ]['type'] = 'text';
3291
+ } elseif ( 'textarea' === $s_value ) {
3292
+
3293
+ $settings[ $_k ]['type'] = 'textarea-simple';
3294
+ } elseif ( 'image' === $s_value ) {
3295
+
3296
+ $settings[ $_k ]['type'] = 'upload';
3297
+ }
3298
+ }
3299
+ }
3300
+ }
3301
+
3302
+ return $settings;
3303
+ }
3304
+ }
3305
+
3306
+ if ( ! function_exists( 'ot_social_links_settings' ) ) {
3307
+
3308
+ /**
3309
+ * Default Social Links Settings array.
3310
+ *
3311
+ * Returns an array of the default social links settings.
3312
+ * You can filter this function to change the settings
3313
+ * on a per option basis.
3314
+ *
3315
+ * @uses apply_filters()
3316
+ *
3317
+ * @param string $field_id ID that's passed to the filter.
3318
+ *
3319
+ * @return array
3320
+ *
3321
+ * @access public
3322
+ * @since 2.4.0
3323
+ */
3324
+ function ot_social_links_settings( $field_id ) {
3325
+
3326
+ /* translators: %s: the http protocol */
3327
+ $string = esc_html__( 'Enter a link to the profile or page on the social website. Remember to add the %s part to the front of the link.', 'option-tree' );
3328
+ $settings = apply_filters(
3329
+ 'ot_social_links_settings',
3330
+ array(
3331
+ array(
3332
+ 'id' => 'name',
3333
+ 'label' => esc_html__( 'Name', 'option-tree' ),
3334
+ 'desc' => esc_html__( 'Enter the name of the social website.', 'option-tree' ),
3335
+ 'std' => '',
3336
+ 'type' => 'text',
3337
+ 'class' => 'option-tree-setting-title',
3338
+ ),
3339
+ array(
3340
+ 'id' => 'title',
3341
+ 'label' => 'Title',
3342
+ 'desc' => esc_html__( 'Enter the text shown in the title attribute of the link.', 'option-tree' ),
3343
+ 'type' => 'text',
3344
+ ),
3345
+ array(
3346
+ 'id' => 'href',
3347
+ 'label' => 'Link',
3348
+ 'desc' => sprintf( $string, '<code>http:// or https://</code>' ),
3349
+ 'type' => 'text',
3350
+ ),
3351
+ ),
3352
+ $field_id
3353
+ );
3354
+
3355
+ return $settings;
3356
+ }
3357
+ }
3358
+
3359
+ if ( ! function_exists( 'ot_insert_css_with_markers' ) ) {
3360
+
3361
+ /**
3362
+ * Inserts CSS with field_id markers.
3363
+ *
3364
+ * Inserts CSS into a dynamic.css file, placing it between
3365
+ * BEGIN and END field_id markers. Replaces existing marked info,
3366
+ * but still retains surrounding data.
3367
+ *
3368
+ * @param string $field_id The CSS option field ID.
3369
+ * @param string $insertion The current option_tree array.
3370
+ * @param bool $meta Whether or not the value is stored in meta.
3371
+ * @return bool True on write success, false on failure.
3372
+ *
3373
+ * @access public
3374
+ * @since 1.1.8
3375
+ * @updated 2.5.3
3376
+ */
3377
+ function ot_insert_css_with_markers( $field_id = '', $insertion = '', $meta = false ) {
3378
+
3379
+ // Missing $field_id or $insertion exit early.
3380
+ if ( '' === $field_id || '' === $insertion ) {
3381
+ return;
3382
+ }
3383
+
3384
+ // Path to the dynamic.css file.
3385
+ $filepath = get_stylesheet_directory() . '/dynamic.css';
3386
+ if ( is_multisite() ) {
3387
+ $multisite_filepath = get_stylesheet_directory() . '/dynamic-' . get_current_blog_id() . '.css';
3388
+ if ( file_exists( $multisite_filepath ) ) {
3389
+ $filepath = $multisite_filepath;
3390
+ }
3391
+ }
3392
+
3393
+ // Allow filter on path.
3394
+ $filepath = apply_filters( 'css_option_file_path', $filepath, $field_id );
3395
+
3396
+ // Grab a copy of the paths array.
3397
+ $ot_css_file_paths = get_option( 'ot_css_file_paths', array() );
3398
+ if ( is_multisite() ) {
3399
+ $ot_css_file_paths = get_blog_option( get_current_blog_id(), 'ot_css_file_paths', $ot_css_file_paths );
3400
+ }
3401
+
3402
+ // Set the path for this field.
3403
+ $ot_css_file_paths[ $field_id ] = $filepath;
3404
+
3405
+ /* update the paths */
3406
+ if ( is_multisite() ) {
3407
+ update_blog_option( get_current_blog_id(), 'ot_css_file_paths', $ot_css_file_paths );
3408
+ } else {
3409
+ update_option( 'ot_css_file_paths', $ot_css_file_paths );
3410
+ }
3411
+
3412
+ // Remove CSS from file, but ensure the file is actually CSS first.
3413
+ $file_parts = explode( '.', basename( $filepath ) );
3414
+ $file_ext = end( $file_parts );
3415
+ if ( is_writeable( $filepath ) && 'css' === $file_ext ) {
3416
+
3417
+ $insertion = ot_normalize_css( $insertion );
3418
+ $regex = '/{{([a-zA-Z0-9\_\-\#\|\=]+)}}/';
3419
+ $marker = $field_id;
3420
+
3421
+ // Match custom CSS.
3422
+ preg_match_all( $regex, $insertion, $matches );
3423
+
3424
+ // Loop through CSS.
3425
+ foreach ( $matches[0] as $option ) {
3426
+
3427
+ $value = '';
3428
+ $option_array = explode( '|', str_replace( array( '{{', '}}' ), '', $option ) );
3429
+ $option_id = isset( $option_array[0] ) ? $option_array[0] : '';
3430
+ $option_key = isset( $option_array[1] ) ? $option_array[1] : '';
3431
+ $option_type = ot_get_option_type_by_id( $option_id );
3432
+ $fallback = '';
3433
+
3434
+ // Get the meta array value.
3435
+ if ( $meta ) {
3436
+ global $post;
3437
+
3438
+ $value = get_post_meta( $post->ID, $option_id, true );
3439
+
3440
+ // Get the options array value.
3441
+ } else {
3442
+ $options = get_option( ot_options_id() );
3443
+
3444
+ if ( isset( $options[ $option_id ] ) ) {
3445
+ $value = $options[ $option_id ];
3446
+ }
3447
+ }
3448
+
3449
+ // This in an array of values.
3450
+ if ( is_array( $value ) ) {
3451
+
3452
+ if ( empty( $option_key ) ) {
3453
+
3454
+ // Measurement.
3455
+ if ( 'measurement' === $option_type ) {
3456
+ $unit = ! empty( $value[1] ) ? $value[1] : 'px';
3457
+
3458
+ // Set $value with measurement properties.
3459
+ if ( isset( $value[0] ) && strlen( $value[0] ) > 0 ) {
3460
+ $value = $value[0] . $unit;
3461
+ }
3462
+
3463
+ // Border.
3464
+ } elseif ( 'border' === $option_type ) {
3465
+ $border = array();
3466
+
3467
+ $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3468
+
3469
+ if ( isset( $value['width'] ) && strlen( $value['width'] ) > 0 ) {
3470
+ $border[] = $value['width'] . $unit;
3471
+ }
3472
+
3473
+ if ( ! empty( $value['style'] ) ) {
3474
+ $border[] = $value['style'];
3475
+ }
3476
+
3477
+ if ( ! empty( $value['color'] ) ) {
3478
+ $border[] = $value['color'];
3479
+ }
3480
+
3481
+ // Set $value with border properties or empty string.
3482
+ $value = ! empty( $border ) ? implode( ' ', $border ) : '';
3483
+
3484
+ // Box Shadow.
3485
+ } elseif ( 'box-shadow' === $option_type ) {
3486
+
3487
+ $value_safe = array();
3488
+ foreach ( $value as $val ) {
3489
+ if ( ! empty( $val ) ) {
3490
+ $value_safe[] = $val;
3491
+ }
3492
+ }
3493
+ // Set $value with box-shadow properties or empty string.
3494
+ $value = ! empty( $value_safe ) ? implode( ' ', $value_safe ) : '';
3495
+
3496
+ // Dimension.
3497
+ } elseif ( 'dimension' === $option_type ) {
3498
+ $dimension = array();
3499
+
3500
+ $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3501
+
3502
+ if ( isset( $value['width'] ) && strlen( $value['width'] ) > 0 ) {
3503
+ $dimension[] = $value['width'] . $unit;
3504
+ }
3505
+
3506
+ if ( isset( $value['height'] ) && strlen( $value['height'] ) > 0 ) {
3507
+ $dimension[] = $value['height'] . $unit;
3508
+ }
3509
+
3510
+ // Set $value with dimension properties or empty string.
3511
+ $value = ! empty( $dimension ) ? implode( ' ', $dimension ) : '';
3512
+
3513
+ // Spacing.
3514
+ } elseif ( 'spacing' === $option_type ) {
3515
+ $spacing = array();
3516
+
3517
+ $unit = ! empty( $value['unit'] ) ? $value['unit'] : 'px';
3518
+
3519
+ if ( isset( $value['top'] ) && strlen( $value['top'] ) > 0 ) {
3520
+ $spacing[] = $value['top'] . $unit;
3521
+ }
3522
+
3523
+ if ( isset( $value['right'] ) && strlen( $value['right'] ) > 0 ) {
3524
+ $spacing[] = $value['right'] . $unit;
3525
+ }
3526
+
3527
+ if ( isset( $value['bottom'] ) && strlen( $value['bottom'] ) > 0 ) {
3528
+ $spacing[] = $value['bottom'] . $unit;
3529
+ }
3530
+
3531
+ if ( isset( $value['left'] ) && strlen( $value['left'] ) > 0 ) {
3532
+ $spacing[] = $value['left'] . $unit;
3533
+ }
3534
+
3535
+ // Set $value with spacing properties or empty string.
3536
+ $value = ! empty( $spacing ) ? implode( ' ', $spacing ) : '';
3537
+
3538
+ // Typography.
3539
+ } elseif ( 'typography' === $option_type ) {
3540
+ $font = array();
3541
+
3542
+ if ( ! empty( $value['font-color'] ) ) {
3543
+ $font[] = 'color: ' . $value['font-color'] . ';';
3544
+ }
3545
+
3546
+ if ( ! empty( $value['font-family'] ) ) {
3547
+ foreach ( ot_recognized_font_families( $marker ) as $key => $v ) {
3548
+ if ( $key === $value['font-family'] ) {
3549
+ $font[] = 'font-family: ' . $v . ';';
3550
+ }
3551
+ }
3552
+ }
3553
+
3554
+ if ( ! empty( $value['font-size'] ) ) {
3555
+ $font[] = 'font-size: ' . $value['font-size'] . ';';
3556
+ }
3557
+
3558
+ if ( ! empty( $value['font-style'] ) ) {
3559
+ $font[] = 'font-style: ' . $value['font-style'] . ';';
3560
+ }
3561
+
3562
+ if ( ! empty( $value['font-variant'] ) ) {
3563
+ $font[] = 'font-variant: ' . $value['font-variant'] . ';';
3564
+ }
3565
+
3566
+ if ( ! empty( $value['font-weight'] ) ) {
3567
+ $font[] = 'font-weight: ' . $value['font-weight'] . ';';
3568
+ }
3569
+
3570
+ if ( ! empty( $value['letter-spacing'] ) ) {
3571
+ $font[] = 'letter-spacing: ' . $value['letter-spacing'] . ';';
3572
+ }
3573
+
3574
+ if ( ! empty( $value['line-height'] ) ) {
3575
+ $font[] = 'line-height: ' . $value['line-height'] . ';';
3576
+ }
3577
+
3578
+ if ( ! empty( $value['text-decoration'] ) ) {
3579
+ $font[] = 'text-decoration: ' . $value['text-decoration'] . ';';
3580
+ }
3581
+
3582
+ if ( ! empty( $value['text-transform'] ) ) {
3583
+ $font[] = 'text-transform: ' . $value['text-transform'] . ';';
3584
+ }
3585
+
3586
+ // Set $value with font properties or empty string.
3587
+ $value = ! empty( $font ) ? implode( "\n", $font ) : '';
3588
+
3589
+ // Background.
3590
+ } elseif ( 'background' === $option_type ) {
3591
+ $bg = array();
3592
+
3593
+ if ( ! empty( $value['background-color'] ) ) {
3594
+ $bg[] = $value['background-color'];
3595
+ }
3596
+
3597
+ if ( ! empty( $value['background-image'] ) ) {
3598
+
3599
+ // If an attachment ID is stored here fetch its URL and replace the value.
3600
+ if ( wp_attachment_is_image( $value['background-image'] ) ) {
3601
+
3602
+ $attachment_data = wp_get_attachment_image_src( $value['background-image'], 'original' );
3603
+
3604
+ // Check for attachment data.
3605
+ if ( $attachment_data ) {
3606
+ $value['background-image'] = $attachment_data[0];
3607
+ }
3608
+ }
3609
+
3610
+ $bg[] = 'url("' . $value['background-image'] . '")';
3611
+ }
3612
+
3613
+ if ( ! empty( $value['background-repeat'] ) ) {
3614
+ $bg[] = $value['background-repeat'];
3615
+ }
3616
+
3617
+ if ( ! empty( $value['background-attachment'] ) ) {
3618
+ $bg[] = $value['background-attachment'];
3619
+ }
3620
+
3621
+ if ( ! empty( $value['background-position'] ) ) {
3622
+ $bg[] = $value['background-position'];
3623
+ }
3624
+
3625
+ if ( ! empty( $value['background-size'] ) ) {
3626
+ $size = $value['background-size'];
3627
+ }
3628
+
3629
+ // Set $value with background properties or empty string.
3630
+ $value = ! empty( $bg ) ? 'background: ' . implode( ' ', $bg ) . ';' : '';
3631
+
3632
+ if ( isset( $size ) ) {
3633
+ if ( ! empty( $bg ) ) {
3634
+ $value .= apply_filters( 'ot_insert_css_with_markers_bg_size_white_space', "\n\x20\x20", $option_id );
3635
+ }
3636
+ $value .= "background-size: $size;";
3637
+ }
3638
+ }
3639
+ } elseif ( ! empty( $value[ $option_key ] ) ) {
3640
+ $value = $value[ $option_key ];
3641
+ }
3642
+ }
3643
+
3644
+ // If an attachment ID is stored here fetch its URL and replace the value.
3645
+ if ( 'upload' === $option_type && wp_attachment_is_image( $value ) ) {
3646
+
3647
+ $attachment_data = wp_get_attachment_image_src( $value, 'original' );
3648
+
3649
+ // Check for attachment data.
3650
+ if ( $attachment_data ) {
3651
+ $value = $attachment_data[0];
3652
+ }
3653
+ }
3654
+
3655
+ // Attempt to fallback when `$value` is empty.
3656
+ if ( empty( $value ) ) {
3657
+
3658
+ // We're trying to access a single array key.
3659
+ if ( ! empty( $option_key ) ) {
3660
+
3661
+ // Link Color `inherit`.
3662
+ if ( 'link-color' === $option_type ) {
3663
+ $fallback = 'inherit';
3664
+ }
3665
+ } else {
3666
+
3667
+ // Border.
3668
+ if ( 'border' === $option_type ) {
3669
+ $fallback = 'inherit';
3670
+ }
3671
+
3672
+ // Box Shadow.
3673
+ if ( 'box-shadow' === $option_type ) {
3674
+ $fallback = 'none';
3675
+ }
3676
+
3677
+ // Colorpicker.
3678
+ if ( 'colorpicker' === $option_type ) {
3679
+ $fallback = 'inherit';
3680
+ }
3681
+
3682
+ // Colorpicker Opacity.
3683
+ if ( 'colorpicker-opacity' === $option_type ) {
3684
+ $fallback = 'inherit';
3685
+ }
3686
+ }
3687
+
3688
+ /**
3689
+ * Filter the `dynamic.css` fallback value.
3690
+ *
3691
+ * @since 2.5.3
3692
+ *
3693
+ * @param string $fallback The default CSS fallback value.
3694
+ * @param string $option_id The option ID.
3695
+ * @param string $option_type The option type.
3696
+ * @param string $option_key The option array key.
3697
+ */
3698
+ $fallback = apply_filters( 'ot_insert_css_with_markers_fallback', $fallback, $option_id, $option_type, $option_key );
3699
+ }
3700
+
3701
+ // Let's fallback!
3702
+ if ( ! empty( $fallback ) ) {
3703
+ $value = $fallback;
3704
+ }
3705
+
3706
+ // Filter the CSS.
3707
+ $value = apply_filters( 'ot_insert_css_with_markers_value', $value, $option_id );
3708
+
3709
+ // Insert CSS, even if the value is empty.
3710
+ $insertion = stripslashes( str_replace( $option, $value, $insertion ) );
3711
+ }
3712
+
3713
+ // Can't write to the file so we error out.
3714
+ if ( ! is_writable( $filepath ) ) {
3715
+ /* translators: %s: file path */
3716
+ $string = esc_html__( 'Unable to write to file %s.', 'option-tree' );
3717
+ add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3718
+ return false;
3719
+ }
3720
+
3721
+ // Open file.
3722
+ $f = @fopen( $filepath, 'w' ); // phpcs:ignore
3723
+
3724
+ // Can't write to the file return false.
3725
+ if ( ! $f ) {
3726
+ /* translators: %s: file path */
3727
+ $string = esc_html__( 'Unable to open the %s file in write mode.', 'option-tree' );
3728
+ add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3729
+ return false;
3730
+ }
3731
+
3732
+ // Create array from the lines of code.
3733
+ $markerdata = explode( "\n", implode( '', file( $filepath ) ) );
3734
+
3735
+ $searching = true;
3736
+ $foundit = false;
3737
+
3738
+ // Has array of lines.
3739
+ if ( ! empty( $markerdata ) ) {
3740
+
3741
+ // Foreach line of code.
3742
+ foreach ( $markerdata as $n => $markerline ) {
3743
+
3744
+ // Found begining of marker, set $searching to false.
3745
+ if ( "/* BEGIN {$marker} */" === $markerline ) {
3746
+ $searching = false;
3747
+ }
3748
+
3749
+ // Keep searching each line of CSS.
3750
+ if ( true === $searching ) {
3751
+ if ( $n + 1 < count( $markerdata ) ) {
3752
+ fwrite( $f, "{$markerline}\n" ); // phpcs:ignore
3753
+ } else {
3754
+ fwrite( $f, "{$markerline}" ); // phpcs:ignore
3755
+ }
3756
+ }
3757
+
3758
+ // Found end marker write code.
3759
+ if ( "/* END {$marker} */" === $markerline ) {
3760
+ fwrite( $f, "/* BEGIN {$marker} */\n" ); // phpcs:ignore
3761
+ fwrite( $f, "{$insertion}\n" ); // phpcs:ignore
3762
+ fwrite( $f, "/* END {$marker} */\n" ); // phpcs:ignore
3763
+ $searching = true;
3764
+ $foundit = true;
3765
+ }
3766
+ }
3767
+ }
3768
+
3769
+ // Nothing inserted, write code. DO IT, DO IT!
3770
+ if ( ! $foundit ) {
3771
+ fwrite( $f, "/* BEGIN {$marker} */\n" ); // phpcs:ignore
3772
+ fwrite( $f, "{$insertion}\n" ); // phpcs:ignore
3773
+ fwrite( $f, "/* END {$marker} */\n" ); // phpcs:ignore
3774
+ }
3775
+
3776
+ // Close file.
3777
+ fclose( $f ); // phpcs:ignore
3778
+ return true;
3779
+ }
3780
+
3781
+ return false;
3782
+ }
3783
+ }
3784
+
3785
+ if ( ! function_exists( 'ot_remove_old_css' ) ) {
3786
+
3787
+ /**
3788
+ * Remove old CSS.
3789
+ *
3790
+ * Removes CSS when the textarea is empty, but still retains surrounding styles.
3791
+ *
3792
+ * @param string $field_id The CSS option field ID.
3793
+ * @return bool True on write success, false on failure.
3794
+ *
3795
+ * @access public
3796
+ * @since 2.0
3797
+ */
3798
+ function ot_remove_old_css( $field_id = '' ) {
3799
+
3800
+ // Missing $field_id string.
3801
+ if ( '' === $field_id ) {
3802
+ return false;
3803
+ }
3804
+
3805
+ // Path to the dynamic.css file.
3806
+ $filepath = get_stylesheet_directory() . '/dynamic.css';
3807
+
3808
+ // Allow filter on path.
3809
+ $filepath = apply_filters( 'css_option_file_path', $filepath, $field_id );
3810
+
3811
+ // Remove CSS from file, but ensure the file is actually CSS first.
3812
+ if ( is_writeable( $filepath ) && 'css' === end( explode( '.', basename( $filepath ) ) ) ) {
3813
+
3814
+ // Open the file.
3815
+ $f = @fopen( $filepath, 'w' ); // phpcs:ignore
3816
+
3817
+ // Can't write to the file return false.
3818
+ if ( ! $f ) {
3819
+ /* translators: %s: file path */
3820
+ $string = esc_html__( 'Unable to open the %s file in write mode.', 'option-tree' );
3821
+ add_settings_error( 'option-tree', 'dynamic_css', sprintf( $string, '<code>' . $filepath . '</code>' ), 'error' );
3822
+ return false;
3823
+ }
3824
+
3825
+ // Get each line in the file.
3826
+ $markerdata = explode( "\n", implode( '', file( $filepath ) ) );
3827
+
3828
+ $searching = true;
3829
+
3830
+ // Has array of lines.
3831
+ if ( ! empty( $markerdata ) ) {
3832
+
3833
+ // Foreach line of code.
3834
+ foreach ( $markerdata as $n => $markerline ) {
3835
+
3836
+ // Found beginning of marker, set $searching to false.
3837
+ if ( "/* BEGIN {$field_id} */" === $markerline ) {
3838
+ $searching = false;
3839
+ }
3840
+
3841
+ // Searching is true, keep writing each line of CSS.
3842
+ if ( true === $searching ) {
3843
+ if ( $n + 1 < count( $markerdata ) ) {
3844
+ fwrite( $f, "{$markerline}\n" ); // phpcs:ignore
3845
+ } else {
3846
+ fwrite( $f, "{$markerline}" ); // phpcs:ignore
3847
+ }
3848
+ }
3849
+
3850
+ // Found end marker delete old CSS.
3851
+ if ( "/* END {$field_id} */" === $markerline ) {
3852
+ fwrite( $f, '' ); // phpcs:ignore
3853
+ $searching = true;
3854
+ }
3855
+ }
3856
+ }
3857
+
3858
+ // Close file.
3859
+ fclose( $f ); // phpcs:ignore
3860
+ return true;
3861
+ }
3862
+
3863
+ return false;
3864
+ }
3865
+ }
3866
+
3867
+ if ( ! function_exists( 'ot_normalize_css' ) ) {
3868
+
3869
+ /**
3870
+ * Normalize CSS
3871
+ *
3872
+ * Normalize & Convert all line-endings to UNIX format.
3873
+ *
3874
+ * @param string $css The CSS styles.
3875
+ *
3876
+ * @return string
3877
+ *
3878
+ * @access public
3879
+ * @since 1.1.8
3880
+ * @updated 2.0
3881
+ */
3882
+ function ot_normalize_css( $css ) {
3883
+
3884
+ // Normalize & Convert.
3885
+ $css = str_replace( "\r\n", "\n", $css );
3886
+ $css = str_replace( "\r", "\n", $css );
3887
+
3888
+ // Don't allow out-of-control blank lines .
3889
+ $css = preg_replace( "/\n{2,}/", "\n\n", $css );
3890
+
3891
+ return $css;
3892
+ }
3893
+ }
3894
+
3895
+ if ( ! function_exists( 'ot_loop_through_option_types' ) ) {
3896
+
3897
+ /**
3898
+ * Helper function to loop over the option types.
3899
+ *
3900
+ * @param string $type The current option type.
3901
+ * @param bool $child Whether of not there are children elements.
3902
+ *
3903
+ * @return string
3904
+ *
3905
+ * @access public
3906
+ * @since 2.0
3907
+ */
3908
+ function ot_loop_through_option_types( $type = '', $child = false ) {
3909
+
3910
+ $content = '';
3911
+ $types = ot_option_types_array();
3912
+
3913
+ if ( $child ) {
3914
+ unset( $types['list-item'] );
3915
+ }
3916
+
3917
+ foreach ( $types as $key => $value ) {
3918
+ $content .= '<option value="' . esc_attr( $key ) . '" ' . selected( $type, $key, false ) . '>' . esc_html( $value ) . '</option>';
3919
+ }
3920
+
3921
+ return $content;
3922
+
3923
+ }
3924
+ }
3925
+
3926
+ if ( ! function_exists( 'ot_loop_through_choices' ) ) {
3927
+
3928
+ /**
3929
+ * Helper function to loop over choices.
3930
+ *
3931
+ * @param string $name The form element name.
3932
+ * @param array $choices The array of choices.
3933
+ *
3934
+ * @return string
3935
+ *
3936
+ * @access public
3937
+ * @since 2.0
3938
+ */
3939
+ function ot_loop_through_choices( $name, $choices = array() ) {
3940
+
3941
+ $content = '';
3942
+
3943
+ foreach ( (array) $choices as $key => $choice ) {
3944
+ if ( is_array( $choice ) ) {
3945
+ $content .= '<li class="ui-state-default list-choice">' . ot_choices_view( $name, $key, $choice ) . '</li>';
3946
+ }
3947
+ }
3948
+
3949
+ return $content;
3950
+ }
3951
+ }
3952
+
3953
+ if ( ! function_exists( 'ot_loop_through_sub_settings' ) ) {
3954
+
3955
+ /**
3956
+ * Helper function to loop over sub settings.
3957
+ *
3958
+ * @param string $name The form element name.
3959
+ * @param array $settings The array of settings.
3960
+ *
3961
+ * @return string
3962
+ *
3963
+ * @access public
3964
+ * @since 2.0
3965
+ */
3966
+ function ot_loop_through_sub_settings( $name, $settings = array() ) {
3967
+
3968
+ $content = '';
3969
+
3970
+ foreach ( $settings as $key => $setting ) {
3971
+ if ( is_array( $setting ) ) {
3972
+ $content .= '<li class="ui-state-default list-sub-setting">' . ot_settings_view( $name, $key, $setting ) . '</li>';
3973
+ }
3974
+ }
3975
+
3976
+ return $content;
3977
+ }
3978
+ }
3979
+
3980
+ if ( ! function_exists( 'ot_sections_view' ) ) {
3981
+
3982
+ /**
3983
+ * Helper function to display sections.
3984
+ *
3985
+ * This function is used in AJAX to add a new section
3986
+ * and when section have already been added and saved.
3987
+ *
3988
+ * @param string $name The form element name.
3989
+ * @param int $key The array key for the current element.
3990
+ * @param array $section An array of values for the current section.
3991
+ *
3992
+ * @return string
3993
+ *
3994
+ * @access public
3995
+ * @since 2.0
3996
+ */
3997
+ function ot_sections_view( $name, $key, $section = array() ) {
3998
+
3999
+ /* translators: %s: Section Title emphasized */
4000
+ $str_title = esc_html__( '%s: Displayed as a menu item on the Theme Options page.', 'option-tree' );
4001
+
4002
+ /* translators: %s: Section ID emphasized */
4003
+ $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4004
+
4005
+ return '
4006
+ <div class="option-tree-setting is-section">
4007
+ <div class="open">' . ( isset( $section['title'] ) ? esc_attr( $section['title'] ) : 'Section ' . ( absint( $key ) + 1 ) ) . '</div>
4008
+ <div class="button-section">
4009
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'edit', 'option-tree' ) . '">
4010
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4011
+ </a>
4012
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4013
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4014
+ </a>
4015
+ </div>
4016
+ <div class="option-tree-setting-body">
4017
+ <div class="format-settings">
4018
+ <div class="format-setting type-text">
4019
+ <div class="description">' . sprintf( $str_title, '<strong>' . esc_html__( 'Section Title', 'option-tree' ) . '</strong>', 'option-tree' ) . '</div>
4020
+ <div class="format-setting-inner">
4021
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][title]" value="' . ( isset( $section['title'] ) ? esc_attr( $section['title'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title section-title" autocomplete="off" />
4022
+ </div>
4023
+ </div>
4024
+ </div>
4025
+ <div class="format-settings">
4026
+ <div class="format-setting type-text">
4027
+ <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'Section ID', 'option-tree' ) . '</strong>', 'option-tree' ) . '</div>
4028
+ <div class="format-setting-inner">
4029
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $section['id'] ) ? esc_attr( $section['id'] ) : '' ) . '" class="widefat option-tree-ui-input section-id" autocomplete="off" />
4030
+ </div>
4031
+ </div>
4032
+ </div>
4033
+ </div>
4034
+ </div>';
4035
+ }
4036
+ }
4037
+
4038
+ if ( ! function_exists( 'ot_settings_view' ) ) {
4039
+
4040
+ /**
4041
+ * Helper function to display settings.
4042
+ *
4043
+ * This function is used in AJAX to add a new setting
4044
+ * and when settings have already been added and saved.
4045
+ *
4046
+ * @param string $name The form element name.
4047
+ * @param int $key The array key for the current element.
4048
+ * @param array $setting An array of values for the current setting.
4049
+ *
4050
+ * @return string
4051
+ *
4052
+ * @access public
4053
+ * @since 2.0
4054
+ */
4055
+ function ot_settings_view( $name, $key, $setting = array() ) {
4056
+
4057
+ $child = ( false !== strpos( $name, '][settings]' ) ) ? true : false;
4058
+ $type = isset( $setting['type'] ) ? $setting['type'] : '';
4059
+ $std = isset( $setting['std'] ) ? $setting['std'] : '';
4060
+ $operator = isset( $setting['operator'] ) ? esc_attr( $setting['operator'] ) : 'and';
4061
+
4062
+ // Serialize the standard value just in case.
4063
+ if ( is_array( $std ) ) {
4064
+ $std = maybe_serialize( $std );
4065
+ }
4066
+
4067
+ if ( in_array( $type, array( 'css', 'javascript', 'textarea', 'textarea-simple' ), true ) ) {
4068
+ $std_form_element = '<textarea class="textarea" rows="10" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][std]">' . esc_html( $std ) . '</textarea>';
4069
+ } else {
4070
+ $std_form_element = '<input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][std]" value="' . esc_attr( $std ) . '" class="widefat option-tree-ui-input" autocomplete="off" />';
4071
+ }
4072
+
4073
+ /* translators: %s: Label emphasized */
4074
+ $str_label = esc_html__( '%s: Displayed as the label of a form element on the Theme Options page.', 'option-tree' );
4075
+
4076
+ /* translators: %s: ID emphasized */
4077
+ $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4078
+
4079
+ /* translators: %s: Type emphasized */
4080
+ $str_type = esc_html__( '%s: Choose one of the available option types from the dropdown.', 'option-tree' );
4081
+
4082
+ /* translators: %s: Description emphasized */
4083
+ $str_desc = esc_html__( '%s: Enter a detailed description for the users to read on the Theme Options page, HTML is allowed. This is also where you enter content for both the Textblock & Textblock Titled option types.', 'option-tree' );
4084
+
4085
+ /* translators: %s: Choices emphasized */
4086
+ $str_choices = esc_html__( '%s: This will only affect the following option types: Checkbox, Radio, Select & Select Image.', 'option-tree' );
4087
+
4088
+ /* translators: %s: Settings emphasized */
4089
+ $str_settings = esc_html__( '%s: This will only affect the List Item option type.', 'option-tree' );
4090
+
4091
+ /* translators: %1$s: Standard emphasized, %2$s: visual path to documentation */
4092
+ $str_standard = esc_html__( '%1$s: Setting the standard value for your option only works for some option types. Read the %2$s for more information on which ones.', 'option-tree' );
4093
+
4094
+ /* translators: %s: Rows emphasized */
4095
+ $str_rows = esc_html__( '%s: Enter a numeric value for the number of rows in your textarea. This will only affect the following option types: CSS, Textarea, & Textarea Simple.', 'option-tree' );
4096
+
4097
+ /* translators: %s: Post Type emphasized */
4098
+ $str_post_type = esc_html__( '%s: Add a comma separated list of post type like \'post,page\'. This will only affect the following option types: Custom Post Type Checkbox, & Custom Post Type Select.', 'option-tree' );
4099
+
4100
+ /* translators: %s: Taxonomy emphasized */
4101
+ $str_taxonomy = esc_html__( '%s: Add a comma separated list of any registered taxonomy like \'category,post_tag\'. This will only affect the following option types: Taxonomy Checkbox, & Taxonomy Select.', 'option-tree' );
4102
+
4103
+ /* translators: %1$s: Min, Max, & Step emphasized, %2$s: format, %3$s: range, %4$s: minimum interval */
4104
+ $str_min_max_step = esc_html__( '%1$s: Add a comma separated list of options in the following format %2$s (slide from %3$s in intervals of %4$s). The three values represent the minimum, maximum, and step options and will only affect the Numeric Slider option type.', 'option-tree' );
4105
+
4106
+ /* translators: %s: CSS Class emphasized */
4107
+ $str_css_class = esc_html__( '%s: Add and optional class to this option type.', 'option-tree' );
4108
+
4109
+ /* translators: %1$s: Condition emphasized, %2$s: example value, %3$s: list of valid conditions */
4110
+ $str_condition = esc_html__( '%1$s: Add a comma separated list (no spaces) of conditions in which the field will be visible, leave this setting empty to always show the field. In these examples, %2$s is a placeholder for your condition, which can be in the form of %3$s.', 'option-tree' );
4111
+
4112
+ /* translators: %s: Operator emphasized */
4113
+ $str_operator = esc_html__( '%s: Choose the logical operator to compute the result of the conditions.', 'option-tree' );
4114
+
4115
+ return '
4116
+ <div class="option-tree-setting">
4117
+ <div class="open">' . ( isset( $setting['label'] ) ? esc_attr( $setting['label'] ) : 'Setting ' . ( absint( $key ) + 1 ) ) . '</div>
4118
+ <div class="button-section">
4119
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4120
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4121
+ </a>
4122
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4123
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4124
+ </a>
4125
+ </div>
4126
+ <div class="option-tree-setting-body">
4127
+ <div class="format-settings">
4128
+ <div class="format-setting type-text wide-desc">
4129
+ <div class="description">' . sprintf( $str_label, '<strong>' . esc_html__( 'Label', 'option-tree' ) . '</strong>' ) . '</div>
4130
+ <div class="format-setting-inner">
4131
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][label]" value="' . ( isset( $setting['label'] ) ? esc_attr( $setting['label'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4132
+ </div>
4133
+ </div>
4134
+ </div>
4135
+ <div class="format-settings">
4136
+ <div class="format-setting type-text wide-desc">
4137
+ <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'ID', 'option-tree' ) . '</strong>' ) . '</div>
4138
+ <div class="format-setting-inner">
4139
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $setting['id'] ) ? esc_attr( $setting['id'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4140
+ </div>
4141
+ </div>
4142
+ </div>
4143
+ <div class="format-settings">
4144
+ <div class="format-setting type-select wide-desc">
4145
+ <div class="description">' . sprintf( $str_type, '<strong>' . esc_html__( 'Type', 'option-tree' ) . '</strong>' ) . '</div>
4146
+ <div class="format-setting-inner">
4147
+ <select name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][type]" value="' . esc_attr( $type ) . '" class="option-tree-ui-select">
4148
+ ' . ot_loop_through_option_types( $type, $child ) . '
4149
+ </select>
4150
+ </div>
4151
+ </div>
4152
+ </div>
4153
+ <div class="format-settings">
4154
+ <div class="format-setting type-textarea wide-desc">
4155
+ <div class="description">' . sprintf( $str_desc, '<strong>' . esc_html__( 'Description', 'option-tree' ) . '</strong>' ) . '</div>
4156
+ <div class="format-setting-inner">
4157
+ <textarea class="textarea" rows="10" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][desc]">' . ( isset( $setting['desc'] ) ? esc_html( $setting['desc'] ) : '' ) . '</textarea>
4158
+ </div>
4159
+ </div>
4160
+ </div>
4161
+ <div class="format-settings">
4162
+ <div class="format-setting type-textblock wide-desc">
4163
+ <div class="description">' . sprintf( $str_choices, '<strong>' . esc_html__( 'Choices', 'option-tree' ) . '</strong>' ) . '</div>
4164
+ <div class="format-setting-inner">
4165
+ <ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . ']">
4166
+ ' . ( isset( $setting['choices'] ) ? ot_loop_through_choices( $name . '[' . $key . ']', $setting['choices'] ) : '' ) . '
4167
+ </ul>
4168
+ <a href="javascript:void(0);" class="option-tree-choice-add option-tree-ui-button button hug-left">' . esc_html__( 'Add Choice', 'option-tree' ) . '</a>
4169
+ </div>
4170
+ </div>
4171
+ </div>
4172
+ <div class="format-settings">
4173
+ <div class="format-setting type-textblock wide-desc">
4174
+ <div class="description">' . sprintf( $str_settings, '<strong>' . esc_html__( 'Settings', 'option-tree' ) . '</strong>' ) . '</div>
4175
+ <div class="format-setting-inner">
4176
+ <ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . ']">
4177
+ ' . ( isset( $setting['settings'] ) ? ot_loop_through_sub_settings( $name . '[' . $key . '][settings]', $setting['settings'] ) : '' ) . '
4178
+ </ul>
4179
+ <a href="javascript:void(0);" class="option-tree-list-item-setting-add option-tree-ui-button button hug-left">' . esc_html__( 'Add Setting', 'option-tree' ) . '</a>
4180
+ </div>
4181
+ </div>
4182
+ </div>
4183
+ <div class="format-settings">
4184
+ <div class="format-setting type-text wide-desc">
4185
+ <div class="description">' . sprintf( $str_standard, '<strong>' . esc_html__( 'Standard', 'option-tree' ) . '</strong>', '<code>' . esc_html__( 'OptionTree->Documentation', 'option-tree' ) . '</code>' ) . '</div>
4186
+ <div class="format-setting-inner">
4187
+ ' . $std_form_element . '
4188
+ </div>
4189
+ </div>
4190
+ </div>
4191
+ <div class="format-settings">
4192
+ <div class="format-setting type-text wide-desc">
4193
+ <div class="description">' . sprintf( $str_rows, '<strong>' . esc_html__( 'Rows', 'option-tree' ) . '</strong>' ) . '</div>
4194
+ <div class="format-setting-inner">
4195
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][rows]" value="' . ( isset( $setting['rows'] ) ? esc_attr( $setting['rows'] ) : '' ) . '" class="widefat option-tree-ui-input" />
4196
+ </div>
4197
+ </div>
4198
+ </div>
4199
+ <div class="format-settings">
4200
+ <div class="format-setting type-text wide-desc">
4201
+ <div class="description">' . sprintf( $str_post_type, '<strong>' . esc_html__( 'Post Type', 'option-tree' ) . '</strong>' ) . '</div>
4202
+ <div class="format-setting-inner">
4203
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][post_type]" value="' . ( isset( $setting['post_type'] ) ? esc_attr( $setting['post_type'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4204
+ </div>
4205
+ </div>
4206
+ </div>
4207
+ <div class="format-settings">
4208
+ <div class="format-setting type-text wide-desc">
4209
+ <div class="description">' . sprintf( $str_taxonomy, '<strong>' . esc_html__( 'Taxonomy', 'option-tree' ) . '</strong>' ) . '</div>
4210
+ <div class="format-setting-inner">
4211
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][taxonomy]" value="' . ( isset( $setting['taxonomy'] ) ? esc_attr( $setting['taxonomy'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4212
+ </div>
4213
+ </div>
4214
+ </div>
4215
+ <div class="format-settings">
4216
+ <div class="format-setting type-text wide-desc">
4217
+ <div class="description">' . sprintf( $str_min_max_step, '<strong>' . esc_html__( 'Min, Max, & Step', 'option-tree' ) . '</strong>', '<code>0,100,1</code>', '<code>0-100</code>', '<code>1</code>' ) . '</div>
4218
+ <div class="format-setting-inner">
4219
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][min_max_step]" value="' . ( isset( $setting['min_max_step'] ) ? esc_attr( $setting['min_max_step'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4220
+ </div>
4221
+ </div>
4222
+ </div>
4223
+ <div class="format-settings">
4224
+ <div class="format-setting type-text wide-desc">
4225
+ <div class="description">' . sprintf( $str_css_class, '<strong>' . esc_html__( 'CSS Class', 'option-tree' ) . '</strong>' ) . '</div>
4226
+ <div class="format-setting-inner">
4227
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][class]" value="' . ( isset( $setting['class'] ) ? esc_attr( $setting['class'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4228
+ </div>
4229
+ </div>
4230
+ </div>
4231
+ <div class="format-settings">
4232
+ <div class="format-setting type-text wide-desc">
4233
+ <div class="description">' . sprintf( $str_condition, '<strong>' . esc_html__( 'Condition', 'option-tree' ) . '</strong>', '<code>value</code>', '<code>field_id:is(value)</code>, <code>field_id:not(value)</code>, <code>field_id:contains(value)</code>, <code>field_id:less_than(value)</code>, <code>field_id:less_than_or_equal_to(value)</code>, <code>field_id:greater_than(value)</code>, or <code>field_id:greater_than_or_equal_to(value)</code>' ) . '</div>
4234
+ <div class="format-setting-inner">
4235
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][condition]" value="' . ( isset( $setting['condition'] ) ? esc_attr( $setting['condition'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4236
+ </div>
4237
+ </div>
4238
+ </div>
4239
+ <div class="format-settings">
4240
+ <div class="format-setting type-select wide-desc">
4241
+ <div class="description">' . sprintf( $str_operator, '<strong>' . esc_html__( 'Operator', 'option-tree' ) . '</strong>' ) . '</div>
4242
+ <div class="format-setting-inner">
4243
+ <select name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][operator]" value="' . esc_attr( $operator ) . '" class="option-tree-ui-select">
4244
+ <option value="and" ' . selected( $operator, 'and', false ) . '>' . esc_html__( 'and', 'option-tree' ) . '</option>
4245
+ <option value="or" ' . selected( $operator, 'or', false ) . '>' . esc_html__( 'or', 'option-tree' ) . '</option>
4246
+ </select>
4247
+ </div>
4248
+ </div>
4249
+ </div>
4250
+ </div>
4251
+ </div>
4252
+ ' . ( ! $child ? '<input type="hidden" class="hidden-section" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][section]" value="' . ( isset( $setting['section'] ) ? esc_attr( $setting['section'] ) : '' ) . '" />' : '' );
4253
+ }
4254
+ }
4255
+
4256
+ if ( ! function_exists( 'ot_choices_view' ) ) {
4257
+
4258
+ /**
4259
+ * Helper function to display setting choices.
4260
+ *
4261
+ * This function is used in AJAX to add a new choice
4262
+ * and when choices have already been added and saved.
4263
+ *
4264
+ * @param string $name The form element name.
4265
+ * @param int $key The array key for the current element.
4266
+ * @param array $choice An array of values for the current choice.
4267
+ *
4268
+ * @return string
4269
+ *
4270
+ * @access public
4271
+ * @since 2.0
4272
+ */
4273
+ function ot_choices_view( $name, $key, $choice = array() ) {
4274
+
4275
+ return '
4276
+ <div class="option-tree-setting">
4277
+ <div class="open">' . ( isset( $choice['label'] ) ? esc_attr( $choice['label'] ) : 'Choice ' . ( absint( $key ) + 1 ) ) . '</div>
4278
+ <div class="button-section">
4279
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4280
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4281
+ </a>
4282
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4283
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4284
+ </a>
4285
+ </div>
4286
+ <div class="option-tree-setting-body">
4287
+ <div class="format-settings">
4288
+ <div class="format-setting-label">
4289
+ <h5>' . esc_html__( 'Label', 'option-tree' ) . '</h5>
4290
+ </div>
4291
+ <div class="format-setting type-text wide-desc">
4292
+ <div class="format-setting-inner">
4293
+ <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][label]" value="' . ( isset( $choice['label'] ) ? esc_attr( $choice['label'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4294
+ </div>
4295
+ </div>
4296
+ </div>
4297
+ <div class="format-settings">
4298
+ <div class="format-setting-label">
4299
+ <h5>' . esc_html__( 'Value', 'option-tree' ) . '</h5>
4300
+ </div>
4301
+ <div class="format-setting type-text wide-desc">
4302
+ <div class="format-setting-inner">
4303
+ <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][value]" value="' . ( isset( $choice['value'] ) ? esc_attr( $choice['value'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4304
+ </div>
4305
+ </div>
4306
+ </div>
4307
+ <div class="format-settings">
4308
+ <div class="format-setting-label">
4309
+ <h5>' . esc_html__( 'Image Source (Radio Image only)', 'option-tree' ) . '</h5>
4310
+ </div>
4311
+ <div class="format-setting type-text wide-desc">
4312
+ <div class="format-setting-inner">
4313
+ <input type="text" name="' . esc_attr( $name ) . '[choices][' . esc_attr( $key ) . '][src]" value="' . ( isset( $choice['src'] ) ? esc_attr( $choice['src'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4314
+ </div>
4315
+ </div>
4316
+ </div>
4317
+ </div>
4318
+ </div>';
4319
+
4320
+ }
4321
+ }
4322
+
4323
+ if ( ! function_exists( 'ot_contextual_help_view' ) ) {
4324
+
4325
+ /**
4326
+ * Helper function to display sections.
4327
+ *
4328
+ * This function is used in AJAX to add a new section
4329
+ * and when section have already been added and saved.
4330
+ *
4331
+ * @param string $name The name/ID of the help page.
4332
+ * @param int $key The array key for the current element.
4333
+ * @param array $content An array of values for the current section.
4334
+ *
4335
+ * @return string
4336
+ *
4337
+ * @access public
4338
+ * @since 2.0
4339
+ */
4340
+ function ot_contextual_help_view( $name, $key, $content = array() ) {
4341
+
4342
+ /* translators: %s: Title emphasized */
4343
+ $str_title = esc_html__( '%s: Displayed as a contextual help menu item on the Theme Options page.', 'option-tree' );
4344
+
4345
+ /* translators: %s: ID emphasized */
4346
+ $str_id = esc_html__( '%s: A unique lower case alphanumeric string, underscores allowed.', 'option-tree' );
4347
+
4348
+ /* translators: %s: Content emphasized */
4349
+ $str_content = esc_html__( '%s: Enter the HTML content about this contextual help item displayed on the Theme Option page for end users to read.', 'option-tree' );
4350
+
4351
+ return '
4352
+ <div class="option-tree-setting">
4353
+ <div class="open">' . ( isset( $content['title'] ) ? esc_attr( $content['title'] ) : 'Content ' . ( absint( $key ) + 1 ) ) . '</div>
4354
+ <div class="button-section">
4355
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4356
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4357
+ </a>
4358
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4359
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4360
+ </a>
4361
+ </div>
4362
+ <div class="option-tree-setting-body">
4363
+ <div class="format-settings">
4364
+ <div class="format-setting type-text no-desc">
4365
+ <div class="description">' . sprintf( $str_title, '<strong>' . esc_html__( 'Title', 'option-tree' ) . '</strong>' ) . '</div>
4366
+ <div class="format-setting-inner">
4367
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][title]" value="' . ( isset( $content['title'] ) ? esc_attr( $content['title'] ) : '' ) . '" class="widefat option-tree-ui-input option-tree-setting-title" autocomplete="off" />
4368
+ </div>
4369
+ </div>
4370
+ </div>
4371
+ <div class="format-settings">
4372
+ <div class="format-setting type-text no-desc">
4373
+ <div class="description">' . sprintf( $str_id, '<strong>' . esc_html__( 'ID', 'option-tree' ) . '</strong>' ) . '</div>
4374
+ <div class="format-setting-inner">
4375
+ <input type="text" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][id]" value="' . ( isset( $content['id'] ) ? esc_attr( $content['id'] ) : '' ) . '" class="widefat option-tree-ui-input" autocomplete="off" />
4376
+ </div>
4377
+ </div>
4378
+ </div>
4379
+ <div class="format-settings">
4380
+ <div class="format-setting type-textarea no-desc">
4381
+ <div class="description">' . sprintf( $str_content, '<strong>' . esc_html__( 'Content', 'option-tree' ) . '</strong>' ) . '</div>
4382
+ <div class="format-setting-inner">
4383
+ <textarea class="textarea" rows="15" cols="40" name="' . esc_attr( $name ) . '[' . esc_attr( $key ) . '][content]">' . ( isset( $content['content'] ) ? esc_textarea( $content['content'] ) : '' ) . '</textarea>
4384
+ </div>
4385
+ </div>
4386
+ </div>
4387
+ </div>
4388
+ </div>';
4389
+
4390
+ }
4391
+ }
4392
+
4393
+ if ( ! function_exists( 'ot_layout_view' ) ) {
4394
+
4395
+ /**
4396
+ * Helper function to display sections.
4397
+ *
4398
+ * @param string $key Layout ID.
4399
+ * @param string $data Layout encoded value.
4400
+ * @param string $active_layout Active layout ID.
4401
+ *
4402
+ * @return string
4403
+ *
4404
+ * @access public
4405
+ * @since 2.0
4406
+ */
4407
+ function ot_layout_view( $key, $data = '', $active_layout = '' ) {
4408
+
4409
+ return '
4410
+ <div class="option-tree-setting">
4411
+ <div class="open">' . ( isset( $key ) ? esc_attr( $key ) : esc_html__( 'Layout', 'option-tree' ) ) . '</div>
4412
+ <div class="button-section">
4413
+ <a href="javascript:void(0);" class="option-tree-layout-activate option-tree-ui-button button left-item' . ( $active_layout === $key ? ' active' : '' ) . '" title="' . esc_html__( 'Activate', 'option-tree' ) . '">
4414
+ <span class="icon ot-icon-square-o"></span>' . esc_html__( 'Activate', 'option-tree' ) . '
4415
+ </a>
4416
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4417
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4418
+ </a>
4419
+ </div>
4420
+ <input type="hidden" name="' . esc_attr( ot_layouts_id() ) . '[' . esc_attr( $key ) . ']" value="' . esc_attr( $data ) . '" />
4421
+ </div>';
4422
+ }
4423
+ }
4424
+
4425
+ if ( ! function_exists( 'ot_list_item_view' ) ) {
4426
+
4427
+ /**
4428
+ * Helper function to display list items.
4429
+ *
4430
+ * This function is used in AJAX to add a new list items
4431
+ * and when they have already been added and saved.
4432
+ *
4433
+ * @param string $name The form field name.
4434
+ * @param int $key The array key for the current element.
4435
+ * @param array $list_item An array of values for the current list item.
4436
+ * @param int $post_id The post ID.
4437
+ * @param string $get_option The option page ID.
4438
+ * @param array $settings The settings.
4439
+ * @param string $type The list type.
4440
+ *
4441
+ * @access public
4442
+ * @since 2.0
4443
+ */
4444
+ function ot_list_item_view( $name, $key, $list_item = array(), $post_id = 0, $get_option = '', $settings = array(), $type = '' ) {
4445
+
4446
+ // Required title setting.
4447
+ $required_setting = array(
4448
+ array(
4449
+ 'id' => 'title',
4450
+ 'label' => __( 'Title', 'option-tree' ),
4451
+ 'desc' => '',
4452
+ 'std' => '',
4453
+ 'type' => 'text',
4454
+ 'rows' => '',
4455
+ 'class' => 'option-tree-setting-title',
4456
+ 'post_type' => '',
4457
+ 'choices' => array(),
4458
+ ),
4459
+ );
4460
+
4461
+ // Load the old filterable slider settings.
4462
+ if ( 'slider' === $type ) {
4463
+ $settings = ot_slider_settings( $name );
4464
+ }
4465
+
4466
+ // If no settings array load the filterable list item settings.
4467
+ if ( empty( $settings ) ) {
4468
+ $settings = ot_list_item_settings( $name );
4469
+ }
4470
+
4471
+ // Merge the two settings array.
4472
+ $settings = array_merge( $required_setting, $settings );
4473
+
4474
+ echo '
4475
+ <div class="option-tree-setting">
4476
+ <div class="open">' . ( isset( $list_item['title'] ) ? esc_attr( $list_item['title'] ) : '' ) . '</div>
4477
+ <div class="button-section">
4478
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4479
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4480
+ </a>
4481
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4482
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4483
+ </a>
4484
+ </div>
4485
+ <div class="option-tree-setting-body">
4486
+ ';
4487
+
4488
+ foreach ( $settings as $field ) {
4489
+
4490
+ // Set field value.
4491
+ $field_value = isset( $list_item[ $field['id'] ] ) ? $list_item[ $field['id'] ] : '';
4492
+
4493
+ // Set default to standard value.
4494
+ if ( isset( $field['std'] ) ) {
4495
+ $field_value = ot_filter_std_value( $field_value, $field['std'] );
4496
+ }
4497
+
4498
+ // filter the title label and description.
4499
+ if ( 'title' === $field['id'] ) {
4500
+
4501
+ // filter the label.
4502
+ $field['label'] = apply_filters( 'ot_list_item_title_label', $field['label'], $name );
4503
+
4504
+ // filter the description.
4505
+ $field['desc'] = apply_filters( 'ot_list_item_title_desc', $field['desc'], $name );
4506
+ }
4507
+
4508
+ // Make life easier.
4509
+ $_field_name = $get_option ? $get_option . '[' . $name . ']' : $name;
4510
+
4511
+ // Build the arguments array.
4512
+ $_args = array(
4513
+ 'type' => $field['type'],
4514
+ 'field_id' => $name . '_' . $field['id'] . '_' . $key,
4515
+ 'field_name' => $_field_name . '[' . $key . '][' . $field['id'] . ']',
4516
+ 'field_value' => $field_value,
4517
+ 'field_desc' => isset( $field['desc'] ) ? $field['desc'] : '',
4518
+ 'field_std' => isset( $field['std'] ) ? $field['std'] : '',
4519
+ 'field_rows' => isset( $field['rows'] ) ? $field['rows'] : 10,
4520
+ 'field_post_type' => isset( $field['post_type'] ) && ! empty( $field['post_type'] ) ? $field['post_type'] : 'post',
4521
+ 'field_taxonomy' => isset( $field['taxonomy'] ) && ! empty( $field['taxonomy'] ) ? $field['taxonomy'] : 'category',
4522
+ 'field_min_max_step' => isset( $field['min_max_step'] ) && ! empty( $field['min_max_step'] ) ? $field['min_max_step'] : '0,100,1',
4523
+ 'field_class' => isset( $field['class'] ) ? $field['class'] : '',
4524
+ 'field_condition' => isset( $field['condition'] ) ? $field['condition'] : '',
4525
+ 'field_operator' => isset( $field['operator'] ) ? $field['operator'] : 'and',
4526
+ 'field_choices' => isset( $field['choices'] ) && ! empty( $field['choices'] ) ? $field['choices'] : array(),
4527
+ 'field_settings' => isset( $field['settings'] ) && ! empty( $field['settings'] ) ? $field['settings'] : array(),
4528
+ 'post_id' => $post_id,
4529
+ 'get_option' => $get_option,
4530
+ );
4531
+
4532
+ $conditions = '';
4533
+
4534
+ // Setup the conditions.
4535
+ if ( isset( $field['condition'] ) && ! empty( $field['condition'] ) ) {
4536
+
4537
+ /* doing magic on the conditions so they work in a list item */
4538
+ $conditionals = explode( ',', $field['condition'] );
4539
+ foreach ( $conditionals as $condition ) {
4540
+ $parts = explode( ':', $condition );
4541
+ if ( isset( $parts[0] ) ) {
4542
+ $field['condition'] = str_replace( $condition, $name . '_' . $parts[0] . '_' . $key . ':' . $parts[1], $field['condition'] );
4543
+ }
4544
+ }
4545
+
4546
+ $conditions = ' data-condition="' . esc_attr( $field['condition'] ) . '"';
4547
+ $conditions .= isset( $field['operator'] ) && in_array( $field['operator'], array( 'and', 'AND', 'or', 'OR' ), true ) ? ' data-operator="' . esc_attr( $field['operator'] ) . '"' : '';
4548
+ }
4549
+
4550
+ // Build the setting CSS class.
4551
+ if ( ! empty( $_args['field_class'] ) ) {
4552
+ $classes = explode( ' ', $_args['field_class'] );
4553
+
4554
+ foreach ( $classes as $_key => $value ) {
4555
+ $classes[ $_key ] = $value . '-wrap';
4556
+ }
4557
+
4558
+ $class = 'format-settings ' . implode( ' ', $classes );
4559
+ } else {
4560
+ $class = 'format-settings';
4561
+ }
4562
+
4563
+ // Option label.
4564
+ echo '<div id="setting_' . esc_attr( $_args['field_id'] ) . '" class="' . esc_attr( $class ) . '"' . $conditions . '>'; // phpcs:ignore
4565
+
4566
+ // Don't show title with textblocks.
4567
+ if ( 'textblock' !== $_args['type'] && ! empty( $field['label'] ) ) {
4568
+ echo '<div class="format-setting-label">';
4569
+ echo '<h3 class="label">' . esc_attr( $field['label'] ) . '</h3>';
4570
+ echo '</div>';
4571
+ }
4572
+
4573
+ // Only allow simple textarea inside a list-item due to known DOM issues with wp_editor().
4574
+ if ( false === apply_filters( 'ot_override_forced_textarea_simple', false, $field['id'] ) && 'textarea' === $_args['type'] ) {
4575
+ $_args['type'] = 'textarea-simple';
4576
+ }
4577
+
4578
+ // Option body, list-item is not allowed inside another list-item.
4579
+ if ( 'list-item' !== $_args['type'] && 'slider' !== $_args['type'] ) {
4580
+ echo ot_display_by_type( $_args ); // phpcs:ignore
4581
+ }
4582
+
4583
+ echo '</div>';
4584
+ }
4585
+
4586
+ echo '</div>';
4587
+
4588
+ echo '</div>';
4589
+ }
4590
+ }
4591
+
4592
+ if ( ! function_exists( 'ot_social_links_view' ) ) {
4593
+
4594
+ /**
4595
+ * Helper function to display social links.
4596
+ *
4597
+ * This function is used in AJAX to add a new list items
4598
+ * and when they have already been added and saved.
4599
+ *
4600
+ * @param string $name The form field name.
4601
+ * @param int $key The array key for the current element.
4602
+ * @param array $list_item An array of values for the current list item.
4603
+ * @param int $post_id The post ID.
4604
+ * @param string $get_option The option page ID.
4605
+ * @param array $settings The settings.
4606
+ *
4607
+ * @access public
4608
+ * @since 2.4.0
4609
+ */
4610
+ function ot_social_links_view( $name, $key, $list_item = array(), $post_id = 0, $get_option = '', $settings = array() ) {
4611
+
4612
+ // If no settings array load the filterable social links settings.
4613
+ if ( empty( $settings ) ) {
4614
+ $settings = ot_social_links_settings( $name );
4615
+ }
4616
+
4617
+ echo '
4618
+ <div class="option-tree-setting">
4619
+ <div class="open">' . ( isset( $list_item['name'] ) ? esc_attr( $list_item['name'] ) : '' ) . '</div>
4620
+ <div class="button-section">
4621
+ <a href="javascript:void(0);" class="option-tree-setting-edit option-tree-ui-button button left-item" title="' . esc_html__( 'Edit', 'option-tree' ) . '">
4622
+ <span class="icon ot-icon-pencil"></span>' . esc_html__( 'Edit', 'option-tree' ) . '
4623
+ </a>
4624
+ <a href="javascript:void(0);" class="option-tree-setting-remove option-tree-ui-button button button-secondary light right-item" title="' . esc_html__( 'Delete', 'option-tree' ) . '">
4625
+ <span class="icon ot-icon-trash-o"></span>' . esc_html__( 'Delete', 'option-tree' ) . '
4626
+ </a>
4627
+ </div>
4628
+ <div class="option-tree-setting-body">
4629
+ ';
4630
+
4631
+ foreach ( $settings as $field ) {
4632
+
4633
+ // Set field value.
4634
+ $field_value = isset( $list_item[ $field['id'] ] ) ? $list_item[ $field['id'] ] : '';
4635
+
4636
+ // Set default to standard value.
4637
+ if ( isset( $field['std'] ) ) {
4638
+ $field_value = ot_filter_std_value( $field_value, $field['std'] );
4639
+ }
4640
+
4641
+ // Make life easier.
4642
+ $_field_name = $get_option ? $get_option . '[' . $name . ']' : $name;
4643
+
4644
+ // Build the arguments array.
4645
+ $_args = array(
4646
+ 'type' => $field['type'],
4647
+ 'field_id' => $name . '_' . $field['id'] . '_' . $key,
4648
+ 'field_name' => $_field_name . '[' . $key . '][' . $field['id'] . ']',
4649
+ 'field_value' => $field_value,
4650
+ 'field_desc' => isset( $field['desc'] ) ? $field['desc'] : '',
4651
+ 'field_std' => isset( $field['std'] ) ? $field['std'] : '',
4652
+ 'field_rows' => isset( $field['rows'] ) ? $field['rows'] : 10,
4653
+ 'field_post_type' => isset( $field['post_type'] ) && ! empty( $field['post_type'] ) ? $field['post_type'] : 'post',
4654
+ 'field_taxonomy' => isset( $field['taxonomy'] ) && ! empty( $field['taxonomy'] ) ? $field['taxonomy'] : 'category',
4655
+ 'field_min_max_step' => isset( $field['min_max_step'] ) && ! empty( $field['min_max_step'] ) ? $field['min_max_step'] : '0,100,1',
4656
+ 'field_class' => isset( $field['class'] ) ? $field['class'] : '',
4657
+ 'field_condition' => isset( $field['condition'] ) ? $field['condition'] : '',
4658
+ 'field_operator' => isset( $field['operator'] ) ? $field['operator'] : 'and',
4659
+ 'field_choices' => isset( $field['choices'] ) && ! empty( $field['choices'] ) ? $field['choices'] : array(),
4660
+ 'field_settings' => isset( $field['settings'] ) && ! empty( $field['settings'] ) ? $field['settings'] : array(),
4661
+ 'post_id' => $post_id,
4662
+ 'get_option' => $get_option,
4663
+ );
4664
+
4665
+ $conditions = '';
4666
+
4667
+ // Setup the conditions.
4668
+ if ( isset( $field['condition'] ) && ! empty( $field['condition'] ) ) {
4669
+
4670
+ // Doing magic on the conditions so they work in a list item.
4671
+ $conditionals = explode( ',', $field['condition'] );
4672
+ foreach ( $conditionals as $condition ) {
4673
+ $parts = explode( ':', $condition );
4674
+ if ( isset( $parts[0] ) ) {
4675
+ $field['condition'] = str_replace( $condition, $name . '_' . $parts[0] . '_' . $key . ':' . $parts[1], $field['condition'] );
4676
+ }
4677
+ }
4678
+
4679
+ $conditions = ' data-condition="' . esc_attr( $field['condition'] ) . '"';
4680
+ $conditions .= isset( $field['operator'] ) && in_array( $field['operator'], array( 'and', 'AND', 'or', 'OR' ), true ) ? ' data-operator="' . esc_attr( $field['operator'] ) . '"' : '';
4681
+ }
4682
+
4683
+ // Option label.
4684
+ echo '<div id="setting_' . esc_attr( $_args['field_id'] ) . '" class="format-settings"' . $conditions . '>'; // phpcs:ignore
4685
+
4686
+ // Don't show title with textblocks.
4687
+ if ( 'textblock' !== $_args['type'] && ! empty( $field['label'] ) ) {
4688
+ echo '<div class="format-setting-label">';
4689
+ echo '<h3 class="label">' . esc_attr( $field['label'] ) . '</h3>';
4690
+ echo '</div>';
4691
+ }
4692
+
4693
+ // Only allow simple textarea inside a list-item due to known DOM issues with wp_editor().
4694
+ if ( 'textarea' === $_args['type'] ) {
4695
+ $_args['type'] = 'textarea-simple';
4696
+ }
4697
+
4698
+ // Option body, list-item is not allowed inside another list-item.
4699
+ if ( 'list-item' !== $_args['type'] && 'slider' !== $_args['type'] && 'social-links' !== $_args['type'] ) {
4700
+ echo ot_display_by_type( $_args ); // phpcs:ignore
4701
+ }
4702
+
4703
+ echo '</div>';
4704
+ }
4705
+
4706
+ echo '</div>';
4707
+
4708
+ echo '</div>';
4709
+ }
4710
+ }
4711
+
4712
+ if ( ! function_exists( 'ot_theme_options_layouts_form' ) ) {
4713
+
4714
+ /**
4715
+ * Helper function to display Theme Options layouts form.
4716
+ *
4717
+ * @access public
4718
+ * @since 2.0
4719
+ */
4720
+ function ot_theme_options_layouts_form() {
4721
+
4722
+ echo '<form method="post" id="option-tree-options-layouts-form">';
4723
+
4724
+ // Form nonce.
4725
+ wp_nonce_field( 'option_tree_modify_layouts_form', 'option_tree_modify_layouts_nonce' );
4726
+
4727
+ // Get the saved layouts.
4728
+ $layouts = get_option( ot_layouts_id() );
4729
+
4730
+ // Set active layout.
4731
+ $active_layout = isset( $layouts['active_layout'] ) ? $layouts['active_layout'] : '';
4732
+
4733
+ if ( is_array( $layouts ) && 1 < count( $layouts ) ) {
4734
+
4735
+ $active_layout = $layouts['active_layout'];
4736
+
4737
+ echo '<input type="hidden" id="the_current_layout" value="' . esc_attr( $active_layout ) . '" />';
4738
+
4739
+ echo '<div class="option-tree-active-layout">';
4740
+
4741
+ echo '<select name="' . esc_attr( ot_layouts_id() ) . '[active_layout]" class="option-tree-ui-select">';
4742
+
4743
+ $hidden = '';
4744
+
4745
+ foreach ( $layouts as $key => $data ) {
4746
+
4747
+ if ( 'active_layout' === $key ) {
4748
+ continue;
4749
+ }
4750
+
4751
+ echo '<option ' . selected( $key, $active_layout, false ) . ' value="' . esc_attr( $key ) . '">' . esc_attr( $key ) . '</option>';
4752
+ $hidden_safe .= '<input type="hidden" name="' . esc_attr( ot_layouts_id() ) . '[' . esc_attr( $key ) . ']" value="' . esc_attr( isset( $data ) ? $data : '' ) . '" />';
4753
+ }
4754
+
4755
+ echo '</select>';
4756
+
4757
+ echo '</div>';
4758
+
4759
+ echo $hidden_safe; // phpcs:ignore
4760
+ }
4761
+
4762
+ /* new layout wrapper */
4763
+ echo '<div class="option-tree-save-layout' . ( ! empty( $active_layout ) ? ' active-layout' : '' ) . '">';
4764
+
4765
+ /* add new layout */
4766
+ echo '<input type="text" name="' . esc_attr( ot_layouts_id() ) . '[_add_new_layout_]" value="" class="widefat option-tree-ui-input" autocomplete="off" />';
4767
+
4768
+ echo '<button type="submit" class="option-tree-ui-button button button-primary save-layout" title="' . esc_html__( 'New Layout', 'option-tree' ) . '">' . esc_html__( 'New Layout', 'option-tree' ) . '</button>';
4769
+
4770
+ echo '</div>';
4771
+
4772
+ echo '</form>';
4773
+ }
4774
+ }
4775
+
4776
+ if ( ! function_exists( 'ot_sanitize_option_id' ) ) {
4777
+
4778
+ /**
4779
+ * Helper function to sanitize the option ID's.
4780
+ *
4781
+ * @param string $input The string to sanitize.
4782
+ * @return string
4783
+ *
4784
+ * @access public
4785
+ * @since 2.0
4786
+ */
4787
+ function ot_sanitize_option_id( $input ) {
4788
+ return preg_replace( '/[^a-z0-9]/', '_', trim( strtolower( $input ) ) );
4789
+ }
4790
+ }
4791
+
4792
+ if ( ! function_exists( 'ot_sanitize_layout_id' ) ) {
4793
+
4794
+ /**
4795
+ * Helper function to sanitize the layout ID's.
4796
+ *
4797
+ * @param string $input The string to sanitize.
4798
+ * @return string
4799
+ *
4800
+ * @access public
4801
+ * @since 2.0
4802
+ */
4803
+ function ot_sanitize_layout_id( $input ) {
4804
+ return preg_replace( '/[^a-z0-9]/', '-', trim( strtolower( $input ) ) );
4805
+ }
4806
+ }
4807
+
4808
+ if ( ! function_exists( 'ot_convert_array_to_string' ) ) {
4809
+
4810
+ /**
4811
+ * Convert choices array to string.
4812
+ *
4813
+ * @param array $input The array to convert to a string.
4814
+ *
4815
+ * @return bool|string
4816
+ *
4817
+ * @access public
4818
+ * @since 2.0
4819
+ */
4820
+ function ot_convert_array_to_string( $input ) {
4821
+
4822
+ if ( is_array( $input ) ) {
4823
+
4824
+ foreach ( $input as $k => $choice ) {
4825
+ $choices[ $k ] = $choice['value'] . '|' . $choice['label'];
4826
+
4827
+ if ( isset( $choice['src'] ) ) {
4828
+ $choices[ $k ] .= '|' . $choice['src'];
4829
+ }
4830
+ }
4831
+
4832
+ return implode( ',', $choices );
4833
+ }
4834
+
4835
+ return false;
4836
+ }
4837
+ }
4838
+
4839
+ if ( ! function_exists( 'ot_convert_string_to_array' ) ) {
4840
+
4841
+ /**
4842
+ * Convert choices string to array.
4843
+ *
4844
+ * @param string $input The string to convert to an array.
4845
+ *
4846
+ * @return bool|array
4847
+ *
4848
+ * @access public
4849
+ * @since 2.0
4850
+ */
4851
+ function ot_convert_string_to_array( $input ) {
4852
+
4853
+ if ( '' !== $input ) {
4854
+
4855
+ // Empty choices array.
4856
+ $choices = array();
4857
+
4858
+ // Exlode the string into an array.
4859
+ foreach ( explode( ',', $input ) as $k => $choice ) {
4860
+
4861
+ // If ":" is splitting the string go deeper.
4862
+ if ( preg_match( '/\|/', $choice ) ) {
4863
+ $split = explode( '|', $choice );
4864
+
4865
+ if ( 2 > count( $split ) ) {
4866
+ continue;
4867
+ }
4868
+
4869
+ $choices[ $k ]['value'] = trim( $split[0] );
4870
+ $choices[ $k ]['label'] = trim( $split[1] );
4871
+
4872
+ // If radio image there are three values.
4873
+ if ( isset( $split[2] ) ) {
4874
+ $choices[ $k ]['src'] = trim( $split[2] );
4875
+ }
4876
+ } else {
4877
+ $choices[ $k ]['value'] = trim( $choice );
4878
+ $choices[ $k ]['label'] = trim( $choice );
4879
+ }
4880
+ }
4881
+
4882
+ // Return a formatted choices array.
4883
+ return $choices;
4884
+ }
4885
+
4886
+ return false;
4887
+ }
4888
+ }
4889
+
4890
+ if ( ! function_exists( 'ot_strpos_array' ) ) {
4891
+
4892
+ /**
4893
+ * Helper function - strpos() in array recursively.
4894
+ *
4895
+ * @param string $haystack The string to search in.
4896
+ * @param array $needles Keys to search for.
4897
+ * @return bool
4898
+ *
4899
+ * @access public
4900
+ * @since 2.0
4901
+ */
4902
+ function ot_strpos_array( $haystack, $needles = array() ) {
4903
+
4904
+ foreach ( $needles as $needle ) {
4905
+ if ( false !== strpos( $haystack, $needle ) ) {
4906
+ return true;
4907
+ }
4908
+ }
4909
+
4910
+ return false;
4911
+ }
4912
+ }
4913
+
4914
+ if ( ! function_exists( 'ot_array_keys_exists' ) ) {
4915
+
4916
+ /**
4917
+ * Helper function - array_key_exists() recursively.
4918
+ *
4919
+ * @param array $haystack The array to search in.
4920
+ * @param array $needles Keys to search for.
4921
+ * @return bool
4922
+ *
4923
+ * @access public
4924
+ * @since 2.0
4925
+ */
4926
+ function ot_array_keys_exists( $haystack, $needles = array() ) {
4927
+
4928
+ foreach ( $needles as $k ) {
4929
+ if ( isset( $haystack[ $k ] ) ) {
4930
+ return true;
4931
+ }
4932
+ }
4933
+
4934
+ return false;
4935
+ }
4936
+ }
4937
+
4938
+ if ( ! function_exists( 'ot_stripslashes' ) ) {
4939
+
4940
+ /**
4941
+ * Custom stripslashes from single value or array.
4942
+ *
4943
+ * @param mixed $input The string or array to stripslashes from.
4944
+ * @return mixed
4945
+ *
4946
+ * @access public
4947
+ * @since 2.0
4948
+ */
4949
+ function ot_stripslashes( $input ) {
4950
+
4951
+ if ( is_array( $input ) ) {
4952
+
4953
+ foreach ( $input as &$val ) {
4954
+
4955
+ if ( is_array( $val ) ) {
4956
+ $val = ot_stripslashes( $val );
4957
+ } else {
4958
+ $val = stripslashes( trim( $val ) );
4959
+ }
4960
+ }
4961
+ } else {
4962
+ $input = stripslashes( trim( $input ) );
4963
+ }
4964
+
4965
+ return $input;
4966
+ }
4967
+ }
4968
+
4969
+ if ( ! function_exists( 'ot_reverse_wpautop' ) ) {
4970
+
4971
+ /**
4972
+ * Reverse wpautop.
4973
+ *
4974
+ * @param string $string The string to be filtered.
4975
+ * @return string
4976
+ *
4977
+ * @access public
4978
+ * @since 2.0.9
4979
+ */
4980
+ function ot_reverse_wpautop( $string = '' ) {
4981
+
4982
+ // Return if string is empty.
4983
+ if ( '' === trim( $string ) ) {
4984
+ return '';
4985
+ }
4986
+
4987
+ // Remove all new lines & <p> tags.
4988
+ $string = str_replace( array( "\n", '<p>' ), '', $string );
4989
+
4990
+ // Replace <br /> with \r.
4991
+ $string = str_replace( array( '<br />', '<br>', '<br/>' ), "\r", $string );
4992
+
4993
+ // Replace </p> with \r\n.
4994
+ $string = str_replace( '</p>', "\r\n", $string );
4995
+
4996
+ // Return clean string.
4997
+ return trim( $string );
4998
+ }
4999
+ }
5000
+
5001
+ if ( ! function_exists( 'ot_range' ) ) {
5002
+
5003
+ /**
5004
+ * Returns an array of elements from start to limit, inclusive.
5005
+ *
5006
+ * Occasionally zero will be some impossibly large number to
5007
+ * the "E" power when creating a range from negative to positive.
5008
+ * This function attempts to fix that by setting that number back to "0".
5009
+ *
5010
+ * @param string $start First value of the sequence.
5011
+ * @param string $limit The sequence is ended upon reaching the limit value.
5012
+ * @param int $step If a step value is given, it will be used as the increment
5013
+ * between elements in the sequence. step should be given as a
5014
+ * positive number. If not specified, step will default to 1.
5015
+ *
5016
+ * @return array
5017
+ *
5018
+ * @access public
5019
+ * @since 2.0.12
5020
+ */
5021
+ function ot_range( $start, $limit, $step = 1 ) {
5022
+
5023
+ if ( $step < 0 ) {
5024
+ $step = 1;
5025
+ }
5026
+
5027
+ $range = range( $start, $limit, $step );
5028
+
5029
+ foreach ( $range as $k => $v ) {
5030
+ if ( strpos( $v, 'E' ) ) {
5031
+ $range[ $k ] = 0;
5032
+ }
5033
+ }
5034
+
5035
+ return $range;
5036
+ }
5037
+ }
5038
+
5039
+ if ( ! function_exists( 'ot_encode' ) ) {
5040
+
5041
+ /**
5042
+ * Helper function to return encoded strings.
5043
+ *
5044
+ * @param array $value The array to encode.
5045
+ *
5046
+ * @return string|bool
5047
+ *
5048
+ * @access public
5049
+ * @since 2.0.13
5050
+ * @updated 2.7.0
5051
+ */
5052
+ function ot_encode( $value ) {
5053
+ if ( is_array( $value ) ) {
5054
+ return base64_encode( maybe_serialize( $value ) ); // phpcs:ignore
5055
+ }
5056
+
5057
+ return false;
5058
+ }
5059
+ }
5060
+
5061
+ if ( ! function_exists( 'ot_decode' ) ) {
5062
+
5063
+ /**
5064
+ * Helper function to return decoded arrays.
5065
+ *
5066
+ * @param string $value Encoded serialized array.
5067
+ *
5068
+ * @return array
5069
+ *
5070
+ * @access public
5071
+ * @since 2.0.13
5072
+ */
5073
+ function ot_decode( $value ) {
5074
+
5075
+ $fallback = array();
5076
+ $decoded = base64_decode( $value ); // phpcs:ignore
5077
+
5078
+ // Search for an array.
5079
+ preg_match( '/a:\d+:{.*?}/', $decoded, $array_matches, PREG_OFFSET_CAPTURE, 0 );
5080
+
5081
+ // Search for an object.
5082
+ preg_match( '/O|C:\+?\d+:"[a-z0-9_]+”:\+?\d+:/i', $decoded, $obj_matches, PREG_OFFSET_CAPTURE, 0 );
5083
+
5084
+ // Prevent object injection or non arrays.
5085
+ if ( $obj_matches || ! $array_matches ) {
5086
+ return $fallback;
5087
+ }
5088
+
5089
+ // Convert the options to an array.
5090
+ $decoded = maybe_unserialize( $decoded );
5091
+
5092
+ if ( is_array( $decoded ) ) {
5093
+ return $decoded;
5094
+ }
5095
+
5096
+ return $fallback;
5097
+ }
5098
+ }
5099
+
5100
+ if ( ! function_exists( 'ot_filter_std_value' ) ) {
5101
+
5102
+ /**
5103
+ * Helper function to filter standard option values.
5104
+ *
5105
+ * @param mixed $value Saved string or array value.
5106
+ * @param mixed $std Standard string or array value.
5107
+ *
5108
+ * @return mixed String or array.
5109
+ *
5110
+ * @access public
5111
+ * @since 2.0.15
5112
+ */
5113
+ function ot_filter_std_value( $value = '', $std = '' ) {
5114
+
5115
+ if ( is_string( $std ) && ! empty( $std ) ) {
5116
+
5117
+ // Search for an array.
5118
+ preg_match( '/a:\d+:{.*?}/', $std, $array_matches, PREG_OFFSET_CAPTURE, 0 );
5119
+
5120
+ // Search for an object.
5121
+ preg_match( '/O:\d+:"[a-z0-9_]+":\d+:{.*?}/i', $std, $obj_matches, PREG_OFFSET_CAPTURE, 0 );
5122
+
5123
+ // Prevent object injection.
5124
+ if ( $array_matches && ! $obj_matches ) {
5125
+ $std = maybe_unserialize( $std );
5126
+ } elseif ( $obj_matches ) {
5127
+ $std = '';
5128
+ }
5129
+ }
5130
+
5131
+ if ( is_array( $value ) && is_array( $std ) ) {
5132
+ foreach ( $value as $k => $v ) {
5133
+ if ( '' === $value[ $k ] && isset( $std[ $k ] ) ) {
5134
+ $value[ $k ] = $std[ $k ];
5135
+ }
5136
+ }
5137
+ } elseif ( '' === $value && ! empty( $std ) ) {
5138
+ $value = $std;
5139
+ }
5140
+
5141
+ return $value;
5142
+ }
5143
+ }
5144
+
5145
+ if ( ! function_exists( 'ot_set_google_fonts' ) ) {
5146
+
5147
+ /**
5148
+ * Helper function to set the Google fonts array.
5149
+ *
5150
+ * @param string $id The option ID.
5151
+ * @param bool $value The option value.
5152
+ *
5153
+ * @access public
5154
+ * @since 2.5.0
5155
+ */
5156
+ function ot_set_google_fonts( $id = '', $value = '' ) {
5157
+
5158
+ $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
5159
+
5160
+ if ( is_array( $value ) && ! empty( $value ) ) {
5161
+ $ot_set_google_fonts[ $id ] = $value;
5162
+ } elseif ( isset( $ot_set_google_fonts[ $id ] ) ) {
5163
+ unset( $ot_set_google_fonts[ $id ] );
5164
+ }
5165
+
5166
+ set_theme_mod( 'ot_set_google_fonts', $ot_set_google_fonts );
5167
+ }
5168
+ }
5169
+
5170
+ if ( ! function_exists( 'ot_update_google_fonts_after_save' ) ) {
5171
+
5172
+ /**
5173
+ * Helper function to remove unused options from the Google fonts array.
5174
+ *
5175
+ * @param array $options The array of saved options.
5176
+ *
5177
+ * @access public
5178
+ * @since 2.5.0
5179
+ */
5180
+ function ot_update_google_fonts_after_save( $options = array() ) {
5181
+
5182
+ $ot_set_google_fonts = get_theme_mod( 'ot_set_google_fonts', array() );
5183
+
5184
+ foreach ( $ot_set_google_fonts as $key => $set ) {
5185
+ if ( ! isset( $options[ $key ] ) ) {
5186
+ unset( $ot_set_google_fonts[ $key ] );
5187
+ }
5188
+ }
5189
+ set_theme_mod( 'ot_set_google_fonts', $ot_set_google_fonts );
5190
+ }
5191
+
5192
+ add_action( 'ot_after_theme_options_save', 'ot_update_google_fonts_after_save', 1 );
5193
+ }
5194
+
5195
+ if ( ! function_exists( 'ot_fetch_google_fonts' ) ) {
5196
+
5197
+ /**
5198
+ * Helper function to fetch the Google fonts array.
5199
+ *
5200
+ * @param bool $normalize Whether or not to return a normalized array. Default 'true'.
5201
+ * @param bool $force_rebuild Whether or not to force the array to be rebuilt. Default 'false'.
5202
+ *
5203
+ * @return array
5204
+ *
5205
+ * @access public
5206
+ * @since 2.5.0
5207
+ */
5208
+ function ot_fetch_google_fonts( $normalize = true, $force_rebuild = false ) {
5209
+
5210
+ // Google Fonts cache key.
5211
+ $ot_google_fonts_cache_key = apply_filters( 'ot_google_fonts_cache_key', 'ot_google_fonts_cache' );
5212
+
5213
+ // Get the fonts from cache.
5214
+ $ot_google_fonts = apply_filters( 'ot_google_fonts_cache', get_transient( $ot_google_fonts_cache_key ) );
5215
+
5216
+ if ( $force_rebuild || ! is_array( $ot_google_fonts ) || empty( $ot_google_fonts ) ) {
5217
+
5218
+ $ot_google_fonts = array();
5219
+
5220
+ // API url and key.
5221
+ $ot_google_fonts_api_url = apply_filters( 'ot_google_fonts_api_url', 'https://www.googleapis.com/webfonts/v1/webfonts' );
5222
+ $ot_google_fonts_api_key = apply_filters( 'ot_google_fonts_api_key', false );
5223
+
5224
+ if ( false === $ot_google_fonts_api_key ) {
5225
+ return array();
5226
+ }
5227
+
5228
+ // API arguments.
5229
+ $ot_google_fonts_fields = apply_filters(
5230
+ 'ot_google_fonts_fields',
5231
+ array(
5232
+ 'family',
5233
+ 'variants',
5234
+ 'subsets',
5235
+ )
5236
+ );
5237
+ $ot_google_fonts_sort = apply_filters( 'ot_google_fonts_sort', 'alpha' );
5238
+
5239
+ // Initiate API request.
5240
+ $ot_google_fonts_query_args = array(
5241
+ 'key' => $ot_google_fonts_api_key,
5242
+ 'fields' => 'items(' . implode( ',', $ot_google_fonts_fields ) . ')',
5243
+ 'sort' => $ot_google_fonts_sort,
5244
+ );
5245
+
5246
+ // Build and make the request.
5247
+ $ot_google_fonts_query = esc_url_raw( add_query_arg( $ot_google_fonts_query_args, $ot_google_fonts_api_url ) );
5248
+ $ot_google_fonts_response = wp_safe_remote_get(
5249
+ $ot_google_fonts_query,
5250
+ array(
5251
+ 'sslverify' => false,
5252
+ 'timeout' => 15,
5253
+ )
5254
+ );
5255
+
5256
+ // Continue if we got a valid response.
5257
+ if ( 200 === wp_remote_retrieve_response_code( $ot_google_fonts_response ) ) {
5258
+
5259
+ $response_body = wp_remote_retrieve_body( $ot_google_fonts_response );
5260
+
5261
+ if ( $response_body ) {
5262
+
5263
+ // JSON decode the response body and cache the result.
5264
+ $ot_google_fonts_data = json_decode( trim( $response_body ), true );
5265
+
5266
+ if ( is_array( $ot_google_fonts_data ) && isset( $ot_google_fonts_data['items'] ) ) {
5267
+
5268
+ $ot_google_fonts = $ot_google_fonts_data['items'];
5269
+
5270
+ // Normalize the array key.
5271
+ $ot_google_fonts_tmp = array();
5272
+ foreach ( $ot_google_fonts as $key => $value ) {
5273
+ if ( ! isset( $value['family'] ) ) {
5274
+ continue;
5275
+ }
5276
+
5277
+ $id = preg_replace( '/[^a-z0-9_\-]/', '', strtolower( remove_accents( $value['family'] ) ) );
5278
+
5279
+ if ( $id ) {
5280
+ $ot_google_fonts_tmp[ $id ] = $value;
5281
+ }
5282
+ }
5283
+
5284
+ $ot_google_fonts = $ot_google_fonts_tmp;
5285
+ set_theme_mod( 'ot_google_fonts', $ot_google_fonts );
5286
+ set_transient( $ot_google_fonts_cache_key, $ot_google_fonts, WEEK_IN_SECONDS );
5287
+ }
5288
+ }
5289
+ }
5290
+ }
5291
+
5292
+ return $normalize ? ot_normalize_google_fonts( $ot_google_fonts ) : $ot_google_fonts;
5293
+ }
5294
+ }
5295
+
5296
+ if ( ! function_exists( 'ot_normalize_google_fonts' ) ) {
5297
+
5298
+ /**
5299
+ * Helper function to normalize the Google fonts array.
5300
+ *
5301
+ * @param array $google_fonts An array of fonts to normalize.
5302
+ *
5303
+ * @return array
5304
+ *
5305
+ * @access public
5306
+ * @since 2.5.0
5307
+ */
5308
+ function ot_normalize_google_fonts( $google_fonts ) {
5309
+
5310
+ $ot_normalized_google_fonts = array();
5311
+
5312
+ if ( is_array( $google_fonts ) && ! empty( $google_fonts ) ) {
5313
+
5314
+ foreach ( $google_fonts as $google_font ) {
5315
+
5316
+ if ( isset( $google_font['family'] ) ) {
5317
+
5318
+ $id = str_replace( ' ', '+', $google_font['family'] );
5319
+
5320
+ $ot_normalized_google_fonts[ $id ] = array(
5321
+ 'family' => $google_font['family'],
5322
+ );
5323
+
5324
+ if ( isset( $google_font['variants'] ) ) {
5325
+ $ot_normalized_google_fonts[ $id ]['variants'] = $google_font['variants'];
5326
+ }
5327
+
5328
+ if ( isset( $google_font['subsets'] ) ) {
5329
+ $ot_normalized_google_fonts[ $id ]['subsets'] = $google_font['subsets'];
5330
+ }
5331
+ }
5332
+ }
5333
+ }
5334
+
5335
+ return $ot_normalized_google_fonts;
5336
+ }
5337
+ }
5338
+
5339
+ if ( ! function_exists( 'ot_wpml_register_string' ) ) {
5340
+
5341
+ /**
5342
+ * Helper function to register a WPML string.
5343
+ *
5344
+ * @param string $id The string ID.
5345
+ * @param string $value The string value.
5346
+ *
5347
+ * @access public
5348
+ * @since 2.1
5349
+ */
5350
+ function ot_wpml_register_string( $id, $value ) {
5351
+ if ( function_exists( 'icl_register_string' ) ) {
5352
+ icl_register_string( 'Theme Options', $id, $value );
5353
+ }
5354
+ }
5355
+ }
5356
+
5357
+ if ( ! function_exists( 'ot_wpml_unregister_string' ) ) {
5358
+
5359
+ /**
5360
+ * Helper function to unregister a WPML string.
5361
+ *
5362
+ * @param string $id The string ID.
5363
+ *
5364
+ * @access public
5365
+ * @since 2.1
5366
+ */
5367
+ function ot_wpml_unregister_string( $id ) {
5368
+ if ( function_exists( 'icl_unregister_string' ) ) {
5369
+ icl_unregister_string( 'Theme Options', $id );
5370
+ }
5371
+ }
5372
+ }
5373
+
5374
+ if ( ! function_exists( 'ot_maybe_migrate_settings' ) ) {
5375
+
5376
+ /**
5377
+ * Maybe migrate Settings.
5378
+ *
5379
+ * @access public
5380
+ * @since 2.3.3
5381
+ */
5382
+ function ot_maybe_migrate_settings() {
5383
+
5384
+ // Filter the ID to migrate from.
5385
+ $settings_id = apply_filters( 'ot_migrate_settings_id', '' );
5386
+
5387
+ // Attempt to migrate Settings.
5388
+ if ( ! empty( $settings_id ) && false === get_option( ot_settings_id() ) && ot_settings_id() !== $settings_id ) {
5389
+
5390
+ // Old settings.
5391
+ $settings = get_option( $settings_id );
5392
+
5393
+ // Check for array keys.
5394
+ if ( isset( $settings['sections'] ) && isset( $settings['settings'] ) ) {
5395
+ update_option( ot_settings_id(), $settings );
5396
+ }
5397
+ }
5398
+ }
5399
+ }
5400
+
5401
+ if ( ! function_exists( 'ot_maybe_migrate_options' ) ) {
5402
+
5403
+ /**
5404
+ * Maybe migrate Option.
5405
+ *
5406
+ * @access public
5407
+ * @since 2.3.3
5408
+ */
5409
+ function ot_maybe_migrate_options() {
5410
+
5411
+ // Filter the ID to migrate from.
5412
+ $options_id = apply_filters( 'ot_migrate_options_id', '' );
5413
+
5414
+ // Attempt to migrate Theme Options.
5415
+ if ( ! empty( $options_id ) && false === get_option( ot_options_id() ) && ot_options_id() !== $options_id ) {
5416
+
5417
+ // Old options.
5418
+ $options = get_option( $options_id );
5419
+
5420
+ // Migrate to new ID.
5421
+ update_option( ot_options_id(), $options );
5422
+ }
5423
+ }
5424
+ }
5425
+
5426
+ if ( ! function_exists( 'ot_maybe_migrate_layouts' ) ) {
5427
+
5428
+ /**
5429
+ * Maybe migrate Layouts.
5430
+ *
5431
+ * @access public
5432
+ * @since 2.3.3
5433
+ */
5434
+ function ot_maybe_migrate_layouts() {
5435
+
5436
+ // Filter the ID to migrate from.
5437
+ $layouts_id = apply_filters( 'ot_migrate_layouts_id', '' );
5438
+
5439
+ // Attempt to migrate Layouts.
5440
+ if ( ! empty( $layouts_id ) && false === get_option( ot_layouts_id() ) && ot_layouts_id() !== $layouts_id ) {
5441
+
5442
+ // Old options.
5443
+ $layouts = get_option( $layouts_id );
5444
+
5445
+ // Migrate to new ID.
5446
+ update_option( ot_layouts_id(), $layouts );
5447
+ }
5448
+ }
5449
+ }
5450
+
5451
+ if ( ! function_exists( 'ot_meta_box_post_format_gallery' ) ) {
5452
+
5453
+ /**
5454
+ * Returns an array with the post format gallery meta box.
5455
+ *
5456
+ * @param mixed $pages Excepts a comma separated string or array of
5457
+ * post_types and is what tells the metabox where to
5458
+ * display. Default 'post'.
5459
+ * @return array
5460
+ *
5461
+ * @access public
5462
+ * @since 2.4.0
5463
+ */
5464
+ function ot_meta_box_post_format_gallery( $pages = 'post' ) {
5465
+
5466
+ if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'gallery', current( get_theme_support( 'post-formats' ) ), true ) ) {
5467
+ return false;
5468
+ }
5469
+
5470
+ if ( is_string( $pages ) ) {
5471
+ $pages = explode( ',', $pages );
5472
+ }
5473
+
5474
+ return apply_filters(
5475
+ 'ot_meta_box_post_format_gallery',
5476
+ array(
5477
+ 'id' => 'ot-post-format-gallery',
5478
+ 'title' => esc_html__( 'Gallery', 'option-tree' ),
5479
+ 'desc' => '',
5480
+ 'pages' => $pages,
5481
+ 'context' => 'side',
5482
+ 'priority' => 'low',
5483
+ 'fields' => array(
5484
+ array(
5485
+ 'id' => '_format_gallery',
5486
+ 'label' => '',
5487
+ 'desc' => '',
5488
+ 'std' => '',
5489
+ 'type' => 'gallery',
5490
+ 'class' => 'ot-gallery-shortcode',
5491
+ ),
5492
+ ),
5493
+ ),
5494
+ $pages
5495
+ );
5496
+ }
5497
+ }
5498
+
5499
+ if ( ! function_exists( 'ot_meta_box_post_format_link' ) ) {
5500
+
5501
+ /**
5502
+ * Returns an array with the post format link metabox.
5503
+ *
5504
+ * @param mixed $pages Excepts a comma separated string or array of
5505
+ * post_types and is what tells the metabox where to
5506
+ * display. Default 'post'.
5507
+ * @return array
5508
+ *
5509
+ * @access public
5510
+ * @since 2.4.0
5511
+ */
5512
+ function ot_meta_box_post_format_link( $pages = 'post' ) {
5513
+
5514
+ if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'link', current( get_theme_support( 'post-formats' ) ), true ) ) {
5515
+ return false;
5516
+ }
5517
+
5518
+ if ( is_string( $pages ) ) {
5519
+ $pages = explode( ',', $pages );
5520
+ }
5521
+
5522
+ return apply_filters(
5523
+ 'ot_meta_box_post_format_link',
5524
+ array(
5525
+ 'id' => 'ot-post-format-link',
5526
+ 'title' => esc_html__( 'Link', 'option-tree' ),
5527
+ 'desc' => '',
5528
+ 'pages' => $pages,
5529
+ 'context' => 'side',
5530
+ 'priority' => 'low',
5531
+ 'fields' => array(
5532
+ array(
5533
+ 'id' => '_format_link_url',
5534
+ 'label' => '',
5535
+ 'desc' => esc_html__( 'Link URL', 'option-tree' ),
5536
+ 'std' => '',
5537
+ 'type' => 'text',
5538
+ ),
5539
+ array(
5540
+ 'id' => '_format_link_title',
5541
+ 'label' => '',
5542
+ 'desc' => esc_html__( 'Link Title', 'option-tree' ),
5543
+ 'std' => '',
5544
+ 'type' => 'text',
5545
+ ),
5546
+ ),
5547
+ ),
5548
+ $pages
5549
+ );
5550
+ }
5551
+ }
5552
+
5553
+ if ( ! function_exists( 'ot_meta_box_post_format_quote' ) ) {
5554
+
5555
+ /**
5556
+ * Returns an array with the post format quote metabox.
5557
+ *
5558
+ * @param mixed $pages Excepts a comma separated string or array of
5559
+ * post_types and is what tells the metabox where to
5560
+ * display. Default 'post'.
5561
+ * @return array
5562
+ *
5563
+ * @access public
5564
+ * @since 2.4.0
5565
+ */
5566
+ function ot_meta_box_post_format_quote( $pages = 'post' ) {
5567
+
5568
+ if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'quote', current( get_theme_support( 'post-formats' ) ), true ) ) {
5569
+ return false;
5570
+ }
5571
+
5572
+ if ( is_string( $pages ) ) {
5573
+ $pages = explode( ',', $pages );
5574
+ }
5575
+
5576
+ return apply_filters(
5577
+ 'ot_meta_box_post_format_quote',
5578
+ array(
5579
+ 'id' => 'ot-post-format-quote',
5580
+ 'title' => esc_html__( 'Quote', 'option-tree' ),
5581
+ 'desc' => '',
5582
+ 'pages' => $pages,
5583
+ 'context' => 'side',
5584
+ 'priority' => 'low',
5585
+ 'fields' => array(
5586
+ array(
5587
+ 'id' => '_format_quote_source_name',
5588
+ 'label' => '',
5589
+ 'desc' => esc_html__( 'Source Name (ex. author, singer, actor)', 'option-tree' ),
5590
+ 'std' => '',
5591
+ 'type' => 'text',
5592
+ ),
5593
+ array(
5594
+ 'id' => '_format_quote_source_url',
5595
+ 'label' => '',
5596
+ 'desc' => esc_html__( 'Source URL', 'option-tree' ),
5597
+ 'std' => '',
5598
+ 'type' => 'text',
5599
+ ),
5600
+ array(
5601
+ 'id' => '_format_quote_source_title',
5602
+ 'label' => '',
5603
+ 'desc' => esc_html__( 'Source Title (ex. book, song, movie)', 'option-tree' ),
5604
+ 'std' => '',
5605
+ 'type' => 'text',
5606
+ ),
5607
+ array(
5608
+ 'id' => '_format_quote_source_date',
5609
+ 'label' => '',
5610
+ 'desc' => esc_html__( 'Source Date', 'option-tree' ),
5611
+ 'std' => '',
5612
+ 'type' => 'text',
5613
+ ),
5614
+ ),
5615
+ ),
5616
+ $pages
5617
+ );
5618
+
5619
+ }
5620
+ }
5621
+
5622
+ if ( ! function_exists( 'ot_meta_box_post_format_video' ) ) {
5623
+
5624
+ /**
5625
+ * Returns an array with the post format video metabox.
5626
+ *
5627
+ * @param mixed $pages Excepts a comma separated string or array of
5628
+ * post_types and is what tells the metabox where to
5629
+ * display. Default 'post'.
5630
+ * @return array
5631
+ *
5632
+ * @access public
5633
+ * @since 2.4.0
5634
+ */
5635
+ function ot_meta_box_post_format_video( $pages = 'post' ) {
5636
+
5637
+ if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'video', current( get_theme_support( 'post-formats' ) ), true ) ) {
5638
+ return false;
5639
+ }
5640
+
5641
+ if ( is_string( $pages ) ) {
5642
+ $pages = explode( ',', $pages );
5643
+ }
5644
+
5645
+ /* translators: %1$s: link to WorPress Codex, %2$s: video shortcode */
5646
+ $string = esc_html__( 'Embed video from services like Youtube, Vimeo, or Hulu. You can find a list of supported oEmbed sites in the %1$s. Alternatively, you could use the built-in %2$s shortcode.', 'option-tree' );
5647
+
5648
+ return apply_filters(
5649
+ 'ot_meta_box_post_format_video',
5650
+ array(
5651
+ 'id' => 'ot-post-format-video',
5652
+ 'title' => __( 'Video', 'option-tree' ),
5653
+ 'desc' => '',
5654
+ 'pages' => $pages,
5655
+ 'context' => 'side',
5656
+ 'priority' => 'low',
5657
+ 'fields' => array(
5658
+ array(
5659
+ 'id' => '_format_video_embed',
5660
+ 'label' => '',
5661
+ 'desc' => sprintf( $string, '<a href="https://codex.wordpress.org/Embeds" target="_blank">' . esc_html__( 'WordPress Codex', 'option-tree' ) . '</a>', '<code>[video]</code>' ),
5662
+ 'std' => '',
5663
+ 'type' => 'textarea',
5664
+ ),
5665
+ ),
5666
+ ),
5667
+ $pages
5668
+ );
5669
+ }
5670
+ }
5671
+
5672
+ if ( ! function_exists( 'ot_meta_box_post_format_audio' ) ) {
5673
+
5674
+ /**
5675
+ * Returns an array with the post format audio metabox.
5676
+ *
5677
+ * @param mixed $pages Excepts a comma separated string or array of
5678
+ * post_types and is what tells the metabox where to
5679
+ * display. Default 'post'.
5680
+ * @return array
5681
+ *
5682
+ * @access public
5683
+ * @since 2.4.0
5684
+ */
5685
+ function ot_meta_box_post_format_audio( $pages = 'post' ) {
5686
+
5687
+ if ( ! current_theme_supports( 'post-formats' ) || ! in_array( 'audio', current( get_theme_support( 'post-formats' ) ), true ) ) {
5688
+ return false;
5689
+ }
5690
+
5691
+ if ( is_string( $pages ) ) {
5692
+ $pages = explode( ',', $pages );
5693
+ }
5694
+
5695
+ /* translators: %1$s: link to WorPress Codex, %2$s: audio shortcode */
5696
+ $string = esc_html__( 'Embed audio from services like SoundCloud and Radio. You can find a list of supported oEmbed sites in the %1$s. Alternatively, you could use the built-in %2$s shortcode.', 'option-tree' );
5697
+
5698
+ return apply_filters(
5699
+ 'ot_meta_box_post_format_audio',
5700
+ array(
5701
+ 'id' => 'ot-post-format-audio',
5702
+ 'title' => esc_html__( 'Audio', 'option-tree' ),
5703
+ 'desc' => '',
5704
+ 'pages' => $pages,
5705
+ 'context' => 'side',
5706
+ 'priority' => 'low',
5707
+ 'fields' => array(
5708
+ array(
5709
+ 'id' => '_format_audio_embed',
5710
+ 'label' => '',
5711
+ 'desc' => sprintf( $string, '<a href="https://codex.wordpress.org/Embeds" target="_blank">' . esc_html__( 'WordPress Codex', 'option-tree' ) . '</a>', '<code>[audio]</code>' ),
5712
+ 'std' => '',
5713
+ 'type' => 'textarea',
5714
+ ),
5715
+ ),
5716
+ ),
5717
+ $pages
5718
+ );
5719
+
5720
+ }
5721
+ }
5722
+
5723
+ if ( ! function_exists( 'ot_get_option_type_by_id' ) ) {
5724
+
5725
+ /**
5726
+ * Returns the option type by ID.
5727
+ *
5728
+ * @param string $option_id The option ID.
5729
+ * @param string $settings_id The settings array ID.
5730
+ * @return string The option type.
5731
+ *
5732
+ * @access public
5733
+ * @since 2.4.2
5734
+ */
5735
+ function ot_get_option_type_by_id( $option_id, $settings_id = '' ) {
5736
+
5737
+ if ( empty( $settings_id ) ) {
5738
+ $settings_id = ot_settings_id();
5739
+ }
5740
+
5741
+ $settings = get_option( $settings_id, array() );
5742
+
5743
+ if ( isset( $settings['settings'] ) ) {
5744
+
5745
+ foreach ( $settings['settings'] as $value ) {
5746
+
5747
+ if ( $option_id === $value['id'] && isset( $value['type'] ) ) {
5748
+ return $value['type'];
5749
+ }
5750
+ }
5751
+ }
5752
+
5753
+ return false;
5754
+ }
5755
+ }
5756
+
5757
+ if ( ! function_exists( '_ot_settings_potential_shared_terms' ) ) {
5758
+
5759
+ /**
5760
+ * Build an array of potential Theme Options that could share terms.
5761
+ *
5762
+ * @return array
5763
+ *
5764
+ * @access private
5765
+ * @since 2.5.4
5766
+ */
5767
+ function _ot_settings_potential_shared_terms() {
5768
+
5769
+ $options = array();
5770
+ $settings = get_option( ot_settings_id(), array() );
5771
+ $option_types = array(
5772
+ 'category-checkbox',
5773
+ 'category-select',
5774
+ 'tag-checkbox',
5775
+ 'tag-select',
5776
+ 'taxonomy-checkbox',
5777
+ 'taxonomy-select',
5778
+ );
5779
+
5780
+ if ( isset( $settings['settings'] ) ) {
5781
+
5782
+ foreach ( $settings['settings'] as $value ) {
5783
+
5784
+ if ( isset( $value['type'] ) ) {
5785
+
5786
+ if ( 'list-item' === $value['type'] && isset( $value['settings'] ) ) {
5787
+
5788
+ $saved = ot_get_option( $value['id'] );
5789
+
5790
+ foreach ( $value['settings'] as $item ) {
5791
+
5792
+ if ( isset( $value['id'] ) && isset( $item['type'] ) && in_array( $item['type'], $option_types, true ) ) {
5793
+ $sub_options = array();
5794
+
5795
+ foreach ( $saved as $sub_key => $sub_value ) {
5796
+ if ( isset( $sub_value[ $item['id'] ] ) ) {
5797
+ $sub_options[ $sub_key ] = $sub_value[ $item['id'] ];
5798
+ }
5799
+ }
5800
+
5801
+ if ( ! empty( $sub_options ) ) {
5802
+ $options[] = array(
5803
+ 'id' => $item['id'],
5804
+ 'taxonomy' => $value['taxonomy'],
5805
+ 'parent' => $value['id'],
5806
+ 'value' => $sub_options,
5807
+ );
5808
+ }
5809
+ }
5810
+ }
5811
+ }
5812
+
5813
+ if ( in_array( $value['type'], $option_types, true ) ) {
5814
+ $saved = ot_get_option( $value['id'] );
5815
+ if ( ! empty( $saved ) ) {
5816
+ $options[] = array(
5817
+ 'id' => $value['id'],
5818
+ 'taxonomy' => $value['taxonomy'],
5819
+ 'value' => $saved,
5820
+ );
5821
+ }
5822
+ }
5823
+ }
5824
+ }
5825
+ }
5826
+
5827
+ return $options;
5828
+ }
5829
+ }
5830
+
5831
+ if ( ! function_exists( '_ot_meta_box_potential_shared_terms' ) ) {
5832
+
5833
+ /**
5834
+ * Build an array of potential Meta Box options that could share terms.
5835
+ *
5836
+ * @return array
5837
+ *
5838
+ * @access private
5839
+ * @since 2.5.4
5840
+ */
5841
+ function _ot_meta_box_potential_shared_terms() {
5842
+ global $ot_meta_boxes;
5843
+
5844
+ $options = array();
5845
+ $settings = $ot_meta_boxes;
5846
+ $option_types = array(
5847
+ 'category-checkbox',
5848
+ 'category-select',
5849
+ 'tag-checkbox',
5850
+ 'tag-select',
5851
+ 'taxonomy-checkbox',
5852
+ 'taxonomy-select',
5853
+ );
5854
+
5855
+ foreach ( $settings as $setting ) {
5856
+
5857
+ if ( isset( $setting['fields'] ) ) {
5858
+
5859
+ foreach ( $setting['fields'] as $value ) {
5860
+
5861
+ if ( isset( $value['type'] ) ) {
5862
+
5863
+ if ( 'list-item' === $value['type'] && isset( $value['settings'] ) ) {
5864
+
5865
+ $children = array();
5866
+
5867
+ foreach ( $value['settings'] as $item ) {
5868
+
5869
+ if ( isset( $value['id'] ) && isset( $item['type'] ) && in_array( $item['type'], $option_types, true ) ) {
5870
+ $children[ $value['id'] ][] = $item['id'];
5871
+ }
5872
+ }
5873
+
5874
+ if ( ! empty( $children[ $value['id'] ] ) ) {
5875
+ $options[] = array(
5876
+ 'id' => $value['id'],
5877
+ 'children' => $children[ $value['id'] ],
5878
+ 'taxonomy' => $value['taxonomy'],
5879
+ );
5880
+ }
5881
+ }
5882
+
5883
+ if ( in_array( $value['type'], $option_types, true ) ) {
5884
+ $options[] = array(
5885
+ 'id' => $value['id'],
5886
+ 'taxonomy' => $value['taxonomy'],
5887
+ );
5888
+ }
5889
+ }
5890
+ }
5891
+ }
5892
+ }
5893
+
5894
+ return $options;
5895
+ }
5896
+ }
5897
+
5898
+ if ( ! function_exists( 'ot_split_shared_term' ) ) {
5899
+
5900
+ /**
5901
+ * Update terms when a term gets split.
5902
+ *
5903
+ * @param int $term_id ID of the formerly shared term.
5904
+ * @param int $new_term_id ID of the new term created for the $term_taxonomy_id.
5905
+ * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split.
5906
+ * @param string $taxonomy Taxonomy for the split term.
5907
+ *
5908
+ * @access public
5909
+ * @since 2.5.4
5910
+ */
5911
+ function ot_split_shared_term( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
5912
+ unset( $term_taxonomy_id );
5913
+
5914
+ // Process the Theme Options.
5915
+ $settings = _ot_settings_potential_shared_terms();
5916
+ $old_options = get_option( ot_options_id(), array() );
5917
+ $new_options = $old_options;
5918
+
5919
+ // Process the saved settings.
5920
+ if ( ! empty( $settings ) && ! empty( $old_options ) ) {
5921
+
5922
+ // Loop over the Theme Options.
5923
+ foreach ( $settings as $option ) {
5924
+
5925
+ if ( ! is_array( $option['taxonomy'] ) ) {
5926
+ $option['taxonomy'] = explode( ',', $option['taxonomy'] );
5927
+ }
5928
+
5929
+ if ( ! in_array( $taxonomy, $option['taxonomy'], true ) ) {
5930
+ continue;
5931
+ }
5932
+
5933
+ // The option ID was found.
5934
+ if ( array_key_exists( $option['id'], $old_options ) || ( isset( $option['parent'] ) && array_key_exists( $option['parent'], $old_options ) ) ) {
5935
+
5936
+ // This is a list item, we have to go deeper.
5937
+ if ( isset( $option['parent'] ) ) {
5938
+
5939
+ // Loop over the array.
5940
+ foreach ( $option['value'] as $key => $value ) {
5941
+
5942
+ // The value is an array of IDs.
5943
+ if ( is_array( $value ) ) {
5944
+
5945
+ // Loop over the sub array.
5946
+ foreach ( $value as $sub_key => $sub_value ) {
5947
+
5948
+ if ( $sub_value === $term_id ) {
5949
+ unset( $new_options[ $option['parent'] ][ $key ][ $option['id'] ][ $sub_key ] );
5950
+ $new_options[ $option['parent'] ][ $key ][ $option['id'] ][ $new_term_id ] = $new_term_id;
5951
+ }
5952
+ }
5953
+ } elseif ( $value === $term_id ) {
5954
+ unset( $new_options[ $option['parent'] ][ $key ][ $option['id'] ] );
5955
+ $new_options[ $option['parent'] ][ $key ][ $option['id'] ] = $new_term_id;
5956
+ }
5957
+ }
5958
+ } else {
5959
+
5960
+ // The value is an array of IDs.
5961
+ if ( is_array( $option['value'] ) ) {
5962
+
5963
+ // Loop over the array.
5964
+ foreach ( $option['value'] as $key => $value ) {
5965
+
5966
+ // It's a single value, just replace it.
5967
+ if ( $value === $term_id ) {
5968
+ unset( $new_options[ $option['id'] ][ $key ] );
5969
+ $new_options[ $option['id'] ][ $new_term_id ] = $new_term_id;
5970
+ }
5971
+ }
5972
+
5973
+ // It's a single value, just replace it.
5974
+ } elseif ( $option['value'] === $term_id ) {
5975
+ $new_options[ $option['id'] ] = $new_term_id;
5976
+ }
5977
+ }
5978
+ }
5979
+ }
5980
+ }
5981
+
5982
+ // Options need to be updated.
5983
+ if ( $old_options !== $new_options ) {
5984
+ update_option( ot_options_id(), $new_options );
5985
+ }
5986
+
5987
+ // Process the Meta Boxes.
5988
+ $meta_settings = _ot_meta_box_potential_shared_terms();
5989
+
5990
+ if ( ! empty( $meta_settings ) ) {
5991
+
5992
+ foreach ( $meta_settings as $option ) {
5993
+
5994
+ if ( ! is_array( $option['taxonomy'] ) ) {
5995
+ $option['taxonomy'] = explode( ',', $option['taxonomy'] );
5996
+ }
5997
+
5998
+ if ( ! in_array( $taxonomy, $option['taxonomy'], true ) ) {
5999
+ continue;
6000
+ }
6001
+
6002
+ if ( isset( $option['children'] ) ) {
6003
+ $post_ids = get_posts(
6004
+ array(
6005
+ 'fields' => 'ids',
6006
+ 'meta_key' => $option['id'], // phpcs:ignore
6007
+ )
6008
+ );
6009
+
6010
+ if ( $post_ids ) {
6011
+
6012
+ foreach ( $post_ids as $post_id ) {
6013
+
6014
+ // Get the meta.
6015
+ $old_meta = get_post_meta( $post_id, $option['id'], true );
6016
+ $new_meta = $old_meta;
6017
+
6018
+ // Has a saved value.
6019
+ if ( ! empty( $old_meta ) && is_array( $old_meta ) ) {
6020
+
6021
+ // Loop over the array.
6022
+ foreach ( $old_meta as $key => $value ) {
6023
+
6024
+ foreach ( $value as $sub_key => $sub_value ) {
6025
+
6026
+ if ( in_array( $sub_key, $option['children'], true ) ) {
6027
+
6028
+ // The value is an array of IDs.
6029
+ if ( is_array( $sub_value ) ) {
6030
+
6031
+ // Loop over the array.
6032
+ foreach ( $sub_value as $sub_sub_key => $sub_sub_value ) {
6033
+
6034
+ // It's a single value, just replace it.
6035
+ if ( $sub_sub_value === $term_id ) {
6036
+ unset( $new_meta[ $key ][ $sub_key ][ $sub_sub_key ] );
6037
+ $new_meta[ $key ][ $sub_key ][ $new_term_id ] = $new_term_id;
6038
+ }
6039
+ }
6040
+
6041
+ // It's a single value, just replace it.
6042
+ } elseif ( $sub_value === $term_id ) {
6043
+ $new_meta[ $key ][ $sub_key ] = $new_term_id;
6044
+ }
6045
+ }
6046
+ }
6047
+ }
6048
+
6049
+ // Update.
6050
+ if ( $old_meta !== $new_meta ) {
6051
+ update_post_meta( $post_id, $option['id'], $new_meta, $old_meta );
6052
+ }
6053
+ }
6054
+ }
6055
+ }
6056
+ } else {
6057
+ $post_ids = get_posts(
6058
+ array(
6059
+ 'fields' => 'ids',
6060
+ 'meta_query' => array( // phpcs:ignore
6061
+ 'key' => $option['id'],
6062
+ 'value' => $term_id,
6063
+ 'compare' => 'IN',
6064
+ ),
6065
+ )
6066
+ );
6067
+
6068
+ if ( $post_ids ) {
6069
+
6070
+ foreach ( $post_ids as $post_id ) {
6071
+
6072
+ // Get the meta.
6073
+ $old_meta = get_post_meta( $post_id, $option['id'], true );
6074
+ $new_meta = $old_meta;
6075
+
6076
+ // Has a saved value.
6077
+ if ( ! empty( $old_meta ) ) {
6078
+
6079
+ // The value is an array of IDs.
6080
+ if ( is_array( $old_meta ) ) {
6081
+
6082
+ // Loop over the array.
6083
+ foreach ( $old_meta as $key => $value ) {
6084
+
6085
+ // It's a single value, just replace it.
6086
+ if ( $value === $term_id ) {
6087
+ unset( $new_meta[ $key ] );
6088
+ $new_meta[ $new_term_id ] = $new_term_id;
6089
+ }
6090
+ }
6091
+
6092
+ // It's a single value, just replace it.
6093
+ } elseif ( $old_meta === $term_id ) {
6094
+ $new_meta = $new_term_id;
6095
+ }
6096
+
6097
+ // Update.
6098
+ if ( $old_meta !== $new_meta ) {
6099
+ update_post_meta( $post_id, $option['id'], $new_meta, $old_meta );
6100
+ }
6101
+ }
6102
+ }
6103
+ }
6104
+ }
6105
+ }
6106
+ }
6107
+ }
6108
+
6109
+ add_action( 'split_shared_term', 'ot_split_shared_term', 10, 4 );
6110
+ }
6111
+
admin/includes/ot-functions-option-types.php CHANGED
@@ -1,3227 +1,3227 @@
1
- <?php
2
- /**
3
- * OptionTree Option Type Functions.
4
- *
5
- * Functions used to build each option type.
6
- *
7
- * @package OptionTree
8
- */
9
-
10
- if ( ! defined( 'OT_VERSION' ) ) {
11
- exit( 'No direct script access allowed' );
12
- }
13
-
14
- if ( ! function_exists( 'ot_display_by_type' ) ) {
15
-
16
- /**
17
- * Builds the HTML for each of the available option types by calling those
18
- * function with call_user_func and passing the arguments to the second param.
19
- *
20
- * All fields are required!
21
- *
22
- * @param array $args The array of arguments are as follows.
23
- * @var string $type Type of option.
24
- * @var string $field_id The field ID.
25
- * @var string $field_name The field Name.
26
- * @var mixed $field_value The field value is a string or an array of values.
27
- * @var string $field_desc The field description.
28
- * @var string $field_std The standard value.
29
- * @var string $field_class Extra CSS classes.
30
- * @var array $field_choices The array of option choices.
31
- * @var array $field_settings The array of settings for a list item.
32
- *
33
- * @access public
34
- * @since 2.0
35
- */
36
- function ot_display_by_type( $args = array() ) {
37
-
38
- // Allow filters to be executed on the array.
39
- $args = apply_filters( 'ot_display_by_type', $args );
40
-
41
- if ( empty( $args['type'] ) ) {
42
- return;
43
- }
44
-
45
- // Build the function name.
46
- $function_name_by_type = str_replace( '-', '_', 'ot_type_' . $args['type'] );
47
-
48
- // Call the function & pass in arguments array.
49
- if ( function_exists( $function_name_by_type ) ) {
50
- call_user_func( $function_name_by_type, $args );
51
- } else {
52
- echo '<p>' . esc_html__( 'Sorry, this function does not exist', 'option-tree' ) . '</p>';
53
- }
54
-
55
- }
56
- }
57
-
58
- if ( ! function_exists( 'ot_type_background' ) ) {
59
-
60
- /**
61
- * Background option type.
62
- *
63
- * See @ot_display_by_type to see the full list of available arguments.
64
- *
65
- * @param array $args An array of arguments.
66
- *
67
- * @access public
68
- * @since 2.0
69
- */
70
- function ot_type_background( $args = array() ) {
71
-
72
- // Turns arguments array into variables.
73
- extract( $args ); // phpcs:ignore
74
-
75
- // Verify a description.
76
- $has_desc = ! empty( $field_desc ) ? true : false;
77
-
78
- // If an attachment ID is stored here fetch its URL and replace the value.
79
- if ( isset( $field_value['background-image'] ) && wp_attachment_is_image( $field_value['background-image'] ) ) {
80
-
81
- $attachment_data = wp_get_attachment_image_src( $field_value['background-image'], 'original' );
82
-
83
- /* check for attachment data */
84
- if ( $attachment_data ) {
85
-
86
- $field_src = $attachment_data[0];
87
-
88
- }
89
- }
90
-
91
- // Format setting outer wrapper.
92
- echo '<div class="format-setting type-background ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
93
-
94
- // Description.
95
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
96
-
97
- // Format setting inner wrapper.
98
- echo '<div class="format-setting-inner">';
99
-
100
- // Allow fields to be filtered.
101
- $ot_recognized_background_fields = apply_filters(
102
- 'ot_recognized_background_fields',
103
- array(
104
- 'background-color',
105
- 'background-repeat',
106
- 'background-attachment',
107
- 'background-position',
108
- 'background-size',
109
- 'background-image',
110
- ),
111
- $field_id
112
- );
113
-
114
- echo '<div class="ot-background-group">';
115
-
116
- // Build background color.
117
- if ( in_array( 'background-color', $ot_recognized_background_fields, true ) ) {
118
-
119
- echo '<div class="option-tree-ui-colorpicker-input-wrap">';
120
-
121
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_colorpicker("' . esc_attr( $field_id ) . '-picker"); });</script>';
122
-
123
- $background_color = isset( $field_value['background-color'] ) ? $field_value['background-color'] : '';
124
-
125
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[background-color]" id="' . esc_attr( $field_id ) . '-picker" value="' . esc_attr( $background_color ) . '" class="hide-color-picker ' . esc_attr( $field_class ) . '" />';
126
-
127
- echo '</div>';
128
- }
129
-
130
- // Build background repeat.
131
- if ( in_array( 'background-repeat', $ot_recognized_background_fields, true ) ) {
132
-
133
- $background_repeat = isset( $field_value['background-repeat'] ) ? esc_attr( $field_value['background-repeat'] ) : '';
134
-
135
- echo '<select name="' . esc_attr( $field_name ) . '[background-repeat]" id="' . esc_attr( $field_id ) . '-repeat" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
136
-
137
- echo '<option value="">' . esc_html__( 'background-repeat', 'option-tree' ) . '</option>';
138
- foreach ( ot_recognized_background_repeat( $field_id ) as $key => $value ) {
139
-
140
- echo '<option value="' . esc_attr( $key ) . '" ' . selected( $background_repeat, $key, false ) . '>' . esc_attr( $value ) . '</option>';
141
- }
142
-
143
- echo '</select>';
144
- }
145
-
146
- // Build background attachment.
147
- if ( in_array( 'background-attachment', $ot_recognized_background_fields, true ) ) {
148
-
149
- $background_attachment = isset( $field_value['background-attachment'] ) ? $field_value['background-attachment'] : '';
150
-
151
- echo '<select name="' . esc_attr( $field_name ) . '[background-attachment]" id="' . esc_attr( $field_id ) . '-attachment" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
152
-
153
- echo '<option value="">' . esc_html__( 'background-attachment', 'option-tree' ) . '</option>';
154
-
155
- foreach ( ot_recognized_background_attachment( $field_id ) as $key => $value ) {
156
-
157
- echo '<option value="' . esc_attr( $key ) . '" ' . selected( $background_attachment, $key, false ) . '>' . esc_attr( $value ) . '</option>';
158
- }
159
-
160
- echo '</select>';
161
- }
162
-
163
- // Build background position.
164
- if ( in_array( 'background-position', $ot_recognized_background_fields, true ) ) {
165
-
166
- $background_position = isset( $field_value['background-position'] ) ? $field_value['background-position'] : '';
167
-
168
- echo '<select name="' . esc_attr( $field_name ) . '[background-position]" id="' . esc_attr( $field_id ) . '-position" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
169
-
170
- echo '<option value="">' . esc_html__( 'background-position', 'option-tree' ) . '</option>';
171
-
172
- foreach ( ot_recognized_background_position( $field_id ) as $key => $value ) {
173
-
174
- echo '<option value="' . esc_attr( $key ) . '" ' . selected( $background_position, $key, false ) . '>' . esc_attr( $value ) . '</option>';
175
- }
176
-
177
- echo '</select>';
178
- }
179
-
180
- // Build background size .
181
- if ( in_array( 'background-size', $ot_recognized_background_fields, true ) ) {
182
-
183
- /**
184
- * Use this filter to create a select instead of an text input.
185
- * Be sure to return the array in the correct format. Add an empty
186
- * value to the first choice so the user can leave it blank.
187
- *
188
- * Example: array(
189
- * array(
190
- * 'label' => 'background-size',
191
- * 'value' => ''
192
- * ),
193
- * array(
194
- * 'label' => 'cover',
195
- * 'value' => 'cover'
196
- * ),
197
- * array(
198
- * 'label' => 'contain',
199
- * 'value' => 'contain'
200
- * )
201
- * )
202
- */
203
- $choices = apply_filters( 'ot_type_background_size_choices', '', $field_id );
204
-
205
- if ( is_array( $choices ) && ! empty( $choices ) ) {
206
-
207
- // Build select.
208
- echo '<select name="' . esc_attr( $field_name ) . '[background-size]" id="' . esc_attr( $field_id ) . '-size" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
209
-
210
- foreach ( (array) $choices as $choice ) {
211
- if ( isset( $choice['value'] ) && isset( $choice['label'] ) ) {
212
- echo '<option value="' . esc_attr( $choice['value'] ) . '" ' . selected( ( isset( $field_value['background-size'] ) ? $field_value['background-size'] : '' ), $choice['value'], false ) . '>' . esc_attr( $choice['label'] ) . '</option>';
213
- }
214
- }
215
-
216
- echo '</select>';
217
- } else {
218
-
219
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[background-size]" id="' . esc_attr( $field_id ) . '-size" value="' . esc_attr( isset( $field_value['background-size'] ) ? $field_value['background-size'] : '' ) . '" class="widefat ot-background-size-input option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'background-size', 'option-tree' ) . '" />';
220
- }
221
- }
222
-
223
- echo '</div>';
224
-
225
- // Build background image.
226
- if ( in_array( 'background-image', $ot_recognized_background_fields, true ) ) {
227
-
228
- echo '<div class="option-tree-ui-upload-parent">';
229
-
230
- // Input.
231
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[background-image]" id="' . esc_attr( $field_id ) . '" value="' . esc_attr( isset( $field_value['background-image'] ) ? $field_value['background-image'] : '' ) . '" class="widefat option-tree-ui-upload-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'background-image', 'option-tree' ) . '" />';
232
-
233
- // Add media button.
234
- echo '<a href="javascript:void(0);" class="ot_upload_media option-tree-ui-button button button-primary light" rel="' . esc_attr( $post_id ) . '" title="' . esc_html__( 'Add Media', 'option-tree' ) . '"><span class="icon ot-icon-plus-circle"></span>' . esc_html__( 'Add Media', 'option-tree' ) . '</a>';
235
-
236
- echo '</div>';
237
-
238
- // Media.
239
- if ( isset( $field_value['background-image'] ) && '' !== $field_value['background-image'] ) {
240
-
241
- /* replace image src */
242
- if ( isset( $field_src ) ) {
243
- $field_value['background-image'] = $field_src;
244
- }
245
-
246
- echo '<div class="option-tree-ui-media-wrap" id="' . esc_attr( $field_id ) . '_media">';
247
-
248
- if ( preg_match( '/\.(?:jpe?g|png|gif|ico)$/i', $field_value['background-image'] ) ) {
249
- echo '<div class="option-tree-ui-image-wrap"><img src="' . esc_url_raw( $field_value['background-image'] ) . '" alt="" /></div>';
250
- }
251
-
252
- echo '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="' . esc_html__( 'Remove Media', 'option-tree' ) . '"><span class="icon ot-icon-minus-circle"></span>' . esc_html__( 'Remove Media', 'option-tree' ) . '</a>';
253
-
254
- echo '</div>';
255
- }
256
- }
257
-
258
- echo '</div>';
259
-
260
- echo '</div>';
261
- }
262
- }
263
-
264
- if ( ! function_exists( 'ot_type_border' ) ) {
265
-
266
- /**
267
- * Border Option Type
268
- *
269
- * See @ot_display_by_type to see the full list of available arguments.
270
- *
271
- * @param array $args The options arguments.
272
- *
273
- * @access public
274
- * @since 2.5.0
275
- */
276
- function ot_type_border( $args = array() ) {
277
-
278
- // Turns arguments array into variables.
279
- extract( $args ); // phpcs:ignore
280
-
281
- // Verify a description.
282
- $has_desc = ! empty( $field_desc ) ? true : false;
283
-
284
- // Format setting outer wrapper.
285
- echo '<div class="format-setting type-border ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
286
-
287
- // Description.
288
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
289
-
290
- // Format setting inner wrapper.
291
- echo '<div class="format-setting-inner">';
292
-
293
- // Allow fields to be filtered.
294
- $ot_recognized_border_fields = apply_filters(
295
- 'ot_recognized_border_fields',
296
- array(
297
- 'width',
298
- 'unit',
299
- 'style',
300
- 'color',
301
- ),
302
- $field_id
303
- );
304
-
305
- // Build border width.
306
- if ( in_array( 'width', $ot_recognized_border_fields, true ) ) {
307
-
308
- $width = isset( $field_value['width'] ) ? $field_value['width'] : '';
309
-
310
- echo '<div class="ot-option-group ot-option-group--one-sixth"><input type="text" name="' . esc_attr( $field_name ) . '[width]" id="' . esc_attr( $field_id ) . '-width" value="' . esc_attr( $width ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'width', 'option-tree' ) . '" /></div>';
311
- }
312
-
313
- // Build unit dropdown.
314
- if ( in_array( 'unit', $ot_recognized_border_fields, true ) ) {
315
-
316
- echo '<div class="ot-option-group ot-option-group--one-fourth">';
317
-
318
- echo '<select name="' . esc_attr( $field_name ) . '[unit]" id="' . esc_attr( $field_id ) . '-unit" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
319
-
320
- echo '<option value="">' . esc_html__( 'unit', 'option-tree' ) . '</option>';
321
-
322
- foreach ( ot_recognized_border_unit_types( $field_id ) as $unit ) {
323
- echo '<option value="' . esc_attr( $unit ) . '" ' . ( isset( $field_value['unit'] ) ? selected( $field_value['unit'], $unit, false ) : '' ) . '>' . esc_attr( $unit ) . '</option>';
324
- }
325
-
326
- echo '</select>';
327
-
328
- echo '</div>';
329
- }
330
-
331
- // Build style dropdown.
332
- if ( in_array( 'style', $ot_recognized_border_fields, true ) ) {
333
-
334
- echo '<div class="ot-option-group ot-option-group--one-fourth">';
335
-
336
- echo '<select name="' . esc_attr( $field_name ) . '[style]" id="' . esc_attr( $field_id ) . '-style" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
337
-
338
- echo '<option value="">' . esc_html__( 'style', 'option-tree' ) . '</option>';
339
-
340
- foreach ( ot_recognized_border_style_types( $field_id ) as $key => $style ) {
341
- echo '<option value="' . esc_attr( $key ) . '" ' . ( isset( $field_value['style'] ) ? selected( $field_value['style'], $key, false ) : '' ) . '>' . esc_attr( $style ) . '</option>';
342
- }
343
-
344
- echo '</select>';
345
-
346
- echo '</div>';
347
- }
348
-
349
- // Build color.
350
- if ( in_array( 'color', $ot_recognized_border_fields, true ) ) {
351
-
352
- echo '<div class="option-tree-ui-colorpicker-input-wrap">';
353
-
354
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_colorpicker("' . esc_attr( $field_id ) . '-picker"); });</script>';
355
-
356
- $color = isset( $field_value['color'] ) ? $field_value['color'] : '';
357
-
358
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[color]" id="' . esc_attr( $field_id ) . '-picker" value="' . esc_attr( $color ) . '" class="hide-color-picker ' . esc_attr( $field_class ) . '" />';
359
-
360
- echo '</div>';
361
- }
362
-
363
- echo '</div>';
364
-
365
- echo '</div>';
366
- }
367
- }
368
-
369
- if ( ! function_exists( 'ot_type_box_shadow' ) ) {
370
-
371
- /**
372
- * Box Shadow Option Type
373
- *
374
- * See @ot_display_by_type to see the full list of available arguments.
375
- *
376
- * @param array $args The options arguments.
377
- *
378
- * @access public
379
- * @since 2.5.0
380
- */
381
- function ot_type_box_shadow( $args = array() ) {
382
-
383
- // Turns arguments array into variables.
384
- extract( $args ); // phpcs:ignore
385
-
386
- // Verify a description.
387
- $has_desc = ! empty( $field_desc ) ? true : false;
388
-
389
- // Format setting outer wrapper.
390
- echo '<div class="format-setting type-box-shadow ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
391
-
392
- // Description.
393
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
394
-
395
- // Format setting inner wrapper.
396
- echo '<div class="format-setting-inner">';
397
-
398
- // Allow fields to be filtered.
399
- $ot_recognized_box_shadow_fields = apply_filters(
400
- 'ot_recognized_box_shadow_fields',
401
- array(
402
- 'inset',
403
- 'offset-x',
404
- 'offset-y',
405
- 'blur-radius',
406
- 'spread-radius',
407
- 'color',
408
- ),
409
- $field_id
410
- );
411
-
412
- // Build inset.
413
- if ( in_array( 'inset', $ot_recognized_box_shadow_fields, true ) ) {
414
-
415
- echo '<div class="ot-option-group ot-option-group--checkbox"><p>';
416
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[inset]" id="' . esc_attr( $field_id ) . '-inset" value="inset" ' . ( isset( $field_value['inset'] ) ? checked( $field_value['inset'], 'inset', false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
417
- echo '<label for="' . esc_attr( $field_id ) . '-inset">inset</label>';
418
- echo '</p></div>';
419
- }
420
-
421
- // Build horizontal offset.
422
- if ( in_array( 'offset-x', $ot_recognized_box_shadow_fields, true ) ) {
423
-
424
- $offset_x = isset( $field_value['offset-x'] ) ? esc_attr( $field_value['offset-x'] ) : '';
425
-
426
- echo '<div class="ot-option-group ot-option-group--one-fifth"><span class="ot-icon-arrows-h ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[offset-x]" id="' . esc_attr( $field_id ) . '-offset-x" value="' . esc_attr( $offset_x ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'offset-x', 'option-tree' ) . '" /></div>';
427
- }
428
-
429
- // Build vertical offset.
430
- if ( in_array( 'offset-y', $ot_recognized_box_shadow_fields, true ) ) {
431
-
432
- $offset_y = isset( $field_value['offset-y'] ) ? esc_attr( $field_value['offset-y'] ) : '';
433
-
434
- echo '<div class="ot-option-group ot-option-group--one-fifth"><span class="ot-icon-arrows-v ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[offset-y]" id="' . esc_attr( $field_id ) . '-offset-y" value="' . esc_attr( $offset_y ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'offset-y', 'option-tree' ) . '" /></div>';
435
- }
436
-
437
- // Build blur-radius radius.
438
- if ( in_array( 'blur-radius', $ot_recognized_box_shadow_fields, true ) ) {
439
-
440
- $blur_radius = isset( $field_value['blur-radius'] ) ? esc_attr( $field_value['blur-radius'] ) : '';
441
-
442
- echo '<div class="ot-option-group ot-option-group--one-fifth"><span class="ot-icon-circle ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[blur-radius]" id="' . esc_attr( $field_id ) . '-blur-radius" value="' . esc_attr( $blur_radius ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'blur-radius', 'option-tree' ) . '" /></div>';
443
- }
444
-
445
- // Build spread-radius radius.
446
- if ( in_array( 'spread-radius', $ot_recognized_box_shadow_fields, true ) ) {
447
-
448
- $spread_radius = isset( $field_value['spread-radius'] ) ? esc_attr( $field_value['spread-radius'] ) : '';
449
-
450
- echo '<div class="ot-option-group ot-option-group--one-fifth"><span class="ot-icon-arrows-alt ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[spread-radius]" id="' . esc_attr( $field_id ) . '-spread-radius" value="' . esc_attr( $spread_radius ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'spread-radius', 'option-tree' ) . '" /></div>';
451
- }
452
-
453
- // Build color.
454
- if ( in_array( 'color', $ot_recognized_box_shadow_fields, true ) ) {
455
-
456
- echo '<div class="option-tree-ui-colorpicker-input-wrap">';
457
-
458
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_colorpicker("' . esc_attr( $field_id ) . '-picker"); });</script>';
459
-
460
- $color = isset( $field_value['color'] ) ? $field_value['color'] : '';
461
-
462
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[color]" id="' . esc_attr( $field_id ) . '-picker" value="' . esc_attr( $color ) . '" class="hide-color-picker ' . esc_attr( $field_class ) . '" />';
463
-
464
- echo '</div>';
465
- }
466
-
467
- echo '</div>';
468
-
469
- echo '</div>';
470
- }
471
- }
472
-
473
- if ( ! function_exists( 'ot_type_category_checkbox' ) ) {
474
-
475
- /**
476
- * Category Checkbox option type.
477
- *
478
- * See @ot_display_by_type to see the full list of available arguments.
479
- *
480
- * @param array $args An array of arguments.
481
- *
482
- * @access public
483
- * @since 2.0
484
- */
485
- function ot_type_category_checkbox( $args = array() ) {
486
-
487
- // Turns arguments array into variables.
488
- extract( $args );// phpcs:ignore
489
-
490
- // Verify a description.
491
- $has_desc = ! empty( $field_desc ) ? true : false;
492
-
493
- // Format setting outer wrapper.
494
- echo '<div class="format-setting type-category-checkbox type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
495
-
496
- // Description.
497
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
498
-
499
- // Format setting inner wrapper.
500
- echo '<div class="format-setting-inner">';
501
-
502
- // Get category array.
503
- $categories = get_categories( apply_filters( 'ot_type_category_checkbox_query', array( 'hide_empty' => false ), $field_id ) );
504
-
505
- // Build categories.
506
- if ( ! empty( $categories ) ) {
507
- foreach ( $categories as $category ) {
508
- echo '<p>';
509
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $category->term_id ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $category->term_id ) . '" value="' . esc_attr( $category->term_id ) . '" ' . ( isset( $field_value[ $category->term_id ] ) ? checked( $field_value[ $category->term_id ], $category->term_id, false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
510
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $category->term_id ) . '">' . esc_attr( $category->name ) . '</label>';
511
- echo '</p>';
512
- }
513
- } else {
514
- echo '<p>' . esc_html__( 'No Categories Found', 'option-tree' ) . '</p>';
515
- }
516
-
517
- echo '</div>';
518
-
519
- echo '</div>';
520
- }
521
- }
522
-
523
- if ( ! function_exists( 'ot_type_category_select' ) ) {
524
-
525
- /**
526
- * Category Select option type.
527
- *
528
- * See @ot_display_by_type to see the full list of available arguments.
529
- *
530
- * @param array $args An array of arguments.
531
- *
532
- * @access public
533
- * @since 2.0
534
- */
535
- function ot_type_category_select( $args = array() ) {
536
-
537
- // Turns arguments array into variables.
538
- extract( $args ); // phpcs:ignore
539
-
540
- // Verify a description.
541
- $has_desc = ! empty( $field_desc ) ? true : false;
542
-
543
- // Format setting outer wrapper.
544
- echo '<div class="format-setting type-category-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
545
-
546
- // Description.
547
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
548
-
549
- // Format setting inner wrapper.
550
- echo '<div class="format-setting-inner">';
551
-
552
- // Build category.
553
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
554
-
555
- // Get category array.
556
- $categories = get_categories( apply_filters( 'ot_type_category_select_query', array( 'hide_empty' => false ), $field_id ) );
557
-
558
- // Has cats.
559
- if ( ! empty( $categories ) ) {
560
- echo '<option value="">-- ' . esc_html__( 'Choose One', 'option-tree' ) . ' --</option>';
561
- foreach ( $categories as $category ) {
562
- echo '<option value="' . esc_attr( $category->term_id ) . '" ' . selected( $field_value, $category->term_id, false ) . '>' . esc_attr( $category->name ) . '</option>';
563
- }
564
- } else {
565
- echo '<option value="">' . esc_html__( 'No Categories Found', 'option-tree' ) . '</option>';
566
- }
567
-
568
- echo '</select>';
569
-
570
- echo '</div>';
571
-
572
- echo '</div>';
573
- }
574
- }
575
-
576
- if ( ! function_exists( 'ot_type_checkbox' ) ) {
577
-
578
- /**
579
- * Checkbox option type.
580
- *
581
- * See @ot_display_by_type to see the full list of available arguments.
582
- *
583
- * @param array $args An array of arguments.
584
- *
585
- * @access public
586
- * @since 2.0
587
- */
588
- function ot_type_checkbox( $args = array() ) {
589
-
590
- // Turns arguments array into variables.
591
- extract( $args ); // phpcs:ignore
592
-
593
- // Verify a description.
594
- $has_desc = ! empty( $field_desc ) ? true : false;
595
-
596
- // Format setting outer wrapper.
597
- echo '<div class="format-setting type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
598
-
599
- // Description.
600
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
601
-
602
- // Format setting inner wrapper.
603
- echo '<div class="format-setting-inner">';
604
-
605
- // Build checkbox.
606
- foreach ( (array) $field_choices as $key => $choice ) {
607
- if ( isset( $choice['value'] ) && isset( $choice['label'] ) ) {
608
- echo '<p>';
609
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" value="' . esc_attr( $choice['value'] ) . '" ' . ( isset( $field_value[ $key ] ) ? checked( $field_value[ $key ], $choice['value'], false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
610
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '">' . esc_attr( $choice['label'] ) . '</label>';
611
- echo '</p>';
612
- }
613
- }
614
-
615
- echo '</div>';
616
-
617
- echo '</div>';
618
- }
619
- }
620
-
621
- if ( ! function_exists( 'ot_type_colorpicker' ) ) {
622
-
623
- /**
624
- * Colorpicker option type.
625
- *
626
- * See @ot_display_by_type to see the full list of available arguments.
627
- *
628
- * @param array $args An array of arguments.
629
- *
630
- * @access public
631
- * @since 2.0
632
- * @updated 2.2.0
633
- */
634
- function ot_type_colorpicker( $args = array() ) {
635
-
636
- // Turns arguments array into variables.
637
- extract( $args ); // phpcs:ignore
638
-
639
- // Verify a description.
640
- $has_desc = ! empty( $field_desc ) ? true : false;
641
-
642
- // Format setting outer wrapper.
643
- echo '<div class="format-setting type-colorpicker ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
644
-
645
- // Description.
646
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
647
-
648
- // Format setting inner wrapper.
649
- echo '<div class="format-setting-inner">';
650
-
651
- // Build colorpicker.
652
- echo '<div class="option-tree-ui-colorpicker-input-wrap">';
653
-
654
- // Colorpicker JS.
655
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_colorpicker("' . esc_attr( $field_id ) . '"); });</script>';
656
-
657
- // Input.
658
- echo '<input type="text" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" value="' . esc_attr( $field_value ) . '" class="hide-color-picker ' . esc_attr( $field_class ) . '"' . ( ! empty( $field_std ) ? ' data-default-color="' . esc_attr( $field_std ) . '"' : '' ) . ' />';
659
-
660
- echo '</div>';
661
-
662
- echo '</div>';
663
-
664
- echo '</div>';
665
- }
666
- }
667
-
668
- if ( ! function_exists( 'ot_type_colorpicker_opacity' ) ) {
669
-
670
- /**
671
- * Colorpicker Opacity option type.
672
- *
673
- * See @ot_display_by_type to see the full list of available arguments.
674
- *
675
- * @param array $args An array of arguments.
676
- *
677
- * @access public
678
- * @since 2.5.0
679
- */
680
- function ot_type_colorpicker_opacity( $args = array() ) {
681
-
682
- $args['field_class'] = isset( $args['field_class'] ) ? $args['field_class'] . ' ot-colorpicker-opacity' : 'ot-colorpicker-opacity';
683
- ot_type_colorpicker( $args );
684
- }
685
- }
686
-
687
- if ( ! function_exists( 'ot_type_css' ) ) {
688
-
689
- /**
690
- * CSS option type.
691
- *
692
- * See @ot_display_by_type to see the full list of available arguments.
693
- *
694
- * @param array $args An array of arguments.
695
- *
696
- * @access public
697
- * @since 2.0
698
- */
699
- function ot_type_css( $args = array() ) {
700
-
701
- // Turns arguments array into variables.
702
- extract( $args ); // phpcs:ignore
703
-
704
- // Verify a description.
705
- $has_desc = ! empty( $field_desc ) ? true : false;
706
-
707
- // Format setting outer wrapper.
708
- echo '<div class="format-setting type-css simple ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
709
-
710
- // Description.
711
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
712
-
713
- // Format setting inner wrapper.
714
- echo '<div class="format-setting-inner">';
715
-
716
- // Build textarea for CSS.
717
- echo '<textarea class="hidden" id="textarea_' . esc_attr( $field_id ) . '" name="' . esc_attr( $field_name ) . '">' . esc_textarea( $field_value ) . '</textarea>';
718
-
719
- // Build pre to convert it into ace editor later.
720
- echo '<pre class="ot-css-editor ' . esc_attr( $field_class ) . '" id="' . esc_attr( $field_id ) . '">' . esc_textarea( $field_value ) . '</pre>';
721
-
722
- echo '</div>';
723
-
724
- echo '</div>';
725
- }
726
- }
727
-
728
- if ( ! function_exists( 'ot_type_custom_post_type_checkbox' ) ) {
729
-
730
- /**
731
- * Custom Post Type Checkbox option type.
732
- *
733
- * See @ot_display_by_type to see the full list of available arguments.
734
- *
735
- * @param array $args An array of arguments.
736
- *
737
- * @access public
738
- * @since 2.0
739
- */
740
- function ot_type_custom_post_type_checkbox( $args = array() ) {
741
-
742
- // Turns arguments array into variables.
743
- extract( $args ); // phpcs:ignore
744
-
745
- // Verify a description.
746
- $has_desc = ! empty( $field_desc ) ? true : false;
747
-
748
- // Format setting outer wrapper.
749
- echo '<div class="format-setting type-custom-post-type-checkbox type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
750
-
751
- // Description.
752
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
753
-
754
- // Format setting inner wrapper.
755
- echo '<div class="format-setting-inner">';
756
-
757
- // Setup the post types.
758
- $post_type = isset( $field_post_type ) ? explode( ',', $field_post_type ) : array( 'post' );
759
-
760
- // Query posts array.
761
- $my_posts = get_posts(
762
- apply_filters(
763
- 'ot_type_custom_post_type_checkbox_query',
764
- array(
765
- 'post_type' => $post_type,
766
- 'posts_per_page' => -1,
767
- 'orderby' => 'title',
768
- 'order' => 'ASC',
769
- 'post_status' => 'any',
770
- ),
771
- $field_id
772
- )
773
- );
774
-
775
- // Has posts.
776
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
777
- foreach ( $my_posts as $my_post ) {
778
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
779
- echo '<p>';
780
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $my_post->ID ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '" value="' . esc_attr( $my_post->ID ) . '" ' . ( isset( $field_value[ $my_post->ID ] ) ? checked( $field_value[ $my_post->ID ], $my_post->ID, false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
781
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '">' . esc_html( $post_title ) . '</label>';
782
- echo '</p>';
783
- }
784
- } else {
785
- echo '<p>' . esc_html__( 'No Posts Found', 'option-tree' ) . '</p>';
786
- }
787
-
788
- echo '</div>';
789
-
790
- echo '</div>';
791
- }
792
- }
793
-
794
- if ( ! function_exists( 'ot_type_custom_post_type_select' ) ) {
795
-
796
- /**
797
- * Custom Post Type Select option type.
798
- *
799
- * See @ot_display_by_type to see the full list of available arguments.
800
- *
801
- * @param array $args An array of arguments.
802
- *
803
- * @access public
804
- * @since 2.0
805
- */
806
- function ot_type_custom_post_type_select( $args = array() ) {
807
-
808
- // Turns arguments array into variables.
809
- extract( $args ); // phpcs:ignore
810
-
811
- // Verify a description.
812
- $has_desc = ! empty( $field_desc ) ? true : false;
813
-
814
- // Format setting outer wrapper.
815
- echo '<div class="format-setting type-custom-post-type-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
816
-
817
- // Description.
818
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
819
-
820
- // Format setting inner wrapper.
821
- echo '<div class="format-setting-inner">';
822
-
823
- // Build category.
824
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
825
-
826
- // Setup the post types.
827
- $post_type = isset( $field_post_type ) ? explode( ',', $field_post_type ) : array( 'post' );
828
-
829
- // Query posts array.
830
- $my_posts = get_posts(
831
- apply_filters(
832
- 'ot_type_custom_post_type_select_query',
833
- array(
834
- 'post_type' => $post_type,
835
- 'posts_per_page' => -1,
836
- 'orderby' => 'title',
837
- 'order' => 'ASC',
838
- 'post_status' => 'any',
839
- ),
840
- $field_id
841
- )
842
- );
843
-
844
- // Has posts.
845
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
846
- echo '<option value="">-- ' . esc_html__( 'Choose One', 'option-tree' ) . ' --</option>';
847
- foreach ( $my_posts as $my_post ) {
848
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
849
- echo '<option value="' . esc_attr( $my_post->ID ) . '" ' . selected( $field_value, $my_post->ID, false ) . '>' . esc_html( $post_title ) . '</option>';
850
- }
851
- } else {
852
- echo '<option value="">' . esc_html__( 'No Posts Found', 'option-tree' ) . '</option>';
853
- }
854
-
855
- echo '</select>';
856
-
857
- echo '</div>';
858
-
859
- echo '</div>';
860
- }
861
- }
862
-
863
- if ( ! function_exists( 'ot_type_date_picker' ) ) {
864
-
865
- /**
866
- * Date Picker option type.
867
- *
868
- * See @ot_display_by_type to see the full list of available arguments.
869
- *
870
- * @param array $args An array of arguments.
871
- *
872
- * @access public
873
- * @since 2.3
874
- */
875
- function ot_type_date_picker( $args = array() ) {
876
-
877
- // Turns arguments array into variables.
878
- extract( $args ); // phpcs:ignore
879
-
880
- // Verify a description.
881
- $has_desc = ! empty( $field_desc ) ? true : false;
882
-
883
- // Filter date format.
884
- $date_format = apply_filters( 'ot_type_date_picker_date_format', 'yy-mm-dd', $field_id );
885
-
886
- /**
887
- * Filter the addition of the readonly attribute.
888
- *
889
- * @since 2.5.0
890
- *
891
- * @param bool $is_readonly Whether to add the 'readonly' attribute. Default 'false'.
892
- * @param string $field_id The field ID.
893
- */
894
- $is_readonly = apply_filters( 'ot_type_date_picker_readonly', false, $field_id );
895
-
896
- // Format setting outer wrapper.
897
- echo '<div class="format-setting type-date-picker ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
898
-
899
- // Date picker JS.
900
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_date_picker("' . esc_attr( $field_id ) . '", "' . esc_attr( $date_format ) . '"); });</script>';
901
-
902
- // Description.
903
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
904
-
905
- // Format setting inner wrapper.
906
- echo '<div class="format-setting-inner">';
907
-
908
- // Build date picker.
909
- echo '<input type="text" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" value="' . esc_attr( $field_value ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '"' . ( true === $is_readonly ? ' readonly' : '' ) . ' />';
910
-
911
- echo '</div>';
912
-
913
- echo '</div>';
914
- }
915
- }
916
-
917
- if ( ! function_exists( 'ot_type_date_time_picker' ) ) {
918
-
919
- /**
920
- * Date Time Picker option type.
921
- *
922
- * See @ot_display_by_type to see the full list of available arguments.
923
- *
924
- * @param array $args An array of arguments.
925
- *
926
- * @access public
927
- * @since 2.3
928
- */
929
- function ot_type_date_time_picker( $args = array() ) {
930
-
931
- // Turns arguments array into variables.
932
- extract( $args ); // phpcs:ignore
933
-
934
- // Verify a description.
935
- $has_desc = ! empty( $field_desc ) ? true : false;
936
-
937
- // Filter date format.
938
- $date_format = apply_filters( 'ot_type_date_time_picker_date_format', 'yy-mm-dd', $field_id );
939
-
940
- /**
941
- * Filter the addition of the readonly attribute.
942
- *
943
- * @since 2.5.0
944
- *
945
- * @param bool $is_readonly Whether to add the 'readonly' attribute. Default 'false'.
946
- * @param string $field_id The field ID.
947
- */
948
- $is_readonly = apply_filters( 'ot_type_date_time_picker_readonly', false, $field_id );
949
-
950
- // Format setting outer wrapper.
951
- echo '<div class="format-setting type-date-time-picker ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
952
-
953
- // Date time picker JS.
954
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_date_time_picker("' . esc_attr( $field_id ) . '", "' . esc_attr( $date_format ) . '"); });</script>';
955
-
956
- // Description.
957
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
958
-
959
- // Format setting inner wrapper.
960
- echo '<div class="format-setting-inner">';
961
-
962
- // Build date time picker.
963
- echo '<input type="text" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" value="' . esc_attr( $field_value ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '"' . ( true === $is_readonly ? ' readonly' : '' ) . ' />';
964
-
965
- echo '</div>';
966
-
967
- echo '</div>';
968
- }
969
- }
970
-
971
- if ( ! function_exists( 'ot_type_dimension' ) ) {
972
-
973
- /**
974
- * Dimension Option Type
975
- *
976
- * See @ot_display_by_type to see the full list of available arguments.
977
- *
978
- * @param array $args The options arguments.
979
- *
980
- * @access public
981
- * @since 2.5.0
982
- */
983
- function ot_type_dimension( $args = array() ) {
984
-
985
- // Turns arguments array into variables.
986
- extract( $args ); // phpcs:ignore
987
-
988
- // Verify a description.
989
- $has_desc = ! empty( $field_desc ) ? true : false;
990
-
991
- // Format setting outer wrapper.
992
- echo '<div class="format-setting type-dimension ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
993
-
994
- // Description.
995
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
996
-
997
- // Format setting inner wrapper.
998
- echo '<div class="format-setting-inner">';
999
-
1000
- // Allow fields to be filtered.
1001
- $ot_recognized_dimension_fields = apply_filters(
1002
- 'ot_recognized_dimension_fields',
1003
- array(
1004
- 'width',
1005
- 'height',
1006
- 'unit',
1007
- ),
1008
- $field_id
1009
- );
1010
-
1011
- // Build width dimension.
1012
- if ( in_array( 'width', $ot_recognized_dimension_fields, true ) ) {
1013
-
1014
- $width = isset( $field_value['width'] ) ? esc_attr( $field_value['width'] ) : '';
1015
- echo '<div class="ot-option-group ot-option-group--one-third"><span class="ot-icon-arrows-h ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[width]" id="' . esc_attr( $field_id ) . '-width" value="' . esc_attr( $width ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'width', 'option-tree' ) . '" /></div>';
1016
- }
1017
-
1018
- // Build height dimension.
1019
- if ( in_array( 'height', $ot_recognized_dimension_fields, true ) ) {
1020
-
1021
- $height = isset( $field_value['height'] ) ? esc_attr( $field_value['height'] ) : '';
1022
- echo '<div class="ot-option-group ot-option-group--one-third"><span class="ot-icon-arrows-v ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[height]" id="' . esc_attr( $field_id ) . '-height" value="' . esc_attr( $height ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'height', 'option-tree' ) . '" /></div>';
1023
- }
1024
-
1025
- // Build unit dropdown.
1026
- if ( in_array( 'unit', $ot_recognized_dimension_fields, true ) ) {
1027
-
1028
- echo '<div class="ot-option-group ot-option-group--one-third ot-option-group--is-last">';
1029
-
1030
- echo '<select name="' . esc_attr( $field_name ) . '[unit]" id="' . esc_attr( $field_id ) . '-unit" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1031
-
1032
- echo '<option value="">' . esc_html__( 'unit', 'option-tree' ) . '</option>';
1033
-
1034
- foreach ( ot_recognized_dimension_unit_types( $field_id ) as $unit ) {
1035
- echo '<option value="' . esc_attr( $unit ) . '" ' . ( isset( $field_value['unit'] ) ? selected( $field_value['unit'], $unit, false ) : '' ) . '>' . esc_attr( $unit ) . '</option>';
1036
- }
1037
-
1038
- echo '</select>';
1039
-
1040
- echo '</div>';
1041
- }
1042
-
1043
- echo '</div>';
1044
-
1045
- echo '</div>';
1046
- }
1047
- }
1048
-
1049
- if ( ! function_exists( 'ot_type_gallery' ) ) {
1050
-
1051
- /**
1052
- * Gallery option type.
1053
- *
1054
- * See @ot_display_by_type to see the full list of available arguments.
1055
- *
1056
- * @param array $args The options arguments.
1057
- *
1058
- * @access public
1059
- * @since 2.2.0
1060
- */
1061
- function ot_type_gallery( $args = array() ) {
1062
-
1063
- // Turns arguments array into variables.
1064
- extract( $args ); // phpcs:ignore
1065
-
1066
- // Verify a description.
1067
- $has_desc = ! empty( $field_desc ) ? true : false;
1068
-
1069
- // Format setting outer wrapper.
1070
- echo '<div class="format-setting type-gallery ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1071
-
1072
- // Description.
1073
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1074
-
1075
- // Format setting inner wrapper.
1076
- echo '<div class="format-setting-inner">';
1077
-
1078
- $field_value = trim( $field_value );
1079
-
1080
- // Saved values.
1081
- echo '<input type="hidden" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" value="' . esc_attr( $field_value ) . '" class="ot-gallery-value ' . esc_attr( $field_class ) . '" />';
1082
-
1083
- // Search the string for the IDs.
1084
- preg_match( '/ids=\'(.*?)\'/', $field_value, $matches );
1085
-
1086
- // Turn the field value into an array of IDs.
1087
- if ( isset( $matches[1] ) ) {
1088
-
1089
- // Found the IDs in the shortcode.
1090
- $ids = explode( ',', $matches[1] );
1091
- } else {
1092
-
1093
- // The string is only IDs.
1094
- $ids = ! empty( $field_value ) && '' !== $field_value ? explode( ',', $field_value ) : array();
1095
- }
1096
-
1097
- // Has attachment IDs.
1098
- if ( ! empty( $ids ) ) {
1099
-
1100
- echo '<ul class="ot-gallery-list">';
1101
-
1102
- foreach ( $ids as $id ) {
1103
-
1104
- if ( '' === $id ) {
1105
- continue;
1106
- }
1107
-
1108
- $thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' );
1109
-
1110
- echo '<li><img src="' . esc_url_raw( $thumbnail[0] ) . '" width="75" height="75" /></li>';
1111
- }
1112
-
1113
- echo '</ul>';
1114
-
1115
- echo '
1116
- <div class="ot-gallery-buttons">
1117
- <a href="#" class="option-tree-ui-button button button-secondary hug-left ot-gallery-delete">' . esc_html__( 'Delete Gallery', 'option-tree' ) . '</a>
1118
- <a href="#" class="option-tree-ui-button button button-primary right hug-right ot-gallery-edit">' . esc_html__( 'Edit Gallery', 'option-tree' ) . '</a>
1119
- </div>';
1120
-
1121
- } else {
1122
-
1123
- echo '
1124
- <div class="ot-gallery-buttons">
1125
- <a href="#" class="option-tree-ui-button button button-primary right hug-right ot-gallery-edit">' . esc_html__( 'Create Gallery', 'option-tree' ) . '</a>
1126
- </div>';
1127
-
1128
- }
1129
-
1130
- echo '</div>';
1131
-
1132
- echo '</div>';
1133
- }
1134
- }
1135
-
1136
- if ( ! function_exists( 'ot_type_google_fonts' ) ) {
1137
-
1138
- /**
1139
- * Google Fonts option type.
1140
- *
1141
- * See @ot_display_by_type to see the full list of available arguments.
1142
- *
1143
- * @param array $args An array of arguments.
1144
- *
1145
- * @access public
1146
- * @since 2.5.0
1147
- */
1148
- function ot_type_google_fonts( $args = array() ) {
1149
-
1150
- // Turns arguments array into variables.
1151
- extract( $args ); // phpcs:ignore
1152
-
1153
- // Verify a description.
1154
- $has_desc = ! empty( $field_desc ) ? true : false;
1155
-
1156
- // Format setting outer wrapper.
1157
- echo '<div class="format-setting type-google-font ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1158
-
1159
- // Description.
1160
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1161
-
1162
- // Format setting inner wrapper.
1163
- echo '<div class="format-setting-inner">';
1164
-
1165
- // Allow fields to be filtered.
1166
- $ot_recognized_google_fonts_fields = apply_filters(
1167
- 'ot_recognized_google_font_fields',
1168
- array(
1169
- 'variants',
1170
- 'subsets',
1171
- ),
1172
- $field_id
1173
- );
1174
-
1175
- // Set a default to show at least one item.
1176
- if ( ! is_array( $field_value ) || empty( $field_value ) ) {
1177
- $field_value = array(
1178
- array(
1179
- 'family' => '',
1180
- 'variants' => array(),
1181
- 'subsets' => array(),
1182
- ),
1183
- );
1184
- }
1185
-
1186
- foreach ( $field_value as $key => $value ) {
1187
-
1188
- echo '<div class="type-google-font-group">';
1189
-
1190
- // Build font family.
1191
- $family = isset( $value['family'] ) ? $value['family'] : '';
1192
- echo '<div class="option-tree-google-font-family">';
1193
- echo '<a href="javascript:void(0);" class="js-remove-google-font option-tree-ui-button button button-secondary light" title="' . esc_html__( 'Remove Google Font', 'option-tree' ) . '"><span class="icon ot-icon-minus-circle"/>' . esc_html__( 'Remove Google Font', 'option-tree' ) . '</a>';
1194
- echo '<select name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . '][family]" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1195
- echo '<option value="">' . esc_html__( '-- Choose One --', 'option-tree' ) . '</option>';
1196
- foreach ( ot_recognized_google_font_families( $field_id ) as $family_key => $family_value ) {
1197
- echo '<option value="' . esc_attr( $family_key ) . '" ' . selected( $family, $family_key, false ) . '>' . esc_html( $family_value ) . '</option>';
1198
- }
1199
- echo '</select>';
1200
- echo '</div>';
1201
-
1202
- // Build font variants.
1203
- if ( in_array( 'variants', $ot_recognized_google_fonts_fields, true ) ) {
1204
- $variants = isset( $value['variants'] ) ? $value['variants'] : array();
1205
- echo '<div class="option-tree-google-font-variants" data-field-id-prefix="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-" data-field-name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . '][variants]" data-field-class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '">';
1206
- foreach ( ot_recognized_google_font_variants( $field_id, $family ) as $variant_key => $variant ) {
1207
- echo '<p class="checkbox-wrap">';
1208
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . '][variants][]" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-' . esc_attr( $variant ) . '" value="' . esc_attr( $variant ) . '" ' . checked( in_array( $variant, $variants, true ), true, false ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
1209
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-' . esc_attr( $variant ) . '">' . esc_html( $variant ) . '</label>';
1210
- echo '</p>';
1211
- }
1212
- echo '</div>';
1213
- }
1214
-
1215
- // Build font subsets.
1216
- if ( in_array( 'subsets', $ot_recognized_google_fonts_fields, true ) ) {
1217
- $subsets = isset( $value['subsets'] ) ? $value['subsets'] : array();
1218
- echo '<div class="option-tree-google-font-subsets" data-field-id-prefix="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-" data-field-name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . '][subsets]" data-field-class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '">';
1219
- foreach ( ot_recognized_google_font_subsets( $field_id, $family ) as $subset_key => $subset ) {
1220
- echo '<p class="checkbox-wrap">';
1221
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $key ) . '][subsets][]" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-' . esc_attr( $subset ) . '" value="' . esc_attr( $subset ) . '" ' . checked( in_array( $subset, $subsets, true ), true, false ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
1222
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '-' . esc_attr( $subset ) . '">' . esc_html( $subset ) . '</label>';
1223
- echo '</p>';
1224
- }
1225
- echo '</div>';
1226
- }
1227
-
1228
- echo '</div>';
1229
- }
1230
-
1231
- echo '<div class="type-google-font-group-clone">';
1232
-
1233
- /* build font family */
1234
- echo '<div class="option-tree-google-font-family">';
1235
- echo '<a href="javascript:void(0);" class="js-remove-google-font option-tree-ui-button button button-secondary light" title="' . esc_html__( 'Remove Google Font', 'option-tree' ) . '"><span class="icon ot-icon-minus-circle"/>' . esc_html__( 'Remove Google Font', 'option-tree' ) . '</a>';
1236
- echo '<select name="' . esc_attr( $field_name ) . '[%key%][family]" id="' . esc_attr( $field_id ) . '-%key%" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1237
- echo '<option value="">' . esc_html__( '-- Choose One --', 'option-tree' ) . '</option>';
1238
-
1239
- foreach ( ot_recognized_google_font_families( $field_id ) as $family_key => $family_value ) {
1240
- echo '<option value="' . esc_attr( $family_key ) . '">' . esc_html( $family_value ) . '</option>';
1241
- }
1242
-
1243
- echo '</select>';
1244
- echo '</div>';
1245
-
1246
- // Build font variants.
1247
- if ( in_array( 'variants', $ot_recognized_google_fonts_fields, true ) ) {
1248
- echo '<div class="option-tree-google-font-variants" data-field-id-prefix="' . esc_attr( $field_id ) . '-%key%-" data-field-name="' . esc_attr( $field_name ) . '[%key%][variants]" data-field-class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '">';
1249
- echo '</div>';
1250
- }
1251
-
1252
- // Build font subsets.
1253
- if ( in_array( 'subsets', $ot_recognized_google_fonts_fields, true ) ) {
1254
- echo '<div class="option-tree-google-font-subsets" data-field-id-prefix="' . esc_attr( $field_id ) . '-%key%-" data-field-name="' . esc_attr( $field_name ) . '[%key%][subsets]" data-field-class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '">';
1255
- echo '</div>';
1256
- }
1257
-
1258
- echo '</div>';
1259
-
1260
- echo '<a href="javascript:void(0);" class="js-add-google-font option-tree-ui-button button button-primary right hug-right" title="' . esc_html__( 'Add Google Font', 'option-tree' ) . '">' . esc_html__( 'Add Google Font', 'option-tree' ) . '</a>';
1261
-
1262
- echo '</div>';
1263
-
1264
- echo '</div>';
1265
- }
1266
- }
1267
-
1268
- if ( ! function_exists( 'ot_type_javascript' ) ) {
1269
-
1270
- /**
1271
- * JavaScript option type.
1272
- *
1273
- * See @ot_display_by_type to see the full list of available arguments.
1274
- *
1275
- * @param array $args An array of arguments.
1276
- *
1277
- * @access public
1278
- * @since 2.5.0
1279
- */
1280
- function ot_type_javascript( $args = array() ) {
1281
-
1282
- // Turns arguments array into variables.
1283
- extract( $args ); // phpcs:ignore
1284
-
1285
- // Verify a description.
1286
- $has_desc = ! empty( $field_desc ) ? true : false;
1287
-
1288
- // Format setting outer wrapper.
1289
- echo '<div class="format-setting type-javascript simple ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1290
-
1291
- // Description.
1292
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1293
-
1294
- // Format setting inner wrapper.
1295
- echo '<div class="format-setting-inner">';
1296
-
1297
- // Build textarea for CSS.
1298
- echo '<textarea class="hidden" id="textarea_' . esc_attr( $field_id ) . '" name="' . esc_attr( $field_name ) . '">' . esc_textarea( $field_value ) . '</textarea>';
1299
-
1300
- // Build pre to convert it into ace editor later.
1301
- echo '<pre class="ot-javascript-editor ' . esc_attr( $field_class ) . '" id="' . esc_attr( $field_id ) . '">' . esc_textarea( $field_value ) . '</pre>';
1302
-
1303
- echo '</div>';
1304
-
1305
- echo '</div>';
1306
- }
1307
- }
1308
-
1309
- if ( ! function_exists( 'ot_type_link_color' ) ) {
1310
-
1311
- /**
1312
- * Link Color option type.
1313
- *
1314
- * See @ot_display_by_type to see the full list of available arguments.
1315
- *
1316
- * @param array $args The options arguments.
1317
- *
1318
- * @access public
1319
- * @since 2.5.0
1320
- */
1321
- function ot_type_link_color( $args = array() ) {
1322
-
1323
- // Turns arguments array into variables.
1324
- extract( $args ); // phpcs:ignore
1325
-
1326
- // Verify a description.
1327
- $has_desc = ! empty( $field_desc ) ? true : false;
1328
-
1329
- // Format setting outer wrapper.
1330
- echo '<div class="format-setting type-link-color ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1331
-
1332
- // Description.
1333
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1334
-
1335
- // Format setting inner wrapper.
1336
- echo '<div class="format-setting-inner">';
1337
-
1338
- // Allow fields to be filtered.
1339
- $ot_recognized_link_color_fields = apply_filters(
1340
- 'ot_recognized_link_color_fields',
1341
- array(
1342
- 'link' => _x( 'Standard', 'color picker', 'option-tree' ),
1343
- 'hover' => _x( 'Hover', 'color picker', 'option-tree' ),
1344
- 'active' => _x( 'Active', 'color picker', 'option-tree' ),
1345
- 'visited' => _x( 'Visited', 'color picker', 'option-tree' ),
1346
- 'focus' => _x( 'Focus', 'color picker', 'option-tree' ),
1347
- ),
1348
- $field_id
1349
- );
1350
-
1351
- // Build link color fields.
1352
- foreach ( $ot_recognized_link_color_fields as $type => $label ) {
1353
-
1354
- if ( array_key_exists( $type, $ot_recognized_link_color_fields ) ) {
1355
-
1356
- echo '<div class="option-tree-ui-colorpicker-input-wrap">';
1357
-
1358
- echo '<label for="' . esc_attr( $field_id ) . '-picker-' . esc_attr( $type ) . '" class="option-tree-ui-colorpicker-label">' . esc_attr( $label ) . '</label>';
1359
-
1360
- // Colorpicker JS.
1361
- echo '<script>jQuery(document).ready(function($) { OT_UI.bind_colorpicker("' . esc_attr( $field_id ) . '-picker-' . esc_attr( $type ) . '"); });</script>';
1362
-
1363
- // Set color.
1364
- $color = isset( $field_value[ $type ] ) ? esc_attr( $field_value[ $type ] ) : '';
1365
-
1366
- // Set default color.
1367
- $std = isset( $field_std[ $type ] ) ? 'data-default-color="' . $field_std[ $type ] . '"' : '';
1368
-
1369
- // Input.
1370
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[' . esc_attr( $type ) . ']" id="' . esc_attr( $field_id ) . '-picker-' . esc_attr( $type ) . '" value="' . esc_attr( $color ) . '" class="hide-color-picker ' . esc_attr( $field_class ) . '" ' . esc_attr( $std ) . ' />';
1371
-
1372
- echo '</div>';
1373
-
1374
- }
1375
- }
1376
-
1377
- echo '</div>';
1378
-
1379
- echo '</div>';
1380
- }
1381
- }
1382
-
1383
- if ( ! function_exists( 'ot_type_list_item' ) ) {
1384
-
1385
- /**
1386
- * List Item option type.
1387
- *
1388
- * See @ot_display_by_type to see the full list of available arguments.
1389
- *
1390
- * @param array $args An array of arguments.
1391
- *
1392
- * @access public
1393
- * @since 2.0
1394
- */
1395
- function ot_type_list_item( $args = array() ) {
1396
-
1397
- // Turns arguments array into variables.
1398
- extract( $args ); // phpcs:ignore
1399
-
1400
- // Verify a description.
1401
- $has_desc = ! empty( $field_desc ) ? true : false;
1402
-
1403
- // Default.
1404
- $sortable = true;
1405
-
1406
- // Check if the list can be sorted.
1407
- if ( ! empty( $field_class ) ) {
1408
- $classes = explode( ' ', $field_class );
1409
- if ( in_array( 'not-sortable', $classes, true ) ) {
1410
- $sortable = false;
1411
- str_replace( 'not-sortable', '', $field_class );
1412
- }
1413
- }
1414
-
1415
- // Format setting outer wrapper.
1416
- echo '<div class="format-setting type-list-item ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1417
-
1418
- // Description.
1419
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1420
-
1421
- // Format setting inner wrapper.
1422
- echo '<div class="format-setting-inner">';
1423
-
1424
- // Pass the settings array arround.
1425
- echo '<input type="hidden" name="' . esc_attr( $field_id ) . '_settings_array" id="' . esc_attr( $field_id ) . '_settings_array" value="' . esc_attr( ot_encode( $field_settings ) ) . '" />';
1426
-
1427
- /**
1428
- * Settings pages have array wrappers like 'option_tree'.
1429
- * So we need that value to create a proper array to save to.
1430
- * This is only for NON metabox settings.
1431
- */
1432
- if ( ! isset( $get_option ) ) {
1433
- $get_option = '';
1434
- }
1435
-
1436
- // Build list items.
1437
- echo '<ul class="option-tree-setting-wrap' . ( $sortable ? ' option-tree-sortable' : '' ) . '" data-name="' . esc_attr( $field_id ) . '" data-id="' . esc_attr( $post_id ) . '" data-get-option="' . esc_attr( $get_option ) . '" data-type="' . esc_attr( $type ) . '">';
1438
-
1439
- if ( is_array( $field_value ) && ! empty( $field_value ) ) {
1440
-
1441
- foreach ( $field_value as $key => $list_item ) {
1442
-
1443
- echo '<li class="ui-state-default list-list-item">';
1444
- ot_list_item_view( $field_id, $key, $list_item, $post_id, $get_option, $field_settings, $type );
1445
- echo '</li>';
1446
- }
1447
- }
1448
-
1449
- echo '</ul>';
1450
-
1451
- // Button.
1452
- echo '<a href="javascript:void(0);" class="option-tree-list-item-add option-tree-ui-button button button-primary right hug-right" title="' . esc_html__( 'Add New', 'option-tree' ) . '">' . esc_html__( 'Add New', 'option-tree' ) . '</a>';
1453
-
1454
- // Description.
1455
- $list_desc = $sortable ? __( 'You can re-order with drag & drop, the order will update after saving.', 'option-tree' ) : '';
1456
- echo '<div class="list-item-description">' . esc_html( apply_filters( 'ot_list_item_description', $list_desc, $field_id ) ) . '</div>';
1457
-
1458
- echo '</div>';
1459
-
1460
- echo '</div>';
1461
- }
1462
- }
1463
-
1464
- if ( ! function_exists( 'ot_type_measurement' ) ) {
1465
-
1466
- /**
1467
- * Measurement option type.
1468
- *
1469
- * See @ot_display_by_type to see the full list of available arguments.
1470
- *
1471
- * @param array $args An array of arguments.
1472
- *
1473
- * @access public
1474
- * @since 2.0
1475
- */
1476
- function ot_type_measurement( $args = array() ) {
1477
-
1478
- // Turns arguments array into variables.
1479
- extract( $args ); // phpcs:ignore
1480
-
1481
- // Verify a description.
1482
- $has_desc = ! empty( $field_desc ) ? true : false;
1483
-
1484
- // Format setting outer wrapper.
1485
- echo '<div class="format-setting type-measurement ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1486
-
1487
- // Description.
1488
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1489
-
1490
- // Format setting inner wrapper.
1491
- echo '<div class="format-setting-inner">';
1492
-
1493
- echo '<div class="option-tree-ui-measurement-input-wrap">';
1494
-
1495
- echo '<input type="text" name="' . esc_attr( $field_name ) . '[0]" id="' . esc_attr( $field_id ) . '-0" value="' . esc_attr( ( isset( $field_value[0] ) ? $field_value[0] : '' ) ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" />';
1496
-
1497
- echo '</div>';
1498
-
1499
- // Build measurement.
1500
- echo '<select name="' . esc_attr( $field_name ) . '[1]" id="' . esc_attr( $field_id ) . '-1" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1501
-
1502
- echo '<option value="">' . esc_html__( 'unit', 'option-tree' ) . '</option>';
1503
-
1504
- foreach ( ot_measurement_unit_types( $field_id ) as $unit ) {
1505
- echo '<option value="' . esc_attr( $unit ) . '" ' . ( isset( $field_value[1] ) ? selected( $field_value[1], $unit, false ) : '' ) . '>' . esc_attr( $unit ) . '</option>';
1506
- }
1507
-
1508
- echo '</select>';
1509
-
1510
- echo '</div>';
1511
-
1512
- echo '</div>';
1513
- }
1514
- }
1515
-
1516
- if ( ! function_exists( 'ot_type_numeric_slider' ) ) {
1517
-
1518
- /**
1519
- * Numeric Slider option type.
1520
- *
1521
- * See @ot_display_by_type to see the full list of available arguments.
1522
- *
1523
- * @param array $args An array of arguments.
1524
- *
1525
- * @access public
1526
- * @since 2.1
1527
- */
1528
- function ot_type_numeric_slider( $args = array() ) {
1529
-
1530
- // Turns arguments array into variables.
1531
- extract( $args ); // phpcs:ignore
1532
-
1533
- // Verify a description.
1534
- $has_desc = ! empty( $field_desc ) ? true : false;
1535
-
1536
- $_options = explode( ',', $field_min_max_step );
1537
- $min = isset( $_options[0] ) ? $_options[0] : 0;
1538
- $max = isset( $_options[1] ) ? $_options[1] : 100;
1539
- $step = isset( $_options[2] ) ? $_options[2] : 1;
1540
-
1541
- // Format setting outer wrapper.
1542
- echo '<div class="format-setting type-numeric-slider ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1543
-
1544
- // Description.
1545
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1546
-
1547
- // Format setting inner wrapper.
1548
- echo '<div class="format-setting-inner">';
1549
-
1550
- echo '<div class="ot-numeric-slider-wrap">';
1551
-
1552
- echo '<input type="hidden" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="ot-numeric-slider-hidden-input" value="' . esc_attr( $field_value ) . '" data-min="' . esc_attr( $min ) . '" data-max="' . esc_attr( $max ) . '" data-step="' . esc_attr( $step ) . '">';
1553
-
1554
- echo '<input type="text" class="ot-numeric-slider-helper-input widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" value="' . esc_attr( $field_value ) . '" readonly>';
1555
-
1556
- echo '<div id="ot_numeric_slider_' . esc_attr( $field_id ) . '" class="ot-numeric-slider"></div>';
1557
-
1558
- echo '</div>';
1559
-
1560
- echo '</div>';
1561
-
1562
- echo '</div>';
1563
- }
1564
- }
1565
-
1566
- if ( ! function_exists( 'ot_type_on_off' ) ) {
1567
-
1568
- /**
1569
- * On/Off option type
1570
- *
1571
- * See @ot_display_by_type to see the full list of available arguments.
1572
- *
1573
- * @param array $args The options arguments.
1574
- *
1575
- * @access public
1576
- * @since 2.2.0
1577
- */
1578
- function ot_type_on_off( $args = array() ) {
1579
-
1580
- // Turns arguments array into variables.
1581
- extract( $args ); // phpcs:ignore
1582
-
1583
- // Verify a description.
1584
- $has_desc = ! empty( $field_desc ) ? true : false;
1585
-
1586
- // Format setting outer wrapper.
1587
- echo '<div class="format-setting type-radio ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1588
-
1589
- // Description.
1590
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1591
-
1592
- // Format setting inner wrapper.
1593
- echo '<div class="format-setting-inner">';
1594
-
1595
- // Force only two choices, and allowing filtering on the choices value & label.
1596
- $field_choices = array(
1597
- array(
1598
- /**
1599
- * Filter the value of the On button.
1600
- *
1601
- * @since 2.5.0
1602
- *
1603
- * @param string $value The On button value. Default 'on'.
1604
- * @param string $field_id The field ID.
1605
- * @param string $filter_id For filtering both on/off value with one function.
1606
- */
1607
- 'value' => apply_filters( 'ot_on_off_switch_on_value', 'on', $field_id, 'on' ),
1608
- /**
1609
- * Filter the label of the On button.
1610
- *
1611
- * @since 2.5.0
1612
- *
1613
- * @param string $label The On button label. Default 'On'.
1614
- * @param string $field_id The field ID.
1615
- * @param string $filter_id For filtering both on/off label with one function.
1616
- */
1617
- 'label' => apply_filters( 'ot_on_off_switch_on_label', esc_html__( 'On', 'option-tree' ), $field_id, 'on' ),
1618
- ),
1619
- array(
1620
- /**
1621
- * Filter the value of the Off button.
1622
- *
1623
- * @since 2.5.0
1624
- *
1625
- * @param string $value The Off button value. Default 'off'.
1626
- * @param string $field_id The field ID.
1627
- * @param string $filter_id For filtering both on/off value with one function.
1628
- */
1629
- 'value' => apply_filters( 'ot_on_off_switch_off_value', 'off', $field_id, 'off' ),
1630
- /**
1631
- * Filter the label of the Off button.
1632
- *
1633
- * @since 2.5.0
1634
- *
1635
- * @param string $label The Off button label. Default 'Off'.
1636
- * @param string $field_id The field ID.
1637
- * @param string $filter_id For filtering both on/off label with one function.
1638
- */
1639
- 'label' => apply_filters( 'ot_on_off_switch_off_label', esc_html__( 'Off', 'option-tree' ), $field_id, 'off' ),
1640
- ),
1641
- );
1642
-
1643
- /**
1644
- * Filter the width of the On/Off switch.
1645
- *
1646
- * @since 2.5.0
1647
- *
1648
- * @param string $switch_width The switch width. Default '100px'.
1649
- * @param string $field_id The field ID.
1650
- */
1651
- $switch_width = apply_filters( 'ot_on_off_switch_width', '100px', $field_id );
1652
-
1653
- echo '<div class="on-off-switch"' . ( '100px' !== $switch_width ? sprintf( ' style="width:%s"', esc_attr( $switch_width ) ) : '' ) . '>'; // phpcs:ignore
1654
-
1655
- // Build radio.
1656
- foreach ( (array) $field_choices as $key => $choice ) {
1657
- echo '
1658
- <input type="radio" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" value="' . esc_attr( $choice['value'] ) . '" ' . checked( $field_value, $choice['value'], false ) . ' class="radio option-tree-ui-radio ' . esc_attr( $field_class ) . '" />
1659
- <label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" onclick="">' . esc_attr( $choice['label'] ) . '</label>';
1660
- }
1661
-
1662
- echo '<span class="slide-button"></span>';
1663
-
1664
- echo '</div>';
1665
-
1666
- echo '</div>';
1667
-
1668
- echo '</div>';
1669
-
1670
- }
1671
- }
1672
-
1673
- if ( ! function_exists( 'ot_type_page_checkbox' ) ) {
1674
-
1675
- /**
1676
- * Page Checkbox option type.
1677
- *
1678
- * See @ot_display_by_type to see the full list of available arguments.
1679
- *
1680
- * @param array $args An array of arguments.
1681
- *
1682
- * @access public
1683
- * @since 2.0
1684
- */
1685
- function ot_type_page_checkbox( $args = array() ) {
1686
-
1687
- // Turns arguments array into variables.
1688
- extract( $args ); // phpcs:ignore
1689
-
1690
- // Verify a description.
1691
- $has_desc = ! empty( $field_desc ) ? true : false;
1692
-
1693
- // Format setting outer wrapper.
1694
- echo '<div class="format-setting type-page-checkbox type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1695
-
1696
- // Description.
1697
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1698
-
1699
- // Format setting inner wrapper.
1700
- echo '<div class="format-setting-inner">';
1701
-
1702
- // Query pages array.
1703
- $my_posts = get_posts(
1704
- apply_filters(
1705
- 'ot_type_page_checkbox_query',
1706
- array(
1707
- 'post_type' => array( 'page' ),
1708
- 'posts_per_page' => -1,
1709
- 'orderby' => 'title',
1710
- 'order' => 'ASC',
1711
- 'post_status' => 'any',
1712
- ),
1713
- $field_id
1714
- )
1715
- );
1716
-
1717
- // Has pages.
1718
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
1719
- foreach ( $my_posts as $my_post ) {
1720
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
1721
- echo '<p>';
1722
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $my_post->ID ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '" value="' . esc_attr( $my_post->ID ) . '" ' . ( isset( $field_value[ $my_post->ID ] ) ? checked( $field_value[ $my_post->ID ], $my_post->ID, false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
1723
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '">' . esc_html( $post_title ) . '</label>';
1724
- echo '</p>';
1725
- }
1726
- } else {
1727
- echo '<p>' . esc_html__( 'No Pages Found', 'option-tree' ) . '</p>';
1728
- }
1729
-
1730
- echo '</div>';
1731
-
1732
- echo '</div>';
1733
- }
1734
- }
1735
-
1736
- if ( ! function_exists( 'ot_type_page_select' ) ) {
1737
-
1738
- /**
1739
- * Page Select option type.
1740
- *
1741
- * See @ot_display_by_type to see the full list of available arguments.
1742
- *
1743
- * @param array $args An array of arguments.
1744
- *
1745
- * @access public
1746
- * @since 2.0
1747
- */
1748
- function ot_type_page_select( $args = array() ) {
1749
-
1750
- // Turns arguments array into variables.
1751
- extract( $args ); // phpcs:ignore
1752
-
1753
- // Verify a description.
1754
- $has_desc = ! empty( $field_desc ) ? true : false;
1755
-
1756
- // Format setting outer wrapper.
1757
- echo '<div class="format-setting type-page-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1758
-
1759
- // Description.
1760
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1761
-
1762
- // Format setting inner wrapper.
1763
- echo '<div class="format-setting-inner">';
1764
-
1765
- // Build page select.
1766
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1767
-
1768
- // Query pages array.
1769
- $my_posts = get_posts(
1770
- apply_filters(
1771
- 'ot_type_page_select_query',
1772
- array(
1773
- 'post_type' => array( 'page' ),
1774
- 'posts_per_page' => -1,
1775
- 'orderby' => 'title',
1776
- 'order' => 'ASC',
1777
- 'post_status' => 'any',
1778
- ),
1779
- $field_id
1780
- )
1781
- );
1782
-
1783
- // Has pages.
1784
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
1785
- echo '<option value="">-- ' . esc_html__( 'Choose One', 'option-tree' ) . ' --</option>';
1786
- foreach ( $my_posts as $my_post ) {
1787
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
1788
- echo '<option value="' . esc_attr( $my_post->ID ) . '" ' . selected( $field_value, $my_post->ID, false ) . '>' . esc_html( $post_title ) . '</option>';
1789
- }
1790
- } else {
1791
- echo '<option value="">' . esc_html__( 'No Pages Found', 'option-tree' ) . '</option>';
1792
- }
1793
-
1794
- echo '</select>';
1795
-
1796
- echo '</div>';
1797
-
1798
- echo '</div>';
1799
- }
1800
- }
1801
-
1802
- if ( ! function_exists( 'ot_type_post_checkbox' ) ) {
1803
-
1804
- /**
1805
- * Post Checkbox option type.
1806
- *
1807
- * See @ot_display_by_type to see the full list of available arguments.
1808
- *
1809
- * @param array $args An array of arguments.
1810
- *
1811
- * @access public
1812
- * @since 2.0
1813
- */
1814
- function ot_type_post_checkbox( $args = array() ) {
1815
-
1816
- // Turns arguments array into variables.
1817
- extract( $args ); // phpcs:ignore
1818
-
1819
- // Verify a description.
1820
- $has_desc = ! empty( $field_desc ) ? true : false;
1821
-
1822
- // Format setting outer wrapper.
1823
- echo '<div class="format-setting type-post-checkbox type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1824
-
1825
- // Description.
1826
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1827
-
1828
- // Format setting inner wrapper.
1829
- echo '<div class="format-setting-inner">';
1830
-
1831
- // Query posts array.
1832
- $my_posts = get_posts(
1833
- apply_filters(
1834
- 'ot_type_post_checkbox_query',
1835
- array(
1836
- 'post_type' => array( 'post' ),
1837
- 'posts_per_page' => -1,
1838
- 'orderby' => 'title',
1839
- 'order' => 'ASC',
1840
- 'post_status' => 'any',
1841
- ),
1842
- $field_id
1843
- )
1844
- );
1845
-
1846
- // Has posts.
1847
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
1848
- foreach ( $my_posts as $my_post ) {
1849
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
1850
- echo '<p>';
1851
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $my_post->ID ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '" value="' . esc_attr( $my_post->ID ) . '" ' . ( isset( $field_value[ $my_post->ID ] ) ? checked( $field_value[ $my_post->ID ], $my_post->ID, false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
1852
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $my_post->ID ) . '">' . esc_html( $post_title ) . '</label>';
1853
- echo '</p>';
1854
- }
1855
- } else {
1856
- echo '<p>' . esc_html__( 'No Posts Found', 'option-tree' ) . '</p>';
1857
- }
1858
-
1859
- echo '</div>';
1860
-
1861
- echo '</div>';
1862
- }
1863
- }
1864
-
1865
- if ( ! function_exists( 'ot_type_post_select' ) ) {
1866
-
1867
- /**
1868
- * Post Select option type.
1869
- *
1870
- * See @ot_display_by_type to see the full list of available arguments.
1871
- *
1872
- * @param array $args An array of arguments.
1873
- *
1874
- * @access public
1875
- * @since 2.0
1876
- */
1877
- function ot_type_post_select( $args = array() ) {
1878
-
1879
- // Turns arguments array into variables.
1880
- extract( $args ); // phpcs:ignore
1881
-
1882
- // Verify a description.
1883
- $has_desc = ! empty( $field_desc ) ? true : false;
1884
-
1885
- // Format setting outer wrapper.
1886
- echo '<div class="format-setting type-post-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1887
-
1888
- /* description */
1889
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1890
-
1891
- // Format setting inner wrapper.
1892
- echo '<div class="format-setting-inner">';
1893
-
1894
- // Build page select.
1895
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
1896
-
1897
- // Query posts array.
1898
- $my_posts = get_posts(
1899
- apply_filters(
1900
- 'ot_type_post_select_query',
1901
- array(
1902
- 'post_type' => array( 'post' ),
1903
- 'posts_per_page' => -1,
1904
- 'orderby' => 'title',
1905
- 'order' => 'ASC',
1906
- 'post_status' => 'any',
1907
- ),
1908
- $field_id
1909
- )
1910
- );
1911
-
1912
- // Has posts.
1913
- if ( is_array( $my_posts ) && ! empty( $my_posts ) ) {
1914
- echo '<option value="">-- ' . esc_html__( 'Choose One', 'option-tree' ) . ' --</option>';
1915
- foreach ( $my_posts as $my_post ) {
1916
- $post_title = ! empty( $my_post->post_title ) ? $my_post->post_title : 'Untitled';
1917
- echo '<option value="' . esc_attr( $my_post->ID ) . '" ' . selected( $field_value, $my_post->ID, false ) . '>' . esc_html( $post_title ) . '</option>';
1918
- }
1919
- } else {
1920
- echo '<option value="">' . esc_html__( 'No Posts Found', 'option-tree' ) . '</option>';
1921
- }
1922
-
1923
- echo '</select>';
1924
-
1925
- echo '</div>';
1926
-
1927
- echo '</div>';
1928
- }
1929
- }
1930
-
1931
- if ( ! function_exists( 'ot_type_radio' ) ) {
1932
-
1933
- /**
1934
- * Radio option type.
1935
- *
1936
- * See @ot_display_by_type to see the full list of available arguments.
1937
- *
1938
- * @param array $args An array of arguments.
1939
- *
1940
- * @access public
1941
- * @since 2.0
1942
- */
1943
- function ot_type_radio( $args = array() ) {
1944
-
1945
- // Turns arguments array into variables.
1946
- extract( $args ); // phpcs:ignore
1947
-
1948
- // Verify a description.
1949
- $has_desc = ! empty( $field_desc ) ? true : false;
1950
-
1951
- // Format setting outer wrapper.
1952
- echo '<div class="format-setting type-radio ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1953
-
1954
- // Description.
1955
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1956
-
1957
- // Format setting inner wrapper.
1958
- echo '<div class="format-setting-inner">';
1959
-
1960
- // Build radio.
1961
- foreach ( (array) $field_choices as $key => $choice ) {
1962
- echo '<p><input type="radio" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" value="' . esc_attr( $choice['value'] ) . '" ' . checked( $field_value, $choice['value'], false ) . ' class="radio option-tree-ui-radio ' . esc_attr( $field_class ) . '" /><label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '">' . esc_attr( $choice['label'] ) . '</label></p>';
1963
- }
1964
-
1965
- echo '</div>';
1966
-
1967
- echo '</div>';
1968
- }
1969
- }
1970
-
1971
- if ( ! function_exists( 'ot_type_radio_image' ) ) {
1972
-
1973
- /**
1974
- * Radio Images option type.
1975
- *
1976
- * See @ot_display_by_type to see the full list of available arguments.
1977
- *
1978
- * @param array $args An array of arguments.
1979
- *
1980
- * @access public
1981
- * @since 2.0
1982
- */
1983
- function ot_type_radio_image( $args = array() ) {
1984
-
1985
- // Turns arguments array into variables.
1986
- extract( $args ); // phpcs:ignore
1987
-
1988
- // Verify a description.
1989
- $has_desc = ! empty( $field_desc ) ? true : false;
1990
-
1991
- // Format setting outer wrapper.
1992
- echo '<div class="format-setting type-radio-image ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
1993
-
1994
- // Description.
1995
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
1996
-
1997
- // Format setting inner wrapper.
1998
- echo '<div class="format-setting-inner">';
1999
-
2000
- /**
2001
- * Load the default filterable images if nothing
2002
- * has been set in the choices array.
2003
- */
2004
- if ( empty( $field_choices ) ) {
2005
- $field_choices = ot_radio_images( $field_id );
2006
- }
2007
-
2008
- // Build radio image.
2009
- foreach ( (array) $field_choices as $key => $choice ) {
2010
-
2011
- $src = str_replace( 'OT_URL', OT_URL, $choice['src'] );
2012
- $src = str_replace( 'OT_THEME_URL', OT_THEME_URL, $src );
2013
-
2014
- // Make radio image source filterable.
2015
- $src = apply_filters( 'ot_type_radio_image_src', $src, $field_id );
2016
-
2017
- /**
2018
- * Filter the image attributes.
2019
- *
2020
- * @since 2.5.3
2021
- *
2022
- * @param string $attributes The image attributes.
2023
- * @param string $field_id The field ID.
2024
- * @param array $choice The choice.
2025
- */
2026
- $attributes = apply_filters( 'ot_type_radio_image_attributes', '', $field_id, $choice );
2027
-
2028
- echo '<div class="option-tree-ui-radio-images">';
2029
- echo '<p style="display:none"><input type="radio" name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '" value="' . esc_attr( $choice['value'] ) . '" ' . checked( $field_value, $choice['value'], false ) . ' class="option-tree-ui-radio option-tree-ui-images" /><label for="' . esc_attr( $field_id ) . '-' . esc_attr( $key ) . '">' . esc_attr( $choice['label'] ) . '</label></p>';
2030
- echo '<img ' . sanitize_text_field( $attributes ) . ' src="' . esc_url( $src ) . '" alt="' . esc_attr( $choice['label'] ) . '" title="' . esc_attr( $choice['label'] ) . '" class="option-tree-ui-radio-image ' . esc_attr( $field_class ) . ( $field_value === $choice['value'] ? ' option-tree-ui-radio-image-selected' : '' ) . '" />'; // phpcs:ignore
2031
- echo '</div>';
2032
- }
2033
-
2034
- echo '</div>';
2035
-
2036
- echo '</div>';
2037
- }
2038
- }
2039
-
2040
- if ( ! function_exists( 'ot_type_select' ) ) {
2041
-
2042
- /**
2043
- * Select option type.
2044
- *
2045
- * See @ot_display_by_type to see the full list of available arguments.
2046
- *
2047
- * @param array $args An array of arguments.
2048
- *
2049
- * @access public
2050
- * @since 2.0
2051
- */
2052
- function ot_type_select( $args = array() ) {
2053
-
2054
- // Turns arguments array into variables.
2055
- extract( $args ); // phpcs:ignore
2056
-
2057
- // Verify a description.
2058
- $has_desc = ! empty( $field_desc ) ? true : false;
2059
-
2060
- // Format setting outer wrapper.
2061
- echo '<div class="format-setting type-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2062
-
2063
- // Description.
2064
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2065
-
2066
- // Filter choices array.
2067
- $field_choices = apply_filters( 'ot_type_select_choices', $field_choices, $field_id );
2068
-
2069
- // Format setting inner wrapper.
2070
- echo '<div class="format-setting-inner">';
2071
-
2072
- // Build select.
2073
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
2074
- foreach ( (array) $field_choices as $choice ) {
2075
- if ( isset( $choice['value'] ) && isset( $choice['label'] ) ) {
2076
- echo '<option value="' . esc_attr( $choice['value'] ) . '"' . selected( $field_value, $choice['value'], false ) . '>' . esc_attr( $choice['label'] ) . '</option>';
2077
- }
2078
- }
2079
-
2080
- echo '</select>';
2081
-
2082
- echo '</div>';
2083
-
2084
- echo '</div>';
2085
- }
2086
- }
2087
-
2088
- if ( ! function_exists( 'ot_type_sidebar_select' ) ) {
2089
-
2090
- /**
2091
- * Sidebar Select option type.
2092
- *
2093
- * This option type makes it possible for users to select a WordPress registered sidebar
2094
- * to use on a specific area. By using the two provided filters, 'ot_recognized_sidebars',
2095
- * and 'ot_recognized_sidebars_{$field_id}' we can be selective about which sidebars are
2096
- * available on a specific content area.
2097
- *
2098
- * For example, if we create a WordPress theme that provides the ability to change the
2099
- * Blog Sidebar and we don't want to have the footer sidebars available on this area,
2100
- * we can unset those sidebars either manually or by using a regular expression if we
2101
- * have a common name like footer-sidebar-$i.
2102
- *
2103
- * @param array $args An array of arguments.
2104
- *
2105
- * @access public
2106
- * @since 2.1
2107
- */
2108
- function ot_type_sidebar_select( $args = array() ) {
2109
-
2110
- // Turns arguments array into variables.
2111
- extract( $args ); // phpcs:ignore
2112
-
2113
- // Verify a description.
2114
- $has_desc = ! empty( $field_desc ) ? true : false;
2115
-
2116
- // Format setting outer wrapper.
2117
- echo '<div class="format-setting type-sidebar-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2118
-
2119
- // Description.
2120
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2121
-
2122
- // Format setting inner wrapper.
2123
- echo '<div class="format-setting-inner">';
2124
-
2125
- // Build page select.
2126
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
2127
-
2128
- // Get the registered sidebars.
2129
- global $wp_registered_sidebars;
2130
-
2131
- $sidebars = array();
2132
- foreach ( $wp_registered_sidebars as $id => $sidebar ) {
2133
- $sidebars[ $id ] = $sidebar['name'];
2134
- }
2135
-
2136
- // Filters to restrict which sidebars are allowed to be selected, for example we can restrict footer sidebars to be selectable on a blog page.
2137
- $sidebars = apply_filters( 'ot_recognized_sidebars', $sidebars );
2138
- $sidebars = apply_filters( 'ot_recognized_sidebars_' . $field_id, $sidebars );
2139
-
2140
- // Has sidebars.
2141
- if ( count( $sidebars ) ) {
2142
- echo '<option value="">-- ' . esc_html__( 'Choose Sidebar', 'option-tree' ) . ' --</option>';
2143
- foreach ( $sidebars as $id => $sidebar ) {
2144
- echo '<option value="' . esc_attr( $id ) . '" ' . selected( $field_value, $id, false ) . '>' . esc_attr( $sidebar ) . '</option>';
2145
- }
2146
- } else {
2147
- echo '<option value="">' . esc_html__( 'No Sidebars', 'option-tree' ) . '</option>';
2148
- }
2149
-
2150
- echo '</select>';
2151
-
2152
- echo '</div>';
2153
-
2154
- echo '</div>';
2155
- }
2156
- }
2157
-
2158
- if ( ! function_exists( 'ot_type_slider' ) ) {
2159
-
2160
- /**
2161
- * List Item option type.
2162
- *
2163
- * See @ot_display_by_type to see the full list of available arguments.
2164
- *
2165
- * @param array $args An array of arguments.
2166
- *
2167
- * @access public
2168
- * @since 2.0
2169
- */
2170
- function ot_type_slider( $args = array() ) {
2171
-
2172
- // Turns arguments array into variables.
2173
- extract( $args ); // phpcs:ignore
2174
-
2175
- // Verify a description.
2176
- $has_desc = ! empty( $field_desc ) ? true : false;
2177
-
2178
- // Format setting outer wrapper.
2179
- echo '<div class="format-setting type-slider ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2180
-
2181
- // Description.
2182
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2183
-
2184
- // Format setting inner wrapper.
2185
- echo '<div class="format-setting-inner">';
2186
-
2187
- // Pass the settings array around.
2188
- echo '<input type="hidden" name="' . esc_attr( $field_id ) . '_settings_array" id="' . esc_attr( $field_id ) . '_settings_array" value="' . esc_attr( ot_encode( $field_settings ) ) . '" />';
2189
-
2190
- /**
2191
- * Settings pages have array wrappers like 'option_tree'.
2192
- * So we need that value to create a proper array to save to.
2193
- * This is only for NON metabox settings.
2194
- */
2195
- if ( ! isset( $get_option ) ) {
2196
- $get_option = '';
2197
- }
2198
-
2199
- // Build list items.
2200
- echo '<ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $field_id ) . '" data-id="' . esc_attr( $post_id ) . '" data-get-option="' . esc_attr( $get_option ) . '" data-type="' . esc_attr( $type ) . '">';
2201
-
2202
- if ( is_array( $field_value ) && ! empty( $field_value ) ) {
2203
-
2204
- foreach ( $field_value as $key => $list_item ) {
2205
-
2206
- echo '<li class="ui-state-default list-list-item">';
2207
- ot_list_item_view( $field_id, $key, $list_item, $post_id, $get_option, $field_settings, $type );
2208
- echo '</li>';
2209
- }
2210
- }
2211
-
2212
- echo '</ul>';
2213
-
2214
- // Button.
2215
- echo '<a href="javascript:void(0);" class="option-tree-list-item-add option-tree-ui-button button button-primary right hug-right" title="' . esc_html__( 'Add New', 'option-tree' ) . '">' . esc_html__( 'Add New', 'option-tree' ) . '</a>'; // phpcs:ignore
2216
-
2217
- // Description.
2218
- echo '<div class="list-item-description">' . esc_html__( 'You can re-order with drag & drop, the order will update after saving.', 'option-tree' ) . '</div>';
2219
-
2220
- echo '</div>';
2221
-
2222
- echo '</div>';
2223
- }
2224
- }
2225
-
2226
- if ( ! function_exists( 'ot_type_social_links' ) ) {
2227
-
2228
- /**
2229
- * Social Links option type.
2230
- *
2231
- * See @ot_display_by_type to see the full list of available arguments.
2232
- *
2233
- * @param array $args An array of arguments.
2234
- *
2235
- * @access public
2236
- * @since 2.4.0
2237
- */
2238
- function ot_type_social_links( $args = array() ) {
2239
-
2240
- // Turns arguments array into variables.
2241
- extract( $args ); // phpcs:ignore
2242
-
2243
- // Load the default social links.
2244
- if ( empty( $field_value ) && apply_filters( 'ot_type_social_links_load_defaults', true, $field_id ) ) {
2245
-
2246
- $field_value = apply_filters(
2247
- 'ot_type_social_links_defaults',
2248
- array(
2249
- array(
2250
- 'name' => __( 'Facebook', 'option-tree' ),
2251
- 'title' => '',
2252
- 'href' => '',
2253
- ),
2254
- array(
2255
- 'name' => __( 'Twitter', 'option-tree' ),
2256
- 'title' => '',
2257
- 'href' => '',
2258
- ),
2259
- array(
2260
- 'name' => __( 'Google+', 'option-tree' ),
2261
- 'title' => '',
2262
- 'href' => '',
2263
- ),
2264
- array(
2265
- 'name' => __( 'LinkedIn', 'option-tree' ),
2266
- 'title' => '',
2267
- 'href' => '',
2268
- ),
2269
- array(
2270
- 'name' => __( 'Pinterest', 'option-tree' ),
2271
- 'title' => '',
2272
- 'href' => '',
2273
- ),
2274
- array(
2275
- 'name' => __( 'Youtube', 'option-tree' ),
2276
- 'title' => '',
2277
- 'href' => '',
2278
- ),
2279
- array(
2280
- 'name' => __( 'Dribbble', 'option-tree' ),
2281
- 'title' => '',
2282
- 'href' => '',
2283
- ),
2284
- array(
2285
- 'name' => __( 'Github', 'option-tree' ),
2286
- 'title' => '',
2287
- 'href' => '',
2288
- ),
2289
- array(
2290
- 'name' => __( 'Forrst', 'option-tree' ),
2291
- 'title' => '',
2292
- 'href' => '',
2293
- ),
2294
- array(
2295
- 'name' => __( 'Digg', 'option-tree' ),
2296
- 'title' => '',
2297
- 'href' => '',
2298
- ),
2299
- array(
2300
- 'name' => __( 'Delicious', 'option-tree' ),
2301
- 'title' => '',
2302
- 'href' => '',
2303
- ),
2304
- array(
2305
- 'name' => __( 'Tumblr', 'option-tree' ),
2306
- 'title' => '',
2307
- 'href' => '',
2308
- ),
2309
- array(
2310
- 'name' => __( 'Skype', 'option-tree' ),
2311
- 'title' => '',
2312
- 'href' => '',
2313
- ),
2314
- array(
2315
- 'name' => __( 'SoundCloud', 'option-tree' ),
2316
- 'title' => '',
2317
- 'href' => '',
2318
- ),
2319
- array(
2320
- 'name' => __( 'Vimeo', 'option-tree' ),
2321
- 'title' => '',
2322
- 'href' => '',
2323
- ),
2324
- array(
2325
- 'name' => __( 'Flickr', 'option-tree' ),
2326
- 'title' => '',
2327
- 'href' => '',
2328
- ),
2329
- array(
2330
- 'name' => __( 'VK.com', 'option-tree' ),
2331
- 'title' => '',
2332
- 'href' => '',
2333
- ),
2334
- ),
2335
- $field_id
2336
- );
2337
-
2338
- }
2339
-
2340
- // Verify a description.
2341
- $has_desc = ! empty( $field_desc ) ? true : false;
2342
-
2343
- // Format setting outer wrapper.
2344
- echo '<div class="format-setting type-social-list-item ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2345
-
2346
- // Description.
2347
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2348
-
2349
- // Format setting inner wrapper.
2350
- echo '<div class="format-setting-inner">';
2351
-
2352
- // Pass the settings array around.
2353
- echo '<input type="hidden" name="' . esc_attr( $field_id ) . '_settings_array" id="' . esc_attr( $field_id ) . '_settings_array" value="' . esc_attr( ot_encode( $field_settings ) ) . '" />';
2354
-
2355
- /**
2356
- * Settings pages have array wrappers like 'option_tree'.
2357
- * So we need that value to create a proper array to save to.
2358
- * This is only for NON metabox settings.
2359
- */
2360
- if ( ! isset( $get_option ) ) {
2361
- $get_option = '';
2362
- }
2363
-
2364
- // Build list items.
2365
- echo '<ul class="option-tree-setting-wrap option-tree-sortable" data-name="' . esc_attr( $field_id ) . '" data-id="' . esc_attr( $post_id ) . '" data-get-option="' . esc_attr( $get_option ) . '" data-type="' . esc_attr( $type ) . '">';
2366
-
2367
- if ( is_array( $field_value ) && ! empty( $field_value ) ) {
2368
-
2369
- foreach ( $field_value as $key => $link ) {
2370
-
2371
- echo '<li class="ui-state-default list-list-item">';
2372
- ot_social_links_view( $field_id, $key, $link, $post_id, $get_option, $field_settings );
2373
- echo '</li>';
2374
- }
2375
- }
2376
-
2377
- echo '</ul>';
2378
-
2379
- // Button.
2380
- echo '<a href="javascript:void(0);" class="option-tree-social-links-add option-tree-ui-button button button-primary right hug-right" title="' . esc_html__( 'Add New', 'option-tree' ) . '">' . esc_html__( 'Add New', 'option-tree' ) . '</a>'; // phpcs:ignore
2381
-
2382
- // Description.
2383
- echo '<div class="list-item-description">' . esc_html( apply_filters( 'ot_social_links_description', __( 'You can re-order with drag & drop, the order will update after saving.', 'option-tree' ), $field_id ) ) . '</div>';
2384
-
2385
- echo '</div>';
2386
-
2387
- echo '</div>';
2388
- }
2389
- }
2390
-
2391
- if ( ! function_exists( 'ot_type_spacing' ) ) {
2392
-
2393
- /**
2394
- * Spacing Option Type.
2395
- *
2396
- * See @ot_display_by_type to see the full list of available arguments.
2397
- *
2398
- * @param array $args An array of arguments.
2399
- *
2400
- * @access public
2401
- * @since 2.5.0
2402
- */
2403
- function ot_type_spacing( $args = array() ) {
2404
-
2405
- // Turns arguments array into variables.
2406
- extract( $args ); // phpcs:ignore
2407
-
2408
- // Verify a description.
2409
- $has_desc = ! empty( $field_desc ) ? true : false;
2410
-
2411
- // Format setting outer wrapper.
2412
- echo '<div class="format-setting type-spacing ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2413
-
2414
- // Description.
2415
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2416
-
2417
- // Format setting inner wrapper.
2418
- echo '<div class="format-setting-inner">';
2419
-
2420
- // Allow fields to be filtered.
2421
- $ot_recognized_spacing_fields = apply_filters(
2422
- 'ot_recognized_spacing_fields',
2423
- array(
2424
- 'top',
2425
- 'right',
2426
- 'bottom',
2427
- 'left',
2428
- 'unit',
2429
- ),
2430
- $field_id
2431
- );
2432
-
2433
- // Build top spacing.
2434
- if ( in_array( 'top', $ot_recognized_spacing_fields, true ) ) {
2435
-
2436
- $top = isset( $field_value['top'] ) ? $field_value['top'] : '';
2437
-
2438
- echo '<div class="ot-option-group"><span class="ot-icon-arrow-up ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[top]" id="' . esc_attr( $field_id ) . '-top" value="' . esc_attr( $top ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'top', 'option-tree' ) . '" /></div>';
2439
- }
2440
-
2441
- // Build right spacing.
2442
- if ( in_array( 'right', $ot_recognized_spacing_fields, true ) ) {
2443
-
2444
- $right = isset( $field_value['right'] ) ? $field_value['right'] : '';
2445
-
2446
- echo '<div class="ot-option-group"><span class="ot-icon-arrow-right ot-option-group--icon"></span></span><input type="text" name="' . esc_attr( $field_name ) . '[right]" id="' . esc_attr( $field_id ) . '-right" value="' . esc_attr( $right ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'right', 'option-tree' ) . '" /></div>';
2447
- }
2448
-
2449
- // Build bottom spacing.
2450
- if ( in_array( 'bottom', $ot_recognized_spacing_fields, true ) ) {
2451
-
2452
- $bottom = isset( $field_value['bottom'] ) ? $field_value['bottom'] : '';
2453
-
2454
- echo '<div class="ot-option-group"><span class="ot-icon-arrow-down ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[bottom]" id="' . esc_attr( $field_id ) . '-bottom" value="' . esc_attr( $bottom ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'bottom', 'option-tree' ) . '" /></div>';
2455
- }
2456
-
2457
- // Build left spacing.
2458
- if ( in_array( 'left', $ot_recognized_spacing_fields, true ) ) {
2459
-
2460
- $left = isset( $field_value['left'] ) ? $field_value['left'] : '';
2461
-
2462
- echo '<div class="ot-option-group"><span class="ot-icon-arrow-left ot-option-group--icon"></span><input type="text" name="' . esc_attr( $field_name ) . '[left]" id="' . esc_attr( $field_id ) . '-left" value="' . esc_attr( $left ) . '" class="widefat option-tree-ui-input ' . esc_attr( $field_class ) . '" placeholder="' . esc_html__( 'left', 'option-tree' ) . '" /></div>';
2463
- }
2464
-
2465
- // Build unit dropdown.
2466
- if ( in_array( 'unit', $ot_recognized_spacing_fields, true ) ) {
2467
-
2468
- echo '<div class="ot-option-group ot-option-group--is-last">';
2469
-
2470
- echo '<select name="' . esc_attr( $field_name ) . '[unit]" id="' . esc_attr( $field_id ) . '-unit" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
2471
-
2472
- echo '<option value="">' . esc_html__( 'unit', 'option-tree' ) . '</option>';
2473
-
2474
- foreach ( ot_recognized_spacing_unit_types( $field_id ) as $unit ) {
2475
- echo '<option value="' . esc_attr( $unit ) . '"' . ( isset( $field_value['unit'] ) ? selected( $field_value['unit'], $unit, false ) : '' ) . '>' . esc_attr( $unit ) . '</option>';
2476
- }
2477
-
2478
- echo '</select>';
2479
-
2480
- echo '</div>';
2481
- }
2482
-
2483
- echo '</div>';
2484
-
2485
- echo '</div>';
2486
- }
2487
- }
2488
-
2489
- if ( ! function_exists( 'ot_type_tab' ) ) {
2490
-
2491
- /**
2492
- * Tab option type.
2493
- *
2494
- * See @ot_display_by_type to see the full list of available arguments.
2495
- *
2496
- * @access public
2497
- * @since 2.3.0
2498
- */
2499
- function ot_type_tab() {
2500
- echo '<div class="format-setting type-tab"><br /></div>';
2501
- }
2502
- }
2503
-
2504
- if ( ! function_exists( 'ot_type_tag_checkbox' ) ) {
2505
-
2506
- /**
2507
- * Tag Checkbox option type.
2508
- *
2509
- * See @ot_display_by_type to see the full list of available arguments.
2510
- *
2511
- * @param array $args An array of arguments.
2512
- *
2513
- * @access public
2514
- * @since 2.0
2515
- */
2516
- function ot_type_tag_checkbox( $args = array() ) {
2517
-
2518
- // Turns arguments array into variables.
2519
- extract( $args ); // phpcs:ignore
2520
-
2521
- // Verify a description.
2522
- $has_desc = ! empty( $field_desc ) ? true : false;
2523
-
2524
- // Format setting outer wrapper.
2525
- echo '<div class="format-setting type-tag-checkbox type-checkbox ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2526
-
2527
- // Description.
2528
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2529
-
2530
- // Format setting inner wrapper.
2531
- echo '<div class="format-setting-inner">';
2532
-
2533
- // Get tags.
2534
- $tags = get_tags( array( 'hide_empty' => false ) );
2535
-
2536
- // Has tags.
2537
- if ( $tags ) {
2538
- foreach ( $tags as $tag ) {
2539
- echo '<p>';
2540
- echo '<input type="checkbox" name="' . esc_attr( $field_name ) . '[' . esc_attr( $tag->term_id ) . ']" id="' . esc_attr( $field_id ) . '-' . esc_attr( $tag->term_id ) . '" value="' . esc_attr( $tag->term_id ) . '" ' . ( isset( $field_value[ $tag->term_id ] ) ? checked( $field_value[ $tag->term_id ], $tag->term_id, false ) : '' ) . ' class="option-tree-ui-checkbox ' . esc_attr( $field_class ) . '" />';
2541
- echo '<label for="' . esc_attr( $field_id ) . '-' . esc_attr( $tag->term_id ) . '">' . esc_attr( $tag->name ) . '</label>';
2542
- echo '</p>';
2543
- }
2544
- } else {
2545
- echo '<p>' . esc_html__( 'No Tags Found', 'option-tree' ) . '</p>';
2546
- }
2547
-
2548
- echo '</div>';
2549
-
2550
- echo '</div>';
2551
- }
2552
- }
2553
-
2554
- if ( ! function_exists( 'ot_type_tag_select' ) ) {
2555
-
2556
- /**
2557
- * Tag Select option type.
2558
- *
2559
- * See @ot_display_by_type to see the full list of available arguments.
2560
- *
2561
- * @param array $args An array of arguments.
2562
- *
2563
- * @access public
2564
- * @since 2.0
2565
- */
2566
- function ot_type_tag_select( $args = array() ) {
2567
-
2568
- // Turns arguments array into variables.
2569
- extract( $args ); // phpcs:ignore
2570
-
2571
- // Verify a description.
2572
- $has_desc = ! empty( $field_desc ) ? true : false;
2573
-
2574
- // Format setting outer wrapper.
2575
- echo '<div class="format-setting type-tag-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';
2576
-
2577
- // Description.
2578
- echo $has_desc ? '<div class="description">' . wp_kses_post( htmlspecialchars_decode( $field_desc ) ) . '</div>' : '';
2579
-
2580
- // Format setting inner wrapper.
2581
- echo '<div class="format-setting-inner">';
2582
-
2583
- // Build tag select.
2584
- echo '<select name="' . esc_attr( $field_name ) . '" id="' . esc_attr( $field_id ) . '" class="option-tree-ui-select ' . esc_attr( $field_class ) . '">';
2585
-
2586
- // Get tags.
2587
- $tags = get_tags( array( 'hide_empty' => false ) );
2588
-
2589
- // Has tags.
2590
- if ( $tags ) {
2591
- echo '<option value="">-- ' . esc_html__( 'Choose One', 'option-tree' ) . ' --</option>';
2592
- foreach ( $tags as $tag ) {
2593
- echo '<option value="' . esc_attr( $tag->term_id ) . '"' . selected( $field_value, $tag->term_id, false ) . '>' . esc_attr( $tag->name ) . '</option>';
2594
- }
2595
- } else {
2596
- echo '<option value="">' . esc_html__( 'No Tags Found', 'option-tree' ) . '</option>';
2597
- }
2598
-
2599
- echo '</select>';
2600
-
2601
- echo '</div>';
2602
-
2603
- echo '</div>';
2604
- }
2605
- }
2606
-
2607
- if ( ! function_exists( 'ot_type_taxonomy_checkbox' ) ) {
2608
-
2609
- /**
2610
- * Taxonomy Checkbox option type.
2611
- *
2612
- * See @ot_display_by_type to see the full list of available arguments.
2613
- *
2614
- * @param array $args An array of arguments.
2615
- *
2616
- * @access public
2617
- * @since 2.0
2618
- */
2619
- function ot_type_t