Form builder to get in touch with visitors, grow your email list and collect payments — Happyforms - Version 1.3

Version Description

Download this release

Release Info

Developer thethemefoundry
Plugin Icon 128x128 Form builder to get in touch with visitors, grow your email list and collect payments — Happyforms
Version 1.3
Comparing to
See all releases

Code changes from version 1.2.2 to 1.3

Files changed (110) hide show
  1. assets/css/admin.css +25 -0
  2. assets/css/customize.css +69 -6
  3. assets/css/frontend.css +1008 -450
  4. inc/templates/preview-inline.css → assets/css/preview.css +28 -17
  5. assets/js/customize.js +498 -254
  6. assets/js/frontend.js +261 -114
  7. assets/js/frontend/address.js +33 -195
  8. assets/js/frontend/number.js +50 -0
  9. assets/js/frontend/phone.js +68 -0
  10. assets/js/frontend/scale.js +34 -56
  11. assets/js/parts/part-address.js +39 -34
  12. assets/js/parts/part-checkbox.js +137 -193
  13. assets/js/parts/part-date.js +75 -55
  14. assets/js/parts/part-email.js +36 -38
  15. assets/js/parts/part-legal.js +55 -47
  16. assets/js/parts/part-multi-line-text.js +17 -11
  17. assets/js/parts/part-number.js +112 -57
  18. assets/js/parts/part-phone.js +148 -121
  19. assets/js/parts/part-placeholder.js +19 -11
  20. assets/js/parts/part-radio.js +169 -201
  21. assets/js/parts/part-rating.js +26 -26
  22. assets/js/parts/part-scale.js +165 -134
  23. assets/js/parts/part-select.js +156 -175
  24. assets/js/parts/part-single-line-text.js +1 -1
  25. assets/js/parts/part-title.js +1 -1
  26. assets/js/parts/part-website-url.js +1 -1
  27. assets/js/preview.js +139 -404
  28. assets/js/tinymce/form-picker.js +0 -124
  29. happyforms.php +2 -2
  30. inc/classes/class-admin-notices.php +12 -8
  31. inc/classes/class-form-controller.php +305 -132
  32. inc/classes/class-form-part-library.php +36 -32
  33. inc/classes/class-form-part.php +2 -2
  34. inc/classes/class-form-styles.php +493 -717
  35. inc/classes/class-happyforms-plugin.php +124 -66
  36. inc/classes/class-message-controller.php +65 -24
  37. inc/classes/class-message-notices.php +3 -1
  38. inc/classes/class-wp-customize-form-manager.php +69 -41
  39. inc/classes/parts/class-part-address.php +133 -200
  40. inc/classes/parts/class-part-checkbox.php +30 -208
  41. inc/classes/parts/class-part-date.php +19 -195
  42. inc/classes/parts/class-part-email.php +35 -184
  43. inc/classes/parts/class-part-legal.php +17 -56
  44. inc/classes/parts/class-part-multi-line-text.php +10 -99
  45. inc/classes/parts/class-part-number.php +87 -232
  46. inc/classes/parts/class-part-phone.php +99 -215
  47. inc/classes/parts/class-part-placeholder.php +31 -93
  48. inc/classes/parts/class-part-radio.php +27 -216
  49. inc/classes/parts/class-part-rating.php +13 -106
  50. inc/classes/parts/class-part-scale.php +25 -178
  51. inc/classes/parts/class-part-select.php +18 -183
  52. inc/classes/parts/class-part-single-line-text.php +10 -99
  53. inc/classes/parts/class-part-title.php +21 -118
  54. inc/classes/parts/class-part-website-url.php +14 -101
  55. inc/helpers/helper-activation.php +1 -0
  56. inc/helpers/helper-form-templates.php +379 -74
  57. inc/helpers/helper-misc.php +29 -1
  58. inc/helpers/helper-styles.php +17 -0
  59. inc/templates/admin-form-modal.php +49 -0
  60. inc/templates/customize-form-build.php +1 -1
  61. inc/templates/customize-form-part-footer.php +1 -0
  62. inc/templates/customize-form-part-header.php +1 -1
  63. inc/templates/customize-form-setup.php +19 -0
  64. inc/templates/customize-form-style.php +28 -18
  65. inc/templates/form-styles.css.php +15 -0
  66. inc/templates/parts/customize-address.php +71 -0
  67. inc/templates/parts/customize-checkbox.php +81 -0
  68. inc/templates/parts/customize-date.php +67 -0
  69. inc/templates/parts/customize-email.php +67 -0
  70. inc/templates/parts/customize-legal.php +20 -0
  71. inc/templates/parts/customize-multi-line-text.php +58 -0
  72. inc/templates/parts/customize-number.php +96 -0
  73. inc/templates/parts/customize-phone.php +87 -0
  74. inc/templates/parts/customize-placeholder.php +42 -0
  75. inc/templates/parts/customize-radio.php +85 -0
  76. inc/templates/parts/customize-rating.php +52 -0
  77. inc/templates/parts/customize-scale.php +80 -0
  78. inc/templates/parts/customize-select.php +75 -0
  79. inc/templates/parts/customize-single-line-text.php +58 -0
  80. inc/templates/parts/customize-title.php +52 -0
  81. inc/templates/parts/customize-website-url.php +58 -0
  82. inc/templates/parts/frontend-address.php +48 -0
  83. inc/templates/parts/frontend-checkbox.php +21 -0
  84. inc/templates/parts/frontend-date.php +92 -0
  85. inc/templates/parts/frontend-email.php +40 -0
  86. inc/templates/parts/frontend-legal.php +10 -0
  87. inc/templates/parts/frontend-multi-line-text.php +18 -0
  88. inc/templates/parts/frontend-number.php +42 -0
  89. inc/templates/parts/frontend-phone.php +34 -0
  90. inc/templates/parts/frontend-placeholder.php +6 -0
  91. inc/templates/parts/frontend-radio.php +25 -0
  92. inc/templates/parts/frontend-rating.php +18 -0
  93. inc/templates/parts/frontend-scale.php +21 -0
  94. inc/templates/parts/frontend-select.php +19 -0
  95. inc/templates/parts/frontend-single-line-text.php +18 -0
  96. inc/templates/parts/frontend-title.php +15 -0
  97. inc/templates/parts/frontend-website-url.php +18 -0
  98. inc/templates/preview-form-edit.php +30 -71
  99. inc/templates/preview-form-new.php +0 -65
  100. inc/templates/{preview-form-part.php → preview-form-pencil.php} +1 -4
  101. inc/templates/{frontend-form.php → single-form.php} +5 -11
  102. readme.txt +19 -18
  103. trunk/assets/css/admin.css +246 -0
  104. trunk/assets/css/customize.css +856 -0
  105. trunk/assets/css/font-awesome.min.css +4 -0
  106. trunk/assets/css/frontend.css +1445 -0
  107. trunk/assets/css/preview.css +73 -0
  108. trunk/assets/fonts/FontAwesome.otf +0 -0
  109. trunk/assets/fonts/fontawesome-webfont.eot +0 -0
  110. trunk/assets/fonts/fontawesome-webfont.svg +2106 -0
assets/css/admin.css CHANGED
@@ -218,4 +218,29 @@ p.welcome-panel-footer a:active {
218
  top: 4px;
219
  padding-right: 5px;
220
  color: #888;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
  }
218
  top: 4px;
219
  padding-right: 5px;
220
  color: #888;
221
+ }
222
+
223
+ #happyforms-modal {
224
+ display: none;
225
+ }
226
+
227
+ .happyforms-dialog {
228
+ top: calc(50% - 150px) !important;
229
+ }
230
+
231
+ .happyforms-dialog .ui-dialog-title {
232
+ font-size: 14px;
233
+ }
234
+
235
+ .happyforms-dialog__select {
236
+ min-width: 290px;
237
+ }
238
+
239
+ .happyforms-dialog__button {
240
+ float: right;
241
+ margin-top: 18px !important;
242
+ }
243
+
244
+ #happyforms-notice-happyforms_form_saved_guide {
245
+ border-color: #46b450;
246
  }
assets/css/customize.css CHANGED
@@ -135,6 +135,16 @@ p.description a {
135
  width: 100%;
136
  }
137
 
 
 
 
 
 
 
 
 
 
 
138
  .happyforms-help-pointer {
139
  z-index: 999999 !important;
140
  }
@@ -380,6 +390,10 @@ body.adding-happyforms-parts #customize-preview iframe {
380
  text-align: right;
381
  }
382
 
 
 
 
 
383
  .happyforms-part-widget .options {
384
  border: 1px solid #eee;
385
  padding: 5px 10px 10px;
@@ -387,6 +401,11 @@ body.adding-happyforms-parts #customize-preview iframe {
387
 
388
  .happyforms-part-widget .options h3 {
389
  margin-bottom: 0;
 
 
 
 
 
390
  }
391
 
392
  .happyforms-part-widget .options li {
@@ -394,6 +413,15 @@ body.adding-happyforms-parts #customize-preview iframe {
394
  border-bottom: 1px solid #eee;
395
  }
396
 
 
 
 
 
 
 
 
 
 
397
  .happyforms-part-widget .options li:last-child {
398
  border-bottom: 0;
399
  }
@@ -627,6 +655,7 @@ ul.happyforms-style-controls {
627
  position: relative;
628
  float: left;
629
  width: 100%;
 
630
  }
631
 
632
  ul.happyforms-style-controls .customize-control {
@@ -638,7 +667,7 @@ ul.happyforms-style-controls .customize-control {
638
  /* Style view */
639
  .happyforms-stack-view.happyforms-style-view {
640
  padding: 0;
641
- overflow-x: hidden;
642
  top: 0;
643
  bottom: 0;
644
  }
@@ -646,6 +675,9 @@ ul.happyforms-style-controls .customize-control {
646
  ul.happyforms-style-controls .customize-control.happyforms-divider-control {
647
  margin-bottom: 0;
648
  padding: 0;
 
 
 
649
  }
650
 
651
  ul.happyforms-style-controls .customize-control.happyforms-divider-control:first-child {
@@ -653,21 +685,48 @@ ul.happyforms-style-controls .customize-control.happyforms-divider-control:first
653
  border-top: 1px solid #ddd;
654
  }
655
 
 
 
 
 
 
 
 
 
 
 
 
 
656
  .happyforms-style-controls-group {
657
  position: absolute;
658
  top: 0;
659
- left: 300px;
 
 
 
660
  width: 100%;
 
 
 
 
661
  }
662
 
663
  .happyforms-style-controls-group .accordion-section-title {
664
  padding: 10px 10px 11px 14px;
665
  }
666
 
667
- .happyforms-style-controls-group.inactive {
668
- left: 700px;
669
- height: 0;
670
- overflow: hidden;
 
 
 
 
 
 
 
 
671
  }
672
 
673
  .control-section h3.accordion-section-title {
@@ -782,6 +841,10 @@ li.customize-control .happyforms-buttonset-container .ui-state-active.ui-state-h
782
  background-color: #fff;
783
  }
784
 
 
 
 
 
785
  .happyforms-parts-expand-collapse-wrap {
786
  float: right;
787
  font-weight: normal;
135
  width: 100%;
136
  }
137
 
138
+ .happyforms-customize-heading h2 {
139
+ border-top: 1px solid #dbdbdb;
140
+ padding-top: 20px;
141
+ }
142
+
143
+ .panel-meta + .happyforms-customize-heading h2 {
144
+ padding-top: 0;
145
+ border-top: 0;
146
+ }
147
+
148
  .happyforms-help-pointer {
149
  z-index: 999999 !important;
150
  }
390
  text-align: right;
391
  }
392
 
393
+ .happyforms-part-widget .show-all-options {
394
+ float: left;
395
+ }
396
+
397
  .happyforms-part-widget .options {
398
  border: 1px solid #eee;
399
  padding: 5px 10px 10px;
401
 
402
  .happyforms-part-widget .options h3 {
403
  margin-bottom: 0;
404
+ display: none;
405
+ }
406
+
407
+ .happyforms-part-widget .options p {
408
+ display: none;
409
  }
410
 
411
  .happyforms-part-widget .options li {
413
  border-bottom: 1px solid #eee;
414
  }
415
 
416
+ .happyforms-part-widget .options ul:empty {
417
+ display: none;
418
+ }
419
+
420
+ .happyforms-part-widget .options ul:empty ~ h3,
421
+ .happyforms-part-widget .options ul:empty ~ p {
422
+ display: block;
423
+ }
424
+
425
  .happyforms-part-widget .options li:last-child {
426
  border-bottom: 0;
427
  }
655
  position: relative;
656
  float: left;
657
  width: 100%;
658
+ height: 100%;
659
  }
660
 
661
  ul.happyforms-style-controls .customize-control {
667
  /* Style view */
668
  .happyforms-stack-view.happyforms-style-view {
669
  padding: 0;
670
+ overflow: hidden;
671
  top: 0;
672
  bottom: 0;
673
  }
675
  ul.happyforms-style-controls .customize-control.happyforms-divider-control {
676
  margin-bottom: 0;
677
  padding: 0;
678
+ transform: translateX(0);
679
+ transition: .18s transform cubic-bezier(.645, .045, .355, 1),
680
+ .18s -webkit-transform cubic-bezier(.645, .045, .355, 1);
681
  }
682
 
683
  ul.happyforms-style-controls .customize-control.happyforms-divider-control:first-child {
685
  border-top: 1px solid #ddd;
686
  }
687
 
688
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control.inactive {
689
+ transform: translateX(-100%);
690
+ }
691
+
692
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control.active {
693
+ transform: translateX(0);
694
+ }
695
+
696
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control h3 {
697
+ text-transform: capitalize;
698
+ }
699
+
700
  .happyforms-style-controls-group {
701
  position: absolute;
702
  top: 0;
703
+ left: 0;
704
+ z-index: 9999;
705
+ height: 0;
706
+ overflow: hidden;
707
  width: 100%;
708
+ background-color: #eee;
709
+ transform: translateX(100%);
710
+ transition: .18s transform cubic-bezier(.645, .045, .355, 1),
711
+ .18s -webkit-transform cubic-bezier(.645, .045, .355, 1)
712
  }
713
 
714
  .happyforms-style-controls-group .accordion-section-title {
715
  padding: 10px 10px 11px 14px;
716
  }
717
 
718
+ .happyforms-style-controls-group .accordion-section-title .panel-title {
719
+ text-transform: capitalize;
720
+ }
721
+
722
+ .happyforms-style-controls-group.open {
723
+ height: 100%;
724
+ overflow: auto;
725
+ transform: translateX(0);
726
+ }
727
+
728
+ .happyforms-style-controls-group.closing {
729
+ transform: translateX(100%);
730
  }
731
 
732
  .control-section h3.accordion-section-title {
841
  background-color: #fff;
842
  }
843
 
844
+ li.customize-control.happyforms-buttonset-control + .customize-control h2 {
845
+ margin-top: 1.8rem;
846
+ }
847
+
848
  .happyforms-parts-expand-collapse-wrap {
849
  float: right;
850
  font-weight: normal;
assets/css/frontend.css CHANGED
@@ -1,18 +1,31 @@
1
- #wp-admin-bar-happyforms .ab-icon svg {
2
- width: 20px;
3
- margin-top: 2px;
4
- }
5
-
6
- #wp-admin-bar-happyforms:hover .ab-icon .cls-2 {
7
- fill: #00b9eb;
8
- }
9
-
10
- /* happyforms - general */
11
- .happyforms-container form,
12
- .happyforms-form form {
13
- max-width: 100%;
14
- border-style: solid;
15
- border-width: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
  .happyforms-flex {
@@ -23,39 +36,37 @@
23
  padding: 7.5% 0;
24
  }
25
 
26
- .happyforms-form h3.happyforms-form__title {
 
 
 
 
 
 
 
 
 
27
  margin: 0;
28
  padding: 0 1%;
29
  font-weight: bold;
30
  font-size: 32px;
 
31
  color: #000;
 
32
  }
33
 
34
- .happyforms-form h3.happyforms-form__title + .happyforms-message-notices {
35
- margin-top: 25px;
36
- }
37
-
38
- .happyforms-required {
39
- color: #ff7550;
40
  }
41
 
42
- .happyforms-visuallyhidden {
43
- position: absolute;
44
- border: 0;
45
- clip: rect(0 0 0 0);
46
- width: 1px;
47
- height: 1px;
48
- margin: -1px;
49
- padding: 0;
50
- overflow: hidden;
51
- }
52
 
53
- .happyforms-part {
54
  position: relative;
55
  display: block;
56
  width: 100%;
57
  margin-bottom: 20px;
58
- padding: 0 1%;
59
  }
60
 
61
  @media screen and (min-width: 800px) {
@@ -72,27 +83,22 @@
72
  cursor: pointer;
73
  margin-bottom: 20px;
74
  font-size: 16px;
 
75
  }
76
 
77
  .happyforms-part__label .label {
78
  font-weight: bold;
79
  color: #000;
80
- }
81
-
82
- .happyforms-part--label-above .happyforms-part__label--confirmation {
83
- margin-top: 10px;
84
- }
85
-
86
- .happyforms-part--label-below .happyforms-part__label {
87
- order: 2;
88
- width: 100%;
89
- margin-bottom: 5px;
90
  }
91
 
92
  .happyforms-part__description {
93
  display: block;
94
  margin: 5px 0 0;
95
  font-size: 14px;
 
 
 
96
  }
97
 
98
  .happyforms-part input[type=text],
@@ -101,21 +107,37 @@
101
  .happyforms-part input[type=number],
102
  .happyforms-part input[type=range],
103
  .happyforms-part textarea {
104
- width: calc(100% - 10px);
 
105
  padding: 10px;
106
  border-width: 1px;
107
  border-style: solid;
108
  border-color: #dbdbdb;
 
109
  border-radius: 6px;
 
110
  font-style: normal;
111
  font-size: 16px;
 
112
  background-color: #fff;
 
113
  color: #000;
 
114
  transition-property: none;
115
  transition-duration: 0.1s;
 
116
  transition-timing-function: ease-in;
117
  }
118
 
 
 
 
 
 
 
 
 
 
119
  .happyforms-part input[type=text]:focus,
120
  .happyforms-part input[type=email]:focus,
121
  .happyforms-part input[type=tel]:focus,
@@ -123,7 +145,18 @@
123
  .happyforms-part textarea:focus {
124
  border-width: 1px;
125
  border-style: solid;
126
- border-color: #555;
 
 
 
 
 
 
 
 
 
 
 
127
  }
128
 
129
  .happyforms-part.happyforms-part--error input[type=text],
@@ -133,158 +166,78 @@
133
  .happyforms-part.happyforms-part--error input[type=range],
134
  .happyforms-part.happyforms-part--error textarea {
135
  border-color: #ff7550;
 
136
  }
137
 
138
- /* range part */
139
- .happyforms-part input[type=range] {
140
- -webkit-appearance: none;
141
- padding: 0;
142
- border: 0;
143
- width: 100%;
144
- }
145
-
146
- .happyforms-part input[type=range]:focus {
147
- border: 0;
148
- outline: 0;
149
- }
150
-
151
- .happyforms-part input[type=range]::-webkit-slider-runnable-track {
152
- width: 100%;
153
- height: 1px;
154
- cursor: pointer;
155
- animate: 0.2s;
156
- box-shadow: none;
157
- background: #000000;
158
- }
159
-
160
- .happyforms-part input[type=range]::-webkit-slider-thumb {
161
- -webkit-appearance: none;
162
- width: 20px;
163
- height: 20px;
164
- margin-top: -10px;
165
- border: 1px solid #000000;
166
- border-radius: 50%;
167
- box-shadow: none;
168
- background: #000000;
169
- cursor: pointer;
170
- }
171
-
172
- .happyforms-part input[type=range]:focus::-webkit-slider-runnable-track {
173
- background: #000000;
174
- }
175
-
176
- .happyforms-part input[type=range]::-moz-range-track {
177
- width: 100%;
178
- height: 1px;
179
- cursor: pointer;
180
- animate: 0.2s;
181
- box-shadow: none;
182
- background: #000000;
183
- }
184
-
185
- .happyforms-part input[type=range]::-moz-range-thumb {
186
- width: 20px;
187
- height: 20px;
188
- margin-top: -10px;
189
- border: 1px solid #000000;
190
- border-radius: 50%;
191
- box-shadow: none;
192
- background: #000000;
193
- cursor: pointer;
194
- }
195
-
196
- .happyforms-part input[type=range]::-ms-track {
197
- width: 100%;
198
- height: 1px;
199
- cursor: pointer;
200
- animate: 0.2s;
201
- box-shadow: none;
202
- background: #000000;
203
- }
204
-
205
- .happyforms-part input[type=range]::-ms-fill-lower {
206
- background: #000000;
207
- border: 0;
208
- box-shadow: none;
209
- }
210
-
211
- .happyforms-part input[type=range]::-ms-fill-upper {
212
- background: #000000;
213
- border: 0;
214
- box-shadow: none;
215
- }
216
-
217
- .happyforms-part input[type=range]::-ms-thumb {
218
- width: 20px;
219
- height: 20px;
220
- margin-top: -10px;
221
- border: 1px solid #000000;
222
- border-radius: 50%;
223
- box-shadow: none;
224
- background: #000000;
225
- cursor: pointer;
226
- }
227
-
228
- .happyforms-part input[type=range]:focus::-ms-fill-lower {
229
- background: #000000;
230
- }
231
-
232
- .happyforms-part input[type=range]:focus::-ms-fill-upper {
233
- background: #000000;
234
- }
235
-
236
- .happyforms-part--scale output {
237
  display: block;
238
- position: relative;
239
- width: 30px;
240
- text-align: center;
241
- color: #d0d0d0;
242
- }
243
-
244
- .happyforms-part--scale__labels {
245
- position: relative;
246
- width: 100%;
247
- }
248
-
249
- .happyforms-part--scale__labels .label-min {
250
- float: left;
251
  }
252
 
253
- .happyforms-part--scale__labels .label-max {
254
- float: right;
255
- }
256
 
257
- /* part placeholders */
258
  .happyforms-part ::-webkit-input-placeholder {
259
  font-weight: normal;
260
  font-style: normal;
261
  color: #aaa;
 
262
  }
263
 
264
  .happyforms-part ::-moz-placeholder {
265
  font-weight: normal;
266
  font-style: normal;
267
  color: #aaa;
 
268
  }
269
 
270
  .happyforms-part ::-ms-placeholder {
271
  font-weight: normal;
272
  font-style: normal;
273
  color: #aaa;
 
274
  }
275
 
276
  .happyforms-part ::placeholder {
277
  font-weight: normal;
278
  font-style: normal;
279
  color: #aaa;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  }
281
 
282
- .happyforms-part--label-below .happyforms-part__wrap {
 
 
283
  display: flex;
284
  flex-flow: row wrap-reverse;
285
  align-content: flex-end;
286
  }
287
 
 
 
 
 
 
 
 
 
 
 
288
  .happyforms-part--label-below input,
289
  .happyforms-part--label-below textarea,
290
  .happyforms-part--label-below select,
@@ -330,182 +283,271 @@
330
  margin-bottom: 10px;
331
  }
332
 
333
- .happyforms-part__wrap--confirmation {
334
- margin-top: 10px;
335
- }
336
 
337
- .happyforms-part--placeholder p {
 
 
 
 
 
338
  font-size: 16px;
339
- color: #000;
340
  }
341
 
342
- .happyforms-part--placeholder p:first-child {
343
- margin-top: 0;
344
- }
345
-
346
- .happyforms-part--placeholder p:last-child {
347
- margin-bottom: 0;
348
  }
349
 
350
- .happyforms-part--select select, .happyforms-part--date select {
351
- position: relative;
352
- -webkit-appearance: none;
353
- -moz-appearance: none;
354
- appearance: none;
355
  width: 100%;
356
- padding: 10px;
357
  border-radius: 6px;
358
- border-width: 0;
359
- border-style: solid;
360
- border-color: #b2b2b2;
361
- background-color: #f4f4f4;
362
- font-size: 16px;
 
363
  }
364
 
365
- .happyforms-part--date select {
366
- width: calc(100% - 10px);
 
 
367
  }
368
 
369
- .happyforms-part-date--date .happyforms-part-date__time-input {
370
- display: none;
371
  }
372
 
373
- .happyforms-part-date--time .happyforms-part-date__date-input {
374
- display: none;
 
375
  }
376
 
377
- .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__el,
378
- .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__el {
379
- flex-wrap: wrap;
 
 
 
380
  }
381
 
382
- .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__select-wrap,
383
- .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__select-wrap {
384
- min-width: 33.333%;
385
- margin-bottom: 15px;
 
386
  }
387
 
388
- .happyforms-part__select-wrap {
389
- position: relative;
390
- flex: 1;
391
- padding: 0 10px 0 0;
392
  }
393
 
394
- .happyforms-part__select-wrap:after {
395
- content: '';
396
- position: absolute;
397
- top: 22%;
398
- right: 15px;
399
- z-index: 999;
400
- display: block;
401
- width: 25px;
402
- height: 25px;
403
- font-size: 22px;
404
- color: #000;
405
- fill: #000;
406
- stroke: #000;
407
- background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBkPSJNNSA4bDQgNCA0LTR6Ii8+PC9zdmc+);
408
- background-size: cover;
409
- background-repeat: no-repeat;
410
  }
411
 
412
- .happyforms-part--date .happyforms-part__select-wrap:after {
413
- top: calc(46% - 12px);
414
- right: 25px;
415
  }
416
 
417
- .happyforms-part--date .happyforms-part__select-wrap:last-child:after {
418
- right: 15px;
 
 
 
 
 
 
 
419
  }
420
 
421
- .happyforms-part--select select:focus, .happyforms-part--date select:focus {
422
- outline-width: 1px;
423
- outline-color: #000000;
424
  }
425
 
426
- .happyforms-part--date .happyforms-part__el {
427
- display: flex;
 
428
  }
429
 
430
- .happyforms-part__select-wrap:last-child {
431
- padding-right: 0;
432
  }
433
 
434
- .happyforms-part .option-label {
435
- position: relative;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  cursor: pointer;
437
- display: inline-block;
438
- margin-bottom: 10px;
439
- padding: 0 5px 5px 0;
440
- font-size: 16px;
441
  }
442
 
443
- .happyforms-part--radio .option-label {
444
- margin-right: 20px;
445
- padding: 7px 30px;
 
 
 
 
 
 
 
 
 
 
 
446
  }
447
 
448
- .happyforms-part--radio .option-label .border {
449
  position: absolute;
 
450
  top: 0;
451
- left: 0;
452
- width: 100%;
453
- height: 100%;
454
- border-radius: 6px;
 
 
455
  border: 1px solid #dbdbdb;
 
 
 
 
 
 
 
 
456
  }
457
 
458
- .happyforms-part--radio .option-label input,
459
- .happyforms-part--checkbox .option-label input {
460
- top: 3px;
461
  }
462
 
463
- .happyforms-part--radio input:checked ~ .border,
464
- .happyforms-part--radio .option-label:hover .border {
465
- border-color: #000;
466
  }
467
 
468
- .happyforms-part--radio .option-label input:focus {
469
- outline: 0;
470
  }
471
 
472
- .happyforms-part--radio .option-label .label,
473
- .happyforms-part--checkbox .option-label .label {
474
- display: inline-block;
475
- margin-right: 15px;
476
- padding: 0 10px 0 20px;
477
  }
478
 
479
- .happyforms-part-option {
480
- margin-bottom: 15px;
481
  }
482
 
483
- .happyforms-part-option__description {
484
- display: block;
485
- width: 100%;
486
- max-width: 400px;
487
- margin-top: 3px;
488
- margin-right: 20px;
489
- font-size: 12px;
 
 
490
  }
491
 
492
- .happyforms-part--radio.display-type--block .happyforms-part-option__description {
493
- max-width: none;
 
 
 
 
 
 
 
 
494
  }
495
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  .happyforms-part--radio .happyforms-part__el {
497
  display: flex;
498
  }
499
 
 
 
 
 
 
 
 
 
500
  .happyforms-part--radio .checkmark,
501
  .happyforms-part--checkbox .checkmark {
502
  position: relative;
503
  top: 4px;
 
504
  display: inline-block;
505
  width: 20px;
506
  height: 20px;
507
  border-radius: 50%;
508
- border: 1px solid #dbdbdb;
 
 
509
  }
510
 
511
  .happyforms-part--checkbox .checkmark {
@@ -516,42 +558,316 @@
516
  margin-right: 5px;
517
  }
518
 
519
- .happyforms-part--radio input:checked + .checkmark,
520
- .happyforms-part--checkbox input:checked + .checkmark {
521
  border-color: #000;
 
522
  background-color: #000;
 
523
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAVCAYAAABVAo5cAAAA7UlEQVRIS7XUbRHCMAwG4DcSQAKTgAWQABaQgAW8IGFIAAlgYRJeLru2t6+un8vPNtfn0jYRbBQkdwBOIvIcErKFR/II4G3O7kRkb53q4ASzjkOrgh7MoQCaamAAs+itChiJKVpeYQJ2FpFXUYWpmJY4Akm2ALR/riLyW2uZHGwEkvwCOAyQxofmYg5cwKw7Q0uwHiSpE0Engy8cWopZkBHjrTE5eu2h6H+jL0krvAN4hE6J3F/Fhm9YAw1i019agkZhS32Yg0ZjM1AXEt80CVsEE9BkzAtGoFnYKmjQi2kZna8anZmzn8g2maX9AawIfKa8qZx5AAAAAElFTkSuQmCC);
524
  background-size: 12px auto;
525
  background-repeat: no-repeat;
526
  background-position: center center;
527
  }
528
 
529
- .happyforms-part.display-type--block .happyforms-part__el {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  display: block;
 
 
 
 
531
  }
532
 
533
- .happyforms-part.display-type--block .option-label {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
534
  display: block;
 
 
 
 
 
 
 
 
 
 
 
 
535
  }
536
 
537
- .happyforms-part.display-type--block .option-label .label {
538
- padding-left: 0;
 
539
  }
540
 
541
- .happyforms-part .happyforms-message-notices {
542
- padding: 0 1%;
 
 
 
543
  }
544
 
545
- .happyforms-part .happyforms-message-notices h2 {
546
- font-size: 14px;
547
  }
548
 
549
- .happyforms-part .happyforms-error + input,
550
- .happyforms-part .happyforms-error + textarea {
551
- border: 2px solid #ff7550;
552
  }
553
 
554
- /* rating part */
 
555
  .happyforms-part--rating .happyforms-rating-item-wrap {
556
  float: left;
557
  margin-right: 5px;
@@ -571,6 +887,7 @@
571
  float: left;
572
  margin-right: 5px;
573
  color: #f39c00;
 
574
  }
575
 
576
  .happyforms-part--rating .happyforms-star__star {
@@ -579,103 +896,210 @@
579
  stroke-width: 35px;
580
  }
581
 
582
- .happyforms-part--rating {
583
  fill: #ccc;
 
584
  color: transparent;
585
  stroke: #ccc;
 
586
  }
587
 
588
- .happyforms-part--rating:hover {
589
  color: #ccc;
590
  fill: #f39c00;
 
591
  stroke: #f39c00;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
592
  }
593
 
594
- .happyforms-part--rating label {
595
- fill: inherit;
596
- color: inherit;
597
- stroke: inherit;
 
 
 
598
  }
599
 
600
- .happyforms-part--rating .happyforms-star__label {
601
- cursor: pointer;
602
- float: left;
603
- margin-right: 5px;
 
 
 
 
 
604
  }
605
 
606
- .happyforms-part--rating .happyforms-star__label {
607
- color: #f39c00;
 
 
 
 
 
 
 
 
 
608
  }
609
 
610
- .happyforms-part--rating:not(:hover) input:first-child:checked~label,
611
- .happyforms-part--rating input:hover+label~label:not(:hover),
612
- .happyforms-part--rating:hover input:checked+label:hover~label,
613
- .happyforms-part--rating:not(:hover) input:checked+label~label {
614
- color: #ccc;
615
  }
616
 
617
- .happyforms-part--legal span {
618
- margin-left: 5px;
619
- font-weight: normal;
620
- font-size: 14px;
 
 
 
 
 
 
 
621
  }
622
 
 
 
623
  .happyforms-part--submit {
624
  width: 100%;
625
  margin-bottom: 0;
626
  }
627
 
628
- button[type=submit].happyforms-button--submit,
629
- button[type=submit][disabled].happyforms-button--submit,
630
- button[type=submit][disabled].happyforms-button--submit:hover,
631
  input[type=submit].happyforms-button--submit,
632
  input[type=submit][disabled].happyforms-button--submit,
633
  input[type=submit][disabled].happyforms-button--submit:hover {
 
634
  padding: 17px 50px;
635
  border-radius: 6px;
636
- border-style: solid;
637
- border-color: #00c280;
638
  font-weight: normal;
639
  font-style: normal;
640
  font-size: 18px;
 
641
  color: #fff;
 
642
  background-color: #000;
 
643
  text-transform: none;
644
- transition-property: none;
645
- transition-duration: 0.1s;
 
646
  transition-timing-function: ease-in;
647
  }
648
 
649
- button[type=submit][disabled].happyforms-button--submit,
650
- button[type=submit][disabled].happyforms-button--submit:hover,
651
  input[type=submit][disabled].happyforms-button--submit,
652
  input[type=submit][disabled].happyforms-button--submit:hover {
653
  cursor: default;
654
  opacity: 0.5;
655
  }
656
 
657
- button[type=submit].happyforms-button--submit:hover,
658
  input[type=submit].happyforms-button--submit:hover {
659
  border-radius: 6px;
660
- border-color: #555;
661
- background-color: #555;
 
 
 
 
 
 
 
 
 
 
 
 
 
662
  text-transform: none;
 
 
663
  }
664
 
 
 
665
  .happyforms-message-notice h2 {
666
  margin-top: 0;
667
  margin-bottom: 0;
668
  font-weight: bold;
669
  font-size: 14px !important;
670
  padding: 20px;
 
 
671
  }
672
 
673
  .happyforms-message-notice.error h2 {
674
  margin-top: 0;
675
  margin-bottom: 5px;
676
  padding: 0;
677
- color: #ff7550;
678
  font-weight: normal;
 
 
679
  }
680
 
681
  .happyforms-message-notice.success h2,
@@ -693,195 +1117,329 @@ input[type=submit].happyforms-button--submit:hover {
693
  border: 3px solid;
694
  border-width: 3px;
695
  border-color: #000;
696
- background-color: #fff;
 
697
  }
698
 
699
  .happyforms-message-notice.success h2 {
700
  color: #39b54a;
 
701
  }
702
 
703
  .happyforms-message-notice.error-submission {
704
  border-color: #ff7550;
 
705
  }
706
 
707
- .happyforms-credits {
708
- margin: 0 1% 25px;
709
  }
710
 
711
- .happyforms-credits:after {
712
- content: '';
713
- display: table;
714
- clear: both;
715
  }
716
 
717
- /* part tooltips */
718
- .happyforms-part__tooltip {
719
- display: inline-block;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
720
  }
721
 
722
- .happyforms-part__tooltip .happyforms-part__description {
 
 
723
  position: absolute;
724
- z-index: 999;
725
- top: 0;
726
- right: 18px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
727
  opacity: 0;
728
- width: auto;
729
- visibility: hidden;
730
- padding: 10px 15px;
731
- border: 1px solid #dbdbdb;
732
- border-radius: 6px;
733
- font-weight: normal;
734
- color: #000;
735
- text-align: center;
736
- background-color: #fff;
737
- transition: opacity 0.2s;
738
  }
739
 
740
- .happyforms-part--multi-line-text .happyforms-part__tooltip .happyforms-part__description {
741
- top: 25%;
742
  }
743
 
744
- .happyforms-part--date .happyforms-part__tooltip .happyforms-part__description,
745
- .happyforms-part--select .happyforms-part__tooltip .happyforms-part__description,
746
- .happyforms-part--rating .happyforms-part__tooltip .happyforms-part__description,
747
- .happyforms-part--scale .happyforms-part__tooltip .happyforms-part__description {
748
- top: -50px;
749
  }
750
 
751
- .happyforms-part__tooltip .happyforms-part__description:before {
752
- content: '';
753
- position: absolute;
754
- top: 100%;
755
- right: 12px;
756
- width: 0;
757
- height: 0;
758
- border: 8px solid transparent;
759
- border-top-color: #dbdbdb;
760
  }
761
 
762
- .happyforms-part__tooltip .happyforms-part__description:after {
763
- content: '';
764
  position: absolute;
765
- top: calc(100% - 1px);
766
- right: 13px;
767
- width: 0;
768
- height: 0;
769
- border: 7px solid transparent;
770
- border-top-color: #fff;
771
  }
772
 
773
- .happyforms-tooltip__trigger {
774
- position: absolute;
775
- top: 52%;
776
- right: 30px;
777
- cursor: pointer;
778
- display: inline-block;
779
- width: 18px;
780
- height: 18px;
781
- border-radius: 50%;
782
- font-style: normal;
783
- font-size: 11px;
784
- color: #fff;
785
- text-align: center;
786
- background-color: #000;
787
  }
788
 
789
- .happyforms-part__tooltip:hover .happyforms-part__description {
790
- visibility: visible;
791
- opacity: 1;
 
792
  }
793
 
794
- .happyforms-part--date .happyforms-tooltip__trigger,
795
- .happyforms-part--select .happyforms-tooltip__trigger,
796
- .happyforms-part--rating .happyforms-tooltip__trigger,
797
- .happyforms-part--scale .happyforms-tooltip__trigger {
798
- top: 5px;
799
  }
800
 
801
- /* Address part */
802
- .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el-wrap {
803
- display: flex;
804
  }
805
 
806
- .happyforms-part--address .happyforms-part__el {
807
- position: relative;
 
808
  }
809
 
810
- .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el {
811
- flex: 1;
812
  }
813
 
814
- div.happyforms-part__el--address--results,
815
- div.happyforms-part__el--address--results-country {
816
- padding: 0;
817
- margin: 2px 0 0;
818
- position: absolute;
819
- z-index: 9999;
820
- list-style-type: none;
821
- width: calc(100% - 10px);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
822
  display: none;
823
  }
824
 
825
- div.happyforms-part__el--address--results-autocomplete:after {
826
- content: "";
827
- padding: 5px 10px;
828
- height: 16px;
829
- box-sizing: content-box;
830
- text-align: right;
831
- display: block;
832
- background-image: url(https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white3.png);
833
- background-position: calc(100% - 10px) center;
834
- background-repeat: no-repeat;
835
- background-size: 120px 14px;
836
- border-width: 1px;
837
- border-style: solid;
838
- border-color: #dbdbdb;
839
- border-top: none;
840
  }
841
 
842
- div.happyforms-part__el--address--results div {
843
- padding: 10px;
844
- border-style: solid;
845
- border-color: #dbdbdb;
846
- border-width: 1px;
847
- font-size: 16px;
848
- cursor: pointer;
849
- background-color: white;
850
  }
851
 
852
- div.happyforms-part__el--address--results div ~ div {
853
- border-top: none;
854
  }
855
 
856
- div.happyforms-part__el--address--results div:only-child {
857
- border-radius: 6px;
858
  }
859
 
860
- div.happyforms-part__el--address--results > div:not(:first-child):not(:last-child):not(:only-child),
861
- div.happyforms-part__el--address--results-complete > div:last-child {
862
- border-radius: 0 !important;
863
  }
864
 
865
- div.happyforms-part__el--address--results div:first-child:not(:only-child),
866
- div.happyforms-part__el--address--results-country div:first-child:not(:only-child) {
867
- border-width: 1px;
868
- border-style: solid;
869
- border-color: #dbdbdb;
870
- border-top-left-radius: 6px;
871
- border-top-right-radius: 6px;
872
- border-bottom-left-radius: 0px !important;
873
- border-bottom-right-radius: 0px !important;
874
  }
875
 
876
- div.happyforms-part__el--address--results:after,
877
- div.happyforms-part__el--address--results-country div:last-child:not(:only-child) {
878
- border-top-left-radius: 0px !important;
879
- border-top-right-radius: 0px !important;
880
- border-bottom-left-radius: 6px;
881
- border-bottom-right-radius: 6px;
882
  }
883
 
884
- div.happyforms-part__el--address--results div:hover,
885
- div.happyforms-part__el--address--results-country div:hover {
886
- background-color: #dbdbdb;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
887
  }
1
+ :root {
2
+ /* colors */
3
+ --happyforms-color-primary: #000;
4
+ --happyforms-color-success: #39b54a;
5
+ --happyforms-color-error: #ff7550;
6
+ --happyforms-color-part-title: #000;
7
+ --happyforms-color-part-value: #000;
8
+ --happyforms-color-part-placeholder: #aaa;
9
+ --happyforms-color-part-required-text: #ff7550;
10
+ --happyforms-color-part-border: #dbdbdb;
11
+ --happyforms-color-part-border-focus: #000;
12
+ --happyforms-color-part-background: #fff;
13
+ --happyforms-color-part-background-focus: #fff;
14
+ --happyforms-color-submit-background: #000;
15
+ --happyforms-color-submit-background-hover: #dbdbdb;
16
+ --happyforms-color-submit-background-focus: #dbdbdb;
17
+ --happyforms-color-submit-border: transparent;
18
+ --happyforms-color-rating: #ccc;
19
+ --happyforms-color-rating-hover: #f39c00;
20
+ /* font */
21
+ --happyforms-form-title-font-size: 32px;
22
+ --happyforms-form-font-weight: normal;
23
+ --happyforms-part-title-font-size: 16px;
24
+ --happyforms-part-description-font-size: 14px;
25
+ --happyforms-part-value-font-size: 16px;
26
+ --happyforms-submit-button-font-size: 18px;
27
+ /* animations and transitions */
28
+ --happyforms-transition-duration: 0.25s;
29
  }
30
 
31
  .happyforms-flex {
36
  padding: 7.5% 0;
37
  }
38
 
39
+ .happyforms-form form {
40
+ max-width: 100%;
41
+ border-style: solid;
42
+ border-width: 0;
43
+ font-weight: normal;
44
+ font-weight: var(--happyforms-form-font-weight);
45
+ background-color: transparent;
46
+ }
47
+
48
+ h3.happyforms-form__title {
49
  margin: 0;
50
  padding: 0 1%;
51
  font-weight: bold;
52
  font-size: 32px;
53
+ font-size: var(--happyforms-form-title-font-size);
54
  color: #000;
55
+ color: var(--happyforms-color-primary);
56
  }
57
 
58
+ .happyforms-form--hide-title h3.happyforms-form__title {
59
+ display: none;
 
 
 
 
60
  }
61
 
62
+ /* parts - general */
 
 
 
 
 
 
 
 
 
63
 
64
+ .happyforms-form__part {
65
  position: relative;
66
  display: block;
67
  width: 100%;
68
  margin-bottom: 20px;
69
+ padding: 5px 1%;
70
  }
71
 
72
  @media screen and (min-width: 800px) {
83
  cursor: pointer;
84
  margin-bottom: 20px;
85
  font-size: 16px;
86
+ font-size: var(--happyforms-part-title-font-size);
87
  }
88
 
89
  .happyforms-part__label .label {
90
  font-weight: bold;
91
  color: #000;
92
+ color: var(--happyforms-color-part-title);
 
 
 
 
 
 
 
 
 
93
  }
94
 
95
  .happyforms-part__description {
96
  display: block;
97
  margin: 5px 0 0;
98
  font-size: 14px;
99
+ font-size: var(--happyforms-part-description-font-size);
100
+ color: #000;
101
+ color: var(--happyforms-color-primary);
102
  }
103
 
104
  .happyforms-part input[type=text],
107
  .happyforms-part input[type=number],
108
  .happyforms-part input[type=range],
109
  .happyforms-part textarea {
110
+ width: 100%;
111
+ height: auto !important;
112
  padding: 10px;
113
  border-width: 1px;
114
  border-style: solid;
115
  border-color: #dbdbdb;
116
+ border-color: var(--happyforms-color-part-border);
117
  border-radius: 6px;
118
+ box-shadow: none;
119
  font-style: normal;
120
  font-size: 16px;
121
+ font-size: var(--happyforms-part-value-font-size);
122
  background-color: #fff;
123
+ background-color: var(--happyforms-color-part-background);
124
  color: #000;
125
+ color: var(--happyforms-color-part-value);
126
  transition-property: none;
127
  transition-duration: 0.1s;
128
+ transition-duration: var(--happyforms-transition-duration);
129
  transition-timing-function: ease-in;
130
  }
131
 
132
+ .happyforms-form--part-border-off .happyforms-part input[type=text],
133
+ .happyforms-form--part-border-off .happyforms-part input[type=email],
134
+ .happyforms-form--part-border-off .happyforms-part input[type=tel],
135
+ .happyforms-form--part-border-off .happyforms-part input[type=number],
136
+ .happyforms-form--part-border-off .happyforms-part input[type=range],
137
+ .happyforms-form--part-border-off .happyforms-part textarea {
138
+ border-color: transparent;
139
+ }
140
+
141
  .happyforms-part input[type=text]:focus,
142
  .happyforms-part input[type=email]:focus,
143
  .happyforms-part input[type=tel]:focus,
145
  .happyforms-part textarea:focus {
146
  border-width: 1px;
147
  border-style: solid;
148
+ border-color: #000;
149
+ border-color: var(--happyforms-color-part-border-focus);
150
+ background-color: #fff;
151
+ background-color: var(--happyforms-color-part-background-focus);
152
+ }
153
+
154
+ .happyforms-form--part-border-off .happyforms-part input[type=text]:focus,
155
+ .happyforms-form--part-border-off .happyforms-part input[type=email]:focus,
156
+ .happyforms-form--part-border-off .happyforms-part input[type=tel]:focus,
157
+ .happyforms-form--part-border-off .happyforms-part input[type=number]:focus,
158
+ .happyforms-form--part-border-off .happyforms-part textarea:focus {
159
+ border-color: transparent;
160
  }
161
 
162
  .happyforms-part.happyforms-part--error input[type=text],
166
  .happyforms-part.happyforms-part--error input[type=range],
167
  .happyforms-part.happyforms-part--error textarea {
168
  border-color: #ff7550;
169
+ border-color: var(--happyforms-color-error);
170
  }
171
 
172
+ .happyforms-part.display-type--block .happyforms-part__el {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  display: block;
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  }
175
 
176
+ /* placeholders */
 
 
177
 
 
178
  .happyforms-part ::-webkit-input-placeholder {
179
  font-weight: normal;
180
  font-style: normal;
181
  color: #aaa;
182
+ color: var(--happyforms-color-part-placeholder);
183
  }
184
 
185
  .happyforms-part ::-moz-placeholder {
186
  font-weight: normal;
187
  font-style: normal;
188
  color: #aaa;
189
+ color: var(--happyforms-color-part-placeholder);
190
  }
191
 
192
  .happyforms-part ::-ms-placeholder {
193
  font-weight: normal;
194
  font-style: normal;
195
  color: #aaa;
196
+ color: var(--happyforms-color-part-placeholder);
197
  }
198
 
199
  .happyforms-part ::placeholder {
200
  font-weight: normal;
201
  font-style: normal;
202
  color: #aaa;
203
+ color: var(--happyforms-color-part-placeholder);
204
+ }
205
+
206
+ .happyforms-part-el-wrap {
207
+ position: relative;
208
+ }
209
+
210
+ .happyforms-part-wrap {
211
+ position: relative;
212
+ }
213
+
214
+ .happyforms-part-wrap--confirmation {
215
+ margin-top: 10px;
216
+ }
217
+
218
+ .happyforms-required {
219
+ color: #ff7550;
220
+ color: var(--happyforms-color-part-required-text);
221
  }
222
 
223
+ /* label placement */
224
+
225
+ .happyforms-part--label-below .happyforms-part-wrap {
226
  display: flex;
227
  flex-flow: row wrap-reverse;
228
  align-content: flex-end;
229
  }
230
 
231
+ .happyforms-part--label-below .happyforms-part__label {
232
+ order: 2;
233
+ width: 100%;
234
+ margin-bottom: 5px;
235
+ }
236
+
237
+ .happyforms-part--label-above .happyforms-part__label--confirmation {
238
+ margin-top: 10px;
239
+ }
240
+
241
  .happyforms-part--label-below input,
242
  .happyforms-part--label-below textarea,
243
  .happyforms-part--label-below select,
283
  margin-bottom: 10px;
284
  }
285
 
286
+ /* parts - option labels */
 
 
287
 
288
+ .happyforms-part .option-label {
289
+ position: relative;
290
+ cursor: pointer;
291
+ display: inline-block;
292
+ margin-bottom: 10px;
293
+ padding: 0 5px 5px 0;
294
  font-size: 16px;
295
+ font-size: var(--happyforms-part-value-font-size);
296
  }
297
 
298
+ .happyforms-part--radio .option-label {
299
+ margin-right: 20px;
300
+ padding: 10px;
301
+ background-color: #fff;
 
 
302
  }
303
 
304
+ .happyforms-part--radio .option-label .border {
305
+ position: absolute;
306
+ top: 0;
307
+ left: 0;
308
+ z-index: 0;
309
  width: 100%;
310
+ height: 100%;
311
  border-radius: 6px;
312
+ border: 1px solid;
313
+ border-color: #dbdbdb;
314
+ border-color: var(--happyforms-color-part-border);
315
+ background-color: #fff;
316
+ background-color: var(--happyforms-color-part-background);
317
+ transition: border-color var(--happyforms-transition-duration);
318
  }
319
 
320
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio .option-label .border {
321
+ border-top-color: transparent;
322
+ border-left-color: transparent;
323
+ border-right-color: transparent;
324
  }
325
 
326
+ .happyforms-form--part-border-off .option-label .border {
327
+ border-color: transparent;
328
  }
329
 
330
+ .happyforms-part--radio .option-label input,
331
+ .happyforms-part--checkbox .option-label input {
332
+ top: 3px;
333
  }
334
 
335
+ .happyforms-part--radio input:checked~.border,
336
+ .happyforms-part--radio .option-label:hover .border {
337
+ border-color: #000;
338
+ border-color: var(--happyforms-color-part-border-focus);
339
+ background-color: #fff;
340
+ background-color: var(--happyforms-color-part-background-focus);
341
  }
342
 
343
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio input:checked~.border,
344
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio .option-label:hover .border {
345
+ border-top-color: transparent;
346
+ border-left-color: transparent;
347
+ border-right-color: transparent;
348
  }
349
 
350
+ .happyforms-part--radio .option-label input:focus {
351
+ outline: 0;
 
 
352
  }
353
 
354
+ .happyforms-part--radio .option-label .label,
355
+ .happyforms-part--checkbox .option-label .label {
356
+ position: relative;
357
+ display: inline-block;
358
+ margin-right: 15px;
359
+ padding: 0 10px;
 
 
 
 
 
 
 
 
 
 
360
  }
361
 
362
+ .happyforms-part-option {
363
+ margin-bottom: 20px;
 
364
  }
365
 
366
+ .happyforms-part-option__description {
367
+ display: block;
368
+ width: 100%;
369
+ max-width: 400px;
370
+ margin-top: 3px;
371
+ margin-right: 20px;
372
+ font-size: 12px;
373
+ color: #000;
374
+ color: var(--happyforms-color-primary);
375
  }
376
 
377
+ .happyforms-part--radio.display-type--block .happyforms-part-option__description {
378
+ max-width: none;
 
379
  }
380
 
381
+ .happyforms-part.display-type--block .option-label {
382
+ display: block;
383
+ margin-right: 0;
384
  }
385
 
386
+ .happyforms-part--checkbox.display-type--block .option-label {
387
+ margin-bottom: 10px;
388
  }
389
 
390
+ /* tooltips */
391
+
392
+ .happyforms-tooltip {
393
+ position: absolute;
394
+ bottom: 0;
395
+ left: 0;
396
+ right: 10px;
397
+ height: 50%;
398
+ overflow: visible;
399
+ pointer-events: none;
400
+ }
401
+
402
+ .happyforms-tooltip__trigger {
403
+ display: block;
404
+ position: absolute;
405
+ top: 48%;
406
+ right: 1px;
407
+ padding: 10px;
408
+ background-color: transparent;
409
+ -ms-transform: translate(0, -50%);
410
+ -webkit-transform: translate(0, -50%);
411
+ transform: translate(0, -50%);
412
+ pointer-events: auto;
413
  cursor: pointer;
 
 
 
 
414
  }
415
 
416
+ .happyforms-tooltip__trigger:after {
417
+ content: "?";
418
+ display: block;
419
+ width: 18px;
420
+ height: 18px;
421
+ border-radius: 50%;
422
+ font-style: normal;
423
+ font-size: 11px;
424
+ line-height: 18px;
425
+ color: #fff;
426
+ color: var(--happyforms-color-part-background);
427
+ text-align: center;
428
+ background-color: #000;
429
+ background-color: var(--happyforms-color-part-value);
430
  }
431
 
432
+ .happyforms-tooltip .happyforms-part__description {
433
  position: absolute;
434
+ z-index: 999;
435
  top: 0;
436
+ right: 0;
437
+ transform: translate(0, -115%);
438
+ opacity: 0;
439
+ width: auto;
440
+ visibility: hidden;
441
+ padding: 10px 15px;
442
  border: 1px solid #dbdbdb;
443
+ border-radius: 6px;
444
+ font-weight: normal;
445
+ color: #000;
446
+ color: var(--happyforms-color-primary);
447
+ text-align: center;
448
+ background-color: #fff;
449
+ background-color: var(--happyforms-color-part-background);
450
+ transition: opacity 0.2s;
451
  }
452
 
453
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip .happyforms-part__description {
454
+ transform: translate(0, -100%);
 
455
  }
456
 
457
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip {
458
+ height: 54%;
 
459
  }
460
 
461
+ .happyforms-form--part-inner-padding-narrow .happyforms-tooltip .happyforms-part__description {
462
+ transform: translate(0, -120%);
463
  }
464
 
465
+ .happyforms-form--part-inner-padding-narrow .happyforms-tooltip {
466
+ height: 42%;
 
 
 
467
  }
468
 
469
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip .happyforms-part__description {
470
+ transform: translate(0, -100%);
471
  }
472
 
473
+ .happyforms-tooltip .happyforms-part__description:before {
474
+ content: '';
475
+ position: absolute;
476
+ top: 100%;
477
+ right: 12px;
478
+ width: 0;
479
+ height: 0;
480
+ border: 8px solid transparent;
481
+ border-top-color: #dbdbdb;
482
  }
483
 
484
+ .happyforms-tooltip .happyforms-part__description:after {
485
+ content: '';
486
+ position: absolute;
487
+ top: calc(100% - 1px);
488
+ right: 13px;
489
+ width: 0;
490
+ height: 0;
491
+ border: 7px solid transparent;
492
+ border-top-color: #fff;
493
+ border-top-color: var(--happyforms-color-part-background);
494
  }
495
 
496
+ .happyforms-tooltip:hover .happyforms-part__description {
497
+ visibility: visible;
498
+ opacity: 1;
499
+ }
500
+
501
+ .happyforms-part--multi_line_text .happyforms-tooltip,
502
+ .happyforms-part--date .happyforms-tooltip,
503
+ .happyforms-part--select .happyforms-tooltip,
504
+ .happyforms-part--rating .happyforms-tooltip,
505
+ .happyforms-part--scale .happyforms-tooltip,
506
+ .happyforms-part--checkbox .happyforms-tooltip,
507
+ .happyforms-part--radio .happyforms-tooltip,
508
+ .happyforms-part--title .happyforms-tooltip {
509
+ top: 0;
510
+ bottom: auto;
511
+ }
512
+
513
+ .happyforms-part--multi_line_text .happyforms-tooltip,
514
+ .happyforms-part--checkbox .happyforms-tooltip,
515
+ .happyforms-part--radio .happyforms-tooltip {
516
+ height: 30px;
517
+ }
518
+
519
+ .happyforms-part--multi_line_text .happyforms-tooltip .happyforms-part__description,
520
+ .happyforms-part--checkbox .happyforms-tooltip .happyforms-part__description,
521
+ .happyforms-part--radio .happyforms-tooltip .happyforms-part__description {
522
+ transform: translate(0, -130%);
523
+ }
524
+
525
+ /* parts - radio, checkbox */
526
+
527
  .happyforms-part--radio .happyforms-part__el {
528
  display: flex;
529
  }
530
 
531
+ .happyforms-part--radio {
532
+ margin-bottom: 0;
533
+ }
534
+
535
+ .happyforms-part--radio.display-type--block {
536
+ margin-bottom: 20px;
537
+ }
538
+
539
  .happyforms-part--radio .checkmark,
540
  .happyforms-part--checkbox .checkmark {
541
  position: relative;
542
  top: 4px;
543
+ z-index: 5;
544
  display: inline-block;
545
  width: 20px;
546
  height: 20px;
547
  border-radius: 50%;
548
+ border: 1px solid;
549
+ border-color: #dbdbdb;
550
+ border-color: var(--happyforms-color-part-border);
551
  }
552
 
553
  .happyforms-part--checkbox .checkmark {
558
  margin-right: 5px;
559
  }
560
 
561
+ .happyforms-part--radio input:checked+.checkmark,
562
+ .happyforms-part--checkbox input:checked+.checkmark {
563
  border-color: #000;
564
+ border-color: var(--happyforms-color-part-border-focus);
565
  background-color: #000;
566
+ background-color: var(--happyforms-color-part-border-focus);
567
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAVCAYAAABVAo5cAAAA7UlEQVRIS7XUbRHCMAwG4DcSQAKTgAWQABaQgAW8IGFIAAlgYRJeLru2t6+un8vPNtfn0jYRbBQkdwBOIvIcErKFR/II4G3O7kRkb53q4ASzjkOrgh7MoQCaamAAs+itChiJKVpeYQJ2FpFXUYWpmJY4Akm2ALR/riLyW2uZHGwEkvwCOAyQxofmYg5cwKw7Q0uwHiSpE0Engy8cWopZkBHjrTE5eu2h6H+jL0krvAN4hE6J3F/Fhm9YAw1i019agkZhS32Yg0ZjM1AXEt80CVsEE9BkzAtGoFnYKmjQi2kZna8anZmzn8g2maX9AawIfKa8qZx5AAAAAElFTkSuQmCC);
568
  background-size: 12px auto;
569
  background-repeat: no-repeat;
570
  background-position: center center;
571
  }
572
 
573
+ /* parts - scale */
574
+
575
+ .happyforms-part input[type=range] {
576
+ -webkit-appearance: none;
577
+ padding: 0;
578
+ border: 0;
579
+ width: 100%;
580
+ }
581
+
582
+ .happyforms-part input[type=range]:focus {
583
+ border: 0;
584
+ outline: 0;
585
+ }
586
+
587
+ .happyforms-part input[type=range]::-webkit-slider-runnable-track {
588
+ width: 100%;
589
+ height: 1px;
590
+ cursor: pointer;
591
+ animate: 0.25s;
592
+ animate: var(--happyforms-transition-duration);
593
+ box-shadow: none;
594
+ background: #000;
595
+ background: var(--happyforms-color-part-value);
596
+ }
597
+
598
+ .happyforms-part input[type=range]::-webkit-slider-thumb {
599
+ -webkit-appearance: none;
600
+ width: 20px;
601
+ height: 20px;
602
+ margin-top: -10px;
603
+ border: 1px solid;
604
+ border-color: #000;
605
+ border-color: var(--happyforms-color-part-value);
606
+ border-radius: 50%;
607
+ box-shadow: none;
608
+ background: #000;
609
+ background: var(--happyforms-color-part-value);
610
+ cursor: pointer;
611
+ }
612
+
613
+ .happyforms-part input[type=range]:focus::-webkit-slider-runnable-track {
614
+ background: #000;
615
+ }
616
+
617
+ .happyforms-part input[type=range]::-moz-range-track {
618
+ width: 100%;
619
+ height: 1px;
620
+ cursor: pointer;
621
+ animate: 0.25s;
622
+ animate: var(--happyforms-transition-duration);
623
+ box-shadow: none;
624
+ background: #000;
625
+ background: var(--happyforms-color-part-value);
626
+ }
627
+
628
+ .happyforms-part input[type=range]::-moz-range-thumb {
629
+ width: 20px;
630
+ height: 20px;
631
+ margin-top: -10px;
632
+ border: 1px solid;
633
+ border-color: #000;
634
+ border-color: var(--happyforms-color-part-value);
635
+ border-radius: 50%;
636
+ box-shadow: none;
637
+ background: #000;
638
+ background: var(--happyforms-color-part-value);
639
+ cursor: pointer;
640
+ }
641
+
642
+ .happyforms-part input[type=range]::-ms-track {
643
+ width: 100%;
644
+ height: 1px;
645
+ cursor: pointer;
646
+ animate: 0.25s;
647
+ animate: var(--happyforms-transition-duration);
648
+ box-shadow: none;
649
+ background: #000;
650
+ background: var(--happyforms-color-part-value);
651
+ }
652
+
653
+ .happyforms-part input[type=range]::-ms-fill-lower {
654
+ background: #000;
655
+ background: var(--happyforms-color-part-value);
656
+ border: 0;
657
+ box-shadow: none;
658
+ }
659
+
660
+ .happyforms-part input[type=range]::-ms-fill-upper {
661
+ background: #000;
662
+ background: var(--happyforms-color-part-value);
663
+ border: 0;
664
+ box-shadow: none;
665
+ }
666
+
667
+ .happyforms-part input[type=range]::-ms-thumb {
668
+ width: 20px;
669
+ height: 20px;
670
+ margin-top: -10px;
671
+ border: 1px solid #000;
672
+ border: var(--happyforms-color-part-value);
673
+ border-radius: 50%;
674
+ box-shadow: none;
675
+ background: #000;
676
+ background: var(--happyforms-color-part-value);
677
+ cursor: pointer;
678
+ }
679
+
680
+ .happyforms-part input[type=range]:focus::-ms-fill-lower {
681
+ background: #000;
682
+ background: var(--happyforms-color-part-value);
683
+ }
684
+
685
+ .happyforms-part input[type=range]:focus::-ms-fill-upper {
686
+ background: #000;
687
+ background: var(--happyforms-color-part-value);
688
+ }
689
+
690
+ .happyforms-part--scale output {
691
  display: block;
692
+ position: relative;
693
+ width: 30px;
694
+ text-align: center;
695
+ color: #d0d0d0;
696
  }
697
 
698
+ .happyforms-part--scale__labels {
699
+ position: relative;
700
+ width: 100%;
701
+ }
702
+
703
+ .happyforms-part--scale__labels .label-min {
704
+ float: left;
705
+ }
706
+
707
+ .happyforms-part--scale__labels .label-max {
708
+ float: right;
709
+ }
710
+
711
+ .happyforms-part--label-below input,
712
+ .happyforms-part--label-below textarea,
713
+ .happyforms-part--label-below select,
714
+ .happyforms-part--label-below .happyforms-part__select-wrap,
715
+ .happyforms-part--label-below .happyforms-part__el {
716
+ order: 3;
717
+ }
718
+
719
+ .happyforms-part--label-below .happyforms-part__description {
720
+ order: 1;
721
+ margin-top: 0;
722
+ }
723
+
724
+ .happyforms-part--label-below.happyforms-part--date .happyforms-part__el {
725
+ width: 100%;
726
+ order: 2;
727
+ }
728
+
729
+ .happyforms-part--label-left .happyforms-part__label {
730
+ float: left;
731
+ width: 25%;
732
+ }
733
+
734
+ .happyforms-part--label-left input.happyforms-part__el,
735
+ .happyforms-part--label-left textarea.happyforms-part__el,
736
+ .happyforms-part--label-left .happyforms-part__select-wrap {
737
+ float: right;
738
+ width: 75%;
739
+ }
740
+
741
+ .happyforms-part--label-left .happyforms-part__description {
742
+ clear: both;
743
+ float: right;
744
+ width: 75%;
745
+ }
746
+
747
+ .happyforms-part--label-below .happyforms-part__el,
748
+ .happyforms-part--label-below input.happyforms-part__el,
749
+ .happyforms-part--label-below select.happyforms-part__el,
750
+ .happyforms-part--label-below textarea.happyforms-part__el {
751
+ position: relative;
752
+ top: 5px;
753
+ margin-bottom: 10px;
754
+ }
755
+
756
+ /* parts - placeholder */
757
+
758
+ .happyforms-part--placeholder p {
759
+ font-size: 16px;
760
+ color: #000;
761
+ }
762
+
763
+ .happyforms-part--placeholder p:first-child {
764
+ margin-top: 0;
765
+ }
766
+
767
+ .happyforms-part--placeholder p:last-child {
768
+ margin-bottom: 0;
769
+ }
770
+
771
+ /* parts - select */
772
+
773
+ .happyforms-part--select select,
774
+ .happyforms-part--date select,
775
+ .happyforms-part--title select {
776
+ position: relative;
777
+ -webkit-appearance: none;
778
+ -moz-appearance: none;
779
+ appearance: none;
780
+ width: 100%;
781
+ padding: 10px;
782
+ border: 1px solid;
783
+ border-radius: 6px;
784
+ border-color: #dbdbdb;
785
+ border-color: var(--happyforms-color-part-border);
786
+ line-height: 1.4;
787
+ background-color: #fff;
788
+ background-color: var(--happyforms-color-part-background);
789
+ font-size: 16px;
790
+ font-size: var(--happyforms-part-value-font-size);
791
+ }
792
+
793
+ .happyforms-form--part-border-off .happyforms-part--select select,
794
+ .happyforms-form--part-border-off .happyforms-part--date select,
795
+ .happyforms-form--part-border-off .happyforms-part--title select {
796
+ border-color: transparent;
797
+ }
798
+
799
+ .happyforms-part-date--date .happyforms-part-date__time-input {
800
+ display: none;
801
+ }
802
+
803
+ .happyforms-part-date--time .happyforms-part-date__date-input {
804
+ display: none;
805
+ }
806
+
807
+ .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__el,
808
+ .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__el {
809
+ flex-wrap: wrap;
810
+ }
811
+
812
+ .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__select-wrap,
813
+ .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__select-wrap {
814
+ min-width: 33.333%;
815
+ margin-bottom: 15px;
816
+ }
817
+
818
+ .happyforms-part__select-wrap {
819
+ position: relative;
820
+ flex: 1;
821
+ padding: 0 0 0 2%;
822
+ }
823
+
824
+ .happyforms-part__select-wrap:first-of-type {
825
+ padding-left: 0 !important;
826
+ }
827
+
828
+ .happyforms-part__select-wrap:after {
829
+ content: '';
830
+ position: absolute;
831
+ top: 22%;
832
+ right: 15px;
833
+ z-index: 999;
834
  display: block;
835
+ width: 25px;
836
+ height: 25px;
837
+ font-size: 22px;
838
+ color: #000;
839
+ color: var(--happyforms-color-part-value);
840
+ fill: #000;
841
+ fill: var(--happyforms-color-part-value);
842
+ stroke: #000;
843
+ stroke: var(--happyforms-color-part-value);
844
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBkPSJNNSA4bDQgNCA0LTR6Ii8+PC9zdmc+);
845
+ background-size: cover;
846
+ background-repeat: no-repeat;
847
  }
848
 
849
+ .happyforms-part--date .happyforms-part__select-wrap:after {
850
+ top: calc(46% - 12px);
851
+ right: 15px;
852
  }
853
 
854
+ .happyforms-part--select select:focus,
855
+ .happyforms-part--date select:focus {
856
+ outline-width: 1px;
857
+ outline-color: #000000;
858
+ outline-color: var(--happyforms-color-part-value);
859
  }
860
 
861
+ .happyforms-part--date .happyforms-part__el {
862
+ display: flex;
863
  }
864
 
865
+ .happyforms-part__select-wrap:last-child {
866
+ padding-right: 0;
 
867
  }
868
 
869
+ /* parts - rating */
870
+
871
  .happyforms-part--rating .happyforms-rating-item-wrap {
872
  float: left;
873
  margin-right: 5px;
887
  float: left;
888
  margin-right: 5px;
889
  color: #f39c00;
890
+ color: var(--happyforms-color-rating-hover);
891
  }
892
 
893
  .happyforms-part--rating .happyforms-star__star {
896
  stroke-width: 35px;
897
  }
898
 
899
+ .happyforms-part--rating .happyforms-part-wrap {
900
  fill: #ccc;
901
+ fill: var(--happyforms-color-rating);
902
  color: transparent;
903
  stroke: #ccc;
904
+ stroke: var(--happyforms-color-rating);
905
  }
906
 
907
+ .happyforms-part--rating:hover .happyforms-part-wrap {
908
  color: #ccc;
909
  fill: #f39c00;
910
+ fill: var(--happyforms-color-rating-hover);
911
  stroke: #f39c00;
912
+ stroke: var(--happyforms-color-rating-hover);
913
+ }
914
+
915
+ .happyforms-part--rating label {
916
+ fill: inherit;
917
+ color: inherit;
918
+ stroke: inherit;
919
+ }
920
+
921
+ .happyforms-part--rating .happyforms-star__label {
922
+ cursor: pointer;
923
+ float: left;
924
+ margin-right: 5px;
925
+ }
926
+
927
+ .happyforms-part--rating .happyforms-star__label {
928
+ color: #f39c00;
929
+ color: var(--happyforms-color-rating-hover);
930
+ }
931
+
932
+ .happyforms-part--rating:not(:hover) input:first-child:checked~label,
933
+ .happyforms-part--rating input:hover+label~label:not(:hover),
934
+ .happyforms-part--rating:hover input:checked+label:hover~label,
935
+ .happyforms-part--rating:not(:hover) input:checked+label~label {
936
+ color: #ccc;
937
+ color: var(--happyforms-color-rating);
938
+ }
939
+
940
+ /* parts - legal */
941
+
942
+ .happyforms-part--legal span {
943
+ margin-left: 5px;
944
+ font-weight: normal;
945
+ font-size: 16px;
946
+ font-size: var(--happyforms-part-value-font-size);
947
+ }
948
+
949
+ /* parts - address */
950
+
951
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part-el-wrap {
952
+ display: flex;
953
+ }
954
+
955
+ .happyforms-part--address .happyforms-part__el {
956
+ position: relative;
957
+ }
958
+
959
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el {
960
+ flex: 1;
961
+ }
962
+
963
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
964
+ padding-right: 2%;
965
+ }
966
+
967
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
968
+ padding-right: 1%;
969
+ }
970
+
971
+ .happyforms-form--part-outer-padding-wide .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
972
+ padding-right: 6%;
973
  }
974
 
975
+ .happyforms-part__el--address--results {
976
+ position: absolute;
977
+ z-index: 9999;
978
+ width: 100%;
979
+ margin: 2px 0 0;
980
+ padding: 0;
981
+ border-radius: 6px;
982
  }
983
 
984
+ .happyforms-part__el--address--results ul {
985
+ list-style-type: none;
986
+ padding: 0;
987
+ border: 1px solid;
988
+ border-color: #000;
989
+ border-color: var(--happyforms-color-part-border-focus);
990
+ border-radius: 6px;
991
+ background-color: #fff;
992
+ background-color: var(--happyforms-color-part-background);
993
  }
994
 
995
+ .happyforms-part__el--address--results ul li {
996
+ cursor: pointer;
997
+ list-style: none;
998
+ padding: 3px 10px;
999
+ border-bottom: 1px solid;
1000
+ border-color: #dbdbdb;
1001
+ border-color: var(--happyforms-color-part-border);
1002
+ font-size: 16px;
1003
+ font-size: var(--happyforms-part-value-font-size);
1004
+ color: #000;
1005
+ color: var(--happyforms-color-part-value);
1006
  }
1007
 
1008
+ .happyforms-part__el--address--results ul li:hover {
1009
+ border-color: #000;
1010
+ border-color: var(--happyforms-color-part-border-focus);
 
 
1011
  }
1012
 
1013
+ .happyforms-part__el--address--results-google ul:after {
1014
+ content: "";
1015
+ padding: 5px 10px 0;
1016
+ height: 16px;
1017
+ box-sizing: content-box;
1018
+ text-align: right;
1019
+ display: block;
1020
+ background-image: url(https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white3.png);
1021
+ background-position: calc(100% - 10px) center;
1022
+ background-repeat: no-repeat;
1023
+ background-size: 120px 14px;
1024
  }
1025
 
1026
+ /* submit button */
1027
+
1028
  .happyforms-part--submit {
1029
  width: 100%;
1030
  margin-bottom: 0;
1031
  }
1032
 
 
 
 
1033
  input[type=submit].happyforms-button--submit,
1034
  input[type=submit][disabled].happyforms-button--submit,
1035
  input[type=submit][disabled].happyforms-button--submit:hover {
1036
+ height: auto;
1037
  padding: 17px 50px;
1038
  border-radius: 6px;
1039
+ border: 1px solid transparent;
1040
+ border-color: var(--happyforms-color-submit-border);
1041
  font-weight: normal;
1042
  font-style: normal;
1043
  font-size: 18px;
1044
+ font-size: var(--happyforms-submit-button-font-size);
1045
  color: #fff;
1046
+ color: var(--happyforms-color-submit-text);
1047
  background-color: #000;
1048
+ background-color: var(--happyforms-color-submit-background);
1049
  text-transform: none;
1050
+ transition-property: all;
1051
+ transition-duration: 0.25s;
1052
+ transition-duration: var(--happyforms-transition-duration);
1053
  transition-timing-function: ease-in;
1054
  }
1055
 
 
 
1056
  input[type=submit][disabled].happyforms-button--submit,
1057
  input[type=submit][disabled].happyforms-button--submit:hover {
1058
  cursor: default;
1059
  opacity: 0.5;
1060
  }
1061
 
 
1062
  input[type=submit].happyforms-button--submit:hover {
1063
  border-radius: 6px;
1064
+ border-color: transparent;
1065
+ border-color: var(--happyforms-color-submit-border);
1066
+ background-color: #dbdbdb;
1067
+ background-color: var(--happyforms-color-submit-background-hover);
1068
+ text-transform: none;
1069
+ color: #000000;
1070
+ color: var(--happyforms-color-submit-text-hover);
1071
+ }
1072
+
1073
+ input[type=submit].happyforms-button--submit:focus {
1074
+ border-radius: 6px;
1075
+ border-color: transparent;
1076
+ border-color: var(--happyforms-color-submit-border);
1077
+ background-color: #dbdbdb;
1078
+ background-color: var(--happyforms-color-submit-background-focus);
1079
  text-transform: none;
1080
+ color: #000000;
1081
+ color: var(--happyforms-color-submit-text-hover);
1082
  }
1083
 
1084
+ /* notices */
1085
+
1086
  .happyforms-message-notice h2 {
1087
  margin-top: 0;
1088
  margin-bottom: 0;
1089
  font-weight: bold;
1090
  font-size: 14px !important;
1091
  padding: 20px;
1092
+ color: #000;
1093
+ color: var(--happyforms-color-primary);
1094
  }
1095
 
1096
  .happyforms-message-notice.error h2 {
1097
  margin-top: 0;
1098
  margin-bottom: 5px;
1099
  padding: 0;
 
1100
  font-weight: normal;
1101
+ color: #ff7550;
1102
+ color: var(--happyforms-color-error);
1103
  }
1104
 
1105
  .happyforms-message-notice.success h2,
1117
  border: 3px solid;
1118
  border-width: 3px;
1119
  border-color: #000;
1120
+ border-color: var(--happyforms-color-primary);
1121
+ background-color: transparent;
1122
  }
1123
 
1124
  .happyforms-message-notice.success h2 {
1125
  color: #39b54a;
1126
+ color: var(--happyforms-color-success);
1127
  }
1128
 
1129
  .happyforms-message-notice.error-submission {
1130
  border-color: #ff7550;
1131
+ border-color: var(--happyforms-color-error);
1132
  }
1133
 
1134
+ .happyforms-part .happyforms-message-notices {
1135
+ padding: 0;
1136
  }
1137
 
1138
+ .happyforms-part .happyforms-message-notices h2 {
1139
+ font-size: 14px;
 
 
1140
  }
1141
 
1142
+ .happyforms-part .happyforms-error+input,
1143
+ .happyforms-part .happyforms-error+textarea {
1144
+ border: 2px solid;
1145
+ border-color: #ff7550;
1146
+ border-color: var(--happyforms-color-error);
1147
+ }
1148
+
1149
+ .happyforms-form__title+.happyforms-message-notices {
1150
+ margin-top: 25px;
1151
+ }
1152
+
1153
+ /* umbrella classes */
1154
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=text],
1155
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=email],
1156
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=tel],
1157
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=number],
1158
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=range],
1159
+ .happyforms-form--part-border-radius-square .happyforms-part textarea,
1160
+ .happyforms-form--part-border-radius-square .happyforms-part select,
1161
+ .happyforms-form--part-border-radius-square .happyforms-part__el--address--results ul {
1162
+ border-radius: 0px;
1163
+ }
1164
+
1165
+ .happyforms-form--part-border-radius-square .happyforms-part--radio .option-label .border {
1166
+ border-radius: 0px;
1167
+ }
1168
+
1169
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=text],
1170
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=email],
1171
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=tel],
1172
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=number],
1173
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=range],
1174
+ .happyforms-form--part-border-radius-pill .happyforms-part textarea,
1175
+ .happyforms-form--part-border-radius-pill .happyforms-part select {
1176
+ border-radius: 25px;
1177
+ padding-left: 25px;
1178
+ padding-right: 25px;
1179
+ }
1180
+
1181
+ .happyforms-form--part-border-radius-pill .happyforms-part__el--address--results ul {
1182
+ border-radius: 25px;
1183
+ }
1184
+
1185
+ .happyforms-form--part-border-radius-pill .happyforms-part--radio .option-label .border {
1186
+ border-radius: 25px;
1187
+ }
1188
+
1189
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-webkit-input-placeholder {
1190
+ color: transparent;
1191
+ transition: color var(--happyforms-transition-duration);
1192
+ }
1193
+
1194
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-moz-placeholder {
1195
+ color: transparent;
1196
+ transition: color var(--happyforms-transition-duration);
1197
+ }
1198
+
1199
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-ms-placeholder {
1200
+ color: transparent;
1201
+ transition: color var(--happyforms-transition-duration);
1202
+ }
1203
+
1204
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::placeholder {
1205
+ color: transparent;
1206
+ transition: color var(--happyforms-transition-duration);
1207
+ }
1208
+
1209
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-webkit-input-placeholder {
1210
+ color: #aaa;
1211
+ }
1212
+
1213
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-moz-placeholder {
1214
+ color: #aaa;
1215
+ }
1216
+
1217
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-ms-placeholder {
1218
+ color: #aaa;
1219
+ }
1220
+
1221
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::placeholder {
1222
+ color: #aaa;
1223
  }
1224
 
1225
+ /* labels */
1226
+
1227
+ .happyforms-part--label-inside label {
1228
  position: absolute;
1229
+ top: 10px;
1230
+ left: 11px;
1231
+ }
1232
+
1233
+ .happyforms-part--label-inside input,
1234
+ .happyforms-part--label-inside textarea,
1235
+ .happyforms-part--label-as_placeholder input,
1236
+ .happyforms-part--label-as_placeholder textarea {
1237
+ padding-top: 35px !important;
1238
+ }
1239
+
1240
+ /* part borders */
1241
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=text],
1242
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=email],
1243
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=number],
1244
+ .happyforms-form--part-borders-bottom-only .happyforms-part textarea,
1245
+ .happyforms-form--part-borders-bottom-only .happyforms-part select {
1246
+ border-top-color: transparent;
1247
+ border-left-color: transparent;
1248
+ border-right-color: transparent;
1249
+ }
1250
+
1251
+ /* part border transitions */
1252
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=text],
1253
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=email],
1254
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=number],
1255
+ .happyforms-form--part-disable-transitions .happyforms-part textarea {
1256
+ transition-duration: 0s;
1257
+ }
1258
+
1259
+ .happyforms-part input[type=text],
1260
+ .happyforms-part input[type=email],
1261
+ .happyforms-part input[type=number],
1262
+ .happyforms-part textarea {
1263
+ transition: border-color 0.4s;
1264
+ transition: border-color var(--happyforms-transition-duration);
1265
+ }
1266
+
1267
+ /* part labels transitions */
1268
+ .happyforms-part--label-as_placeholder label {
1269
+ transition-duration: 0.4s;
1270
+ transition-duration: var(--happyforms-transition-duration);
1271
+ }
1272
+
1273
+ .happyforms-part--label-as_placeholder ::-webkit-input-placeholder {
1274
  opacity: 0;
 
 
 
 
 
 
 
 
 
 
1275
  }
1276
 
1277
+ .happyforms-part--label-as_placeholder ::-moz-placeholder {
1278
+ opacity: 0;
1279
  }
1280
 
1281
+ .happyforms-part--label-as_placeholder ::-ms-placeholder {
1282
+ opacity: 0;
 
 
 
1283
  }
1284
 
1285
+ .happyforms-part--label-as_placeholder ::placeholder {
1286
+ opacity: 0;
 
 
 
 
 
 
 
1287
  }
1288
 
1289
+ .happyforms-part--label-as_placeholder label {
 
1290
  position: absolute;
1291
+ left: 11px;
1292
+ top: 25px;
1293
+ transition-property: top;
 
 
 
1294
  }
1295
 
1296
+ .happyforms-part--label-as_placeholder input:focus~label,
1297
+ .happyforms-part--label-as_placeholder textarea:focus~label,
1298
+ .happyforms-part--label-as_placeholder.happyforms-part--filled input~label,
1299
+ .happyforms-part--label-as_placeholder.happyforms-part--filled textarea~label {
1300
+ top: 10px;
 
 
 
 
 
 
 
 
 
1301
  }
1302
 
1303
+ /* part padding */
1304
+
1305
+ .happyforms-form--part-outer-padding-narrow .happyforms-form__part {
1306
+ padding: 0 0.5%;
1307
  }
1308
 
1309
+ .happyforms-form--part-outer-padding-narrow .happyforms-part__select-wrap {
1310
+ padding: 0 0 0 1%;
 
 
 
1311
  }
1312
 
1313
+ .happyforms-form--part-outer-padding-narrow .happyforms-part-option {
1314
+ margin-right: -5px;
 
1315
  }
1316
 
1317
+ .happyforms-form--part-outer-padding-narrow .happyforms-part.display-type--block .happyforms-part-option {
1318
+ margin-right: 0;
1319
+ margin-bottom: 5px;
1320
  }
1321
 
1322
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--radio .option-label {
1323
+ margin-right: 15px;
1324
  }
1325
 
1326
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--checkbox.display-type--block .option-label {
1327
+ margin-bottom: 0;
1328
+ }
1329
+
1330
+ .happyforms-form--part-outer-padding-wide .happyforms-form__part {
1331
+ padding: 20px 3%;
1332
+ }
1333
+
1334
+ .happyforms-form--part-outer-padding-wide .happyforms-part .happyforms-part-option {
1335
+ margin-right: 15px;
1336
+ }
1337
+
1338
+ .happyforms-form--part-outer-padding-wide .happyforms-part.display-type--block .happyforms-part-option {
1339
+ margin-right: 0;
1340
+ margin-bottom: 35px;
1341
+ }
1342
+
1343
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=text],
1344
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=email],
1345
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=tel],
1346
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=number],
1347
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=range],
1348
+ .happyforms-form--part-inner-padding-narrow .happyforms-part textarea,
1349
+ .happyforms-form--part-inner-padding-narrow .happyforms-part select,
1350
+ .happyforms-form--part-inner-padding-narrow .happyforms-part .option-label {
1351
+ padding: 5px;
1352
+ }
1353
+
1354
+ .happyforms-form--part-inner-padding-narrow .happyforms-part--checkbox .option-label {
1355
+ margin-right: 0;
1356
+ margin-bottom: 0;
1357
+ padding-left: 0;
1358
+ padding-right: 0;
1359
+ }
1360
+
1361
+ .happyforms-form--part-inner-padding-narrow .happyforms-part--checkbox .option-label .label {
1362
+ padding-left: 5px;
1363
+ }
1364
+
1365
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=text],
1366
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=email],
1367
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=tel],
1368
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=number],
1369
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=range],
1370
+ .happyforms-form--part-inner-padding-wide .happyforms-part textarea,
1371
+ .happyforms-form--part-inner-padding-wide .happyforms-part select,
1372
+ .happyforms-form--part-inner-padding-wide .happyforms-part .option-label {
1373
+ padding: 15px;
1374
+ }
1375
+
1376
+ .happyforms-form--part-inner-padding-wide .happyforms-part--checkbox .option-label {
1377
+ padding-left: 0;
1378
+ padding-right: 0;
1379
+ margin-right: 30px;
1380
+ }
1381
+
1382
+ .happyforms-form--part-inner-padding-wide .happyforms-part--checkbox .option-label .label {
1383
+ padding-left: 15px;
1384
+ }
1385
+
1386
+ .happyforms-form--part-hide-labels .happyforms-part__label {
1387
  display: none;
1388
  }
1389
 
1390
+ /* submit button */
1391
+
1392
+ .happyforms-form--submit-button-border-hide input[type=submit].happyforms-button--submit {
1393
+ border-width: 0;
 
 
 
 
 
 
 
 
 
 
 
1394
  }
1395
 
1396
+ .happyforms-form--submit-button-border-radius-square input[type=submit].happyforms-button--submit {
1397
+ border-radius: 0;
 
 
 
 
 
 
1398
  }
1399
 
1400
+ .happyforms-form--submit-button-border-radius-pill input[type=submit].happyforms-button--submit {
1401
+ border-radius: 30px;
1402
  }
1403
 
1404
+ .happyforms-form--submit-button-fullwidth input[type=submit].happyforms-button--submit {
1405
+ width: 100%;
1406
  }
1407
 
1408
+ .happyforms-form--submit-button-align-center .happyforms-part--submit {
1409
+ text-align: center;
 
1410
  }
1411
 
1412
+ .happyforms-form--submit-button-align-right .happyforms-part--submit {
1413
+ text-align: right;
 
 
 
 
 
 
 
1414
  }
1415
 
1416
+ .happyforms-form--submit-button-bold .happyforms-part--submit input[type=submit] {
1417
+ font-weight: bold;
 
 
 
 
1418
  }
1419
 
1420
+ .happyforms-form--submit-button-disable-transitions input[type=submit] {
1421
+ transition-duration: 0s !important;
1422
+ }
1423
+
1424
+ .happyforms-form--part-title-font-weight-normal .happyforms-part__label .label {
1425
+ font-weight: normal;
1426
+ }
1427
+
1428
+ /* helpers */
1429
+ .happyforms-visuallyhidden {
1430
+ position: absolute;
1431
+ border: 0;
1432
+ clip: rect(0 0 0 0);
1433
+ width: 1px;
1434
+ height: 1px;
1435
+ margin: -1px;
1436
+ padding: 0;
1437
+ overflow: hidden;
1438
+ }
1439
+
1440
+ /* widget */
1441
+ .widget input[type=submit].happyforms-button--submit,
1442
+ .widget input[type=submit][disabled].happyforms-button--submit,
1443
+ .widget input[type=submit][disabled].happyforms-button--submit:hover {
1444
+ width: 100%;
1445
  }
inc/templates/preview-inline.css → assets/css/preview.css RENAMED
@@ -1,62 +1,73 @@
1
- body {
2
  background-color: #fff !important;
 
3
  }
 
4
  body::before, body::after {
5
  content: '';
6
  display: none;
7
  }
8
- .customize-partial-edit-shortcut {
9
- display: inline !important;
10
- left: 10px !important;
11
  }
 
 
 
 
 
 
 
12
  .notice {
13
- width: 100%;
14
- margin: 0 0 15px;
15
  }
 
16
  .notice-success {
17
  padding: 1px 12px;
18
  border-left: 4px solid #46b450;
19
  box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );
20
  background: #fff;
21
  }
 
22
  .notice p {
23
  margin: 10px 0;
24
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
25
  font-size: 13px;
26
  color: #444;
27
  }
 
28
  .notice a {
29
  color: #0073aa;
30
  text-decoration: underline;
31
  transition: color 0.05s ease-in-out;
 
32
  }
 
33
  .notice a:hover {
34
  color: #00a0d2;
35
  }
36
- .happyforms-form form {
37
- padding: 25px;
38
- }
39
- .happyforms-flex {
40
  padding: 2.5%;
41
  overflow: visible;
42
- }
43
- .happyforms-form h3.happyforms-form__title {
 
44
  display: flex !important;
45
  align-items: center;
46
  padding: 0;
47
- }
 
48
  .happyforms-preview-badge {
49
  padding-left: 10px;
50
  font-weight: 400;
51
  font-size: 16px;
52
  }
 
53
  .happyforms-part.highlighted {
54
  outline: 1px solid lightblue;
55
  }
 
56
  a.happyforms-ask-link {
57
  cursor: pointer !important;
58
  }
59
- .happyforms-part .widget .customize-partial-edit-shortcut,
60
- .customize-partial-edit-shortcut {
61
- top: 0;
62
- }
1
+ body.happyforms-preview {
2
  background-color: #fff !important;
3
+ padding: 40px;
4
  }
5
+
6
  body::before, body::after {
7
  content: '';
8
  display: none;
9
  }
10
+
11
+ .happyforms-block-editable {
12
+ position: relative;
13
  }
14
+
15
+ .customize-partial-edit-shortcut.happyforms-partial-edit-shortcut {
16
+ display: block;
17
+ position: absolute;
18
+ top: 0;
19
+ }
20
+
21
  .notice {
22
+ margin-bottom: 15px;
 
23
  }
24
+
25
  .notice-success {
26
  padding: 1px 12px;
27
  border-left: 4px solid #46b450;
28
  box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );
29
  background: #fff;
30
  }
31
+
32
  .notice p {
33
  margin: 10px 0;
34
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
35
  font-size: 13px;
36
  color: #444;
37
  }
38
+
39
  .notice a {
40
  color: #0073aa;
41
  text-decoration: underline;
42
  transition: color 0.05s ease-in-out;
43
+ cursor: auto;
44
  }
45
+
46
  .notice a:hover {
47
  color: #00a0d2;
48
  }
49
+
50
+ /*.happyforms-flex {
 
 
51
  padding: 2.5%;
52
  overflow: visible;
53
+ }*/
54
+
55
+ /*.happyforms-form h3.happyforms-form__title {
56
  display: flex !important;
57
  align-items: center;
58
  padding: 0;
59
+ }*/
60
+
61
  .happyforms-preview-badge {
62
  padding-left: 10px;
63
  font-weight: 400;
64
  font-size: 16px;
65
  }
66
+
67
  .happyforms-part.highlighted {
68
  outline: 1px solid lightblue;
69
  }
70
+
71
  a.happyforms-ask-link {
72
  cursor: pointer !important;
73
  }
 
 
 
 
assets/js/customize.js CHANGED
@@ -9,22 +9,16 @@
9
 
10
  classes.models.Form = Backbone.Model.extend( {
11
  idAttribute: 'ID',
12
-
13
  defaults: settings.form,
14
 
15
  getPreviewUrl: function() {
16
- var previewUrl;
17
-
18
- if (parseInt(this.id, 10) !== 0) {
19
- previewUrl = settings.baseUrl +
20
- '?post_type=' + this.get( 'post_type' ) +
21
- '&p=' + this.id +
22
- '&preview=true';
23
- } else {
24
- previewUrl = settings.baseUrl + '?happyformsNewForm'
25
- }
26
 
27
- return previewUrl;
28
  },
29
 
30
  isNew: function() {
@@ -80,6 +74,25 @@
80
  if ( ! this.id ) {
81
  this.set( 'id', _.uniqueId( this.get( 'type' ) + '_' ) );
82
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
84
  } );
85
 
@@ -118,20 +131,24 @@
118
  initialize: function( options ) {
119
  Backbone.Router.prototype.initialize( this, arguments );
120
 
 
 
 
 
121
  this.parts = new Backbone.Collection();
122
  this.parts.reset( _( settings.formParts ).values() );
123
- this.form = new classes.models.Form( options.form, { silent: true } );
124
  this.actions = new classes.views.Actions( { model: this.form } ).render();
125
  this.sidebar = new classes.views.Sidebar( { model: this.form } ).render();
126
 
127
- this.listenTo( this, 'route', this.onRoute );
128
- this.listenTo( this, 'happyforms-pencil-click', this.onPreviewPencilClick );
129
  },
130
 
131
  flushBuffer: function() {
132
  if ( this.buffer.length > 0 ) {
133
  _.each( this.buffer, function( response ) {
134
- api.previewer.trigger( 'happyforms-form-part-added', response );
135
  } );
136
 
137
  this.buffer = [];
@@ -201,32 +218,6 @@
201
  // noop
202
  },
203
 
204
- onPreviewPencilClick: function( data ) {
205
- if ( ! data.step || data.step !== 'build' ) {
206
- happyForms.navigate( 'setup', { trigger: true } );
207
-
208
- var $input = $( '[data-attribute='+ data.field_name + ']' );
209
-
210
- $input.focus();
211
- } else {
212
- happyForms.navigate( 'build', { trigger: true } );
213
-
214
- if (data.part_id) {
215
- var $partWidget = $( '[data-part-id="' + data.part_id + '"]' );
216
-
217
- if ( ! $partWidget.hasClass( 'happyforms-widget-expanded' ) ) {
218
- $partWidget.find( '.toggle-indicator' ).click();
219
- }
220
-
221
- $partWidget.find( 'input[data-bind=label]' ).focus();
222
- } else {
223
- var $input = $('[name='+ data.field_name +']');
224
-
225
- $input.focus();
226
- }
227
- }
228
- },
229
-
230
  } );
231
 
232
  classes.views.Base = Backbone.View.extend( {
@@ -445,6 +436,7 @@
445
  this.partViews = new Backbone.Collection();
446
 
447
  this.listenTo( happyForms, 'part-add', this.onPartAdd );
 
448
  this.listenTo( this.model.get( 'parts' ), 'add', this.onPartModelAdd );
449
  this.listenTo( this.model.get( 'parts' ), 'remove', this.onPartModelRemove );
450
  this.listenTo( this.model.get( 'parts' ), 'change', this.onPartModelChange );
@@ -488,17 +480,9 @@
488
  onNameChange: function( e ) {
489
  e.preventDefault();
490
 
491
- var $el = $( e.target );
492
- var value = $el.val();
493
-
494
  this.model.set( 'post_title', value );
495
-
496
- if (happyForms.previewLoaded) {
497
- api.previewer.trigger( 'happyforms-part-dom-update', {
498
- selector: '.happyforms-form__title .title',
499
- text: value
500
- } );
501
- }
502
  },
503
 
504
  onExpandCollapseAllClick: function(e) {
@@ -539,29 +523,35 @@
539
  this.model.get( 'parts' ).add( partModel, options );
540
  this.model.trigger( 'change', this.model );
541
 
542
- var request = wp.ajax.post( 'happyforms-form-part-added', {
543
- 'happyforms-nonce': api.settings.nonce.happyforms,
544
- happyforms: 1,
545
- wp_customize: 'on',
546
- form_id: this.model.id,
547
- part: partModel.toJSON(),
548
  } );
 
549
 
550
- request.done( function( response ) {
551
- var template = _.template( response.template );
552
- var html = template( self.model.toJSON() );
553
- response.html = html;
 
 
 
 
 
554
 
555
- if (happyForms.previewLoaded) {
556
- api.previewer.trigger( 'happyforms-form-part-added', response );
 
 
 
 
557
  } else {
558
  happyForms.buffer.push( response );
559
  }
560
  } );
561
-
562
- request.fail( function( response ) {
563
- // noop
564
- } );
565
  },
566
 
567
  onPartModelAdd: function( partModel, partsCollection, options ) {
@@ -577,11 +567,8 @@
577
 
578
  this.partViews.remove( partViewModel );
579
 
580
- if (happyForms.previewLoaded) {
581
- api.previewer.trigger( 'happyforms-form-part-removed', {
582
- form_id: this.model.id,
583
- part_id: partModel.id,
584
- } );
585
  }
586
  },
587
 
@@ -593,15 +580,10 @@
593
  this.partViews.reset( _.map( this.model.get( 'parts' ).pluck( 'id' ), function( id ) {
594
  return this.partViews.get( id );
595
  }, this ) );
596
-
597
  this.model.trigger( 'change' );
598
 
599
- if (happyForms.previewLoaded) {
600
- api.previewer.trigger( 'happyforms-form-parts-sorted', {
601
- form_id: this.model.id,
602
- part_ids: this.model.get( 'parts' ).pluck( 'id' ),
603
- } );
604
- }
605
  },
606
 
607
  addViewPart: function( partModel, options ) {
@@ -618,14 +600,20 @@
618
  view: partView,
619
  } );
620
 
621
- this.partViews.add( partViewModel );
622
  },
623
 
624
- onPartViewAdd: function( viewModel ) {
625
  var partView = viewModel.get( 'view' );
626
  $( '.happyforms-form-widgets', this.$el ).append( partView.render().$el );
627
  partView.trigger( 'ready' );
628
-
 
 
 
 
 
 
629
  this.showExpandCollapseButton();
630
  },
631
 
@@ -728,10 +716,13 @@
728
  } );
729
 
730
  classes.views.Part = classes.views.Base.extend( {
 
 
731
  events: {
732
  'click .toggle-indicator': 'onWidgetToggle',
733
  'click .happyforms-form-part-close': 'onWidgetToggle',
734
  'click .happyforms-form-part-remove': 'onPartRemoveClick',
 
735
  'keyup [data-bind]': 'onInputChange',
736
  'change [data-bind]': 'onInputChange',
737
  'mouseover': 'onMouseOver',
@@ -744,16 +735,19 @@
744
  this.settings = options.settings;
745
 
746
  // listen to changes in common settings
747
- this.listenTo(this.model, 'change:label', this.onPartLabelChange);
748
- this.listenTo(this.model, 'change:width', this.onPartWidthChange);
749
- this.listenTo(this.model, 'change:required', this.onRequiredCheckboxChange);
750
- this.listenTo(this.model, 'change:placeholder', this.onPlaceholderChange);
751
- this.listenTo(this.model, 'change:description', this.onDescriptionChange);
752
- this.listenTo(this.model, 'change:tooltip_description', this.onTooltipDescriptionChange);
753
- this.listenTo(this.model, 'change:label_placement', this.onLabelPlacementChange);
754
-
755
- this.listenTo(this, 'widget-expand', this.expand);
756
- this.listenTo(this, 'widget-collapse', this.collapse);
 
 
 
757
 
758
  if ( options.expand ) {
759
  this.listenTo( this, 'ready', this.expandToggle );
@@ -777,9 +771,12 @@
777
  * @return void
778
  */
779
  onMouseOver: function() {
780
- if (happyForms.previewLoaded) {
781
- api.previewer.trigger( 'happyforms-part-mouseover', this.model.get( 'id' ) );
782
- }
 
 
 
783
  },
784
 
785
  /**
@@ -790,9 +787,12 @@
790
  * @return void
791
  */
792
  onMouseOut: function() {
793
- if (happyForms.previewLoaded) {
794
- api.previewer.trigger( 'happyforms-part-mouseout', this.model.get( 'id' ) );
795
- }
 
 
 
796
  },
797
 
798
  /**
@@ -803,13 +803,12 @@
803
  * @return void
804
  */
805
  onPartLabelChange: function() {
806
- var eventData = {
807
- part_id: this.model.id,
808
- selector: '.happyforms-part__label .label',
809
- text: this.model.get( 'label' )
810
  };
811
 
812
- api.previewer.trigger( 'happyforms-part-dom-update', eventData );
813
  },
814
 
815
  /**
@@ -819,30 +818,13 @@
819
  *
820
  * @return void
821
  */
822
- onPartWidthChange: function(model, value, options) {
823
- var width = this.model.get( 'width' );
824
-
825
- var $select = this.$el.find('[data-bind=width]');
826
-
827
- if ($select.val() !== width) {
828
- $select.val(width);
829
- }
830
-
831
- if (!options.skipGlobalReveal) {
832
- var $globalWrap = this.$el.find('.width-options');
833
- // reset global checkbox
834
- $globalWrap.find('input').prop('checked', false);
835
- // fade in the global checkbox wrapper
836
- $globalWrap.fadeIn();
837
- }
838
-
839
- var eventData = {
840
- part_id: this.model.id,
841
- selector: 'self',
842
- width: width
843
  };
844
 
845
- api.previewer.trigger( 'happyforms-part-width-change', eventData );
846
  },
847
 
848
  /**
@@ -853,21 +835,12 @@
853
  * @return void
854
  */
855
  onRequiredCheckboxChange: function() {
856
- var required = this.model.get( 'required' );
857
-
858
- var eventData = {
859
- part_id: this.model.id,
860
- selector: '.happyforms-required',
861
- attributes: {}
862
  };
863
 
864
- if ( parseInt(required, 10 ) === 1) {
865
- eventData.attributes.style = 'display: inline';
866
- } else {
867
- eventData.attributes.style = 'display: none';
868
- }
869
-
870
- api.previewer.trigger( 'happyforms-part-dom-update', eventData );
871
  },
872
 
873
  /**
@@ -887,9 +860,9 @@
887
 
888
  /**
889
  * Expand part view.
890
- *
891
  * @since 1.1.0.
892
- *
893
  * @return void
894
  */
895
  expand: function() {
@@ -902,9 +875,9 @@
902
 
903
  /**
904
  * Collapse part view.
905
- *
906
  * @since 1.1.0.
907
- *
908
  * @return void
909
  */
910
  collapse: function() {
@@ -914,7 +887,7 @@
914
  $el.removeClass('happyforms-widget-expanded');
915
  });
916
  },
917
-
918
  /**
919
  * Call expandToggle method on toggle indicator click or 'Close' button click of the part view in Customize pane.
920
  *
@@ -940,6 +913,15 @@
940
  this.model.collection.remove( this.model );
941
  },
942
 
 
 
 
 
 
 
 
 
 
943
  /**
944
  * Update model with the changed data. Triggered on change event of inputs in the part view.
945
  *
@@ -952,8 +934,19 @@
952
  var value = $el.val();
953
  var attribute = $el.data( 'bind' );
954
 
955
- if ($el.is(':checkbox')) {
956
- if ($el.is(':checked')) {
 
 
 
 
 
 
 
 
 
 
 
957
  value = 1;
958
  } else {
959
  value = 0;
@@ -971,15 +964,12 @@
971
  * @return void
972
  */
973
  onPlaceholderChange: function() {
974
- var eventData = {
975
- part_id: this.model.id,
976
- selector: 'input',
977
- attributes: {
978
- 'placeholder': this.model.get('placeholder')
979
- }
980
  };
981
 
982
- api.previewer.trigger('happyforms-part-dom-update', eventData);
983
  },
984
 
985
  /**
@@ -989,20 +979,20 @@
989
  *
990
  * @return void
991
  */
992
- onDescriptionChange: function() {
993
- if (this.model.get('description').length) {
994
- this.$el.find('.tooltip-description-wrap').fadeIn();
 
 
 
 
 
995
  } else {
996
- this.$el.find('.tooltip-description-wrap').hide();
 
997
  }
998
 
999
- var eventData = {
1000
- part_id: this.model.id,
1001
- selector: '.happyforms-part__description',
1002
- text: this.model.get('description')
1003
- };
1004
-
1005
- api.previewer.trigger('happyforms-part-dom-update', eventData);
1006
  },
1007
 
1008
  /**
@@ -1013,33 +1003,12 @@
1013
  * @return void
1014
  */
1015
  onTooltipDescriptionChange: function() {
1016
- var tooltipDisplayValue = 'none';
1017
- var descriptionDisplayValue = 'block';
1018
-
1019
- if (this.model.get('tooltip_description') === 1) {
1020
- tooltipDisplayValue = 'inline-block';
1021
- descriptionDisplayValue = 'none';
1022
- }
1023
-
1024
- var descriptionEventData = {
1025
- part_id: this.model.id,
1026
- selector: '.happyforms-tooltip + .happyforms-part__description',
1027
- css: {
1028
- display: descriptionDisplayValue
1029
- }
1030
- };
1031
-
1032
- api.previewer.trigger('happyforms-part-dom-update', descriptionEventData);
1033
-
1034
- var tooltipEventData = {
1035
- part_id: this.model.id,
1036
- selector: '.happyforms-part__tooltip',
1037
- css: {
1038
- display: tooltipDisplayValue
1039
- }
1040
  };
1041
 
1042
- api.previewer.trigger('happyforms-part-dom-update', tooltipEventData);
1043
  },
1044
 
1045
  /**
@@ -1049,39 +1018,36 @@
1049
  *
1050
  * @return void
1051
  */
1052
- onLabelPlacementChange: function(model, value, options) {
1053
- var $select = this.$el.find('[data-bind=label_placement]');
 
1054
 
1055
- if ($select.val() !== this.model.get('label_placement')) {
1056
- $select.val(this.model.get('label_placement'));
1057
- }
1058
-
1059
- if (!options.skipGlobalReveal) {
1060
- var $globalWrap = this.$el.find('.label_placement-options');
1061
  // reset global checkbox
1062
- $globalWrap.find('input').prop('checked', false);
1063
  // fade in the global checkbox wrapper
1064
  $globalWrap.fadeIn();
1065
  }
1066
 
1067
- var eventData = {
1068
- part_id: this.model.id,
1069
- selector: 'self',
1070
- };
1071
-
1072
- var removalData = _.extend(eventData, {
1073
- classes: 'happyforms-part--label-above happyforms-part--label-below happyforms-part--label-left happyforms-part--label-right',
1074
- classMethod: 'remove'
1075
- });
1076
 
1077
- api.previewer.trigger('happyforms-part-dom-update', removalData);
 
 
1078
 
1079
- var addData = _.extend(eventData, {
1080
- classes: 'happyforms-part--label-' + this.model.get('label_placement'),
1081
- classMethod: 'add'
1082
- });
 
 
1083
 
1084
- api.previewer.trigger('happyforms-part-dom-update', addData);
1085
  },
1086
 
1087
  applyOptionGlobally: function(e) {
@@ -1099,6 +1065,18 @@
1099
  }
1100
  }
1101
  });
 
 
 
 
 
 
 
 
 
 
 
 
1102
  }
1103
  } );
1104
 
@@ -1120,6 +1098,8 @@
1120
 
1121
  initialize: function() {
1122
  classes.views.Base.prototype.initialize.apply( this, arguments );
 
 
1123
  },
1124
 
1125
  render: function() {
@@ -1162,7 +1142,6 @@
1162
  },
1163
  open: function( e, ui ) {
1164
  ui.pointer.css( 'margin-left', '-1px' );
1165
-
1166
  },
1167
  close: function( e, ui ) {
1168
  ui.pointer.css( 'margin-left', '0' );
@@ -1198,7 +1177,7 @@
1198
  this.model.set( attribute, value );
1199
 
1200
  if ( $el.data( 'preview-selector' ) && happyForms.previewLoaded ) {
1201
- api.previewer.trigger( 'happyforms-part-dom-update', {
1202
  selector: $el.data( 'preview-selector' ),
1203
  text: value,
1204
  } );
@@ -1225,6 +1204,16 @@
1225
  }
1226
  },
1227
 
 
 
 
 
 
 
 
 
 
 
1228
  remove: function() {
1229
  _.each( this.editorIds, function( editorId ) {
1230
  wp.editor.remove( editorId );
@@ -1240,12 +1229,17 @@
1240
  events: {
1241
  'click h3.accordion-section-title': 'onGroupClick',
1242
  'click .customize-panel-back': 'onGroupBackClick',
1243
- 'change input[type=checkbox]': 'onCheckboxChange',
1244
- 'keyup #hf_style_required_text': 'onRequiredTextChange',
1245
- 'change #hf_style_disable_button_until_required_filled': 'onDisableButtonChange',
1246
- 'change .happyforms-buttonset-container input': 'onInputChange',
1247
- 'change input[type=number]': 'onInputChange',
1248
- 'change select': 'onInputChange'
 
 
 
 
 
1249
  },
1250
 
1251
  initialize: function() {
@@ -1265,26 +1259,89 @@
1265
  this.initButtonSet();
1266
  },
1267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1268
  onGroupClick: function( e ) {
1269
  e.preventDefault();
1270
 
1271
- $( '.happyforms-style-controls-group', this.$el ).addClass( 'inactive' );
1272
 
1273
- $( e.target ).next().removeClass( 'inactive' );
 
 
1274
 
1275
- $( '.happyforms-style-controls', this.$el ).animate( {
1276
- left: '-300px',
1277
- }, 200 );
1278
  },
1279
 
1280
  onGroupBackClick: function( e ) {
1281
  e.preventDefault();
1282
 
1283
- $( '.happyforms-style-controls', this.$el ).animate( {
1284
- left: '0px',
1285
- }, 200, function() {
1286
- $( '.happyforms-style-controls-group', this.$el ).addClass( 'inactive' );
1287
- } );
 
 
 
 
 
 
1288
  },
1289
 
1290
  initButtonSet: function() {
@@ -1296,15 +1353,21 @@
1296
  var $colorInputs = $( '.happyforms-color-input', this.$el );
1297
 
1298
  $colorInputs.each( function( index, el ) {
 
 
 
1299
  $( el ).wpColorPicker( {
1300
  change: function( e, ui ) {
1301
- var $this = $( this );
1302
 
1303
- self.model.set( $this.attr( 'data-attribute' ), ui.color.toString() );
1304
 
1305
- if (happyForms.previewLoaded) {
1306
- api.previewer.trigger( 'happyforms-style-update', self.model );
1307
- }
 
 
 
1308
  }
1309
  } );
1310
 
@@ -1315,10 +1378,6 @@
1315
  var value = $( el ).attr( 'data-default' );
1316
 
1317
  self.model.set( attribute, value );
1318
-
1319
- if (happyForms.previewLoaded) {
1320
- api.previewer.trigger( 'happyforms-style-update', self.model );
1321
- }
1322
  } );
1323
  } );
1324
  },
@@ -1327,8 +1386,13 @@
1327
  var self = this;
1328
  var $container = this.$el.find( '.happyforms-range-control' );
1329
 
1330
- $container.each( function( el, index ) {
1331
- var $this = $( this );
 
 
 
 
 
1332
  var $slider = $( '.happyforms-range-slider', $this );
1333
  var $sliderInput = $( 'input', $this );
1334
 
@@ -1347,9 +1411,12 @@
1347
  $sliderInput.val( ui.value );
1348
  self.model.set( $sliderInput.attr( 'data-attribute' ), ui.value );
1349
 
1350
- if (happyForms.previewLoaded) {
1351
- api.previewer.trigger( 'happyforms-style-update', self.model );
1352
- }
 
 
 
1353
  }
1354
  } );
1355
  } );
@@ -1362,7 +1429,7 @@
1362
  this.model.set( $el.attr( 'data-attribute' ), value );
1363
 
1364
  if (happyForms.previewLoaded) {
1365
- api.previewer.trigger( 'happyforms-style-update', this.model );
1366
  }
1367
  },
1368
 
@@ -1385,7 +1452,7 @@
1385
  eventData.attributes = 'disabled';
1386
  }
1387
 
1388
- api.previewer.trigger('happyforms-part-dom-update', eventData);
1389
  }
1390
  },
1391
 
@@ -1398,7 +1465,7 @@
1398
  };
1399
 
1400
  this.model.set( $el.attr( 'data-attribute' ), value );
1401
- api.previewer.trigger( 'happyforms-part-dom-update', eventData );
1402
  },
1403
 
1404
  onInputChange: function( e ) {
@@ -1408,7 +1475,7 @@
1408
  this.model.set( $el.attr('data-attribute'), value );
1409
 
1410
  if ( happyForms.previewLoaded ) {
1411
- api.previewer.trigger('happyforms-style-update', this.model);
1412
  }
1413
  }
1414
  } );
@@ -1432,17 +1499,194 @@
1432
  },
1433
  } );
1434
 
1435
- happyForms = window.happyForms = new HappyForms( { form: _happyFormsSettings.form } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1436
  happyForms.classes = classes;
1437
  happyForms.factory = PartFactory;
 
1438
 
1439
  api.bind( 'ready', function() {
1440
- Backbone.history.start();
1441
- api.previewer.previewUrl( happyForms.form.getPreviewUrl() );
 
1442
 
1443
- api.previewer.bind( 'happyforms-preview-ready', function() {
1444
- happyForms.previewLoaded = true;
1445
  happyForms.flushBuffer();
 
1446
  } );
1447
  } );
1448
 
9
 
10
  classes.models.Form = Backbone.Model.extend( {
11
  idAttribute: 'ID',
 
12
  defaults: settings.form,
13
 
14
  getPreviewUrl: function() {
15
+ var previewUrl =
16
+ settings.baseUrl +
17
+ '?post_type=' + this.get( 'post_type' ) +
18
+ '&p=' + this.id +
19
+ '&preview=true';
 
 
 
 
 
20
 
21
+ return previewUrl;
22
  },
23
 
24
  isNew: function() {
74
  if ( ! this.id ) {
75
  this.set( 'id', _.uniqueId( this.get( 'type' ) + '_' ) );
76
  }
77
+ },
78
+
79
+ fetchHtml: function( success ) {
80
+ var data = {
81
+ action: 'happyforms-form-part-add',
82
+ 'happyforms-nonce': api.settings.nonce.happyforms,
83
+ happyforms: 1,
84
+ wp_customize: 'on',
85
+ form_id: happyForms.form.id,
86
+ part: this.toJSON(),
87
+ };
88
+
89
+ var request = $.ajax( ajaxurl, {
90
+ type: 'post',
91
+ dataType: 'html',
92
+ data: data
93
+ } );
94
+
95
+ request.done( success );
96
  }
97
  } );
98
 
131
  initialize: function( options ) {
132
  Backbone.Router.prototype.initialize( this, arguments );
133
 
134
+ this.listenTo( this, 'route', this.onRoute );
135
+ },
136
+
137
+ start: function( options ) {
138
  this.parts = new Backbone.Collection();
139
  this.parts.reset( _( settings.formParts ).values() );
140
+ this.form = new classes.models.Form( settings.form, { silent: true } );
141
  this.actions = new classes.views.Actions( { model: this.form } ).render();
142
  this.sidebar = new classes.views.Sidebar( { model: this.form } ).render();
143
 
144
+ Backbone.history.start();
145
+ api.previewer.previewUrl( this.form.getPreviewUrl() );
146
  },
147
 
148
  flushBuffer: function() {
149
  if ( this.buffer.length > 0 ) {
150
  _.each( this.buffer, function( response ) {
151
+ api.previewer.send( 'happyforms-form-part-add', response );
152
  } );
153
 
154
  this.buffer = [];
218
  // noop
219
  },
220
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
  } );
222
 
223
  classes.views.Base = Backbone.View.extend( {
436
  this.partViews = new Backbone.Collection();
437
 
438
  this.listenTo( happyForms, 'part-add', this.onPartAdd );
439
+ this.listenTo( happyForms, 'part-duplicate', this.onPartDuplicate );
440
  this.listenTo( this.model.get( 'parts' ), 'add', this.onPartModelAdd );
441
  this.listenTo( this.model.get( 'parts' ), 'remove', this.onPartModelRemove );
442
  this.listenTo( this.model.get( 'parts' ), 'change', this.onPartModelChange );
480
  onNameChange: function( e ) {
481
  e.preventDefault();
482
 
483
+ var value = $( e.target ).val();
 
 
484
  this.model.set( 'post_title', value );
485
+ api.previewer.send( 'happyforms-form-title-update', value );
 
 
 
 
 
 
486
  },
487
 
488
  onExpandCollapseAllClick: function(e) {
523
  this.model.get( 'parts' ).add( partModel, options );
524
  this.model.trigger( 'change', this.model );
525
 
526
+ partModel.fetchHtml( function( response ) {
527
+ if ( happyForms.previewer.ready ) {
528
+ api.previewer.send( 'happyforms-form-part-add', response );
529
+ } else {
530
+ happyForms.buffer.push( response );
531
+ }
532
  } );
533
+ },
534
 
535
+ onPartDuplicate: function( part, options ) {
536
+ var attrs = part.toJSON();
537
+ delete attrs.id;
538
+ attrs.label += ' (Copy)';
539
+
540
+ var duplicate = PartFactory.model(
541
+ attrs,
542
+ { collection: this.model.get( 'parts' ) },
543
+ );
544
 
545
+ this.model.get( 'parts' ).add( duplicate, options );
546
+ this.model.trigger( 'change', this.model );
547
+
548
+ duplicate.fetchHtml( function( response ) {
549
+ if ( happyForms.previewer.ready ) {
550
+ api.previewer.send( 'happyforms-form-part-add', response );
551
  } else {
552
  happyForms.buffer.push( response );
553
  }
554
  } );
 
 
 
 
555
  },
556
 
557
  onPartModelAdd: function( partModel, partsCollection, options ) {
567
 
568
  this.partViews.remove( partViewModel );
569
 
570
+ if ( happyForms.previewer.ready ) {
571
+ api.previewer.send( 'happyforms-form-part-remove', partModel.id );
 
 
 
572
  }
573
  },
574
 
580
  this.partViews.reset( _.map( this.model.get( 'parts' ).pluck( 'id' ), function( id ) {
581
  return this.partViews.get( id );
582
  }, this ) );
 
583
  this.model.trigger( 'change' );
584
 
585
+ var ids = this.model.get( 'parts' ).pluck( 'id' );
586
+ api.previewer.send( 'happyforms-form-parts-sort', ids );
 
 
 
 
587
  },
588
 
589
  addViewPart: function( partModel, options ) {
600
  view: partView,
601
  } );
602
 
603
+ this.partViews.add( partViewModel, options );
604
  },
605
 
606
+ onPartViewAdd: function( viewModel, collection, options ) {
607
  var partView = viewModel.get( 'view' );
608
  $( '.happyforms-form-widgets', this.$el ).append( partView.render().$el );
609
  partView.trigger( 'ready' );
610
+
611
+ if ( options.scrollto ) {
612
+ this.$el.parent().animate( {
613
+ scrollTop: partView.$el.position().top
614
+ }, 400 );
615
+ }
616
+
617
  this.showExpandCollapseButton();
618
  },
619
 
716
  } );
717
 
718
  classes.views.Part = classes.views.Base.extend( {
719
+ $: $,
720
+
721
  events: {
722
  'click .toggle-indicator': 'onWidgetToggle',
723
  'click .happyforms-form-part-close': 'onWidgetToggle',
724
  'click .happyforms-form-part-remove': 'onPartRemoveClick',
725
+ 'click .happyforms-form-part-duplicate': 'onPartDuplicateClick',
726
  'keyup [data-bind]': 'onInputChange',
727
  'change [data-bind]': 'onInputChange',
728
  'mouseover': 'onMouseOver',
735
  this.settings = options.settings;
736
 
737
  // listen to changes in common settings
738
+ this.listenTo( this.model, 'change:label', this.onPartLabelChange );
739
+ this.listenTo( this.model, 'change:width', this.onPartWidthChange );
740
+ this.listenTo( this.model, 'change:required', this.onRequiredCheckboxChange );
741
+ this.listenTo( this.model, 'change:placeholder', this.onPlaceholderChange );
742
+ this.listenTo( this.model, 'change:description', this.onDescriptionChange );
743
+ this.listenTo( this.model, 'change:tooltip_description', this.onTooltipDescriptionChange );
744
+ this.listenTo( this.model, 'change:label_placement', this.onLabelPlacementChange );
745
+ this.listenTo( this.model, 'change:css_class', this.onCSSClassChange );
746
+ this.listenTo( this, 'reveal-tooltip-checkbox', this.onRevealTooltipCheckbox );
747
+ this.listenTo( this, 'conceal-tooltip-checkbox', this.onConcealTooltipCheckbox );
748
+
749
+ this.listenTo( this, 'widget-expand', this.expand );
750
+ this.listenTo( this, 'widget-collapse', this.collapse );
751
 
752
  if ( options.expand ) {
753
  this.listenTo( this, 'ready', this.expandToggle );
771
  * @return void
772
  */
773
  onMouseOver: function() {
774
+ var data = {
775
+ id: this.model.id,
776
+ callback: 'onPartMouseOverCallback',
777
+ };
778
+
779
+ api.previewer.send( 'happyforms-part-dom-update', data );
780
  },
781
 
782
  /**
787
  * @return void
788
  */
789
  onMouseOut: function() {
790
+ var data = {
791
+ id: this.model.id,
792
+ callback: 'onPartMouseOutCallback',
793
+ };
794
+
795
+ api.previewer.send( 'happyforms-part-dom-update', data );
796
  },
797
 
798
  /**
803
  * @return void
804
  */
805
  onPartLabelChange: function() {
806
+ var data = {
807
+ id: this.model.id,
808
+ callback: 'onPartLabelChangeCallback',
 
809
  };
810
 
811
+ api.previewer.send( 'happyforms-part-dom-update', data );
812
  },
813
 
814
  /**
818
  *
819
  * @return void
820
  */
821
+ onPartWidthChange: function( model, value, options ) {
822
+ var data = {
823
+ id: this.model.id,
824
+ callback: 'onPartWidthChangeCallback',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
  };
826
 
827
+ api.previewer.send( 'happyforms-part-dom-update', data );
828
  },
829
 
830
  /**
835
  * @return void
836
  */
837
  onRequiredCheckboxChange: function() {
838
+ var data = {
839
+ id: this.model.id,
840
+ callback: 'onRequiredCheckboxChangeCallback',
 
 
 
841
  };
842
 
843
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
 
 
 
 
 
844
  },
845
 
846
  /**
860
 
861
  /**
862
  * Expand part view.
863
+ *
864
  * @since 1.1.0.
865
+ *
866
  * @return void
867
  */
868
  expand: function() {
875
 
876
  /**
877
  * Collapse part view.
878
+ *
879
  * @since 1.1.0.
880
+ *
881
  * @return void
882
  */
883
  collapse: function() {
887
  $el.removeClass('happyforms-widget-expanded');
888
  });
889
  },
890
+
891
  /**
892
  * Call expandToggle method on toggle indicator click or 'Close' button click of the part view in Customize pane.
893
  *
913
  this.model.collection.remove( this.model );
914
  },
915
 
916
+ onPartDuplicateClick: function( e ) {
917
+ e.preventDefault();
918
+
919
+ happyForms.trigger( 'part-duplicate', this.model, {
920
+ expand: true,
921
+ scrollto: true,
922
+ } );
923
+ },
924
+
925
  /**
926
  * Update model with the changed data. Triggered on change event of inputs in the part view.
927
  *
934
  var value = $el.val();
935
  var attribute = $el.data( 'bind' );
936
 
937
+ if ( 'label' === attribute ) {
938
+ var $inWidgetTitle = this.$el.find('.in-widget-title');
939
+ $inWidgetTitle.find('span').text(value);
940
+
941
+ if ( value ) {
942
+ $inWidgetTitle.show();
943
+ } else {
944
+ $inWidgetTitle.hide();
945
+ }
946
+ }
947
+
948
+ if ( $el.is(':checkbox') ) {
949
+ if ( $el.is(':checked') ) {
950
  value = 1;
951
  } else {
952
  value = 0;
964
  * @return void
965
  */
966
  onPlaceholderChange: function() {
967
+ var data = {
968
+ id: this.model.id,
969
+ callback: 'onPlaceholderChangeCallback',
 
 
 
970
  };
971
 
972
+ api.previewer.send( 'happyforms-part-dom-update', data );
973
  },
974
 
975
  /**
979
  *
980
  * @return void
981
  */
982
+ onDescriptionChange: function( model, value ) {
983
+ var data = {
984
+ id: this.model.id,
985
+ callback: 'onDescriptionChangeCallback',
986
+ };
987
+
988
+ if ( value ) {
989
+ this.trigger('reveal-tooltip-checkbox');
990
  } else {
991
+ model.set('tooltip_description', 0);
992
+ this.trigger('conceal-tooltip-checkbox');
993
  }
994
 
995
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
 
 
 
 
 
996
  },
997
 
998
  /**
1003
  * @return void
1004
  */
1005
  onTooltipDescriptionChange: function() {
1006
+ var data = {
1007
+ id: this.model.id,
1008
+ callback: 'onTooltipDescriptionChangeCallback',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1009
  };
1010
 
1011
+ api.previewer.send( 'happyforms-part-dom-update', data );
1012
  },
1013
 
1014
  /**
1018
  *
1019
  * @return void
1020
  */
1021
+ onLabelPlacementChange: function( model, value, options ) {
1022
+ var $select = $( '[data-bind=label_placement]', this.$el );
1023
+ $select.val( this.model.get( 'label_placement' ) );
1024
 
1025
+ if ( ! options.skipGlobalReveal ) {
1026
+ var $globalWrap = this.$( '.label_placement-options', this.$el );
 
 
 
 
1027
  // reset global checkbox
1028
+ this.$( 'input', $globalWrap ).prop( 'checked', false );
1029
  // fade in the global checkbox wrapper
1030
  $globalWrap.fadeIn();
1031
  }
1032
 
1033
+ this.model.fetchHtml( function( response ) {
1034
+ var data = {
1035
+ id: model.get( 'id' ),
1036
+ html: response,
1037
+ };
 
 
 
 
1038
 
1039
+ api.previewer.send( 'happyforms-form-part-refresh', data );
1040
+ } );
1041
+ },
1042
 
1043
+ onCSSClassChange: function( model, value, options ) {
1044
+ var data = {
1045
+ id: this.model.id,
1046
+ callback: 'onCSSClassChangeCallback',
1047
+ options: options,
1048
+ };
1049
 
1050
+ api.previewer.send( 'happyforms-part-dom-update', data );
1051
  },
1052
 
1053
  applyOptionGlobally: function(e) {
1065
  }
1066
  }
1067
  });
1068
+ },
1069
+
1070
+ onRevealTooltipCheckbox: function() {
1071
+ this.$el.find('.tooltip-description-wrap').fadeIn();
1072
+ },
1073
+
1074
+ onConcealTooltipCheckbox: function() {
1075
+ var $descriptionWrap = this.$el.find('.tooltip-description-wrap');
1076
+
1077
+ $descriptionWrap.fadeOut(200, function() {
1078
+ $descriptionWrap.find('input').prop('checked', false);
1079
+ });
1080
  }
1081
  } );
1082
 
1098
 
1099
  initialize: function() {
1100
  classes.views.Base.prototype.initialize.apply( this, arguments );
1101
+
1102
+ this.listenTo( this.model, 'change:captcha', this.onChangeCaptcha );
1103
  },
1104
 
1105
  render: function() {
1142
  },
1143
  open: function( e, ui ) {
1144
  ui.pointer.css( 'margin-left', '-1px' );
 
1145
  },
1146
  close: function( e, ui ) {
1147
  ui.pointer.css( 'margin-left', '0' );
1177
  this.model.set( attribute, value );
1178
 
1179
  if ( $el.data( 'preview-selector' ) && happyForms.previewLoaded ) {
1180
+ api.previewer.send( 'happyforms-part-dom-update', {
1181
  selector: $el.data( 'preview-selector' ),
1182
  text: value,
1183
  } );
1204
  }
1205
  },
1206
 
1207
+ onChangeCaptcha: function() {
1208
+ var $captchaSettings = $( '#happyforms-captcha-settings', this.$el );
1209
+
1210
+ if ( this.model.get( 'captcha' ) ) {
1211
+ $captchaSettings.show();
1212
+ } else {
1213
+ $captchaSettings.hide();
1214
+ }
1215
+ },
1216
+
1217
  remove: function() {
1218
  _.each( this.editorIds, function( editorId ) {
1219
  wp.editor.remove( editorId );
1229
  events: {
1230
  'click h3.accordion-section-title': 'onGroupClick',
1231
  'click .customize-panel-back': 'onGroupBackClick',
1232
+ // 'change input[type=checkbox]': 'onCheckboxChange',
1233
+ // 'keyup #hf_style_required_text': 'onRequiredTextChange',
1234
+ // 'change #hf_style_disable_button_until_required_filled': 'onDisableButtonChange',
1235
+ // 'change .happyforms-buttonset-container input': 'onInputChange',
1236
+ // 'change input[type=number]': 'onInputChange',
1237
+ // 'change input[type=text]': 'onInputChange',
1238
+ // 'change select': 'onInputChange'
1239
+ 'change [data-target="form_class"] input': 'onFormClassChange',
1240
+ 'change [data-target="form_class"] select': 'onFormClassChange',
1241
+ 'change [data-target="form_class"] input[type="checkbox"]': 'onFormClassCheckboxChange',
1242
+ 'change [data-target="css_var"] input[type=radio]': 'onButtonSetCssVarChange'
1243
  },
1244
 
1245
  initialize: function() {
1259
  this.initButtonSet();
1260
  },
1261
 
1262
+ onFormClassChange: function( e ) {
1263
+ e.preventDefault();
1264
+
1265
+ var $target = $( e.target );
1266
+ var attribute = $target.data( 'attribute' );
1267
+ var value = $target.val();
1268
+
1269
+ happyForms.form.set( attribute, value );
1270
+
1271
+ var data = {
1272
+ attribute: attribute,
1273
+ callback: 'onFormClassChangeCallback',
1274
+ };
1275
+
1276
+ api.previewer.send( 'happyforms-form-class-update', data );
1277
+ },
1278
+
1279
+ onFormClassCheckboxChange: function( e ) {
1280
+ e.preventDefault();
1281
+
1282
+ var $target = $( e.target );
1283
+ var attribute = $target.data( 'attribute' );
1284
+ var value = $target.val();
1285
+
1286
+ if ( $target.is(':checked') ) {
1287
+ happyForms.form.set( attribute, value );
1288
+ } else {
1289
+ happyForms.form.set( attribute, '' );
1290
+ }
1291
+
1292
+ var data = {
1293
+ attribute: attribute,
1294
+ callback: 'onFormClassToggleCallback'
1295
+ };
1296
+
1297
+ api.previewer.send( 'happyforms-form-class-update', data );
1298
+ },
1299
+
1300
+ onButtonSetCssVarChange: function (e) {
1301
+ e.preventDefault();
1302
+
1303
+ var $target = $(e.target);
1304
+ var attribute = $target.data('attribute');
1305
+ var variable = $target.parents('.happyforms-buttonset-control').data('variable');
1306
+
1307
+ var value = $target.val();
1308
+
1309
+ happyForms.form.set(attribute, value);
1310
+
1311
+ var data = {
1312
+ variable: variable,
1313
+ value: value,
1314
+ };
1315
+
1316
+ api.previewer.send('happyforms-css-variable-update', data);
1317
+ },
1318
+
1319
  onGroupClick: function( e ) {
1320
  e.preventDefault();
1321
 
1322
+ $( '.happyforms-style-controls-group', this.$el ).removeClass( 'open' );
1323
 
1324
+ $( '.happyforms-divider-control', this.$el )
1325
+ .removeClass( 'active' )
1326
+ .addClass( 'inactive' );
1327
 
1328
+ $( e.target ).parent().next().addClass( 'open' );
 
 
1329
  },
1330
 
1331
  onGroupBackClick: function( e ) {
1332
  e.preventDefault();
1333
 
1334
+ $( '.happyforms-divider-control', this.$el )
1335
+ .removeClass( 'inactive' )
1336
+ .addClass( 'active' );
1337
+
1338
+ var $section = $( e.target ).closest( '.happyforms-style-controls-group' );
1339
+
1340
+ $section.addClass( 'closing' );
1341
+
1342
+ setTimeout(function () {
1343
+ $section.removeClass('closing open');
1344
+ }, 200);
1345
  },
1346
 
1347
  initButtonSet: function() {
1353
  var $colorInputs = $( '.happyforms-color-input', this.$el );
1354
 
1355
  $colorInputs.each( function( index, el ) {
1356
+ var $control = $( el ).parents( '.customize-control' );
1357
+ var variable = $control.data( 'variable' );
1358
+
1359
  $( el ).wpColorPicker( {
1360
  change: function( e, ui ) {
1361
+ var value = ui.color.toString();
1362
 
1363
+ self.model.set( $( this ).attr( 'data-attribute' ), value );
1364
 
1365
+ var data = {
1366
+ variable: variable,
1367
+ value: value,
1368
+ };
1369
+
1370
+ api.previewer.send( 'happyforms-css-variable-update', data );
1371
  }
1372
  } );
1373
 
1378
  var value = $( el ).attr( 'data-default' );
1379
 
1380
  self.model.set( attribute, value );
 
 
 
 
1381
  } );
1382
  } );
1383
  },
1386
  var self = this;
1387
  var $container = this.$el.find( '.happyforms-range-control' );
1388
 
1389
+ $container.each(function (el, index) {
1390
+ var $this = $(this);
1391
+ var target = $this.data('target');
1392
+
1393
+ var variable = $this.data('variable');
1394
+ var unit = $this.data('unit');
1395
+
1396
  var $slider = $( '.happyforms-range-slider', $this );
1397
  var $sliderInput = $( 'input', $this );
1398
 
1411
  $sliderInput.val( ui.value );
1412
  self.model.set( $sliderInput.attr( 'data-attribute' ), ui.value );
1413
 
1414
+ var data = {
1415
+ variable: variable,
1416
+ value: ui.value + '' + unit,
1417
+ };
1418
+
1419
+ api.previewer.send('happyforms-css-variable-update', data);
1420
  }
1421
  } );
1422
  } );
1429
  this.model.set( $el.attr( 'data-attribute' ), value );
1430
 
1431
  if (happyForms.previewLoaded) {
1432
+ // api.previewer.send( 'happyforms-style-update', this.model );
1433
  }
1434
  },
1435
 
1452
  eventData.attributes = 'disabled';
1453
  }
1454
 
1455
+ // api.previewer.send('happyforms-part-dom-update', eventData);
1456
  }
1457
  },
1458
 
1465
  };
1466
 
1467
  this.model.set( $el.attr( 'data-attribute' ), value );
1468
+ // api.previewer.send( 'happyforms-part-dom-update', eventData );
1469
  },
1470
 
1471
  onInputChange: function( e ) {
1475
  this.model.set( $el.attr('data-attribute'), value );
1476
 
1477
  if ( happyForms.previewLoaded ) {
1478
+ // api.previewer.send('happyforms-style-update', this.model);
1479
  }
1480
  }
1481
  } );
1499
  },
1500
  } );
1501
 
1502
+ Previewer = {
1503
+ $: $,
1504
+ ready: false,
1505
+
1506
+ getPartModel: function( id ) {
1507
+ return happyForms.form.get( 'parts' ).get( id );
1508
+ },
1509
+
1510
+ getPartElement: function( html ) {
1511
+ return this.$( html );
1512
+ },
1513
+
1514
+ bind: function() {
1515
+ this.ready = true;
1516
+
1517
+ // Form title pencil
1518
+ api.previewer.bind(
1519
+ 'happyforms-pencil-click-title',
1520
+ this.onPreviewPencilClickTitle.bind( this )
1521
+ );
1522
+
1523
+ // Part pencils
1524
+ api.previewer.bind(
1525
+ 'happyforms-pencil-click-part',
1526
+ this.onPreviewPencilClickPart.bind( this )
1527
+ );
1528
+ },
1529
+
1530
+ /**
1531
+ *
1532
+ * Previewer callbacks for pencils
1533
+ *
1534
+ */
1535
+ onPreviewPencilClickPart: function( id ) {
1536
+ happyForms.navigate( 'build', { trigger: true } );
1537
+
1538
+ var $partWidget = $( '[data-part-id="' + id + '"]' );
1539
+
1540
+ if ( ! $partWidget.hasClass( 'happyforms-widget-expanded' ) ) {
1541
+ $partWidget.find( '.toggle-indicator' ).click();
1542
+ }
1543
+
1544
+ $( 'input', $partWidget ).first().focus();
1545
+ },
1546
+
1547
+ onPreviewPencilClickTitle: function( id ) {
1548
+ happyForms.navigate( 'build', { trigger: true } );
1549
+
1550
+ $( 'input[name="post_title"]' ).focus();
1551
+ },
1552
+
1553
+ /**
1554
+ *
1555
+ * Previewer callbacks for live part DOM updates
1556
+ *
1557
+ */
1558
+ onPartMouseOverCallback: function( id, html ) {
1559
+ var $part = this.$( html );
1560
+ $part.addClass( 'highlighted' );
1561
+ },
1562
+
1563
+ onPartMouseOutCallback: function( id, html ) {
1564
+ var $part = this.$( html );
1565
+ $part.removeClass( 'highlighted' );
1566
+ },
1567
+
1568
+ onPartLabelChangeCallback: function( id, html ) {
1569
+ var part = happyForms.form.get( 'parts' ).get( id );
1570
+ var $part = this.$( html );
1571
+ var $label = this.$( '.happyforms-part__label span.label', $part ).first();
1572
+
1573
+ $label.text( part.get( 'label' ) );
1574
+ },
1575
+
1576
+ onRequiredCheckboxChangeCallback: function( id, html ) {
1577
+ var part = happyForms.form.get( 'parts' ).get( id );
1578
+ var $part = this.$( html );
1579
+ var required = part.get( 'required' );
1580
+ var $required = this.$( '.happyforms-required', $part );
1581
+
1582
+ if ( parseInt(required, 10 ) === 1) {
1583
+ $required.show();
1584
+ } else {
1585
+ $required.hide();
1586
+ }
1587
+ },
1588
+
1589
+ onPartWidthChangeCallback: function( id, html, options ) {
1590
+ var part = happyForms.form.get( 'parts' ).get( id );
1591
+ var $part = this.$( html );
1592
+ var width = part.get( 'width' );
1593
+
1594
+ $part.removeClass( 'happyforms-part--width-half' );
1595
+ $part.removeClass( 'happyforms-part--width-full' );
1596
+ $part.removeClass( 'happyforms-part--width-third' );
1597
+ $part.addClass( 'happyforms-part--width-' + width);
1598
+ },
1599
+
1600
+ onPlaceholderChangeCallback: function( id, html ) {
1601
+ var part = happyForms.form.get( 'parts' ).get( id );
1602
+ var $part = this.$( html );
1603
+
1604
+ this.$( 'input', $part ).attr( 'placeholder', part.get( 'placeholder' ) );
1605
+ },
1606
+
1607
+ onDescriptionChangeCallback: function( id, html ) {
1608
+ var part = happyForms.form.get( 'parts' ).get( id );
1609
+ var $part = this.$( html );
1610
+ var description = part.get('description');
1611
+ var $description = this.$( '.happyforms-part__description', $part );
1612
+
1613
+ $description.text(description);
1614
+ },
1615
+
1616
+ onTooltipDescriptionChangeCallback: function( id, html ) {
1617
+ var part = happyForms.form.get( 'parts' ).get( id );
1618
+ var $part = this.$( html );
1619
+ var $description = this.$( '.happyforms-tooltip + .happyforms-part__description', $part );
1620
+ var $tooltip = this.$( '.happyforms-part__tooltip', $part );
1621
+
1622
+ if ( part.get( 'tooltip_description' ) === 1 ) {
1623
+ $tooltip.show();
1624
+ $description.hide();
1625
+ } else {
1626
+ $tooltip.hide();
1627
+ $description.show();
1628
+ }
1629
+ },
1630
+
1631
+ onLabelPlacementChangeCallback: function( id, html, options ) {
1632
+ var part = happyForms.form.get( 'parts' ).get( id );
1633
+ var $part = this.$( html );
1634
+
1635
+ $part.removeClass( 'happyforms-part--label-above' );
1636
+ $part.removeClass( 'happyforms-part--label-below' );
1637
+ $part.removeClass( 'happyforms-part--label-left' );
1638
+ $part.removeClass( 'happyforms-part--label-right' );
1639
+ $part.removeClass( 'happyforms-part--label-inside' );
1640
+ $part.addClass( 'happyforms-part--label-' + part.get( 'label_placement' ) );
1641
+ },
1642
+
1643
+ onCSSClassChangeCallback: function( id, html, options ) {
1644
+ var part = happyForms.form.get( 'parts' ).get( id );
1645
+ var $part = this.$( html );
1646
+ var previousClass = part.previous( 'css_class' );
1647
+ var currentClass = part.get( 'css_class' );
1648
+
1649
+ $part.removeClass( previousClass );
1650
+ $part.addClass( currentClass );
1651
+ },
1652
+
1653
+ onSubPartAdded: function( id, partHTML, optionHTML ) {
1654
+ var partView = happyForms.sidebar.current.partViews.get( id ).get( 'view' );
1655
+ partView.onSubPartAdded( id, partHTML, optionHTML );
1656
+ },
1657
+
1658
+ onFormClassChangeCallback: function( attribute, html, options ) {
1659
+ var $form = this.$( html );
1660
+ var previousClass = happyForms.form.previous( attribute );
1661
+ var currentClass = happyForms.form.get( attribute );
1662
+
1663
+ $form.removeClass( previousClass );
1664
+ $form.addClass( currentClass );
1665
+ },
1666
+
1667
+ onFormClassToggleCallback: function( attribute, html, options ) {
1668
+ var $form = this.$( html );
1669
+ var previousClass = happyForms.form.previous( attribute );
1670
+ var currentClass = happyForms.form.get( attribute );
1671
+
1672
+ $form.removeClass( previousClass );
1673
+ $form.addClass( currentClass );
1674
+ }
1675
+ };
1676
+
1677
+ happyForms = window.happyForms = new HappyForms();
1678
  happyForms.classes = classes;
1679
  happyForms.factory = PartFactory;
1680
+ happyForms.previewer = Previewer;
1681
 
1682
  api.bind( 'ready', function() {
1683
+ happyForms.start();
1684
+ // Backbone.history.start();
1685
+ // api.previewer.previewUrl( happyForms.form.getPreviewUrl() );
1686
 
1687
+ api.previewer.bind( 'ready', function() {
 
1688
  happyForms.flushBuffer();
1689
+ happyForms.previewer.bind();
1690
  } );
1691
  } );
1692
 
assets/js/frontend.js CHANGED
@@ -1,114 +1,261 @@
1
- jQuery(function($) {
2
- $('.happyforms-masked-input').each(function() {
3
- var $this = $(this);
4
- var maskType = $this.data('mask-type');
5
-
6
- if (maskType === 'numeric') {
7
- var cleave = new Cleave($this, {
8
- numeral: true,
9
- numeralDecimalMark: ($this.data('mask-decimal-mark')) ? $this.data('mask-decimal-mark') : '.',
10
- delimiter: ($this.data('mask-thousands-delimiter')) ? $this.data('mask-thousands-delimiter') : ',',
11
- prefix: ($this.data('mask-prefix')) ? $this.data('mask-prefix') : '',
12
- });
13
- }
14
-
15
- if (maskType === 'phone') {
16
- var cleave = new Cleave($this, {
17
- phone: true
18
- });
19
-
20
- var phoneRegionCode;
21
-
22
- if ($this.data('mask-phone-country')) {
23
- phoneRegionCode = '+'+$this.data('mask-phone-country');
24
-
25
- cleave.setPhoneRegionCode(phoneRegionCode);
26
- $this.val(phoneRegionCode);
27
- }
28
-
29
- $this.on('keyup', function() {
30
- if (!$this.val()) {
31
- $this.val(phoneRegionCode);
32
- }
33
- });
34
- }
35
- });
36
-
37
- $('.happyforms-form').each(function() {
38
- var $this = $(this);
39
- var $submitButton = $this.find('.happyforms-button--submit');
40
- var hasLegal = false;
41
- var $legalPart = $this.find('.happyforms-part--legal input');
42
-
43
- if ($legalPart.length) {
44
- hasLegal = true;
45
- $submitButton.attr('disabled', 'disabled');
46
- }
47
-
48
- if ($submitButton.is(':disabled')) {
49
- $this.find('*[required]').on('keyup change', function() {
50
- var valid = true;
51
-
52
- $this.find('*[required]').each(function() {
53
- if (!$(this).val()) {
54
- valid = false;
55
- }
56
- });
57
-
58
- if (valid) {
59
- if (hasLegal) {
60
- if ($legalPart.is(':checked')) {
61
- $submitButton.removeAttr('disabled');
62
- }
63
- }
64
- } else {
65
- $submitButton.attr('disabled', 'disabled');
66
- }
67
- });
68
-
69
- $legalPart.on('change', function() {
70
- if ($(this).is(':checked')) {
71
- $submitButton.removeAttr('disabled');
72
- } else {
73
- $submitButton.attr('disabled', 'disabled');
74
- }
75
- });
76
- }
77
- });
78
-
79
- $('.happyforms-part').each(function() {
80
- var $this = $(this);
81
-
82
- if ($this.find('input[type=checkbox][required]')) {
83
- $this.find('input[type=checkbox]').on('change', function(e) {
84
- if ($(this).is(':checked')) {
85
- $this.find('input[type=checkbox]').removeAttr('required');
86
- $(this).attr('required', 'required');
87
- }
88
- });
89
- }
90
- });
91
-
92
- if (typeof happyFormsScale === 'function') {
93
- $('.happyforms-part--scale input[type=range]').happyFormsScale();
94
- }
95
-
96
- $('.happyforms-confirmation-input').on('keyup', function() {
97
- var $this = $(this);
98
- var $validatedInput = $('[name='+ $this.data('confirmation-of') + ']');
99
-
100
- $validatedInput.on('keyup', function() {
101
- if ($(this).val() !== $this.val()) {
102
- $this.parent().find('.happyforms-message-notices').show();
103
- } else {
104
- $this.parent().find('.happyforms-message-notices').hide();
105
- }
106
- });
107
-
108
- if ($validatedInput.val() !== $this.val()) {
109
- $this.parent().find('.happyforms-message-notices').show();
110
- } else {
111
- $this.parent().find('.happyforms-message-notices').hide();
112
- }
113
- });
114
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ( function( $ ) {
2
+
3
+ HappyForms.parts = HappyForms.parts || {};
4
+
5
+ HappyForms.parts.base = {
6
+ init: function() {
7
+ var type = this.$el.data( 'happyforms-type' );
8
+
9
+ switch ( type ) {
10
+ case 'single_line_text':
11
+ case 'email':
12
+ case 'website_url':
13
+ case 'checkbox':
14
+ case 'radio':
15
+ case 'number':
16
+ case 'legal':
17
+ case 'rating':
18
+ this.$input = $( 'input', this.$el );
19
+ break;
20
+
21
+ case 'multi_line_text':
22
+ this.$input = $( 'textarea', this.$el );
23
+ break;
24
+
25
+ case 'select':
26
+ case 'date':
27
+ case 'title':
28
+ this.$input = $( 'select', this.$el );
29
+ break;
30
+
31
+ case 'phone':
32
+ // Overwritten in phone.js
33
+ break;
34
+
35
+ case 'address':
36
+ // Overwritten in address.js
37
+ break;
38
+
39
+ case 'scale':
40
+ // Overwritten in scale.js
41
+ break;
42
+
43
+ default:
44
+ return;
45
+ break;
46
+ }
47
+
48
+ this.$input.on( 'keyup change', this.triggerChange.bind( this ) );
49
+
50
+ $( 'input, textarea', this.$el ).on( 'blur', this.onBlur.bind( this ) );
51
+ },
52
+
53
+ onBlur: function() {
54
+ if ( this.$el.is( '.happyforms-part--label-as_placeholder' ) ) {
55
+ if ( this.getValue() ) {
56
+ this.$el.addClass( 'happyforms-part--filled' );
57
+ } else {
58
+ this.$el.removeClass( 'happyforms-part--filled' );
59
+ }
60
+ }
61
+ },
62
+
63
+ triggerChange: function() {
64
+ this.$el.trigger( 'happyforms-change' );
65
+ },
66
+
67
+ isRequired: function() {
68
+ return this.$el.is( '[data-happyforms-required]' );
69
+ },
70
+
71
+ getValue: function() {
72
+ var type = this.$el.data( 'happyforms-type' );
73
+
74
+ switch ( type ) {
75
+ case 'single_line_text':
76
+ case 'email':
77
+ case 'website_url':
78
+ case 'multi_line_text':
79
+ case 'select':
80
+ case 'number':
81
+ case 'scale':
82
+ case 'title':
83
+ return this.$input.val();
84
+ break;
85
+
86
+ case 'checkbox':
87
+ case 'radio':
88
+ case 'legal':
89
+ return $( ':checked', this.$el ).val();
90
+ break;
91
+
92
+ case 'rating':
93
+ return '0' !== $( ':checked', this.$el ).val();
94
+ break;
95
+
96
+ case 'phone':
97
+ // Overwritten in phone.js
98
+ break;
99
+
100
+ case 'date':
101
+ case 'address':
102
+ var value = '';
103
+
104
+ var components = $.map( this.$input, function( el ) {
105
+ var componentValue = $( el ).val();
106
+
107
+ if ( componentValue ) {
108
+ return componentValue;
109
+ }
110
+ } );
111
+
112
+ if ( components.length === this.$input.length ) {
113
+ value = components.join( '-' );
114
+ }
115
+
116
+ return value;
117
+ break;
118
+
119
+ default:
120
+ return;
121
+ break;
122
+ }
123
+ },
124
+
125
+ getConfirmationValue: function() {
126
+ return $( '.happyforms-confirmation-input', this.$el ).val();
127
+ },
128
+
129
+ isValid: function() {
130
+ var valid = true;
131
+
132
+ if ( ! this.$input ) {
133
+ return valid;
134
+ }
135
+
136
+ if ( this.$input.attr( 'readonly' ) ) {
137
+ valid = valid && ! this.getValue();
138
+ }
139
+
140
+ if ( this.isRequired() ) {
141
+ valid = valid && this.getValue();
142
+ }
143
+
144
+ if ( this.isRequired() &&
145
+ this.$el.is( '[data-happyforms-require-confirmation]' ) ) {
146
+
147
+ valid = valid && ( '' !== this.getConfirmationValue() );
148
+ }
149
+
150
+ return valid;
151
+ },
152
+
153
+ destroy: function() {
154
+ this.$el.data( 'HappyFormPart', false );
155
+ }
156
+ }
157
+
158
+ HappyForms.wrapPart = function( $part, $form ) {
159
+ var type = $part.data( 'happyforms-type' );
160
+ var partMethods = HappyForms.parts.base;
161
+
162
+ if ( HappyForms.parts[type] ) {
163
+ partMethods = $.extend( {}, HappyForms.parts.base, HappyForms.parts[type] );
164
+ }
165
+
166
+ $part.happyFormPart( partMethods, {
167
+ form: $form,
168
+ } );
169
+ }
170
+
171
+ HappyForms.Form = function( el ) {
172
+ this.el = el;
173
+ this.$el = $( this.el );
174
+ this.$form = $( 'form', this.$el );
175
+ this.$parts = $( '[data-happyforms-type]', this.$form );
176
+ this.$submit = $( '[type="submit"]', this.$form );
177
+
178
+ this.init();
179
+ }
180
+
181
+ HappyForms.Form.prototype = {
182
+ init: function() {
183
+ var $form = this.$form;
184
+ var $parts = $( '[data-happyforms-type]', this.$form );
185
+
186
+ this.$el.on( 'happyforms-change', this.validate.bind( this ) );
187
+
188
+ $parts.each( function() {
189
+ var $part = $( this );
190
+ var type = $part.data( 'happyforms-type' );
191
+
192
+ HappyForms.wrapPart( $part, $form );
193
+ } );
194
+
195
+ this.$el.trigger( 'happyforms-change' );
196
+ },
197
+
198
+ validate: function() {
199
+ var isValid = true;
200
+
201
+ if ( this.$form.is( '.happyforms-form--disable-until-valid' ) ) {
202
+ // Check every part
203
+ var $parts = $( '[data-happyforms-type]', this.$form );
204
+
205
+ $parts.each( function() {
206
+ isValid = isValid && $( this ).happyFormPart( 'isValid' );
207
+ } );
208
+ } else {
209
+ // Check only legal parts
210
+ var $parts = $( '[data-happyforms-type=legal]', this.$form );
211
+
212
+ $parts.each( function() {
213
+ isValid = isValid && $( this ).happyFormPart( 'isValid' );
214
+ } );
215
+ }
216
+
217
+ this.$submit.attr( 'disabled', ! isValid );
218
+ },
219
+ }
220
+
221
+ HappyForms.Part = function( el ) {
222
+ this.el = el;
223
+ this.$el = $( this.el );
224
+ }
225
+
226
+ $.fn.happyFormPart = function( method ) {
227
+ var args = arguments;
228
+
229
+ if ( 'object' === typeof method ) {
230
+ var part = new HappyForms.Part( this );
231
+ $.extend( part, method );
232
+ $( this ).data( 'HappyFormPart', part );
233
+ part.init();
234
+ } else {
235
+ var instance = $( this ).data( 'HappyFormPart' );
236
+
237
+ if ( instance[method] ) {
238
+ return instance[method].apply( instance, Array.prototype.slice.call( arguments, 1 ) );
239
+ }
240
+ }
241
+ }
242
+
243
+ $.fn.happyForm = function ( method ) {
244
+ this.each(function () {
245
+ if ( ! method ) {
246
+ $.data( this, 'HappyForm', new HappyForms.Form( this, arguments ) );
247
+ } else {
248
+ var methods = $.data( this, 'HappyForm' );
249
+
250
+ if ( methods && methods[method] ) {
251
+ return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
252
+ }
253
+ }
254
+ } );
255
+ }
256
+
257
+ $( document ).ready( function() {
258
+ $( '.happyforms-form' ).happyForm();
259
+ } );
260
+
261
+ } )( jQuery );
assets/js/frontend/address.js CHANGED
@@ -1,212 +1,50 @@
1
- ( function ( $, countries ) {
2
 
3
- var pluginName = 'happyFormsAddress';
4
- var defaults = {
5
- libraryUrl: 'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places',
6
- };
7
- var googleAPIRequested = false;
8
- var googleAPILoaded = false;
9
 
10
- function Plugin( el, options ) {
11
- this.el = el;
12
- this.$el = $( this.el );
13
- this.$value = $( '[type=hidden]', this.$el );
14
 
15
- this.options = $.extend( {
16
- apiKey: this.$el.attr( 'data-google-apikey' ),
17
- mode: this.$el.attr( 'data-mode' ),
18
- }, defaults, options );
19
-
20
- this._defaults = defaults;
21
- this._name = pluginName;
 
22
 
23
- this.init();
 
 
 
 
 
 
24
  }
25
 
26
- Plugin.prototype = {
27
  init: function() {
28
- if ( ! this.options.apiKey ) {
29
- return;
30
- }
31
-
32
- var libraryUrl = this.options.libraryUrl.replace(
33
- 'YOUR_API_KEY',
34
- this.options.apiKey
35
- );
36
-
37
- var self = this;
38
- var $script = $( '#happyforms-google-autocomplete' );
39
- googleAPIRequested = $script.length !== 0
40
-
41
- if ( ! googleAPIRequested ) {
42
- $script = $( '<script>' ).prop( {
43
- id: 'happyforms-google-autocomplete',
44
- type: 'text/javascript',
45
- src: libraryUrl
46
- } );
47
- }
48
-
49
- if ( ! googleAPILoaded ) {
50
- $script.on( 'load', function() {
51
- googleAPILoaded = true;
52
- self.setup();
53
- } );
54
- } else {
55
- self.setup();
56
- }
57
 
58
- if ( ! googleAPIRequested ) {
59
- document.head.appendChild( $script[ 0 ] );
60
- }
61
- },
62
 
63
- setup: function() {
64
- this.service = new google.maps.places.AutocompleteService();
65
 
66
- switch( this.options.mode ) {
67
- case 'autocomplete': this.setupCompleteMode(); break;
68
- case 'country': this.setupCountryMode(); break;
69
- case 'country-city': this.setupCountryCityMode(); break;
70
  }
71
- },
72
-
73
- setupCompleteMode: function() {
74
- var self = this;
75
- var $address = $( '.happyforms-part__el--address-autocomplete', this.$el );
76
- var $results = $( '.happyforms-part__el--address--results-autocomplete', this.$el );
77
-
78
- $address.keyup( function() {
79
- var value = $address.val();
80
-
81
- $results.empty();
82
-
83
- if ( ! value ) {
84
- return;
85
- }
86
-
87
- self.service.getQueryPredictions( {
88
- input: value,
89
- types: ['address']
90
- }, function( results ) {
91
- $.each( results, function( i, e ) {
92
- $results.append( $( '<div>' ).text( e.description ) );
93
- } );
94
-
95
- $results.show();
96
-
97
- $( document ).one( 'click', function() {
98
- $results.hide();
99
- } );
100
- } );
101
- } );
102
-
103
- $results.click( 'div', function( e ) {
104
- e.stopPropagation();
105
 
106
- var value = $( e.target ).text()
107
- self.$value.val( value );
108
- $address.val( value );
109
- $results.hide();
110
- } );
111
- },
112
-
113
- setupCountryMode: function() {
114
- var self = this;
115
- var $country = $( '.happyforms-part__el--address-country', this.$el );
116
- var $results = $( '.happyforms-part__el--address--results-country', this.$el );
117
-
118
- $country.keyup( function() {
119
- var value = $country.val();
120
- $results.empty();
121
-
122
- if ( ! value ) {
123
- return;
124
- }
125
-
126
- var results = countries.filter( function( name ) {
127
- return name.toLowerCase().indexOf( value.toLowerCase() ) >= 0;
128
- } );
129
-
130
- $.each( results, function( i, e ) {
131
- $results.append( $( '<div>' ).text( e ) );
132
- } );
133
-
134
- $results.show();
135
-
136
- $( document ).one( 'click', function() {
137
- $results.hide();
138
- } );
139
- } );
140
-
141
- $results.click( 'li', function( e ) {
142
- e.stopPropagation();
143
-
144
- var value = $( e.target ).text()
145
- self.$value.val( value );
146
- $country.val( value );
147
- $results.hide();
148
- } );
149
- },
150
 
151
- setupCountryCityMode: function() {
152
- var self = this;
153
- var $country = $( '.happyforms-part__el--address-country', this.$el );
154
- var $city = $( '.happyforms-part__el--address-city', this.$el );
155
- var $countryResults = $( '.happyforms-part__el--address--results-country', this.$el );
156
- var address = [];
157
-
158
- $country.keyup( function() {
159
- var value = $country.val();
160
- $countryResults.empty();
161
-
162
- if ( ! value ) {
163
- return;
164
- }
165
-
166
- var results = countries.filter( function( name ) {
167
- return name.toLowerCase().indexOf( value.toLowerCase() ) >= 0;
168
- } );
169
-
170
- $.each( results, function( i, e ) {
171
- $countryResults.append( $( '<div>' ).text( e ) );
172
- } );
173
-
174
- $countryResults.show();
175
-
176
- $( document ).one( 'click', function() {
177
- $countryResults.hide();
178
- } );
179
- } );
180
-
181
- $city.keyup( function() {
182
- var value = $city.val();
183
- address[1] = value;
184
- self.$value.val( address.join( ', ' ) );
185
- } );
186
-
187
- $countryResults.click( 'li', function( e ) {
188
- e.stopPropagation();
189
-
190
- var value = $( e.target ).text()
191
- address[0] = value;
192
- $country.val( value );
193
- $countryResults.hide();
194
- self.$value.val( address.join( ', ' ) );
195
  } );
196
  }
197
  }
198
 
199
- $.fn[pluginName] = function ( options ) {
200
- return this.each(function () {
201
- $.data( this, 'plugin_' + pluginName, new Plugin( this, options ) );
202
- } );
203
- }
204
-
205
- /*
206
- * Initialize address instances
207
- */
208
- $( '.happyforms-part--address' ).each( function( i, el ) {
209
- $( el ).happyFormsAddress();
210
- } )
211
-
212
- } )( jQuery, _happyFormsCountries );
1
+ ;( function ( $, settings ) {
2
 
3
+ HappyForms.parts = HappyForms.parts || {};
 
 
 
 
 
4
 
5
+ var sources = {
6
+ autocomplete: function( request, response ) {
7
+ var apiKey = this.$el.attr( 'data-google-apikey' );
 
8
 
9
+ $.get( settings.url, {
10
+ action: settings.action,
11
+ key: apiKey,
12
+ term: request.term,
13
+ }, function( data ) {
14
+ response( data );
15
+ } );
16
+ },
17
 
18
+ get: function( mode, context ) {
19
+ if ( 'autocomplete' === mode ) {
20
+ return this.autocomplete.bind( context );
21
+ } else {
22
+ return settings.countries;
23
+ }
24
+ }
25
  }
26
 
27
+ HappyForms.parts.address = {
28
  init: function() {
29
+ this.$input = $( 'input', this.$el );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
+ this.$input.on( 'keyup', this.triggerChange.bind( this ) );
32
+ this.$input.on( 'change', this.triggerChange.bind( this ) );
 
 
33
 
34
+ var $input = $( '.happyforms-part__el--address-autocomplete', this.$el );
35
+ var mode = this.$el.attr( 'data-mode' );
36
 
37
+ if ( 'simple' === mode ) {
38
+ return;
 
 
39
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ var containerSelector = $( '.happyforms-part__el--address--results', this.$el );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
+ $input.autocomplete( {
44
+ appendTo: containerSelector,
45
+ source: sources.get( mode, this ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  } );
47
  }
48
  }
49
 
50
+ } )( jQuery, _happyFormsAddressSettings );
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/frontend/number.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ( function( $ ) {
2
+
3
+ HappyForms.parts = HappyForms.parts || {};
4
+
5
+ HappyForms.parts.number = {
6
+ init: function() {
7
+ var masked = this.$el.attr( 'data-mask' );
8
+
9
+ this.$input = $( 'input', this.$el );
10
+ this.cleaveInstances = [];
11
+
12
+ this.$input.on( 'keyup', this.triggerChange.bind( this ) );
13
+ this.$input.on( 'change', this.triggerChange.bind( this ) );
14
+
15
+ if ( masked ) {
16
+ var numeralDecimalMark = this.$el.attr( 'data-decimal-mark' ) || '.';
17
+ var delimiter = this.$el.attr( 'data-thousands-delimiter' ) || ',';
18
+ var prefix = this.$el.attr( 'data-prefix' ) || '';
19
+ var self = this;
20
+
21
+ this.$input.each( function() {
22
+ var $input = $( this );
23
+
24
+ var cleave = new Cleave( $input, {
25
+ numeral: true,
26
+ numeralDecimalMark: numeralDecimalMark,
27
+ delimiter: delimiter,
28
+ prefix: prefix,
29
+ } );
30
+
31
+ self.cleaveInstances.push( cleave );
32
+ } );
33
+ }
34
+ },
35
+
36
+ reinit: function() {
37
+ $.each( this.cleaveInstances, function( i, instance ) {
38
+ var input = instance.element;
39
+ var rawValue = instance.getRawValue();
40
+
41
+ instance.destroy();
42
+
43
+ input.value = rawValue;
44
+ } );
45
+
46
+ this.init();
47
+ },
48
+ };
49
+
50
+ } )( jQuery );
assets/js/frontend/phone.js ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ( function( $ ) {
2
+
3
+ HappyForms.parts = HappyForms.parts || {};
4
+
5
+ HappyForms.parts.phone = {
6
+ init: function() {
7
+ var masked = this.$el.attr( 'data-mask' );
8
+
9
+ this.$input = $( 'input', this.$el );
10
+ this.cleaveInstances = [];
11
+
12
+ this.$input.on( 'keyup', this.triggerChange.bind( this ) );
13
+ this.$input.on( 'change', this.triggerChange.bind( this ) );
14
+
15
+ if ( masked ) {
16
+ var regionCode = '+' + this.$el.attr( 'data-country' );
17
+ var self = this;
18
+
19
+ this.$input.each( function() {
20
+ var $input = $( this );
21
+
22
+ var cleave = new Cleave( $input, {
23
+ phone: true,
24
+ } );
25
+
26
+ if ( regionCode ) {
27
+ cleave.setPhoneRegionCode( regionCode );
28
+ cleave.setRawValue( regionCode );
29
+ };
30
+
31
+ self.cleaveInstances.push( cleave );
32
+ } );
33
+ }
34
+ },
35
+
36
+ reinit: function() {
37
+ $.each( this.cleaveInstances, function( i, instance ) {
38
+ instance.destroy();
39
+ } );
40
+
41
+ this.init();
42
+ },
43
+
44
+ getValue: function() {
45
+ var regionCode = this.$el.attr( 'data-country' );
46
+ var value = this.$input.val();
47
+
48
+ if ( regionCode ) {
49
+ value = value.substring( regionCode.length + 1 ).trim();
50
+ }
51
+
52
+ return value;
53
+ },
54
+
55
+ getConfirmationValue: function() {
56
+ var regionCode = this.$el.attr( 'data-country' );
57
+ var $input = $( '.happyforms-confirmation-input', this.$el );
58
+ var value = $input.val();
59
+
60
+ if ( regionCode ) {
61
+ value = value.substring( regionCode.length + 1 ).trim();
62
+ }
63
+
64
+ return value;
65
+ }
66
+ }
67
+
68
+ } )( jQuery );
assets/js/frontend/scale.js CHANGED
@@ -1,56 +1,34 @@
1
- (function ($) {
2
-
3
- var pluginName = 'happyFormsScale';
4
- var defaults = {};
5
-
6
- function Plugin(el, options) {
7
- this.el = el;
8
- this.$el = $(this.el);
9
- this.$output = this.$el.nextAll('output');
10
-
11
- this._defaults = defaults;
12
- this._name = pluginName;
13
-
14
- this.init();
15
- }
16
-
17
- Plugin.prototype = {
18
- init: function () {
19
- var self = this;
20
-
21
- this.bindEvents();
22
- },
23
-
24
- bindEvents: function() {
25
- var self = this;
26
-
27
- this.$el.on('input', function () {
28
- var rangeWidth = self.$el.width();
29
- var outputPosition = (self.$el.val() / self.$el.attr('max')) * 100 - ((self.$output.width() / 2) / rangeWidth) * 100;
30
-
31
- if (outputPosition > 50) {
32
- outputPosition = outputPosition - 0.6;
33
- } else {
34
- outputPosition = outputPosition + 0.3;
35
- }
36
-
37
- self.$output.text(self.$el.val()).css({
38
- left: outputPosition + '%'
39
- });
40
- });
41
-
42
- self.$el.trigger('input');
43
- }
44
- }
45
-
46
- $.fn[pluginName] = function (options) {
47
- return this.each(function () {
48
- $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
49
- });
50
- }
51
-
52
- $('.happyforms-part--scale input').each(function (i, el) {
53
- $(el).happyFormsScale();
54
- })
55
-
56
- })(jQuery);
1
+ ( function( $ ) {
2
+
3
+ HappyForms.parts = HappyForms.parts || {};
4
+
5
+ HappyForms.parts.scale = {
6
+ init: function() {
7
+ this.$input = $( 'input', this.$el );
8
+ this.$output = $( 'output', this.$el );
9
+
10
+ this.$input.on( 'input', this.refreshOutput.bind( this ) );
11
+ this.refreshOutput();
12
+ },
13
+
14
+ refreshOutput: function() {
15
+ var min = parseFloat( this.$input.attr( 'min' ) );
16
+ var max = parseFloat( this.$input.attr( 'max' ) );
17
+ var step = parseFloat( this.$input.attr( 'step' ) );
18
+
19
+ var rangeWidth = this.$el.width();
20
+ var outputPosition = (this.$input.val() / this.$input.attr('max')) * 100 - ((this.$output.width() / 2) / rangeWidth) * 100;
21
+
22
+ if (outputPosition > 50) {
23
+ outputPosition = outputPosition - 0.5;
24
+ } else {
25
+ outputPosition = outputPosition + 0.2;
26
+ }
27
+
28
+ this.$output.text( this.$input.val() ).css({
29
+ left: outputPosition + '%'
30
+ });
31
+ },
32
+ };
33
+
34
+ } )( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/parts/part-address.js CHANGED
@@ -11,17 +11,17 @@
11
  } );
12
 
13
  var AddressView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-address-template',
15
 
16
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
17
  'change [data-bind=apikey]': 'onApiKeyChange',
18
- 'change [data-bind=mode]': 'onModeChange',
19
  } ),
20
 
21
  initialize: function() {
22
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
23
 
24
  this.listenTo( this, 'ready', this.toggleApiKey );
 
25
  },
26
 
27
  toggleApiKey: function() {
@@ -33,37 +33,44 @@
33
  },
34
 
35
  onApiKeyChange: function( e ) {
36
- var eventData = {
37
- part_id: this.model.id,
38
- selector: '[data-google-apikey]',
39
- attributes: {
40
- 'data-google-apikey': this.model.get( 'apikey' )
41
- },
42
  };
43
 
44
- api.previewer.trigger( 'happyforms-part-dom-update', eventData );
45
  },
46
 
47
  onModeChange: function( e ) {
48
  var self = this;
 
49
 
50
  this.toggleApiKey();
51
 
52
- var request = wp.ajax.post( 'happyforms-form-part-added', {
 
53
  'happyforms-nonce': api.settings.nonce.happyforms,
54
  happyforms: 1,
55
  wp_customize: 'on',
56
  form_id: happyForms.form.id,
57
  part: this.model.toJSON(),
 
 
 
 
 
 
58
  } );
59
 
60
  request.done( function( response ) {
61
- var template = _.template( response.template );
62
- var html = template( happyForms.form.toJSON() );
63
- response.html = html;
64
-
65
- if (happyForms.previewLoaded) {
66
- api.previewer.trigger( 'happyforms-form-part-refresh', response );
 
 
67
  } else {
68
  happyForms.buffer.push( response );
69
  }
@@ -71,6 +78,22 @@
71
  }
72
  } );
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
75
  if ( 'address' === attrs.type ) {
76
  BaseClass = AddressModel;
@@ -87,22 +110,4 @@
87
  return func( options, BaseClass );
88
  } );
89
 
90
- api.bind( 'ready', function() {
91
- api.previewer.bind( 'happyforms-part-render', function( $el ) {
92
- if ( ! $el.is( '.happyforms-part--address' ) ) {
93
- return;
94
- }
95
-
96
- $el.happyFormsAddress();
97
- } );
98
-
99
- api.previewer.bind( 'happyforms-part-dom-updated', function( $el ) {
100
- if ( ! $el.is( '.happyforms-part--address' ) ) {
101
- return;
102
- }
103
-
104
- $el.happyFormsAddress();
105
- } );
106
- } );
107
-
108
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
11
  } );
12
 
13
  var AddressView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-address-template',
15
 
16
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
17
  'change [data-bind=apikey]': 'onApiKeyChange',
 
18
  } ),
19
 
20
  initialize: function() {
21
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
22
 
23
  this.listenTo( this, 'ready', this.toggleApiKey );
24
+ this.listenTo( this.model, 'change:mode', this.onModeChange );
25
  },
26
 
27
  toggleApiKey: function() {
33
  },
34
 
35
  onApiKeyChange: function( e ) {
36
+ var data = {
37
+ id: this.model.get( 'id' ),
38
+ callback: 'onAddressApiKeyChange',
 
 
 
39
  };
40
 
41
+ api.previewer.send( 'happyforms-part-dom-update', data );
42
  },
43
 
44
  onModeChange: function( e ) {
45
  var self = this;
46
+ var part = this.model;
47
 
48
  this.toggleApiKey();
49
 
50
+ var data = {
51
+ action: 'happyforms-form-part-add',
52
  'happyforms-nonce': api.settings.nonce.happyforms,
53
  happyforms: 1,
54
  wp_customize: 'on',
55
  form_id: happyForms.form.id,
56
  part: this.model.toJSON(),
57
+ };
58
+
59
+ var request = $.ajax( ajaxurl, {
60
+ type: 'post',
61
+ dataType: 'html',
62
+ data: data
63
  } );
64
 
65
  request.done( function( response ) {
66
+ var data = {
67
+ id: part.get( 'id' ),
68
+ html: response,
69
+ callback: 'onAddressModeChangeCallback',
70
+ };
71
+
72
+ if ( happyForms.previewer.ready ) {
73
+ api.previewer.send( 'happyforms-form-part-refresh', data );
74
  } else {
75
  happyForms.buffer.push( response );
76
  }
78
  }
79
  } );
80
 
81
+ happyForms.previewer = _.extend( happyForms.previewer, {
82
+ onAddressApiKeyChange: function( id, html, options ) {
83
+ var part = this.getPartModel( id );
84
+ var $part = this.getPartElement( html );
85
+
86
+ $part.attr( 'data-google-apikey', part.get( 'apikey' ) );
87
+ },
88
+
89
+ onAddressModeChangeCallback: function( id, html, options, $ ) {
90
+ var part = this.getPartModel( id );
91
+ var $part = $( html );
92
+
93
+ $part.happyFormsAddressAutocomplete();
94
+ }
95
+ } );
96
+
97
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
98
  if ( 'address' === attrs.type ) {
99
  BaseClass = AddressModel;
110
  return func( options, BaseClass );
111
  } );
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  } ) ( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
assets/js/parts/part-checkbox.js CHANGED
@@ -7,254 +7,198 @@
7
  settings.formParts.checkbox.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  } );
12
 
13
  var CheckboxView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-checkbox-template',
 
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
 
19
- this.model.options = new Backbone.Collection();
20
-
21
- this.listenTo(this.model.options, 'add', this.onOptionsChange);
22
- this.listenTo(this.model.options, 'change', this.onOptionsChange);
23
- this.listenTo(this.model.options, 'remove', this.onOptionsChange);
24
  },
25
 
26
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
27
  'click .add-option': 'onAddOptionClick',
28
- 'change [name=display_type]': 'onDisplayTypeChange'
 
 
 
29
  } ),
30
 
31
- ready: function() {
32
- happyForms.classes.views.Part.prototype.ready.apply( this, arguments );
33
-
34
- _(this.model.get('options')).each(function(option) {
35
- var optionModel = new Backbone.Model({
36
- id: option.id,
37
- is_default: option.is_default,
38
- label: option.label
39
- });
40
-
41
- this.createNewOption(optionModel);
42
- }, this);
43
  },
44
 
45
- /**
46
- * Hide 'No options added yet' message and call `createNewOption` method on 'Add option' button click.
47
- *
48
- * @since 1.0.0.
49
- *
50
- * @return void
51
- */
52
- onAddOptionClick: function() {
53
- this.$el.find('.no-options').hide();
54
-
55
- this.createNewOption(false, false);
56
  },
57
 
58
- /**
59
- * Creates new option model and view, adds to a collection.
60
- *
61
- * @since 1.0.0.
62
- *
63
- * @param {object} [optionModel=''] Existing option model.
64
- * @param {bool} [skipPreviewTrigger=true] Boolean to tell if creation of new model should trigger preview event or not.
65
- *
66
- * @return void
67
- */
68
- createNewOption: function(optionModel, skipPreviewTrigger) {
69
- var self = this;
70
- var model = (optionModel) ? optionModel : '';
71
-
72
- if ( typeof skipPreviewTrigger === 'undefined' ) {
73
- skipPreviewTrigger = true;
74
- }
75
-
76
- if (model === '') {
77
- var optionId = _.uniqueId(self.model.get('id') + '_option_');
78
 
79
- model = new Backbone.Model({
80
- id: optionId,
81
- is_default: 0,
82
- label: ''
83
- });
84
- }
85
 
86
- this.model.options.add(model, { silent: true });
 
87
 
88
- var view = new CheckboxOptionView({ model: model, parent: this });
 
 
89
 
90
- $('.options', this.$el).append(view.$el);
91
 
92
- if ( !skipPreviewTrigger ) {
93
- var template = _.template($(view.frontendTemplate).html());
94
- var html = template(view.model.toJSON());
95
 
96
- var eventData = {
97
- 'part_id': this.model.get('id'),
98
- 'element': html,
99
- 'appendTo': '.happyforms-part__el'
100
  };
101
 
102
- api.previewer.trigger('happyforms-sub-part-added', eventData);
103
- }
104
- },
105
-
106
- /**
107
- * Update options in the part model on options collection change.
108
- *
109
- * @since 1.0.0.
110
- *
111
- * @param {object} data Backbone collection of options.
112
- *
113
- * @return {object}
114
- */
115
- onOptionsChange: function(data) {
116
- var options = this.model.options;
117
- var optionsArray = [];
118
-
119
- options.each(function(model, index) {
120
- optionsArray.push(model.attributes);
121
- });
122
-
123
- this.model.set('options', optionsArray);
124
-
125
- return data;
126
  },
127
 
128
- onDisplayTypeChange: function(e) {
129
- var $input = $(e.target);
130
- var attribute = $input.data('bind');
131
 
132
- this.model.set(attribute, $input.val());
133
 
134
- var eventData = {
135
- part_id: this.model.id,
136
- selector: 'self',
137
- classes: 'display-type--block',
138
- classMethod: 'add'
 
139
  };
140
 
141
- if (this.model.get(attribute) !== 'block') {
142
- eventData.classMethod = 'remove';
143
- }
144
 
145
- api.previewer.trigger('happyforms-part-dom-update', eventData);
146
- }
147
- } );
148
 
149
- var CheckboxOptionView = Backbone.View.extend( {
150
- template: '#happyforms-checkbox-option-customize-template',
 
 
 
151
 
152
- initialize: function(options) {
153
- this.parent = options.parent;
154
- this.frontendTemplate = '#happyforms-checkbox-option-frontend-template';
 
 
 
 
155
 
156
- this.render();
157
  },
158
 
159
- events: {
160
- 'keyup input': 'onInputChange',
161
- 'click .delete-option': 'deleteOption',
162
- 'change .default-option-switch': 'onDefaultOptionCheck'
163
- },
164
 
165
- render: function() {
166
- var template = _.template($(this.template).html());
167
- var html = template(this.model.toJSON());
168
 
169
- this.setElement(html);
 
170
 
171
- return this;
172
- },
 
173
 
174
- /**
175
- * Update model with the changed data. Triggered on change event of inputs in the part view.
176
- *
177
- * @since 1.0.0.
178
- *
179
- * @return void
180
- */
181
- onInputChange: function(e) {
182
- var $input = $(e.target);
183
- var previewSelector = $input.data('preview-selector');
184
- var attribute = $input.attr('data-option-attribute');
185
- var value = $input.val();
186
-
187
- this.model.set(attribute, value);
188
-
189
- if (previewSelector) {
190
- var eventData = {
191
- selector: '#' + this.model.get('id') + ' ' + previewSelector,
192
- text: value
193
- };
194
 
195
- api.previewer.trigger('happyforms-part-dom-update', eventData);
196
- }
197
  },
198
 
199
- /**
200
- * Triggered on 'Delete' button click in each option.
201
- *
202
- * @since 1.0.0.
203
- *
204
- * @param {object} e JS event.
205
- *
206
- * @return void
207
- */
208
- deleteOption: function(e) {
209
- e.preventDefault();
210
-
211
- var eventData = {
212
- subpart_id: this.model.get('id')
213
  };
214
 
215
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
 
 
216
 
217
- this.parent.model.options.remove({ cid: this.model.cid }, { silent: true });
 
 
 
218
 
219
- if ( !this.parent.model.options.length ) {
220
- this.parent.$el.find('.no-options').show();
 
 
221
  }
 
222
 
223
- this.remove();
 
 
 
 
 
 
224
  },
225
 
226
- /**
227
- * Adds 'selected' attribute to option that's selected as default.
228
- * Triggered by 'Make this option default' checkbox.
229
- * Triggers previewer event.
230
- *
231
- * @since 1.0.0.
232
- *
233
- * @param {object} e JS event.
234
- *
235
- * @return void
236
- */
237
- onDefaultOptionCheck: function(e) {
238
- var $input = $(e.target);
239
-
240
- if ($input.is(':checked')) {
241
- this.model.set('is_default', 1);
242
- } else {
243
- this.model.set('is_default', 0);
244
- }
245
 
246
- var eventData = {
247
- selector: '#' + this.model.get('id') + ' input',
248
- props: {
249
- checked: true
250
- }
251
- };
252
 
253
- if (!$input.is(':checked')) {
254
- eventData.props.checked = false;
255
- }
 
256
 
257
- api.previewer.trigger('happyforms-part-dom-update', eventData);
258
  }
259
  } );
260
 
7
  settings.formParts.checkbox.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
+ },
11
+
12
+ initialize: function( attrs, options ) {
13
+ happyForms.classes.models.Part.prototype.initialize.apply( this, arguments );
14
+
15
+ this.attributes.options = new OptionCollection( this.get( 'options' ), options );
16
+ },
17
+
18
+ toJSON: function() {
19
+ var json = Backbone.Model.prototype.toJSON.apply( this, arguments );
20
+ json.options = json.options.toJSON();
21
+
22
+ return json;
23
+ },
24
+ } );
25
+
26
+ var OptionModel = Backbone.Model.extend( {
27
+ defaults: {
28
+ is_default: false,
29
+ label: '',
30
+ },
31
+ } );
32
+
33
+ var OptionCollection = Backbone.Collection.extend( {
34
+ model: OptionModel,
35
  } );
36
 
37
  var CheckboxView = happyForms.classes.views.Part.extend( {
38
+ template: '#customize-happyforms-checkbox-template',
39
+ itemCustomizeTemplate: '#customize-happyforms-checkbox-item-template',
40
 
41
  initialize: function() {
42
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
43
 
44
+ this.listenTo( this.model.get( 'options' ), 'add change remove', this.onOptionsChange );
45
+ this.listenTo( this, 'ready', this.onReady );
 
 
 
46
  },
47
 
48
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
49
  'click .add-option': 'onAddOptionClick',
50
+ 'change [name=display_type]': 'onDisplayTypeChange',
51
+ 'keyup li [name=label]': 'onCheckboxItemLabelChange',
52
+ 'change li [name=is_default]': 'onCheckboxItemDefaultChange',
53
+ 'click li .delete-option': 'onDeleteOptionClick',
54
  } ),
55
 
56
+ onReady: function() {
57
+ this.model.get( 'options' ).each( function( itemModel ) {
58
+ this.appendOptionPartial( itemModel );
59
+ }, this );
 
 
 
 
 
 
 
 
60
  },
61
 
62
+ onOptionsChange: function() {
63
+ this.model.trigger( 'change' );
 
 
 
 
 
 
 
 
 
64
  },
65
 
66
+ appendOptionPartial: function( itemModel ) {
67
+ var customizeTemplate = _.template( $( this.itemCustomizeTemplate ).html() );
68
+ var customizeHTML = customizeTemplate( { item: itemModel.toJSON() } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ $( '.options ul', this.$el ).append( customizeHTML );
71
+ },
 
 
 
 
72
 
73
+ onAddOptionClick: function( e ) {
74
+ e.preventDefault();
75
 
76
+ var itemID = _.uniqueId( this.model.get( 'id' ) + '_option_' );
77
+ var itemModel = new OptionModel( { id: itemID } );
78
+ this.model.get( 'options' ).add( itemModel );
79
 
80
+ this.appendOptionPartial( itemModel );
81
 
82
+ var model = this.model;
 
 
83
 
84
+ this.model.fetchHtml( function( response ) {
85
+ var data = {
86
+ id: model.get( 'id' ),
87
+ html: response,
88
  };
89
 
90
+ api.previewer.send( 'happyforms-form-part-refresh', data );
91
+ } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  },
93
 
94
+ onCheckboxItemLabelChange: function( e ) {
95
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
96
+ var itemModel = this.model.get( 'options' ).get( itemID );
97
 
98
+ itemModel.set( 'label', $( e.target ).val() );
99
 
100
+ var data = {
101
+ id: this.model.get( 'id' ),
102
+ callback: 'onCheckboxItemLabelChangeCallback',
103
+ options: {
104
+ itemID: itemID,
105
+ }
106
  };
107
 
108
+ api.previewer.send( 'happyforms-part-dom-update', data );
109
+ },
 
110
 
111
+ onCheckboxItemDefaultChange: function( e ) {
112
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
113
+ var itemModel = this.model.get( 'options' ).get( itemID );
114
 
115
+ if ( $( e.target ).is( ':checked' ) ) {
116
+ itemModel.set( 'is_default', 1 );
117
+ } else {
118
+ itemModel.set( 'is_default', 0 );
119
+ }
120
 
121
+ var data = {
122
+ id: this.model.get( 'id' ),
123
+ callback: 'onCheckboxItemDefaultChangeCallback',
124
+ options: {
125
+ itemID: itemID,
126
+ }
127
+ };
128
 
129
+ api.previewer.send( 'happyforms-part-dom-update', data );
130
  },
131
 
132
+ onDeleteOptionClick: function( e ) {
133
+ e.preventDefault();
 
 
 
134
 
135
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
136
+ var itemModel = this.model.get( 'options' ).get( itemID );
 
137
 
138
+ this.model.get( 'options' ).remove( itemModel );
139
+ $( '[data-item-id="' + itemModel.get( 'id' ) + '"]', this.$el ).remove();
140
 
141
+ if ( this.model.get( 'options' ).length == 0 ) {
142
+ $( '.options ul', this.$el ).html( '' );
143
+ }
144
 
145
+ var data = {
146
+ id: this.model.get( 'id' ),
147
+ callback: 'onCheckboxItemDeleteCallback',
148
+ options: {
149
+ itemID: itemID,
150
+ }
151
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
154
  },
155
 
156
+ onDisplayTypeChange: function(e) {
157
+ var data = {
158
+ id: this.model.get( 'id' ),
159
+ callback: 'onCheckboxDisplayTypeChangeCallback',
 
 
 
 
 
 
 
 
 
 
160
  };
161
 
162
+ api.previewer.send( 'happyforms-part-dom-update', data );
163
+ }
164
+ } );
165
 
166
+ happyForms.previewer = _.extend( happyForms.previewer, {
167
+ onCheckboxDisplayTypeChangeCallback: function( id, html, options ) {
168
+ var part = this.getPartModel( id );
169
+ var $part = this.getPartElement( html );
170
 
171
+ if ( 'block' === part.get( 'display_type' ) ) {
172
+ $part.addClass( 'display-type--block' );
173
+ } else {
174
+ $part.removeClass( 'display-type--block' );
175
  }
176
+ },
177
 
178
+ onCheckboxItemLabelChangeCallback: function( id, html, options ) {
179
+ var part = this.getPartModel( id );
180
+ var $part = this.getPartElement( html );
181
+ var option = part.get( 'options' ).get( options.itemID );
182
+ var $option = $( '#' + options.itemID, $part );
183
+
184
+ $( 'span.label', $option ).text( option.get( 'label' ) );
185
  },
186
 
187
+ onCheckboxItemDefaultChangeCallback: function( id, html, options ) {
188
+ var part = this.getPartModel( id );
189
+ var $part = this.getPartElement( html );
190
+ var option = part.get( 'options' ).get( options.itemID );
191
+ var $option = $( '#' + options.itemID, $part );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
 
193
+ $( 'input', $option ).prop( 'checked', option.get( 'is_default' ) );
194
+ },
 
 
 
 
195
 
196
+ onCheckboxItemDeleteCallback: function( id, html, options ) {
197
+ var part = this.getPartModel( id );
198
+ var $part = this.getPartElement( html );
199
+ var $option = $( '#' + options.itemID, $part );
200
 
201
+ $option.remove();
202
  }
203
  } );
204
 
assets/js/parts/part-date.js CHANGED
@@ -11,78 +11,98 @@
11
  } );
12
 
13
  var DateView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-date-template',
15
 
16
  initialize: function () {
17
- happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
 
19
- this.listenTo(this.model, 'change:date_type', this.onDateTypeChange);
20
- this.listenTo(this.model, 'change:time_format', this.onTimeFormatChange);
21
  },
22
 
23
- onDateTypeChange: function(model, value) {
24
- var classesToRemove = '';
25
-
26
- if (value === 'date') {
27
- classesToRemove = 'happyforms-part-date--datetime happyforms-part-date--time';
28
- this.$el.find('.time-options').hide();
29
- } else if (value === 'datetime') {
30
- classesToRemove = 'happyforms-part-date--date happyforms-part-date--time';
31
- this.$el.find('.time-options').show();
32
- } else if (value === 'time') {
33
- classesToRemove = 'happyforms-part-date--date happyforms-part-date--datetime';
34
- this.$el.find('.time-options').show();
35
- }
36
 
37
- var eventData = {
38
- part_id: model.id,
39
- selector: 'self',
40
- classes: classesToRemove,
41
- classMethod: 'remove'
42
- };
43
 
44
- // remove classes
45
- api.previewer.trigger('happyforms-part-dom-update', eventData);
 
46
 
47
- eventData.classes = 'happyforms-part-date--' + value;
48
- eventData.classMethod = 'add';
 
 
49
 
50
- // add appropriate class
51
- api.previewer.trigger('happyforms-part-dom-update', eventData);
52
- },
53
 
54
- onTimeFormatChange: function(model, value) {
55
- var eventData = {
56
- part_id: model.id,
57
- selector: '.happyforms-part-date__time-input--period'
58
- };
59
 
60
- var eventDataHoursField = {
61
- part_id: model.id,
62
- selector: '.format-24'
63
- };
64
 
65
- if (value === '12') {
66
- eventData['css'] = {
67
- display: 'block'
68
- };
69
 
70
- eventDataHoursField['css'] = {
71
- display: 'none'
72
- };
73
- } else {
74
- eventData['css'] = {
75
- display: 'none'
76
  };
77
 
78
- eventDataHoursField['css'] = {
79
- display: 'block'
80
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  }
82
 
83
- api.previewer.trigger('happyforms-part-dom-update', eventData);
84
- api.previewer.trigger('happyforms-part-dom-update', eventDataHoursField);
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  } );
87
 
88
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
11
  } );
12
 
13
  var DateView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-date-template',
15
 
16
  initialize: function () {
17
+ happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
 
19
+ this.listenTo( this.model, 'change:date_type', this.onDateTypeChange );
20
+ this.listenTo( this.model, 'change:time_format', this.onTimeFormatChange );
21
  },
22
 
23
+ onDateTypeChange: function() {
24
+ var $timeOptions = $( '.time-options', this.$el );
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ switch ( this.model.get( 'date_type' ) ) {
27
+ case 'date':
28
+ $timeOptions.hide();
29
+ break;
 
 
30
 
31
+ case 'datetime':
32
+ $timeOptions.show();
33
+ break;
34
 
35
+ case 'time':
36
+ $timeOptions.show();
37
+ break;
38
+ }
39
 
40
+ var model = this.model;
 
 
41
 
42
+ model.fetchHtml( function( response ) {
43
+ var data = {
44
+ id: model.get( 'id' ),
45
+ html: response,
46
+ };
47
 
48
+ api.previewer.send( 'happyforms-form-part-refresh', data );
49
+ } );
50
+ },
 
51
 
52
+ onTimeFormatChange: function() {
53
+ var model = this.model;
 
 
54
 
55
+ model.fetchHtml( function( response ) {
56
+ var data = {
57
+ id: model.get( 'id' ),
58
+ html: response,
 
 
59
  };
60
 
61
+ api.previewer.send( 'happyforms-form-part-refresh', data );
62
+ } );
63
+ }
64
+ } );
65
+
66
+ happyForms.previewer = _.extend( happyForms.previewer, {
67
+ onDateDateTypeChangeCallback: function( id, html, options ) {
68
+ var part = this.getPartModel( id );
69
+ var $part = this.getPartElement( html );
70
+ var dateType = part.get( 'date_type' );
71
+
72
+ switch ( dateType ) {
73
+ case 'date':
74
+ $part.removeClass( 'happyforms-part-date--datetime' );
75
+ $part.removeClass( 'happyforms-part-date--time' );
76
+ break;
77
+
78
+ case 'datetime':
79
+ $part.removeClass( 'happyforms-part-date--date' );
80
+ $part.removeClass( 'happyforms-part-date--time' );
81
+ break;
82
+
83
+ case 'time':
84
+ $part.removeClass( 'happyforms-part-date--date' );
85
+ $part.removeClass( 'happyforms-part-date--datetime' );
86
+ break;
87
  }
88
 
89
+ $part.addClass( 'happyforms-part-date--' + dateType );
90
+ },
91
+
92
+ onDateTimeFormatChange: function( id, html, options ) {
93
+ var part = this.getPartModel( id );
94
+ var $part = this.getPartElement( html );
95
+ var $period = this.$( '.happyforms-part-date__time-input--period', $part );
96
+ var $hours = this.$( '.format-24', $part );
97
+
98
+ if ( '12' === part.get( 'time_format' ) ) {
99
+ $period.show();
100
+ $hours.hide();
101
+ } else {
102
+ $period.hide();
103
+ $hours.show();
104
+ }
105
+ },
106
  } );
107
 
108
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
assets/js/parts/part-email.js CHANGED
@@ -11,75 +11,73 @@
11
  } );
12
 
13
  var EmailView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-email-template',
15
- confirmationFieldTemplate: '#happyforms-email-confirmation-template',
16
-
17
- events: _.extend({}, happyForms.classes.views.Part.prototype.events, {
18
- 'change .confirmation-checkbox': 'onConfirmationCheckboxChange'
19
- }),
20
 
21
  initialize: function() {
22
  happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
23
 
24
- this.listenTo(this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange);
 
25
  },
26
 
27
  /**
28
  * Trigger previewer event on 'Require confirmation of the value' checkbox change.
29
  * Adds a new confirmation field to preview.
30
- *
31
  * @since 1.0.0.
32
- *
33
  * @param {object} e JS event.
34
- *
35
  * @return void
36
  */
37
- onConfirmationCheckboxChange: function(e) {
38
- if ($(e.target).is(':checked')) {
39
- this.model.set('confirmation_field_id', this.model.get('id') + '_confirmation');
40
-
41
- this.$el.find('.confirmation-field-setting').show();
42
-
43
- var template = _.template($(this.confirmationFieldTemplate).html());
44
- var html = template(this.model.toJSON());
45
 
46
- var eventData = {
47
- 'part_id': this.model.get('id'),
48
- 'element': html
49
- };
50
-
51
- api.previewer.trigger('happyforms-sub-part-added', eventData);
52
  } else {
53
- this.$el.find('.confirmation-field-setting').hide();
 
54
 
55
- var eventData = {
56
- subpart_id: this.model.get('confirmation_field_id')
 
 
 
 
57
  };
58
 
59
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
60
- }
61
  },
62
 
63
  /**
64
  * Send updated confirmation field label value to previewer.
65
- *
66
  * @since 1.0.0.
67
- *
68
  * @return void
69
  */
70
  onConfirmationLabelChange: function() {
71
- var value = this.model.get('confirmation_field_label');
72
-
73
- var eventData = {
74
- 'part_id': this.model.get('id'),
75
- 'selector': '.happyforms-part__label--confirmation .label',
76
- 'text': value
77
  };
78
 
79
- api.previewer.trigger('happyforms-part-dom-update', eventData);
80
  }
81
  } );
82
 
 
 
 
 
 
 
 
 
 
 
83
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
84
  if ( 'email' === attrs.type ) {
85
  BaseClass = EmailModel;
11
  } );
12
 
13
  var EmailView = happyForms.classes.views.Part.extend( {
14
+ template: '#customize-happyforms-email-template',
 
 
 
 
 
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
 
19
+ this.listenTo( this.model, 'change:confirmation_field', this.onConfirmationChange );
20
+ this.listenTo( this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange );
21
  },
22
 
23
  /**
24
  * Trigger previewer event on 'Require confirmation of the value' checkbox change.
25
  * Adds a new confirmation field to preview.
26
+ *
27
  * @since 1.0.0.
28
+ *
29
  * @param {object} e JS event.
30
+ *
31
  * @return void
32
  */
33
+ onConfirmationChange: function( e ) {
34
+ $confirmationSettings = $( '.confirmation-field-setting', this.$el );
 
 
 
 
 
 
35
 
36
+ if ( this.model.get( 'confirmation_field' ) ) {
37
+ $confirmationSettings.show();
 
 
 
 
38
  } else {
39
+ $confirmationSettings.hide();
40
+ }
41
 
42
+ var model = this.model;
43
+
44
+ model.fetchHtml( function( response ) {
45
+ var data = {
46
+ id: model.get( 'id' ),
47
+ html: response,
48
  };
49
 
50
+ api.previewer.send( 'happyforms-form-part-refresh', data );
51
+ } );
52
  },
53
 
54
  /**
55
  * Send updated confirmation field label value to previewer.
56
+ *
57
  * @since 1.0.0.
58
+ *
59
  * @return void
60
  */
61
  onConfirmationLabelChange: function() {
62
+ var data = {
63
+ id: this.model.get( 'id' ),
64
+ callback: 'onEmailConfirmationLabelChangeCallback',
 
 
 
65
  };
66
 
67
+ api.previewer.send( 'happyforms-part-dom-update', data );
68
  }
69
  } );
70
 
71
+ happyForms.previewer = _.extend( happyForms.previewer, {
72
+ onEmailConfirmationLabelChangeCallback: function( id, html, options ) {
73
+ var part = this.getPartModel( id );
74
+ var $part = this.getPartElement( html );
75
+ var $label = this.$( '.happyforms-part__label--confirmation .label', $part );
76
+
77
+ $label.text( part.get( 'confirmation_field_label' ) );
78
+ },
79
+ } );
80
+
81
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
82
  if ( 'email' === attrs.type ) {
83
  BaseClass = EmailModel;
assets/js/parts/part-legal.js CHANGED
@@ -1,49 +1,57 @@
1
  (function ($, _, Backbone, api, settings) {
2
 
3
- var LegalModel = happyForms.classes.models.Part.extend({
4
- defaults: function () {
5
- return _.extend(
6
- {},
7
- settings.formParts.legal.defaults,
8
- _.result(happyForms.classes.models.Part.prototype, 'defaults'),
9
- );
10
- },
11
- });
12
-
13
- var LegalView = happyForms.classes.views.Part.extend({
14
- template: '#happyforms-legal-template',
15
-
16
- initialize: function() {
17
- happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
-
19
- this.listenTo(this.model, 'change:legal_text', this.onLegalTextChange);
20
- },
21
-
22
- onLegalTextChange: function() {
23
- var eventData = {
24
- part_id: this.model.id,
25
- selector: 'label span',
26
- text: this.model.get('legal_text')
27
- };
28
-
29
- api.previewer.trigger('happyforms-part-dom-update', eventData);
30
- }
31
- });
32
-
33
- happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
34
- if ('legal' === attrs.type) {
35
- BaseClass = LegalModel;
36
- }
37
-
38
- return func(attrs, options, BaseClass);
39
- });
40
-
41
- happyForms.factory.view = _.wrap(happyForms.factory.view, function (func, options, BaseClass) {
42
- if ('legal' === options.type) {
43
- BaseClass = LegalView;
44
- }
45
-
46
- return func(options, BaseClass);
47
- });
48
-
49
- })(jQuery, _, Backbone, wp.customize, _happyFormsSettings);
 
 
 
 
 
 
 
 
1
  (function ($, _, Backbone, api, settings) {
2
 
3
+ var LegalModel = happyForms.classes.models.Part.extend( {
4
+ defaults: function () {
5
+ return _.extend(
6
+ {},
7
+ settings.formParts.legal.defaults,
8
+ _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
+ );
10
+ },
11
+ } );
12
+
13
+ var LegalView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-legal-template',
15
+
16
+ initialize: function() {
17
+ happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
+
19
+ this.listenTo( this.model, 'change:legal_text', this.onLegalTextChange );
20
+ },
21
+
22
+ onLegalTextChange: function() {
23
+ var data = {
24
+ id: this.model.get( 'id' ),
25
+ callback: 'onLegalLegalTextChange',
26
+ };
27
+
28
+ api.previewer.send( 'happyforms-part-dom-update', data );
29
+ }
30
+ } );
31
+
32
+ happyForms.previewer = _.extend( happyForms.previewer, {
33
+ onLegalLegalTextChange: function( id, html, options ) {
34
+ var part = this.getPartModel( id );
35
+ var $part = this.getPartElement( html );
36
+
37
+ this.$( 'label span', $part ).text( part.get( 'legal_text' ) );
38
+ },
39
+ } );
40
+
41
+ happyForms.factory.model = _.wrap( happyForms.factory.model, function ( func, attrs, options, BaseClass ) {
42
+ if ( 'legal' === attrs.type ) {
43
+ BaseClass = LegalModel;
44
+ }
45
+
46
+ return func( attrs, options, BaseClass );
47
+ } );
48
+
49
+ happyForms.factory.view = _.wrap( happyForms.factory.view, function ( func, options, BaseClass ) {
50
+ if ( 'legal' === options.type ) {
51
+ BaseClass = LegalView;
52
+ }
53
+
54
+ return func( options, BaseClass );
55
+ } );
56
+
57
+ } )( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
assets/js/parts/part-multi-line-text.js CHANGED
@@ -11,34 +11,40 @@
11
  } );
12
 
13
  var MultiLineTextView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-multi-line-text-template',
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
 
19
- this.listenTo(this.model, 'change:placeholder', this.onPlaceholderChange)
20
  },
21
 
22
  /**
23
  * Send updated placeholder value to previewer. Added as a special method because of 'textarea' selector used instead of 'input'.
24
- *
25
  * @since 1.0.0.
26
- *
27
  * @return void
28
  */
29
  onPlaceholderChange: function() {
30
- var eventData = {
31
- part_id: this.model.id,
32
- selector: 'textarea',
33
- attributes: {
34
- 'placeholder': this.model.get('placeholder')
35
- }
36
  };
37
 
38
- api.previewer.trigger('happyforms-part-dom-update', eventData);
39
  }
40
  } );
41
 
 
 
 
 
 
 
 
 
 
42
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
43
  if ( 'multi_line_text' === attrs.type ) {
44
  BaseClass = MultiLineTextModel;
11
  } );
12
 
13
  var MultiLineTextView = happyForms.classes.views.Part.extend( {
14
+ template: '#customize-happyforms-multi-line-text-template',
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
 
19
+ this.listenTo( this.model, 'change:placeholder', this.onPlaceholderChange )
20
  },
21
 
22
  /**
23
  * Send updated placeholder value to previewer. Added as a special method because of 'textarea' selector used instead of 'input'.
24
+ *
25
  * @since 1.0.0.
26
+ *
27
  * @return void
28
  */
29
  onPlaceholderChange: function() {
30
+ var data = {
31
+ id: this.model.get( 'id' ),
32
+ callback: 'onMultiLineTextPlaceholderChange',
 
 
 
33
  };
34
 
35
+ api.previewer.send( 'happyforms-part-dom-update', data );
36
  }
37
  } );
38
 
39
+ happyForms.previewer = _.extend( happyForms.previewer, {
40
+ onMultiLineTextPlaceholderChange: function( id, html, options ) {
41
+ var part = this.getPartModel( id );
42
+ var $part = this.getPartElement( html );
43
+
44
+ this.$( 'textarea', $part ).attr( 'placeholder', part.get( 'placeholder' ) );
45
+ },
46
+ } );
47
+
48
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
49
  if ( 'multi_line_text' === attrs.type ) {
50
  BaseClass = MultiLineTextModel;
assets/js/parts/part-number.js CHANGED
@@ -11,107 +11,162 @@
11
  } );
12
 
13
  var NumberView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-number-template',
15
- confirmationFieldTemplate: '#happyforms-number-confirmation-template',
16
 
17
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
18
  'change [name=masked]': 'onMaskedChange',
19
- 'change .confirmation-checkbox': 'onConfirmationCheckboxChange'
20
  } ),
21
 
22
  initialize: function () {
23
- happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
24
 
25
- this.listenTo(this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  },
27
 
28
  /**
29
  * Toggle masked input configuration on `Mask this input` checkbox change.
30
- *
31
  * @since 1.0.0.
32
- *
33
  * @param {object} e JS event.
34
- *
35
  * @return void
36
  */
37
  onMaskedChange: function(e) {
38
- var $input = $(e.target);
39
- var attribute = $input.data('bind');
40
- var $maskWrapper = this.$el.find('.mask-wrapper');
41
 
42
- if ($input.is(':checked')) {
43
- this.model.set(attribute, 1);
44
 
45
  // hide inputs for min / max value setting
46
- this.$el.find('.min-max-wrapper').hide();
47
-
48
  // show actual mask input
49
  $maskWrapper.show();
50
  } else {
51
- this.model.set(attribute, 0);
52
 
53
  // show inputs for min / max value setting
54
- this.$el.find('.min-max-wrapper').show();
55
 
56
  // empty mask input and hide
57
- $maskWrapper.find('input').val('');
58
  $maskWrapper.hide();
59
  }
 
 
 
 
 
 
 
 
 
 
 
60
  },
61
 
62
  /**
63
- * Trigger previewer event on 'Require confirmation of the value' checkbox change.
64
- * Adds a new confirmation field to preview.
65
- *
66
  * @since 1.0.0.
67
- *
68
- * @param {object} e JS event.
69
- *
70
  * @return void
71
  */
72
- onConfirmationCheckboxChange: function (e) {
73
- if ($(e.target).is(':checked')) {
74
- this.model.set('confirmation_field_id', this.model.get('id') + '_confirmation');
 
 
75
 
76
- this.$el.find('.confirmation-field-setting').show();
 
77
 
78
- var template = _.template($(this.confirmationFieldTemplate).html());
79
- var html = template(this.model.toJSON());
 
 
 
80
 
81
- var eventData = {
82
- 'part_id': this.model.get('id'),
83
- 'element': html
84
- };
85
 
86
- api.previewer.trigger('happyforms-sub-part-added', eventData);
87
- } else {
88
- this.$el.find('.confirmation-field-setting').hide();
 
 
89
 
90
- var eventData = {
91
- subpart_id: this.model.get('confirmation_field_id')
92
- };
93
 
94
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
95
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  },
97
 
98
- /**
99
- * Send updated confirmation field label value to previewer.
100
- *
101
- * @since 1.0.0.
102
- *
103
- * @return void
104
- */
105
- onConfirmationLabelChange: function () {
106
- var value = this.model.get('confirmation_field_label');
107
 
108
- var eventData = {
109
- 'part_id': this.model.get('id'),
110
- 'selector': '.happyforms-part__label--confirmation .label',
111
- 'text': value
112
- };
 
 
 
 
 
 
 
 
 
 
113
 
114
- api.previewer.trigger('happyforms-part-dom-update', eventData);
 
115
  }
116
  } );
117
 
11
  } );
12
 
13
  var NumberView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-number-template',
 
15
 
16
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
17
  'change [name=masked]': 'onMaskedChange',
 
18
  } ),
19
 
20
  initialize: function () {
21
+ happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
22
 
23
+ this.listenTo( this.model, 'change:confirmation_field', this.onConfirmationChange );
24
+ this.listenTo( this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange );
25
+ this.listenTo( this.model, 'change:mask_numeric_thousands_delimiter', this.onThousandsDelimiterChange );
26
+ this.listenTo( this.model, 'change:mask_numeric_decimal_mark', this.onDecimalMarkChange );
27
+ this.listenTo( this.model, 'change:mask_numeric_prefix', this.onPrefixChange );
28
+ },
29
+
30
+ onConfirmationChange: function( e ) {
31
+ $confirmationSettings = $( '.confirmation-field-setting', this.$el );
32
+
33
+ if ( this.model.get( 'confirmation_field' ) ) {
34
+ $confirmationSettings.show();
35
+ } else {
36
+ $confirmationSettings.hide();
37
+ }
38
+
39
+ var model = this.model;
40
+
41
+ model.fetchHtml( function( response ) {
42
+ var data = {
43
+ id: model.get( 'id' ),
44
+ html: response,
45
+ };
46
+
47
+ api.previewer.send( 'happyforms-form-part-refresh', data );
48
+ } );
49
  },
50
 
51
  /**
52
  * Toggle masked input configuration on `Mask this input` checkbox change.
53
+ *
54
  * @since 1.0.0.
55
+ *
56
  * @param {object} e JS event.
57
+ *
58
  * @return void
59
  */
60
  onMaskedChange: function(e) {
61
+ var $input = $( e.target );
62
+ var attribute = $input.data( 'bind' );
63
+ var $maskWrapper = this.$el.find( '.mask-wrapper' );
64
 
65
+ if ( $input.is( ':checked' ) ) {
66
+ this.model.set( attribute, 1 );
67
 
68
  // hide inputs for min / max value setting
69
+ this.$el.find( '.min-max-wrapper' ).hide();
70
+
71
  // show actual mask input
72
  $maskWrapper.show();
73
  } else {
74
+ this.model.set( attribute, 0 );
75
 
76
  // show inputs for min / max value setting
77
+ this.$el.find( '.min-max-wrapper' ).show();
78
 
79
  // empty mask input and hide
 
80
  $maskWrapper.hide();
81
  }
82
+
83
+ var model = this.model;
84
+
85
+ this.model.fetchHtml( function( response ) {
86
+ var data = {
87
+ id: model.get( 'id' ),
88
+ html: response,
89
+ };
90
+
91
+ api.previewer.send( 'happyforms-form-part-refresh', data );
92
+ } );
93
  },
94
 
95
  /**
96
+ * Send updated confirmation field label value to previewer.
97
+ *
 
98
  * @since 1.0.0.
99
+ *
 
 
100
  * @return void
101
  */
102
+ onConfirmationLabelChange: function () {
103
+ var data = {
104
+ id: this.model.get( 'id' ),
105
+ callback: 'onNumberConfirmationLabelChangeCallback',
106
+ };
107
 
108
+ api.previewer.send( 'happyforms-part-dom-update', data );
109
+ },
110
 
111
+ onThousandsDelimiterChange: function() {
112
+ var data = {
113
+ id: this.model.get( 'id' ),
114
+ callback: 'onNumberThousandsDelimiterChangeCallback',
115
+ };
116
 
117
+ api.previewer.send( 'happyforms-part-dom-update', data );
118
+ },
 
 
119
 
120
+ onDecimalMarkChange: function() {
121
+ var data = {
122
+ id: this.model.get( 'id' ),
123
+ callback: 'onNumberDecimalMarkChangeCallback',
124
+ };
125
 
126
+ api.previewer.send( 'happyforms-part-dom-update', data );
127
+ },
 
128
 
129
+ onPrefixChange: function() {
130
+ var data = {
131
+ id: this.model.get( 'id' ),
132
+ callback: 'onNumberPrefixChangeCallback',
133
+ };
134
+
135
+ api.previewer.send( 'happyforms-part-dom-update', data );
136
+ }
137
+ } );
138
+
139
+ happyForms.previewer = _.extend( happyForms.previewer, {
140
+ onNumberConfirmationLabelChangeCallback: function( id, html, options ) {
141
+ var part = this.getPartModel( id );
142
+ var $part = this.getPartElement( html );
143
+ var $confirmationLabel = this.$( '.happyforms-part__label--confirmation .label', $part );
144
+
145
+ $confirmationLabel.text( part.get('confirmation_field_label') );
146
  },
147
 
148
+ onNumberThousandsDelimiterChangeCallback: function( id, html, options, $ ) {
149
+ var part = this.getPartModel( id );
150
+ var $part = this.getPartElement( html );
 
 
 
 
 
 
151
 
152
+ $part.attr( 'data-thousands-delimiter', part.get( 'mask_numeric_thousands_delimiter' ) );
153
+ $.fn.happyFormPart.call( $part, 'reinit' );
154
+ },
155
+
156
+ onNumberDecimalMarkChangeCallback: function( id, html, options, $ ) {
157
+ var part = this.getPartModel( id );
158
+ var $part = this.getPartElement( html );
159
+
160
+ $part.attr( 'data-decimal-mark', part.get( 'mask_numeric_decimal_mark' ) );
161
+ $.fn.happyFormPart.call( $part, 'reinit' );
162
+ },
163
+
164
+ onNumberPrefixChangeCallback: function( id, html, options, $ ) {
165
+ var part = this.getPartModel( id );
166
+ var $part = this.getPartElement( html );
167
 
168
+ $part.attr( 'data-prefix', part.get( 'mask_numeric_prefix' ) );
169
+ $.fn.happyFormPart.call( $part, 'reinit' );
170
  }
171
  } );
172
 
assets/js/parts/part-phone.js CHANGED
@@ -1,130 +1,157 @@
1
- (function ($, _, Backbone, api, settings) {
2
 
3
- var PhoneModel = happyForms.classes.models.Part.extend({
4
- defaults: function () {
5
- return _.extend(
6
- {},
7
- settings.formParts.phone.defaults,
8
- _.result(happyForms.classes.models.Part.prototype, 'defaults'),
9
- );
10
- },
11
- });
12
 
13
- var PhoneView = happyForms.classes.views.Part.extend({
14
- template: '#happyforms-phone-template',
15
- confirmationFieldTemplate: '#happyforms-phone-confirmation-template',
16
 
17
- events: _.extend({}, happyForms.classes.views.Part.prototype.events, {
18
- 'change [name=masked]': 'onMaskedChange',
19
- 'change .confirmation-checkbox': 'onConfirmationCheckboxChange'
20
- }),
21
 
22
- initialize: function () {
23
- happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
24
 
25
- this.listenTo(this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange);
26
- },
 
 
27
 
28
  /**
29
- * Toggle masked input configuration on `Mask this input` checkbox change.
30
- *
31
- * @since 1.0.0.
32
- *
33
- * @param {object} e JS event.
34
- *
35
- * @return void
36
- */
37
- onMaskedChange: function (e) {
38
- var $input = $(e.target);
39
- var attribute = $input.data('bind');
40
- var $maskWrapper = this.$el.find('.mask-wrapper');
41
-
42
- if ($input.is(':checked')) {
43
- this.model.set(attribute, 1);
44
-
45
- // show actual mask input
46
- $maskWrapper.show();
47
-
48
- this.$el.find('.number-options--phone').show();
49
- } else {
50
- this.model.set(attribute, 0);
51
-
52
- // empty mask input and hide
53
- $maskWrapper.find('input').val('');
54
- $maskWrapper.hide();
55
- }
56
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
  /**
59
- * Trigger previewer event on 'Require confirmation of the value' checkbox change.
60
- * Adds a new confirmation field to preview.
61
- *
62
- * @since 1.0.0.
63
- *
64
- * @param {object} e JS event.
65
- *
66
- * @return void
67
- */
68
- onConfirmationCheckboxChange: function (e) {
69
- if ($(e.target).is(':checked')) {
70
- this.model.set('confirmation_field_id', this.model.get('id') + '_confirmation');
71
-
72
- this.$el.find('.confirmation-field-setting').show();
73
-
74
- var template = _.template($(this.confirmationFieldTemplate).html());
75
- var html = template(this.model.toJSON());
76
-
77
- var eventData = {
78
- 'part_id': this.model.get('id'),
79
- 'element': html
80
- };
81
-
82
- api.previewer.trigger('happyforms-sub-part-added', eventData);
83
- } else {
84
- this.$el.find('.confirmation-field-setting').hide();
85
-
86
- var eventData = {
87
- subpart_id: this.model.get('confirmation_field_id')
88
- };
89
-
90
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
91
- }
92
- },
93
-
94
- /**
95
- * Send updated confirmation field label value to previewer.
96
- *
97
- * @since 1.0.0.
98
- *
99
- * @return void
100
- */
101
- onConfirmationLabelChange: function () {
102
- var value = this.model.get('confirmation_field_label');
103
-
104
- var eventData = {
105
- 'part_id': this.model.get('id'),
106
- 'selector': '.happyforms-part__label--confirmation .label',
107
- 'text': value
108
- };
109
-
110
- api.previewer.trigger('happyforms-part-dom-update', eventData);
111
- }
112
- });
113
-
114
- happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
115
- if ('phone' === attrs.type) {
116
- BaseClass = PhoneModel;
117
- }
118
-
119
- return func(attrs, options, BaseClass);
120
- });
121
-
122
- happyForms.factory.view = _.wrap(happyForms.factory.view, function (func, options, BaseClass) {
123
- if ('phone' === options.type) {
124
- BaseClass = PhoneView;
125
- }
126
-
127
- return func(options, BaseClass);
128
- });
129
-
130
- })(jQuery, _, Backbone, wp.customize, _happyFormsSettings);
 
 
1
+ ( function ( $, _, Backbone, api, settings ) {
2
 
3
+ var PhoneModel = happyForms.classes.models.Part.extend( {
4
+ defaults: function () {
5
+ return _.extend(
6
+ {},
7
+ settings.formParts.phone.defaults,
8
+ _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
+ );
10
+ },
11
+ } );
12
 
13
+ var PhoneView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-phone-template',
 
15
 
16
+ events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
17
+ 'change [name=masked]': 'onMaskedChange',
18
+ } ),
 
19
 
20
+ initialize: function () {
21
+ happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
22
 
23
+ this.listenTo( this.model, 'change:confirmation_field', this.onConfirmationChange );
24
+ this.listenTo( this.model, 'change:confirmation_field_label', this.onConfirmationLabelChange );
25
+ this.listenTo( this.model, 'change:mask_phone_country', this.onCountryChange );
26
+ },
27
 
28
  /**
29
+ * Toggle masked input configuration on `Mask this input` checkbox change.
30
+ *
31
+ * @since 1.0.0.
32
+ *
33
+ * @param {object} e JS event.
34
+ *
35
+ * @return void
36
+ */
37
+ onMaskedChange: function( e ) {
38
+ var $input = $( e.target );
39
+ var attribute = $input.data( 'bind' );
40
+ var $maskWrapper = $( '.number-options--phone', this.$el );
41
+
42
+ if ( $input.is( ':checked' ) ) {
43
+ this.model.set( attribute, 1 );
44
+ $maskWrapper.show();
45
+ } else {
46
+ this.model.set( attribute, 0 );
47
+ $maskWrapper.hide();
48
+ }
49
+
50
+ var model = this.model;
51
+
52
+ this.model.fetchHtml( function( response ) {
53
+ var data = {
54
+ id: model.get( 'id' ),
55
+ html: response,
56
+ };
57
+
58
+ api.previewer.send( 'happyforms-form-part-refresh', data );
59
+ } );
60
+ },
61
+
62
+ onConfirmationChange: function( e ) {
63
+ $confirmationSettings = $( '.confirmation-field-setting', this.$el );
64
+
65
+ if ( this.model.get( 'confirmation_field' ) ) {
66
+ $confirmationSettings.show();
67
+ } else {
68
+ $confirmationSettings.hide();
69
+ }
70
+
71
+ var model = this.model;
72
+
73
+ model.fetchHtml( function( response ) {
74
+ var data = {
75
+ id: model.get( 'id' ),
76
+ html: response,
77
+ };
78
+
79
+ api.previewer.send( 'happyforms-form-part-refresh', data );
80
+ } );
81
+ },
82
 
83
  /**
84
+ * Send updated confirmation field label value to previewer.
85
+ *
86
+ * @since 1.0.0.
87
+ *
88
+ * @return void
89
+ */
90
+ onConfirmationLabelChange: function () {
91
+ var data = {
92
+ id: this.model.get( 'id' ),
93
+ callback: 'onPhoneConfirmationLabelChange',
94
+ };
95
+
96
+ api.previewer.send( 'happyforms-part-dom-update', data );
97
+ },
98
+
99
+ onCountryChange: function() {
100
+ var data = {
101
+ id: this.model.get( 'id' ),
102
+ callback: 'onPhoneCountryChangeCallback',
103
+ };
104
+
105
+ api.previewer.send( 'happyforms-part-dom-update', data );
106
+ },
107
+ } );
108
+
109
+ happyForms.previewer = _.extend( happyForms.previewer, {
110
+ onPhoneConfirmationAdd: function( id, html, options ) {
111
+ var part = this.getPartModel( id );
112
+ var $part = this.getPartElement( html );
113
+
114
+ $part.append( this.$( options.confirmationHTML ) );
115
+ },
116
+
117
+ onPhoneConfirmationRemove: function( id, html, options ) {
118
+ var part = this.getPartModel( id );
119
+ var $part = this.getPartElement( html );
120
+
121
+ this.$( '#' + part.id + '_confirmation', $part ).remove();
122
+ },
123
+
124
+ onPhoneConfirmationLabelChange: function( id, html, options ) {
125
+ var part = this.getPartModel( id );
126
+ var $part = this.getPartElement( html );
127
+ var $confirmationLabel = this.$( '.happyforms-part__label--confirmation .label', $part );
128
+
129
+ $confirmationLabel.text( part.get('confirmation_field_label') );
130
+ },
131
+
132
+ onPhoneCountryChangeCallback: function( id, html, options, $ ) {
133
+ var part = this.getPartModel( id );
134
+ var $part = this.getPartElement( html );
135
+
136
+ $part.attr( 'data-country', part.get( 'mask_phone_country' ) );
137
+ $.fn.happyFormPart.call( $part, 'reinit' );
138
+ },
139
+ } );
140
+
141
+ happyForms.factory.model = _.wrap( happyForms.factory.model, function ( func, attrs, options, BaseClass ) {
142
+ if ( 'phone' === attrs.type ) {
143
+ BaseClass = PhoneModel;
144
+ }
145
+
146
+ return func( attrs, options, BaseClass );
147
+ } );
148
+
149
+ happyForms.factory.view = _.wrap( happyForms.factory.view, function ( func, options, BaseClass ) {
150
+ if ( 'phone' === options.type ) {
151
+ BaseClass = PhoneView;
152
+ }
153
+
154
+ return func( options, BaseClass );
155
+ } );
156
+
157
+ } )( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
assets/js/parts/part-placeholder.js CHANGED
@@ -11,7 +11,7 @@
11
  } );
12
 
13
  var PlaceholderView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-placeholder-template',
15
  editor: null,
16
 
17
  ready: function() {
@@ -41,32 +41,31 @@
41
 
42
  /**
43
  * Triggere previewer event on each `keyup` and `change` event in the WP editor.
44
- *
45
  * @since 1.0.0.
46
- *
47
  * @param {object} editor TinyMCE editor JS object.
48
- *
49
  * @return void
50
  */
51
  onEditorInit: function( editor ) {
52
  editor.on( 'keyup change', function() {
53
  this.model.set( 'placeholder_text', editor.getContent() );
54
 
55
- var eventData = {
56
- part_id: this.model.id,
57
- selector: '.happyforms-part__el',
58
- html: editor.getContent()
59
  };
60
 
61
- api.previewer.trigger('happyforms-part-dom-update', eventData);
62
  }.bind( this ) );
63
  },
64
 
65
  /**
66
  * Add a special treatment for removing WP editor when the part is removed.
67
- *
68
  * @since 1.0.0.
69
- *
70
  * @return void
71
  */
72
  remove: function() {
@@ -79,6 +78,15 @@
79
  }
80
  } );
81
 
 
 
 
 
 
 
 
 
 
82
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
83
  if ( 'placeholder' === attrs.type ) {
84
  BaseClass = PlaceholderModel;
11
  } );
12
 
13
  var PlaceholderView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-placeholder-template',
15
  editor: null,
16
 
17
  ready: function() {
41
 
42
  /**
43
  * Triggere previewer event on each `keyup` and `change` event in the WP editor.
44
+ *
45
  * @since 1.0.0.
46
+ *
47
  * @param {object} editor TinyMCE editor JS object.
48
+ *
49
  * @return void
50
  */
51
  onEditorInit: function( editor ) {
52
  editor.on( 'keyup change', function() {
53
  this.model.set( 'placeholder_text', editor.getContent() );
54
 
55
+ var data = {
56
+ id: this.model.get( 'id' ),
57
+ callback: 'onPlaceholderTextChange',
 
58
  };
59
 
60
+ api.previewer.send( 'happyforms-part-dom-update', data );
61
  }.bind( this ) );
62
  },
63
 
64
  /**
65
  * Add a special treatment for removing WP editor when the part is removed.
66
+ *
67
  * @since 1.0.0.
68
+ *
69
  * @return void
70
  */
71
  remove: function() {
78
  }
79
  } );
80
 
81
+ happyForms.previewer = _.extend( happyForms.previewer, {
82
+ onPlaceholderTextChange: function( id, html, options ) {
83
+ var part = this.getPartModel( id );
84
+ var $part = this.getPartElement( html );
85
+
86
+ this.$( '.happyforms-part__el', $part ).html( part.get( 'placeholder_text' ) );
87
+ },
88
+ } );
89
+
90
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
91
  if ( 'placeholder' === attrs.type ) {
92
  BaseClass = PlaceholderModel;
assets/js/parts/part-radio.js CHANGED
@@ -7,270 +7,238 @@
7
  settings.formParts.radio.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  } );
12
 
13
  var RadioView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-radio-template',
 
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
 
19
- this.model.options = new Backbone.Collection();
20
-
21
- this.listenTo(this.model.options, 'add', this.onOptionsChange);
22
- this.listenTo(this.model.options, 'change', this.onOptionsChange);
23
- this.listenTo(this.model.options, 'remove', this.onOptionsChange);
24
  },
25
 
26
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
27
  'click .add-option': 'onAddOptionClick',
 
 
 
 
28
  'change [name=display_type]': 'onDisplayTypeChange'
29
  } ),
30
 
31
- ready: function() {
32
- var self = this;
 
 
 
33
 
34
- happyForms.classes.views.Part.prototype.ready.apply( this, arguments );
 
 
35
 
36
- _(this.model.get('options')).each(function(option) {
37
- var optionModel = new Backbone.Model({
38
- id: option.id,
39
- is_default: option.is_default,
40
- label: option.label
41
- });
42
 
43
- this.createNewOption(optionModel);
44
- }, this);
45
  },
46
 
47
- /**
48
- * Hide 'No options added yet' message and call `createNewOption` method on 'Add option' button click.
49
- *
50
- * @since 1.0.0.
51
- *
52
- * @return void
53
- */
54
- onAddOptionClick: function() {
55
- this.$el.find('.no-options').hide();
56
-
57
- this.createNewOption(false, false);
58
- },
59
 
60
- /**
61
- * Creates new option model and view, adds to a collection.
62
- *
63
- * @since 1.0.0.
64
- *
65
- * @param {object} [optionModel=''] Existing option model.
66
- * @param {bool} [skipPreviewTrigger=true] Boolean to tell if creation of new model should trigger preview event or not.
67
- *
68
- * @return void
69
- */
70
- createNewOption: function(optionModel, skipPreviewTrigger) {
71
- var self = this;
72
- var model = (optionModel) ? optionModel : '';
73
-
74
- if ( typeof skipPreviewTrigger === 'undefined' ) {
75
- skipPreviewTrigger = true;
76
- }
77
 
78
- if (model === '') {
79
- var optionId = _.uniqueId(self.model.get('id') + '_option_');
80
 
81
- model = new Backbone.Model({
82
- id: optionId,
83
- is_default: 0,
84
- label: '',
85
- description: ''
86
- });
87
- }
88
 
89
- this.model.options.add(model, { silent: true });
 
 
 
 
90
 
91
- var view = new RadioOptionView({ model: model, parent: this });
 
 
92
 
93
- $('.options', this.$el).append(view.$el);
 
94
 
95
- if ( !skipPreviewTrigger ) {
96
- var template = _.template($(view.frontendTemplate).html());
97
- var html = template(view.model.toJSON());
98
 
99
- var eventData = {
100
- 'part_id': this.model.get('id'),
101
- 'element': html,
102
- 'appendTo': '.happyforms-part__el'
103
- };
104
 
105
- api.previewer.trigger('happyforms-sub-part-added', eventData);
 
106
  }
107
 
108
- view.trigger('ready');
109
- },
 
 
 
 
 
110
 
111
- /**
112
- * Update options in the part model on options collection change.
113
- *
114
- * @since 1.0.0.
115
- *
116
- * @param {object} data Backbone collection of options.
117
- *
118
- * @return {object}
119
- */
120
- onOptionsChange: function(data) {
121
- var options = this.model.options;
122
- var optionsArray = [];
123
-
124
- options.each(function(model, index) {
125
- optionsArray.push(model.attributes);
126
- });
127
-
128
- this.model.set('options', optionsArray);
129
-
130
- return data;
131
  },
132
 
133
- onDisplayTypeChange: function(e) {
134
- var $input = $(e.target);
135
- var attribute = $input.data('bind');
136
 
137
- this.model.set(attribute, $input.val());
138
 
139
- var eventData = {
140
- part_id: this.model.id,
141
- selector: 'self',
142
- classes: 'display-type--block',
143
- classMethod: 'add'
 
144
  };
145
 
146
- if (this.model.get(attribute) !== 'block') {
147
- eventData.classMethod = 'remove';
148
- }
149
-
150
- api.previewer.trigger('happyforms-part-dom-update', eventData);
151
- }
152
- } );
153
-
154
- var RadioOptionView = Backbone.View.extend( {
155
- template: '#happyforms-radio-option-customize-template',
156
-
157
- initialize: function(options) {
158
- this.parent = options.parent;
159
- this.frontendTemplate = '#happyforms-radio-option-frontend-template';
160
 
161
- this.render();
 
 
162
 
163
- this.listenTo(this, 'ready', this.ready);
164
 
165
- this.listenTo(this.parent.model, 'change:display_type', this.onDisplayTypeChange);
166
- },
 
 
 
 
 
167
 
168
- events: {
169
- 'keyup input': 'onInputChange',
170
- 'click .delete-option': 'deleteOption',
171
- 'change .default-option-switch': 'onDefaultOptionCheck'
172
  },
173
 
174
- render: function() {
175
- var template = _.template($(this.template).html());
176
- var html = template(this.model.toJSON());
 
177
 
178
- this.setElement(html);
 
 
179
 
180
- return this;
181
- },
182
 
183
- /**
184
- * Update model with the changed data. Triggered on change event of inputs in the part view.
185
- *
186
- * @since 1.0.0.
187
- *
188
- * @return void
189
- */
190
- onInputChange: function(e) {
191
- var $input = $(e.target);
192
- var previewSelector = $input.data('preview-selector');
193
- var attribute = $input.attr('data-option-attribute');
194
- var value = $input.val();
195
-
196
- this.model.set(attribute, value);
197
-
198
- if (attribute === 'description') {
199
- previewSelector = '+ ' + previewSelector;
200
  }
201
 
202
- if (previewSelector) {
203
- var eventData = {
204
- selector: '#' + this.model.get('id') + ' ' + previewSelector,
205
- text: value
206
- };
 
 
207
 
208
- api.previewer.trigger('happyforms-part-dom-update', eventData);
209
- }
210
  },
211
 
212
- /**
213
- * Triggered on 'Delete' button click in each option.
214
- *
215
- * @since 1.0.0.
216
- *
217
- * @param {object} e JS event.
218
- *
219
- * @return void
220
- */
221
- deleteOption: function(e) {
222
- e.preventDefault();
223
 
224
- var eventData = {
225
- subpart_id: this.model.get('id')
226
- };
227
 
228
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
 
 
 
229
 
230
- this.parent.model.options.remove({ cid: this.model.cid }, { silent: true });
 
 
231
 
232
- if ( !this.parent.model.options.length ) {
233
- this.parent.$el.find('.no-options').show();
234
- }
 
 
235
 
236
- this.remove();
237
  },
238
 
239
- /**
240
- * Adds 'selected' attribute to option that's selected as default.
241
- * Triggered by 'Make this option default' checkbox.
242
- * Triggers previewer event.
243
- *
244
- * @since 1.0.0.
245
- *
246
- * @param {object} e JS event.
247
- *
248
- * @return void
249
- */
250
- onDefaultOptionCheck: function(e) {
251
- var $input = $(e.target);
252
-
253
- if ($input.is(':checked')) {
254
- this.model.set('is_default', 1);
255
- this.parent.$el.find('.default-option-switch').not($input).prop('checked', false).attr('disabled', true);
256
  } else {
257
- this.model.set('is_default', 0);
258
- this.parent.$el.find('.default-option-switch').not($input).prop('checked', false).removeAttr('disabled');
259
  }
 
260
 
261
- var eventData = {
262
- selector: '#' + this.model.get('id') + ' input',
263
- props: {
264
- checked: true
265
- }
266
- };
267
 
268
- if (!$input.is(':checked')) {
269
- eventData.props.checked = false;
270
- }
271
 
272
- api.previewer.trigger('happyforms-part-dom-update', eventData);
273
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  } );
275
 
276
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
7
  settings.formParts.radio.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
+ },
11
+
12
+ initialize: function( attrs, options ) {
13
+ happyForms.classes.models.Part.prototype.initialize.apply( this, arguments );
14
+
15
+ this.attributes.options = new OptionCollection( this.get( 'options' ), options );
16
+ },
17
+
18
+ toJSON: function() {
19
+ var json = Backbone.Model.prototype.toJSON.apply( this, arguments );
20
+ json.options = json.options.toJSON();
21
+
22
+ return json;
23
+ },
24
+ } );
25
+
26
+ var OptionModel = Backbone.Model.extend( {
27
+ defaults: {
28
+ is_default: false,
29
+ label: '',
30
+ description: '',
31
+ },
32
+ } );
33
+
34
+ var OptionCollection = Backbone.Collection.extend( {
35
+ model: OptionModel,
36
  } );
37
 
38
  var RadioView = happyForms.classes.views.Part.extend( {
39
+ template: '#customize-happyforms-radio-template',
40
+ itemCustomizeTemplate: '#customize-happyforms-radio-item-template',
41
 
42
  initialize: function() {
43
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
44
 
45
+ this.listenTo( this.model.get( 'options' ), 'add change remove', this.onOptionsChange );
46
+ this.listenTo( this, 'ready', this.onReady );
 
 
 
47
  },
48
 
49
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
50
  'click .add-option': 'onAddOptionClick',
51
+ 'click .delete-option': 'onDeleteOptionClick',
52
+ 'keyup li [name=option_label]': 'onItemLabelChange',
53
+ 'keyup li [name=option_description]': 'onItemDescriptionChange',
54
+ 'change li [name=option_is_default]': 'onItemDefaultChange',
55
  'change [name=display_type]': 'onDisplayTypeChange'
56
  } ),
57
 
58
+ onReady: function() {
59
+ this.model.get( 'options' ).each( function( itemModel ) {
60
+ this.appendOptionPartial( itemModel );
61
+ }, this );
62
+ },
63
 
64
+ onOptionsChange: function() {
65
+ this.model.trigger( 'change' );
66
+ },
67
 
68
+ appendOptionPartial: function( itemModel ) {
69
+ var customizeTemplate = _.template( $( this.itemCustomizeTemplate ).html() );
70
+ var customizeHTML = customizeTemplate( { item: itemModel.toJSON() } );
 
 
 
71
 
72
+ $( '.options ul', this.$el ).append( customizeHTML );
 
73
  },
74
 
75
+ onAddOptionClick: function( e ) {
76
+ e.preventDefault();
 
 
 
 
 
 
 
 
 
 
77
 
78
+ var itemID = _.uniqueId( this.model.get( 'id' ) + '_option_' );
79
+ var itemModel = new OptionModel( { id: itemID } );
80
+ this.model.get( 'options' ).add( itemModel );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
+ this.appendOptionPartial( itemModel );
 
83
 
84
+ var model = this.model;
 
 
 
 
 
 
85
 
86
+ this.model.fetchHtml( function( response ) {
87
+ var data = {
88
+ id: model.get( 'id' ),
89
+ html: response,
90
+ };
91
 
92
+ api.previewer.send( 'happyforms-form-part-refresh', data );
93
+ } );
94
+ },
95
 
96
+ onDeleteOptionClick: function( e ) {
97
+ e.preventDefault();
98
 
99
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
100
+ var itemModel = this.model.get( 'options' ).get( itemID );
 
101
 
102
+ this.model.get( 'options' ).remove( itemModel );
103
+ $( '[data-item-id="' + itemID + '"]', this.$el ).remove();
 
 
 
104
 
105
+ if ( this.model.get( 'options' ).length == 0 ) {
106
+ $( '.options ul', this.$el ).html( '' );
107
  }
108
 
109
+ var data = {
110
+ id: this.model.get( 'id' ),
111
+ callback: 'onRadioItemDeleteCallback',
112
+ options: {
113
+ itemID: itemID,
114
+ }
115
+ };
116
 
117
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  },
119
 
120
+ onItemLabelChange: function( e ) {
121
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
122
+ var itemModel = this.model.get( 'options' ).get( itemID );
123
 
124
+ itemModel.set( 'label', $( e.target ).val() );
125
 
126
+ var data = {
127
+ id: this.model.get( 'id' ),
128
+ callback: 'onRadioItemLabelChangeCallback',
129
+ options: {
130
+ itemID: itemID,
131
+ }
132
  };
133
 
134
+ api.previewer.send( 'happyforms-part-dom-update', data );
135
+ },
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
+ onItemDescriptionChange: function( e ) {
138
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
139
+ var itemModel = this.model.get( 'options' ).get( itemID );
140
 
141
+ itemModel.set( 'description', $( e.target ).val() );
142
 
143
+ var data = {
144
+ id: this.model.get( 'id' ),
145
+ callback: 'onRadioItemDescriptionChangeCallback',
146
+ options: {
147
+ itemID: itemID,
148
+ }
149
+ };
150
 
151
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
 
 
152
  },
153
 
154
+ onItemDefaultChange: function( e ) {
155
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
156
+ var itemModel = this.model.get( 'options' ).get( itemID );
157
+ var isChecked = $( e.target ).is( ':checked' );
158
 
159
+ this.model.get( 'options' ).forEach( function( item ) {
160
+ item.set( 'is_default', 0 );
161
+ } );
162
 
163
+ $( 'li [name=option_is_default]', this.$el ).attr( 'checked', false );
 
164
 
165
+ if ( isChecked ) {
166
+ itemModel.set( 'is_default', 1 );
167
+ $( e.target ).attr( 'checked', true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  }
169
 
170
+ var data = {
171
+ id: this.model.get( 'id' ),
172
+ callback: 'onRadioItemDefaultChangeCallback',
173
+ options: {
174
+ itemID: itemID,
175
+ }
176
+ };
177
 
178
+ api.previewer.send( 'happyforms-part-dom-update', data );
 
179
  },
180
 
181
+ onDisplayTypeChange: function(e) {
182
+ var $input = $( e.target );
183
+ var attribute = $input.data( 'bind' );
 
 
 
 
 
 
 
 
184
 
185
+ this.model.set( attribute, $input.val() );
 
 
186
 
187
+ var data = {
188
+ id: this.model.get( 'id' ),
189
+ callback: 'onRadioDisplayTypeChangeCallback',
190
+ };
191
 
192
+ api.previewer.send( 'happyforms-part-dom-update', data );
193
+ }
194
+ } );
195
 
196
+ happyForms.previewer = _.extend( happyForms.previewer, {
197
+ onRadioItemDeleteCallback: function( id, html, options ) {
198
+ var part = this.getPartModel( id );
199
+ var $part = this.getPartElement( html );
200
+ var $option = $( '#' + options.itemID, $part );
201
 
202
+ $option.remove();
203
  },
204
 
205
+ onRadioDisplayTypeChangeCallback: function( id, html, options ) {
206
+ var part = this.getPartModel( id );
207
+ var $part = this.getPartElement( html );
208
+
209
+ if ( 'block' === part.get( 'display_type' ) ) {
210
+ $part.addClass( 'display-type--block' );
 
 
 
 
 
 
 
 
 
 
 
211
  } else {
212
+ $part.removeClass( 'display-type--block' );
 
213
  }
214
+ },
215
 
216
+ onRadioItemLabelChangeCallback: function( id, html, options ) {
217
+ var part = this.getPartModel( id );
218
+ var $part = this.getPartElement( html );
219
+ var option = part.get( 'options' ).get( options.itemID );
220
+ var $option = $( '#' + options.itemID, $part );
 
221
 
222
+ this.$( 'span.label', $option ).text( option.get( 'label' ) );
223
+ },
 
224
 
225
+ onRadioItemDescriptionChangeCallback: function( id, html, options ) {
226
+ var part = this.getPartModel( id );
227
+ var $part = this.getPartElement( html );
228
+ var option = part.get( 'options' ).get( options.itemID );
229
+ var $option = $( '#' + options.itemID, $part );
230
+
231
+ this.$( '.happyforms-part-option__description', $option ).text( option.get( 'description' ) );
232
+ },
233
+
234
+ onRadioItemDefaultChangeCallback: function( id, html, options ) {
235
+ var part = this.getPartModel( id );
236
+ var $part = this.getPartElement( html );
237
+ var option = part.get( 'options' ).get( options.itemID );
238
+ var $option = $( '#' + options.itemID, $part );
239
+
240
+ this.$( 'input', $option ).prop( 'checked', option.get( 'is_default' ) );
241
+ },
242
  } );
243
 
244
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
assets/js/parts/part-rating.js CHANGED
@@ -1,33 +1,33 @@
1
- (function ($, _, Backbone, api, settings) {
2
 
3
- var RatingModel = happyForms.classes.models.Part.extend({
4
- defaults: function () {
5
- return _.extend(
6
- {},
7
- settings.formParts.rating.defaults,
8
- _.result(happyForms.classes.models.Part.prototype, 'defaults'),
9
- );
10
- },
11
- });
12
 
13
- var RatingView = happyForms.classes.views.Part.extend({
14
- template: '#happyforms-rating-template'
15
- });
16
 
17
- happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
18
- if ('rating' === attrs.type) {
19
- BaseClass = RatingModel;
20
- }
21
 
22
- return func(attrs, options, BaseClass);
23
- });
24
 
25
- happyForms.factory.view = _.wrap(happyForms.factory.view, function (func, options, BaseClass) {
26
- if ('rating' === options.type) {
27
- BaseClass = RatingView;
28
- }
29
 
30
- return func(options, BaseClass);
31
- });
32
 
33
- })(jQuery, _, Backbone, wp.customize, _happyFormsSettings);
1
+ ( function ( $, _, Backbone, api, settings ) {
2
 
3
+ var RatingModel = happyForms.classes.models.Part.extend({
4
+ defaults: function () {
5
+ return _.extend(
6
+ {},
7
+ settings.formParts.rating.defaults,
8
+ _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
+ );
10
+ },
11
+ } );
12
 
13
+ var RatingView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-rating-template'
15
+ } );
16
 
17
+ happyForms.factory.model = _.wrap( happyForms.factory.model, function ( func, attrs, options, BaseClass ) {
18
+ if ( 'rating' === attrs.type ) {
19
+ BaseClass = RatingModel;
20
+ }
21
 
22
+ return func( attrs, options, BaseClass );
23
+ } );
24
 
25
+ happyForms.factory.view = _.wrap( happyForms.factory.view, function ( func, options, BaseClass ) {
26
+ if ( 'rating' === options.type ) {
27
+ BaseClass = RatingView;
28
+ }
29
 
30
+ return func( options, BaseClass );
31
+ } );
32
 
33
+ } )( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
assets/js/parts/part-scale.js CHANGED
@@ -1,134 +1,165 @@
1
- (function ($, _, Backbone, api, settings) {
2
-
3
- var ScaleModel = happyForms.classes.models.Part.extend({
4
- defaults: function () {
5
- return _.extend(
6
- {},
7
- settings.formParts.scale.defaults,
8
- _.result(happyForms.classes.models.Part.prototype, 'defaults'),
9
- );
10
- },
11
- });
12
-
13
- var ScaleView = happyForms.classes.views.Part.extend({
14
- template: '#happyforms-scale-template',
15
-
16
- initialize: function() {
17
- happyForms.classes.views.Part.prototype.initialize.apply(this, arguments);
18
-
19
- this.listenTo(this.model, 'change:min_value', this.onMinValueChange);
20
- this.listenTo(this.model, 'change:max_value', this.onMaxValueChange);
21
- this.listenTo(this.model, 'change:step', this.onStepChange);
22
- this.listenTo(this.model, 'change:min_label', this.onMinLabelChange);
23
- this.listenTo(this.model, 'change:max_label', this.onMaxLabelChange);
24
- },
25
-
26
- onMinValueChange: function(model, value) {
27
- var eventData = {
28
- part_id: model.id,
29
- selector: 'input',
30
- attributes: {
31
- 'min': value,
32
- 'value': value,
33
- }
34
- };
35
-
36
- if (model.get('max_value') < value) {
37
- eventData.attributes['max'] = value + 1;
38
- }
39
-
40
- api.previewer.trigger('happyforms-part-dom-update', eventData);
41
-
42
- eventData = {
43
- part_id: model.id,
44
- selector: 'output',
45
- text: value
46
- };
47
-
48
- api.previewer.trigger('happyforms-part-dom-update', eventData);
49
- },
50
-
51
- onMaxValueChange: function(model, value) {
52
- var eventData = {
53
- part_id: model.id,
54
- selector: 'input',
55
- attributes: {
56
- 'max': value
57
- }
58
- };
59
-
60
- if (model.get('min_value') > value) {
61
- eventData.attributes['max'] = model.get('min_value') + 1;
62
- }
63
-
64
- api.previewer.trigger('happyforms-part-dom-update', eventData);
65
- },
66
-
67
- onStepChange: function(model, value) {
68
- var eventData = {
69
- part_id: model.id,
70
- selector: 'input',
71
- attributes: {
72
- 'step': value
73
- }
74
- };
75
-
76
- api.previewer.trigger('happyforms-part-dom-update', eventData);
77
- },
78
-
79
- onMinLabelChange: function(model, value) {
80
- var eventData = {
81
- part_id: model.id,
82
- selector: '.label-min',
83
- text: value
84
- };
85
-
86
- api.previewer.trigger('happyforms-part-dom-update', eventData);
87
- },
88
-
89
- onMaxLabelChange: function (model, value) {
90
- var eventData = {
91
- part_id: model.id,
92
- selector: '.label-max',
93
- text: value
94
- };
95
-
96
- api.previewer.trigger('happyforms-part-dom-update', eventData);
97
- }
98
- });
99
-
100
- happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
101
- if ('scale' === attrs.type) {
102
- BaseClass = ScaleModel;
103
- }
104
-
105
- return func(attrs, options, BaseClass);
106
- });
107
-
108
- happyForms.factory.view = _.wrap(happyForms.factory.view, function (func, options, BaseClass) {
109
- if ('scale' === options.type) {
110
- BaseClass = ScaleView;
111
- }
112
-
113
- return func(options, BaseClass);
114
- });
115
-
116
- api.bind('ready', function () {
117
- api.previewer.bind('happyforms-part-render', function ($el) {
118
- if (!$el.is('.happyforms-part--scale')) {
119
- return;
120
- }
121
-
122
- $('input', $el).happyFormsScale();
123
- });
124
-
125
- api.previewer.bind('happyforms-part-dom-updated', function ($el) {
126
- if (!$el.is('.happyforms-part--scale')) {
127
- return;
128
- }
129
-
130
- $('input', $el).happyFormsScale();
131
- });
132
- });
133
-
134
- })(jQuery, _, Backbone, wp.customize, _happyFormsSettings);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ( function ( $, _, Backbone, api, settings ) {
2
+
3
+ var ScaleModel = happyForms.classes.models.Part.extend( {
4
+ defaults: function () {
5
+ return _.extend(
6
+ {},
7
+ settings.formParts.scale.defaults,
8
+ _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
+ );
10
+ },
11
+ } );
12
+
13
+ var ScaleView = happyForms.classes.views.Part.extend( {
14
+ template: '#happyforms-customize-scale-template',
15
+
16
+ initialize: function() {
17
+ happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
+
19
+ this.listenTo( this.model, 'change:min_value', this.onMinValueChange );
20
+ this.listenTo( this.model, 'change:max_value', this.onMaxValueChange );
21
+ this.listenTo( this.model, 'change:default_value', this.onDefaultValueChange );
22
+ this.listenTo( this.model, 'change:step', this.onStepChange );
23
+ this.listenTo( this.model, 'change:min_label', this.onMinLabelChange );
24
+ this.listenTo( this.model, 'change:max_label', this.onMaxLabelChange );
25
+ },
26
+
27
+ onMinValueChange: function( model, value ) {
28
+ this.refreshValues();
29
+
30
+ $( '[data-bind=default_value]', this.$el ).val( this.model.get( 'default_value' ) );
31
+ },
32
+
33
+ onMaxValueChange: function( model, value ) {
34
+ this.refreshValues();
35
+
36
+ $( '[data-bind=default_value]', this.$el ).val( this.model.get( 'default_value' ) );
37
+ },
38
+
39
+ onDefaultValueChange: function( model, value ) {
40
+ this.refreshValues();
41
+ },
42
+
43
+ refreshValues: function() {
44
+ var minValue = parseInt( this.model.get( 'min_value' ), 10 );
45
+ var maxValue = parseInt( this.model.get( 'max_value' ) );
46
+
47
+ minValue = isNaN( minValue ) ? 0 : minValue;
48
+ maxValue = isNaN( maxValue ) ? 0 : maxValue;
49
+
50
+ defaultValue = Math.floor( minValue + ( maxValue - minValue ) / 2 );
51
+
52
+ this.model.set( 'default_value', defaultValue );
53
+
54
+ var data = {
55
+ id: this.model.get( 'id' ),
56
+ callback: 'onScaleValuesChange',
57
+ };
58
+
59
+ api.previewer.send( 'happyforms-part-dom-update', data );
60
+ },
61
+
62
+ onStepChange: function( model, value ) {
63
+ var data = {
64
+ id: this.model.get( 'id' ),
65
+ callback: 'onScaleStepChange',
66
+ };
67
+
68
+ api.previewer.send( 'happyforms-part-dom-update', data );
69
+ },
70
+
71
+ onMinLabelChange: function( model, value ) {
72
+ var data = {
73
+ id: this.model.get( 'id' ),
74
+ callback: 'onScaleMinLabelChange',
75
+ };
76
+
77
+ api.previewer.send( 'happyforms-part-dom-update', data );
78
+ },
79
+
80
+ onMaxLabelChange: function ( model, value ) {
81
+ var data = {
82
+ id: this.model.get( 'id' ),
83
+ callback: 'onScaleMaxLabelChange',
84
+ };
85
+
86
+ api.previewer.send( 'happyforms-part-dom-update', data );
87
+ }
88
+ } );
89
+
90
+ happyForms.previewer = _.extend( happyForms.previewer, {
91
+ onScaleValuesChange: function( id, html, options ) {
92
+ var part = this.getPartModel( id );
93
+ var $part = this.getPartElement( html );
94
+ var $input = this.$( 'input', $part );
95
+ var $output = this.$( 'output', $part );
96
+ var min = part.get( 'min_value' );
97
+ var max = part.get( 'max_value' );
98
+ var defaultValue = part.get( 'default_value' );
99
+
100
+ $input.attr( 'min', min );
101
+ $input.attr( 'max', max );
102
+ $input.attr( 'value', defaultValue );
103
+ $output.text( defaultValue );
104
+ },
105
+
106
+ onScaleStepChange: function( id, html, options ) {
107
+ var part = this.getPartModel( id );
108
+ var $part = this.getPartElement( html );
109
+ var $input = this.$( 'input', $part );
110
+
111
+ $input.attr( 'step', part.get( 'step' ) );
112
+ },
113
+
114
+ onScaleMinLabelChange: function( id, html, options ) {
115
+ var part = this.getPartModel( id );
116
+ var $part = this.getPartElement( html );
117
+ var $label = this.$( '.label-min', $part );
118
+
119
+ $label.text( part.get( 'min_label' ) );
120
+ },
121
+
122
+ onScaleMaxLabelChange: function( id, html, options ) {
123
+ var part = this.getPartModel( id );
124
+ var $part = this.getPartElement( html );
125
+ var $label = this.$( '.label-max', $part );
126
+
127
+ $label.text( part.get( 'max_label' ) );
128
+ },
129
+ } );
130
+
131
+ happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
132
+ if ( 'scale' === attrs.type ) {
133
+ BaseClass = ScaleModel;
134
+ }
135
+
136
+ return func( attrs, options, BaseClass );
137
+ } );
138
+
139
+ happyForms.factory.view = _.wrap( happyForms.factory.view, function ( func, options, BaseClass ) {
140
+ if ( 'scale' === options.type ) {
141
+ BaseClass = ScaleView;
142
+ }
143
+
144
+ return func( options, BaseClass );
145
+ } );
146
+
147
+ api.bind( 'ready', function () {
148
+ api.previewer.bind( 'happyforms-part-render', function ( $el ) {
149
+ if ( ! $el.is( '.happyforms-part--scale' ) ) {
150
+ return;
151
+ }
152
+
153
+ $( 'input', $el ).happyFormsScale();
154
+ } );
155
+
156
+ api.previewer.bind( 'happyforms-part-dom-updated', function ( $el ) {
157
+ if ( ! $el.is( '.happyforms-part--scale' ) ) {
158
+ return;
159
+ }
160
+
161
+ $( 'input', $el ).happyFormsScale();
162
+ } );
163
+ } );
164
+
165
+ } )( jQuery, _, Backbone, wp.customize, _happyFormsSettings );
assets/js/parts/part-select.js CHANGED
@@ -7,235 +7,216 @@
7
  settings.formParts.select.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  } );
12
 
13
  var SelectView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-select-template',
 
15
 
16
  initialize: function() {
17
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
18
 
19
- this.model.options = new Backbone.Collection();
20
-
21
- this.listenTo(this.model.options, 'add', this.onOptionsChange);
22
- this.listenTo(this.model.options, 'change', this.onOptionsChange);
23
- this.listenTo(this.model.options, 'remove', this.onOptionsChange);
24
  },
25
 
26
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
27
- 'click .add-option': 'onAddOptionClick'
 
 
 
 
28
  } ),
29
 
30
- ready: function() {
31
- happyForms.classes.views.Part.prototype.ready.apply( this, arguments );
32
-
33
- _(this.model.get('options')).each(function(option) {
34
- var optionModel = new Backbone.Model({
35
- id: option.id,
36
- is_default: option.is_default,
37
- label: option.label
38
- });
39
-
40
- this.createNewOption(optionModel);
41
- }, this);
42
  },
43
 
44
- /**
45
- * Hide 'No options added yet' message and call `createNewOption` method on 'Add option' button click.
46
- *
47
- * @since 1.0.0.
48
- *
49
- * @return void
50
- */
51
- onAddOptionClick: function() {
52
- this.$el.find('.no-options').hide();
53
-
54
- this.createNewOption(false, false);
55
  },
56
 
57
- /**
58
- * Creates new option model and view, adds to a collection.
59
- *
60
- * @since 1.0.0.
61
- *
62
- * @param {object} [optionModel=''] Existing option model.
63
- * @param {bool} [skipPreviewTrigger=true] Boolean to tell if creation of new model should trigger preview event or not.
64
- *
65
- * @return void
66
- */
67
- createNewOption: function(optionModel, skipPreviewTrigger) {
68
- var self = this;
69
- var model = (optionModel) ? optionModel : '';
70
-
71
- if ( typeof skipPreviewTrigger === 'undefined' ) {
72
- skipPreviewTrigger = true;
73
  }
74
 
75
- if (model === '') {
76
- var optionId = _.uniqueId(self.model.get('id') + '_option_');
 
77
 
78
- model = new Backbone.Model({
79
- id: optionId,
80
- is_default: 0,
81
- label: ''
82
- });
 
 
 
 
 
83
  }
 
84
 
85
- this.model.options.add(model, { silent: true });
 
86
 
87
- var view = new SelectOptionView({ model: model, parent: this });
 
 
88
 
89
- $('.options', this.$el).append(view.$el);
90
 
91
- if ( !skipPreviewTrigger ) {
92
- var template = _.template($(view.frontendTemplate).html());
93
- var html = template(view.model.toJSON());
94
 
95
- var eventData = {
96
- 'part_id': this.model.get('id'),
97
- 'element': html,
98
- 'appendTo': 'select'
99
  };
100
 
101
- api.previewer.trigger('happyforms-sub-part-added', eventData);
102
- }
103
  },
104
 
105
- /**
106
- * Update options in the part model on options collection change.
107
- *
108
- * @since 1.0.0.
109
- *
110
- * @param {object} data Backbone collection of options.
111
- *
112
- * @return {object}
113
- */
114
- onOptionsChange: function(data) {
115
- var options = this.model.options;
116
- var optionsArray = [];
117
-
118
- options.each(function(model, index) {
119
- optionsArray.push(model.attributes);
120
- });
121
-
122
- this.model.set('options', optionsArray);
123
-
124
- return data;
125
- }
126
- } );
127
-
128
- var SelectOptionView = Backbone.View.extend( {
129
- template: '#happyforms-select-option-customize-template',
130
 
131
- initialize: function(options) {
132
- this.parent = options.parent;
133
- this.frontendTemplate = '#happyforms-select-option-frontend-template';
134
 
135
- this.render();
136
  },
137
 
138
- events: {
139
- 'keyup input': 'onInputChange',
140
- 'click .delete-option': 'deleteOption',
141
- 'change .default-option-switch': 'onDefaultOptionCheck'
142
- },
143
 
144
- render: function() {
145
- var template = _.template($(this.template).html());
146
- var html = template(this.model.toJSON());
147
 
148
- this.setElement(html);
 
 
 
 
 
 
149
 
150
- return this;
151
  },
152
 
153
- /**
154
- * Update model with the changed data. Triggered on change event of inputs in the part view.
155
- *
156
- * @since 1.0.0.
157
- *
158
- * @return void
159
- */
160
- onInputChange: function(e) {
161
- var $input = $(e.target);
162
- var previewSelector = $input.data('preview-selector');
163
- var attribute = $input.attr('data-option-attribute');
164
- var value = $input.val();
165
-
166
- this.model.set(attribute, value);
167
-
168
- if (previewSelector) {
169
- var eventData = {
170
- selector: '#' + this.model.get('id'),
171
- text: value
172
- };
173
 
174
- api.previewer.trigger('happyforms-part-dom-update', eventData);
 
 
 
 
 
 
 
 
175
  }
 
 
 
 
 
 
 
 
 
 
176
  },
177
 
178
- /**
179
- * Triggered on 'Delete' button click in each option.
180
- *
181
- * @since 1.0.0.
182
- *
183
- * @param {object} e JS event.
184
- *
185
- * @return void
186
- */
187
- deleteOption: function(e) {
188
  e.preventDefault();
189
 
190
- var eventData = {
191
- subpart_id: this.model.get('id')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  };
193
 
194
- api.previewer.trigger('happyforms-sub-part-removed', eventData);
 
 
195
 
196
- this.parent.model.options.remove({ cid: this.model.cid }, { silent: true });
 
 
 
197
 
198
- if ( !this.parent.model.options.length ) {
199
- this.parent.$el.find('.no-options').show();
200
- }
 
 
 
 
 
201
 
202
- this.remove();
203
  },
204
 
205
- /**
206
- * Adds 'selected' attribute to option that's selected as default.
207
- * Triggered by 'Make this option default' checkbox.
208
- * Triggers previewer event.
209
- *
210
- * @since 1.0.0.
211
- *
212
- * @param {object} e JS event.
213
- *
214
- * @return void
215
- */
216
- onDefaultOptionCheck: function(e) {
217
- var $input = $(e.target);
218
-
219
- if ($input.is(':checked')) {
220
- this.model.set('is_default', 1);
221
- this.parent.$el.find('.default-option-switch').not($input).prop('checked', false).attr('disabled', true);
222
- } else {
223
- this.model.set('is_default', 0);
224
- this.parent.$el.find('.default-option-switch').not($input).prop('checked', false).removeAttr('disabled');
225
- }
226
 
227
- var eventData = {
228
- selector: '#' + this.model.get('id'),
229
- props: {
230
- selected: true
231
- }
232
- };
233
 
234
- if (!$input.is(':checked')) {
235
- eventData.props.selected = false;
236
- }
 
237
 
238
- api.previewer.trigger('happyforms-part-dom-update', eventData);
239
  }
240
  } );
241
 
7
  settings.formParts.select.defaults,
8
  _.result( happyForms.classes.models.Part.prototype, 'defaults' ),
9
  );
10
+ },
11
+
12
+ initialize: function( attrs, options ) {
13
+ happyForms.classes.models.Part.prototype.initialize.apply( this, arguments );
14
+
15
+ this.attributes.options = new OptionCollection( this.get( 'options' ), options );
16
+ },
17
+
18
+ toJSON: function() {
19
+ var json = Backbone.Model.prototype.toJSON.apply( this, arguments );
20
+ json.options = json.options.toJSON();
21
+
22
+ return json;
23
+ },
24
+ } );
25
+
26
+ var OptionModel = Backbone.Model.extend( {
27
+ defaults: {
28
+ is_default: false,
29
+ label: '',
30
+ },
31
+ } );
32
+
33
+ var OptionCollection = Backbone.Collection.extend( {
34
+ model: OptionModel,
35
  } );
36
 
37
  var SelectView = happyForms.classes.views.Part.extend( {
38
+ template: '#customize-happyforms-select-template',
39
+ itemCustomizeTemplate: '#customize-happyforms-select-item-template',
40
 
41
  initialize: function() {
42
  happyForms.classes.views.Part.prototype.initialize.apply( this, arguments );
43
 
44
+ this.listenTo( this.model.get( 'options' ), 'add change remove', this.onOptionsChange );
45
+ this.listenTo( this, 'ready', this.onReady );
 
 
 
46
  },
47
 
48
  events: _.extend( {}, happyForms.classes.views.Part.prototype.events, {
49
+ 'click .add-option': 'onAddOptionClick',
50
+ 'click .show-all-options': 'onShowAllOptionsClick',
51
+ 'keyup li [name=label]': 'onSelectItemLabelChange',
52
+ 'change li [name=is_default]': 'onSelectItemDefaultChange',
53
+ 'click li .delete-option': 'onDeleteOptionClick',
54
  } ),
55
 
56
+ onReady: function() {
57
+ this.model.get( 'options' ).each( function( itemModel, index ) {
58
+ this.appendOptionPartial( itemModel, index, this.model.get('options').length );
59
+ }, this );
 
 
 
 
 
 
 
 
60
  },
61
 
62
+ onOptionsChange: function() {
63
+ this.model.trigger( 'change' );
 
 
 
 
 
 
 
 
 
64
  },
65
 
66
+ appendOptionPartial: function( itemModel, index, totalItems ) {
67
+ if ( 'undefined' === typeof index ) {
68
+ index = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  }
70
 
71
+ if ( 'undefined' === typeof totalItems ) {
72
+ totalItems = false;
73
+ }
74
 
75
+ var customizeTemplate = _.template( $( this.itemCustomizeTemplate ).html() );
76
+ var customizeHTML = customizeTemplate( { item: itemModel.toJSON() } );
77
+
78
+ $( '.options ul', this.$el ).append( customizeHTML );
79
+
80
+ if (index && index > 4 && index < totalItems) {
81
+ this.$el.find('[data-item-id='+ itemModel.id +']').hide();
82
+
83
+ this.$el.find('.show-all-options span').text(totalItems);
84
+ this.$el.find('.show-all-options').show();
85
  }
86
+ },
87
 
88
+ onAddOptionClick: function( e ) {
89
+ e.preventDefault();
90
 
91
+ var itemID = _.uniqueId( this.model.get( 'id' ) + '_option_' );
92
+ var itemModel = new OptionModel( { id: itemID } );
93
+ this.model.get( 'options' ).add( itemModel );
94
 
95
+ this.appendOptionPartial( itemModel );
96
 
97
+ var model = this.model;
 
 
98
 
99
+ this.model.fetchHtml( function( response ) {
100
+ var data = {
101
+ id: model.get( 'id' ),
102
+ html: response,
103
  };
104
 
105
+ api.previewer.send( 'happyforms-form-part-refresh', data );
106
+ } );
107
  },
108
 
109
+ onShowAllOptionsClick: function(e) {
110
+ var $link = $(e.target);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
+ this.$el.find('.happyforms-part-widget--sub').show();
 
 
113
 
114
+ $link.hide();
115
  },
116
 
117
+ onSelectItemLabelChange: function( e ) {
118
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
119
+ var itemModel = this.model.get( 'options' ).get( itemID );
 
 
120
 
121
+ itemModel.set( 'label', $( e.target ).val() );
 
 
122
 
123
+ var data = {
124
+ id: this.model.get( 'id' ),
125
+ callback: 'onSelectItemLabelChangeCallback',
126
+ options: {
127
+ itemID: itemID,
128
+ }
129
+ };
130
 
131
+ api.previewer.send( 'happyforms-part-dom-update', data );
132
  },
133
 
134
+ onSelectItemDefaultChange: function( e ) {
135
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
136
+ var itemModel = this.model.get( 'options' ).get( itemID );
137
+ var checked = $( e.target ).is( ':checked' );
138
+
139
+ $( '[name=is_default]', this.$el ).attr( 'checked', false );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
 
141
+ this.model.get( 'options' ).each( function( itemModel ) {
142
+ itemModel.set( 'is_default', 0 );
143
+ } );
144
+
145
+ if ( checked ) {
146
+ $( e.target ).attr( 'checked', true );
147
+ itemModel.set( 'is_default', 1 );
148
+ } else {
149
+ itemModel.set( 'is_default', 0 );
150
  }
151
+
152
+ var data = {
153
+ id: this.model.get( 'id' ),
154
+ callback: 'onSelectItemDefaultChangeCallback',
155
+ options: {
156
+ itemID: itemID,
157
+ }
158
+ };
159
+
160
+ api.previewer.send( 'happyforms-part-dom-update', data );
161
  },
162
 
163
+ onDeleteOptionClick: function( e ) {
 
 
 
 
 
 
 
 
 
164
  e.preventDefault();
165
 
166
+ var itemID = $( e.target ).parents( '[data-item-id]' ).data( 'item-id' );
167
+ var itemModel = this.model.get( 'options' ).get( itemID );
168
+
169
+ this.model.get( 'options' ).remove( itemModel );
170
+ $( '[data-item-id="' + itemModel.get( 'id' ) + '"]', this.$el ).remove();
171
+
172
+ if ( this.model.get( 'options' ).length == 0 ) {
173
+ $( '.options ul', this.$el ).html( '' );
174
+ }
175
+
176
+ var data = {
177
+ id: this.model.get( 'id' ),
178
+ callback: 'onSelectItemDeleteCallback',
179
+ options: {
180
+ itemID: itemID,
181
+ }
182
  };
183
 
184
+ api.previewer.send( 'happyforms-part-dom-update', data );
185
+ },
186
+ } );
187
 
188
+ happyForms.previewer = _.extend( happyForms.previewer, {
189
+ onSelectItemAdd: function( id, html, options ) {
190
+ var part = this.getPartModel( id );
191
+ var $part = this.getPartElement( html );
192
 
193
+ this.$( '.happyforms-part__el', $part ).append( this.$( options.optionHTML ) );
194
+ },
195
+
196
+ onSelectItemLabelChangeCallback: function( id, html, options ) {
197
+ var part = this.getPartModel( id );
198
+ var $part = this.getPartElement( html );
199
+ var option = part.get( 'options' ).get( options.itemID );
200
+ var $option = $( '#' + options.itemID, $part );
201
 
202
+ $option.text( option.get( 'label' ) );
203
  },
204
 
205
+ onSelectItemDefaultChangeCallback: function( id, html, options ) {
206
+ var part = this.getPartModel( id );
207
+ var $part = this.getPartElement( html );
208
+ var option = part.get( 'options' ).get( options.itemID );
209
+ var $option = $( '#' + options.itemID, $part );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
210
 
211
+ $option.attr( 'selected', true );
212
+ },
 
 
 
 
213
 
214
+ onSelectItemDeleteCallback: function( id, html, options ) {
215
+ var part = this.getPartModel( id );
216
+ var $part = this.getPartElement( html );
217
+ var $option = $( '#' + options.itemID, $part );
218
 
219
+ $option.remove();
220
  }
221
  } );
222
 
assets/js/parts/part-single-line-text.js CHANGED
@@ -11,7 +11,7 @@
11
  } );
12
 
13
  var SingleLineTextView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-single-line-text-template'
15
  } );
16
 
17
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
11
  } );
12
 
13
  var SingleLineTextView = happyForms.classes.views.Part.extend( {
14
+ template: '#customize-happyforms-single-line-text-template'
15
  } );
16
 
17
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
assets/js/parts/part-title.js CHANGED
@@ -11,7 +11,7 @@
11
  });
12
 
13
  var TitleView = happyForms.classes.views.Part.extend({
14
- template: '#happyforms-title-template'
15
  });
16
 
17
  happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
11
  });
12
 
13
  var TitleView = happyForms.classes.views.Part.extend({
14
+ template: '#happyforms-customize-title-template'
15
  });
16
 
17
  happyForms.factory.model = _.wrap(happyForms.factory.model, function (func, attrs, options, BaseClass) {
assets/js/parts/part-website-url.js CHANGED
@@ -11,7 +11,7 @@
11
  } );
12
 
13
  var WebsiteUrlView = happyForms.classes.views.Part.extend( {
14
- template: '#happyforms-website-url-template'
15
  } );
16
 
17
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
11
  } );
12
 
13
  var WebsiteUrlView = happyForms.classes.views.Part.extend( {
14
+ template: '#customize-happyforms-website-url-template'
15
  } );
16
 
17
  happyForms.factory.model = _.wrap( happyForms.factory.model, function( func, attrs, options, BaseClass ) {
assets/js/preview.js CHANGED
@@ -1,430 +1,165 @@
1
- ( function( $, _, Backbone, api, settings ) {
2
 
3
- var happyFormsPreview;
4
- var classes = {};
5
 
6
- classes.models = {};
7
- classes.collections = {};
8
- classes.views = {};
9
 
10
- classes.models.Item = Backbone.Model.extend({
11
- idAttribute: 'ID'
12
- });
13
 
14
- classes.collections.Elements = Backbone.Collection.extend({
15
- initialize: function() {
16
- this.on('add', this.onAdd, this);
17
- this.listenTo(this, 'resort', this.onResort);
18
- },
19
 
20
- model: classes.models.Item,
 
 
21
 
22
- onAdd: function(model) {
23
- var view = new classes.views.Item({ model: model });
24
 
25
- model.set('view', view);
26
-
27
- var $previewCanvas = happyFormsPreview.$el.contents().find('#happyforms-app');
28
-
29
- if ($previewCanvas.find('.happyforms-part--submit').length) {
30
- $previewCanvas.find('.happyforms-part--submit').before(view.render().$el);
31
- } else {
32
- $previewCanvas.append(view.render().$el);
33
- }
34
- },
35
-
36
- onResort: function(data) {
37
- this.models = _(this.models).sortBy(function(model) {
38
- if (model.get('elementID')) {
39
- var newIndex = _.indexOf(data.part_ids, model.get('elementID'));
40
-
41
- var $previewCanvas = happyFormsPreview.$el.contents().find('#happyforms-app');
42
-
43
- model.get('view').$el.insertAfter($previewCanvas.find('.happyforms-part').eq(newIndex));
44
- }
45
-
46
- return _.indexOf(data.part_ids, model.get('elementID'));
47
- });
48
  }
49
- });
50
-
51
- var HappyFormsPreview = Backbone.View.extend({
52
- elements: false,
53
-
54
- initialize: function() {
55
- this.elements = new classes.collections.Elements();
56
- this.itemModel = new classes.models.Item();
57
- this.wrapper = '#happyforms-app';
58
-
59
- this.listenTo(this, 'update-part-dom', this.onDOMPartUpdate);
60
- this.listenTo(this, 'update-part-width', this.onPartWidthUpdate);
61
- this.listenTo(this, 'parts-sorted', this.onPartsSorted);
62
- this.listenTo(this, 'highlight-item', this.highlightItem);
63
- this.listenTo(this, 'unhighlight-item', this.unhighlightItem);
64
- this.listenTo(this, 'update-style', this.updateStyle);
65
- this.listenTo(this, 'load-styles', this.loadStyles);
66
- this.listenTo(this, 'add-sub-part', this.addSubPart);
67
- this.listenTo(this, 'remove-sub-part', this.removeSubPart);
68
-
69
- var self = this;
70
-
71
- setTimeout(function() {
72
- self.load();
73
- }, 200);
74
- },
75
-
76
- load: function() {
77
- var $iframe = this.$el.contents();
78
- var formID = $iframe.find('#happyforms-app').data('happyforms-form-id');
79
- var $items = $iframe.find('.happyforms-part');
80
- var self = this;
81
-
82
- _.each($items, function(item) {
83
- var itemModel = new classes.models.Item({
84
- elementID: $(item).attr('data-happyforms-id'),
85
- formID: formID,
86
- fieldName: $(item).attr('data-happyforms-field-name'),
87
- html: $(item).prop('outerHTML')
88
- });
89
-
90
- $(item).remove();
91
-
92
- var item = new classes.views.Item({ el: item, model: itemModel });
93
-
94
- self.elements.add(itemModel);
95
- });
96
-
97
- api.previewer.trigger( 'happyforms-preview-ready' );
98
-
99
- this.setPageTitle();
100
- },
101
-
102
- addView: function(modelAttributes) {
103
- var model = new classes.models.Item(modelAttributes);
104
-
105
- this.elements.add(model);
106
- },
107
-
108
- redrawView: function( modelAttributes ) {
109
- var model = this.elements.find( {
110
- elementID: modelAttributes.elementID
111
- } );
112
-
113
- model.set( modelAttributes );
114
 
115
- var $previousEl = model.get( 'view' ).$el;
116
- $previousEl.hide();
117
- $previousEl.after( model.get( 'view' ).render().$el );
118
- $previousEl.remove();
119
- },
120
 
121
- setPageTitle: function () {
122
- var title = $('title').text();
123
 
124
- $('title').text(title.replace('Customize:', 'Edit Form ‹'));
125
- },
 
 
126
 
127
- onDOMPartUpdate: function(data) {
128
- if (!data || !data.selector) {
129
- return;
130
- }
131
 
132
- var selector = data.selector;
 
133
 
134
- if (data.part_id) {
135
- selector = '[data-happyforms-id="'+ data.part_id +'"]';
 
136
 
137
- if (data.selector !== 'self') {
138
- selector = '[data-happyforms-id="'+ data.part_id +'"] ' + data.selector;
139
- }
140
- }
 
141
 
142
- var $element = this.$el.contents().find(selector);
143
-
144
- if (data.text) {
145
- $element.text(data.text);
146
- }
147
-
148
- if (typeof data.html !== 'undefined') {
149
- $element.html(data.html);
150
- }
151
-
152
- if (data.css) {
153
- $element.css(data.css);
154
- }
155
-
156
- if (data.attributes) {
157
- $element.attr(data.attributes);
158
-
159
- if (data.attributeMethod === 'remove') {
160
- $element.removeAttr(data.attributes);
161
- }
162
- } else {
163
- $element.text(data.text);
164
- }
165
-
166
- if (data.props) {
167
- _.each(data.props, function(value, key) {
168
- $element.prop(key, value);
169
- });
170
- }
171
-
172
- if (!_.isEmpty(data.classes) && !_.isEmpty(data.classMethod)) {
173
- if (data.classMethod === 'add') {
174
- $element.addClass(data.classes);
175
- } else {
176
- $element.removeClass(data.classes);
177
- }
178
- }
179
-
180
- var $updatedEl = this.$el;
181
-
182
- if ( data.part_id ) {
183
- $updatedEl = this.elements.findWhere( {
184
- elementID: data.part_id
185
- } ).get( 'view' ).$el;
186
- }
187
-
188
- api.previewer.trigger( 'happyforms-part-dom-updated', $updatedEl );
189
- },
190
-
191
- onPartWidthUpdate: function(data) {
192
- if (data.selector && data.width) {
193
- var width = data.width;
194
- var $part = this.$el.contents().find('[data-happyforms-id="'+ data.part_id +'"]');
195
-
196
- $part.removeClass('happyforms-part--width-half happyforms-part--width-full happyforms-part--width-third');
197
-
198
- $part.addClass('happyforms-part--width-'+ width);
199
- }
200
- },
201
-
202
- onPartsSorted: function(data) {
203
- this.elements.trigger('resort', data);
204
- },
205
-
206
- highlightItem: function(elementID) {
207
- this.$el.contents().find('[data-happyforms-id="'+elementID+'"]').addClass('highlighted');
208
- },
209
-
210
- unhighlightItem: function(elementID) {
211
- this.$el.contents().find('[data-happyforms-id="'+elementID+'"]').removeClass('highlighted');
212
- },
213
-
214
- updateStyle: function(data) {
215
- var selector = data.selector;
216
- var styles = data.style;
217
-
218
- var $elements = this.$el.contents().find(selector);
219
-
220
- $elements.attr('style', '');
221
-
222
- $elements.css(styles);
223
- },
224
-
225
- loadStyles: function(data) {
226
- var self = this;
227
-
228
- var data = {
229
- action: 'happyforms_load_styles',
230
- form: data.toJSON()
231
- };
232
-
233
- $.post(ajaxurl, data, function(res) {
234
- if (res) {
235
- var $styleWrapper = self.$el.contents().find('#happyforms-preview-styles');
236
- $styleWrapper.empty().html(res);
237
- }
238
- });
239
- },
240
-
241
- addSubPart: function(data) {
242
- if (data) {
243
- var $el = this.$el.contents().find('[data-happyforms-id='+data.part_id+']');
244
- var $partEl = data.element;
245
-
246
- if (data.appendTo) {
247
- var $newEl = $el.find(data.appendTo);
248
-
249
- if (!$newEl.length) {
250
- $newEl.html($partEl);
251
- return;
252
- } else {
253
- $el = $newEl;
254
- }
255
- }
256
-
257
- $el.append($partEl);
258
- }
259
- },
260
-
261
- removeSubPart: function(data) {
262
- if (data) {
263
- var $el = this.$el.contents().find('#' + data.subpart_id);
264
-
265
- $el.remove();
266
- }
267
  }
268
- });
269
-
270
- classes.views.Item = Backbone.View.extend({
271
- template: '#happyforms-partial-template',
272
-
273
- events: {
274
- 'click .happyforms-edit-pencil': 'onPencilClick'
275
- },
276
-
277
- initialize: function() {
278
- this.pencilTemplate = '#happyforms-pencil-template';
279
-
280
- this.model.on('change', this.onModelChange, this);
281
- },
282
-
283
- render: function() {
284
- var template = _.template($(this.template).text());
285
- var html = template(this.model.toJSON());
286
- var partHtml = html;
287
-
288
- if ($(html).hasClass('happyforms-part-editable')) {
289
- partHtml = this.addPencil(html);
290
- }
291
-
292
- this.setElement(partHtml);
293
- api.previewer.trigger( 'happyforms-part-render', this.$el );
294
 
295
- return this;
296
- },
 
297
 
298
- addPencil: function(html) {
299
- var pencilHtml = $(this.pencilTemplate).html();
300
 
301
- html = $(html).append(pencilHtml).prop('outerHTML');
 
 
 
302
 
303
- return html;
304
- },
 
 
305
 
306
- onModelChange: function(model) {
307
- if (this.model !== model) {
308
- this.render();
309
- }
310
- },
311
 
312
- onPencilClick: function(e) {
313
- e.preventDefault();
 
 
314
 
315
- var data = {
316
- form_id: this.model.get('formID'),
317
- part_id: this.model.get('elementID'),
318
- field_name: this.model.get('fieldName'),
319
- step: 'build'
320
- };
321
 
322
- happyForms.trigger('happyforms-pencil-click', data);
 
323
  }
324
- });
325
-
326
- api.bind( 'ready', function() {
327
- api.previewer.bind('ready', function() {
328
- happyFormsPreview = window.happyFormsPreview = new HappyFormsPreview({
329
- el: api.previewer.preview.iframe
330
- });
331
- });
332
-
333
- api.previewer.bind('happyforms-form-part-added', function(data) {
334
- if (data) {
335
- var formID = data.form_id;
336
- var partID = data.part_id;
337
- var template = data.html;
338
-
339
- var modelAttributes = {
340
- elementID: partID,
341
- formID: formID,
342
- fieldName: $(template).attr('data-happyforms-field-name'),
343
- html: template
344
- };
345
-
346
- happyFormsPreview.addView(modelAttributes);
347
- }
348
- });
349
-
350
- api.previewer.bind('happyforms-form-part-refresh', function(data) {
351
- if (data) {
352
- var formID = data.form_id;
353
- var partID = data.part_id;
354
- var template = data.html;
355
-
356
- var modelAttributes = {
357
- elementID: partID,
358
- formID: formID,
359
- fieldName: $(template).attr('data-happyforms-field-name'),
360
- html: template
361
- };
362
-
363
- happyFormsPreview.redrawView( modelAttributes );
364
- }
365
- });
366
-
367
- api.previewer.bind('happyforms-form-part-removed', function(data) {
368
- if (data) {
369
- var formID = data.form_id;
370
- var partID = data.part_id;
371
-
372
- var element = _.find(happyFormsPreview.elements.models, function(model) {
373
- return model.get('elementID') === partID;
374
- });
375
-
376
- if (element) {
377
- element.get('view').remove();
378
- happyFormsPreview.elements.remove(element);
379
- }
380
- }
381
- });
382
-
383
- api.previewer.bind('happyforms-part-dom-update', function(data) {
384
- if (data.selector) {
385
- happyFormsPreview.trigger('update-part-dom', data);
386
- }
387
- });
388
-
389
- api.previewer.bind('happyforms-part-width-change', function(data) {
390
- if (data.selector) {
391
- happyFormsPreview.trigger('update-part-width', data);
392
- }
393
- });
394
-
395
- api.previewer.bind('happyforms-form-parts-sorted', function(data) {
396
- if (data) {
397
- happyFormsPreview.trigger('parts-sorted', data);
398
- }
399
- });
400
-
401
- api.previewer.bind('happyforms-part-mouseover', function(elementID) {
402
- if (happyFormsPreview && elementID) {
403
- happyFormsPreview.trigger('highlight-item', elementID);
404
- }
405
- });
406
-
407
- api.previewer.bind('happyforms-part-mouseout', function(elementID) {
408
- if (happyFormsPreview && elementID) {
409
- happyFormsPreview.trigger('unhighlight-item', elementID);
410
- }
411
- });
412
-
413
- api.previewer.bind('happyforms-style-change', function(data) {
414
- happyFormsPreview.trigger('update-style', data);
415
- });
416
-
417
- api.previewer.bind('happyforms-style-update', function(data) {
418
- happyFormsPreview.trigger('load-styles', data);
419
- });
420
-
421
- api.previewer.bind('happyforms-sub-part-added', function(data) {
422
- happyFormsPreview.trigger('add-sub-part', data);
423
- });
424
-
425
- api.previewer.bind('happyforms-sub-part-removed', function(data) {
426
- happyFormsPreview.trigger('remove-sub-part', data);
427
- });
428
- });
429
-
430
- })(jQuery, _, Backbone, wp.customize, _happyFormsSettings);
1
+ ( function( $, _, Backbone, api ) {
2
 
3
+ HappyForms.parts = HappyForms.parts || {};
 
4
 
5
+ var handlers = {};
6
+ var $pencil, $form, $submit, $recaptcha;
 
7
 
8
+ handlers.getPart = function( id ) {
9
+ var $part = $( '[data-happyforms-id="' + id + '"]' );
 
10
 
11
+ return $part;
12
+ }
 
 
 
13
 
14
+ handlers.formTitleUpdate = function( title ) {
15
+ $( '.happyforms-form__title' ).text( title );
16
+ }
17
 
18
+ handlers.formPartAdd = function( html ) {
19
+ $part = $( html );
20
 
21
+ if ( $recaptcha.length ) {
22
+ $recaptcha.before( $part );
23
+ } else {
24
+ $submit.before( $part );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ $part.prepend( $( $pencil ) );
 
 
 
 
28
 
29
+ HappyForms.wrapPart( $part, $form );
30
+ }
31
 
32
+ handlers.formPartRefresh = function( e ) {
33
+ var $part = handlers.getPart( e.id );
34
+ var $next = $part.next();
35
+ var $refreshedPart = $( e.html );
36
 
37
+ $part.remove();
38
+ $next.before( $refreshedPart );
 
 
39
 
40
+ HappyForms.wrapPart( $refreshedPart, $form );
41
+ }
42
 
43
+ handlers.formPartRemove = function( id ) {
44
+ handlers.getPart( id ).remove();
45
+ }
46
 
47
+ handlers.partDomUpdate = function( e ) {
48
+ var $part = handlers.getPart( e.id );
49
+ var context = parent.happyForms.previewer;
50
+ var callback = context[e.callback];
51
+ var options = e.options || {}
52
 
53
+ if ( callback ) {
54
+ callback.call( context, e.id, $part, options, $ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  }
56
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
+ handlers.formPartsSort = function( ids ) {
59
+ var $parts = $.map( ids, function( id ) {
60
+ var $part = handlers.getPart( id ).detach();
61
 
62
+ return $part;
63
+ } );
64
 
65
+ $.each( $parts, function( i, $part ) {
66
+ $submit.before( $part );
67
+ } );
68
+ }
69
 
70
+ handlers.subPartAdded = function( e ) {
71
+ var $part = handlers.getPart( e.id );
72
+ var callback = parent.happyForms.onSubPartAdded;
73
+ var options = {};
74
 
75
+ callback.call( parent.happyForms, e.id, $part, e.html, options );
76
+ }
 
 
 
77
 
78
+ handlers.cssVariableUpdate = function( e ) {
79
+ var formID = parent.happyForms.form.get('ID');
80
+ document.querySelector('#happyforms-form-'+ formID).style.setProperty( e.variable, e.value );
81
+ }
82
 
83
+ handlers.formClassUpdate = function( e ) {
84
+ var context = parent.happyForms.previewer;
85
+ var callback = context[e.callback];
86
+ var options = e.options || {}
 
 
87
 
88
+ if ( callback ) {
89
+ callback.call( context, e.attribute, $form, options );
90
  }
91
+ }
92
+
93
+ handlers.pencilPartClick = function( e ) {
94
+ e.preventDefault();
95
+
96
+ var id = $( e.target ).parents( '.happyforms-part' ).data( 'happyforms-id' );
97
+ api.preview.send( 'happyforms-pencil-click-part', id );
98
+ }
99
+
100
+ handlers.pencilTitleClick = function( e ) {
101
+ e.preventDefault();
102
+
103
+ api.preview.send( 'happyforms-pencil-click-title' );
104
+ }
105
+
106
+ handlers.silenceEvent = function( e ) {
107
+ e.preventDefault();
108
+ }
109
+
110
+ handlers.init = function() {
111
+ // Populate pointers
112
+ $pencil = $( '#happyforms-pencil-template' ).html();
113
+ $form = $( '.happyforms-form form' );
114
+ $submit = $( '.happyforms-part.happyforms-part--submit', $form );
115
+ $recaptcha = $( '.happyforms-part.happyforms-part--recaptcha', $form );
116
+
117
+ // Append pencils to existing elements
118
+ $( '.happyforms-block-editable' ).prepend( $( $pencil ) );
119
+
120
+ // Remove unpreviewable
121
+ $( '.happyforms-form form' ).removeClass( 'customize-unpreviewable' );
122
+ $( '.notice a' ).removeClass( 'customize-unpreviewable' );
123
+ }
124
+
125
+ handlers.bind = function() {
126
+ // Bind preview handlers
127
+ api.preview.bind( 'happyforms-form-title-update', handlers.formTitleUpdate );
128
+ api.preview.bind( 'happyforms-form-part-add', handlers.formPartAdd );
129
+ api.preview.bind( 'happyforms-form-part-remove', handlers.formPartRemove );
130
+ api.preview.bind( 'happyforms-form-parts-sort', handlers.formPartsSort );
131
+ api.preview.bind( 'happyforms-form-part-refresh', handlers.formPartRefresh );
132
+ api.preview.bind( 'happyforms-part-dom-update', handlers.partDomUpdate );
133
+ api.preview.bind( 'happyforms-css-variable-update', handlers.cssVariableUpdate );
134
+ api.preview.bind( 'happyforms-form-class-update', handlers.formClassUpdate );
135
+
136
+ // Bind DOM handlers
137
+ $( document.body ).on(
138
+ 'click',
139
+ '.happyforms-block-editable--title .customize-partial-edit-shortcut',
140
+ handlers.pencilTitleClick
141
+ );
142
+
143
+ $( document.body ).on(
144
+ 'click',
145
+ '.happyforms-block-editable--part .customize-partial-edit-shortcut',
146
+ handlers.pencilPartClick
147
+ );
148
+
149
+ $( '.happyforms-ask-link' ).on( 'click', function() {
150
+ window.open( $( this ).attr( 'href' ) );
151
+ } );
152
+
153
+ // Silence unwanted events
154
+ $( document.body ).on( 'click', 'button', handlers.silenceEvent );
155
+ $( document.body ).on( 'click', 'input[type=submit]', handlers.silenceEvent );
156
+ $( '.happyforms-form' ).on( 'submit', handlers.silenceEvent );
157
+ }
158
+
159
+ $( document ).ready( function() {
160
+ handlers.init();
161
+ handlers.bind();
162
+ api.preview.send( 'happyforms-preview-ready' );
163
+ } );
164
+
165
+ } )( jQuery, _, Backbone, wp.customize );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/tinymce/form-picker.js DELETED
@@ -1,124 +0,0 @@
1
- /* global tinymce, jQuery, MakeFormatBuilder */
2
- var HappyFormsFormPicker = HappyFormsFormPicker || {};
3
-
4
- (function(tinymce, $, _, formPicker) {
5
- tinymce.PluginManager.add('happyforms_form_picker', function (editor, url) {
6
- editor.addCommand('HappyForms_Form_Picker', function () {
7
- formPicker.open(editor);
8
- });
9
-
10
- editor.addButton('happyforms_form_picker', {
11
- icon : 'happyforms-form-picker',
12
- tooltip: 'HappyForms',
13
- cmd : 'HappyForms_Form_Picker'
14
- });
15
-
16
- editor.on('init', function () {
17
- $.each(formPicker.definitions, function (name, defs) {
18
- editor.formatter.register(name, defs);
19
- });
20
- });
21
- });
22
-
23
- var formPickerWindow;
24
-
25
- formPicker = $.extend(formPicker, {
26
- editor: {},
27
- definitions: {},
28
- nodes: {},
29
- choices: {},
30
- forms: {},
31
- currentSelection: {},
32
-
33
- open: function(editor) {
34
- this.editor = editor;
35
- this.currentSelection = editor.selection;
36
-
37
- var items = [
38
- {
39
- type: 'form',
40
- name: 'listboxForm',
41
- items: formPicker.getFormListBox()
42
- }
43
- ];
44
-
45
- var args = {
46
- title: 'HappyForms',
47
- id: 'happyforms-form-picker',
48
- autoScroll: true,
49
- maxHeight: 500,
50
- items: {
51
- type: 'container',
52
- name: 'formContainer',
53
- layout: 'flex',
54
- align: 'stretch',
55
- direction: 'column',
56
- items: items
57
- },
58
- buttons: [
59
- this.getInsertButton()
60
- ]
61
- };
62
-
63
- formPickerWindow = editor.windowManager.open(args);
64
- },
65
-
66
- getFormListBox: function() {
67
- var listbox = {
68
- type: 'listbox',
69
- name: 'form',
70
- id: 'happyforms-form-picker-list',
71
- minWidth: 300,
72
- values: this.getForms(),
73
- onPostrender: function() {
74
- happyFormsListBox = this;
75
- },
76
- onselect: function() {
77
- var choice = this.value();
78
- }
79
- };
80
-
81
- return listbox;
82
- },
83
-
84
- getInsertButton: function() {
85
- var self = this;
86
-
87
- var button = {
88
- text: 'Insert',
89
- id: 'happyforms-form-picker-insert',
90
- name: 'formSubmit',
91
- classes: 'button-primary',
92
- onclick: function() {
93
- var html = '[happyforms id="' + happyFormsListBox.value() + '" /]'
94
-
95
- self.editor.insertContent(html);
96
-
97
- formPickerWindow.fire('submit');
98
- }
99
- };
100
-
101
- return button;
102
- },
103
-
104
- getForms: function() {
105
- var choices = [
106
- {
107
- value: '',
108
- text: 'Choose a form',
109
- disabled: true,
110
- classes: 'listbox-placeholder'
111
- }
112
- ];
113
-
114
- _(happyFormsData).each(function(form, index) {
115
- choices.push({
116
- value: form.id,
117
- text: form.title
118
- });
119
- });
120
-
121
- return choices;
122
- }
123
- });
124
- })(tinymce, jQuery, _, HappyFormsFormPicker);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
happyforms.php CHANGED
@@ -5,7 +5,7 @@
5
  * Plugin URI: https://happyforms.me
6
  * Description: Your friendly drag and drop contact form builder for creating contact forms, lead generation forms, feedback forms, quote forms, survey forms and more!
7
  * Author: The Theme Foundry
8
- * Version: 1.2.2
9
  * Author URI: https://thethemefoundry.com
10
  * Upgrade URI: https://thethemefoundry.com
11
  */
@@ -13,7 +13,7 @@
13
  /**
14
  * The current version of the plugin.
15
  */
16
- define( 'HAPPYFORMS_VERSION', '1.2.2' );
17
 
18
  if ( ! function_exists( 'happyforms_plugin_file' ) ):
19
  /**
5
  * Plugin URI: https://happyforms.me
6
  * Description: Your friendly drag and drop contact form builder for creating contact forms, lead generation forms, feedback forms, quote forms, survey forms and more!
7
  * Author: The Theme Foundry
8
+ * Version: 1.3
9
  * Author URI: https://thethemefoundry.com
10
  * Upgrade URI: https://thethemefoundry.com
11
  */
13
  /**
14
  * The current version of the plugin.
15
  */
16
+ define( 'HAPPYFORMS_VERSION', '1.3' );
17
 
18
  if ( ! function_exists( 'happyforms_plugin_file' ) ):
19
  /**
inc/classes/class-admin-notices.php CHANGED
@@ -74,12 +74,10 @@ class HappyForms_Admin_Notices {
74
  $notice = array_merge( array( 'message' => $message ), $args );
75
  $this->notices[$id] = $notice;
76
 
77
- if ( true === $args['one-time'] ) {
78
- $transient_id = $this->get_user_transient_id();
79
- $user_notices = $this->get_user_notices();
80
- $user_notices[$id] = $notice;
81
- set_transient( $transient_id, $user_notices );
82
- }
83
  }
84
 
85
  /**
@@ -169,7 +167,13 @@ class HappyForms_Admin_Notices {
169
  $classes = implode( ' ', $classes );
170
  ?>
171
  <div id="happyforms-notice-<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $classes ); ?>"<?php echo $nonce; ?>>
172
- <?php echo wpautop( $message ); ?>
 
 
 
 
 
 
173
  </div>
174
  <?php
175
  }
@@ -246,7 +250,7 @@ class HappyForms_Admin_Notices {
246
  *
247
  * @return array
248
  */
249
- private function get_dismissed_notices( $user_id ) {
250
  $dismissed = get_user_meta( $user_id, 'happyforms-dismissed-notices', true );
251
 
252
  if ( ! is_array( $dismissed ) ) {
74
  $notice = array_merge( array( 'message' => $message ), $args );
75
  $this->notices[$id] = $notice;
76
 
77
+ $transient_id = $this->get_user_transient_id();
78
+ $user_notices = $this->get_user_notices();
79
+ $user_notices[$id] = $notice;
80
+ set_transient( $transient_id, $user_notices );
 
 
81
  }
82
 
83
  /**
167
  $classes = implode( ' ', $classes );
168
  ?>
169
  <div id="happyforms-notice-<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $classes ); ?>"<?php echo $nonce; ?>>
170
+ <?php
171
+ if ( 'custom' !== $type ) :
172
+ echo wpautop( $message );
173
+ else:
174
+ echo $message;
175
+ endif;
176
+ ?>
177
  </div>
178
  <?php
179
  }
250
  *
251
  * @return array
252
  */
253
+ public function get_dismissed_notices( $user_id ) {
254
  $dismissed = get_user_meta( $user_id, 'happyforms-dismissed-notices', true );
255
 
256
  if ( ! is_array( $dismissed ) ) {
inc/classes/class-form-controller.php CHANGED
@@ -46,10 +46,12 @@ class HappyForms_Form_Controller {
46
  */
47
  public function hook() {
48
  add_action( 'init', array( $this, 'register_post_type' ) );
 
49
  add_filter( 'single_template', array( $this, 'single_template' ) );
50
  add_action( 'trashed_post', array( $this, 'trashed_post' ) );
51
  add_action( 'delete_post', array( $this, 'delete_post' ) );
52
  add_action( 'untrashed_post', array( $this, 'untrashed_post' ) );
 
53
  }
54
 
55
  /**
@@ -91,6 +93,40 @@ class HappyForms_Form_Controller {
91
  register_post_type( $this->post_type, $args );
92
  }
93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  /**
95
  * Filter: filter the template path used for
96
  * the Customize screen preview and frontend rendering.
@@ -110,132 +146,170 @@ class HappyForms_Form_Controller {
110
  if ( is_customize_preview() ) {
111
  $single_template = happyforms_get_include_folder() . '/templates/preview-form-edit.php';
112
  } else {
113
- $single_template = happyforms_get_include_folder() . '/templates/frontend-form.php';
114
  }
115
  }
116
 
117
  return $single_template;
118
  }
119
 
120
- /**
121
- * Get the defaults and sanitization configuration
122
- * for the fields of the form post object.
123
- *
124
- * @since 1.0
125
- *
126
- * @param boolean $key An optional field key
127
- * to retrieve configuration for.
128
- *
129
- * @return array
130
- */
131
- private function get_customize_fields( $key = false ) {
132
  $fields = array(
133
- 'post' => array(
134
- 'ID' => array(
135
- 'default' => '0',
136
- 'sanitize' => 'intval',
137
- ),
138
- 'post_title' => array(
139
- 'default' => __( 'Untitled form', 'happyforms' ),
140
- 'sanitize' => 'sanitize_text_field',
141
- ),
142
- 'post_status' => array(
143
- 'default' => 'publish',
144
- 'sanitize' => 'happyforms_sanitize_post_status',
145
- ),
146
- 'post_type' => array(
147
- 'default' => $this->post_type,
148
- 'sanitize' => 'sanitize_text_field',
149
- )
150
  ),
151
- 'meta' => array(
152
- 'email_recipient' => array(
153
- 'default' => '',
154
- 'sanitize' => 'happyforms_sanitize_emails',
155
- ),
156
- 'confirmation_message' => array(
157
- 'default' => __( 'Your message has been successfully sent. We appreciate you contacting us and we’ll be in touch soon.', 'happyforms' ),
158
- 'sanitize' => 'sanitize_text_field',
159
- ),
160
- 'confirmation_email_subject' => array(
161
- 'default' => __( 'We received your message', 'happyforms' ),
162
- 'sanitize' => 'sanitize_text_field',
163
- ),
164
- 'confirmation_email_content' => array(
165
- 'default' => __( 'Your message has been successfully sent. We appreciate you contacting us and we’ll be in touch soon.', 'happyforms' ),
166
- 'sanitize' => 'sanitize_text_field',
167
- ),
168
- 'redirect_url' => array(
169
- 'default' => '',
170
- 'sanitize' => 'sanitize_text_field',
171
- ),
172
- 'spam_prevention' => array(
173
- 'default' => 1,
174
- 'sanitize' => 'happyforms_sanitize_checkbox',
175
- ),
176
- 'submit_button_label' => array(
177
- 'default' => __( 'Submit Form', 'happyforms' ),
178
- 'sanitize' => 'sanitize_text_field',
179
- ),
180
- 'form_expiration_datetime' => array(
181
- 'default' => date( 'Y-m-d H:i:s', time() + 3600 * 24 * 7 ),
182
- 'sanitize' => 'happyforms_sanitize_datetime',
183
- ),
184
- 'save_entries' => array(
185
- 'default' => 1,
186
- 'sanitize' => 'happyforms_sanitize_checkbox',
187
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  ),
189
  );
190
 
191
  /**
192
- * Filter the defaults and sanitization configuration
193
- * for the fields of the form post object.
194
  *
195
- * @since 1.0
196
  *
197
- * @param array $fields The original configuration.
198
  *
199
  * @return array
200
  */
201
- $fields = apply_filters( 'happyforms_fields', $fields );
202
 
203
- if ( false !== $key && isset( $fields[$key] ) ) {
204
- return $fields[$key];
205
- } else {
206
- return $fields;
207
- }
208
  }
209
 
210
  /**
211
- * Get the default values of the form post object fields.
 
212
  *
213
  * @since 1.0
214
  *
215
- * @param boolean $flatten Whether or not the result should be
216
- * flattened into a single array.
217
  *
218
  * @return array
219
  */
220
- public function get_customize_defaults( $flatten = false ) {
221
- $defaults = array();
222
- $form_fields = $this->get_customize_fields();
223
-
224
- foreach ( $form_fields as $field_group => $fields ) {
225
- $defaults[$field_group] = array();
226
 
227
- foreach ( $fields as $field_name => $field_settings ) {
228
- $defaults[$field_group][$field_name] = $field_settings['default'];
229
- }
 
 
 
 
 
 
 
 
 
 
230
  }
231
 
232
- if ( true === $flatten ) {
233
- $defaults = array_merge( $defaults['post'], $defaults['meta'] );
 
 
 
 
 
 
234
  }
235
 
 
 
 
 
 
 
 
236
  return $defaults;
237
  }
238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  /**
240
  * Validate the form data submitted from the Customize screen.
241
  *
@@ -245,27 +319,94 @@ class HappyForms_Form_Controller {
245
  *
246
  * @return array
247
  */
248
- public function validate_data( $post_data = array() ) {
249
- $form_fields = $this->get_customize_fields();
250
- $validated_data = array();
251
-
252
- foreach ( $form_fields as $field_group => $fields ) {
253
- $validated_data[$field_group] = array();
254
-
255
- foreach ( $fields as $field_name => $field_settings ) {
256
- if ( isset( $post_data[$field_name] ) ) {
257
- if ( isset( $field_settings['sanitize'] ) && is_callable( $field_settings['sanitize'] ) ) {
258
- $validation_callback = $field_settings['sanitize'];
259
- $field_value = $post_data[$field_name];
260
- $validated_data[$field_group][$field_name] = call_user_func( $validation_callback, $field_value );
261
- }
262
- } else {
263
- $validated_data[$field_group][$field_name] = $field_settings['default'];
264
- }
265
- }
266
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
- return $validated_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  }
270
 
271
  /**
@@ -276,16 +417,14 @@ class HappyForms_Form_Controller {
276
  * @return int|string
277
  */
278
  public function create() {
279
- $validated_data = $this->validate_data();
280
- $post_attributes = array(
281
- 'post_type' => happyforms_get_form_controller()->post_type,
282
- 'post_status' => 'publish',
 
283
  );
284
- $post_data = array_merge( $validated_data['post'], $post_attributes );
285
- $meta_data = array( 'meta_input' => $validated_data['meta'] );
286
- $insert_data = array_merge( $post_data, $meta_data );
287
 
288
- $result = wp_insert_post( wp_slash( $insert_data ), true );
289
 
290
  if ( is_wp_error( $result ) ) {
291
  return $result;
@@ -314,15 +453,17 @@ class HappyForms_Form_Controller {
314
  'posts_per_page' => -1,
315
  );
316
 
317
- if ( ! empty( $post_ids ) ) {
318
- $query_params['post__in'] = is_array( $post_ids ) ? $post_ids : array( $post_ids );
319
- }
320
 
321
  if ( true === $only_id ) {
322
  $query_params['fields'] = 'ids';
323
  }
324
 
325
- $forms = get_posts( $query_params );
 
 
 
 
326
 
327
  if ( true === $only_id ) {
328
  return $forms;
@@ -356,10 +497,18 @@ class HappyForms_Form_Controller {
356
  */
357
  public function to_array( $form ) {
358
  $form_array = $form->to_array();
359
- $meta_fields = $this->get_customize_fields( 'meta' );
 
 
360
 
361
  foreach ( $meta_fields as $field_name => $field_settings ) {
362
- $form_array[$field_name] = get_post_meta( $form->ID, $field_name, true );
 
 
 
 
 
 
363
  }
364
 
365
  $parts = array();
@@ -387,16 +536,19 @@ class HappyForms_Form_Controller {
387
  * @return array
388
  */
389
  public function update( $form_data = array() ) {
390
- $validated_data = $this->validate_data( $form_data );
391
 
392
- if ( isset( $validated_data['post']['ID'] ) && 0 === $validated_data['post']['ID'] ) {
393
  $form = $this->create();
394
- $validated_data['post']['ID'] = $form->ID;
395
  }
396
 
397
- $validated_data['post']['post_status'] = 'publish';
398
- $meta_data = array( 'meta_input' => $validated_data['meta'] );
399
- $update_data = array_merge( $validated_data['post'], $meta_data );
 
 
 
400
  $result = wp_update_post( $update_data, true );
401
 
402
  if ( is_wp_error( $result ) ) {
@@ -548,6 +700,12 @@ class HappyForms_Form_Controller {
548
  return $form_data['spam_prevention'];
549
  }
550
 
 
 
 
 
 
 
551
  /**
552
  * Get form-wide submission notice definitions.
553
  *
@@ -587,12 +745,27 @@ class HappyForms_Form_Controller {
587
  }
588
 
589
  ob_start();
590
- require( happyforms_get_include_folder() . '/templates/frontend-form.php' );
591
  $form_markup = ob_get_clean();
592
 
593
  return $form_markup;
594
  }
595
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
596
  }
597
 
598
  if ( ! function_exists( 'happyforms_get_form_controller' ) ):
46
  */
47
  public function hook() {
48
  add_action( 'init', array( $this, 'register_post_type' ) );
49
+ add_action( 'wp', array( $this, 'inject_new_form' ) );
50
  add_filter( 'single_template', array( $this, 'single_template' ) );
51
  add_action( 'trashed_post', array( $this, 'trashed_post' ) );
52
  add_action( 'delete_post', array( $this, 'delete_post' ) );
53
  add_action( 'untrashed_post', array( $this, 'untrashed_post' ) );
54
+ add_action( 'happyforms_head', array( $this, 'happyforms_head' ) );
55
  }
56
 
57
  /**
93
  register_post_type( $this->post_type, $args );
94
  }
95
 
96
+ /**
97
+ * Action: inject a virtual HappyForms post object
98
+ * if we're previewing a new form.
99
+ *
100
+ * @since 1.3
101
+ *
102
+ * @hooked action template_redirect
103
+ *
104
+ * @return void
105
+ */
106
+ public function inject_new_form() {
107
+ global $wp_query;
108
+
109
+ if ( ! is_customize_preview() ) {
110
+ return;
111
+ }
112
+
113
+ if ( ! isset( $wp_query->query['p'] ) ||
114
+ ! isset( $wp_query->query['post_type'] ) ) {
115
+ return;
116
+ }
117
+
118
+ $queried_post_type = $wp_query->query['post_type'];
119
+ $queried_post_id = intval( $wp_query->query['p'] );
120
+
121
+ if ( $this->post_type !== $queried_post_type || 0 !== $queried_post_id ) {
122
+ return;
123
+ }
124
+
125
+ // See https://barn2.co.uk/create-fake-wordpress-post-fly/
126
+ $post = $this->create_virtual();
127
+ $this->inject_virtual_post( $post );
128
+ }
129
+
130
  /**
131
  * Filter: filter the template path used for
132
  * the Customize screen preview and frontend rendering.
146
  if ( is_customize_preview() ) {
147
  $single_template = happyforms_get_include_folder() . '/templates/preview-form-edit.php';
148
  } else {
149
+ $single_template = happyforms_get_include_folder() . '/templates/single-form.php';
150
  }
151
  }
152
 
153
  return $single_template;
154
  }
155
 
156
+ public function get_post_fields() {
 
 
 
 
 
 
 
 
 
 
 
157
  $fields = array(
158
+ 'ID' => array(
159
+ 'default' => '0',
160
+ 'sanitize' => 'intval',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  ),
162
+ 'post_title' => array(
163
+ 'default' => __( 'Untitled form', 'happyforms' ),
164
+ 'sanitize' => 'sanitize_text_field',
165
+ ),
166
+ 'post_status' => array(
167
+ 'default' => 'publish',
168
+ 'sanitize' => 'happyforms_sanitize_post_status',
169
+ ),
170
+ 'post_type' => array(
171
+ 'default' => $this->post_type,
172
+ 'sanitize' => 'sanitize_text_field',
173
+ )
174
+ );
175
+
176
+ return $fields;
177
+ }
178
+
179
+ public function get_meta_fields() {
180
+ $fields = array(
181
+ 'email_recipient' => array(
182
+ 'default' => '',
183
+ 'sanitize' => 'happyforms_sanitize_emails',
184
+ ),
185
+ 'confirmation_message' => array(
186
+ 'default' => __( 'Your message has been successfully sent. We appreciate you contacting us and we’ll be in touch soon.', 'happyforms' ),
187
+ 'sanitize' => 'sanitize_text_field',
188
+ ),
189
+ 'confirmation_email_subject' => array(
190
+ 'default' => __( 'We received your message', 'happyforms' ),
191
+ 'sanitize' => 'sanitize_text_field',
192
+ ),
193
+ 'confirmation_email_content' => array(
194
+ 'default' => __( 'Your message has been successfully sent. We appreciate you contacting us and we’ll be in touch soon.', 'happyforms' ),
195
+ 'sanitize' => 'sanitize_text_field',
196
+ ),
197
+ 'redirect_url' => array(
198
+ 'default' => '',
199
+ 'sanitize' => 'sanitize_text_field',
200
+ ),
201
+ 'spam_prevention' => array(
202
+ 'default' => 1,
203
+ 'sanitize' => 'happyforms_sanitize_checkbox',
204
+ ),
205
+ 'submit_button_label' => array(
206
+ 'default' => __( 'Submit Form', 'happyforms' ),
207
+ 'sanitize' => 'sanitize_text_field',
208
+ ),
209
+ 'form_expiration_datetime' => array(
210
+ 'default' => date( 'Y-m-d H:i:s', time() + 3600 * 24 * 7 ),
211
+ 'sanitize' => 'happyforms_sanitize_datetime',
212
+ ),
213
+ 'save_entries' => array(
214
+ 'default' => 1,
215
+ 'sanitize' => 'happyforms_sanitize_checkbox',
216
+ ),
217
+ 'captcha' => array(
218
+ 'default' => '',
219
+ 'sanitize' => 'happyforms_sanitize_checkbox',
220
+ ),
221
+ 'captcha_site_key' => array(
222
+ 'default' => '',
223
+ 'sanitize' => 'sanitize_text_field',
224
+ ),
225
+ 'captcha_secret_key' => array(
226
+ 'default' => '',
227
+ 'sanitize' => 'sanitize_text_field',
228
  ),
229
  );
230
 
231
  /**
232
+ * Filter fields stored as form post meta.
 
233
  *
234
+ * @since 1.3
235
  *
236
+ * @param array $fields Registered post meta fields.
237
  *
238
  * @return array
239
  */
240
+ $fields = apply_filters( 'happyforms_meta_fields', $fields );
241
 
242
+ return $fields;
 
 
 
 
243
  }
244
 
245
  /**
246
+ * Get the defaults and sanitization configuration
247
+ * for the fields of the form post object.
248
  *
249
  * @since 1.0
250
  *
251
+ * @param string $group An optional subset of fields
252
+ * to retrieve configuration for.
253
  *
254
  * @return array
255
  */
256
+ public function get_fields( $group = '' ) {
257
+ $fields = array();
 
 
 
 
258
 
259
+ switch ( $group ) {
260
+ case 'post':
261
+ $fields = $this->get_post_fields();
262
+ break;
263
+ case 'meta':
264
+ $fields = $this->get_meta_fields();
265
+ break;
266
+ default:
267
+ $fields = array_merge(
268
+ $this->get_post_fields(),
269
+ $this->get_meta_fields()
270
+ );
271
+ break;
272
  }
273
 
274
+ return $fields;
275
+ }
276
+
277
+ public function get_field( $field ) {
278
+ $fields = $this->get_fields();
279
+
280
+ if ( isset( $fields[$field] ) ) {
281
+ return $fields[$field];
282
  }
283
 
284
+ return null;
285
+ }
286
+
287
+ public function get_defaults( $group = '' ) {
288
+ $fields = $this->get_fields( $group );
289
+ $defaults = array_combine( array_keys( $fields ), array_column( $fields, 'default' ) );
290
+
291
  return $defaults;
292
  }
293
 
294
+ public function get_default( $field ) {
295
+ $defaults = $this->get_defaults();
296
+
297
+ if ( isset( $defaults[$field] ) ) {
298
+ return $defaults[$field];
299
+ }
300
+
301
+ return null;
302
+ }
303
+
304
+ public function validate_field( &$value, $key ) {
305
+ $field = $this->get_field( $key );
306
+
307
+ if ( isset( $field['sanitize'] ) && is_callable( $field['sanitize'] ) ) {
308
+ $callback = $field['sanitize'];
309
+ $value = call_user_func( $callback, $value );
310
+ };
311
+ }
312
+
313
  /**
314
  * Validate the form data submitted from the Customize screen.
315
  *
319
  *
320
  * @return array
321
  */
322
+ public function validate_fields( $post_data = array() ) {
323
+ $defaults = $this->get_defaults();
324
+ $filtered = array_intersect_key( $post_data, $defaults );
325
+ $validated = wp_parse_args( $post_data, $filtered );
326
+ array_walk( $validated, array( $this, 'validate_field' ) );
327
+
328
+ return $validated;
329
+ }
330
+
331
+ /**
332
+ * Creates a virtual form post object.
333
+ *
334
+ * @since 1.3
335
+ *
336
+ * @return WP_Post
337
+ */
338
+ private function create_virtual() {
339
+ $post_id = 0;
340
+ $defaults = $this->get_defaults();
341
+
342
+ $post = new stdClass();
343
+ $post->ID = $post_id;
344
+ $post->post_author = 1;
345
+ $post->post_date = current_time( 'mysql' );
346
+ $post->post_date_gmt = current_time( 'mysql', 1 );
347
+ $post->post_title = $this->get_default( 'post_title' );
348
+ $post->post_content = '';
349
+ $post->post_status = 'publish';
350
+ $post->comment_status = 'closed';
351
+ $post->ping_status = 'closed';
352
+ $post->post_name = '';
353
+ $post->post_type = $this->post_type;
354
+ $post->filter = 'raw';
355
+
356
+ $wp_post = new WP_Post( $post );
357
+ wp_cache_add( $post_id, $wp_post, 'posts' );
358
+
359
+ return $wp_post;
360
+ }
361
 
362
+ /**
363
+ * Injects a virtual post object
364
+ * in the current query.
365
+ *
366
+ * @since 1.3
367
+ *
368
+ * @return WP_Post
369
+ */
370
+ private function inject_virtual_post( $post ) {
371
+ global $wp, $wp_query;
372
+
373
+ $wp_query->post = $post;
374
+ $wp_query->posts = array( $post );
375
+ $wp_query->queried_object = $post;
376
+ $wp_query->queried_object_id = 0;
377
+ $wp_query->found_posts = 1;
378
+ $wp_query->post_count = 1;
379
+ $wp_query->max_num_pages = 1;
380
+ $wp_query->is_page = false;
381
+ $wp_query->is_singular = true;
382
+ $wp_query->is_single = true;
383
+ $wp_query->is_attachment = false;
384
+ $wp_query->is_archive = false;
385
+ $wp_query->is_category = false;
386
+ $wp_query->is_tag = false;
387
+ $wp_query->is_tax = false;
388
+ $wp_query->is_author = false;
389
+ $wp_query->is_date = false;
390
+ $wp_query->is_year = false;
391
+ $wp_query->is_month = false;
392
+ $wp_query->is_day = false;
393
+ $wp_query->is_time = false;
394
+ $wp_query->is_search = false;
395
+ $wp_query->is_feed = false;
396
+ $wp_query->is_comment_feed = false;
397
+ $wp_query->is_trackback = false;
398
+ $wp_query->is_home = false;
399
+ $wp_query->is_embed = false;
400
+ $wp_query->is_404 = false;
401
+ $wp_query->is_paged = false;
402
+ $wp_query->is_admin = false;
403
+ $wp_query->is_preview = false;
404
+ $wp_query->is_robots = false;
405
+ $wp_query->is_posts_page = false;
406
+ $wp_query->is_post_type_archive = false;
407
+
408
+ $GLOBALS['wp_query'] = $wp_query;
409
+ $wp->register_globals();
410
  }
411
 
412
  /**
417
  * @return int|string
418
  */
419
  public function create() {
420
+ $post_data = array_merge(
421
+ $this->get_defaults( 'post' ),
422
+ array( 'meta_input' => array(
423
+ $this->get_defaults( 'meta' )
424
+ ) )
425
  );
 
 
 
426
 
427
+ $result = wp_insert_post( wp_slash( $post_data ), true );
428
 
429
  if ( is_wp_error( $result ) ) {
430
  return $result;
453
  'posts_per_page' => -1,
454
  );
455
 
456
+ $query_params['post__in'] = is_array( $post_ids ) ? $post_ids : array( $post_ids );
 
 
457
 
458
  if ( true === $only_id ) {
459
  $query_params['fields'] = 'ids';
460
  }
461
 
462
+ if ( 0 !== $post_ids ) {
463
+ $forms = get_posts( $query_params );
464
+ } else {
465
+ $forms = array( $this->create_virtual() );
466
+ }
467
 
468
  if ( true === $only_id ) {
469
  return $forms;
497
  */
498
  public function to_array( $form ) {
499
  $form_array = $form->to_array();
500
+ $meta_fields = $this->get_fields( 'meta' );
501
+ $form_meta_keys = get_post_custom_keys( $form->ID );
502
+ $form_meta_keys = is_null( $form_meta_keys ) ? array() : $form_meta_keys;
503
 
504
  foreach ( $meta_fields as $field_name => $field_settings ) {
505
+ if ( in_array( $field_name, $form_meta_keys ) ) {
506
+ // If this meta is defined, use its value.
507
+ $form_array[$field_name] = get_post_meta( $form->ID, $field_name, true );
508
+ } else {
509
+ // Otherwise use the default value.
510
+ $form_array[$field_name] = $field_settings['default'];
511
+ }
512
  }
513
 
514
  $parts = array();
536
  * @return array
537
  */
538
  public function update( $form_data = array() ) {
539
+ $validated_data = $this->validate_fields( $form_data );
540
 
541
+ if ( isset( $validated_data['ID'] ) && 0 === $validated_data['ID'] ) {
542
  $form = $this->create();
543
+ $validated_data['ID'] = $form->ID;
544
  }
545
 
546
+ $post_data = array_intersect_key( $validated_data, $this->get_defaults( 'post' ) );
547
+ $meta_data = array_intersect_key( $validated_data, $this->get_defaults( 'meta' ) );
548
+ $update_data = array_merge( $post_data, array(
549
+ 'meta_input' => $meta_data
550
+ ) );
551
+
552
  $result = wp_update_post( $update_data, true );
553
 
554
  if ( is_wp_error( $result ) ) {
700
  return $form_data['spam_prevention'];
701
  }
702
 
703
+ public function has_recaptcha_protection( $form_data ) {
704
+ return $form_data['captcha']
705
+ && $form_data['captcha_site_key']
706
+ && $form_data['captcha_secret_key'];
707
+ }
708
+
709
  /**
710
  * Get form-wide submission notice definitions.
711
  *
745
  }
746
 
747
  ob_start();
748
+ require( happyforms_get_include_folder() . '/templates/single-form.php' );
749
  $form_markup = ob_get_clean();
750
 
751
  return $form_markup;
752
  }
753
 
754
+ public function happyforms_head( $forms ) {
755
+ $has_captcha = false;
756
+
757
+ foreach ( $forms as $form ) {
758
+ if ( $form['captcha'] ) {
759
+ $has_captcha = true;
760
+ break;
761
+ }
762
+ }
763
+
764
+ if ( $has_captcha ) : ?>
765
+ <script src="https://www.google.com/recaptcha/api.js" async defer></script>
766
+ <?php endif;
767
+ }
768
+
769
  }
770
 
771
  if ( ! function_exists( 'happyforms_get_form_controller' ) ):
inc/classes/class-form-part-library.php CHANGED
@@ -52,6 +52,8 @@ class HappyForms_Form_Part_Library {
52
  public function hook() {
53
  add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_templates' ) );
54
  add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_enqueue_scripts' ) );
 
 
55
  }
56
 
57
  /**
@@ -118,38 +120,7 @@ class HappyForms_Form_Part_Library {
118
  */
119
  public function customize_templates() {
120
  foreach ( $this->parts as $part ) {
121
- ?>
122
- <script type="text/template" id="<?php echo $part->template_id; ?>">
123
- <?php
124
- include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' );
125
- $part->customize_template();
126
- include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' );
127
- ?>
128
- </script>
129
- <?php
130
- if ( isset( $part->item_customize_template_id ) ) {
131
- ?>
132
- <script type="text/template" id="<?php echo $part->item_customize_template_id; ?>">
133
- <?php $part->customize_item_template(); ?>
134
- </script>
135
- <?php
136
- }
137
-
138
- if ( isset( $part->item_frontend_template_id ) ) {
139
- ?>
140
- <script type="text/template" id="<?php echo $part->item_frontend_template_id; ?>">
141
- <?php $part->preview_option_template(); ?>
142
- </script>
143
- <?php
144
- }
145
-
146
- if ( isset( $part->preview_confirmation_template_id ) ) {
147
- ?>
148
- <script type="text/template" id="<?php echo $part->preview_confirmation_template_id; ?>">
149
- <?php $part->preview_confirmation_template(); ?>
150
- </script>
151
- <?php
152
- }
153
  }
154
  }
155
 
@@ -243,6 +214,39 @@ class HappyForms_Form_Part_Library {
243
  return $validated_data;
244
  }
245
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
 
248
  if ( ! function_exists( 'happyforms_get_part_library' ) ):
52
  public function hook() {
53
  add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_templates' ) );
54
  add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_enqueue_scripts' ) );
55
+ add_filter( 'happyforms_part_class', array( $this, 'html_part_class' ), 10, 3 );
56
+ add_filter( 'happyforms_part_data_attributes', array( $this, 'html_part_data_attributes' ), 10, 3 );
57
  }
58
 
59
  /**
120
  */
121
  public function customize_templates() {
122
  foreach ( $this->parts as $part ) {
123
+ $part->customize_templates();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
  }
126
 
214
  return $validated_data;
215
  }
216
 
217
+ public function html_part_class( $class, $part_data, $form_data ) {
218
+ $class[] = 'happyforms-form__part';
219
+ $class[] = 'happyforms-part happyforms-part--' . $part_data['type'];
220
+
221
+ if ( isset( $part_data['width'] ) ) {
222
+ $class[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] );
223
+ }
224
+
225
+ if ( isset( $part_data['label_placement'] ) ) {
226
+ $class[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] );
227
+ }
228
+
229
+ if ( isset( $part_data['css_class'] ) && ! empty( $part_data['css_class'] ) ) {
230
+ $class[] = $part_data['css_class'];
231
+ }
232
+
233
+ return $class;
234
+ }
235
+
236
+ public function html_part_data_attributes( $attributes, $part_data, $form_data ) {
237
+ $attributes['happyforms-type'] = $part_data['type'];
238
+
239
+ if ( $part_data['required'] ) {
240
+ $attributes['happyforms-required'] = '';
241
+ }
242
+
243
+ if ( happyforms_is_preview() ) {
244
+ $attributes['happyforms-id'] = $part_data['id'];
245
+ }
246
+
247
+ return $attributes;
248
+ }
249
+
250
  }
251
 
252
  if ( ! function_exists( 'happyforms_get_part_library' ) ):
inc/classes/class-form-part.php CHANGED
@@ -22,7 +22,7 @@ class HappyForms_Form_Part {
22
  return $defaults;
23
  }
24
 
25
- public function customize_template() {}
26
 
27
  public function customize_enqueue_scripts( $deps = array() ) {}
28
 
@@ -36,7 +36,7 @@ class HappyForms_Form_Part {
36
  return '';
37
  }
38
 
39
- public function sanitize_value( $part_data ) {}
40
 
41
  public function validate_value( $part_data, $value ) {}
42
 
22
  return $defaults;
23
  }
24
 
25
+ public function customize_templates() {}
26
 
27
  public function customize_enqueue_scripts( $deps = array() ) {}
28
 
36
  return '';
37
  }
38
 
39
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {}
40
 
41
  public function validate_value( $part_data, $value ) {}
42
 
inc/classes/class-form-styles.php CHANGED
@@ -36,868 +36,644 @@ class HappyForms_Form_Styles {
36
  * @return void
37
  */
38
  public function hook() {
39
- add_filter( 'happyforms_fields', array( $this, 'add_fields' ) );
40
- add_action( 'happyforms_print_css', array( $this, 'print_css' ), 10, 1 );
41
- add_action( 'wp_ajax_happyforms_load_styles', array( $this, 'load_styles') );
42
  }
43
 
44
- /**
45
- * Get styles by key or all styles as array.
46
- *
47
- * @param string $key Style key.
48
- *
49
- * @since 1.0.0.
50
- *
51
- * @return array
52
- */
53
- public function get_styles( $key = false ) {
54
  $fields = array(
55
- 'hf_form_title' => array(
56
- 'type' => 'divider',
57
- 'label' => __( 'General form styles', 'happyforms' )
58
- ),
59
- 'hf_style_display_form_name' => array(
60
- 'default' => 1,
61
- 'type' => 'checkbox',
62
- 'css' => array(
63
- 'selector' => array( '.happyforms-form__title' ),
64
- 'attribute' => array( 'display' ),
65
- 'value' => array(
66
- 0 => 'none',
67
- 1 => 'block'
68
- )
69
- ),
70
- 'label' => __( 'Display form name', 'happyforms' ),
71
- 'sanitize' => 'happyforms_sanitize_checkbox'
72
- ),
73
- 'hf_style_form_font_size' => array(
74
- 'default' => 14,
75
- 'type' => 'range',
76
- 'min' => 8,
77
- 'max' => 30,
78
- 'css' => array(
79
- 'selector' => array( 'form, .happyforms-part--placeholder p' ),
80
- 'attribute' => array( 'font-size' ),
81
- 'tpl' => '{{ value }}px'
82
- ),
83
- 'label' => __( 'Font size (px)', 'happyforms' ),
84
- 'sanitize' => 'intval'
85
  ),
86
- 'hf_style_form_font_weight' => array(
87
- 'default' => 'normal',
88
- 'type' => 'buttonset',
89
- 'options' => array(
90
- 'normal' => 'Normal',
91
- 'bold' => 'Bold'
92
- ),
93
- 'css' => array(
94
- 'selector' => array( 'form, .happyforms-part--placeholder p' ),
95
- 'attribute' => array( 'font-weight' )
96
- ),
97
- 'label' => __( 'Font weight', 'happyforms' ),
98
- 'sanitize' => 'sanitize_text_field'
99
  ),
100
- 'hf_style_form_font_style' => array(
101
  'default' => 'normal',
102
- 'type' => 'buttonset',
103
  'options' => array(
104
- 'normal' => 'Normal',
105
- 'italic' => 'Italic'
106
  ),
107
- 'css' => array(
108
- 'selector' => array( 'form, .happyforms-part--placeholder p' ),
109
- 'attribute' => array( 'font-style' )
110
- ),
111
- 'label' => __( 'Font style', 'happyforms' ),
112
  'sanitize' => 'sanitize_text_field'
113
  ),
114
- 'hf_style_form_bg' => array(
115
  'default' => '',
116
- 'type' => 'color',
117
- 'css' => array(
118
- 'selector' => array( 'form' ),
119
- 'attribute' => array( 'background-color' )
120
  ),
121
- 'label' => __( 'Background color', 'happyforms' ),
122
  'sanitize' => 'sanitize_text_field'
123
  ),
124
- 'hf_style_form_border' => array(
125
- 'default' => 0,
126
- 'type' => 'range',
127
- 'min' => 0,
128
- 'max' => 10,
129
- 'css' => array(
130
- 'selector' => array( 'form' ),
131
- 'attribute' => array( 'border-width' ),
132
- 'tpl' => '{{ value }}px'
133
- ),
134
- 'label' => __( 'Border width (px)', 'happyforms' ),
135
- 'sanitize' => 'sanitize_text_field'
136
  ),
137
- 'hf_style_form_border_color' => array(
138
- 'default' => '#000000',
139
- 'type' => 'color',
140
- 'css' => array(
141
- 'selector' => array( 'form' ),
142
- 'attribute' => array( 'border-color' )
143
  ),
144
- 'label' => __( 'Border color', 'happyforms' ),
145
  'sanitize' => 'sanitize_text_field'
146
  ),
147
- 'hf_style_form_border_radius' => array(
148
- 'default' => 0,
149
- 'type' => 'range',
150
- 'min' => 0,
151
- 'max' => 20,
152
- 'css' => array(
153
- 'selector' => array( 'form' ),
154
- 'attribute' => array( 'border-radius' ),
155
- 'tpl' => '{{ value }}px'
156
- ),
157
- 'label' => __( 'Border radius (px)', 'happyforms' ),
158
- 'sanitize' => 'intval'
159
- ),
160
- 'hf_form_parts_title' => array(
161
- 'type' => 'divider',
162
- 'label' => __( 'Form parts', 'happyforms' ),
163
- ),
164
- 'hf_style_hide_part_titles' => array(
165
- 'default' => 0,
166
- 'type' => 'checkbox',
167
- 'css' => array(
168
- 'selector' => array( '.happyforms-part__label' ),
169
- 'attribute' => array( 'display' ),
170
- 'value' => array(
171
- 0 => 'inline-block',
172
- 1 => 'none'
173
- )
174
- ),
175
- 'label' => __( 'Hide part titles', 'happyforms' ),
176
- 'sanitize' => 'happyforms_sanitize_checkbox'
177
- ),
178
- 'hf_style_part_label_font_weight' => array(
179
- 'default' => 'bold',
180
- 'type' => 'buttonset',
181
  'options' => array(
182
- 'normal' => 'Normal',
183
- 'bold' => 'Bold'
184
- ),
185
- 'css' => array(
186
- 'selector' => array( '.happyforms-part .happyforms-part__label .label' ),
187
- 'attribute' => array( 'font-weight' )
188
  ),
189
- 'label' => __( 'Title font weight', 'happyforms' ),
190
  'sanitize' => 'sanitize_text_field'
191
  ),
192
- 'hf_style_part_label_font_style' => array(
193
- 'default' => 'normal',
194
- 'type' => 'buttonset',
195
  'options' => array(
196
- 'normal' => 'Normal',
197
- 'italic' => 'Italic'
 
198
  ),
199
- 'css' => array(
200
- 'selector' => array( '.happyforms-part .happyforms-part__label .label' ),
201
- 'attribute' => array( 'font-style' )
202
- ),
203
- 'label' => __( 'Title font style', 'happyforms' ),
204
  'sanitize' => 'sanitize_text_field'
205
  ),
206
- 'hf_style_part_description_font_size' => array(
207
- 'default' => '16',
208
- 'type' => 'range',
209
- 'min' => 8,
210
- 'max' => 30,
211
- 'css' => array(
212
- 'selector' => array( '.happyforms-part__description' ),
213
- 'attribute' => array( 'font-size' ),
214
- 'tpl' => '{{ value }}px'
215
  ),
216
- 'label' => __( 'Description font size (px)', 'happyforms' ),
217
  'sanitize' => 'sanitize_text_field'
218
  ),
219
- 'hf_style_part_description_font_weight' => array(
220
- 'default' => 'normal',
221
- 'type' => 'buttonset',
222
  'options' => array(
223
- 'normal' => 'Normal',
224
- 'bold' => 'Bold'
225
- ),
226
- 'css' => array(
227
- 'selector' => array( '.happyforms-part .happyforms-part__description' ),
228
- 'attribute' => array( 'font-weight' )
229
  ),
230
- 'label' => __( 'Description font weight', 'happyforms' ),
231
  'sanitize' => 'sanitize_text_field'
232
  ),
233
- 'hf_style_part_description_font_style' => array(
234
- 'default' => 'italic',
235
- 'type' => 'buttonset',
236
  'options' => array(
237
- 'normal' => 'Normal',
238
- 'italic' => 'Italic'
239
- ),
240
- 'css' => array(
241
- 'selector' => array( '.happyforms-part .happyforms-part__description' ),
242
- 'attribute' => array( 'font-style' )
243
  ),
244
- 'label' => __( 'Description font style', 'happyforms' ),
245
- 'sanitize' => 'sanitize_text_field'
246
  ),
247
- 'hf_style_part_border' => array(
248
- 'default' => 1,
249
- 'type' => 'range',
250
- 'min' => 0,
251
- 'max' => 10,
252
- 'css' => array(
253
- 'selector' => array( '.happyforms-part input[type=text], .happyforms-part input[type=email], .happyforms-part input[type=tel], .happyforms-part input[type=number], .happyforms-part input[type=range], .happyforms -part textarea, .happyforms-part select, .happyforms-part__el--address--results > div, .happyforms-part__el--address--results:after' ),
254
- 'attribute' => array( 'border-width' ),
255
- 'tpl' => '{{ value }}px'
256
- ),
257
- 'label' => __( 'Border width (px)', 'happyforms' ),
258
- 'sanitize' => 'sanitize_text_field'
259
  ),
260
- 'hf_style_part_border_color' => array(
261
- 'default' => '#dbdbdb',
262
- 'type' => 'color',
263
- 'css' => array(
264
- 'selector' => array( '.happyforms-part input[type=text], .happyforms-part input[type=email], .happyforms-part input[type=tel], .happyforms-part input[type=number], .happyforms-part input[type=range], .happyforms -part textarea, .happyforms-part select, .happyforms-part__el--address--results > div, .happyforms-part__el--address--results:after' ),
265
- 'attribute' => array( 'border-color' )
266
- ),
267
- 'label' => __( 'Border color', 'happyforms' ),
268
  'sanitize' => 'sanitize_text_field'
269
  ),
270
- 'hf_style_part_border_color_focus' => array(
271
- 'default' => '#555555',
272
- 'type' => 'color',
273
- 'css' => array(
274
- 'selector' => array( '.happyforms-part input[type=text]:focus, .happyforms-part input[type=email]:focus, .happyforms-part input[type=tel]:focus, .happyforms-part input[type=number]:focus, .happyforms-part input[type=range]:focus, .happyforms -part textarea:focus, .happyforms-part select:focus' ),
275
- 'attribute' => array( 'border-color' )
276
  ),
277
- 'label' => __( 'Border color focused', 'happyforms' ),
278
  'sanitize' => 'sanitize_text_field'
279
  ),
280
- 'hf_style_part_border_radius' => array(
281
- 'default' => 6,
282
- 'type' => 'range',
283
- 'min' => 0,
284
  'max' => 20,
285
- 'css' => array(
286
- 'selector' => array( '.happyforms-part input[type=text], .happyforms-part input[type=email], .happyforms-part input[type=tel], .happyforms-part input[type=number], .happyforms-part input[type=range], .happyforms -part textarea, .happyforms-part select, .happyforms-part__el--address--results > div, .happyforms-part__el--address--results:after' ),
287
- 'attribute' => array( 'border-radius' ),
288
- 'tpl' => '{{ value }}px'
289
- ),
290
- 'label' => __( 'Border radius (px)', 'happyforms' ),
291
- 'sanitize' => 'intval'
292
- ),
293
- 'hf_style_part_bg' => array(
294
- 'default' => '#ffffff',
295
- 'type' => 'color',
296
- 'css' => array(
297
- 'selector' => array( '.happyforms-part input, .happyforms-part textarea, .happyforms-part__el--address--results > div, .happyforms-part__el--address--results:after' ),
298
- 'attribute' => array( 'background-color' )
299
- ),
300
- 'label' => __( 'Background color', 'happyforms' ),
301
  'sanitize' => 'sanitize_text_field'
302
  ),
303
- 'hf_style_part_bg_focus' => array(
304
- 'default' => '#ffffff',
305
- 'type' => 'color',
306
- 'css' => array(
307
- 'selector' => array( '.happyforms-part input:focus, .happyforms-part textarea:focus, .happyforms-part__el--address--results > div:hover' ),
308
- 'attribute' => array( 'background-color' )
309
- ),
310
- 'label' => __( 'Background color focused', 'happyforms' ),
311
  'sanitize' => 'sanitize_text_field'
312
  ),
313
- 'hf_style_part_bg_transition' => array(
314
- 'default' => 'none',
315
- 'type' => 'buttonset',
316
  'options' => array(
317
- 'none' => 'None',
318
- 'background-color' => 'Fade'
319
- ),
320
- 'css' => array(
321
- 'selector' => array( '.happyforms-part input, .happyforms-part textarea, .happyforms-part__el--address--results > div' ),
322
- 'attribute' => array( 'transition-property' )
323
  ),
324
- 'label' => __( 'Smooth background change (transition)', 'happyforms' ),
325
  'sanitize' => 'sanitize_text_field'
326
  ),
327
- 'hf_style_label_color' => array(
328
- 'default' => '#000000',
329
- 'type' => 'color',
330
- 'css' => array(
331
- 'selector' => array( 'label' ),
332
- 'attribute' => array( 'color' )
333
  ),
334
- 'label' => __( 'Label color', 'happyforms' ),
335
  'sanitize' => 'sanitize_text_field'
336
  ),
337
- 'hf_style_label_shadow' => array(
338
- 'default' => 'none',
339
- 'type' => 'buttonset',
340
  'options' => array(
341
- 'none' => 'None',
342
- '' => 'Light'
343
  ),
344
- 'css' => array(
345
- 'selector' => array( '.happyforms-part input, .happyforms-part textarea' ),
346
- 'attribute' => array( 'transition-property' )
347
- ),
348
- 'label' => __( 'Smooth background change (transition)', 'happyforms' ),
349
  'sanitize' => 'sanitize_text_field'
350
  ),
351
- 'hf_style_label_font_size' => array(
352
- 'default' => '16',
353
- 'type' => 'range',
354
- 'min' => 8,
355
  'max' => 40,
356
- 'css' => array(
357
- 'selector' => array( 'label' ),
358
- 'attribute' => array( 'font-size' ),
359
- 'tpl' => '{{ value }}px'
360
- ),
361
- 'label' => __( 'Label font size (px)', 'happyforms' ),
362
  'sanitize' => 'sanitize_text_field'
363
  ),
364
- 'hf_style_placeholder_color' => array(
365
- 'default' => '#aaaaaa',
366
- 'type' => 'color',
367
- 'css' => array(
368
- 'selector' => array( 'input::placeholder, textarea::placeholder' ),
369
- 'attribute' => array( 'color' )
370
- ),
371
- 'label' => __( 'Placeholder color', 'happyforms' ),
372
- 'sanitize' => 'sanitize_text_field'
373
- ),
374
- 'hf_style_part_placeholder_font_weight' => array(
375
- 'default' => 'normal',
376
- 'type' => 'buttonset',
377
  'options' => array(
378
- 'normal' => 'Normal',
379
- 'bold' => 'Bold'
380
- ),
381
- 'css' => array(
382
- 'selector' => array( 'input::placeholder, textarea::placeholder' ),
383
- 'attribute' => array( 'font-weight' )
384
  ),
385
- 'label' => __( 'Placeholder font weight', 'happyforms' ),
386
  'sanitize' => 'sanitize_text_field'
387
  ),
388
- 'hf_style_part_placeholder_font_style' => array(
389
- 'default' => 'normal',
390
- 'type' => 'buttonset',
391
  'options' => array(
392
- 'normal' => 'Normal',
393
- 'italic' => 'Italic'
 
394
  ),
395
- 'css' => array(
396
- 'selector' => array( 'input::placeholder, textarea::placeholder' ),
397
- 'attribute' => array( 'font-style' )
398
- ),
399
- 'label' => __( 'Placeholder font style', 'happyforms' ),
400
  'sanitize' => 'sanitize_text_field'
401
  ),
402
- 'hf_style_required_text' => array(
403
- 'default' => '*',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
404
  'type' => 'text',
405
  'label' => __( 'Required text', 'happyforms' ),
406
- 'sanitize' => 'sanitize_text_field'
407
  ),
408
- 'hf_style_required_color' => array(
409
- 'default' => '#ff7550',
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  'type' => 'color',
411
- 'css' => array(
412
- 'selector' => array( '.happyforms-required' ),
413
- 'attribute' => array( 'color' )
414
- ),
415
- 'label' => __( 'Required text color', 'happyforms' ),
416
- 'sanitize' => 'sanitize_text_field'
417
  ),
418
- 'hf_style_error_color' => array(
419
- 'default' => '#d3422c',
420
  'type' => 'color',
421
- 'css' => array(
422
- 'selector' => array( '.happyforms-message-notice.error p', '.happyforms-message-notice.error-submission' ),
423
- 'attribute' => array( 'color', 'border-color' )
424
- ),
425
- 'label' => __( 'Error color', 'happyforms' ),
426
- 'sanitize' => 'sanitize_text_field'
427
  ),
428
- 'hf_style_success_color' => array(
429
- 'default' => '#39b54a',
430
  'type' => 'color',
431
- 'css' => array(
432
- 'selector' => array( '.happyforms-message-notice.success h2' ),
433
- 'attribute' => array( 'color' )
434
- ),
435
- 'label' => __( 'Success color', 'happyforms' ),
436
- 'sanitize' => 'sanitize_text_field'
437
  ),
438
- 'hf_ratings_part_title' => array(
439
  'type' => 'divider',
440
- 'label' => __( 'Ratings', 'happyforms' )
441
  ),
442
- 'hf_style_ratings_star_color' => array(
443
- 'default' => '#ccc',
444
- 'type' => 'color',
445
- 'force' => true,
446
- 'css' => array(
447
- 'selector' => array( '.happyforms-part--rating:not(:hover) input:first-child:checked~label,
448
- .happyforms-part--rating input:hover+label~label:not(:hover),
449
- .happyforms-part--rating:hover input:checked+label:hover~label,
450
- .happyforms-part--rating:not(:hover) input:checked+label~label' ),
451
- 'attribute' => array( 'color' )
452
- ),
453
- 'label' => __( 'Default star color', 'happyforms' ),
454
- 'sanitize' => 'sanitize_text_field'
455
  ),
456
- 'hf_style_ratings_star_color_hover_checked' => array(
457
- 'default' => '#f39c00',
458
- 'type' => 'color',
459
- 'label' => __( 'Star color focused', 'happyforms' ),
460
- 'force' => true,
461
- 'css' => array(
462
- 'selector' => array( '.happyforms-part--rating .happyforms-star__label' ),
463
- 'attribute' => array( 'color' )
464
- ),
465
- 'sanitize' => 'sanitize_text_field'
466
  ),
467
- 'hf_submit_button_title' => array(
468
  'type' => 'divider',
469
- 'label' => __( 'Submit button', 'happyforms' )
470
  ),
471
- 'hf_style_submit_button_alignment' => array(
472
- 'default' => 'left',
473
  'type' => 'buttonset',
474
- 'options' => array(
475
- 'left' => 'Left',
476
- 'center' => 'Center',
477
- 'right' => 'Right'
478
- ),
479
- 'css' => array(
480
- 'selector' => array( '.happyforms-part--submit' ),
481
- 'attribute' => array( 'text-align' )
482
- ),
483
- 'label' => __( 'Alignment', 'happyforms' ),
484
- 'sanitize' => 'sanitize_text_field'
485
  ),
486
- 'hf_style_submit_button_width' => array(
487
- 'default' => 'auto',
488
  'type' => 'buttonset',
489
- 'options' => array(
490
- 'auto' => 'Auto',
491
- '100%' => 'Full width'
492
- ),
493
- 'css' => array(
494
- 'selector' => array( '.happyforms-part--submit, .happyforms-part--submit input, .happyforms-part--submit button' ),
495
- 'attribute' => array( 'width' )
496
- ),
497
- 'label' => __( 'Width', 'happyforms' ),
498
- 'sanitize' => 'sanitize_text_field'
499
  ),
500
- 'hf_style_submit_button_font_weight' => array(
501
- 'default' => 'normal',
502
  'type' => 'buttonset',
503
- 'options' => array(
504
- 'normal' => 'Normal',
505
- 'bold' => 'Bold'
506
- ),
507
- 'css' => array(
508
- 'selector' => array( '.happyforms-button--submit' ),
509
- 'attribute' => array( 'font-weight' )
510
- ),
511
- 'label' => __( 'Font weight', 'happyforms' ),
512
- 'sanitize' => 'sanitize_text_field'
513
  ),
514
- 'hf_style_submit_button_font_style' => array(
515
- 'default' => 'normal',
516
  'type' => 'buttonset',
517
- 'options' => array(
518
- 'normal' => 'Normal',
519
- 'italic' => 'Italic'
520
- ),
521
- 'css' => array(
522
- 'selector' => array( '.happyforms-button--submit' ),
523
- 'attribute' => array( 'font-style' )
524
- ),
525
- 'label' => __( 'Font style', 'happyforms' ),
526
- 'sanitize' => 'sanitize_text_field'
527
  ),
528
- 'hf_style_submit_button_font_size' => array(
529
- 'default' => '16',
530
- 'type' => 'range',
531
- 'min' => 8,
532
- 'max' => 40,
533
- 'css' => array(
534
- 'selector' => array( '.happyforms-button--submit' ),
535
- 'attribute' => array( 'font-size' ),
536
- 'tpl' => '{{ value }}px'
537
- ),
538
- 'label' => __( 'Font size (px)', 'happyforms' ),
539
- 'sanitize' => 'sanitize_text_field'
540
  ),
541
- 'hf_style_submit_button_color' => array(
542
- 'default' => '#ffffff',
 
 
 
543
  'type' => 'color',
544
- 'css' => array(
545
- 'selector' => array( '.happyforms-button--submit' ),
546
- 'attribute' => array( 'color' )
547
- ),
548
- 'label' => __( 'Text color', 'happyforms' ),
549
- 'sanitize' => 'sanitize_text_field'
550
  ),
551
- 'hf_style_submit_button_bg' => array(
552
- 'default' => '#000000',
553
  'type' => 'color',
554
- 'css' => array(
555
- 'selector' => array( '.happyforms-button--submit' ),
556
- 'attribute' => array( 'background-color' )
557
- ),
558
- 'label' => __( 'Background color', 'happyforms' ),
559
- 'sanitize' => 'sanitize_text_field'
560
  ),
561
- 'hf_style_submit_button_bg_hover' => array(
562
- 'default' => '#555555',
563
  'type' => 'color',
564
- 'css' => array(
565
- 'selector' => array( '.happyforms-button--submit:hover' ),
566
- 'attribute' => array( 'background-color' )
567
- ),
568
- 'label' => __( 'Background color on hover', 'happyforms' ),
569
- 'sanitize' => 'sanitize_text_field'
 
570
  ),
571
- 'hf_style_submit_button_bg_transition' => array(
572
- 'default' => 'none',
 
 
 
 
 
 
 
 
573
  'type' => 'buttonset',
574
- 'options' => array(
575
- 'none' => 'None',
576
- 'background-color' => 'Fade'
577
- ),
578
- 'css' => array(
579
- 'selector' => array( '.happyforms-button--submit' ),
580
- 'attribute' => array( 'transition-property' )
581
- ),
582
- 'label' => __( 'Smooth background change (transition)', 'happyforms' ),
583
- 'sanitize' => 'sanitize_text_field'
584
  ),
585
- 'hf_style_submit_button_border' => array(
586
- 'default' => '0',
 
 
 
 
587
  'type' => 'range',
588
- 'min' => 0,
589
- 'max' => 10,
590
- 'css' => array(
591
- 'selector' => array( '.happyforms-button--submit' ),
592
- 'attribute' => array( 'border-width' ),
593
- 'tpl' => '{{ value }}px'
594
- ),
595
- 'label' => __( 'Border width (px)', 'happyforms' ),
596
- 'sanitize' => 'intval'
597
  ),
598
- 'hf_style_submit_button_border_color' => array(
599
- 'default' => '#000000',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
600
  'type' => 'color',
601
- 'css' => array(
602
- 'selector' => array( '.happyforms-button--submit' ),
603
- 'attribute' => array( 'border-color' )
604
- ),
605
- 'label' => __( 'Border color', 'happyforms' ),
606
- 'sanitize' => 'sanitize_text_field'
607
  ),
608
- 'hf_style_submit_button_border_color_hover' => array(
609
- 'default' => '#555555',
610
  'type' => 'color',
611
- 'css' => array(
612
- 'selector' => array( '.happyforms-button--submit:hover' ),
613
- 'attribute' => array( 'border-color' )
614
- ),
615
- 'label' => __( 'Border color on hover', 'happyforms' ),
616
- 'sanitize' => 'sanitize_text_field'
617
  ),
618
- 'hf_style_submit_button_border_radius' => array(
619
- 'default' => 6,
620
- 'type' => 'range',
621
- 'min' => 0,
622
- 'max' => 20,
623
- 'css' => array(
624
- 'selector' => array( '.happyforms-button--submit' ),
625
- 'attribute' => array( 'border-radius' ),
626
- 'tpl' => '{{ value }}px'
627
- ),
628
- 'label' => __( 'Border radius (px)', 'happyforms' ),
629
- 'sanitize' => 'intval'
630
  ),
631
- 'hf_style_submit_button_border_radius_hover' => array(
632
- 'default' => 6,
633
- 'type' => 'range',
634
- 'min' => 0,
635
- 'max' => 20,
636
- 'css' => array(
637
- 'selector' => array( '.happyforms-button--submit:hover' ),
638
- 'attribute' => array( 'border-radius' ),
639
- 'tpl' => '{{ value }}px'
640
- ),
641
- 'label' => __( 'Border radius on hover (px)', 'happyforms' ),
642
- 'sanitize' => 'intval'
643
  ),
644
- 'hf_style_disable_button_until_required_filled' => array(
645
- 'default' => 0,
646
- 'type' => 'checkbox',
647
- 'label' => __( 'Disable until required fields are filled', 'happyforms' ),
648
- 'sanitize' => 'happyforms_sanitize_checkbox'
 
 
 
 
649
  ),
650
- 'hf_confirmation_message_title' => array(
651
  'type' => 'divider',
652
- 'label' => __( 'Confirmation message', 'happyforms' )
653
  ),
654
- 'hf_style_confirmation_message_font_size' => array(
655
- 'default' => 16,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
656
  'type' => 'range',
657
- 'min' => 0,
658
- 'max' => 24,
659
- 'css' => array(
660
- 'selector' => array( '.happyforms-message-notice.success p, .happyforms-message-notice.error-submission p' ),
661
- 'attribute' => array( 'font-size' ),
662
- 'tpl' => '{{ value }}px'
663
- ),
664
- 'label' => __( 'Font size (px)', 'happyforms' ),
665
- 'sanitize' => 'intval'
666
  ),
667
- 'hf_style_confirmation_message_color' => array(
668
- 'default' => '#000000',
 
 
 
 
 
 
 
 
 
 
 
 
 
669
  'type' => 'color',
670
- 'css' => array(
671
- 'selector' => array( '.happyforms-message-notice.success p' ),
672
- 'attribute' => array( 'color' )
673
- ),
674
- 'label' => __( 'Text color', 'happyforms' ),
675
- 'sanitize' => 'sanitize_text_field'
676
  ),
677
- 'hf_style_confirmation_message_bg' => array(
678
- 'default' => '#ffffff',
679
  'type' => 'color',
680
- 'css' => array(
681
- 'selector' => array( '.happyforms-message-notice' ),
682
- 'attribute' => array( 'background-color' )
683
- ),
684
- 'label' => __( 'Background color', 'happyforms' ),
685
- 'sanitize' => 'sanitize_text_field'
686
  ),
687
- 'hf_style_confirmation_mesage_border' => array(
688
- 'default' => 3,
689
- 'type' => 'range',
690
- 'min' => 0,
691
- 'max' => 10,
692
- 'css' => array(
693
- 'selector' => array( '.happyforms-message-notice' ),
694
- 'attribute' => array( 'border-radius' ),
695
- 'tpl' => '{{ value }}px'
696
- ),
697
- 'label' => __( 'Border width (px)', 'happyforms' ),
698
- 'sanitize' => 'intval'
699
  ),
700
- 'hf_style_confirmation_mesage_border_color' => array(
701
- 'default' => '#000000',
702
  'type' => 'color',
703
- 'css' => array(
704
- 'selector' => array( '.happyforms-message-notice' ),
705
- 'attribute' => array( 'border-color' )
706
- ),
707
- 'label' => __( 'Border color', 'happyforms' ),
708
- 'sanitize' => 'sanitize_text_field'
709
  ),
710
- 'hf_style_confirmation_message_border_radius' => array(
711
- 'default' => 0,
712
- 'type' => 'range',
713
- 'min' => 0,
714
- 'max' => 20,
715
- 'css' => array(
716
- 'selector' => array( '.happyforms-message-notice' ),
717
- 'attribute' => array( 'border-radius' ),
718
- 'tpl' => '{{ value }}px'
719
- ),
720
- 'label' => __( 'Border radius (px)', 'happyforms' ),
721
- 'sanitize' => 'intval'
 
 
722
  ),
723
  );
724
 
725
- if ( false !== $key && isset( $fields[$key] ) ) {
726
- return $fields[$key];
727
- } else {
728
- return $fields;
729
- }
730
  }
731
 
732
- /**
733
- * Filter: add fields to form meta.
734
- *
735
- * @hooked filter happyforms_fields
736
- *
737
- * @since 1.0.0.
738
- *
739
- * @param array $fields Current form style fields.
740
- *
741
- * @return array
742
- */
743
- public function add_fields( $fields ) {
744
- $styles = $this->get_styles();
745
-
746
- foreach ( $styles as $key => $style ) {
747
- if ( isset( $style['default'] ) ) {
748
- $fields['meta'][$key] = array(
749
- 'default' => $style['default'],
750
- 'sanitize' => $style['sanitize']
751
- );
752
- }
753
- }
754
-
755
- return $fields;
756
  }
757
 
758
- /**
759
- * Get default values of style fields.
760
- *
761
- * @since 1.0.0.
762
- *
763
- * @return array
764
- */
765
- public function get_defaults() {
766
- $defaults = array();
767
- $fields = $this->get_styles();
768
-
769
- foreach ( $fields as $field_name => $field_settings ) {
770
- if ( isset( $field_settings['default'] ) ) {
771
- $defaults[$field_name] = $field_settings['default'];
772
- }
773
- }
774
-
775
- return $defaults;
776
  }
777
 
778
- /**
779
- * Parse styles from meta.
780
- *
781
- * @param array $form Form data.
782
- *
783
- * @since 1.0.0.
784
- *
785
- * @param array $form Current form data.
786
- *
787
- * @return array
788
- */
789
- public function parse_styles( $form ) {
790
- $all_styles = $this->get_styles();
791
- $styles = array();
792
-
793
- foreach ( $all_styles as $key => $style ) {
794
- if ( !isset( $form[$key] ) ) {
795
- continue;
796
- }
797
-
798
- if ( !isset( $style['css'] ) ) {
799
- continue;
800
- }
801
-
802
- if ( $form[$key] === $style['default'] && !isset( $style['force'] ) ) {
803
- continue;
804
- }
805
-
806
- $attribute = $style['css']['attribute'];
807
-
808
- if ( is_array( $attribute ) ) {
809
- $value = ( isset( $style['css']['value'] ) ) ? $style['css']['value'] : '';
810
-
811
- foreach( $attribute as $attr_key => $attr ) {
812
- $data = array();
813
- $data[$attr] = array();
814
-
815
- if ( isset( $value ) && is_array( $value ) ) {
816
- $value = $value[intval( $form[$key] )];
817
- } else {
818
- $value = $form[$key];
819
- }
820
-
821
- if ( !empty( $value ) ) {
822
- if ( isset( $style['css']['tpl'] ) ) {
823
- $value = str_replace( '{{ value }}', $value, $style['css']['tpl'] );
824
- }
825
-
826
- $data[$attr] = $value;
827
-
828
- $selector = $style['css']['selector'][$attr_key];
829
 
830
- if ( !empty( $value ) ) {
831
- if ( !isset( $styles[$selector] ) ) {
832
- $styles[$selector] = $data;
833
- } else {
834
- if ( $attr_key > 0 ) {
835
- $styles[$selector[$attr_key]][$attr] = $value;
836
- } else {
837
- $styles[$selector][$attr] = $value;
838
- }
839
- }
840
- }
841
- }
842
- }
843
  }
844
  }
845
 
846
- return $styles;
847
  }
848
 
849
- /**
850
- * Print styles.
851
- *
852
- * @since 1.0.0.
853
- *
854
- * @param array $form Current form data.
855
- *
856
- * @return string
857
- */
858
- public function print_css( $form ) {
859
- $styles = $this->parse_styles( $form );
860
 
861
- $id_selector = '#happyforms-' . $form['ID'];
862
-
863
- $output = '<!-- begin HappyForms CSS --> <style type="text/css">';
864
-
865
- foreach ( $styles as $selector => $style ) {
866
- $selector = $id_selector . ' ' . $selector;
867
-
868
- $selector = str_replace( ',', ', ' . $id_selector, $selector );
869
-
870
- $output .= ' ' . $selector . ' { ';
871
-
872
- foreach ( $style as $attr => $value ) {
873
- $output .= $attr . ': ' . $value . '; ';
874
- }
875
-
876
- $output .= '}';
877
- }
878
-
879
- $output .= '</style><!-- end HappyForms CSS -->';
880
-
881
- echo $output;
882
  }
883
 
884
  /**
885
- * Action: load styles.
886
  *
887
- * @hooked action wp_ajax_happyforms_load_styles
888
  *
889
- * @since 1.0.0.
890
  *
891
- * @return string
 
 
892
  */
893
- public function load_styles() {
894
- $form = $_POST['form'];
895
-
896
- $css = $this->print_css( $form );
897
 
898
- echo $css;
899
-
900
- wp_die();
901
  }
902
 
903
  }
36
  * @return void
37
  */
38
  public function hook() {
39
+ add_filter( 'happyforms_meta_fields', array( $this, 'meta_fields' ) );
40
+ add_filter( 'happyforms_form_class', array( $this, 'form_html_class' ), 10, 2 );
41
+ add_action( 'happyforms_head', array( $this, 'form_html_styles' ), 10, 2 );
42
  }
43
 
44
+ public function get_fields() {
 
 
 
 
 
 
 
 
 
45
  $fields = array(
46
+ 'hf_style_required_text' => array(
47
+ 'default' => '*',
48
+ 'sanitize' => 'sanitize_text_field',
49
+ 'target' => '',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  ),
51
+ 'disable_submit_until_valid' => array(
52
+ 'default' => '',
53
+ 'sanitize' => 'sanitize_text_field',
54
+ 'target' => 'form_class',
55
+ 'value' => 'happyforms-form--disable-until-valid',
 
 
 
 
 
 
 
 
56
  ),
57
+ 'form_font_weight' => array(
58
  'default' => 'normal',
 
59
  'options' => array(
60
+ 'normal' => __( 'Normal', 'happyforms' ),
61
+ 'bold' => __( 'Bold', 'happyforms' )
62
  ),
63
+ 'target' => 'css_var',
64
+ 'variable' => '--happyforms-form-font-weight',
 
 
 
65
  'sanitize' => 'sanitize_text_field'
66
  ),
67
+ 'form_title' => array(
68
  'default' => '',
69
+ 'options' => array(
70
+ '' => __( 'Show', 'happyforms' ),
71
+ 'happyforms-form--hide-title' => __( 'Hide', 'happyforms' )
 
72
  ),
73
+ 'target' => 'form_class',
74
  'sanitize' => 'sanitize_text_field'
75
  ),
76
+ 'form_title_font_size' => array(
77
+ 'default' => 32,
78
+ 'unit' => 'px',
79
+ 'min' => 16,
80
+ 'max' => 52,
81
+ 'step' => 1,
82
+ 'sanitize' => 'intval',
83
+ 'target' => 'css_var',
84
+ 'variable' => '--happyforms-form-title-font-size'
 
 
 
85
  ),
86
+ 'part_border' => array(
87
+ 'default' => '',
88
+ 'options' => array(
89
+ '' => __( 'Show', 'happyforms' ),
90
+ 'happyforms-form--part-border-off' => __( 'Hide', 'happyforms' )
 
91
  ),
92
+ 'target' => 'form_class',
93
  'sanitize' => 'sanitize_text_field'
94
  ),
95
+ 'part_border_location' => array(
96
+ 'default' => '',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  'options' => array(
98
+ '' => __( 'All sides', 'happyforms' ),
99
+ 'happyforms-form--part-borders-bottom-only' => __( 'Bottom only', 'happyforms' )
 
 
 
 
100
  ),
101
+ 'target' => 'form_class',
102
  'sanitize' => 'sanitize_text_field'
103
  ),
104
+ 'part_border_radius' => array(
105
+ 'default' => '',
 
106
  'options' => array(
107
+ 'happyforms-form--part-border-radius-square' => __( 'Square', 'happyforms' ),
108
+ '' => __( 'Round', 'happyforms' ),
109
+ 'happyforms-form--part-border-radius-pill' => __( 'Pill', 'happyforms' )
110
  ),
111
+ 'target' => 'form_class',
 
 
 
 
112
  'sanitize' => 'sanitize_text_field'
113
  ),
114
+ 'part_outer_padding' => array(
115
+ 'default' => '',
116
+ 'options' => array(
117
+ 'happyforms-form--part-outer-padding-narrow' => __( 'Narrow', 'happyforms' ),
118
+ '' => __( 'Default', 'happyforms' ),
119
+ 'happyforms-form--part-outer-padding-wide' => __( 'Wide', 'happyforms' )
 
 
 
120
  ),
121
+ 'target' => 'form_class',
122
  'sanitize' => 'sanitize_text_field'
123
  ),
124
+ 'part_inner_padding' => array(
125
+ 'default' => '',
 
126
  'options' => array(
127
+ 'happyforms-form--part-inner-padding-narrow' => __( 'Narrow', 'happyforms' ),
128
+ '' => __( 'Default', 'happyforms' ),
129
+ 'happyforms-form--part-inner-padding-wide' => __( 'Wide', 'happyforms' )
 
 
 
130
  ),
131
+ 'target' => 'form_class',
132
  'sanitize' => 'sanitize_text_field'
133
  ),
134
+ 'part_hide_titles' => array(
135
+ 'default' => '',
 
136
  'options' => array(
137
+ '' => __( 'Show', 'happyforms' ),
138
+ 'happyforms-form--part-hide-labels' => __( 'Hide', 'happyforms' )
 
 
 
 
139
  ),
140
+ 'sanitize' => 'sanitize_text_field',
141
+ 'target' => 'form_class',
142
  ),
143
+ 'part_toggle_placeholders' => array(
144
+ 'default' => '',
145
+ 'value' => 'happyforms-form--part-placeholder-toggle',
146
+ 'sanitize' => 'sanitize_text_field',
147
+ 'target' => 'form_class',
 
 
 
 
 
 
 
148
  ),
149
+ 'part_title_font_size' => array(
150
+ 'default' => 16,
151
+ 'unit' => 'px',
152
+ 'min' => 13,
153
+ 'max' => 30,
154
+ 'step' => 1,
155
+ 'target' => 'css_var',
156
+ 'variable' => '--happyforms-part-title-font-size',
157
  'sanitize' => 'sanitize_text_field'
158
  ),
159
+ 'part_title_font_weight' => array(
160
+ 'default' => '',
161
+ 'options' => array(
162
+ 'happyforms-form--part-title-font-weight-normal' => __( 'Normal', 'happyforms' ),
163
+ '' => __( 'Bold', 'happyforms' )
 
164
  ),
165
+ 'target' => 'form_class',
166
  'sanitize' => 'sanitize_text_field'
167
  ),
168
+ 'part_description_font_size' => array(
169
+ 'default' => 14,
170
+ 'unit' => 'px',
171
+ 'min' => 10,
172
  'max' => 20,
173
+ 'step' => 1,
174
+ 'target' => 'css_var',
175
+ 'variable' => '--happyforms-part-description-font-size',
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  'sanitize' => 'sanitize_text_field'
177
  ),
178
+ 'part_value_font_size' => array(
179
+ 'default' => 16,
180
+ 'unit' => 'px',
181
+ 'min' => 12,
182
+ 'max' => 24,
183
+ 'step' => 1,
184
+ 'target' => 'css_var',
185
+ 'variable' => '--happyforms-part-value-font-size',
186
  'sanitize' => 'sanitize_text_field'
187
  ),
188
+ 'submit_button_border' => array(
189
+ 'default' => '',
 
190
  'options' => array(
191
+ '' => __( 'Show', 'happyforms' ),
192
+ 'happyforms-form--submit-button-border-hide' => __( 'Hide', 'happyforms' )
 
 
 
 
193
  ),
194
+ 'target' => 'form_class',
195
  'sanitize' => 'sanitize_text_field'
196
  ),
197
+ 'submit_button_border_radius' => array(
198
+ 'default' => '',
199
+ 'options' => array(
200
+ 'happyforms-form--submit-button-border-radius-square' => __( 'Square', 'happyforms' ),
201
+ '' => __( 'Round', 'happyforms' ),
202
+ 'happyforms-form--submit-button-border-radius-pill' => __( 'Pill', 'happyforms' )
203
  ),
204
+ 'target' => 'form_class',
205
  'sanitize' => 'sanitize_text_field'
206
  ),
207
+ 'submit_button_width' => array(
208
+ 'default' => '',
 
209
  'options' => array(
210
+ '' => __( 'Default', 'happyforms' ),
211
+ 'happyforms-form--submit-button-fullwidth' => __( 'Full width', 'happyforms' )
212
  ),
213
+ 'target' => 'form_class',
 
 
 
 
214
  'sanitize' => 'sanitize_text_field'
215
  ),
216
+ 'submit_button_font_size' => array(
217
+ 'default' => 18,
218
+ 'unit' => 'px',
219
+ 'min' => 14,
220
  'max' => 40,
221
+ 'step' => 1,
222
+ 'target' => 'css_var',
223
+ 'variable' => '--happyforms-submit-button-font-size',
 
 
 
224
  'sanitize' => 'sanitize_text_field'
225
  ),
226
+ 'submit_button_font_weight' => array(
227
+ 'default' => '',
 
 
 
 
 
 
 
 
 
 
 
228
  'options' => array(
229
+ '' => __( 'Normal', 'happyforms' ),
230
+ 'happyforms-form--submit-button-bold' => __( 'Bold', 'happyforms' )
 
 
 
 
231
  ),
232
+ 'target' => 'form_class',
233
  'sanitize' => 'sanitize_text_field'
234
  ),
235
+ 'submit_button_alignment' => array(
236
+ 'default' => '',
 
237
  'options' => array(
238
+ '' => __( 'Left', 'happyforms' ),
239
+ 'happyforms-form--submit-button-align-center' => __( 'Center', 'happyforms' ),
240
+ 'happyforms-form--submit-button-align-right' => __( 'Right', 'happyforms' )
241
  ),
242
+ 'target' => 'form_class',
 
 
 
 
243
  'sanitize' => 'sanitize_text_field'
244
  ),
245
+ 'color_primary' => array(
246
+ 'default' => '#000000',
247
+ 'sanitize' => 'sanitize_text_field',
248
+ 'target' => 'css_var',
249
+ 'variable' => '--happyforms-color-primary',
250
+ ),
251
+ 'color_success' => array(
252
+ 'default' => '#39b54a',
253
+ 'sanitize' => 'sanitize_text_field',
254
+ 'target' => 'css_var',
255
+ 'variable' => '--happyforms-color-success',
256
+ ),
257
+ 'color_error' => array(
258
+ 'default' => '#ff7550',
259
+ 'sanitize' => 'sanitize_text_field',
260
+ 'target' => 'css_var',
261
+ 'variable' => '--happyforms-color-error',
262
+ ),
263
+ 'color_part_title' => array(
264
+ 'default' => '#000000',
265
+ 'sanitize' => 'sanitize_text_field',
266
+ 'target' => 'css_var',
267
+ 'variable' => '--happyforms-color-part-title',
268
+ ),
269
+ 'color_part_text' => array(
270
+ 'default' => '#000000',
271
+ 'sanitize' => 'sanitize_text_field',
272
+ 'target' => 'css_var',
273
+ 'variable' => '--happyforms-color-part-value',
274
+ ),
275
+ 'color_part_placeholder' => array(
276
+ 'default' => '#aaaaaa',
277
+ 'sanitize' => 'sanitize_text_field',
278
+ 'target' => 'css_var',
279
+ 'variable' => '--happyforms-color-part-placeholder',
280
+ ),
281
+ 'color_part_required' => array(
282
+ 'default' => '#ff7550',
283
+ 'sanitize' => 'sanitize_text_field',
284
+ 'target' => 'css_var',
285
+ 'variable' => '--happyforms-color-part-required-text',
286
+ ),
287
+ 'color_part_border' => array(
288
+ 'default' => '#dbdbdb',
289
+ 'sanitize' => 'sanitize_text_field',
290
+ 'target' => 'css_var',
291
+ 'variable' => '--happyforms-color-part-border',
292
+ ),
293
+ 'color_part_border_focus' => array(
294
+ 'default' => '#000000',
295
+ 'sanitize' => 'sanitize_text_field',
296
+ 'target' => 'css_var',
297
+ 'variable' => '--happyforms-color-part-border-focus',
298
+ ),
299
+ 'color_part_background' => array(
300
+ 'default' => '#ffffff',
301
+ 'sanitize' => 'sanitize_text_field',
302
+ 'target' => 'css_var',
303
+ 'variable' => '--happyforms-color-part-background',
304
+ ),
305
+ 'color_part_background_focus' => array(
306
+ 'default' => '#ffffff',
307
+ 'sanitize' => 'sanitize_text_field',
308
+ 'target' => 'css_var',
309
+ 'variable' => '--happyforms-color-part-background-focus',
310
+ ),
311
+ 'color_disable_part_transitions' => array(
312
+ 'default' => '',
313
+ 'sanitize' => 'sanitize_text_field',
314
+ 'target' => 'form_class',
315
+ 'value' => 'happyforms-form--part-disable-transitions'
316
+ ),
317
+ 'color_submit_background' => array(
318
+ 'default' => '#000000',
319
+ 'sanitize' => 'sanitize_text_field',
320
+ 'target' => 'css_var',
321
+ 'variable' => '--happyforms-color-submit-background',
322
+ ),
323
+ 'color_submit_background_hover' => array(
324
+ 'default' => '#dbdbdb',
325
+ 'sanitize' => 'sanitize_text_field',
326
+ 'target' => 'css_var',
327
+ 'variable' => '--happyforms-color-submit-background-hover',
328
+ ),
329
+ 'color_submit_background_focus' => array(
330
+ 'default' => '#dbdbdb',
331
+ 'sanitize' => 'sanitize_text_field',
332
+ 'target' => 'css_var',
333
+ 'variable' => '--happyforms-color-submit-background-focus',
334
+ ),
335
+ 'color_submit_border' => array(
336
+ 'default' => 'transparent',
337
+ 'sanitize' => 'sanitize_text_field',
338
+ 'target' => 'css_var',
339
+ 'variable' => '--happyforms-color-submit-border',
340
+ ),
341
+ 'color_submit_text' => array(
342
+ 'default' => '#ffffff',
343
+ 'sanitize' => 'sanitize_text_field',
344
+ 'target' => 'css_var',
345
+ 'variable' => '--happyforms-color-submit-text',
346
+ ),
347
+ 'color_submit_text_hover' => array(
348
+ 'default' => '#000000',
349
+ 'sanitize' => 'sanitize_text_field',
350
+ 'target' => 'css_var',
351
+ 'variable' => '--happyforms-color-submit-text-hover',
352
+ ),
353
+ 'color_disable_submit_button_transitions' => array(
354
+ 'default' => '',
355
+ 'sanitize' => 'sanitize_text_field',
356
+ 'target' => 'form_class',
357
+ 'value' => 'happyforms-form--submit-button-disable-transitions'
358
+ ),
359
+ 'color_rating_star' => array(
360
+ 'default' => '#cccccc',
361
+ 'sanitize' => 'sanitize_text_field',
362
+ 'target' => 'css_var',
363
+ 'variable' => '--happyforms-color-rating',
364
+ ),
365
+ 'color_rating_star_hover' => array(
366
+ 'default' => '#f39c00',
367
+ 'sanitize' => 'sanitize_text_field',
368
+ 'target' => 'css_var',
369
+ 'variable' => '--happyforms-color-rating-hover',
370
+ ),
371
+ );
372
+
373
+ return $fields;
374
+ }
375
+
376
+ public function get_controls() {
377
+ $controls = array(
378
+ array(
379
+ 'type' => 'divider',
380
+ 'label' => __( 'General', 'happyforms' )
381
+ ),
382
+ array(
383
  'type' => 'text',
384
  'label' => __( 'Required text', 'happyforms' ),
385
+ 'field' => 'hf_style_required_text',
386
  ),
387
+ array(
388
+ 'type' => 'checkbox',
389
+ 'label' => __( 'Disable submit button until form is valid', 'happyforms' ),
390
+ 'field' => 'disable_submit_until_valid',
391
+ ),
392
+ array(
393
+ 'type' => 'buttonset',
394
+ 'label' => __( 'Font weight', 'happyforms' ),
395
+ 'field' => 'form_font_weight',
396
+ ),
397
+ array(
398
+ 'type' => 'heading',
399
+ 'label' => __( 'Colors', 'happyforms' )
400
+ ),
401
+ array(
402
  'type' => 'color',
403
+ 'label' => __( 'Primary', 'happyforms' ),
404
+ 'field' => 'color_primary',
 
 
 
 
405
  ),
406
+ array(
 
407
  'type' => 'color',
408
+ 'label' => __( 'Success', 'happyforms' ),
409
+ 'field' => 'color_success',
 
 
 
 
410
  ),
411
+ array(
 
412
  'type' => 'color',
413
+ 'label' => __( 'Error', 'happyforms' ),
414
+ 'field' => 'color_error',
 
 
 
 
415
  ),
416
+ array(
417
  'type' => 'divider',
418
+ 'label' => __( 'Form title', 'happyforms' )
419
  ),
420
+ array(
421
+ 'type' => 'buttonset',
422
+ 'label' => __( 'Form title', 'happyforms' ),
423
+ 'field' => 'form_title',
 
 
 
 
 
 
 
 
 
424
  ),
425
+ array(
426
+ 'type' => 'range',
427
+ 'label' => __( 'Font size', 'happyforms' ),
428
+ 'field' => 'form_title_font_size',
 
 
 
 
 
 
429
  ),
430
+ array(
431
  'type' => 'divider',
432
+ 'label' => __( 'Part borders & spacing', 'happyforms' )
433
  ),
434
+ array(
 
435
  'type' => 'buttonset',
436
+ 'label' => __( 'Border', 'happyforms' ),
437
+ 'field' => 'part_border',
 
 
 
 
 
 
 
 
 
438
  ),
439
+ array(
 
440
  'type' => 'buttonset',
441
+ 'label' => __( 'Border location', 'happyforms' ),
442
+ 'field' => 'part_border_location',
 
 
 
 
 
 
 
 
443
  ),
444
+ array(
 
445
  'type' => 'buttonset',
446
+ 'label' => __( 'Border radius', 'happyforms' ),
447
+ 'field' => 'part_border_radius',
 
 
 
 
 
 
 
 
448
  ),
449
+ array(
 
450
  'type' => 'buttonset',
451
+ 'label' => __( 'Outer padding', 'happyforms' ),
452
+ 'field' => 'part_outer_padding',
 
 
 
 
 
 
 
 
453
  ),
454
+ array(
455
+ 'type' => 'buttonset',
456
+ 'label' => __( 'Inner padding', 'happyforms' ),
457
+ 'field' => 'part_inner_padding',
 
 
 
 
 
 
 
 
458
  ),
459
+ array(
460
+ 'type' => 'heading',
461
+ 'label' => __( 'Colors', 'happyforms' )
462
+ ),
463
+ array(
464
  'type' => 'color',
465
+ 'label' => __( 'Border', 'happyforms' ),
466
+ 'field' => 'color_part_border',
 
 
 
 
467
  ),
468
+ array(
 
469
  'type' => 'color',
470
+ 'label' => __( 'Border on focus', 'happyforms' ),
471
+ 'field' => 'color_part_border_focus',
 
 
 
 
472
  ),
473
+ array(
 
474
  'type' => 'color',
475
+ 'label' => __( 'Background', 'happyforms' ),
476
+ 'field' => 'color_part_background',
477
+ ),
478
+ array(
479
+ 'type' => 'color',
480
+ 'label' => __( 'Background on focus', 'happyforms' ),
481
+ 'field' => 'color_part_background_focus',
482
  ),
483
+ array(
484
+ 'type' => 'checkbox',
485
+ 'label' => __( 'Disable transitions on part colors', 'happyforms' ),
486
+ 'field' => 'color_disable_part_transitions'
487
+ ),
488
+ array(
489
+ 'type' => 'divider',
490
+ 'label' => __( 'Part labels & text', 'happyforms' )
491
+ ),
492
+ array(
493
  'type' => 'buttonset',
494
+ 'label' => __( 'Part titles', 'happyforms' ),
495
+ 'field' => 'part_hide_titles',
 
 
 
 
 
 
 
 
496
  ),
497
+ array(
498
+ 'type' => 'checkbox',
499
+ 'label' => __( 'Toggle placeholder on part focus', 'happyforms' ),
500
+ 'field' => 'part_toggle_placeholders',
501
+ ),
502
+ array(
503
  'type' => 'range',
504
+ 'label' => __( 'Title font size', 'happyforms' ),
505
+ 'field' => 'part_title_font_size',
 
 
 
 
 
 
 
506
  ),
507
+ array(
508
+ 'type' => 'buttonset',
509
+ 'label' => __( 'Title font weight', 'happyforms' ),
510
+ 'field' => 'part_title_font_weight',
511
+ ),
512
+ array(
513
+ 'type' => 'range',
514
+ 'label' => __( 'Description font size', 'happyforms' ),
515
+ 'field' => 'part_description_font_size',
516
+ ),
517
+ array(
518
+ 'type' => 'range',
519
+ 'label' => __( 'Value font size', 'happyforms' ),
520
+ 'field' => 'part_value_font_size',
521
+ ),
522
+ array(
523
+ 'type' => 'heading',
524
+ 'label' => __( 'Colors', 'happyforms' )
525
+ ),
526
+ array(
527
  'type' => 'color',
528
+ 'label' => __( 'Title', 'happyforms' ),
529
+ 'field' => 'color_part_title',
 
 
 
 
530
  ),
531
+ array(
 
532
  'type' => 'color',
533
+ 'label' => __( 'Value', 'happyforms' ),
534
+ 'field' => 'color_part_text',
 
 
 
 
535
  ),
536
+ array(
537
+ 'type' => 'color',
538
+ 'label' => __( 'Placeholder', 'happyforms' ),
539
+ 'field' => 'color_part_placeholder',
 
 
 
 
 
 
 
 
540
  ),
541
+ array(
542
+ 'type' => 'color',
543
+ 'label' => __( 'Required text', 'happyforms' ),
544
+ 'field' => 'color_part_required',
 
 
 
 
 
 
 
 
545
  ),
546
+ array(
547
+ 'type' => 'color',
548
+ 'label' => __( 'Rating star color', 'happyforms' ),
549
+ 'field' => 'color_rating_star',
550
+ ),
551
+ array(
552
+ 'type' => 'color',
553
+ 'label' => __( 'Rating star color on hover', 'happyforms' ),
554
+ 'field' => 'color_rating_star_hover',
555
  ),
556
+ array(
557
  'type' => 'divider',
558
+ 'label' => __( 'Submit button', 'happyforms' )
559
  ),
560
+ array(
561
+ 'type' => 'buttonset',
562
+ 'label' => __( 'Border', 'happyforms' ),
563
+ 'field' => 'submit_button_border',
564
+ ),
565
+ array(
566
+ 'type' => 'buttonset',
567
+ 'label' => __( 'Border radius', 'happyforms' ),
568
+ 'field' => 'submit_button_border_radius',
569
+ ),
570
+ array(
571
+ 'type' => 'buttonset',
572
+ 'label' => __( 'Width', 'happyforms' ),
573
+ 'field' => 'submit_button_width',
574
+ ),
575
+ array(
576
  'type' => 'range',
577
+ 'label' => __( 'Font Size', 'happyforms' ),
578
+ 'field' => 'submit_button_font_size',
 
 
 
 
 
 
 
579
  ),
580
+ array(
581
+ 'type' => 'buttonset',
582
+ 'label' => __( 'Font Weight', 'happyforms' ),
583
+ 'field' => 'submit_button_font_weight',
584
+ ),
585
+ array(
586
+ 'type' => 'buttonset',
587
+ 'label' => __( 'Alignment', 'happyforms' ),
588
+ 'field' => 'submit_button_alignment',
589
+ ),
590
+ array(
591
+ 'type' => 'heading',
592
+ 'label' => __( 'Colors', 'happyforms' )
593
+ ),
594
+ array(
595
  'type' => 'color',
596
+ 'label' => __( 'Background', 'happyforms' ),
597
+ 'field' => 'color_submit_background',
 
 
 
 
598
  ),
599
+ array(
 
600
  'type' => 'color',
601
+ 'label' => __( 'Background on hover', 'happyforms' ),
602
+ 'field' => 'color_submit_background_hover',
 
 
 
 
603
  ),
604
+ array(
605
+ 'type' => 'color',
606
+ 'label' => __( 'Background on focus', 'happyforms' ),
607
+ 'field' => 'color_submit_background_focus',
 
 
 
 
 
 
 
 
608
  ),
609
+ array(
 
610
  'type' => 'color',
611
+ 'label' => __( 'Border', 'happyforms' ),
612
+ 'field' => 'color_submit_border',
 
 
 
 
613
  ),
614
+ array(
615
+ 'type' => 'color',
616
+ 'label' => __( 'Text', 'happyforms' ),
617
+ 'field' => 'color_submit_text',
618
+ ),
619
+ array(
620
+ 'type' => 'color',
621
+ 'label' => __( 'Text on hover', 'happyforms' ),
622
+ 'field' => 'color_submit_text_hover',
623
+ ),
624
+ array(
625
+ 'type' => 'checkbox',
626
+ 'label' => __( 'Disable transitions on submit button', 'happyforms' ),
627
+ 'field' => 'color_disable_submit_button_transitions'
628
  ),
629
  );
630
 
631
+ return $controls;
 
 
 
 
632
  }
633
 
634
+ public function is_class_field( $field ) {
635
+ return 'form_class' === $field['target'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
636
  }
637
 
638
+ public function is_css_var_field( $field ) {
639
+ return 'css_var' === $field['target'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
  }
641
 
642
+ public function form_html_class( $class, $form ) {
643
+ $fields = $this->get_fields();
644
+ $class_fields = array_filter( $fields, array( $this, 'is_class_field' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645
 
646
+ foreach ( $class_fields as $key => $field ) {
647
+ if ( '' !== $form[$key] ) {
648
+ $class[] = $form[$key];
 
 
 
 
 
 
 
 
 
 
649
  }
650
  }
651
 
652
+ return $class;
653
  }
654
 
655
+ public function form_html_styles( $forms ) {
656
+ $fields = $this->get_fields();
657
+ $css_vars = array_filter( $fields, array( $this, 'is_css_var_field' ) );
 
 
 
 
 
 
 
 
658
 
659
+ require_once( happyforms_get_include_folder() . '/templates/form-styles.css.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
660
  }
661
 
662
  /**
663
+ * Filter: add fields to form meta.
664
  *
665
+ * @hooked filter happyforms_meta_fields
666
  *
667
+ * @since 1.3.0.
668
  *
669
+ * @param array $fields Current form meta fields.
670
+ *
671
+ * @return array
672
  */
673
+ public function meta_fields( $fields ) {
674
+ $fields = array_merge( $fields, $this->get_fields() );
 
 
675
 
676
+ return $fields;
 
 
677
  }
678
 
679
  }
inc/classes/class-happyforms-plugin.php CHANGED
@@ -30,6 +30,15 @@ class HappyForms_Plugin {
30
  */
31
  private $landing_page_url = 'https://www.happyforms.me';
32
 
 
 
 
 
 
 
 
 
 
33
  /**
34
  * Action: initialize admin and frontend logic.
35
  *
@@ -40,6 +49,9 @@ class HappyForms_Plugin {
40
  * @return void
41
  */
42
  public function initialize_plugin() {
 
 
 
43
  if ( is_admin() ) {
44
  require_once( happyforms_get_include_folder() . '/classes/class-admin-notices.php' );
45
  require_once( happyforms_get_include_folder() . '/classes/class-tracking.php' );
@@ -50,7 +62,6 @@ class HappyForms_Plugin {
50
  require_once( happyforms_get_include_folder() . '/classes/class-form-part-library.php' );
51
  require_once( happyforms_get_include_folder() . '/classes/class-form-styles.php' );
52
  require_once( happyforms_get_include_folder() . '/classes/class-message-notices.php' );
53
- require_once( happyforms_get_include_folder() . '/helpers/helper-misc.php' );
54
  require_once( happyforms_get_include_folder() . '/classes/class-happyforms-widget.php' );
55
  require_once( happyforms_get_include_folder() . '/helpers/helper-form-templates.php' );
56
 
@@ -59,16 +70,17 @@ class HappyForms_Plugin {
59
  add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 80 );
60
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
61
  add_action( 'current_screen', array( $this, 'admin_screens' ) );
62
- add_filter( 'mce_external_plugins', array( $this, 'tinymce_register_plugins' ) );
63
- add_filter( 'mce_buttons', array( $this, 'tinymce_register_button' ) );
64
  add_filter( 'media_buttons_context', array( $this, 'insert_editor_buttons' ) );
65
 
66
  // Widget
67
  add_action( 'widgets_init', array( $this, 'register_widget' ) );
68
 
 
 
 
69
  // Common hooks
70
- add_action( 'template_redirect', array( $this, 'set_customize_preview_content' ) );
71
  add_shortcode( $this->shortcode, array( $this, 'handle_shortcode' ) );
 
72
  add_action( 'wp_head', array( $this, 'wp_head' ) );
73
  add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ) );
74
  }
@@ -191,14 +203,6 @@ class HappyForms_Plugin {
191
  '',
192
  true
193
  );
194
-
195
- $form_data = $this->get_form_data_array();
196
-
197
- wp_localize_script(
198
- 'happyforms-admin',
199
- 'happyFormsData',
200
- $form_data
201
- );
202
  }
203
 
204
  /**
@@ -288,40 +292,6 @@ class HappyForms_Plugin {
288
  );
289
  }
290
 
291
- /**
292
- * Action: inject the form template to be used
293
- * in Customize screen previews.
294
- *
295
- * @since 1.0
296
- *
297
- * @hooked action template_redirect
298
- *
299
- * @return void
300
- */
301
- public function set_customize_preview_content() {
302
- if ( is_customize_preview() && isset( $_GET['happyformsNewForm'] ) ) {
303
- return require_once( happyforms_get_include_folder() . '/templates/preview-form-new.php' );
304
- }
305
- }
306
-
307
- /**
308
- * Filter: register the form dropdown plugin
309
- * for the post content editor.
310
- *
311
- * @since 1.0
312
- *
313
- * @hooked filter mce_external_plugins
314
- *
315
- * @param array $plugins The currently registered plugins.
316
- *
317
- * @return array
318
- */
319
- public function tinymce_register_plugins( $plugins ) {
320
- $plugins['happyforms_form_picker'] = happyforms_get_plugin_url() . 'assets/js/tinymce/form-picker.js';
321
-
322
- return $plugins;
323
- }
324
-
325
  /**
326
  * Filter: register the form dropdown button
327
  * for he post content editor toolbar.
@@ -359,16 +329,15 @@ class HappyForms_Plugin {
359
  }
360
 
361
  /**
362
- * Action: output scripts and styles for the forms
363
- * embedded into the current post.
364
  *
365
- * @since 1.0
366
  *
367
- * @hooked action wp_head
368
  *
369
  * @return void
370
  */
371
- public function wp_head() {
372
  global $post;
373
 
374
  if ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, $this->shortcode ) ) {
@@ -391,19 +360,49 @@ class HappyForms_Plugin {
391
  $form_id = $attrs['id'];
392
  $form = $form_controller->get( $form_id );
393
 
394
- /**
395
- * Enqueue form-specific scripts.
396
- *
397
- * @since 1.1
398
- *
399
- * @param array $form Current form data.
400
- *
401
- * @return void
402
- */
403
- do_action( 'happyforms_frontend_form_scripts', $form );
404
  }
405
  }
406
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  }
408
 
409
  /**
@@ -425,11 +424,30 @@ class HappyForms_Plugin {
425
  return $context;
426
  }
427
 
428
- $button_html = '<a href="#" class="button happyforms-editor-button" onclick="tinyMCE.activeEditor.editorCommands.execCommand(\'HappyForms_Form_Picker\');"><span class="dashicons dashicons-format-status"></span><span>'. __( 'Add HappyForms', 'happyforms' ) .'</span></a>';
 
 
429
 
430
  return $context . ' ' . $button_html;
431
  }
432
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
433
  /**
434
  * Action: enqueue scripts and styles
435
  * for the frontend part of the plugin.
@@ -441,18 +459,58 @@ class HappyForms_Plugin {
441
  * @return void
442
  */
443
  public function wp_enqueue_scripts() {
 
 
 
 
 
 
444
  wp_enqueue_script(
445
  'happyforms-frontend',
446
  happyforms_get_plugin_url() . 'assets/js/frontend.js',
447
- array( 'jquery' ),
448
- false,
449
- true
450
  );
451
 
452
  wp_enqueue_style(
453
- 'happyform-frontend',
454
  happyforms_get_plugin_url() . 'assets/css/frontend.css'
455
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  }
457
 
458
  /**
30
  */
31
  private $landing_page_url = 'https://www.happyforms.me';
32
 
33
+ /**
34
+ * List of forms found on current page.
35
+ *
36
+ * @since 1.3
37
+ *
38
+ * @var array
39
+ */
40
+ private $current_forms = array();
41
+
42
  /**
43
  * Action: initialize admin and frontend logic.
44
  *
49
  * @return void
50
  */
51
  public function initialize_plugin() {
52
+ require_once( happyforms_get_include_folder() . '/helpers/helper-misc.php' );
53
+ require_once( happyforms_get_include_folder() . '/helpers/helper-styles.php' );
54
+
55
  if ( is_admin() ) {
56
  require_once( happyforms_get_include_folder() . '/classes/class-admin-notices.php' );
57
  require_once( happyforms_get_include_folder() . '/classes/class-tracking.php' );
62
  require_once( happyforms_get_include_folder() . '/classes/class-form-part-library.php' );
63
  require_once( happyforms_get_include_folder() . '/classes/class-form-styles.php' );
64
  require_once( happyforms_get_include_folder() . '/classes/class-message-notices.php' );
 
65
  require_once( happyforms_get_include_folder() . '/classes/class-happyforms-widget.php' );
66
  require_once( happyforms_get_include_folder() . '/helpers/helper-form-templates.php' );
67
 
70
  add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 80 );
71
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
72
  add_action( 'current_screen', array( $this, 'admin_screens' ) );
 
 
73
  add_filter( 'media_buttons_context', array( $this, 'insert_editor_buttons' ) );
74
 
75
  // Widget
76
  add_action( 'widgets_init', array( $this, 'register_widget' ) );
77
 
78
+ // Preview scripts
79
+ add_action( 'wp_footer', array( $this, 'enqueue_scripts_preview' ) );
80
+
81
  // Common hooks
 
82
  add_shortcode( $this->shortcode, array( $this, 'handle_shortcode' ) );
83
+ add_action( 'wp', array( $this, 'wp' ) );
84
  add_action( 'wp_head', array( $this, 'wp_head' ) );
85
  add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ) );
86
  }
203
  '',
204
  true
205
  );
 
 
 
 
 
 
 
 
206
  }
207
 
208
  /**
292
  );
293
  }
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  /**
296
  * Filter: register the form dropdown button
297
  * for he post content editor toolbar.
329
  }
330
 
331
  /**
332
+ * Action: populate form list with forms found in current post.
 
333
  *
334
+ * @since 1.3
335
  *
336
+ * @hooked action wp
337
  *
338
  * @return void
339
  */
340
+ public function wp() {
341
  global $post;
342
 
343
  if ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, $this->shortcode ) ) {
360
  $form_id = $attrs['id'];
361
  $form = $form_controller->get( $form_id );
362
 
363
+ if ( ! $form ) {
364
+ continue;
365
+ }
366
+
367
+ $this->current_forms[] = $form;
 
 
 
 
 
368
  }
369
  }
370
  }
371
+
372
+ if ( happyforms_is_preview() ) {
373
+ $form_controller = happyforms_get_form_controller();
374
+ $form = $form_controller->get( get_the_ID() );
375
+ $this->current_forms[] = $form;
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Action: output scripts and styles for the forms
381
+ * embedded into the current post.
382
+ *
383
+ * @since 1.0
384
+ *
385
+ * @hooked action wp_head
386
+ *
387
+ * @return void
388
+ */
389
+ public function wp_head() {
390
+ /**
391
+ * Enqueue form-specific scripts.
392
+ *
393
+ * @since 1.1
394
+ *
395
+ * @param array $forms Array of forms found in page.
396
+ *
397
+ * @return void
398
+ */
399
+ do_action( 'happyforms_head', $this->current_forms );
400
+
401
+ ?>
402
+ <!-- HappyForms global container -->
403
+ <script type="text/javascript">HappyForms = {};</script>
404
+ <!-- End of HappyForms global container -->
405
+ <?php
406
  }
407
 
408
  /**
424
  return $context;
425
  }
426
 
427
+ $button_html = '<a href="#" class="button happyforms-editor-button"><span class="dashicons dashicons-format-status"></span><span>'. __( 'Add HappyForms', 'happyforms' ) .'</span></a>';
428
+
429
+ add_action( 'admin_footer', array( $this, 'output_happyforms_modal' ) );
430
 
431
  return $context . ' ' . $button_html;
432
  }
433
 
434
+ /**
435
+ * Render HappyForms dialog in the footer of edit post / page screen. Also
436
+ * prints a script block for adding shortcode to visual editor.
437
+ *
438
+ * @since 1.3.0.
439
+ *
440
+ * @hooked action admin_footer
441
+ *
442
+ * @return void
443
+ */
444
+ public function output_happyforms_modal() {
445
+ wp_enqueue_script( 'jquery-ui-dialog' );
446
+ wp_enqueue_style( 'wp-jquery-ui-dialog' );
447
+
448
+ require_once( happyforms_get_include_folder() . '/templates/admin-form-modal.php' );
449
+ }
450
+
451
  /**
452
  * Action: enqueue scripts and styles
453
  * for the frontend part of the plugin.
459
  * @return void
460
  */
461
  public function wp_enqueue_scripts() {
462
+ $dependencies = array( 'jquery' );
463
+ $dependencies = apply_filters(
464
+ 'happyforms_frontend_dependencies',
465
+ $dependencies, $this->current_forms
466
+ );
467
+
468
  wp_enqueue_script(
469
  'happyforms-frontend',
470
  happyforms_get_plugin_url() . 'assets/js/frontend.js',
471
+ $dependencies, false, true
 
 
472
  );
473
 
474
  wp_enqueue_style(
475
+ 'happyforms-frontend',
476
  happyforms_get_plugin_url() . 'assets/css/frontend.css'
477
  );
478
+
479
+ if ( happyforms_is_preview() ) {
480
+ wp_enqueue_style(
481
+ 'happyforms-preview',
482
+ happyforms_get_plugin_url() . 'assets/css/preview.css'
483
+ );
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Action: enqueue HappyForms styles and scripts
489
+ * for the Customizer preview part.
490
+ *
491
+ * @since 1.3
492
+ *
493
+ * @hooked action customize_preview_init
494
+ *
495
+ * @return void
496
+ */
497
+ public function enqueue_scripts_preview() {
498
+ if ( ! happyforms_is_preview() ) {
499
+ return;
500
+ }
501
+
502
+ $preview_deps = apply_filters(
503
+ 'happyforms_preview_dependencies',
504
+ array( 'customize-preview' )
505
+ );
506
+
507
+ wp_enqueue_script(
508
+ 'happyforms-preview',
509
+ happyforms_get_plugin_url() . 'assets/js/preview.js',
510
+ $preview_deps, false, true
511
+ );
512
+
513
+ require_once( happyforms_get_include_folder() . '/templates/preview-form-pencil.php' );
514
  }
515
 
516
  /**
inc/classes/class-message-controller.php CHANGED
@@ -68,14 +68,8 @@ class HappyForms_Message_Controller {
68
  */
69
  public $unread_transient = 'happyforms_unread_messages';
70
 
71
- /**
72
- * The honeypot part type.
73
- *
74
- * @since 1.1
75
- *
76
- * @var string
77
- */
78
- public $honeypot_part_type = 'single_line_text';
79
 
80
  /**
81
  * The singleton constructor.
@@ -192,18 +186,28 @@ class HappyForms_Message_Controller {
192
  }
193
 
194
  $nonce = $_REQUEST[$this->nonce_name];
195
- $prefix = happyforms_get_message_controller()->nonce_prefix;
196
  $form_id = intval( $_REQUEST[$this->submit_parameter] );
197
- $action = "{$prefix}{$form_id}";
198
 
199
- if ( ! wp_verify_nonce( $nonce, $action ) ) {
200
  wp_die( $bad_request_error );
201
  }
202
 
203
  $form = happyforms_get_form_controller()->get( $form_id );
204
 
205
  if ( happyforms_get_form_controller()->has_spam_protection( $form ) ) {
206
- if ( ! $this->validate_honeypot( $form_id ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
207
  $redirect_url = home_url( wp_get_raw_referer() );
208
 
209
  // Redirect silently, like everything's good.
@@ -283,26 +287,61 @@ class HappyForms_Message_Controller {
283
  * @return boolean
284
  */
285
  private function verify_nonce( $nonce, $form_id ) {
286
- $nonce_value = substr( $nonce, 0, -2 );
287
-
288
- return wp_verify_nonce( $nonce_value, $this->nonce_prefix . $form_id );
289
  }
290
 
291
  /**
292
  * Verify honeypot data.
293
  *
294
- * @since 1.0
 
 
295
  *
296
  * @return boolean
297
  */
298
- private function validate_honeypot( $form_id ) {
299
- $part_id = md5( $form_id );
300
- $honeypot_name = "happyforms-{$form_id}_single_line_text_{$part_id}";
301
- $validated = isset( $_REQUEST[$honeypot_name] ) && empty( $_REQUEST[$honeypot_name] );
302
 
303
  return $validated;
304
  }
305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
  /**
307
  * Create a new message post object.
308
  *
@@ -324,17 +363,19 @@ class HappyForms_Message_Controller {
324
  $part = happyforms_get_part_library()->get_part( $part_data['type'] );
325
 
326
  if ( false !== $part ) {
327
- $part_value = $part->sanitize_value( $part_data );
328
  $part_value = $part->validate_value( $part_data, $part_value );
 
 
329
 
330
  if ( ! is_wp_error( $part_value ) ) {
331
- $message_meta[$part_data['id']] = $part_value;
332
  } else {
333
  $error = null === $error ? new WP_Error(): $error;
334
- $messages = $part_value->get_error_messages();
335
 
336
  foreach ( $messages as $message ) {
337
- $error->add( $part_data['id'], $message );
338
  }
339
  }
340
  }
68
  */
69
  public $unread_transient = 'happyforms_unread_messages';
70
 
71
+ public $captcha_verify_url = 'https://www.google.com/recaptcha/api/siteverify';
72
+ public $captcha_field = 'g-recaptcha-response';
 
 
 
 
 
 
73
 
74
  /**
75
  * The singleton constructor.
186
  }
187
 
188
  $nonce = $_REQUEST[$this->nonce_name];
 
189
  $form_id = intval( $_REQUEST[$this->submit_parameter] );
 
190
 
191
+ if ( ! $this->verify_nonce( $nonce, $form_id ) ) {
192
  wp_die( $bad_request_error );
193
  }
194
 
195
  $form = happyforms_get_form_controller()->get( $form_id );
196
 
197
  if ( happyforms_get_form_controller()->has_spam_protection( $form ) ) {
198
+ if ( ! $this->validate_honeypot( $form ) ) {
199
+ $redirect_url = home_url( wp_get_raw_referer() );
200
+
201
+ // Redirect silently, like everything's good.
202
+ wp_safe_redirect( $redirect_url );
203
+ exit;
204
+ }
205
+ }
206
+
207
+ if ( happyforms_get_form_controller()->has_recaptcha_protection( $form ) ) {
208
+ $captcha_value = $this->validate_captcha( $form );
209
+
210
+ if ( is_wp_error( $captcha_value ) ) {
211
  $redirect_url = home_url( wp_get_raw_referer() );
212
 
213
  // Redirect silently, like everything's good.
287
  * @return boolean
288
  */
289
  private function verify_nonce( $nonce, $form_id ) {
290
+ return wp_verify_nonce( $nonce, $this->nonce_prefix . $form_id );
 
 
291
  }
292
 
293
  /**
294
  * Verify honeypot data.
295
  *
296
+ * @since 1.3
297
+ *
298
+ * @param array $form Current form data.
299
  *
300
  * @return boolean
301
  */
302
+ private function validate_honeypot( $form ) {
303
+ $honeypot_name = $form['ID'] . 'single_line_text_-1';
304
+ $validated = ! isset( $_REQUEST[$honeypot_name] );
 
305
 
306
  return $validated;
307
  }
308
 
309
+ private function validate_captcha( $form ) {
310
+ $secret_key = $form['captcha_secret_key'];
311
+ $captcha_value = isset ( $_REQUEST[$this->captcha_field] ) ? $_REQUEST[$this->captcha_field] : '';
312
+ $captcha_value = sanitize_text_field( $captcha_value );
313
+ $request_body = array(
314
+ 'secret' => $secret_key,
315
+ 'response' => $captcha_value,
316
+ 'ip' => $_SERVER['REMOTE_ADDR'],
317
+ );
318
+
319
+ $request = wp_remote_post( $this->captcha_verify_url, array( 'body' => $request_body ) );
320
+ $response = wp_remote_retrieve_body( $request );
321
+
322
+ if ( empty( $response ) ) {
323
+ return new WP_Error( 'captcha', 'captcha_invalid_configuration' );
324
+ }
325
+
326
+ $response = json_decode( $response, true );
327
+
328
+ if ( ! $response['success'] ) {
329
+ $configuration_errors = array_intersect( array(
330
+ 'missing-input-secret', 'invalid-input-secret', 'bad-request'
331
+ ), $response['error-codes'] );
332
+ $value_errors = array_intersect( array(
333
+ 'missing-input-response', 'invalid-input-response'
334
+ ), $response['error-codes'] );
335
+ if ( count( $configuration_errors ) > 0 ) {
336
+ return new WP_Error( 'captcha', 'captcha_invalid_configuration' );
337
+ } else if ( count( $value_errors ) > 0 ) {
338
+ return new WP_Error( 'captcha', 'captcha_not_verified' );
339
+ }
340
+ }
341
+
342
+ return $captcha_value;
343
+ }
344
+
345
  /**
346
  * Create a new message post object.
347
  *
363
  $part = happyforms_get_part_library()->get_part( $part_data['type'] );
364
 
365
  if ( false !== $part ) {
366
+ $part_value = $part->sanitize_value( $part_data, $form );
367
  $part_value = $part->validate_value( $part_data, $part_value );
368
+ $part_id = $part_data['id'];
369
+ $part_name = happyforms_get_part_name( $part_data, $form );
370
 
371
  if ( ! is_wp_error( $part_value ) ) {
372
+ $message_meta[$part_id] = $part_value;
373
  } else {
374
  $error = null === $error ? new WP_Error(): $error;
375
+ $messages = $part_value->get_error_codes();
376
 
377
  foreach ( $messages as $message ) {
378
+ $error->add( $part_name, $message );
379
  }
380
  }
381
  }
inc/classes/class-message-notices.php CHANGED
@@ -140,7 +140,9 @@ class HappyForms_Message_Notices {
140
  $is_part_notice = false;
141
 
142
  foreach( $form_data['parts'] as $part_data ) {
143
- if ( $location === $part_data['id'] ) {
 
 
144
  $part = $part_library->get_part( $part_data['type'] );
145
  $message_definitions = $part->get_message_definitions();
146
  $message_definition = $message_definitions[$message_key];
140
  $is_part_notice = false;
141
 
142
  foreach( $form_data['parts'] as $part_data ) {
143
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
144
+
145
+ if ( $location === $part_name ) {
146
  $part = $part_library->get_part( $part_data['type'] );
147
  $message_definitions = $part->get_message_definitions();
148
  $message_definition = $message_definitions[$message_key];
inc/classes/class-wp-customize-form-manager.php CHANGED
@@ -26,7 +26,9 @@ class HappyForms_WP_Customize_Form_Manager {
26
 
27
  // Ajax callbacks.
28
  add_action( 'wp_ajax_happyforms-update-form', array( $this, 'ajax_update_form' ) );
29
- add_action( 'wp_ajax_happyforms-form-part-added', array( $this, 'ajax_form_part_added_changeset' ) );
 
 
30
  }
31
 
32
  /**
@@ -38,7 +40,7 @@ class HappyForms_WP_Customize_Form_Manager {
38
  */
39
  private function get_current_form() {
40
  $form_id = $_REQUEST['form_id'];
41
- $form = happyforms_get_form_controller()->get_customize_defaults( true );
42
 
43
  if ( intval( $form_id ) > 0 ) {
44
  $form = happyforms_get_form_controller()->get( $form_id );
@@ -79,8 +81,8 @@ class HappyForms_WP_Customize_Form_Manager {
79
  add_filter( 'customize_refresh_nonces', array( $this, 'add_customize_nonce' ) );
80
  // Output header styles
81
  add_filter( 'customize_controls_print_scripts', array( $this, 'customize_controls_print_styles' ) );
82
- // Enqueue dynamic controls
83
- add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_controls_enqueue_scripts' ) );
84
  // Print templates
85
  add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_controls_print_footer_scripts' ) );
86
  }
@@ -154,18 +156,44 @@ class HappyForms_WP_Customize_Form_Manager {
154
 
155
  $admin_notices = happyforms_get_admin_notices();
156
 
157
- $notice_content = sprintf(
158
- __( 'Form saved. You can add this form to any Page, Post and Widget area. Have questions? <a href="%s" target="_blank">Ask for help in our support forums</a>.', 'happyforms' ),
159
- 'https://wordpress.org/support/plugin/happyforms'
160
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
 
162
  $admin_notices->register(
163
- 'happyforms_form_saved',
164
  $notice_content,
165
  array(
166
- 'type' => 'success',
 
167
  'screen' => array( 'edit-happyform' ),
168
- 'one-time' => true,
169
  )
170
  );
171
 
@@ -183,7 +211,7 @@ class HappyForms_WP_Customize_Form_Manager {
183
  *
184
  * @return void
185
  */
186
- public function ajax_form_part_added_changeset() {
187
  if ( ! check_ajax_referer( 'happyforms', 'happyforms-nonce', false ) ) {
188
  status_header( 400 );
189
  wp_send_json_error( 'bad_nonce' );
@@ -200,18 +228,28 @@ class HappyForms_WP_Customize_Form_Manager {
200
  wp_send_json_error( 'Missing data' );
201
  }
202
 
203
- $form_id = $_POST['form_id'];
204
  $part_data = $_POST['part'];
205
- $partials = array();
206
 
207
- $template = $this->library->get_part_template( $part_data, false );
208
- $partial = array(
209
- 'form_id' => $form_id,
210
- 'part_id' => $part_data['id'],
211
- 'template' => $template,
212
- );
 
 
 
 
 
 
 
 
 
 
213
 
214
- wp_send_json_success( $partial );
215
  }
216
 
217
  /**
@@ -237,6 +275,7 @@ class HappyForms_WP_Customize_Form_Manager {
237
 
238
  /**
239
  * Action: enqueue HappyForms styles and scripts
 
240
  *
241
  * @since 1.0
242
  *
@@ -244,7 +283,7 @@ class HappyForms_WP_Customize_Form_Manager {
244
  *
245
  * @return void
246
  */
247
- public function customize_controls_enqueue_scripts() {
248
  wp_enqueue_style(
249
  'happyforms-customize',
250
  happyforms_get_plugin_url() . 'assets/css/customize.css',
@@ -259,9 +298,8 @@ class HappyForms_WP_Customize_Form_Manager {
259
  happyforms_get_plugin_url() . 'assets/css/font-awesome.min.css'
260
  );
261
 
262
- wp_register_script(
263
- 'happyforms-customize',
264
- happyforms_get_plugin_url() . 'assets/js/customize.js',
265
  array(
266
  'backbone',
267
  'underscore',
@@ -272,23 +310,15 @@ class HappyForms_WP_Customize_Form_Manager {
272
  'jquery-ui-slider',
273
  'jquery-ui-button',
274
  'wp-color-picker',
275
- 'wp-pointer'
276
- ),
277
- false,
278
- true
279
- );
280
-
281
- $preview_deps = apply_filters(
282
- 'happyforms_preview_dependencies',
283
- array( 'backbone', 'underscore', 'jquery' )
284
  );
285
 
286
  wp_register_script(
287
- 'happyforms-preview',
288
- happyforms_get_plugin_url() . 'assets/js/preview.js',
289
- $preview_deps,
290
- false,
291
- true
292
  );
293
 
294
  $data = array(
@@ -299,7 +329,6 @@ class HappyForms_WP_Customize_Form_Manager {
299
 
300
  wp_localize_script( 'happyforms-customize', '_happyFormsSettings', $data );
301
  wp_enqueue_script( 'happyforms-customize' );
302
- wp_enqueue_script( 'happyforms-preview' );
303
 
304
  // Rich text editor
305
  if ( ! class_exists( '_WP_Editors', false ) ) {
@@ -329,7 +358,6 @@ class HappyForms_WP_Customize_Form_Manager {
329
  require_once( happyforms_get_include_folder() . '/templates/customize-form-build.php' );
330
  require_once( happyforms_get_include_folder() . '/templates/customize-form-parts-drawer.php' );
331
  require_once( happyforms_get_include_folder() . '/templates/customize-form-style.php' );
332
- require_once( happyforms_get_include_folder() . '/templates/preview-form-part.php' );
333
 
334
  _WP_Editors::print_default_editor_scripts();
335
  }
26
 
27
  // Ajax callbacks.
28
  add_action( 'wp_ajax_happyforms-update-form', array( $this, 'ajax_update_form' ) );
29
+ add_action( 'wp_ajax_happyforms-form-part-add', array( $this, 'ajax_form_part_add' ) );
30
+
31
+ add_filter( 'happyforms_part_class', array( $this, 'happyforms_part_class' ) );
32
  }
33
 
34
  /**
40
  */
41
  private function get_current_form() {
42
  $form_id = $_REQUEST['form_id'];
43
+ $form = happyforms_get_form_controller()->get_defaults();
44
 
45
  if ( intval( $form_id ) > 0 ) {
46
  $form = happyforms_get_form_controller()->get( $form_id );
81
  add_filter( 'customize_refresh_nonces', array( $this, 'add_customize_nonce' ) );
82
  // Output header styles
83
  add_filter( 'customize_controls_print_scripts', array( $this, 'customize_controls_print_styles' ) );
84
+ // Enqueue dynamic controls for the Customizer
85
+ add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts_customizer' ) );
86
  // Print templates
87
  add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_controls_print_footer_scripts' ) );
88
  }
156
 
157
  $admin_notices = happyforms_get_admin_notices();
158
 
159
+ $dismissed_notices = $admin_notices->get_dismissed_notices( get_current_user_id() );
160
+ if ( ! in_array( 'happyforms_form_saved_guide', $dismissed_notices ) ) {
161
+ $notice_name = 'happyforms_form_saved_guide';
162
+ $notice_type = 'custom';
163
+ $notice_dismissible = true;
164
+ $notice_onetime = false;
165
+ $notice_content = '';
166
+ $notice_content .= '<h3>' . __( 'Form saved.', 'happyforms' ) . '</h3>';
167
+ $notice_content .= '<p>' . __( 'Now, there are couple of ways to embed it to your content. Here goes...', 'happyforms' ) . '</p>';
168
+ $notice_content .= '<h4>' . __( 'Add to your page / post content', 'happyforms' ) . '</h4>';
169
+ $notice_content .= '<ol><li>' . __( 'In your Edit Post / Edit Page screen, click the <b>Add HappyForms</b> button right above your toolbar. A modal window will appear.', 'happyforms' ) . '</li><li>' . __( 'Select a form in the dropdown, then click <b>Insert</b>.', 'happyforms' ) . '</li><li>' . __( 'That\'s it! You\'ll notice the shortcode was added to your content. Your form will show up there.', 'happyforms' ) . '</li></ol>';
170
+ $notice_content .= '<h4>' . __( 'Use the HappyForms widget', 'happyforms' ) . '</h4>';
171
+ $notice_content .= '<ol>';
172
+ $notice_content .= '<li>' . sprintf( __( 'Head over to <b>Appearance</b> &rarr; <b><a href="%s">Widgets</a></b> screen.', 'happyforms' ), get_site_url( NULL, 'wp-admin/widgets.php' ) ) . '</li>';
173
+ $notice_content .= '<li>' . __( 'Drag the HappyForms widget to your sidebar.', 'happyforms' ) .'</li>';
174
+ $notice_content .= '<li>' . __( 'Select a form in the Form dropdown.', 'happyforms' ) . '</li>';
175
+ $notice_content .= '<li>' . __( 'All done!', 'happyforms' ) . '</li>';
176
+ $notice_content .= '</ol>';
177
+ $notice_content .= '<p>' . sprintf( __( 'Looking for a full documentation? Head over to our <a href="%s" target="_blank">Help Guide</a>.', 'happyforms' ), 'https://happyforms.me/help-guide' ) . '</p>';
178
+ } else {
179
+ $notice_name = 'happyforms_form_saved';
180
+ $notice_type = 'success';
181
+ $notice_dismissible = false;
182
+ $notice_onetime = true;
183
+ $notice_content = sprintf(
184
+ __( 'Form saved. You can add this form to any Page, Post and Widget area. Have questions? <a href="%s" target="_blank">Ask for help in our support forums</a>.', 'happyforms' ),
185
+ 'https://wordpress.org/support/plugin/happyforms'
186
+ );
187
+ }
188
 
189
  $admin_notices->register(
190
+ $notice_name,
191
  $notice_content,
192
  array(
193
+ 'type' => $notice_type,
194
+ 'dismissible' => $notice_dismissible,
195
  'screen' => array( 'edit-happyform' ),
196
+ 'one-time' => $notice_onetime
197
  )
198
  );
199
 
211
  *
212
  * @return void
213
  */
214
+ public function ajax_form_part_add() {
215
  if ( ! check_ajax_referer( 'happyforms', 'happyforms-nonce', false ) ) {
216
  status_header( 400 );
217
  wp_send_json_error( 'bad_nonce' );
228
  wp_send_json_error( 'Missing data' );
229
  }
230
 
231
+ $form_data = happyforms_get_form_controller()->get( intval( $_POST['form_id'] ) );
232
  $part_data = $_POST['part'];
233
+ $template = happyforms_get_form_part( $part_data, $form_data );
234
 
235
+ header( 'Content-type: text/html' );
236
+ echo( $template );
237
+ exit();
238
+ }
239
+
240
+ /**
241
+ * Filter: append -editable class to part templates.
242
+ *
243
+ * @since 1.0
244
+ *
245
+ * @hooked filter happyforms_part_class
246
+ *
247
+ * @return void
248
+ */
249
+ public function happyforms_part_class( $classes ) {
250
+ $classes[] = 'happyforms-block-editable happyforms-block-editable--part';
251
 
252
+ return $classes;
253
  }
254
 
255
  /**
275
 
276
  /**
277
  * Action: enqueue HappyForms styles and scripts
278
+ * for the Customizer part.
279
  *
280
  * @since 1.0
281
  *
283
  *
284
  * @return void
285
  */
286
+ public function enqueue_scripts_customizer() {
287
  wp_enqueue_style(
288
  'happyforms-customize',
289
  happyforms_get_plugin_url() . 'assets/css/customize.css',
298
  happyforms_get_plugin_url() . 'assets/css/font-awesome.min.css'
299
  );
300
 
301
+ $customize_deps = apply_filters(
302
+ 'happyforms_customize_dependencies',
 
303
  array(
304
  'backbone',
305
  'underscore',
310
  'jquery-ui-slider',
311
  'jquery-ui-button',
312
  'wp-color-picker',
313
+ 'wp-pointer',
314
+ 'customize-controls',
315
+ )
 
 
 
 
 
 
316
  );
317
 
318
  wp_register_script(
319
+ 'happyforms-customize',
320
+ happyforms_get_plugin_url() . 'assets/js/customize.js',
321
+ $customize_deps, false, true
 
 
322
  );
323
 
324
  $data = array(
329
 
330
  wp_localize_script( 'happyforms-customize', '_happyFormsSettings', $data );
331
  wp_enqueue_script( 'happyforms-customize' );
 
332
 
333
  // Rich text editor
334
  if ( ! class_exists( '_WP_Editors', false ) ) {
358
  require_once( happyforms_get_include_folder() . '/templates/customize-form-build.php' );
359
  require_once( happyforms_get_include_folder() . '/templates/customize-form-parts-drawer.php' );
360
  require_once( happyforms_get_include_folder() . '/templates/customize-form-style.php' );
 
361
 
362
  _WP_Editors::print_default_editor_scripts();
363
  }
inc/classes/parts/class-part-address.php CHANGED
@@ -2,15 +2,20 @@
2
 
3
  class HappyForms_Part_Address extends HappyForms_Form_Part {
4
 
 
 
 
5
  public $type = 'address';
6
- public $template_id = 'happyforms-address-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Address', 'happyforms' );
10
  $this->description = __( 'For geographical locations. Includes Google Maps intergration.', 'happyforms' );
11
 
12
- add_filter( 'happyforms_preview_dependencies', array( $this, 'preview_dependencies' ) );
13
- add_action( 'happyforms_frontend_form_scripts', array( $this, 'frontend_enqueue_scripts' ) );
 
 
 
14
  }
15
 
16
  /**
@@ -79,74 +84,8 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
79
  *
80
  * @return string
81
  */
82
- public function customize_template() {
83
- ?>
84
- <p>
85
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
86
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
87
- </p>
88
- <p>
89
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
90
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
91
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
92
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
93
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
94
- </select>
95
- </p>
96
- <p class="label_placement-options" style="display: none">
97
- <label>
98
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
99
- </label>
100
- </p>
101
- <p>
102
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
103
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
104
- </p>
105
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
106
- <label>
107
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
108
- </label>
109
- </p>
110
- <p>
111
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
112
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
113
- </p>
114
- <p>
115
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
116
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
117
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
118
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
119
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
120
- </select>
121
- </p>
122
- <p>
123
- <label for="<%= instance.id %>_mode"><?php _e( 'Mode', 'happyforms' ); ?></label>
124
- <select id="<%= instance.id %>_mode" name="mode" data-bind="mode" class="widefat">
125
- <option value="simple"<%= (instance.mode == 'simple') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
126
- <option value="autocomplete"<%= (instance.mode == 'autocomplete') ? ' selected' : '' %>><?php _e( 'Full with autocomplete', 'happyforms' ); ?></option>
127
- <option value="country-city"<%= (instance.mode == 'country-city') ? ' selected' : '' %>><?php _e( 'Country and city', 'happyforms' ); ?></option>
128
- <option value="country"<%= (instance.mode == 'country') ? ' selected' : '' %>><?php _e( 'Country only', 'happyforms' ); ?></option>
129
- </select>
130
- </p>
131
- <div class="address-apikey">
132
- <p>
133
- <label for="<%= instance.id %>_apikey"><?php _e( 'Google API Key', 'happyforms' ); ?></label>
134
- <input type="text" id="<%= instance.id %>_apikey class="widefat title" value="<%= instance.apikey %>" data-bind="apikey" />
135
- </p>
136
- <p class="description">
137
- Autocomplete mode uses the Google Places API to populate results. <a href="https://developers.google.com/places/web-service/get-api-key" target="_blank"><?php _e( 'Get a key for Google Places API Web Service', 'happyforms' ); ?></a>
138
- </p>
139
- </div>
140
- <p>
141
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
142
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
143
- </p>
144
- <p>
145
- <label>
146
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
147
- </label>
148
- </p>
149
- <?php
150
  }
151
 
152
  /**
@@ -160,81 +99,10 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
160
  * @return string Markup for the form part.
161
  */
162
  public function frontend_template( $part_data = array(), $form_data = array() ) {
163
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
164
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
165
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
166
-
167
- $classes = array( 'happyforms-part--address' );
168
-
169
- if ( $part_data['width'] ) {
170
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] );
171
- }
172
-
173
- if ( $part_data['label_placement'] ) {
174
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] );
175
- }
176
-
177
- if ( ! empty( $part_data['css_class'] ) ) {
178
- $classes[] = $part_data['css_class'];
179
- }
180
 
181
- if ( $part_data['mode'] && 'country-city' === $part_data['mode'] ) {
182
- $classes[] = 'happyforms-part--address-country-city';
183
- }
184
-
185
- $classes = implode( ' ', $classes );
186
- ?>
187
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>" data-google-apikey="<?php echo esc_attr( $part_data['apikey'] ); ?>" data-mode="<?php echo esc_attr( $part_data['mode'] ); ?>">
188
- <div class="happyforms-part__wrap">
189
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
190
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
191
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
192
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
193
- <?php endif; ?>
194
- <?php happyforms_print_part_description( $part_data ); ?>
195
- </label>
196
- <?php if ( 'simple' === $part_data['mode'] ) : ?>
197
- <div class="happyforms-part__el-wrap">
198
- <div class="happyforms-part__el">
199
- <input name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" class="happyforms-part__el--text-input happyforms-part__el--address" type="text" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> />
200
- </div>
201
- </div>
202
- <?php elseif ( 'autocomplete' === $part_data['mode'] ) : ?>
203
- <div class="happyforms-part__el-wrap">
204
- <div class="happyforms-part__el">
205
- <input class="happyforms-part__el--text-input happyforms-part__el--address-autocomplete" type="text" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
206
- <div class="happyforms-part__el--address--results happyforms-part__el--address--results-autocomplete"></div>
207
- </div>
208
- </div>
209
- <?php elseif ( 'country' === $part_data['mode'] ) : ?>
210
- <div class="happyforms-part__el-wrap">
211
- <div class="happyforms-part__el">
212
- <input class="happyforms-part__el--text-input happyforms-part__el--address-country" type="text" placeholder="<?php _e( 'Country', 'happyforms' ); ?>" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
213
- <div class="happyforms-part__el--address--results happyforms-part__el--address--results-country"></div>
214
- </div>
215
- </div>
216
- <?php else: ?>
217
- <div class="happyforms-part__el-wrap">
218
- <div class="happyforms-part__el">
219
- <input class="happyforms-part__el--text-input happyforms-part__el--address-country" type="text" placeholder="<?php _e( 'Country', 'happyforms' ); ?>" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
220
- <div class="happyforms-part__el--address--results happyforms-part__el--address--results-country"></div>
221
- </div>
222
- <div class="happyforms-part__el">
223
- <input class="happyforms-part__el happyforms-part__el--text-input happyforms-part__el--address-city" type="text" placeholder="<?php _e( 'City', 'happyforms' ); ?>" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> />
224
- </div>
225
- </div>
226
- <?php endif; ?>
227
- <?php if ( 'simple' !== $part_data['mode'] ) : ?>
228
- <input type="hidden" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" id="<?php echo esc_attr( $html_id ); ?>">
229
- <?php endif; ?>
230
- <?php
231
- if ( $form_data ) :
232
- happyforms_message_notices( $form_data, $part_data['id'] );
233
- endif;
234
- ?>
235
- </div>
236
- </div>
237
- <?php
238
  }
239
 
240
  /**
@@ -253,6 +121,14 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
253
  );
254
  }
255
 
 
 
 
 
 
 
 
 
256
  /**
257
  * Sanitize submitted value before storing it.
258
  *
@@ -262,12 +138,26 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
262
  *
263
  * @return string
264
  */
265
- public function sanitize_value( $part_data = array() ) {
266
  $sanitized_value = $this->get_default_value();
267
- $part_id = $part_data['id'];
268
-
269
- if ( isset( $_REQUEST[$part_id] ) ) {
270
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  }
272
 
273
  return $sanitized_value;
@@ -284,16 +174,82 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
284
  * @return string|object
285
  */
286
  public function validate_value( $part_data, $value ) {
287
- $part_id = $part_data['id'];
288
  $validated_value = $value;
289
 
290
- if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
291
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  }
293
 
294
  return $validated_value;
295
  }
296
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  /**
298
  * Enqueue scripts in customizer area.
299
  *
@@ -307,80 +263,57 @@ class HappyForms_Part_Address extends HappyForms_Form_Part {
307
  wp_enqueue_script(
308
  'part-address',
309
  happyforms_get_plugin_url() . 'assets/js/parts/part-address.js',
310
- $deps,
311
- false,
312
- true
313
  );
314
  }
315
 
316
- /**
317
- * Filter: dependencies for the preview screen.
318
- *
319
- * @since 1.0.0.
320
- *
321
- * @hooked filter happyforms_preview_dependencies
322
- *
323
- * @param array List of dependencies.
324
- *
325
- * @return array
326
- */
327
- public function preview_dependencies( $deps = array() ) {
328
- wp_register_script(
329
- 'happyforms-part-address',
330
- happyforms_get_plugin_url() . 'assets/js/frontend/address.js',
331
- array( 'jquery', 'jquery-ui-autocomplete' ),
332
- false,
333
- true
334
- );
335
-
336
- wp_localize_script(
337
- 'happyforms-part-address',
338
- '_happyFormsCountries',
339
- happyforms_get_countries()
340
- );
341
-
342
- array_push( $deps, 'happyforms-part-address' );
343
-
344
- return $deps;
345
- }
346
-
347
  /**
348
  * Action: enqueue additional scripts on the frontend.
349
  *
350
- * @since 1.0.0.
351
  *
352
- * @hooked action happyforms_frontend_form_scripts
353
  *
354
  * @param array List of dependencies.
355
  *
356
  * @return array
357
  */
358
- public function frontend_enqueue_scripts( $form = array() ) {
 
359
  $form_controller = happyforms_get_form_controller();
360
 
361
- if ( empty( $form ) ) {
362
- return;
 
 
 
363
  }
364
 
365
- if ( empty( $form_controller->get_first_part_by_type( $form, $this->type ) ) ) {
366
- return;
367
  }
368
 
369
  wp_register_script(
370
  'happyforms-part-address',
371
  happyforms_get_plugin_url() . 'assets/js/frontend/address.js',
372
- array( 'jquery', 'jquery-ui-autocomplete' ),
373
- false,
374
- true
 
 
 
 
375
  );
376
 
377
  wp_localize_script(
378
  'happyforms-part-address',
379
- '_happyFormsCountries',
380
- happyforms_get_countries()
381
  );
382
 
383
- wp_enqueue_script( 'happyforms-part-address' );
 
 
384
  }
385
 
386
  }
2
 
3
  class HappyForms_Part_Address extends HappyForms_Form_Part {
4
 
5
+ private $ajax_action = 'happyforms_address_autocomplete';
6
+ private $api_url = 'https://maps.googleapis.com/maps/api/place/autocomplete/json';
7
+
8
  public $type = 'address';
 
9
 
10
  public function __construct() {
11
  $this->label = __( 'Address', 'happyforms' );
12
  $this->description = __( 'For geographical locations. Includes Google Maps intergration.', 'happyforms' );
13
 
14
+ add_filter( 'happyforms_part_class', array( $this, 'html_part_class' ), 10, 3 );
15
+ add_filter( 'happyforms_part_data_attributes', array( $this, 'html_part_data_attributes' ), 10, 3 );
16
+ add_filter( 'happyforms_frontend_dependencies', array( $this, 'script_dependencies' ), 10, 2 );
17
+ add_action( 'wp_ajax_' . $this->ajax_action, array( $this, 'ajax_autocomplete' ) );
18
+ add_action( 'wp_ajax_nopriv_' . $this->ajax_action, array( $this, 'ajax_autocomplete' ) );
19
  }
20
 
21
  /**
84
  *
85
  * @return string
86
  */
87
+ public function customize_templates() {
88
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-address.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  }
90
 
91
  /**
99
  * @return string Markup for the form part.
100
  */
101
  public function frontend_template( $part_data = array(), $form_data = array() ) {
102
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
103
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-address.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  }
107
 
108
  /**
121
  );
122
  }
123
 
124
+ public function get_default_value() {
125
+ return array(
126
+ 'full' => '',
127
+ 'country' => '',
128
+ 'city' => '',
129
+ );
130
+ }
131
+
132
  /**
133
  * Sanitize submitted value before storing it.
134
  *
138
  *
139
  * @return string
140
  */
141
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
142
  $sanitized_value = $this->get_default_value();
143
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
144
+
145
+ if ( isset( $_REQUEST[$part_name] ) ) {
146
+ $sanitized_value = wp_parse_args( $_REQUEST[$part_name], $sanitized_value );
147
+
148
+ switch ( $part_data['mode'] ) {
149
+ case 'simple':
150
+ case 'autocomplete':
151
+ $sanitized_value['full'] = sanitize_text_field( $sanitized_value['full'] );
152
+ break;
153
+ case 'country':
154
+ $sanitized_value['country'] = sanitize_text_field( $sanitized_value['country'] );
155
+ break;
156
+ case 'country-city':
157
+ $sanitized_value['country'] = sanitize_text_field( $sanitized_value['country'] );
158
+ $sanitized_value['city'] = sanitize_text_field( $sanitized_value['city'] );
159
+ break;
160
+ }
161
  }
162
 
163
  return $sanitized_value;
174
  * @return string|object
175
  */
176
  public function validate_value( $part_data, $value ) {
 
177
  $validated_value = $value;
178
 
179
+ if ( 1 === $part_data['required'] ) {
180
+ $is_empty = false;
181
+
182
+ switch ( $part_data['mode'] ) {
183
+ case 'simple':
184
+ case 'autocomplete':
185
+ $is_empty = empty( $validated_value['full'] );
186
+ break;
187
+ case 'country':
188
+ $is_empty = empty( $validated_value['country'] );
189
+ break;
190
+ case 'country-city':
191
+ $is_empty = empty( $validated_value['country'] ) || empty( $validated_value['city'] );
192
+ break;
193
+ }
194
+
195
+ if ( $is_empty ) {
196
+ $validated_value = new WP_Error( 'missing_required_field' );
197
+ return $validated_value;
198
+ }
199
  }
200
 
201
  return $validated_value;
202
  }
203
 
204
+ public function ajax_autocomplete() {
205
+ $results = array();
206
+
207
+ if ( isset( $_GET['term'] ) && isset( $_GET['key'] ) ) {
208
+ $url = $this->api_url;
209
+ $key = sanitize_text_field( $_GET['key'] );
210
+ $term = sanitize_text_field( $_GET['term'] );
211
+ $args = array(
212
+ 'key' => $key,
213
+ 'types' => 'address',
214
+ 'input' => $term,
215
+ );
216
+ $query = http_build_query( $args );
217
+ $response = wp_remote_get( "{$url}?{$query}" );
218
+ $response = wp_remote_retrieve_body( $response );
219
+ $response = json_decode( $response, true );
220
+
221
+ if ( isset( $response['status'] ) && 'OK' === $response['status'] ) {
222
+ $results = wp_list_pluck( $response['predictions'], 'description' );
223
+ }
224
+ }
225
+
226
+ wp_send_json( $results );
227
+ }
228
+
229
+ public function html_part_class( $class, $part_data, $form_data ) {
230
+ if ( isset( $part_data['mode'] ) && 'country-city' === $part_data['mode'] ) {
231
+ $class[] = 'happyforms-part--address-country-city';
232
+ }
233
+
234
+ return $class;
235
+ }
236
+
237
+ public function html_part_data_attributes( $attributes, $part, $form ) {
238
+ if ( $this->type !== $part['type'] ) {
239
+ return $attributes;
240
+ }
241
+
242
+ if ( isset( $part['mode'] ) ) {
243
+ $attributes['mode'] = $part['mode'];
244
+ }
245
+
246
+ if ( isset( $part['apikey'] ) ) {
247
+ $attributes['google-apikey'] = $part['apikey'];
248
+ }
249
+
250
+ return $attributes;
251
+ }
252
+
253
  /**
254
  * Enqueue scripts in customizer area.
255
  *
263
  wp_enqueue_script(
264
  'part-address',
265
  happyforms_get_plugin_url() . 'assets/js/parts/part-address.js',
266
+ $deps, false, true
 
 
267
  );
268
  }
269
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  /**
271
  * Action: enqueue additional scripts on the frontend.
272
  *
273
+ * @since 1.3.0.
274
  *
275
+ * @hooked action happyforms_frontend_dependencies
276
  *
277
  * @param array List of dependencies.
278
  *
279
  * @return array
280
  */
281
+ public function script_dependencies( $deps, $forms ) {
282
+ $contains_address = false;
283
  $form_controller = happyforms_get_form_controller();
284
 
285
+ foreach ( $forms as $form ) {
286
+ if ( $form_controller->get_first_part_by_type( $form, $this->type ) ) {
287
+ $contains_address = true;
288
+ break;
289
+ }
290
  }
291
 
292
+ if ( ! happyforms_is_preview() && ! $contains_address ) {
293
+ return $deps;
294
  }
295
 
296
  wp_register_script(
297
  'happyforms-part-address',
298
  happyforms_get_plugin_url() . 'assets/js/frontend/address.js',
299
+ array( 'jquery-ui-autocomplete' ), false, true
300
+ );
301
+
302
+ $settings = array(
303
+ 'url' => admin_url( 'admin-ajax.php' ),
304
+ 'action' => $this->ajax_action,
305
+ 'countries' => happyforms_get_countries()
306
  );
307
 
308
  wp_localize_script(
309
  'happyforms-part-address',
310
+ '_happyFormsAddressSettings',
311
+ $settings
312
  );
313
 
314
+ $deps[] = 'happyforms-part-address';
315
+
316
+ return $deps;
317
  }
318
 
319
  }
inc/classes/parts/class-part-checkbox.php CHANGED
@@ -3,13 +3,12 @@
3
  class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
4
 
5
  public $type = 'checkbox';
6
- public $template_id = 'happyforms-checkbox-template';
7
- public $item_customize_template_id = 'happyforms-checkbox-option-customize-template';
8
- public $item_frontend_template_id = 'happyforms-checkbox-option-frontend-template';
9
 
10
  public function __construct() {
11
  $this->label = __( 'Multiple Choice', 'happyforms' );
12
  $this->description = __( 'For checkboxes allowing multiple selections.', 'happyforms' );
 
 
13
  }
14
 
15
  /**
@@ -64,14 +63,7 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
64
  );
65
  }
66
 
67
- /**
68
- * Get part option (sub-part) defaults.
69
- *
70
- * @since 1.0.0.
71
- *
72
- * @return array
73
- */
74
- public function get_option_defaults() {
75
  return array(
76
  'is_default' => 0,
77
  'label' => ''
@@ -85,97 +77,8 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
85
  *
86
  * @return string
87
  */
88
- public function customize_template() {
89
- ?>
90
- <p>
91
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
92
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
93
- </p>
94
- <p>
95
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
96
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
97
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
98
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
99
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
100
- </select>
101
- </p>
102
- <p class="label_placement-options" style="display: none">
103
- <label>
104
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
105
- </label>
106
- </p>
107
- <p>
108
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
109
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
110
- </p>
111
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
112
- <label>
113
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
114
- </label>
115
- </p>
116
- <p>
117
- <label for="<%= instance.id %>_display_type"><?php _e( 'Display options', 'happyforms' ); ?></label>
118
- <select id="<%= instance.id %>_display_type" name="display_type" data-bind="display_type" class="widefat">
119
- <option value="inline"<%= (instance.display_type == 'inline') ? ' selected' : '' %>><?php _e( 'Horizontal', 'happyforms' ); ?></option>
120
- <option value="block"<%= (instance.display_type == 'block') ? ' selected' : '' %>><?php _e( 'Vertical', 'happyforms' ); ?></option>
121
- </select>
122
- </p>
123
- <p>
124
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
125
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
126
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
127
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
128
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
129
- </select>
130
- </p>
131
- <p class="width-options" style="display: none">
132
- <label>
133
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
134
- </label>
135
- </p>
136
- <p>
137
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
138
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
139
- </p>
140
- <p>
141
- <label>
142
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
143
- </label>
144
- </p>
145
- <ul class="options">
146
- <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
147
- <% if ( !instance.options.length ) { %>
148
- <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
149
- <% } %>
150
- </ul>
151
- <p class="links">
152
- <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
153
- </p>
154
- <?php
155
- }
156
-
157
- /**
158
- * Get template for option / sub-part item in customize pane.
159
- *
160
- * @since 1.0.0.
161
- *
162
- * @return string
163
- */
164
- public function customize_item_template() {
165
- ?>
166
- <li class="happyforms-part-widget happyforms-part-widget--sub">
167
- <label>
168
- <?php _e( 'Label', 'happyforms' ); ?>
169
- <input type="text" class="widefat" name="" value="<%= label %>" data-option-attribute="label" data-preview-selector=".label">
170
- </label>
171
- <label>
172
- <input type="checkbox" name="" value="1" class="default-option-switch"<% if (is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Checked by default', 'happyforms' ); ?>
173
- </label>
174
- <div class="option-actions">
175
- <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
176
- </div>
177
- </li>
178
- <?php
179
  }
180
 
181
  /**
@@ -189,98 +92,14 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
189
  * @return string Markup for the form part.
190
  */
191
  public function frontend_template( $part_data = array(), $form_data = array() ) {
192
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
193
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
194
-
195
- $classes = array('happyforms-part--checkbox');
196
-
197
- if ( $part_data['width'] ) {
198
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
199
- }
200
 
201
- if ( $part_data['display_type'] == 'block') {
202
- $classes[] = 'display-type--block ';
203
  }
204
 
205
- if ( $part_data['label_placement'] ) {
206
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
207
- }
208
-
209
- if ( !empty( $part_data['css_class'] ) ) {
210
- $classes[] = $part_data['css_class'];
211
- }
212
-
213
- $classes = implode( ' ', $classes );
214
- ?>
215
- <div class="happyforms-part happyforms-part--checkbox happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
216
- <div class="happyforms-part__wrap">
217
- <label class="happyforms-part__label">
218
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
219
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
220
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
221
- <?php endif; ?>
222
- </label>
223
- <div class="happyforms-part__el">
224
- <?php
225
- if ( isset( $part_data['options'] ) ) {
226
- $options = $part_data['options'];
227
-
228
- foreach( $options as $option ) {
229
- $option = wp_parse_args( $option, $this->get_option_defaults() );
230
-
231
- $this->frontend_item_template( $part_data, $option, $part_data['required'], $form_data );
232
- }
233
- }
234
- ?>
235
- </div>
236
- <?php happyforms_print_part_description( $part_data ); ?>
237
- <?php
238
- if ( $form_data ) :
239
- happyforms_message_notices( $form_data, $part_data['id'] );
240
- endif;
241
- ?>
242
- </div>
243
- </div>
244
- <?php
245
- }
246
-
247
- /**
248
- * Get front end option (sub-part) template with parsed data.
249
- *
250
- * @since 1.0.0.
251
- *
252
- * @param array $part_data Form part data.
253
- * @param array $option Option (form sub-part) data.
254
- * @param int $requred Required field (1) or not.
255
- *
256
- * @return string Markup for the part option.
257
- */
258
- public function frontend_item_template( $part_data, $option, $required, $form_data = array() ) {
259
- ?>
260
- <label class="option-label" id="<?php echo esc_attr( $option['id'] ); ?>">
261
- <input type="checkbox" class="happyforms-visuallyhidden" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[]" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> checked<?php endif; ?><?php if ( 1 === intval( $required ) ) : ?> required aria-required="true"<?php endif; ?>>
262
- <span class="checkmark"></span>
263
-
264
- <span class="label"><?php echo esc_attr( $option['label'] ); ?></span>
265
- </label>
266
- <?php
267
- }
268
-
269
- /**
270
- * Get option's Backbone template for preview purposes. Passed to previewer to create a new Backbone view.
271
- *
272
- * @since 1.0.0.
273
- *
274
- * @return string Backbone template.
275
- */
276
- public function preview_option_template() {
277
- ?>
278
- <label class="option-label" id="<%= id %>">
279
- <input type="checkbox" name="" value="<%= label %>">
280
- <span class="checkmark"></span>
281
- <span class="label"><%= label %></span>
282
- </label>
283
- <?php
284
  }
285
 
286
  /**
@@ -335,19 +154,19 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
335
  *
336
  * @return array
337
  */
338
- public function sanitize_value( $part_data = array() ) {
339
  $sanitized_value = $this->get_default_value();
340
- $part_id = $part_data['id'];
341
 
342
- if ( isset( $_REQUEST[$part_id] ) ) {
343
- $requested_data = $_REQUEST[$part_id];
344
 
345
  if ( is_array( $requested_data ) ) {
346
  $sanitized_value = array_map( 'sanitize_text_field', $requested_data );
347
-
348
- return $sanitized_value;
349
  }
350
  }
 
 
351
  }
352
 
353
  /**
@@ -361,27 +180,30 @@ class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
361
  * @return string|object
362
  */
363
  public function validate_value( $part_data, $value ) {
364
- $part_id = $part_data['id'];
365
  $validated_value = $value;
366
 
367
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
368
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
369
  }
370
 
371
- // Check for possible options entered when creating a form. If there's no such option, return WP_Error
372
- $possible_options = array();
373
 
374
- foreach ( $part_data['options'] as $option ) {
375
- array_push( $possible_options, $option['label'] );
 
376
  }
377
 
378
- foreach ( $validated_value as $value ) {
379
- if ( !in_array( $value, $possible_options ) ) {
380
- $validated_value = new WP_Error( $part_id, 'not_valid_value' );
381
- }
 
 
382
  }
383
 
384
- return $validated_value;
385
  }
386
 
387
  }
3
  class HappyForms_Part_Checkbox extends HappyForms_Form_Part {
4
 
5
  public $type = 'checkbox';
 
 
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Multiple Choice', 'happyforms' );
9
  $this->description = __( 'For checkboxes allowing multiple selections.', 'happyforms' );
10
+
11
+ add_filter( 'happyforms_part_class', array( $this, 'html_part_class' ), 10, 3 );
12
  }
13
 
14
  /**
63
  );
64
  }
65
 
66
+ private function get_option_defaults() {
 
 
 
 
 
 
 
67
  return array(
68
  'is_default' => 0,
69
  'label' => ''
77
  *
78
  * @return string
79
  */
80
+ public function customize_templates() {
81
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-checkbox.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
 
84
  /**
92
  * @return string Markup for the form part.
93
  */
94
  public function frontend_template( $part_data = array(), $form_data = array() ) {
95
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
96
+ $form = $form_data;
 
 
 
 
 
 
97
 
98
+ foreach( $part['options'] as $o => $option ) {
99
+ $part['options'][$o] = wp_parse_args( $option, $this->get_option_defaults() );
100
  }
101
 
102
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-checkbox.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
104
 
105
  /**
154
  *
155
  * @return array
156
  */
157
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
158
  $sanitized_value = $this->get_default_value();
159
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
160
 
161
+ if ( isset( $_REQUEST[$part_name] ) ) {
162
+ $requested_data = $_REQUEST[$part_name];
163
 
164
  if ( is_array( $requested_data ) ) {
165
  $sanitized_value = array_map( 'sanitize_text_field', $requested_data );
 
 
166
  }
167
  }
168
+
169
+ return $sanitized_value;
170
  }
171
 
172
  /**
180
  * @return string|object
181
  */
182
  public function validate_value( $part_data, $value ) {
 
183
  $validated_value = $value;
184
 
185
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
186
+ $validated_value = new WP_Error( 'missing_required_field' );
187
+ return $validated_value;
188
  }
189
 
190
+ $options = wp_list_pluck( $part_data['options'], 'label' );
191
+ $intersection = array_intersect( $options, $validated_value );
192
 
193
+ if ( ! count( $intersection ) ) {
194
+ $validated_value = new WP_Error( 'not_valid_value' );
195
+ return $validated_value;
196
  }
197
 
198
+ return $validated_value;
199
+ }
200
+
201
+ public function html_part_class( $class, $part_data, $form_data ) {
202
+ if ( isset( $part_data['display_type'] ) && 'block' === $part_data['display_type'] ) {
203
+ $class[] = 'display-type--block';
204
  }
205
 
206
+ return $class;
207
  }
208
 
209
  }
inc/classes/parts/class-part-date.php CHANGED
@@ -3,11 +3,12 @@
3
  class HappyForms_Part_Date extends HappyForms_Form_Part {
4
 
5
  public $type = 'date';
6
- public $template_id = 'happyforms-date-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Date', 'happyforms' );
10
  $this->description = __( 'For formatted day, month, year and or time fields.', 'happyforms' );
 
 
11
  }
12
 
13
  /**
@@ -69,72 +70,8 @@ class HappyForms_Part_Date extends HappyForms_Form_Part {
69
  *
70
  * @return string
71
  */
72
- public function customize_template() {
73
- ?>
74
- <p>
75
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
76
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
77
- </p>
78
- <p>
79
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
80
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
81
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
82
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
83
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
84
- </select>
85
- </p>
86
- <p class="label_placement-options" style="display: none">
87
- <label>
88
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
89
- </label>
90
- </p>
91
- <p>
92
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
93
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
94
- </p>
95
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
96
- <label>
97
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
98
- </label>
99
- </p>
100
- <p>
101
- <label for="<%= instance.id %>_date_type"><?php _e( 'Show', 'happyforms' ); ?></label>
102
- <select id="<%= instance.id %>_date_type" name="date_type" data-bind="date_type" class="widefat">
103
- <option value="date"<%= (instance.date_type == 'date') ? ' selected' : '' %>><?php _e( 'Date', 'happyforms' ); ?></option>
104
- <option value="datetime"<%= (instance.date_type == 'datetime') ? ' selected' : '' %>><?php _e( 'Date &amp; Time', 'happyforms' ); ?></option>
105
- <option value="time"<%= (instance.date_type == 'time') ? ' selected' : '' %>><?php _e( 'Time', 'happyforms' ); ?></option>
106
- </select>
107
- </p>
108
- <p class="time-options"<%= (instance.date_type == 'date') ? ' style="display: none"' : '' %>>
109
- <label for="<%= instance.id %>_time_format"><?php _e( 'Time format', 'happyforms' ); ?></label>
110
- <select id="<%= instance.id %>_time_format" name="time_format" data-bind="time_format" class="widefat">
111
- <option value="12"<%= (instance.time_format == '12') ? ' selected' : '' %>><?php _e( '12h', 'happyforms' ); ?></option>
112
- <option value="24"<%= (instance.time_format == '24') ? ' selected' : '' %>><?php _e( '24h', 'happyforms' ); ?></option>
113
- </select>
114
- </p>
115
- <p>
116
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
117
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
118
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
119
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
120
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
121
- </select>
122
- </p>
123
- <p class="width-options" style="display: none">
124
- <label>
125
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
126
- </label>
127
- </p>
128
- <p>
129
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
130
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
131
- </p>
132
- <p>
133
- <label>
134
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
135
- </label>
136
- </p>
137
- <?php
138
  }
139
 
140
  /**
@@ -148,131 +85,10 @@ class HappyForms_Part_Date extends HappyForms_Form_Part {
148
  * @return string Markup for the form part.
149
  */
150
  public function frontend_template( $part_data = array(), $form_data = array() ) {
151
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
152
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
153
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
154
-
155
- $classes = array('happyforms-part--date', 'happyforms-part-date');
156
-
157
- if ( $part_data['width'] ) {
158
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
159
- }
160
-
161
- if ( $part_data['label_placement'] ) {
162
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
163
- }
164
-
165
- if ( !empty( $part_data['css_class'] ) ) {
166
- $classes[] = $part_data['css_class'];
167
- }
168
 
169
- $classes[] = 'happyforms-part-date--' . $part_data['date_type'];
170
-
171
- $classes = implode( ' ', $classes );
172
- ?>
173
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
174
- <div class="happyforms-part__wrap">
175
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
176
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
177
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
178
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
179
- <?php endif; ?>
180
- </label>
181
- <div class="happyforms-part__el">
182
- <?php if ( is_customize_preview() || $part_data['date_type'] === 'datetime' || $part_data['date_type'] === 'date' ) : ?>
183
- <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
184
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[month]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
185
- <option value=""><?php _e( 'Month', 'happyforms' ); ?></option>
186
- <?php for ( $i = 1; $i <= 12; $i++ ) : ?>
187
- <option value="<?php echo $i; ?>"><?php echo date( 'F', mktime( 0, 0, 0, $i) ); ?></option>
188
- <?php endfor; ?>
189
- </select>
190
- </div>
191
- <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
192
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[day]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
193
- <option value=""><?php _e( 'Day', 'happyforms' ); ?></option>
194
- <?php for ( $i = 1; $i <= 31; $i++ ) : ?>
195
- <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
196
- <?php endfor; ?>
197
- </select>
198
- </div>
199
- <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
200
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[year]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
201
- <option value=""><?php _e( 'Year', 'happyforms' ); ?></option>
202
- <?php
203
- $year_cutoff = 1910;
204
- $year_current = date('Y');
205
-
206
- for ( $i = $year_current; $i >= $year_cutoff; $i-- ) :
207
- ?>
208
- <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
209
- <?php
210
- endfor;
211
- ?>
212
- </select>
213
- </div>
214
- <?php endif; ?>
215
- <?php if ( is_customize_preview() || $part_data['date_type'] === 'datetime' || $part_data['date_type'] === 'time' ) : ?>
216
- <div class="happyforms-part__select-wrap happyforms-part-date__time-input">
217
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[hour]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
218
- <option value=""><?php _e( 'Hour', 'happyforms' ); ?></option>
219
- <?php
220
- if ( 24 === $part_data['time_format'] ) :
221
- $i_min = 0;
222
- $i_max = 24;
223
- else:
224
- $i_min = 1;
225
- $i_max = 13;
226
- endif;
227
-
228
- if ( !is_customize_preview() ) :
229
- for ( $i = $i_min; $i < $i_max; $i++ ) :
230
- ?>
231
- <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
232
- <?php
233
- endfor;
234
- else:
235
- for ( $i = 0; $i < 24; $i++ ) :
236
- ?>
237
- <option value="<?php echo $i; ?>" class="<?php echo ($i > 12) ? 'format-24' : ''; ?>" style="<?php echo ($i > 12 && $part_data['time_format'] == 12) ? 'display: none' : ''; ?>"><?php echo $i; ?></option>
238
- <?php
239
- endfor;
240
- endif;
241
- ?>
242
- </select>
243
- </div>
244
- <div class="happyforms-part__select-wrap happyforms-part-date__time-input">
245
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[minute]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
246
- <option value=""><?php _e( 'Minute', 'happyforms' ); ?></option>
247
- <?php
248
- for ( $i = 0; $i < 60; $i++ ) :
249
- ?>
250
- <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
251
- <?php
252
- endfor;
253
- ?>
254
- </select>
255
- </div>
256
- <?php if ( is_customize_preview() || 12 == $part_data['time_format'] ) : ?>
257
- <div class="happyforms-part__select-wrap happyforms-part-date__time-input happyforms-part-date__time-input--period">
258
- <select name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>[period]"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
259
- <option value=""><?php _e( 'Period', 'happyforms' ); ?></option>
260
- <option value="AM"><?php _e( 'AM', 'happyforms' ); ?></option>
261
- <option value="PM"><?php _e( 'PM', 'happyforms' ); ?></option>
262
- </select>
263
- </div>
264
- <?php endif; ?>
265
- <?php endif; ?>
266
- </div>
267
- <?php happyforms_print_part_description( $part_data ); ?>
268
- <?php
269
- if ( $form_data ) :
270
- happyforms_message_notices( $form_data, $part_data['id'] );
271
- endif;
272
- ?>
273
- </div>
274
- </div>
275
- <?php
276
  }
277
 
278
  /**
@@ -308,12 +124,12 @@ class HappyForms_Part_Date extends HappyForms_Form_Part {
308
  *
309
  * @return string
310
  */
311
- public function sanitize_value( $part_data = array() ) {
312
  $original_value = $this->get_default_value();
313
- $part_id = $part_data['id'];
314
 
315
- if ( isset( $_REQUEST[$part_id] ) ) {
316
- $data = $_REQUEST[$part_id];
317
 
318
  if ( is_array( $data ) ) {
319
  foreach( $data as $key => $date_part ) {
@@ -390,6 +206,14 @@ class HappyForms_Part_Date extends HappyForms_Form_Part {
390
  return $validated_value;
391
  }
392
 
 
 
 
 
 
 
 
 
393
  /**
394
  * Enqueue scripts in customizer area.
395
  *
3
  class HappyForms_Part_Date extends HappyForms_Form_Part {
4
 
5
  public $type = 'date';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Date', 'happyforms' );
9
  $this->description = __( 'For formatted day, month, year and or time fields.', 'happyforms' );
10
+
11
+ add_filter( 'happyforms_part_class', array( $this, 'html_part_class' ), 10, 3 );
12
  }
13
 
14
  /**
70
  *
71
  * @return string
72
  */
73
+ public function customize_templates() {
74
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-date.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
 
77
  /**
85
  * @return string Markup for the form part.
86
  */
87
  public function frontend_template( $part_data = array(), $form_data = array() ) {
88
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
89
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-date.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  }
93
 
94
  /**
124
  *
125
  * @return string
126
  */
127
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
128
  $original_value = $this->get_default_value();
129
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
130
 
131
+ if ( isset( $_REQUEST[$part_name] ) ) {
132
+ $data = $_REQUEST[$part_name];
133
 
134
  if ( is_array( $data ) ) {
135
  foreach( $data as $key => $date_part ) {
206
  return $validated_value;
207
  }
208
 
209
+ public function html_part_class( $class, $part_data, $form_data ) {
210
+ if ( isset( $part_data['date_type'] ) ) {
211
+ $class[] = 'happyforms-part-date--' . $part_data['date_type'];
212
+ }
213
+
214
+ return $class;
215
+ }
216
+
217
  /**
218
  * Enqueue scripts in customizer area.
219
  *
inc/classes/parts/class-part-email.php CHANGED
@@ -3,12 +3,12 @@
3
  class HappyForms_Part_Email extends HappyForms_Form_Part {
4
 
5
  public $type = 'email';
6
- public $template_id = 'happyforms-email-template';
7
- public $preview_confirmation_template_id = 'happyforms-email-confirmation-template';
8
 
9
  public function __construct() {
10
  $this->label = __( 'Email', 'happyforms' );
11
  $this->description = __( 'For formatted email addresses. The \'@\' symbol is required.', 'happyforms' );
 
 
12
  }
13
 
14
  /**
@@ -44,10 +44,6 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
44
  'default' => 0,
45
  'sanitize' => 'intval'
46
  ),
47
- 'confirmation_field_id' => array(
48
- 'default' => '',
49
- 'sanitize' => 'sanitize_text_field'
50
- ),
51
  'confirmation_field_label' => array(
52
  'default' => __( 'Confirm Email', 'happyforms' ),
53
  'sanitize' => 'sanitize_text_field'
@@ -78,70 +74,8 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
78
  *
79
  * @return string
80
  */
81
- public function customize_template() {
82
- ?>
83
- <p>
84
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
85
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
86
- </p>
87
- <p>
88
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
89
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
90
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
91
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
92
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
93
- </select>
94
- </p>
95
- <p class="label_placement-options" style="display: none">
96
- <label>
97
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
98
- </label>
99
- </p>
100
- <p>
101
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
102
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
103
- </p>
104
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
105
- <label>
106
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
107
- </label>
108
- </p>
109
- <p>
110
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
111
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
112
- </p>
113
- <p>
114
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
115
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
116
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
117
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
118
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
119
- </select>
120
- </p>
121
- <p class="width-options" style="display: none">
122
- <label>
123
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
124
- </label>
125
- </p>
126
- <p>
127
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
128
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
129
- </p>
130
- <p>
131
- <label>
132
- <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
133
- </label>
134
- </p>
135
- <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
136
- <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
137
- <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
138
- </p>
139
- <p>
140
- <label>
141
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
142
- </label>
143
- </p>
144
- <?php
145
  }
146
 
147
  /**
@@ -155,89 +89,10 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
155
  * @return string Markup for the form part.
156
  */
157
  public function frontend_template( $part_data = array(), $form_data = array() ) {
158
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
159
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
160
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
161
-
162
- $classes = array('happyforms-part--email');
163
-
164
- if ( $part_data['width'] ) {
165
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
166
- }
167
-
168
- if ( $part_data['label_placement'] ) {
169
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
170
- }
171
-
172
- if ( !empty( $part_data['css_class'] ) ) {
173
- $classes[] = $part_data['css_class'];
174
- }
175
-
176
- $message_notices = '';
177
-
178
- if ( $form_data ) {
179
- $message_notices = happyforms_get_message_notices()->get_messages( $form_data, $part_data['id'] );
180
-
181
- if ( !empty( $message_notices ) ) {
182
- $classes[] = ' happyforms-part--error';
183
- }
184
- }
185
 
186
- $classes = implode( ' ', $classes );
187
- ?>
188
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
189
- <div class="happyforms-part__wrap">
190
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
191
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
192
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
193
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
194
- <?php endif; ?>
195
- </label>
196
- <input type="email" id="<?php echo esc_attr( $html_id ); ?>" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?> />
197
- <?php happyforms_print_part_description( $part_data ); ?>
198
- <?php
199
- if ( $form_data ) :
200
- happyforms_message_notices( $form_data, $part_data['id'] );
201
- endif;
202
- ?>
203
- </div>
204
- <?php if ( 1 === $part_data['confirmation_field'] ) : ?>
205
- <div class="happyforms-part__wrap happyforms-part__wrap--confirmation" id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>">
206
- <div class="happyforms-message-notices" style="display: none">
207
- <div class="happyforms-message-notice error">
208
- <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
209
- </div>
210
- </div>
211
- <label for="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" class="happyforms-part__label happyforms-part__label--confirmation">
212
- <span class="label"><?php echo esc_html( $part_data['confirmation_field_label'] ); ?></span>
213
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
214
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
215
- <?php endif; ?>
216
- </label>
217
- <input type="email" id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" name="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input happyforms-confirmation-input" data-confirmation-of="<?php echo esc_attr( $part_data['id'] ); ?>" <?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?> />
218
- </div>
219
- <?php endif; ?>
220
- </div>
221
- <?php
222
- }
223
-
224
- /**
225
- * Get confirmation field Backbone template for preview purposes.
226
- *
227
- * @since 1.0.0.
228
- *
229
- * @return string Backbone template.
230
- */
231
- public function preview_confirmation_template() {
232
- ?>
233
- <div class="happyforms-part__el happyforms-part__el--confirmation" id="<%= confirmation_field_id %>">
234
- <label for="" class="happyforms-part__label happyforms-part__label--confirmation">
235
- <span class="label"><%= confirmation_field_label %></span>
236
- <span class="happyforms-required"> *</span>
237
- </label>
238
- <input type="email" class="happyforms-part__el happyforms-part__el--text-input" required aria-required="true" />
239
- </div>
240
- <?php
241
  }
242
 
243
  /**
@@ -261,10 +116,6 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
261
  'type' => 'error',
262
  'message' => __( 'Confirmation field is required.', 'happyforms' )
263
  ),
264
- 'not_valid_confirmation_email' => array(
265
- 'type' => 'error',
266
- 'message' => __( 'Confirmation address is not a valid e-mail address.', 'happyforms' )
267
- ),
268
  'emails_not_matching' => array(
269
  'type' => 'error',
270
  'message' => __( 'Email and confirmation email are not matching.', 'happyforms' )
@@ -281,18 +132,18 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
281
  *
282
  * @return string
283
  */
284
- public function sanitize_value( $part_data = array() ) {
285
  $sanitized_value = $this->get_default_value();
286
- $part_id = $part_data['id'];
287
 
288
- if ( isset( $_REQUEST[$part_id] ) ) {
289
- $sanitized_value = sanitize_email( $_REQUEST[$part_id] );
290
  }
291
 
292
- if ( isset( $_REQUEST[$part_id . '_confirmation'] ) ) {
293
  $sanitized_value = array(
294
  $sanitized_value,
295
- sanitize_email( $_REQUEST[$part_id . '_confirmation'] )
296
  );
297
  }
298
 
@@ -310,39 +161,39 @@ class HappyForms_Part_Email extends HappyForms_Form_Part {
310
  * @return string|object
311
  */
312
  public function validate_value( $part_data, $value ) {
313
- $part_id = $part_data['id'];
314
- $validated_value = $value;
315
- $has_confirmation_value = false;
316
 
317
- if ( is_array( $validated_value ) ) {
318
- $has_confirmation_value = true;
319
- $validated_confirmation_value = $validated_value[1];
320
- $validated_value = $validated_value[0];
321
  }
322
 
323
- if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
324
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
325
  }
326
 
327
- if ( empty( $validated_value ) || !filter_var( $validated_value, FILTER_VALIDATE_EMAIL ) ) {
328
- $validated_value = new WP_error( $part_id, 'not_valid_email' );
 
329
  }
330
 
331
- if ( true === $has_confirmation_value ) {
332
- if ( 1 === $part_data['required'] && empty( $validated_confirmation_value ) ) {
333
- $validated_value = new WP_Error( $part_id, 'missing_required_confirmation_field' );
334
- }
335
 
336
- if ( !filter_var( $validated_confirmation_value, FILTER_VALIDATE_EMAIL ) ) {
337
- $validated_value = new WP_error( $part_id, 'not_valid_confirmation_email' );
338
- }
339
 
340
- if ( $validated_value !== $validated_confirmation_value ) {
341
- $validated_value = new WP_Error( $part_id, 'emails_not_matching' );
342
- }
343
  }
344
 
345
- return $validated_value;
 
 
 
 
346
  }
347
 
348
  /**
3
  class HappyForms_Part_Email extends HappyForms_Form_Part {
4
 
5
  public $type = 'email';
 
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Email', 'happyforms' );
9
  $this->description = __( 'For formatted email addresses. The \'@\' symbol is required.', 'happyforms' );
10
+
11
+ add_filter( 'happyforms_part_data_attributes', array( $this, 'html_part_data_attributes' ), 10, 3 );
12
  }
13
 
14
  /**
44
  'default' => 0,
45
  'sanitize' => 'intval'
46
  ),
 
 
 
 
47
  'confirmation_field_label' => array(
48
  'default' => __( 'Confirm Email', 'happyforms' ),
49
  'sanitize' => 'sanitize_text_field'
74
  *
75
  * @return string
76
  */
77
+ public function customize_templates() {
78
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-email.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  }
80
 
81
  /**
89
  * @return string Markup for the form part.
90
  */
91
  public function frontend_template( $part_data = array(), $form_data = array() ) {
92
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
93
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-email.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  }
97
 
98
  /**
116
  'type' => 'error',
117
  'message' => __( 'Confirmation field is required.', 'happyforms' )
118
  ),
 
 
 
 
119
  'emails_not_matching' => array(
120
  'type' => 'error',
121
  'message' => __( 'Email and confirmation email are not matching.', 'happyforms' )
132
  *
133
  * @return string
134
  */
135
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
136
  $sanitized_value = $this->get_default_value();
137
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
138
 
139
+ if ( isset( $_REQUEST[$part_name] ) ) {
140
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
141
  }
142
 
143
+ if ( isset( $_REQUEST[$part_name . '_confirmation'] ) ) {
144
  $sanitized_value = array(
145
  $sanitized_value,
146
+ sanitize_text_field( $_REQUEST[$part_name . '_confirmation'] )
147
  );
148
  }
149
 
161
  * @return string|object
162
  */
163
  public function validate_value( $part_data, $value ) {
164
+ $has_confirmation_value = is_array( $value );
165
+ $validated_value = $has_confirmation_value ? $value[0] : $value;
 
166
 
167
+ if ( $part_data['required'] && '' === $validated_value ) {
168
+ $validated_value = new WP_Error( 'missing_required_field' );
169
+ return $validated_value;
 
170
  }
171
 
172
+ if ( ! is_email( $validated_value ) ) {
173
+ $validated_value = new WP_error( 'not_valid_email' );
174
+ return $validated_value;
175
  }
176
 
177
+ if ( $has_confirmation_value && $value[0] !== $value[1] ) {
178
+ $validated_value = new WP_Error( 'emails_not_matching' );
179
+ return $validated_value;
180
  }
181
 
182
+ $validated_value = sanitize_email( $validated_value );
 
 
 
183
 
184
+ return $validated_value;
185
+ }
 
186
 
187
+ public function html_part_data_attributes( $attributes, $part, $form ) {
188
+ if ( $this->type !== $part['type'] ) {
189
+ return $attributes;
190
  }
191
 
192
+ if ( $part['confirmation_field'] ) {
193
+ $attributes['happyforms-require-confirmation'] = '';
194
+ }
195
+
196
+ return $attributes;
197
  }
198
 
199
  /**
inc/classes/parts/class-part-legal.php CHANGED
@@ -39,6 +39,10 @@ class HappyForms_Part_Legal extends HappyForms_Form_Part {
39
  'default' => 1,
40
  'sanitize' => 'happyforms_sanitize_checkbox',
41
  ),
 
 
 
 
42
  );
43
  }
44
 
@@ -49,25 +53,8 @@ class HappyForms_Part_Legal extends HappyForms_Form_Part {
49
  *
50
  * @return string
51
  */
52
- public function customize_template() {
53
- ?>
54
- <p>
55
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
56
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
57
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
58
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
59
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
60
- </select>
61
- </p>
62
- <p>
63
- <label for="<%= instance.id %>_legal_text"><?php _e( 'Legal text', 'happyforms' ); ?></label>
64
- <textarea id="<%= instance.id %>_legal_text" rows="5" name="legal_text" data-bind="legal_text" class="widefat"><%= instance.legal_text %></textarea>
65
- </p>
66
- <p>
67
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
68
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
69
- </p>
70
- <?php
71
  }
72
 
73
  /**
@@ -81,37 +68,10 @@ class HappyForms_Part_Legal extends HappyForms_Form_Part {
81
  * @return string Markup for the form part.
82
  */
83
  public function frontend_template( $part_data = array(), $form_data = array() ) {
84
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
85
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
86
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
87
-
88
- $classes = array('happyforms-part--legal');
89
-
90
- if ( $part_data['width'] ) {
91
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
92
- }
93
-
94
- if ( !empty( $part_data['css_class'] ) ) {
95
- $classes[] = $part_data['css_class'] . ' ';
96
- }
97
 
98
- $classes = implode( ' ', $classes );
99
- ?>
100
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
101
- <div class="happyforms-part__wrap">
102
- <div class="happyforms-part__el">
103
- <label>
104
- <input id="<?php echo esc_attr( $html_id ); ?>" type="checkbox" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" value="yes" required aria-required="true" /> <span><?php echo $part_data['legal_text']; ?></span>
105
- </label>
106
- </div>
107
- </div>
108
- <?php
109
- if ( $form_data ) :
110
- happyforms_message_notices( $form_data, $part_data['id'] );
111
- endif;
112
- ?>
113
- </div>
114
- <?php
115
  }
116
 
117
  /**
@@ -143,12 +103,12 @@ class HappyForms_Part_Legal extends HappyForms_Form_Part {
143
  *
144
  * @return string
145
  */
146
- public function sanitize_value( $part_data = array() ) {
147
  $sanitized_value = $this->get_default_value();
148
- $part_id = $part_data['id'];
149
 
150
- if ( isset( $_REQUEST[$part_id] ) ) {
151
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
152
  }
153
 
154
  return $sanitized_value;
@@ -165,15 +125,16 @@ class HappyForms_Part_Legal extends HappyForms_Form_Part {
165
  * @return string|object
166
  */
167
  public function validate_value( $part_data, $value ) {
168
- $part_id = $part_data['id'];
169
  $validated_value = $value;
170
 
171
  if ( empty( $validated_value ) ) {
172
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
173
  }
174
 
175
  if ( $validated_value !== 'yes' ) {
176
- $validated_value = new WP_Error( $part_id, 'not_valid_value' );
 
177
  }
178
 
179
  return $validated_value;
39
  'default' => 1,
40
  'sanitize' => 'happyforms_sanitize_checkbox',
41
  ),
42
+ 'label' => array(
43
+ 'default' => __( 'Legal', 'happyforms' ),
44
+ 'sanitize' => 'sanitize_text_field',
45
+ ),
46
  );
47
  }
48
 
53
  *
54
  * @return string
55
  */
56
+ public function customize_templates() {
57
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-legal.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  /**
68
  * @return string Markup for the form part.
69
  */
70
  public function frontend_template( $part_data = array(), $form_data = array() ) {
71
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
72
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
73
 
74
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-legal.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
 
77
  /**
103
  *
104
  * @return string
105
  */
106
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
107
  $sanitized_value = $this->get_default_value();
108
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
109
 
110
+ if ( isset( $_REQUEST[$part_name] ) ) {
111
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
112
  }
113
 
114
  return $sanitized_value;
125
  * @return string|object
126
  */
127
  public function validate_value( $part_data, $value ) {
 
128
  $validated_value = $value;
129
 
130
  if ( empty( $validated_value ) ) {
131
+ $validated_value = new WP_Error( 'missing_required_field' );
132
+ return $validated_value;
133
  }
134
 
135
  if ( $validated_value !== 'yes' ) {
136
+ $validated_value = new WP_Error( 'not_valid_value' );
137
+ return $validated_value;
138
  }
139
 
140
  return $validated_value;
inc/classes/parts/class-part-multi-line-text.php CHANGED
@@ -3,7 +3,6 @@
3
  class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
4
 
5
  public $type = 'multi_line_text';
6
- public $template_id = 'happyforms-multi-line-text-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Long Text', 'happyforms' );
@@ -65,61 +64,8 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
65
  *
66
  * @return string
67
  */
68
- public function customize_template() {
69
- ?>
70
- <p>
71
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
72
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
73
- </p>
74
- <p>
75
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
76
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
77
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
78
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
79
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
80
- </select>
81
- </p>
82
- <p class="label_placement-options" style="display: none">
83
- <label>
84
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
85
- </label>
86
- </p>
87
- <p>
88
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
89
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
90
- </p>
91
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
92
- <label>
93
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
94
- </label>
95
- </p>
96
- <p>
97
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
98
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
99
- </p>
100
- <p>
101
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
102
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
103
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
104
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
105
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
106
- </select>
107
- </p>
108
- <p class="width-options" style="display: none">
109
- <label>
110
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
111
- </label>
112
- </p>
113
- <p>
114
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
115
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
116
- </p>
117
- <p>
118
- <label>
119
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
120
- </label>
121
- </p>
122
- <?php
123
  }
124
 
125
  /**
@@ -133,44 +79,10 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
133
  * @return string Markup for the form part.
134
  */
135
  public function frontend_template( $part_data = array(), $form_data = array() ) {
136
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
137
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
138
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
139
 
140
- $classes = array('happyforms-part--multi-line-text');
141
-
142
- if ( $part_data['width'] ) {
143
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
144
- }
145
-
146
- if ( $part_data['label_placement'] ) {
147
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
148
- }
149
-
150
- if ( !empty( $part_data['css_class'] ) ) {
151
- $classes[] = $part_data['css_class'];
152
- }
153
-
154
- $classes = implode( ' ', $classes );
155
- ?>
156
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
157
- <div class="happyforms-part__wrap">
158
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
159
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
160
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
161
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
162
- <?php endif; ?>
163
- </label>
164
- <textarea id="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__el happyforms-part__el--text-input" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" rows="5" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>></textarea>
165
- <?php happyforms_print_part_description( $part_data ); ?>
166
- <?php
167
- if ( $form_data ) :
168
- happyforms_message_notices( $form_data, $part_data['id'] );
169
- endif;
170
- ?>
171
- </div>
172
- </div>
173
- <?php
174
  }
175
 
176
  /**
@@ -217,12 +129,12 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
217
  *
218
  * @return string
219
  */
220
- public function sanitize_value( $part_data = array() ) {
221
  $sanitized_value = $this->get_default_value();
222
- $part_id = $part_data['id'];
223
 
224
- if ( isset( $_REQUEST[$part_id] ) ) {
225
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
226
  }
227
 
228
  return $sanitized_value;
@@ -239,11 +151,10 @@ class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
239
  * @return string|object
240
  */
241
  public function validate_value( $part_data, $value ) {
242
- $part_id = $part_data['id'];
243
  $validated_value = $value;
244
 
245
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
246
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
247
  }
248
 
249
  return $validated_value;
3
  class HappyForms_Part_MultiLineText extends HappyForms_Form_Part {
4
 
5
  public $type = 'multi_line_text';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Long Text', 'happyforms' );
64
  *
65
  * @return string
66
  */
67
+ public function customize_templates() {
68
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-multi-line-text.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  }
70
 
71
  /**
79
  * @return string Markup for the form part.
80
  */
81
  public function frontend_template( $part_data = array(), $form_data = array() ) {
82
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
83
+ $form = $form_data;
 
84
 
85
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-multi-line-text.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
88
  /**
129
  *
130
  * @return string
131
  */
132
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
133
  $sanitized_value = $this->get_default_value();
134
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
135
 
136
+ if ( isset( $_REQUEST[$part_name] ) ) {
137
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
138
  }
139
 
140
  return $sanitized_value;
151
  * @return string|object
152
  */
153
  public function validate_value( $part_data, $value ) {
 
154
  $validated_value = $value;
155
 
156
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
157
+ $validated_value = new WP_Error( 'missing_required_field' );
158
  }
159
 
160
  return $validated_value;
inc/classes/parts/class-part-number.php CHANGED
@@ -3,12 +3,13 @@
3
  class HappyForms_Part_Number extends HappyForms_Form_Part {
4
 
5
  public $type = 'number';
6
- public $template_id = 'happyforms-number-template';
7
- public $preview_confirmation_template_id = 'happyforms-number-confirmation-template';
8
 
9
  public function __construct() {
10
  $this->label = __( 'Number', 'happyforms' );
11
  $this->description = __( 'For numeric fields.', 'happyforms' );
 
 
 
12
  }
13
 
14
  /**
@@ -57,7 +58,7 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
57
  'sanitize' => 'intval'
58
  ),
59
  'max_value' => array(
60
- 'default' => 0,
61
  'sanitize' => 'intval'
62
  ),
63
  'masked' => array(
@@ -80,10 +81,6 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
80
  'default' => 0,
81
  'sanitize' => 'intval'
82
  ),
83
- 'confirmation_field_id' => array(
84
- 'default' => '',
85
- 'sanitize' => 'sanitize_text_field'
86
- ),
87
  'confirmation_field_label' => array(
88
  'default' => __( 'Confirm Number', 'happyforms' ),
89
  'sanitize' => 'sanitize_text_field'
@@ -102,99 +99,8 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
102
  *
103
  * @return string
104
  */
105
- public function customize_template() {
106
- ?>
107
- <p>
108
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
109
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
110
- </p>
111
- <p>
112
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
113
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
114
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
115
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
116
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
117
- </select>
118
- </p>
119
- <p class="label_placement-options" style="display: none">
120
- <label>
121
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
122
- </label>
123
- </p>
124
- <p>
125
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
126
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
127
- </p>
128
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
129
- <label>
130
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
131
- </label>
132
- </p>
133
- <p>
134
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
135
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
136
- </p>
137
- <div class="min-max-wrapper" style="display: <%= (instance.masked == 0) ? 'block' : 'none' %>">
138
- <p>
139
- <label for="<%= instance.id %>_min_value"><?php _e( 'Minimum accepted value', 'happyforms' ); ?></label>
140
- <input type="text" id="<%= instance.id %>_min_value" class="widefat title" value="<%= instance.min_value %>" data-bind="min_value" />
141
- </p>
142
- <p>
143
- <label for="<%= instance.id %>_max_value"><?php _e( 'Maximum accepted value', 'happyforms' ); ?></label>
144
- <input type="text" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
145
- </p>
146
- </div>
147
- <p>
148
- <label>
149
- <input type="checkbox" name="masked" class="checkbox" value="1" <% if ( instance.masked ) { %>checked="checked"<% } %> data-bind="masked" /> <?php _e( 'Mask this input', 'happyforms' ); ?>
150
- </label>
151
- </p>
152
- <div class="mask-wrapper number-options number-options--numeric" style="display: <%= (instance.masked == 1) ? 'block' : 'none' %>">
153
- <p>
154
- <label for="<%= instance.id %>_mask_numeric_thousands_delimiter"><?php _e( 'Thousands delimiter', 'happyforms' ); ?></label>
155
- <input type="text" id="<%= instance.id %>_mask_numeric_thousands_delimiter" class="widefat title" value="<%= instance.mask_numeric_thousands_delimiter %>" data-bind="mask_numeric_thousands_delimiter" />
156
- </p>
157
- <p>
158
- <label for="<%= instance.id %>_mask_numeric_decimal_mark"><?php _e( 'Decimal mark', 'happyforms' ); ?></label>
159
- <input type="text" id="<%= instance.id %>_mask_numeric_decimal_mark" class="widefat title" value="<%= instance.mask_numeric_decimal_mark %>" data-bind="mask_numeric_decimal_mark" />
160
- </p>
161
- <p>
162
- <label for="<%= instance.id %>_mask_numeric_prefix"><?php _e( 'Prefix', 'happyforms' ); ?></label>
163
- <input type="text" id="<%= instance.id %>_mask_numeric_prefix" class="widefat title" value="<%= instance.mask_numeric_prefix %>" data-bind="mask_numeric_prefix" />
164
- </p>
165
- </div>
166
- <p>
167
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
168
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
169
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
170
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
171
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
172
- </select>
173
- </p>
174
- <p class="width-options" style="display: none">
175
- <label>
176
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
177
- </label>
178
- </p>
179
- <p>
180
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
181
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
182
- </p>
183
- <p>
184
- <label>
185
- <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
186
- </label>
187
- </p>
188
- <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
189
- <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
190
- <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
191
- </p>
192
- <p>
193
- <label>
194
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
195
- </label>
196
- </p>
197
- <?php
198
  }
199
 
200
  /**
@@ -208,106 +114,10 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
208
  * @return string Markup for the form part.
209
  */
210
  public function frontend_template( $part_data = array(), $form_data = array() ) {
211
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
212
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
213
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
214
-
215
- if ( $part_data['masked'] ) {
216
- wp_enqueue_script(
217
- 'cleave',
218
- happyforms_get_plugin_url() . 'assets/js/lib/cleave.min.js',
219
- array()
220
- );
221
- }
222
-
223
- $classes = array('happyforms-part--number');
224
-
225
- if ( $part_data['width'] ) {
226
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
227
- }
228
-
229
- if ( $part_data['label_placement'] ) {
230
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
231
- }
232
-
233
- if ( !empty( $part_data['css_class'] ) ) {
234
- $classes[] = $part_data['css_class'];
235
- }
236
 
237
- $classes = implode( ' ', $classes );
238
- ?>
239
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
240
- <div class="happyforms-part__wrap">
241
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
242
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
243
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
244
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
245
- <?php endif; ?>
246
- </label>
247
- <input id="<?php echo esc_attr( $html_id ); ?>" type="<?php echo ( 1 === $part_data['masked'] ) ? 'text' : 'number'; ?>" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>"
248
- class="happyforms-part__el happyforms-part__el--text-input
249
- <?php echo ( 1 === $part_data['masked'] ) ? ' happyforms-masked-input' : ''; ?>"
250
- <?php if ( 0 === $part_data['masked'] && $part_data['min_value'] > 0 ) : ?>min="<?php echo esc_attr( $part_data['min_value'] ); ?>"<?php endif; ?>
251
- <?php if ( 0 === $part_data['masked'] && $part_data['max_value'] > 0 ) : ?>max="<?php echo esc_attr( $part_data['max_value'] ); ?>"<?php endif; ?>
252
- <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?>
253
- <?php if ( 1 === $part_data['masked'] ) : ?>data-mask-type="numeric"<?php endif; ?>
254
- <?php if ( 1 === $part_data['masked'] && $part_data['mask_numeric_thousands_delimiter'] ) : ?>data-mask-thousands-delimiter="<?php echo esc_attr( $part_data['mask_numeric_thousands_delimiter'] ); ?>"<?php endif; ?>
255
- <?php if ( 1 === $part_data['masked'] && $part_data['mask_numeric_decimal_mark'] ) : ?>data-mask-decimal-mark="<?php echo esc_attr( $part_data['mask_numeric_decimal_mark'] ); ?>"<?php endif; ?>
256
- <?php if ( 1 === $part_data['masked'] && $part_data['mask_numeric_prefix'] ) : ?>data-mask-prefix="<?php echo esc_attr( $part_data['mask_numeric_prefix'] ); ?>"<?php endif; ?> />
257
- <?php happyforms_print_part_description( $part_data ); ?>
258
- <?php
259
- if ( $form_data ) :
260
- happyforms_message_notices( $form_data, $part_data['id'] );
261
- endif;
262
- ?>
263
- </div>
264
- <?php if ( 1 === $part_data['confirmation_field'] ) : ?>
265
- <div class="happyforms-part__wrap happyforms-part__wrap--confirmation" id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>">
266
- <div class="happyforms-message-notices" style="display: none">
267
- <div class="happyforms-message-notice error">
268
- <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
269
- </div>
270
- </div>
271
- <label for="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" class="happyforms-part__label happyforms-part__label--confirmation">
272
- <span class="label"><?php echo esc_html( $part_data['confirmation_field_label'] ); ?></span>
273
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
274
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
275
- <?php endif; ?>
276
- </label>
277
- <input id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" type="text" name="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>"
278
- data-confirmation-of="<?php echo esc_attr( $part_data['id'] ); ?>"
279
- class="happyforms-part__el happyforms-part__el--text-input happyforms-confirmation-input
280
- <?php if ( 1 === $part_data['masked'] ) : ?> happyforms-masked-input<?php endif; ?>"
281
- <?php if ( 0 === $part_data['masked'] && $part_data['min_value'] > 0 ) : ?>min="<?php echo esc_attr( $part_data['min_value'] ); ?>"<?php endif; ?>
282
- <?php if ( 0 === $part_data['masked'] && $part_data['max_value'] > 0 ) : ?>max="<?php echo esc_attr( $part_data['max_value'] ); ?>"<?php endif; ?>
283
- <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?>
284
- <?php if ( 1 === $part_data['masked'] ) : ?>data-mask-type="numeric"<?php endif; ?>
285
- <?php if ( $part_data['mask_numeric_thousands_delimiter'] ) : ?>data-mask-thousands-delimiter="<?php echo esc_attr( $part_data['mask_numeric_thousands_delimiter'] ); ?>"<?php endif; ?>
286
- <?php if ( $part_data['mask_numeric_decimal_mark'] ) : ?>data-mask-decimal-mark="<?php echo esc_attr( $part_data['mask_numeric_decimal_mark'] ); ?>"<?php endif; ?>
287
- <?php if ( $part_data['mask_numeric_prefix'] ) : ?>data-mask-prefix="<?php echo esc_attr( $part_data['mask_numeric_prefix'] ); ?>"<?php endif; ?>
288
- </div>
289
- <?php endif; ?>
290
- </div>
291
- <?php
292
- }
293
-
294
- /**
295
- * Get confirmation field Backbone template for preview purposes.
296
- *
297
- * @since 1.0.0.
298
- *
299
- * @return string Backbone template.
300
- */
301
- public function preview_confirmation_template() {
302
- ?>
303
- <div class="happyforms-part__el happyforms-part__el--confirmation" id="<%= confirmation_field_id %>">
304
- <label for="" class="happyforms-part__label happyforms-part__label--confirmation">
305
- <span class="label"><%= confirmation_field_label %></span>
306
- <span class="happyforms-required"> *</span>
307
- </label>
308
- <input type="text" class="happyforms-part__el happyforms-part__el--text-input" required aria-required="true" />
309
- </div>
310
- <?php
311
  }
312
 
313
  /**
@@ -351,18 +161,18 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
351
  *
352
  * @return string
353
  */
354
- public function sanitize_value( $part_data = array() ) {
355
  $sanitized_value = $this->get_default_value();
356
- $part_id = $part_data['id'];
357
 
358
- if ( isset( $_REQUEST[$part_id] ) ) {
359
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
360
  }
361
 
362
- if ( isset( $_REQUEST[$part_id . '_confirmation'] ) ) {
363
  $sanitized_value = array(
364
  $sanitized_value,
365
- sanitize_text_field( $_REQUEST[$part_id . '_confirmation'] )
366
  );
367
  }
368
 
@@ -380,38 +190,22 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
380
  * @return string|object
381
  */
382
  public function validate_value( $part_data, $value ) {
383
- $part_id = $part_data['id'];
384
- $validated_value = $value;
385
- $has_confirmation_value = false;
386
 
387
- if ( is_array( $validated_value ) ) {
388
- $has_confirmation_value = true;
389
- $validated_confirmation_value = $validated_value[1];
390
- $validated_value = $validated_value[0];
391
- } else {
392
- $validated_confirmation_value = $validated_value;
393
- }
394
-
395
- if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
396
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
397
- }
398
-
399
- if ( true === $has_confirmation_value ) {
400
- if ( 1 === $part_data['required'] && empty( $validated_confirmation_value ) ) {
401
- $validated_value = new WP_Error( $part_id, 'missing_required_confirmation_field' );
402
- }
403
-
404
- if ( $validated_value !== $validated_confirmation_value ) {
405
- $validated_value = new WP_Error( $part_id, 'numbers_not_matching' );
406
- }
407
  }
408
 
409
- if ( $part_data['masked'] === 0 && !is_numeric( $validated_value ) ) {
410
- $validated_value = new WP_Error( $part_id, 'not_a_number' );
 
411
  }
412
 
413
- if ( true === $has_confirmation_value && $part_data['masked'] === 0 && !is_numeric( $validated_confirmation_value ) ) {
414
- $validated_value = new WP_error( $part_id, 'not_a_number_confirmation' );
 
415
  }
416
 
417
  return $validated_value;
@@ -436,4 +230,65 @@ class HappyForms_Part_Number extends HappyForms_Form_Part {
436
  );
437
  }
438
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
439
  }
3
  class HappyForms_Part_Number extends HappyForms_Form_Part {
4
 
5
  public $type = 'number';
 
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Number', 'happyforms' );
9
  $this->description = __( 'For numeric fields.', 'happyforms' );
10
+
11
+ add_filter( 'happyforms_part_data_attributes', array( $this, 'html_part_data_attributes' ), 10, 3 );
12
+ add_filter( 'happyforms_frontend_dependencies', array( $this, 'script_dependencies' ), 10, 2 );
13
  }
14
 
15
  /**
58
  'sanitize' => 'intval'
59
  ),
60
  'max_value' => array(
61
+ 'default' => 1,
62
  'sanitize' => 'intval'
63
  ),
64
  'masked' => array(
81
  'default' => 0,
82
  'sanitize' => 'intval'
83
  ),
 
 
 
 
84
  'confirmation_field_label' => array(
85
  'default' => __( 'Confirm Number', 'happyforms' ),
86
  'sanitize' => 'sanitize_text_field'
99
  *
100
  * @return string
101
  */
102
+ public function customize_templates() {
103
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-number.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
 
106
  /**
114
  * @return string Markup for the form part.
115
  */
116
  public function frontend_template( $part_data = array(), $form_data = array() ) {
117
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
118
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-number.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  }
122
 
123
  /**
161
  *
162
  * @return string
163
  */
164
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
165
  $sanitized_value = $this->get_default_value();
166
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
167
 
168
+ if ( isset( $_REQUEST[$part_name] ) ) {
169
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
170
  }
171
 
172
+ if ( isset( $_REQUEST[$part_name . '_confirmation'] ) ) {
173
  $sanitized_value = array(
174
  $sanitized_value,
175
+ sanitize_text_field( $_REQUEST[$part_name . '_confirmation'] )
176
  );
177
  }
178
 
190
  * @return string|object
191
  */
192
  public function validate_value( $part_data, $value ) {
193
+ $has_confirmation_value = is_array( $value );
194
+ $validated_value = $has_confirmation_value ? $value[0] : $value;
 
195
 
196
+ if ( $part_data['required'] && '' === $validated_value ) {
197
+ $validated_value = new WP_Error( 'missing_required_field' );
198
+ return $validated_value;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  }
200
 
201
+ if ( ! $part_data['masked'] && ! is_numeric( $validated_value ) ) {
202
+ $validated_value = new WP_Error( 'not_a_number' );
203
+ return $validated_value;
204
  }
205
 
206
+ if ( $has_confirmation_value && $value[0] !== $value[1] ) {
207
+ $validated_value = new WP_Error( 'numbers_not_matching' );
208
+ return $validated_value;
209
  }
210
 
211
  return $validated_value;
230
  );
231
  }
232
 
233
+ public function html_part_data_attributes( $attributes, $part, $form ) {
234
+ if ( $this->type !== $part['type'] ) {
235
+ return $attributes;
236
+ }
237
+
238
+ if ( $part['confirmation_field'] ) {
239
+ $attributes['happyforms-require-confirmation'] = '';
240
+ }
241
+
242
+ if ( $part['masked'] ) {
243
+ $attributes['mask'] = 'true';
244
+ $attributes['thousands-delimiter'] = $part['mask_numeric_thousands_delimiter'];
245
+ $attributes['decimal-mark'] = $part['mask_numeric_decimal_mark'];
246
+ $attributes['prefix'] = $part['mask_numeric_prefix'];
247
+ }
248
+
249
+ return $attributes;
250
+ }
251
+
252
+ /**
253
+ * Action: enqueue additional scripts on the frontend.
254
+ *
255
+ * @since 1.3.0.
256
+ *
257
+ * @hooked action happyforms_frontend_dependencies
258
+ *
259
+ * @param array List of dependencies.
260
+ *
261
+ * @return array
262
+ */
263
+ public function script_dependencies( $deps, $forms ) {
264
+ $contains_number = false;
265
+ $form_controller = happyforms_get_form_controller();
266
+
267
+ foreach ( $forms as $form ) {
268
+ if ( $form_controller->get_first_part_by_type( $form, $this->type ) ) {
269
+ $contains_number = true;
270
+ break;
271
+ }
272
+ }
273
+
274
+ if ( ! happyforms_is_preview() && ! $contains_number ) {
275
+ return $deps;
276
+ }
277
+
278
+ wp_register_script(
279
+ 'cleave',
280
+ happyforms_get_plugin_url() . 'assets/js/lib/cleave.min.js'
281
+ );
282
+
283
+ wp_register_script(
284
+ 'happyforms-part-number',
285
+ happyforms_get_plugin_url() . 'assets/js/frontend/number.js',
286
+ array( 'cleave' ), false, true
287
+ );
288
+
289
+ $deps[] = 'happyforms-part-number';
290
+
291
+ return $deps;
292
+ }
293
+
294
  }
inc/classes/parts/class-part-phone.php CHANGED
@@ -3,12 +3,13 @@
3
  class HappyForms_Part_Phone extends HappyForms_Form_Part {
4
 
5
  public $type = 'phone';
6
- public $template_id = 'happyforms-phone-template';
7
- public $preview_confirmation_template_id = 'happyforms-phone-confirmation-template';
8
 
9
  public function __construct() {
10
  $this->label = __( 'Phone', 'happyforms' );
11
  $this->description = __( 'For phone numbers. Includes country specific formatting.', 'happyforms' );
 
 
 
12
  }
13
 
14
  /**
@@ -64,10 +65,6 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
64
  'default' => 0,
65
  'sanitize' => 'intval'
66
  ),
67
- 'confirmation_field_id' => array(
68
- 'default' => '',
69
- 'sanitize' => 'sanitize_text_field'
70
- ),
71
  'confirmation_field_label' => array(
72
  'default' => __( 'Confirm Number', 'happyforms' ),
73
  'sanitize' => 'sanitize_text_field'
@@ -86,90 +83,8 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
86
  *
87
  * @return string
88
  */
89
- public function customize_template() {
90
- ?>
91
- <p>
92
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
93
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
94
- </p>
95
- <p>
96
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
97
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
98
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
99
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
100
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
101
- </select>
102
- </p>
103
- <p class="label_placement-options" style="display: none">
104
- <label>
105
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
106
- </label>
107
- </p>
108
- <p>
109
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
110
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
111
- </p>
112
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
113
- <label>
114
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
115
- </label>
116
- </p>
117
- <p>
118
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
119
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
120
- </p>
121
- <p>
122
- <label>
123
- <input type="checkbox" name="masked" class="checkbox" value="1" <% if ( instance.masked ) { %>checked="checked"<% } %> data-bind="masked" /> <?php _e( 'Mask this input', 'happyforms' ); ?>
124
- </label>
125
- </p>
126
- <div class="number-options number-options--phone" style="display: <%= (instance.masked == 1) ? 'block' : 'none' %>">
127
- <p>
128
- <label for="<%= instance.id %>_mask_phone_country"><?php _e( 'Pre-format phone number region', 'happyforms' ); ?></label>
129
- <select id="<%= instance.id %>_mask_phone_country" class="widefat title" data-bind="mask_phone_country">
130
- <option value="">- <?php _e( 'Select', 'happyforms' ); ?> -</option>
131
- <?php
132
- $phone_countries = $this->get_phone_countries_array();
133
-
134
- foreach ( $phone_countries as $country_code => $country ) {
135
- echo '<option value="'. $country['code'] .'"<% if (instance.mask_phone_country == "'. $country['code'] .'") { %> selected<% } %>>'. ucwords( strtolower( $country['name'] ) ) .'</option>';
136
- }
137
- ?>
138
- </select>
139
- </p>
140
- </div>
141
- <p>
142
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
143
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
144
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
145
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
146
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
147
- </select>
148
- </p>
149
- <p class="width-options" style="display: none">
150
- <label>
151
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
152
- </label>
153
- </p>
154
- <p>
155
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
156
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
157
- </p>
158
- <p>
159
- <label>
160
- <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
161
- </label>
162
- </p>
163
- <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
164
- <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
165
- <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
166
- </p>
167
- <p>
168
- <label>
169
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
170
- </label>
171
- </p>
172
- <?php
173
  }
174
 
175
  /**
@@ -183,104 +98,10 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
183
  * @return string Markup for the form part.
184
  */
185
  public function frontend_template( $part_data = array(), $form_data = array() ) {
186
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
187
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
188
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
189
-
190
- if ( $part_data['masked'] ) {
191
- wp_enqueue_script(
192
- 'cleave',
193
- happyforms_get_plugin_url() . 'assets/js/lib/cleave.min.js',
194
- array()
195
- );
196
-
197
- wp_enqueue_script(
198
- 'cleave-phone',
199
- happyforms_get_plugin_url() . 'assets/js/lib/cleave-phone.i18n.js',
200
- array()
201
- );
202
- }
203
-
204
- $classes = array('happyforms-part--phone');
205
-
206
- if ( $part_data['width'] ) {
207
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
208
- }
209
 
210
- if ( $part_data['label_placement'] ) {
211
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
212
- }
213
-
214
- if ( !empty( $part_data['css_class'] ) ) {
215
- $classes[] = $part_data['css_class'];
216
- }
217
-
218
- $classes = implode( ' ', $classes );
219
- ?>
220
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
221
- <div class="happyforms-part__wrap">
222
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
223
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
224
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
225
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
226
- <?php endif; ?>
227
- </label>
228
- <input id="<?php echo esc_attr( $html_id ); ?>" type="text" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>"
229
- class="happyforms-part__el happyforms-part__el--text-input
230
- <?php if ( 1 === $part_data['masked'] ) : ?> happyforms-masked-input<?php endif; ?>"
231
- <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?>
232
- <?php if ( 1 === $part_data['masked'] ) : ?>data-mask-type="phone"<?php endif; ?>
233
- <?php if ( $part_data['mask_phone_country'] ) : ?>data-mask-phone-country="<?php echo esc_attr( $part_data['mask_phone_country'] ); ?>"<?php endif; ?> />
234
- <?php happyforms_print_part_description( $part_data ); ?>
235
- <?php
236
- if ( $form_data ) :
237
- happyforms_message_notices( $form_data, $part_data['id'] );
238
- endif;
239
- ?>
240
- </div>
241
- <?php if ( 1 === $part_data['confirmation_field'] ) : ?>
242
- <div class="happyforms-part__wrap happyforms-part__wrap--confirmation" id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>">
243
- <div class="happyforms-message-notices" style="display: none">
244
- <div class="happyforms-message-notice error">
245
- <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
246
- </div>
247
- </div>
248
- <label for="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" class="happyforms-part__label happyforms-part__label--confirmation">
249
- <span class="label"><?php echo esc_html( $part_data['confirmation_field_label'] ); ?></span>
250
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
251
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
252
- <?php endif; ?>
253
- </label>
254
- <input id="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>_input" type="text" name="<?php echo esc_attr( $part_data['confirmation_field_id'] ); ?>"
255
- data-confirmation-of="<?php echo esc_attr( $part_data['id'] ); ?>"
256
- class="happyforms-part__el happyforms-part__el--text-input happyforms-confirmation-input
257
- <?php if ( 1 === $part_data['masked'] ) : ?> happyforms-masked-input<?php endif; ?>"
258
- <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?>
259
- <?php if ( 1 === $part_data['masked'] ) : ?>data-mask-type="phone"<?php endif; ?>
260
- <?php if ( $part_data['mask_phone_country'] ) : ?>data-mask-phone-country="<?php echo esc_attr( $part_data['mask_phone_country'] ); ?>"<?php endif; ?> />
261
- </div>
262
- <?php endif; ?>
263
- </div>
264
- <?php
265
- }
266
-
267
- /**
268
- * Get confirmation field Backbone template for preview purposes.
269
- *
270
- * @since 1.0.0.
271
- *
272
- * @return string Backbone template.
273
- */
274
- public function preview_confirmation_template() {
275
- ?>
276
- <div class="happyforms-part__el happyforms-part__el--confirmation" id="<%= confirmation_field_id %>">
277
- <label for="" class="happyforms-part__label happyforms-part__label--confirmation">
278
- <span class="label"><%= confirmation_field_label %></span>
279
- <span class="happyforms-required"> *</span>
280
- </label>
281
- <input type="text" class="happyforms-part__el happyforms-part__el--text-input" required aria-required="true" />
282
- </div>
283
- <?php
284
  }
285
 
286
  /**
@@ -560,19 +381,27 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
560
  *
561
  * @return string
562
  */
563
- public function sanitize_value( $part_data = array() ) {
564
  $sanitized_value = $this->get_default_value();
565
- $part_id = $part_data['id'];
 
 
 
 
 
 
 
 
 
566
 
567
- if ( isset( $_REQUEST[$part_id] ) ) {
568
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
 
 
569
  }
570
 
571
- if ( isset( $_REQUEST[$part_id . '_confirmation'] ) ) {
572
- $sanitized_value = array(
573
- $sanitized_value,
574
- sanitize_text_field( $_REQUEST[$part_id . '_confirmation'] )
575
- );
576
  }
577
 
578
  return $sanitized_value;
@@ -589,33 +418,40 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
589
  * @return string|object
590
  */
591
  public function validate_value( $part_data, $value ) {
592
- $part_id = $part_data['id'];
593
- $validated_value = $value;
594
- $has_confirmation_value = false;
595
-
596
- if ( is_array( $validated_value ) ) {
597
- $has_confirmation_value = true;
598
- $validated_confirmation_value = $validated_value[1];
599
- $validated_value = $validated_value[0];
600
- } else {
601
- $validated_confirmation_value = $validated_value;
602
  }
603
 
604
- if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
605
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
606
  }
607
 
608
- if ( true === $has_confirmation_value ) {
609
- if ( 1 === $part_data['required'] && empty( $validated_confirmation_value ) ) {
610
- $validated_value = new WP_Error( $part_id, 'missing_required_confirmation_field' );
611
- }
 
 
 
612
 
613
- if ( $validated_value !== $validated_confirmation_value ) {
614
- $validated_value = new WP_Error( $part_id, 'numbers_not_matching' );
 
 
 
 
 
 
 
615
  }
616
  }
617
 
618
- return $validated_value;
619
  }
620
 
621
  /**
@@ -637,4 +473,52 @@ class HappyForms_Part_Phone extends HappyForms_Form_Part {
637
  );
638
  }
639
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
  }
3
  class HappyForms_Part_Phone extends HappyForms_Form_Part {
4
 
5
  public $type = 'phone';
 
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Phone', 'happyforms' );
9
  $this->description = __( 'For phone numbers. Includes country specific formatting.', 'happyforms' );
10
+
11
+ add_filter( 'happyforms_part_data_attributes', array( $this, 'html_part_data_attributes' ), 10, 3 );
12
+ add_filter( 'happyforms_frontend_dependencies', array( $this, 'script_dependencies' ), 10, 2 );
13
  }
14
 
15
  /**
65
  'default' => 0,
66
  'sanitize' => 'intval'
67
  ),
 
 
 
 
68
  'confirmation_field_label' => array(
69
  'default' => __( 'Confirm Number', 'happyforms' ),
70
  'sanitize' => 'sanitize_text_field'
83
  *
84
  * @return string
85
  */
86
+ public function customize_templates() {
87
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-phone.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  }
89
 
90
  /**
98
  * @return string Markup for the form part.
99
  */
100
  public function frontend_template( $part_data = array(), $form_data = array() ) {
101
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
102
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-phone.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
 
107
  /**
381
  *
382
  * @return string
383
  */
384
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
385
  $sanitized_value = $this->get_default_value();
386
+ $confirmed_value = $sanitized_value;
387
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
388
+
389
+ if ( isset( $_REQUEST[$part_name] ) ) {
390
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
391
+ }
392
+
393
+ if ( isset( $_REQUEST[$part_name . '_confirmation'] ) ) {
394
+ $confirmed_value = sanitize_text_field( $_REQUEST[$part_name . '_confirmation'] );
395
+ }
396
 
397
+ if ( $part_data['mask_phone_country'] ) {
398
+ $prefix_length = strlen( $part_data['mask_phone_country'] ) + 1;
399
+ $sanitized_value = substr( $sanitized_value, $prefix_length );
400
+ $confirmed_value = substr( $confirmed_value, $prefix_length );
401
  }
402
 
403
+ if ( isset( $_REQUEST[$part_name . '_confirmation'] ) ) {
404
+ $sanitized_value = array( $sanitized_value, $confirmed_value );
 
 
 
405
  }
406
 
407
  return $sanitized_value;
418
  * @return string|object
419
  */
420
  public function validate_value( $part_data, $value ) {
421
+ $has_confirmation_value = is_array( $value );
422
+ $validated_value = $has_confirmation_value ? $value[0] : $value;
423
+
424
+ if ( $part_data['required'] && '' === $validated_value ) {
425
+ $validated_value = new WP_Error( 'missing_required_field' );
426
+ return $validated_value;
 
 
 
 
427
  }
428
 
429
+ if ( $has_confirmation_value && $value[0] !== $value[1] ) {
430
+ $validated_value = new WP_Error( 'numbers_not_matching' );
431
+ return $validated_value;
432
  }
433
 
434
+ return $validated_value;
435
+ }
436
+
437
+ public function html_part_data_attributes( $attributes, $part, $form ) {
438
+ if ( $this->type !== $part['type'] ) {
439
+ return $attributes;
440
+ }
441
 
442
+ if ( $part['confirmation_field'] ) {
443
+ $attributes['happyforms-require-confirmation'] = '';
444
+ }
445
+
446
+ if ( $part['masked'] ) {
447
+ $attributes['mask'] = 'true';
448
+
449
+ if ( $part['mask_phone_country'] ) {
450
+ $attributes['country'] = $part['mask_phone_country'];
451
  }
452
  }
453
 
454
+ return $attributes;
455
  }
456
 
457
  /**
473
  );
474
  }
475
 
476
+ /**
477
+ * Action: enqueue additional scripts on the frontend.
478
+ *
479
+ * @since 1.0.0.
480
+ *
481
+ * @hooked action happyforms_frontend_dependencies
482
+ *
483
+ * @param array List of dependencies.
484
+ *
485
+ * @return array
486
+ */
487
+ public function script_dependencies( $deps, $forms ) {
488
+ $contains_phone = false;
489
+ $form_controller = happyforms_get_form_controller();
490
+
491
+ foreach ( $forms as $form ) {
492
+ if ( $form_controller->get_first_part_by_type( $form, $this->type ) ) {
493
+ $contains_phone = true;
494
+ break;
495
+ }
496
+ }
497
+
498
+ if ( ! happyforms_is_preview() && ! $contains_phone ) {
499
+ return $deps;
500
+ }
501
+
502
+ wp_register_script(
503
+ 'cleave',
504
+ happyforms_get_plugin_url() . 'assets/js/lib/cleave.min.js'
505
+ );
506
+
507
+ wp_register_script(
508
+ 'cleave-phone',
509
+ happyforms_get_plugin_url() . 'assets/js/lib/cleave-phone.i18n.js',
510
+ array( 'cleave' ), false, true
511
+ );
512
+
513
+ wp_register_script(
514
+ 'happyforms-part-phone',
515
+ happyforms_get_plugin_url() . 'assets/js/frontend/phone.js',
516
+ array( 'cleave-phone' ), false, true
517
+ );
518
+
519
+ $deps[] = 'happyforms-part-phone';
520
+
521
+ return $deps;
522
+ }
523
+
524
  }
inc/classes/parts/class-part-placeholder.php CHANGED
@@ -3,7 +3,6 @@
3
  class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
4
 
5
  public $type = 'placeholder';
6
- public $template_id = 'happyforms-placeholder-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Placeholder', 'happyforms' );
@@ -12,9 +11,9 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
12
 
13
  /**
14
  * Get all part meta fields defaults.
15
- *
16
  * @since 1.0.0.
17
- *
18
  * @return array
19
  */
20
  public function get_customize_fields() {
@@ -39,6 +38,10 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
39
  'default' => '',
40
  'sanitize' => 'sanitize_text_field'
41
  ),
 
 
 
 
42
  'placeholder_text' => array(
43
  'default' => '',
44
  'sanitize' => 'sanitize_text_field'
@@ -48,101 +51,37 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
48
 
49
  /**
50
  * Get template for part item in customize pane.
51
- *
52
  * @since 1.0.0.
53
- *
54
  * @return string
55
  */
56
- public function customize_template() {
57
- ?>
58
- <p>
59
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
60
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
61
- </p>
62
- <p>
63
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
64
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
65
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
66
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
67
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
68
- </select>
69
- </p>
70
- <p class="label_placement-options" style="display: none">
71
- <label>
72
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
73
- </label>
74
- </p>
75
- <p>
76
- <label for="<%= instance.id %>_placeholder_text"><?php _e( 'Text', 'happyforms' ); ?></label>
77
- <textarea id="<%= instance.id %>_placeholder_text" class="widefat title" name="placeholder_text" data-bind="placeholder_text"><%= instance.placeholder_text %></textarea>
78
- </p>
79
- <p>
80
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
81
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
82
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
83
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
84
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
85
- </select>
86
- </p>
87
- <p class="width-options" style="display: none">
88
- <label>
89
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
90
- </label>
91
- </p>
92
- <p>
93
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
94
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
95
- </p>
96
- <?php
97
  }
98
 
99
  /**
100
  * Get front end part template with parsed data.
101
- *
102
  * @since 1.0.0.
103
- *
104
  * @param array $part_data Form part data.
105
  * @param array $form_data Form (post) data.
106
- *
107
  * @return string Markup for the form part.
108
  */
109
  public function frontend_template( $part_data = array(), $form_data = array() ) {
110
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
111
-
112
- $classes = array('happyforms-part--placeholder');
113
-
114
- if ( $part_data['width'] ) {
115
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
116
- }
117
-
118
- if ( $part_data['label_placement'] ) {
119
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
120
- }
121
 
122
- if ( !empty( $part_data['css_class'] ) ) {
123
- $classes[] = $part_data['css_class'];
124
- }
125
-
126
- $classes = implode( ' ', $classes );
127
- ?>
128
- <div class="happyforms-part happyforms-part--placeholder happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
129
- <div class="happyforms-part__wrap">
130
- <label class="happyforms-part__label">
131
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
132
- </label>
133
- <div class="happyforms-part__el">
134
- <?php echo $part_data['placeholder_text']; ?>
135
- </div>
136
- </div>
137
- </div>
138
- <?php
139
  }
140
 
141
  /**
142
  * Get all possible messages definitions.
143
- *
144
  * @since 1.0.0.
145
- *
146
  * @return array Associative array, specifying message type and copy.
147
  */
148
  public function get_message_definitions() {
@@ -151,19 +90,19 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
151
 
152
  /**
153
  * Sanitize submitted value before storing it.
154
- *
155
  * @since 1.0.0.
156
- *
157
  * @param array $part_data Form part data.
158
- *
159
  * @return string
160
  */
161
- public function sanitize_value( $part_data = array() ) {
162
  $sanitized_value = $this->get_default_value();
163
- $part_id = $part_data['id'];
164
 
165
- if ( isset( $_REQUEST[$part_id] ) ) {
166
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
167
  }
168
 
169
  return $sanitized_value;
@@ -171,16 +110,15 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
171
 
172
  /**
173
  * Validate value before submitting it.
174
- *
175
  * @since 1.0.0.
176
- *
177
  * @param array $part_data Form part data.
178
  * @param string $value Submitted value.
179
- *
180
  * @return string
181
  */
182
  public function validate_value( $part_data, $value ) {
183
- $part_id = $part_data['id'];
184
  $validated_value = esc_attr( $value );
185
 
186
  return $validated_value;
@@ -188,11 +126,11 @@ class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
188
 
189
  /**
190
  * Enqueue scripts in customizer area.
191
- *
192
  * @since 1.0.0.
193
- *
194
  * @param array List of dependencies.
195
- *
196
  * @return void
197
  */
198
  public function customize_enqueue_scripts( $deps = array() ) {
3
  class HappyForms_Part_Placeholder extends HappyForms_Form_Part {
4
 
5
  public $type = 'placeholder';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Placeholder', 'happyforms' );
11
 
12
  /**
13
  * Get all part meta fields defaults.
14
+ *
15
  * @since 1.0.0.
16
+ *
17
  * @return array
18
  */
19
  public function get_customize_fields() {
38
  'default' => '',
39
  'sanitize' => 'sanitize_text_field'
40
  ),
41
+ 'required' => array(
42
+ 'default' => '',
43
+ 'sanitize' => 'happyforms_sanitize_checkbox',
44
+ ),
45
  'placeholder_text' => array(
46
  'default' => '',
47
  'sanitize' => 'sanitize_text_field'
51
 
52
  /**
53
  * Get template for part item in customize pane.
54
+ *
55
  * @since 1.0.0.
56
+ *
57
  * @return string
58
  */
59
+ public function customize_templates() {
60
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-placeholder.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  }
62
 
63
  /**
64
  * Get front end part template with parsed data.
65
+ *
66
  * @since 1.0.0.
67
+ *
68
  * @param array $part_data Form part data.
69
  * @param array $form_data Form (post) data.
70
+ *
71
  * @return string Markup for the form part.
72
  */
73
  public function frontend_template( $part_data = array(), $form_data = array() ) {
74
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
75
+ $form = $form_data;
 
 
 
 
 
 
 
 
 
76
 
77
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-placeholder.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
 
80
  /**
81
  * Get all possible messages definitions.
82
+ *
83
  * @since 1.0.0.
84
+ *
85
  * @return array Associative array, specifying message type and copy.
86
  */
87
  public function get_message_definitions() {
90
 
91
  /**
92
  * Sanitize submitted value before storing it.
93
+ *
94
  * @since 1.0.0.
95
+ *
96
  * @param array $part_data Form part data.
97
+ *
98
  * @return string
99
  */
100
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
101
  $sanitized_value = $this->get_default_value();
102
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
103
 
104
+ if ( isset( $_REQUEST[$part_name] ) ) {
105
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
106
  }
107
 
108
  return $sanitized_value;
110
 
111
  /**
112
  * Validate value before submitting it.
113
+ *
114
  * @since 1.0.0.
115
+ *
116
  * @param array $part_data Form part data.
117
  * @param string $value Submitted value.
118
+ *
119
  * @return string
120
  */
121
  public function validate_value( $part_data, $value ) {
 
122
  $validated_value = esc_attr( $value );
123
 
124
  return $validated_value;
126
 
127
  /**
128
  * Enqueue scripts in customizer area.
129
+ *
130
  * @since 1.0.0.
131
+ *
132
  * @param array List of dependencies.
133
+ *
134
  * @return void
135
  */
136
  public function customize_enqueue_scripts( $deps = array() ) {
inc/classes/parts/class-part-radio.php CHANGED
@@ -4,12 +4,12 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
4
 
5
  public $type = 'radio';
6
  public $template_id = 'happyforms-radio-template';
7
- public $item_customize_template_id = 'happyforms-radio-option-customize-template';
8
- public $item_frontend_template_id = 'happyforms-radio-option-frontend-template';
9
 
10
  public function __construct() {
11
  $this->label = __( 'Single Choice', 'happyforms' );
12
  $this->description = __( 'For radio buttons allowing one selection.', 'happyforms' );
 
 
13
  }
14
 
15
  /**
@@ -71,7 +71,7 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
71
  *
72
  * @return array
73
  */
74
- public function get_option_defaults() {
75
  return array(
76
  'is_default' => 0,
77
  'label' => '',
@@ -86,101 +86,8 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
86
  *
87
  * @return string
88
  */
89
- public function customize_template() {
90
- ?>
91
- <p>
92
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
93
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
94
- </p>
95
- <p>
96
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
97
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
98
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
99
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
100
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
101
- </select>
102
- </p>
103
- <p class="label_placement-options" style="display: none">
104
- <label>
105
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
106
- </label>
107
- </p>
108
- <p>
109
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
110
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
111
- </p>
112
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
113
- <label>
114
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
115
- </label>
116
- </p>
117
- <p>
118
- <label for="<%= instance.id %>_display_type"><?php _e( 'Display options', 'happyforms' ); ?></label>
119
- <select id="<%= instance.id %>_display_type" name="display_type" data-bind="display_type" class="widefat">
120
- <option value="inline"<%= (instance.display_type == 'inline') ? ' selected' : '' %>><?php _e( 'Horizontal', 'happyforms' ); ?></option>
121
- <option value="block"<%= (instance.display_type == 'block') ? ' selected' : '' %>><?php _e( 'Vertical', 'happyforms' ); ?></option>
122
- </select>
123
- </p>
124
- <p>
125
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
126
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
127
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
128
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
129
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
130
- </select>
131
- </p>
132
- <p class="width-options" style="display: none">
133
- <label>
134
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
135
- </label>
136
- </p>
137
- <p>
138
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
139
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
140
- </p>
141
- <p>
142
- <label>
143
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
144
- </label>
145
- </p>
146
- <ul class="options">
147
- <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
148
- <% if ( !instance.options.length ) { %>
149
- <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
150
- <% } %>
151
- </ul>
152
- <p class="links">
153
- <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
154
- </p>
155
- <?php
156
- }
157
-
158
- /**
159
- * Get template for option / sub-part item in customize pane.
160
- *
161
- * @since 1.0.0.
162
- *
163
- * @return string
164
- */
165
- public function customize_item_template() {
166
- ?>
167
- <li class="happyforms-part-widget happyforms-part-widget--sub">
168
- <label>
169
- <?php _e( 'Label', 'happyforms' ); ?>
170
- <input type="text" class="widefat" name="" value="<%= label %>" data-option-attribute="label" data-preview-selector=".label">
171
- </label>
172
- <label class="happyforms-part-item-description">
173
- <?php _e( 'Description', 'happyforms' ); ?>
174
- <input type="text" class="widefat" name="" value="<%= (typeof description !== 'undefined') ? description : '' %>" data-option-attribute="description" data-preview-selector=".happyforms-part-option__description">
175
- </label>
176
- <label>
177
- <input type="checkbox" name="" value="1" class="default-option-switch"<% if (is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Make this option default', 'happyforms' ); ?>
178
- </label>
179
- <div class="option-actions">
180
- <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
181
- </div>
182
- </li>
183
- <?php
184
  }
185
 
186
  /**
@@ -194,112 +101,14 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
194
  * @return string Markup for the form part.
195
  */
196
  public function frontend_template( $part_data = array(), $form_data = array() ) {
197
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
198
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
199
-
200
- $classes = array('happyforms-part--radio');
201
 
202
- if ( $part_data['width'] ) {
203
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
204
  }
205
 
206
- if ( $part_data['display_type'] == 'block') {
207
- $classes[] = 'display-type--block ';
208
- }
209
-
210
- if ( $part_data['label_placement'] ) {
211
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
212
- }
213
-
214
- if ( !empty( $part_data['css_class'] ) ) {
215
- $classes[] = $part_data['css_class'];
216
- }
217
-
218
- $classes = implode( ' ', $classes );
219
- ?>
220
- <div class="happyforms-part happyforms-part--radio happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
221
- <div class="happyforms-part__wrap">
222
- <label class="happyforms-part__label">
223
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
224
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
225
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
226
- <?php endif; ?>
227
- </label>
228
- <div class="happyforms-part__el">
229
- <?php
230
- if ( isset( $part_data['options']) ) {
231
- $options = $part_data['options'];
232
-
233
- foreach( $options as $option ) {
234
- $option = wp_parse_args( $option, $this->get_option_defaults() );
235
-
236
- $this->frontend_item_template( $part_data, $option, $part_data['required'], $form_data );
237
- }
238
- }
239
- ?>
240
- </div>
241
- <?php happyforms_print_part_description( $part_data ); ?>
242
- <?php
243
- if ( $form_data ) :
244
- happyforms_message_notices( $form_data, $part_data['id'] );
245
- endif;
246
- ?>
247
- </div>
248
- </div>
249
- <?php
250
- }
251
-
252
- /**
253
- * Get front end option (sub-part) template with parsed data.
254
- *
255
- * @since 1.0.0.
256
- *
257
- * @param array $part_data Form part data.
258
- * @param array $option Option (form sub-part) data.
259
- * @param int $requred Required field (1) or not.
260
- *
261
- * @return string Markup for the part option.
262
- */
263
- public function frontend_item_template( $part_data, $option, $required, $form_data = array() ) {
264
- ?>
265
- <div class="happyforms-part__option happyforms-part-option" id="<?php echo esc_attr( $option['id'] ); ?>">
266
- <label class="option-label">
267
- <input type="radio" class="happyforms-visuallyhidden" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> checked<?php endif; ?><?php if ( 1 === intval( $required ) ) : ?> required aria-required="true"<?php endif; ?>>
268
- <span class="checkmark"></span>
269
- <span class="border"></span>
270
-
271
- <?php if ( is_customize_preview() || !empty( $option['label'] ) ) : ?>
272
- <span class="label"><?php echo esc_attr( $option['label'] ); ?></span>
273
- <?php endif; ?>
274
- </label>
275
- <?php if ( is_customize_preview() || !empty( $option['description'] ) ) : ?>
276
- <span class="happyforms-part-option__description">
277
- <?php echo esc_attr( $option['description'] ); ?>
278
- </span>
279
- <?php endif; ?>
280
- </div>
281
- <?php
282
- }
283
-
284
- /**
285
- * Get option's Backbone template for preview purposes. Passed to previewer to create a new Backbone view.
286
- *
287
- * @since 1.0.0.
288
- *
289
- * @return string Backbone template.
290
- */
291
- public function preview_option_template() {
292
- ?>
293
- <div class="happyforms-part__option happyforms-part-option">
294
- <label class="option-label" id="<%= id %>">
295
- <input type="radio" name="" value="<%= label %>">
296
- <span class="checkmark"></span>
297
- <span class="border"></span>
298
- <span class="label"><%= label %></span>
299
- </label>
300
- <span class="happyforms-part-option__description"><%= description %></span>
301
- </div>
302
- <?php
303
  }
304
 
305
  /**
@@ -350,12 +159,12 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
350
  *
351
  * @return string
352
  */
353
- public function sanitize_value( $part_data = array() ) {
354
  $sanitized_value = $this->get_default_value();
355
- $part_id = $part_data['id'];
356
 
357
- if ( isset( $_REQUEST[$part_id] ) ) {
358
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
359
  }
360
 
361
  return $sanitized_value;
@@ -372,27 +181,29 @@ class HappyForms_Part_Radio extends HappyForms_Form_Part {
372
  * @return string|object
373
  */
374
  public function validate_value( $part_data, $value ) {
375
- $part_id = $part_data['id'];
376
  $validated_value = $value;
377
 
378
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
379
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
380
  }
381
 
382
- // Check for possible options entered when creating a form. If there's no such option, return WP_Error
383
- $possible_options = array();
384
 
385
- foreach ( $part_data['options'] as $option ) {
386
- array_push( $possible_options, $option['label'] );
 
387
  }
388
 
389
- foreach ( $validated_value as $value ) {
390
- if ( !in_array( $value, $possible_options ) ) {
391
- $validated_value = new WP_Error( $part_id, 'not_valid_value' );
392
- }
 
 
393
  }
394
 
395
- return $validated_value;
396
  }
397
 
398
  }
4
 
5
  public $type = 'radio';
6
  public $template_id = 'happyforms-radio-template';
 
 
7
 
8
  public function __construct() {
9
  $this->label = __( 'Single Choice', 'happyforms' );
10
  $this->description = __( 'For radio buttons allowing one selection.', 'happyforms' );
11
+
12
+ add_filter( 'happyforms_part_class', array( $this, 'html_part_class' ), 10, 3 );
13
  }
14
 
15
  /**
71
  *
72
  * @return array
73
  */
74
+ private function get_option_defaults() {
75
  return array(
76
  'is_default' => 0,
77
  'label' => '',
86
  *
87
  * @return string
88
  */
89
+ public function customize_templates() {
90
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-radio.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
  /**
101
  * @return string Markup for the form part.
102
  */
103
  public function frontend_template( $part_data = array(), $form_data = array() ) {
104
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
105
+ $form = $form_data;
 
 
106
 
107
+ foreach( $part['options'] as $o => $option ) {
108
+ $part['options'][$o] = wp_parse_args( $option, $this->get_option_defaults() );
109
  }
110
 
111
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-radio.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
 
114
  /**
159
  *
160
  * @return string
161
  */
162
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
163
  $sanitized_value = $this->get_default_value();
164
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
165
 
166
+ if ( isset( $_REQUEST[$part_name] ) ) {
167
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
168
  }
169
 
170
  return $sanitized_value;
181
  * @return string|object
182
  */
183
  public function validate_value( $part_data, $value ) {
 
184
  $validated_value = $value;
185
 
186
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
187
+ $validated_value = new WP_Error( 'missing_required_field' );
188
+ return $validated_value;
189
  }
190
 
191
+ $allowed_values = wp_list_pluck( $part_data['options'], 'label' );
 
192
 
193
+ if ( ! in_array( $value, $allowed_values ) ) {
194
+ $validated_value = new WP_Error( 'not_valid_value' );
195
+ return $validated_value;
196
  }
197
 
198
+ return $validated_value;
199
+ }
200
+
201
+ public function html_part_class( $class, $part_data, $form_data ) {
202
+ if ( isset( $part_data['display_type'] ) && 'block' === $part_data['display_type'] ) {
203
+ $class[] = 'display-type--block';
204
  }
205
 
206
+ return $class;
207
  }
208
 
209
  }
inc/classes/parts/class-part-rating.php CHANGED
@@ -65,57 +65,8 @@ class HappyForms_Part_Rating extends HappyForms_Form_Part {
65
  *
66
  * @return string
67
  */
68
- public function customize_template() {
69
- ?>
70
- <p>
71
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
72
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
73
- </p>
74
- <p>
75
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
76
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
77
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
78
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
79
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
80
- </select>
81
- </p>
82
- <p class="label_placement-options" style="display: none">
83
- <label>
84
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
85
- </label>
86
- </p>
87
- <p>
88
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
89
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
90
- </p>
91
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
92
- <label>
93
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
94
- </label>
95
- </p>
96
- <p>
97
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
98
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
99
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
100
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
101
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
102
- </select>
103
- </p>
104
- <p class="width-options" style="display: none">
105
- <label>
106
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
107
- </label>
108
- </p>
109
- <p>
110
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
111
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
112
- </p>
113
- <p>
114
- <label>
115
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
116
- </label>
117
- </p>
118
- <?php
119
  }
120
 
121
  /**
@@ -129,55 +80,10 @@ class HappyForms_Part_Rating extends HappyForms_Form_Part {
129
  * @return string Markup for the form part.
130
  */
131
  public function frontend_template( $part_data = array(), $form_data = array() ) {
132
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
133
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
134
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
135
 
136
- $classes = array('happyforms-part--rating');
137
-
138
- if ( $part_data['width'] ) {
139
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
140
- }
141
-
142
- if ( $part_data['label_placement'] ) {
143
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
144
- }
145
-
146
- if ( !empty( $part_data['css_class'] ) ) {
147
- $classes[] = $part_data['css_class'];
148
- }
149
-
150
- $classes = implode( ' ', $classes );
151
- ?>
152
- <div class="happyforms-part <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
153
- <div class="happyforms-part__wrap">
154
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
155
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
156
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
157
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
158
- <?php endif; ?>
159
- <?php happyforms_print_part_description( $part_data ); ?>
160
- <?php
161
- if ( $form_data ) :
162
- happyforms_message_notices( $form_data, $part_data['id'] );
163
- endif;
164
- ?>
165
- </label>
166
-
167
- <div class="happyforms-part__el">
168
- <input class="happyforms-visuallyhidden" type="radio" value="0" id="<?php echo esc_attr( $part_data['id'] ); ?>_0" name="<?php echo esc_attr( $part_data['id'] ); ?>" checked>
169
-
170
- <?php for ( $i = 1; $i <= $part_data['stars_num']; $i++ ) { ?>
171
- <input class="happyforms-visuallyhidden star_<?php echo esc_attr( $i ); ?>" type="radio" value="<?php echo esc_attr( $i ); ?>" id="<?php echo esc_attr( $part_data['id'] ); ?>_<?php echo esc_attr( $i ); ?>" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>">
172
- <label class="happyforms-star__label" for="<?php echo esc_attr( $part_data['id'] ); ?>_<?php echo esc_attr( $i ); ?>">
173
- <span class="happyforms-visuallyhidden"><?php echo esc_attr( $i ); ?> <?php _e( 'Stars', 'happyforms' ); ?></span>
174
- <svg class="happyforms-star" viewBox="0 0 512 512" fill=""><path class="happyforms-star__star" d="M512 198.525l-176.89-25.704-79.11-160.291-79.108 160.291-176.892 25.704 128 124.769-30.216 176.176 158.216-83.179 158.216 83.179-30.217-176.176 128.001-124.769z"></path></svg>
175
- </label>
176
- <?php } ?>
177
- </div>
178
- </div>
179
- </div>
180
- <?php
181
  }
182
 
183
  /**
@@ -209,12 +115,12 @@ class HappyForms_Part_Rating extends HappyForms_Form_Part {
209
  *
210
  * @return string
211
  */
212
- public function sanitize_value( $part_data = array() ) {
213
  $sanitized_value = $this->get_default_value();
214
- $part_id = $part_data['id'];
215
 
216
- if ( isset( $_REQUEST[$part_id] ) ) {
217
- $sanitized_value = intval( $_REQUEST[$part_id] );
218
  }
219
 
220
  return $sanitized_value;
@@ -231,15 +137,16 @@ class HappyForms_Part_Rating extends HappyForms_Form_Part {
231
  * @return string|object
232
  */
233
  public function validate_value( $part_data, $value ) {
234
- $part_id = $part_data['id'];
235
  $validated_value = $value;
236
 
237
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
238
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
239
  }
240
 
241
  if ( $validated_value < 1 || $validated_value > 5 ) {
242
- $validated_value = new WP_Error( $part_id, 'incorrect_value' );
 
243
  }
244
 
245
  return $validated_value;
65
  *
66
  * @return string
67
  */
68
+ public function customize_templates() {
69
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-rating.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }
71
 
72
  /**
80
  * @return string Markup for the form part.
81
  */
82
  public function frontend_template( $part_data = array(), $form_data = array() ) {
83
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
84
+ $form = $form_data;
 
85
 
86
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-rating.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
88
 
89
  /**
115
  *
116
  * @return string
117
  */
118
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
119
  $sanitized_value = $this->get_default_value();
120
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
121
 
122
+ if ( isset( $_REQUEST[$part_name] ) ) {
123
+ $sanitized_value = intval( $_REQUEST[$part_name] );
124
  }
125
 
126
  return $sanitized_value;
137
  * @return string|object
138
  */
139
  public function validate_value( $part_data, $value ) {
 
140
  $validated_value = $value;
141
 
142
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
143
+ $validated_value = new WP_Error( 'missing_required_field' );
144
+ return $validated_value;
145
  }
146
 
147
  if ( $validated_value < 1 || $validated_value > 5 ) {
148
+ $validated_value = new WP_Error( 'incorrect_value' );
149
+ return $validated_value;
150
  }
151
 
152
  return $validated_value;
inc/classes/parts/class-part-scale.php CHANGED
@@ -3,14 +3,12 @@
3
  class HappyForms_Part_Scale extends HappyForms_Form_Part {
4
 
5
  public $type = 'scale';
6
- public $template_id = 'happyforms-scale-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Scale', 'happyforms' );
10
  $this->description = __( 'For collecting opinions using a horizontal slider.', 'happyforms' );
11
 
12
- add_filter( 'happyforms_preview_dependencies', array( $this, 'preview_dependencies' ) );
13
- add_action( 'happyforms_frontend_form_scripts', array( $this, 'frontend_enqueue_scripts' ) );
14
  }
15
 
16
  /**
@@ -88,81 +86,8 @@ class HappyForms_Part_Scale extends HappyForms_Form_Part {
88
  *
89
  * @return string
90
  */
91
- public function customize_template() {
92
- ?>
93
- <p>
94
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
95
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
96
- </p>
97
- <p>
98
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
99
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
100
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
101
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
102
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
103
- </select>
104
- </p>
105
- <p class="label_placement-options" style="display: none">
106
- <label>
107
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
108
- </label>
109
- </p>
110
- <p>
111
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
112
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
113
- </p>
114
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
115
- <label>
116
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
117
- </label>
118
- </p>
119
- <p>
120
- <label for="<%= instance.id %>_min_label"><?php _e( 'Minimum value label', 'happyforms' ); ?></label>
121
- <input type="text" id="<%= instance.id %>_min_label" class="widefat title" value="<%= instance.min_label %>" data-bind="min_label" />
122
- </p>
123
- <p>
124
- <label for="<%= instance.id %>_max_label"><?php _e( 'Maximum value label', 'happyforms' ); ?></label>
125
- <input type="text" id="<%= instance.id %>_max_label" class="widefat title" value="<%= instance.max_label %>" data-bind="max_label" />
126
- </p>
127
- <p>
128
- <label for="<%= instance.id %>_max_value"><?php _e( 'Maximum accepted value', 'happyforms' ); ?></label>
129
- <input type="text" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
130
- </p>
131
- <p>
132
- <label for="<%= instance.id %>_default_value"><?php _e( 'Default value', 'happyforms' ); ?></label>
133
- <input type="text" id="<%= instance.id %>_default_value" class="widefat title" value="<%= instance.default_value %>" data-bind="default_value" />
134
- </p>
135
- <p>
136
- <label for="<%= instance.id %>_step"><?php _e( 'Step', 'happyforms' ); ?></label>
137
- <select id="<%= instance.id %>_step" data-bind="step" class="widefat">
138
- <option value="1"<%= (instance.step == '1') ? ' selected' : '' %>>1</option>
139
- <option value="0.1"<%= (instance.width == '0.1') ? ' selected' : '' %>>0.1</option>
140
- <option value="10"<%= (instance.width == '10') ? ' selected' : '' %>>10</option>
141
- </select>
142
- </p>
143
- <p>
144
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
145
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
146
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
147
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
148
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
149
- </select>
150
- </p>
151
- <p class="width-options" style="display: none">
152
- <label>
153
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
154
- </label>
155
- </p>
156
- <p>
157
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
158
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
159
- </p>
160
- <p>
161
- <label>
162
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
163
- </label>
164
- </p>
165
- <?php
166
  }
167
 
168
  /**
@@ -176,54 +101,10 @@ class HappyForms_Part_Scale extends HappyForms_Form_Part {
176
  * @return string Markup for the form part.
177
  */
178
  public function frontend_template( $part_data = array(), $form_data = array() ) {
179
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
180
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
181
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
182
 
183
- $classes = array('happyforms-part--scale');
184
-
185
- if ( $part_data['width'] ) {
186
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
187
- }
188
-
189
- if ( $part_data['label_placement'] ) {
190
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
191
- }
192
-
193
- if ( !empty( $part_data['css_class'] ) ) {
194
- $classes[] = $part_data['css_class'] . ' ';
195
- }
196
-
197
- $classes = implode( ' ', $classes );
198
- ?>
199
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
200
- <div class="happyforms-part__wrap">
201
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
202
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
203
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
204
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
205
- <?php endif; ?>
206
- </label>
207
- <?php if ( !empty( $part_data['min_label'] ) || !empty( $part_data['max_Label'] ) || is_customize_preview() ) : ?>
208
- <div class="happyforms-part--scale__labels">
209
- <span class="label-min"><?php echo $part_data['min_label']; ?></span>
210
- <span class="label-max"><?php echo $part_data['max_label']; ?></span>
211
- </div>
212
- <?php endif; ?>
213
- <input id="<?php echo esc_attr( $html_id ); ?>" type="range" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" step="<?php echo esc_attr( $part_data['step'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input"
214
- <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?>
215
- min="<?php echo esc_attr( $part_data['min_value'] ); ?>" max="<?php echo esc_attr( $part_data['max_value'] ); ?>" value="<?php echo esc_attr( $part_data['default_value'] ); ?>"
216
- />
217
- <?php happyforms_print_part_description( $part_data ); ?>
218
- <output for="<?php echo esc_attr( $html_id ); ?>"><?php echo $part_data['default_value']; ?></output>
219
- <?php
220
- if ( $form_data ) :
221
- happyforms_message_notices( $form_data, $part_data['id'] );
222
- endif;
223
- ?>
224
- </div>
225
- </div>
226
- <?php
227
  }
228
 
229
  /**
@@ -255,12 +136,12 @@ class HappyForms_Part_Scale extends HappyForms_Form_Part {
255
  *
256
  * @return string
257
  */
258
- public function sanitize_value( $part_data = array() ) {
259
  $sanitized_value = $this->get_default_value();
260
- $part_id = $part_data['id'];
261
 
262
- if ( isset( $_REQUEST[$part_id] ) ) {
263
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
264
  }
265
 
266
  return $sanitized_value;
@@ -277,15 +158,14 @@ class HappyForms_Part_Scale extends HappyForms_Form_Part {
277
  * @return string|object
278
  */
279
  public function validate_value( $part_data, $value ) {
280
- $part_id = $part_data['id'];
281
  $validated_value = $value;
282
 
283
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
284
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
285
  }
286
 
287
  if ( !is_numeric( $validated_value ) ) {
288
- $validated_value = new WP_Error( $part_id, 'not_a_number' );
289
  }
290
 
291
  return $validated_value;
@@ -310,63 +190,30 @@ class HappyForms_Part_Scale extends HappyForms_Form_Part {
310
  );
311
  }
312
 
313
-
314
- /**
315
- * Filter: dependencies for the preview screen.
316
- *
317
- * @since 1.0.0.
318
- *
319
- * @hooked filter happyforms_preview_dependencies
320
- *
321
- * @param array List of dependencies.
322
- *
323
- * @return array
324
- */
325
- public function preview_dependencies( $deps = array() ) {
326
- wp_register_script(
327
- 'happyforms-part-scale',
328
- happyforms_get_plugin_url() . 'assets/js/frontend/scale.js',
329
- array( 'jquery', 'jquery-ui-autocomplete' ),
330
- false,
331
- true
332
- );
333
-
334
- array_push( $deps, 'happyforms-part-scale' );
335
-
336
- return $deps;
337
- }
338
-
339
- /**
340
- * Action: enqueue additional scripts on the frontend.
341
- *
342
- * @since 1.0.0.
343
- *
344
- * @hooked action happyforms_frontend_form_scripts
345
- *
346
- * @param array List of dependencies.
347
- *
348
- * @return array
349
- */
350
- public function frontend_enqueue_scripts( $form = array() ) {
351
  $form_controller = happyforms_get_form_controller();
352
 
353
- if ( empty( $form ) ) {
354
- return;
 
 
 
355
  }
356
 
357
- if ( empty( $form_controller->get_first_part_by_type( $form, $this->type ) ) ) {
358
- return;
359
  }
360
 
361
  wp_register_script(
362
  'happyforms-part-scale',
363
  happyforms_get_plugin_url() . 'assets/js/frontend/scale.js',
364
- array( 'jquery' ),
365
- false,
366
- true
367
  );
368
 
369
- wp_enqueue_script( 'happyforms-part-scale' );
 
 
370
  }
371
 
372
  }
3
  class HappyForms_Part_Scale extends HappyForms_Form_Part {
4
 
5
  public $type = 'scale';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Scale', 'happyforms' );
9
  $this->description = __( 'For collecting opinions using a horizontal slider.', 'happyforms' );
10
 
11
+ add_filter( 'happyforms_frontend_dependencies', array( $this, 'script_dependencies' ), 10, 2 );
 
12
  }
13
 
14
  /**
86
  *
87
  * @return string
88
  */
89
+ public function customize_templates() {
90
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-scale.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
  /**
101
  * @return string Markup for the form part.
102
  */
103
  public function frontend_template( $part_data = array(), $form_data = array() ) {
104
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
105
+ $form = $form_data;
 
106
 
107
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-scale.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  }
109
 
110
  /**
136
  *
137
  * @return string
138
  */
139
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
140
  $sanitized_value = $this->get_default_value();
141
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
142
 
143
+ if ( isset( $_REQUEST[$part_name] ) ) {
144
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
145
  }
146
 
147
  return $sanitized_value;
158
  * @return string|object
159
  */
160
  public function validate_value( $part_data, $value ) {
 
161
  $validated_value = $value;
162
 
163
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
164
+ $validated_value = new WP_Error( 'missing_required_field' );
165
  }
166
 
167
  if ( !is_numeric( $validated_value ) ) {
168
+ $validated_value = new WP_Error( 'not_a_number' );
169
  }
170
 
171
  return $validated_value;
190
  );
191
  }
192
 
193
+ public function script_dependencies( $deps, $forms ) {
194
+ $contains_scale = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  $form_controller = happyforms_get_form_controller();
196
 
197
+ foreach ( $forms as $form ) {
198
+ if ( $form_controller->get_first_part_by_type( $form, $this->type ) ) {
199
+ $contains_scale = true;
200
+ break;
201
+ }
202
  }
203
 
204
+ if ( ! happyforms_is_preview() && ! $contains_scale ) {
205
+ return $deps;
206
  }
207
 
208
  wp_register_script(
209
  'happyforms-part-scale',
210
  happyforms_get_plugin_url() . 'assets/js/frontend/scale.js',
211
+ array(), false, true
 
 
212
  );
213
 
214
+ $deps[] = 'happyforms-part-scale';
215
+
216
+ return $deps;
217
  }
218
 
219
  }
inc/classes/parts/class-part-select.php CHANGED
@@ -3,9 +3,6 @@
3
  class HappyForms_Part_Select extends HappyForms_Form_Part {
4
 
5
  public $type = 'select';
6
- public $template_id = 'happyforms-select-template';
7
- public $item_customize_template_id = 'happyforms-select-option-customize-template';
8
- public $item_frontend_template_id = 'happyforms-select-option-frontend-template';
9
 
10
  public function __construct() {
11
  $this->label = __( 'Dropdown', 'happyforms' );
@@ -67,7 +64,7 @@ class HappyForms_Part_Select extends HappyForms_Form_Part {
67
  *
68
  * @return array
69
  */
70
- public function get_option_defaults() {
71
  return array(
72
  'is_default' => 0,
73
  'label' => ''
@@ -81,90 +78,8 @@ class HappyForms_Part_Select extends HappyForms_Form_Part {
81
  *
82
  * @return string
83
  */
84
- public function customize_template() {
85
- ?>
86
- <p>
87
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
88
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
89
- </p>
90
- <p>
91
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
92
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
93
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
94
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
95
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
96
- </select>
97
- </p>
98
- <p class="label_placement-options" style="display: none">
99
- <label>
100
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
101
- </label>
102
- </p>
103
- <p>
104
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
105
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
106
- </p>
107
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
108
- <label>
109
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
110
- </label>
111
- </p>
112
- <p>
113
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
114
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
115
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
116
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
117
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
118
- </select>
119
- </p>
120
- <p class="width-options" style="display: none">
121
- <label>
122
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
123
- </label>
124
- </p>
125
- <p>
126
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
127
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
128
- </p>
129
- <p>
130
- <label>
131
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
132
- </label>
133
- </p>
134
- <ul class="options">
135
- <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
136
- <% if ( !instance.options.length ) { %>
137
- <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
138
- <% } %>
139
- </ul>
140
- <p class="links">
141
- <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
142
- </p>
143
- <?php
144
- }
145
-
146
- /**
147
- * Get template for option / sub-part item in customize pane.
148
- *
149
- * @since 1.0.0.
150
- *
151
- * @return string
152
- */
153
- public function customize_item_template() {
154
- ?>
155
- <li class="happyforms-part-widget happyforms-part-widget--sub">
156
- <label>
157
- <?php _e( 'Label', 'happyforms' ); ?>
158
- <input type="text" class="widefat" name="" value="<%= label %>" data-option-attribute="label" data-preview-selector="self">
159
- </label>
160
- <label>
161
- <input type="checkbox" name="" value="1" class="default-option-switch"<% if (is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Make this option default', 'happyforms' ); ?>
162
- </label>
163
- <div class="option-actions">
164
- <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
165
- </div>
166
- </li>
167
- <?php
168
  }
169
 
170
  /**
@@ -178,88 +93,14 @@ class HappyForms_Part_Select extends HappyForms_Form_Part {
178
  * @return string Markup for the form part.
179
  */
180
  public function frontend_template( $part_data = array(), $form_data = array() ) {
181
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
182
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
183
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
184
-
185
- $classes = array('happyforms-part--select');
186
 
187
- if ( $part_data['width'] ) {
188
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
189
  }
190
 
191
- if ( $part_data['label_placement'] ) {
192
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
193
- }
194
-
195
- if ( !empty( $part_data['css_class'] ) ) {
196
- $classes[] = $part_data['css_class'];
197
- }
198
-
199
- $classes = implode( ' ', $classes );
200
- ?>
201
- <div class="happyforms-part happyforms-part--select happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
202
- <div class="happyforms-part__wrap">
203
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
204
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
205
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
206
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
207
- <?php endif; ?>
208
- </label>
209
- <div class="happyforms-part__select-wrap">
210
- <select id="<?php echo esc_attr( $html_id ); ?>" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" class="happyforms-part__el"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
211
- <?php
212
- if ( isset( $part_data['options']) ) {
213
- $options = $part_data['options'];
214
-
215
- foreach( $options as $option ) {
216
- $option = wp_parse_args( $option, $this->get_option_defaults() );
217
-
218
- $this->frontend_item_template( $part_data, $option );
219
- }
220
- }
221
- ?>
222
- </select>
223
- </div>
224
- <?php happyforms_print_part_description( $part_data ); ?>
225
- <?php
226
- if ( $form_data ) :
227
- happyforms_message_notices( $form_data, $part_data['id'] );
228
- endif;
229
- ?>
230
- </div>
231
- </div>
232
- <?php
233
- }
234
-
235
- /**
236
- * Get front end option (sub-part) template with parsed data.
237
- *
238
- * @since 1.0.0.
239
- *
240
- * @param array $part_data Form part data.
241
- * @param array $option Option (form sub-part) data.
242
- * @param int $requred Required field (1) or not.
243
- *
244
- * @return string Markup for the part option.
245
- */
246
- public function frontend_item_template( $part_data, $option ) {
247
- ?>
248
- <option id="<?php echo esc_attr( $option['id'] ); ?>" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> selected<?php endif; ?>><?php echo esc_attr( $option['label'] ); ?></option>
249
- <?php
250
- }
251
-
252
- /**
253
- * Get option's Backbone template for preview purposes. Passed to previewer to create a new Backbone view.
254
- *
255
- * @since 1.0.0.
256
- *
257
- * @return string Backbone template.
258
- */
259
- public function preview_option_template() {
260
- ?>
261
- <option id="<%= id %>" value="<%= label %>"><%= label %></option>
262
- <?php
263
  }
264
 
265
  /**
@@ -310,15 +151,15 @@ class HappyForms_Part_Select extends HappyForms_Form_Part {
310
  *
311
  * @return string
312
  */
313
- public function sanitize_value( $part_data = array() ) {
314
  $sanitized_value = $this->get_default_value();
315
- $part_id = $part_data['id'];
316
 
317
- if ( isset( $_REQUEST[$part_id] ) ) {
318
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
319
-
320
- return $sanitized_value;
321
  }
 
 
322
  }
323
 
324
  /**
@@ -332,22 +173,16 @@ class HappyForms_Part_Select extends HappyForms_Form_Part {
332
  * @return string|object
333
  */
334
  public function validate_value( $part_data, $value ) {
335
- $part_id = $part_data['id'];
336
  $validated_value = $value;
337
 
338
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
339
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
340
  }
341
 
342
- // Check for possible options entered when creating a form. If there's no such option, return WP_Error
343
- $possible_options = array();
344
-
345
- foreach ( $part_data['options'] as $option ) {
346
- array_push( $possible_options, $option['label'] );
347
- }
348
 
349
- if ( !in_array( $validated_value, $possible_options ) ) {
350
- $validated_value = new WP_Error( $part_id, 'not_valid_value' );
351
  }
352
 
353
  return $validated_value;
3
  class HappyForms_Part_Select extends HappyForms_Form_Part {
4
 
5
  public $type = 'select';
 
 
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Dropdown', 'happyforms' );
64
  *
65
  * @return array
66
  */
67
+ private function get_option_defaults() {
68
  return array(
69
  'is_default' => 0,
70
  'label' => ''
78
  *
79
  * @return string
80
  */
81
+ public function customize_templates() {
82
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-select.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
84
 
85
  /**
93
  * @return string Markup for the form part.
94
  */
95
  public function frontend_template( $part_data = array(), $form_data = array() ) {
96
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
97
+ $form = $form_data;
 
 
 
98
 
99
+ foreach( $part['options'] as $o => $option ) {
100
+ $part['options'][$o] = wp_parse_args( $option, $this->get_option_defaults() );
101
  }
102
 
103
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-select.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  }
105
 
106
  /**
151
  *
152
  * @return string
153
  */
154
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
155
  $sanitized_value = $this->get_default_value();
156
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
157
 
158
+ if ( isset( $_REQUEST[$part_name] ) ) {
159
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
 
 
160
  }
161
+
162
+ return $sanitized_value;
163
  }
164
 
165
  /**
173
  * @return string|object
174
  */
175
  public function validate_value( $part_data, $value ) {
 
176
  $validated_value = $value;
177
 
178
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
179
+ $validated_value = new WP_Error( 'missing_required_field' );
180
  }
181
 
182
+ $allowed_values = wp_list_pluck( $part_data['options'], 'label' );
 
 
 
 
 
183
 
184
+ if ( ! in_array( $value, $allowed_values ) ) {
185
+ $validated_value = new WP_Error( 'not_valid_value' );
186
  }
187
 
188
  return $validated_value;
inc/classes/parts/class-part-single-line-text.php CHANGED
@@ -3,7 +3,6 @@
3
  class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
4
 
5
  public $type = 'single_line_text';
6
- public $template_id = 'happyforms-single-line-text-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Short Text', 'happyforms' );
@@ -65,61 +64,8 @@ class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
65
  *
66
  * @return string
67
  */
68
- public function customize_template() {
69
- ?>
70
- <p>
71
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
72
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
73
- </p>
74
- <p>
75
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
76
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
77
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
78
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
79
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
80
- </select>
81
- </p>
82
- <p class="label_placement-options" style="display: none">
83
- <label>
84
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
85
- </label>
86
- </p>
87
- <p>
88
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
89
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
90
- </p>
91
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
92
- <label>
93
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
94
- </label>
95
- </p>
96
- <p>
97
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
98
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
99
- </p>
100
- <p>
101
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
102
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
103
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
104
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
105
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
106
- </select>
107
- </p>
108
- <p class="width-options" style="display: none">
109
- <label>
110
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
111
- </label>
112
- </p>
113
- <p>
114
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
115
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
116
- </p>
117
- <p>
118
- <label>
119
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
120
- </label>
121
- </p>
122
- <?php
123
  }
124
 
125
  /**
@@ -133,44 +79,10 @@ class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
133
  * @return string Markup for the form part.
134
  */
135
  public function frontend_template( $part_data = array(), $form_data = array() ) {
136
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
137
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
138
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
139
 
140
- $classes = array('happyforms-part--single-line-text');
141
-
142
- if ( $part_data['width'] ) {
143
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
144
- }
145
-
146
- if ( $part_data['label_placement'] ) {
147
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
148
- }
149
-
150
- if ( !empty( $part_data['css_class'] ) ) {
151
- $classes[] = $part_data['css_class'] . ' ';
152
- }
153
-
154
- $classes = implode( ' ', $classes );
155
- ?>
156
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
157
- <div class="happyforms-part__wrap">
158
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
159
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
160
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
161
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
162
- <?php endif; ?>
163
- </label>
164
- <input id="<?php echo esc_attr( $html_id ); ?>" type="text" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> />
165
- <?php happyforms_print_part_description( $part_data ); ?>
166
- <?php
167
- if ( $form_data ) :
168
- happyforms_message_notices( $form_data, $part_data['id'] );
169
- endif;
170
- ?>
171
- </div>
172
- </div>
173
- <?php
174
  }
175
 
176
  /**
@@ -198,12 +110,12 @@ class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
198
  *
199
  * @return string
200
  */
201
- public function sanitize_value( $part_data = array() ) {
202
  $sanitized_value = $this->get_default_value();
203
- $part_id = $part_data['id'];
204
 
205
- if ( isset( $_REQUEST[$part_id] ) ) {
206
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
207
  }
208
 
209
  return $sanitized_value;
@@ -220,11 +132,10 @@ class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
220
  * @return string|object
221
  */
222
  public function validate_value( $part_data, $value ) {
223
- $part_id = $part_data['id'];
224
  $validated_value = $value;
225
 
226
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
227
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
228
  }
229
 
230
  return $validated_value;
3
  class HappyForms_Part_SingleLineText extends HappyForms_Form_Part {
4
 
5
  public $type = 'single_line_text';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Short Text', 'happyforms' );
64
  *
65
  * @return string
66
  */
67
+ public function customize_templates() {
68
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-single-line-text.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  }
70
 
71
  /**
79
  * @return string Markup for the form part.
80
  */
81
  public function frontend_template( $part_data = array(), $form_data = array() ) {
82
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
83
+ $form = $form_data;
 
84
 
85
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-single-line-text.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
88
  /**
110
  *
111
  * @return string
112
  */
113
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
114
  $sanitized_value = $this->get_default_value();
115
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
116
 
117
+ if ( isset( $_REQUEST[$part_name] ) ) {
118
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
119
  }
120
 
121
  return $sanitized_value;
132
  * @return string|object
133
  */
134
  public function validate_value( $part_data, $value ) {
 
135
  $validated_value = $value;
136
 
137
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
138
+ $validated_value = new WP_Error( 'missing_required_field' );
139
  }
140
 
141
  return $validated_value;
inc/classes/parts/class-part-title.php CHANGED
@@ -3,7 +3,6 @@
3
  class HappyForms_Part_Title extends HappyForms_Form_Part {
4
 
5
  public $type = 'title';
6
- public $template_id = 'happyforms-title-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Title', 'happyforms' );
@@ -61,57 +60,8 @@ class HappyForms_Part_Title extends HappyForms_Form_Part {
61
  *
62
  * @return string
63
  */
64
- public function customize_template() {
65
- ?>
66
- <p>
67
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
68
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
69
- </p>
70
- <p>
71
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
72
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
73
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
74
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
75
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
76
- </select>
77
- </p>
78
- <p class="label_placement-options" style="display: none">
79
- <label>
80
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
81
- </label>
82
- </p>
83
- <p>
84
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
85
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
86
- </p>
87
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
88
- <label>
89
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
90
- </label>
91
- </p>
92
- <p>
93
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
94
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
95
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
96
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
97
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
98
- </select>
99
- </p>
100
- <p class="width-options" style="display: none">
101
- <label>
102
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
103
- </label>
104
- </p>
105
- <p>
106
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
107
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
108
- </p>
109
- <p>
110
- <label>
111
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
112
- </label>
113
- </p>
114
- <?php
115
  }
116
 
117
  /**
@@ -125,57 +75,10 @@ class HappyForms_Part_Title extends HappyForms_Form_Part {
125
  * @return string Markup for the form part.
126
  */
127
  public function frontend_template( $part_data = array(), $form_data = array() ) {
128
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
129
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
130
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
131
 
132
- $classes = array('happyforms-part--select');
133
-
134
- if ( $part_data['width'] ) {
135
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
136
- }
137
-
138
- if ( $part_data['label_placement'] ) {
139
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
140
- }
141
-
142
- if ( !empty( $part_data['css_class'] ) ) {
143
- $classes[] = $part_data['css_class'];
144
- }
145
-
146
- $classes = implode( ' ', $classes );
147
- ?>
148
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
149
- <div class="happyforms-part__wrap">
150
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
151
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
152
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
153
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
154
- <?php endif; ?>
155
- </label>
156
- <div class="happyforms-part__select-wrap">
157
- <select id="<?php echo esc_attr( $html_id ); ?>" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" class="happyforms-part__el"<?php if ( 1 === $part_data['required'] ) : ?> required aria-required="true"<?php endif; ?>>
158
- <option value="">- <?php _e( 'Select', 'happyforms' ); ?> -</option>
159
- <?php
160
- $honorifics = $this->get_honorifics();
161
-
162
- foreach ( $honorifics as $title ) {
163
- ?>
164
- <option value="<?php echo $title; ?>"><?php echo $title; ?></option>
165
- <?php
166
- }
167
- ?>
168
- </select>
169
- </div>
170
- <?php happyforms_print_part_description( $part_data ); ?>
171
- <?php
172
- if ( $form_data ) :
173
- happyforms_message_notices( $form_data, $part_data['id'] );
174
- endif;
175
- ?>
176
- </div>
177
- </div>
178
- <?php
179
  }
180
 
181
  /**
@@ -187,12 +90,12 @@ class HappyForms_Part_Title extends HappyForms_Form_Part {
187
  */
188
  public function get_honorifics() {
189
  return array(
190
- __('Mr.', 'happyforms' ),
191
- __('Mrs.', 'happyforms' ),
192
- __('Ms.', 'happyforms' ),
193
- __('Miss', 'happyforms' ),
194
- __('Prof.', 'happyforms' ),
195
- __('Dr.', 'happyforms' )
196
  );
197
  }
198
 
@@ -244,12 +147,12 @@ class HappyForms_Part_Title extends HappyForms_Form_Part {
244
  *
245
  * @return string
246
  */
247
- public function sanitize_value( $part_data = array() ) {
248
  $sanitized_value = $this->get_default_value();
249
- $part_id = $part_data['id'];
250
 
251
- if ( isset( $_REQUEST[$part_id] ) ) {
252
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
253
 
254
  return $sanitized_value;
255
  }
@@ -266,18 +169,18 @@ class HappyForms_Part_Title extends HappyForms_Form_Part {
266
  * @return string|object
267
  */
268
  public function validate_value( $part_data, $value ) {
269
- $part_id = $part_data['id'];
270
  $validated_value = $value;
271
 
272
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
273
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
274
  }
275
 
276
- // Check for possible options entered when creating a form. If there's no such option, return WP_Error
277
- $possible_options = $this->get_honorifics();
278
 
279
- if ( !in_array( $validated_value, $possible_options ) ) {
280
- $validated_value = new WP_Error( $part_id, 'not_valid_value' );
 
281
  }
282
 
283
  return $validated_value;
3
  class HappyForms_Part_Title extends HappyForms_Form_Part {
4
 
5
  public $type = 'title';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Title', 'happyforms' );
60
  *
61
  * @return string
62
  */
63
+ public function customize_templates() {
64
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-title.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
 
67
  /**
75
  * @return string Markup for the form part.
76
  */
77
  public function frontend_template( $part_data = array(), $form_data = array() ) {
78
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
79
+ $form = $form_data;
 
80
 
81
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-title.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
 
84
  /**
90
  */
91
  public function get_honorifics() {
92
  return array(
93
+ __( 'Mr.', 'happyforms' ),
94
+ __( 'Mrs.', 'happyforms' ),
95
+ __( 'Ms.', 'happyforms' ),
96
+ __( 'Miss', 'happyforms' ),
97
+ __( 'Prof.', 'happyforms' ),
98
+ __( 'Dr.', 'happyforms' )
99
  );
100
  }
101
 
147
  *
148
  * @return string
149
  */
150
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
151
  $sanitized_value = $this->get_default_value();
152
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
153
 
154
+ if ( isset( $_REQUEST[$part_name] ) ) {
155
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
156
 
157
  return $sanitized_value;
158
  }
169
  * @return string|object
170
  */
171
  public function validate_value( $part_data, $value ) {
 
172
  $validated_value = $value;
173
 
174
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
175
+ $validated_value = new WP_Error( 'missing_required_field' );
176
+ return $validated_value;
177
  }
178
 
179
+ $possible_options = $this->get_honorifics();
 
180
 
181
+ if ( ! in_array( $validated_value, $possible_options ) ) {
182
+ $validated_value = new WP_Error( 'not_valid_value' );
183
+ return $validated_value;
184
  }
185
 
186
  return $validated_value;
inc/classes/parts/class-part-website-url.php CHANGED
@@ -3,7 +3,6 @@
3
  class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
4
 
5
  public $type = 'website_url';
6
- public $template_id = 'happyforms-website-url-template';
7
 
8
  public function __construct() {
9
  $this->label = __( 'Website Link', 'happyforms' );
@@ -65,61 +64,8 @@ class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
65
  *
66
  * @return string
67
  */
68
- public function customize_template() {
69
- ?>
70
- <p>
71
- <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
72
- <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
73
- </p>
74
- <p>
75
- <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
76
- <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
77
- <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
78
- <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
79
- <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
80
- </select>
81
- </p>
82
- <p class="label_placement-options" style="display: none">
83
- <label>
84
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
85
- </label>
86
- </p>
87
- <p>
88
- <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
89
- <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
90
- </p>
91
- <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
92
- <label>
93
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
94
- </label>
95
- </p>
96
- <p>
97
- <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
98
- <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
99
- </p>
100
- <p>
101
- <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
102
- <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
103
- <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
104
- <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
105
- <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
106
- </select>
107
- </p>
108
- <p class="width-options" style="display: none">
109
- <label>
110
- <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
111
- </label>
112
- </p>
113
- <p>
114
- <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
115
- <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
116
- </p>
117
- <p>
118
- <label>
119
- <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
120
- </label>
121
- </p>
122
- <?php
123
  }
124
 
125
  /**
@@ -133,44 +79,10 @@ class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
133
  * @return string Markup for the form part.
134
  */
135
  public function frontend_template( $part_data = array(), $form_data = array() ) {
136
- $part_data = wp_parse_args( $part_data, $this->get_customize_defaults() );
137
- $required_text = ($form_data && $form_data['ID'] != 0) ? get_post_meta( $form_data['ID'], 'hf_style_required_text', true ) : '<%= hf_style_required_text %>';
138
- $html_id = 'happyforms-' . $form_data['ID'] . '_' . esc_attr( $part_data['id'] );
139
 
140
- $classes = array('happyforms-part--url');
141
-
142
- if ( $part_data['width'] ) {
143
- $classes[] = 'happyforms-part--width-' . esc_attr( $part_data['width'] ) . ' ';
144
- }
145
-
146
- if ( $part_data['label_placement'] ) {
147
- $classes[] = 'happyforms-part--label-' . esc_attr( $part_data['label_placement'] ) . ' ';
148
- }
149
-
150
- if ( !empty( $part_data['css_class'] ) ) {
151
- $classes[] = $part_data['css_class'];
152
- }
153
-
154
- $classes = implode( ' ', $classes );
155
- ?>
156
- <div class="happyforms-part happyforms-part-editable <?php echo esc_attr( $classes ); ?>" data-happyforms-id="<?php echo esc_attr( $part_data['id'] ); ?>">
157
- <div class="happyforms-part__wrap">
158
- <label for="<?php echo esc_attr( $html_id ); ?>" class="happyforms-part__label">
159
- <span class="label"><?php echo esc_html( $part_data['label'] ); ?></span>
160
- <?php if ( 1 === intval( $part_data['required'] ) ) : ?>
161
- <span class="happyforms-required"> <?php echo $required_text; ?></span>
162
- <?php endif; ?>
163
- </label>
164
- <input id="<?php echo esc_attr( $html_id ); ?>" type="text" name="<?php echo esc_attr( happyforms_get_part_name( $part_data['id'], $form_data['ID'] ) ); ?>" placeholder="<?php echo esc_attr( $part_data['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part_data['required'] ) : ?>required aria-required="true"<?php endif; ?> />
165
- <?php happyforms_print_part_description( $part_data ); ?>
166
- <?php
167
- if ( $form_data ) :
168
- happyforms_message_notices( $form_data, $part_data['id'] );
169
- endif;
170
- ?>
171
- </div>
172
- </div>
173
- <?php
174
  }
175
 
176
  /**
@@ -202,12 +114,12 @@ class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
202
  *
203
  * @return string
204
  */
205
- public function sanitize_value( $part_data = array() ) {
206
  $sanitized_value = $this->get_default_value();
207
- $part_id = $part_data['id'];
208
 
209
- if ( isset( $_REQUEST[$part_id] ) ) {
210
- $sanitized_value = sanitize_text_field( $_REQUEST[$part_id] );
211
  }
212
 
213
  return $sanitized_value;
@@ -224,15 +136,16 @@ class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
224
  * @return string|object
225
  */
226
  public function validate_value( $part_data, $value ) {
227
- $part_id = $part_data['id'];
228
  $validated_value = $value;
229
 
230
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
231
- $validated_value = new WP_Error( $part_id, 'missing_required_field' );
 
232
  }
233
 
234
- if ( !filter_var( $validated_value, FILTER_VALIDATE_URL ) ) {
235
- $validated_value = new WP_Error( $part_id, 'not_valid_url' );
 
236
  }
237
 
238
  return $validated_value;
3
  class HappyForms_Part_WebsiteUrl extends HappyForms_Form_Part {
4
 
5
  public $type = 'website_url';
 
6
 
7
  public function __construct() {
8
  $this->label = __( 'Website Link', 'happyforms' );
64
  *
65
  * @return string
66
  */
67
+ public function customize_templates() {
68
+ require_once( happyforms_get_include_folder() . '/templates/parts/customize-website-url.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  }
70
 
71
  /**
79
  * @return string Markup for the form part.
80
  */
81
  public function frontend_template( $part_data = array(), $form_data = array() ) {
82
+ $part = wp_parse_args( $part_data, $this->get_customize_defaults() );
83
+ $form = $form_data;
 
84
 
85
+ include( happyforms_get_include_folder() . '/templates/parts/frontend-website-url.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
88
  /**
114
  *
115
  * @return string
116
  */
117
+ public function sanitize_value( $part_data = array(), $form_data = array() ) {
118
  $sanitized_value = $this->get_default_value();
119
+ $part_name = happyforms_get_part_name( $part_data, $form_data );
120
 
121
+ if ( isset( $_REQUEST[$part_name] ) ) {
122
+ $sanitized_value = sanitize_text_field( $_REQUEST[$part_name] );
123
  }
124
 
125
  return $sanitized_value;
136
  * @return string|object
137
  */
138
  public function validate_value( $part_data, $value ) {
 
139
  $validated_value = $value;
140
 
141
  if ( 1 === $part_data['required'] && empty( $validated_value ) ) {
142
+ $validated_value = new WP_Error( 'missing_required_field' );
143
+ return $validated_value;
144
  }
145
 
146
+ if ( '' === esc_url_raw( $validated_value ) || ! wp_parse_url( $validated_value ) ) {
147
+ $validated_value = new WP_Error( 'not_valid_url' );
148
+ return $validated_value;
149
  }
150
 
151
  return $validated_value;
inc/helpers/helper-activation.php CHANGED
@@ -27,6 +27,7 @@ function happyforms_first_run() {
27
  require_once( happyforms_get_include_folder() . '/classes/class-form-controller.php' );
28
  require_once( happyforms_get_include_folder() . '/classes/class-form-styles.php' );
29
  require_once( happyforms_get_include_folder() . '/classes/class-message-controller.php' );
 
30
  require_once( happyforms_get_include_folder() . '/helpers/helper-validation.php' );
31
 
32
  $part_library = happyforms_get_part_library();
27
  require_once( happyforms_get_include_folder() . '/classes/class-form-controller.php' );
28
  require_once( happyforms_get_include_folder() . '/classes/class-form-styles.php' );
29
  require_once( happyforms_get_include_folder() . '/classes/class-message-controller.php' );
30
+ require_once( happyforms_get_include_folder() . '/helpers/helper-form-templates.php' );
31
  require_once( happyforms_get_include_folder() . '/helpers/helper-validation.php' );
32
 
33
  $part_library = happyforms_get_part_library();
inc/helpers/helper-form-templates.php CHANGED
@@ -62,40 +62,13 @@ function happyforms_redirect_field( $form_data ) {
62
 
63
  endif;
64
 
65
- if ( ! function_exists( 'happyforms_honeypot_styles' ) ):
66
- /**
67
- * Output honeypot styles to push the
68
- * honeypot field out of the screen.
69
- *
70
- * @since 1.0
71
- *
72
- * @param array $honeypot Current honeypot metadata.
73
- * @param array $form Current form data.
74
- *
75
- * @return void
76
- */
77
- function happyforms_honeypot_styles( $form ) {
78
- $honeypot_id = happyforms_get_honeypot( $form );
79
- ?>
80
- <style>
81
- #<?php echo $honeypot_id; ?> {
82
- position: absolute;
83
- top: -99999px;
84
- left: -99999px;
85
- }
86
- </style>
87
- <?php
88
- }
89
-
90
- endif;
91
-
92
  if ( ! function_exists( 'happyforms_nonce_field' ) ):
93
  /**
94
  * Output the nonce field for the current form.
95
  *
96
  * @since 1.0
97
  *
98
- * @param array $form Current form data.
99
  *
100
  * @return void
101
  */
@@ -110,45 +83,16 @@ function happyforms_nonce_field( $form ) {
110
 
111
  endif;
112
 
113
- if ( ! function_exists( 'happyforms_get_honeypot' ) ):
114
- /**
115
- * Returns the honeypot field name.
116
- *
117
- * @since 1.2.2
118
- *
119
- * @param array $form Current form data.
120
- *
121
- * @return string
122
- */
123
- function happyforms_get_honeypot( $form ) {
124
- $form_id = $form['ID'];
125
- $part_id = md5( $form_id );
126
- $honeypot_id = "happyforms-{$form_id}_single_line_text_{$part_id}";
127
 
128
- return $honeypot_id;
129
- }
130
-
131
- endif;
132
-
133
- if ( ! function_exists( 'happyforms_honeypot' ) ):
134
- /**
135
- * Output the honeypot field.
136
- *
137
- * @since 1.2.2
138
- *
139
- * @param array $form Current form data.
140
- *
141
- * @return void
142
- */
143
  function happyforms_honeypot( $form ) {
144
- if ( 1 !== intval( $form['spam_prevention'] ) ) {
145
- return;
146
- }
147
 
148
- $honeypot_id = happyforms_get_honeypot( $form );
149
  ?>
150
- <input id="<?php echo esc_attr( $honeypot_id ); ?>" type="text" name="<?php echo esc_attr( $honeypot_id ); ?>" placeholder="" readonly>
151
  <?php
 
152
  }
153
 
154
  endif;
@@ -165,8 +109,8 @@ if ( ! function_exists( 'happyforms_submit' ) ):
165
  */
166
  function happyforms_submit( $form ) {
167
  ?>
168
- <div class="happyforms-part happyforms-part--submit">
169
- <input type="submit" class="happyforms-submit happyforms-button--submit" <?php if ( ! empty( $form['submit_button_label'] ) ): ?>value="<?php echo esc_attr( $form['submit_button_label'] ); ?>"<?php endif; ?><?php if ( $form['hf_style_disable_button_until_required_filled'] == 1 ) : ?> disabled<?php endif; ?>>
170
  </div>
171
  <?php
172
  }
@@ -215,7 +159,7 @@ if ( ! function_exists( 'happyforms_print_part_description' ) ):
215
  function happyforms_print_part_description( $part_data ) {
216
  if ( 1 === intval( $part_data['tooltip_description'] ) || is_customize_preview() ) : ?>
217
  <span class="happyforms-part__tooltip happyforms-tooltip"<?php if ( empty( $part_data['tooltip_description'] ) ) : ?> style="display: none"<?php endif; ?>>
218
- <span class="happyforms-tooltip__trigger">?</span>
219
  <span class="happyforms-part__description"><?php echo esc_html( $part_data['description'] ); ?></span>
220
  </span>
221
  <?php endif; ?>
@@ -232,7 +176,7 @@ if ( ! function_exists( 'happyforms_get_form_action' ) ):
232
  *
233
  * @since 1.1
234
  *
235
- * @param array $form_id Current form id.
236
  *
237
  * @return string
238
  */
@@ -242,7 +186,7 @@ function happyforms_get_form_action( $form_id ) {
242
  *
243
  * @since 1.1
244
  *
245
- * @param string $value The default action, an empty string.
246
  *
247
  * @return string The filtered action value.
248
  */
@@ -257,7 +201,7 @@ if ( ! function_exists( 'happyforms_form_action' ) ):
257
  *
258
  * @since 1.1
259
  *
260
- * @param array $form_id Current form id.
261
  *
262
  * @return void
263
  */
@@ -273,23 +217,384 @@ if ( ! function_exists( 'happyforms_get_part_name' ) ):
273
  *
274
  * @since 1.1
275
  *
276
- * @param array $part_id Current form part id.
277
- * @param array $form_id Current form id.
278
  *
279
  * @return string
280
  */
281
- function happyforms_get_part_name( $part_id, $form_id ) {
 
 
282
  /**
283
  * Filter the field name for this form part.
284
  *
285
  * @since 1.1
286
  *
287
- * @param string $value The default name.
288
- * @param string $form_id The part form id.
 
289
  *
290
  * @return string The filtered part name.
291
  */
292
- return apply_filters( 'happyforms_part_name', $part_id, $form_id );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  }
294
 
295
  endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  endif;
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  if ( ! function_exists( 'happyforms_nonce_field' ) ):
66
  /**
67
  * Output the nonce field for the current form.
68
  *
69
  * @since 1.0
70
  *
71
+ * @param array $form Current form data.
72
  *
73
  * @return void
74
  */
83
 
84
  endif;
85
 
86
+ if ( ! function_exists( 'happyforms_honeypot' ) ) :
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  function happyforms_honeypot( $form ) {
89
+ $controller = happyforms_get_form_controller();
 
 
90
 
91
+ if ( $controller->has_spam_protection( $form ) ) :
92
  ?>
93
+ <input type="checkbox" name="<?php echo $form['ID']; ?>single_line_text_-1" value="1" style="display: none;" tabindex="-1" autocomplete="off">
94
  <?php
95
+ endif;
96
  }
97
 
98
  endif;
109
  */
110
  function happyforms_submit( $form ) {
111
  ?>
112
+ <div class="happyforms-form__part happyforms-part happyforms-part--submit">
113
+ <input type="submit" class="happyforms-submit happyforms-button--submit" <?php if ( ! empty( $form['submit_button_label'] ) ): ?>value="<?php echo esc_attr( $form['submit_button_label'] ); ?>"<?php endif; ?><?php if ( happyforms_get_form_property( $form, 'disable_submit_until_valid' ) ) : ?> disabled<?php endif; ?>>
114
  </div>
115
  <?php
116
  }
159
  function happyforms_print_part_description( $part_data ) {
160
  if ( 1 === intval( $part_data['tooltip_description'] ) || is_customize_preview() ) : ?>
161
  <span class="happyforms-part__tooltip happyforms-tooltip"<?php if ( empty( $part_data['tooltip_description'] ) ) : ?> style="display: none"<?php endif; ?>>
162
+ <span class="happyforms-tooltip__trigger"></span>
163
  <span class="happyforms-part__description"><?php echo esc_html( $part_data['description'] ); ?></span>
164
  </span>
165
  <?php endif; ?>
176
  *
177
  * @since 1.1
178
  *
179
+ * @param array $form_id Current form id.
180
  *
181
  * @return string
182
  */
186
  *
187
  * @since 1.1
188
  *
189
+ * @param string $value The default action, an empty string.
190
  *
191
  * @return string The filtered action value.
192
  */
201
  *
202
  * @since 1.1
203
  *
204
+ * @param array $form_id Current form id.
205
  *
206
  * @return void
207
  */
217
  *
218
  * @since 1.1
219
  *
220
+ * @param array $part_id Current part data.
221
+ * @param array $form_id Current form data.
222
  *
223
  * @return string
224
  */
225
+ function happyforms_get_part_name( $part, $form ) {
226
+ $name = $form['ID'] . '_' . $part['id'];
227
+
228
  /**
229
  * Filter the field name for this form part.
230
  *
231
  * @since 1.1
232
  *
233
+ * @param string $name The default name.
234
+ * @param array $part Current part data.
235
+ * @param array $form Current form data.
236
  *
237
  * @return string The filtered part name.
238
  */
239
+ return apply_filters( 'happyforms_part_name', $name, $part, $form );
240
+ }
241
+
242
+ endif;
243
+
244
+ if ( ! function_exists( 'happyforms_the_part_name' ) ):
245
+ /**
246
+ * Output the current form part field name.
247
+ *
248
+ * @since 1.3
249
+ *
250
+ * @param array $part Current part data.
251
+ * @param array $form Current form data.
252
+ *
253
+ * @return string
254
+ */
255
+ function happyforms_the_part_name( $part, $form ) {
256
+ echo esc_attr( happyforms_get_part_name( $part, $form ) );
257
+ }
258
+
259
+ endif;
260
+
261
+ if ( ! function_exists( 'happyforms_get_form_title' ) ):
262
+ /**
263
+ * Return the form title.
264
+ *
265
+ * @since 1.3
266
+ *
267
+ * @param array $form Current form data.
268
+ *
269
+ * @return string
270
+ */
271
+ function happyforms_get_form_title( $form ) {
272
+ return esc_html( $form['post_title'] );
273
+ }
274
+
275
+ endif;
276
+
277
+ if ( ! function_exists( 'happyforms_the_form_title' ) ):
278
+ /**
279
+ * Output the form title.
280
+ *
281
+ * @since 1.3
282
+ *
283
+ * @param array $form Current form data.
284
+ *
285
+ * @return void
286
+ */
287
+ function happyforms_the_form_title( $form ) {
288
+ $before = '<h3 class="happyforms-form__title">';
289
+ $after = '</h3>';
290
+ $title = happyforms_get_form_title( $form );
291
+ $form_title = "{$before}{$title}{$after}";
292
+
293
+ /**
294
+ * Filter the output of a form title.
295
+ *
296
+ * @since 1.3
297
+ *
298
+ * @param string $form_title Current title markup.
299
+ * @param string $before Content to output before the title.
300
+ * @param string $after Content to output after the title.
301
+ * @param array $form Current form data.
302
+ *
303
+ * @return void
304
+ */
305
+ $form_title = apply_filters( 'happyforms_the_form_title', $form_title, $before, $after, $form );
306
+
307
+ echo $form_title;
308
+ }
309
+
310
+ endif;
311
+
312
+ if ( ! function_exists( 'happyforms_get_form_class' ) ):
313
+ /**
314
+ * Get a form's html class.
315
+ *
316
+ * @since 1.3
317
+ *
318
+ * @param array $form Current form data.
319
+ *
320
+ * @return string
321
+ */
322
+ function happyforms_get_form_class( $form ) {
323
+ /**
324
+ * Filter the list of classes of a form element.
325
+ *
326
+ * @since 1.3
327
+ *
328
+ * @param array $classes List of current classes.
329
+ * @param array $form Current form data.
330
+ *
331
+ * @return string
332
+ */
333
+ $classes = apply_filters( 'happyforms_form_class', array(), $form );
334
+ $classes = implode( ' ', $classes );
335
+
336
+ return $classes;
337
+ }
338
+
339
+ endif;
340
+
341
+ if ( ! function_exists( 'happyforms_the_form_class' ) ):
342
+ /**
343
+ * Output a form's html class.
344
+ *
345
+ * @since 1.3
346
+ *
347
+ * @param array $form Current form data.
348
+ *
349
+ * @return string
350
+ */
351
+ function happyforms_the_form_class( $form ) {
352
+ echo happyforms_get_form_class( $form );
353
+ }
354
+
355
+ endif;
356
+
357
+ if ( ! function_exists( 'happyforms_get_form_part' ) ):
358
+ /**
359
+ * Get a part block markup.
360
+ *
361
+ * @since 1.3
362
+ *
363
+ * @param array $part Current part data.
364
+ * @param array $form Current form data.
365
+ *
366
+ * @return string
367
+ */
368
+ function happyforms_get_form_part( $part, $form ) {
369
+ $html = happyforms_get_part_library()->get_part_template( $part, $form );
370
+
371
+ return $html;
372
+ }
373
+
374
+ endif;
375
+
376
+ if ( ! function_exists( 'happyforms_the_form_part' ) ):
377
+ /**
378
+ * Output a part block.
379
+ *
380
+ * @since 1.3
381
+ *
382
+ * @param array $part Current part data.
383
+ * @param array $form Current form data.
384
+ *
385
+ * @return void
386
+ */
387
+ function happyforms_the_form_part( $part, $form ) {
388
+ echo happyforms_get_form_part( $part, $form );
389
+ }
390
+
391
+ endif;
392
+
393
+ if ( ! function_exists( 'happyforms_get_part_class' ) ):
394
+ /**
395
+ * Get a part wrapper's html classe.
396
+ *
397
+ * @since 1.3
398
+ *
399
+ * @param array $part Current part data.
400
+ * @param array $form Current form data.
401
+ *
402
+ * @return string
403
+ */
404
+ function happyforms_get_part_class( $part, $form ) {
405
+ /**
406
+ * Filter the list of classes of a form part element.
407
+ *
408
+ * @since 1.3
409
+ *
410
+ * @param array $classes List of current classes.
411
+ * @param array $part Current part data.
412
+ * @param array $form Current form data.
413
+ *
414
+ * @return string
415
+ */
416
+ $classes = apply_filters( 'happyforms_part_class', array(), $part, $form );
417
+ $classes = implode( ' ', $classes );
418
+
419
+ return $classes;
420
+ }
421
+
422
+ endif;
423
+
424
+ if ( ! function_exists( 'happyforms_the_part_class' ) ):
425
+ /**
426
+ * Output a part wrapper's html class.
427
+ *
428
+ * @since 1.3
429
+ *
430
+ * @param array $part Current part data.
431
+ * @param array $form Current form data.
432
+ *
433
+ * @return string
434
+ */
435
+ function happyforms_the_part_class( $part, $form ) {
436
+ echo happyforms_get_part_class( $part, $form );
437
+ }
438
+
439
+ endif;
440
+
441
+ if ( ! function_exists( 'happyforms_get_part_id' ) ):
442
+ /**
443
+ * Get a part wrapper's id.
444
+ *
445
+ * @since 1.3
446
+ *
447
+ * @param string $part_id Current part id.
448
+ * @param string $form_id Current form id.
449
+ *
450
+ * @return string
451
+ */
452
+ function happyforms_get_part_id( $part_id, $form_id ) {
453
+ $id = esc_attr( 'happyforms-' . $form_id . '_' . $part_id );
454
+
455
+ /**
456
+ * Filter the html id of a form part element.
457
+ *
458
+ * @since 1.3
459
+ *
460
+ * @param string $id Current part id.
461
+ * @param string $part_id Current part id.
462
+ * @param string $form_id Current form id.
463
+ *
464
+ * @return string
465
+ */
466
+ $id = apply_filters( 'happyforms_part_id', $id, $part_id, $form_id );
467
+
468
+ return $id;
469
  }
470
 
471
  endif;
472
+
473
+ if ( ! function_exists( 'happyforms_the_part_id' ) ):
474
+ /**
475
+ * Outputs a part wrapper's id.
476
+ *
477
+ * @since 1.3
478
+ *
479
+ * @param array $part Current part data.
480
+ * @param array $form Current form data.
481
+ *
482
+ * @return string
483
+ */
484
+ function happyforms_the_part_id( $part, $form ) {
485
+ echo happyforms_get_part_id( $part['id'], $form['ID'] );
486
+ }
487
+
488
+ endif;
489
+
490
+ if ( ! function_exists( 'happyforms_get_form_property' ) ):
491
+ /**
492
+ * Get a form's style property.
493
+ *
494
+ * @since 1.3
495
+ *
496
+ * @param array $form Current form data.
497
+ * @param string $key The key to retrieve the style for.
498
+ *
499
+ * @return string
500
+ */
501
+ function happyforms_get_form_property( $form, $key ) {
502
+ $value = isset( $form[$key] ) ? $form[$key] : '';
503
+
504
+ return $value;
505
+ }
506
+
507
+ endif;
508
+
509
+ if ( ! function_exists( 'happyforms_get_part_data_attributes' ) ) :
510
+ /**
511
+ * Get the html data- attributes of a form part element.
512
+ *
513
+ * @since 1.3
514
+ *
515
+ * @param array $part Current part data.
516
+ * @param array $form Current form data.
517
+ *
518
+ * @return array
519
+ */
520
+ function happyforms_get_part_data_attributes( $part, $form ) {
521
+ /**
522
+ * Filter the html data- attributes of a form part element.
523
+ *
524
+ * @since 1.3
525
+ *
526
+ * @param array $attributes Current part attributes.
527
+ * @param string $part_id Current part data.
528
+ * @param string $form_id Current form data.
529
+ *
530
+ * @return string
531
+ */
532
+ $attributes = apply_filters( 'happyforms_part_data_attributes', array(), $part, $form );
533
+ $data = array();
534
+
535
+ foreach ( $attributes as $attribute => $value ) {
536
+ $data[] = "data-{$attribute}=\"{$value}\"";
537
+ }
538
+
539
+ $data = implode( ' ', $data );
540
+
541
+ return $data;
542
+ }
543
+
544
+ endif;
545
+
546
+ if ( ! function_exists( 'happyforms_the_part_data_attributes' ) ) :
547
+ /**
548
+ * Output a part's html data- attributes
549
+ *
550
+ * @since 1.3
551
+ *
552
+ * @param array $part Current part data.
553
+ * @param array $form Current form data.
554
+ *
555
+ * @return void
556
+ */
557
+ function happyforms_the_part_data_attributes( $part, $form ) {
558
+ echo happyforms_get_part_data_attributes( $part, $form );
559
+ }
560
+
561
+ endif;
562
+
563
+ if ( ! function_exists( 'happyforms_the_part_label' ) ) :
564
+ /**
565
+ * Output a part label
566
+ *
567
+ * @since 1.3
568
+ *
569
+ * @param string $id Current part id.
570
+ * @param array $part Current part data.
571
+ * @param array $form Current form data.
572
+ *
573
+ * @return void
574
+ */
575
+ function happyforms_the_part_label( $part, $form ) {
576
+ ?>
577
+ <label for="<?php happyforms_the_part_id( $part, $form ); ?>" class="happyforms-part__label">
578
+ <span class="label"><?php echo esc_html( $part['label'] ); ?></span>
579
+ <?php if ( isset( $part['required'] ) && 1 === intval( $part['required'] ) ) : ?>
580
+ <span class="happyforms-required"><?php echo happyforms_get_form_property( $form, 'hf_style_required_text' ); ?></span>
581
+ <?php endif; ?>
582
+ </label>
583
+ <?php
584
+ }
585
+
586
+ endif;
587
+
588
+ if ( ! function_exists( 'happyforms_recaptcha' ) ) :
589
+
590
+ function happyforms_recaptcha( $form ) {
591
+ if ( $form['captcha'] ): ?>
592
+ <div class="happyforms-form__part happyforms-part happyforms-part--recaptcha">
593
+ <div class="happyforms-part-wrap">
594
+ <div class="g-recaptcha" data-sitekey="<?php echo $form['captcha_site_key']; ?>"></div>
595
+ </div>
596
+ </div>
597
+ <?php endif;
598
+ }
599
+
600
+ endif;
inc/helpers/helper-misc.php CHANGED
@@ -484,4 +484,32 @@ function happyforms_unread_messages_badge() {
484
  return $badge;
485
  }
486
 
487
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  return $badge;
485
  }
486
 
487
+ endif;
488
+
489
+ if ( ! function_exists( 'happyforms_is_preview' ) ):
490
+ /**
491
+ * Returns whether or not we're previewing a HappyForm.
492
+ *
493
+ * @since 1.3
494
+ *
495
+ * @return void
496
+ */
497
+ function happyforms_is_preview() {
498
+ $post_type = happyforms_get_form_controller()->post_type;
499
+ $is_happyform = get_post_type() === $post_type;
500
+ $happyform_parameter = isset( $_POST['happyforms'] );
501
+
502
+ // Preview frame
503
+ if ( $is_happyform && is_customize_preview() ) {
504
+ return true;
505
+ }
506
+
507
+ // Ajax calls
508
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && $happyform_parameter ) {
509
+ return true;
510
+ }
511
+
512
+ return false;
513
+ }
514
+
515
+ endif;
inc/helpers/helper-styles.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! function_exists( 'happyforms_parse_pixel_value' ) ):
4
+ /**
5
+ * Sanitize checkbox values.
6
+ *
7
+ * @since 1.0
8
+ *
9
+ * @param int|string $value The original value.
10
+ *
11
+ * @return int|string 1 if value was 1, or empty string.
12
+ */
13
+ function happyforms_parse_pixel_value( $value ) {
14
+ return is_numeric( $value ) ? "{$value}px" : $value;
15
+ }
16
+
17
+ endif;
inc/templates/admin-form-modal.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="happyforms-modal">
2
+ <div>
3
+ <select class="happyforms-dialog__select" id="happyforms-dialog-select">
4
+ <?php $forms = $this->get_form_data_array(); ?>
5
+ <option value=""><?php _e( 'Choose a form', 'happyforms' ); ?></option>
6
+ <?php foreach ( $forms as $form ) : ?>
7
+ <option value="<?php echo $form['id']; ?>"><?php echo $form['title']; ?></option>
8
+ <?php endforeach; ?>
9
+ </select>
10
+ </div>
11
+
12
+ <button class="button-primary happyforms-dialog__button"><?php _e( 'Insert', 'happyforms' ); ?></button>
13
+ </div>
14
+
15
+ <script>
16
+ jQuery(function($) {
17
+ $('.happyforms-editor-button').on('click', function() {
18
+ $('#happyforms-modal').dialog({
19
+ title: '<?php _e( 'Insert HappyForm', 'happyforms' ); ?>',
20
+ dialogClass: 'happyforms-dialog wp-dialog',
21
+ draggable: false,
22
+ width: 'auto',
23
+ modal: true,
24
+ resizable: false,
25
+ closeOnEscape: true,
26
+ position: {
27
+ my: 'center',
28
+ at: 'center',
29
+ of: $(window)
30
+ },
31
+ open: function() {
32
+ $('.happyforms-dialog__button').on('click', function(e) {
33
+ e.preventDefault();
34
+ e.stopImmediatePropagation();
35
+
36
+ var selectedForm = $('#happyforms-dialog-select').val();
37
+ if (!selectedForm) {
38
+ return false;
39
+ }
40
+ var shortcode = '[happyforms id="' + selectedForm + '" /]';
41
+ window.parent.send_to_editor(shortcode);
42
+ $('#happyforms-modal').dialog('close');
43
+ $('#happyforms-dialog-select').val('');
44
+ });
45
+ }
46
+ });
47
+ });
48
+ });
49
+ </script>
inc/templates/customize-form-build.php CHANGED
@@ -9,7 +9,7 @@
9
  <label class="customize-control-title">
10
  <?php _e( 'Form Builder', 'happyforms' ); ?>
11
  <span class="happyforms-parts-expand-collapse-wrap">
12
- <a href="#" class="expand-collapse-all collapse" data-collapse-text="<?php _e( 'Collapse all', 'happyforms' ); ?>" data-expand-text="<?php _e( 'Expand all', 'happyforms' ); ?>"><?php _e( 'Collapse all', 'happyforms' ); ?></a>
13
  </span>
14
  </label>
15
  <div class="happyforms-parts-placeholder">
9
  <label class="customize-control-title">
10
  <?php _e( 'Form Builder', 'happyforms' ); ?>
11
  <span class="happyforms-parts-expand-collapse-wrap">
12
+ <a href="#" class="expand-collapse-all <%= ( parts.length > 0 ) ? 'collapse' : 'expand' %>" data-collapse-text="<?php _e( 'Collapse all', 'happyforms' ); ?>" data-expand-text="<?php _e( 'Expand all', 'happyforms' ); ?>"><%= ( parts.length > 0 ) ? '<?php _e( 'Expand all', 'happyforms' ); ?>' : '<?php _e( 'Collapse all', 'happyforms' ); ?>' %></a>
13
  </span>
14
  </label>
15
  <div class="happyforms-parts-placeholder">
inc/templates/customize-form-part-footer.php CHANGED
@@ -1,6 +1,7 @@
1
  </div>
2
  <div class="happyforms-widget-actions">
3
  <a href="#" class="happyforms-form-part-remove"><?php _e( 'Delete', 'happyforms' ); ?></a> |
 
4
  <a href="#" class="happyforms-form-part-close"><?php _e( 'Close', 'happyforms' ); ?></a>
5
  </div>
6
  </div>
1
  </div>
2
  <div class="happyforms-widget-actions">
3
  <a href="#" class="happyforms-form-part-remove"><?php _e( 'Delete', 'happyforms' ); ?></a> |
4
+ <a href="#" class="happyforms-form-part-duplicate"><?php _e( 'Duplicate', 'happyforms' ); ?></a> |
5
  <a href="#" class="happyforms-form-part-close"><?php _e( 'Close', 'happyforms' ); ?></a>
6
  </div>
7
  </div>
inc/templates/customize-form-part-header.php CHANGED
@@ -6,7 +6,7 @@
6
  </button>
7
  </div>
8
  <div class="happyforms-widget-title">
9
- <h3><%= settings.label %></h3>
10
  </div>
11
  </div>
12
  <div class="happyforms-widget-content">
6
  </button>
7
  </div>
8
  <div class="happyforms-widget-title">
9
+ <h3><%= settings.label %><span class="in-widget-title"<% if (!instance.label) { %> style="display: none"<% } %>>: <span><%= (instance.label) ? instance.label : '' %></span></span></h3>
10
  </div>
11
  </div>
12
  <div class="happyforms-widget-content">
inc/templates/customize-form-setup.php CHANGED
@@ -34,6 +34,22 @@
34
  <label for="happyforms-spam-prevention"><?php _e( 'Spam prevention', 'happyforms' ); ?> <i class="fa fa-question-circle" aria-hidden="true" data-pointer="spam_prevention"></i></label>
35
  </div>
36
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  <div class="customize-control customize-control-checkbox">
38
  <div class="customize-inside-control-row" data-pointer-target>
39
  <input type="checkbox" value="1" id="happyforms-save-entries" <% if ( save_entries ) { %>checked="checked"<% } %> data-attribute="save_entries" />
@@ -60,6 +76,9 @@
60
  <script type="text/template" id="happyforms-pointer-spam_prevention">
61
  <?php _e( 'Protect your form against bots by using HoneyPot security.', 'happyforms' ); ?>
62
  </script>
 
 
 
63
  <script type="text/template" id="happyforms-pointer-save_entries">
64
  <?php _e( 'Keep recipients responses stored in your WordPress database.', 'happyforms' ); ?>
65
  </script>
34
  <label for="happyforms-spam-prevention"><?php _e( 'Spam prevention', 'happyforms' ); ?> <i class="fa fa-question-circle" aria-hidden="true" data-pointer="spam_prevention"></i></label>
35
  </div>
36
  </div>
37
+ <div class="customize-control customize-control-checkbox">
38
+ <div class="customize-inside-control-row" data-pointer-target>
39
+ <input type="checkbox" id="happyforms-use-captcha" value="1" <% if ( captcha ) { %>checked="checked"<% } %> data-attribute="captcha" />
40
+ <label for="happyforms-use-captcha"><?php _e( 'Use', 'happyforms' ); ?> <a href="https://www.google.com/recaptcha" target="_blank"><?php _e( 'Google ReCaptcha', 'happyforms' ); ?></a> <i class="fa fa-question-circle" aria-hidden="true" data-pointer="captcha"></i></label>
41
+ </div>
42
+ <div id="happyforms-captcha-settings" <% if ( captcha ) { %>style="display: block;"<% } %>>
43
+ <p>
44
+ <label for="" class="customize-control-title"><?php _e( 'ReCaptcha site key', 'happyforms' ); ?></label>
45
+ <input type="text" value="<%= captcha_site_key %>" data-attribute="captcha_site_key" />
46
+ </p>
47
+ <p>
48
+ <label for="" class="customize-control-title"><?php _e( 'ReCaptcha secret key', 'happyforms' ); ?></label>
49
+ <input type="text" value="<%= captcha_secret_key %>" data-attribute="captcha_secret_key" />
50
+ </p>
51
+ </div>
52
+ </div>
53
  <div class="customize-control customize-control-checkbox">
54
  <div class="customize-inside-control-row" data-pointer-target>
55
  <input type="checkbox" value="1" id="happyforms-save-entries" <% if ( save_entries ) { %>checked="checked"<% } %> data-attribute="save_entries" />
76
  <script type="text/template" id="happyforms-pointer-spam_prevention">
77
  <?php _e( 'Protect your form against bots by using HoneyPot security.', 'happyforms' ); ?>
78
  </script>
79
+ <script type="text/template" id="happyforms-pointer-captcha">
80
+ <?php _e( 'Protect your form against bots using your Google ReCaptcha credentials.', 'happyforms' ); ?>
81
+ </script>
82
  <script type="text/template" id="happyforms-pointer-save_entries">
83
  <?php _e( 'Keep recipients responses stored in your WordPress database.', 'happyforms' ); ?>
84
  </script>
inc/templates/customize-form-style.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- $styles = happyforms_get_styles();
3
- $style_fields = $styles->get_styles();
4
  ?>
5
 
6
  <script type="text/template" id="happyforms-form-style-template">
@@ -8,19 +8,23 @@ $style_fields = $styles->get_styles();
8
  <ul class="happyforms-form-widgets happyforms-style-controls">
9
  <?php
10
  $f = 0;
11
- foreach ( $style_fields as $name => $field ) :
12
- $type = $field['type'];
13
- $name = esc_attr( $name );
14
- $label = isset( $field['label'] ) ? $field['label'] : '';
15
- $control_class = esc_attr( "happyforms-{$type}-control" );
 
16
 
17
  if ( 'divider' === $type ) : ?>
18
 
19
  <?php if ( $f > 0 ): ?></ul></li><?php endif; ?>
20
 
21
- <li class="customize-control control-section <?php echo $control_class; ?>">
22
  <h3 class="accordion-section-title"><?php echo $label; ?></h3>
23
- <ul class="happyforms-style-controls-group inactive">
 
 
 
24
  <li class="panel-meta customize-info accordion-section">
25
  <button class="customize-panel-back" tabindex="0">
26
  <span class="screen-reader-text"><?php _e( 'Back', 'happyforms' ); ?></span>
@@ -32,19 +36,19 @@ $style_fields = $styles->get_styles();
32
 
33
  <?php elseif ( 'checkbox' === $type ) : ?>
34
 
35
- <li class="customize-control <?php echo $control_class; ?>">
36
  <div class="customize-control-content">
37
  <label>
38
- <input type="checkbox" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="1" data-attribute="<?php echo $name; ?>" <% if (<?php echo $name; ?>) { %>checked="checked"<% } %>> <?php echo $label; ?>
39
  </label>
40
  </div>
41
  </li>
42
 
43
  <?php elseif ( 'range' === $type ) : ?>
44
 
45
- <li class="customize-control <?php echo $control_class; ?>">
46
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
47
- <input type="number" name="<?php echo $name; ?>" id="<?php echo $name; ?>" min="<?php echo $field[ 'min' ]; ?>" max="<?php echo $field[ 'max' ]; ?>" step="1" value="<%= <?php echo $name; ?> %>" data-attribute="<?php echo $name; ?>">
48
  <div class="customize-control-content">
49
  <div class="happyforms-range-slider"></div>
50
  </div>
@@ -52,7 +56,7 @@ $style_fields = $styles->get_styles();
52
 
53
  <?php elseif ( 'buttonset' === $type ) : ?>
54
 
55
- <li class="customize-control <?php echo $control_class; ?>">
56
  <div class="customize-control-content">
57
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
58
  <div class="happyforms-buttonset-container">
@@ -68,7 +72,7 @@ $style_fields = $styles->get_styles();
68
 
69
  <?php elseif ( 'color' === $type ) : ?>
70
 
71
- <li class="customize-control <?php echo $control_class; ?>">
72
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
73
  <div class="customize-control-content">
74
  <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" class="happyforms-color-input" data-attribute="<?php echo $name; ?>" value="<%= <?php echo $name; ?> %>" data-default="<?php echo $field['default']; ?>">
@@ -77,16 +81,16 @@ $style_fields = $styles->get_styles();
77
 
78
  <?php elseif ( 'text' === $type ) : ?>
79
 
80
- <li class="customize-control <?php echo $control_class; ?>">
81
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
82
  <div class="customize-control-content">
83
  <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" data-attribute="<?php echo $name; ?>" value="<%= <?php echo $name; ?> %>">
84
  </div>
85
  </li>
86
 
87
- <?php elseif ( 'text' === $type ) : ?>
88
 
89
- <li class="customize-control <?php echo $control_class; ?>">
90
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
91
  <div class="customize-control-content">
92
  <select name="<?php echo $name; ?>" id="<?php echo $name; ?>" data-attribute="<?php echo $name; ?>" class="widefat">
@@ -98,6 +102,12 @@ $style_fields = $styles->get_styles();
98
  </div>
99
  </li>
100
 
 
 
 
 
 
 
101
  <?php endif; ?>
102
  <?php $f ++; endforeach; ?>
103
  </ul></li>
1
  <?php
2
+ $controller = happyforms_get_form_controller();
3
+ $controls = happyforms_get_styles()->get_controls();
4
  ?>
5
 
6
  <script type="text/template" id="happyforms-form-style-template">
8
  <ul class="happyforms-form-widgets happyforms-style-controls">
9
  <?php
10
  $f = 0;
11
+ foreach ( $controls as $control ) :
12
+ $type = $control['type'];
13
+ $label = $control['label'];
14
+ $class = esc_attr( "happyforms-{$type}-control" );
15
+ $name = isset( $control['field'] ) ? $control['field'] : '';
16
+ $field = ( '' !== $name ) ? $controller->get_field( $control['field'] ) : '';
17
 
18
  if ( 'divider' === $type ) : ?>
19
 
20
  <?php if ( $f > 0 ): ?></ul></li><?php endif; ?>
21
 
22
+ <li class="customize-control control-section <?php echo $class; ?>">
23
  <h3 class="accordion-section-title"><?php echo $label; ?></h3>
24
+ </li>
25
+
26
+ <li class="happyforms-style-controls-group">
27
+ <ul>
28
  <li class="panel-meta customize-info accordion-section">
29
  <button class="customize-panel-back" tabindex="0">
30
  <span class="screen-reader-text"><?php _e( 'Back', 'happyforms' ); ?></span>
36
 
37
  <?php elseif ( 'checkbox' === $type ) : ?>
38
 
39
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>">
40
  <div class="customize-control-content">
41
  <label>
42
+ <input type="checkbox" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo $field['value']; ?>" data-attribute="<?php echo $name; ?>" <% if (<?php echo $name; ?>) { %>checked="checked"<% } %>> <?php echo $label; ?>
43
  </label>
44
  </div>
45
  </li>
46
 
47
  <?php elseif ( 'range' === $type ) : ?>
48
 
49
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>" data-variable="<?php echo $field['variable']; ?>" data-unit="<?php echo $field['unit']; ?>">
50
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
51
+ <input type="number" name="<?php echo $name; ?>" id="<?php echo $name; ?>" min="<?php echo $field[ 'min' ]; ?>" max="<?php echo $field[ 'max' ]; ?>" step="<?php echo $field[ 'step' ]; ?>" value="<%= <?php echo $name; ?> %>" data-attribute="<?php echo $name; ?>">
52
  <div class="customize-control-content">
53
  <div class="happyforms-range-slider"></div>
54
  </div>
56
 
57
  <?php elseif ( 'buttonset' === $type ) : ?>
58
 
59
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>" data-variable="<?php echo ( isset( $field['variable'] ) ) ? esc_attr( $field['variable'] ) : ''; ?>">
60
  <div class="customize-control-content">
61
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
62
  <div class="happyforms-buttonset-container">
72
 
73
  <?php elseif ( 'color' === $type ) : ?>
74
 
75
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>" data-variable="<?php echo $field['variable']; ?>">
76
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
77
  <div class="customize-control-content">
78
  <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" class="happyforms-color-input" data-attribute="<?php echo $name; ?>" value="<%= <?php echo $name; ?> %>" data-default="<?php echo $field['default']; ?>">
81
 
82
  <?php elseif ( 'text' === $type ) : ?>
83
 
84
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>">
85
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
86
  <div class="customize-control-content">
87
  <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" data-attribute="<?php echo $name; ?>" value="<%= <?php echo $name; ?> %>">
88
  </div>
89
  </li>
90
 
91
+ <?php elseif ( 'select' === $type ) : ?>
92
 
93
+ <li class="customize-control <?php echo $class; ?>" data-target="<?php echo esc_attr( $field['target'] ); ?>">
94
  <label class="customize-control-title" for="<?php echo $name; ?>"><?php echo $label; ?></label>
95
  <div class="customize-control-content">
96
  <select name="<?php echo $name; ?>" id="<?php echo $name; ?>" data-attribute="<?php echo $name; ?>" class="widefat">
102
  </div>
103
  </li>
104
 
105
+ <?php elseif ( 'heading' === $type ) : ?>
106
+
107
+ <li class="customize-control happyforms-customize-heading">
108
+ <h2><?php echo $label; ?></h2>
109
+ </li>
110
+
111
  <?php endif; ?>
112
  <?php $f ++; endforeach; ?>
113
  </ul></li>
inc/templates/form-styles.css.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- HappyForms CSS variables -->
2
+ <style>
3
+ <?php foreach( $forms as $form ): ?>
4
+ #happyforms-form-<?php echo esc_attr( $form['ID'] ); ?> {
5
+ <?php foreach( $css_vars as $key => $css_var ) {
6
+ $variable = $css_var['variable'];
7
+ $value = $form[$key];
8
+ $unit = isset( $css_var['unit'] ) ? $css_var['unit']: '';
9
+
10
+ echo "{$variable}: {$value}{$unit};\n";
11
+ } ?>
12
+ }
13
+ <?php endforeach; ?>
14
+ </style>
15
+ <!-- End of HappyForms CSS variables -->
inc/templates/parts/customize-address.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-address-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
37
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
38
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
39
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
40
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
41
+ </select>
42
+ </p>
43
+ <p>
44
+ <label for="<%= instance.id %>_mode"><?php _e( 'Mode', 'happyforms' ); ?></label>
45
+ <select id="<%= instance.id %>_mode" name="mode" data-bind="mode" class="widefat">
46
+ <option value="simple"<%= (instance.mode == 'simple') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
47
+ <option value="autocomplete"<%= (instance.mode == 'autocomplete') ? ' selected' : '' %>><?php _e( 'Full with autocomplete', 'happyforms' ); ?></option>
48
+ <option value="country-city"<%= (instance.mode == 'country-city') ? ' selected' : '' %>><?php _e( 'Country and city', 'happyforms' ); ?></option>
49
+ <option value="country"<%= (instance.mode == 'country') ? ' selected' : '' %>><?php _e( 'Country only', 'happyforms' ); ?></option>
50
+ </select>
51
+ </p>
52
+ <div class="address-apikey">
53
+ <p>
54
+ <label for="<%= instance.id %>_apikey"><?php _e( 'Google API Key', 'happyforms' ); ?></label>
55
+ <input type="text" id="<%= instance.id %>_apikey class="widefat title" value="<%= instance.apikey %>" data-bind="apikey" />
56
+ </p>
57
+ <p class="description">
58
+ Autocomplete mode uses the Google Places API to populate results. <a href="https://developers.google.com/places/web-service/get-api-key" target="_blank"><?php _e( 'Get a key for Google Places API Web Service', 'happyforms' ); ?></a>
59
+ </p>
60
+ </div>
61
+ <p>
62
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
63
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
64
+ </p>
65
+ <p>
66
+ <label>
67
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
68
+ </label>
69
+ </p>
70
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
71
+ </script>
inc/templates/parts/customize-checkbox.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-checkbox-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" data-bind="tooltip_description" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_display_type"><?php _e( 'Display options', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_display_type" name="display_type" data-bind="display_type" class="widefat">
32
+ <option value="inline"<%= (instance.display_type == 'inline') ? ' selected' : '' %>><?php _e( 'Horizontal', 'happyforms' ); ?></option>
33
+ <option value="block"<%= (instance.display_type == 'block') ? ' selected' : '' %>><?php _e( 'Vertical', 'happyforms' ); ?></option>
34
+ </select>
35
+ </p>
36
+ <p>
37
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
38
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
39
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
40
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
41
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
42
+ </select>
43
+ </p>
44
+ <p class="width-options" style="display: none">
45
+ <label>
46
+ <input type="checkbox" class="checkbox apply-all-check" value="" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
47
+ </label>
48
+ </p>
49
+ <p>
50
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
51
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
52
+ </p>
53
+ <p>
54
+ <label>
55
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
56
+ </label>
57
+ </p>
58
+ <div class="options">
59
+ <ul></ul>
60
+ <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
61
+ <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
62
+ </div>
63
+ <p class="links">
64
+ <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
65
+ </p>
66
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
67
+ </script>
68
+ <script type="text/template" id="customize-happyforms-checkbox-item-template">
69
+ <li class="happyforms-part-widget happyforms-part-widget--sub" data-item-id="<%= item.id %>">
70
+ <label>
71
+ <?php _e( 'Label', 'happyforms' ); ?>
72
+ <input type="text" class="widefat" name="label" value="<%= item.label %>">
73
+ </label>
74
+ <label>
75
+ <input type="checkbox" name="is_default" value="1" <% if (item.is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Checked by default', 'happyforms' ); ?>
76
+ </label>
77
+ <div class="option-actions">
78
+ <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
79
+ </div>
80
+ </li>
81
+ </script>
inc/templates/parts/customize-date.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-date-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_date_type"><?php _e( 'Show', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_date_type" name="date_type" data-bind="date_type" class="widefat">
32
+ <option value="date"<%= (instance.date_type == 'date') ? ' selected' : '' %>><?php _e( 'Date', 'happyforms' ); ?></option>
33
+ <option value="datetime"<%= (instance.date_type == 'datetime') ? ' selected' : '' %>><?php _e( 'Date &amp; Time', 'happyforms' ); ?></option>
34
+ <option value="time"<%= (instance.date_type == 'time') ? ' selected' : '' %>><?php _e( 'Time', 'happyforms' ); ?></option>
35
+ </select>
36
+ </p>
37
+ <p class="time-options"<%= (instance.date_type == 'date') ? ' style="display: none"' : '' %>>
38
+ <label for="<%= instance.id %>_time_format"><?php _e( 'Time format', 'happyforms' ); ?></label>
39
+ <select id="<%= instance.id %>_time_format" name="time_format" data-bind="time_format" class="widefat">
40
+ <option value="12"<%= (instance.time_format == '12') ? ' selected' : '' %>><?php _e( '12h', 'happyforms' ); ?></option>
41
+ <option value="24"<%= (instance.time_format == '24') ? ' selected' : '' %>><?php _e( '24h', 'happyforms' ); ?></option>
42
+ </select>
43
+ </p>
44
+ <p>
45
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
46
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
47
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
48
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
49
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
50
+ </select>
51
+ </p>
52
+ <p class="width-options" style="display: none">
53
+ <label>
54
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
55
+ </label>
56
+ </p>
57
+ <p>
58
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
59
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
60
+ </p>
61
+ <p>
62
+ <label>
63
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
64
+ </label>
65
+ </p>
66
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
67
+ </script>
inc/templates/parts/customize-email.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-email-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside input', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
37
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
38
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
39
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
40
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
41
+ </select>
42
+ </p>
43
+ <p class="width-options" style="display: none">
44
+ <label>
45
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
46
+ </label>
47
+ </p>
48
+ <p>
49
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
50
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
51
+ </p>
52
+ <p>
53
+ <label>
54
+ <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
55
+ </label>
56
+ </p>
57
+ <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
58
+ <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
59
+ <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
60
+ </p>
61
+ <p>
62
+ <label>
63
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
64
+ </label>
65
+ </p>
66
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
67
+ </script>
inc/templates/parts/customize-legal.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-legal-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
5
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
6
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
7
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
8
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
9
+ </select>
10
+ </p>
11
+ <p>
12
+ <label for="<%= instance.id %>_legal_text"><?php _e( 'Legal text', 'happyforms' ); ?></label>
13
+ <textarea id="<%= instance.id %>_legal_text" rows="5" name="legal_text" data-bind="legal_text" class="widefat"><%= instance.legal_text %></textarea>
14
+ </p>
15
+ <p>
16
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
17
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
18
+ </p>
19
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
20
+ </script>
inc/templates/parts/customize-multi-line-text.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-multi-line-text-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
37
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
38
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
39
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
40
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
41
+ </select>
42
+ </p>
43
+ <p class="width-options" style="display: none">
44
+ <label>
45
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
46
+ </label>
47
+ </p>
48
+ <p>
49
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
50
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
51
+ </p>
52
+ <p>
53
+ <label>
54
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
55
+ </label>
56
+ </p>
57
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
58
+ </script>
inc/templates/parts/customize-number.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-number-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside input', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <div class="min-max-wrapper" style="display: <%= (instance.masked == 0) ? 'block' : 'none' %>">
36
+ <p>
37
+ <label for="<%= instance.id %>_min_value"><?php _e( 'Minimum accepted value', 'happyforms' ); ?></label>
38
+ <input type="text" id="<%= instance.id %>_min_value" class="widefat title" value="<%= instance.min_value %>" data-bind="min_value" />
39
+ </p>
40
+ <p>
41
+ <label for="<%= instance.id %>_max_value"><?php _e( 'Maximum accepted value', 'happyforms' ); ?></label>
42
+ <input type="text" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
43
+ </p>
44
+ </div>
45
+ <p>
46
+ <label>
47
+ <input type="checkbox" name="masked" class="checkbox" value="1" <% if ( instance.masked ) { %>checked="checked"<% } %> data-bind="masked" /> <?php _e( 'Mask this input', 'happyforms' ); ?>
48
+ </label>
49
+ </p>
50
+ <div class="mask-wrapper number-options number-options--numeric" style="display: <%= (instance.masked == 1) ? 'block' : 'none' %>">
51
+ <p>
52
+ <label for="<%= instance.id %>_mask_numeric_thousands_delimiter"><?php _e( 'Thousands delimiter', 'happyforms' ); ?></label>
53
+ <input type="text" id="<%= instance.id %>_mask_numeric_thousands_delimiter" class="widefat title" value="<%= instance.mask_numeric_thousands_delimiter %>" data-bind="mask_numeric_thousands_delimiter" />
54
+ </p>
55
+ <p>
56
+ <label for="<%= instance.id %>_mask_numeric_decimal_mark"><?php _e( 'Decimal mark', 'happyforms' ); ?></label>
57
+ <input type="text" id="<%= instance.id %>_mask_numeric_decimal_mark" class="widefat title" value="<%= instance.mask_numeric_decimal_mark %>" data-bind="mask_numeric_decimal_mark" />
58
+ </p>
59
+ <p>
60
+ <label for="<%= instance.id %>_mask_numeric_prefix"><?php _e( 'Prefix', 'happyforms' ); ?></label>
61
+ <input type="text" id="<%= instance.id %>_mask_numeric_prefix" class="widefat title" value="<%= instance.mask_numeric_prefix %>" data-bind="mask_numeric_prefix" />
62
+ </p>
63
+ </div>
64
+ <p>
65
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
66
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
67
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
68
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
69
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
70
+ </select>
71
+ </p>
72
+ <p class="width-options" style="display: none">
73
+ <label>
74
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
75
+ </label>
76
+ </p>
77
+ <p>
78
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
79
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
80
+ </p>
81
+ <p>
82
+ <label>
83
+ <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
84
+ </label>
85
+ </p>
86
+ <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
87
+ <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
88
+ <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
89
+ </p>
90
+ <p>
91
+ <label>
92
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
93
+ </label>
94
+ </p>
95
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
96
+ </script>
inc/templates/parts/customize-phone.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-phone-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label>
37
+ <input type="checkbox" name="masked" class="checkbox" value="1" <% if ( instance.masked ) { %>checked="checked"<% } %> data-bind="masked" /> <?php _e( 'Mask this input', 'happyforms' ); ?>
38
+ </label>
39
+ </p>
40
+ <div class="number-options number-options--phone" style="display: <%= (instance.masked == 1) ? 'block' : 'none' %>">
41
+ <p>
42
+ <label for="<%= instance.id %>_mask_phone_country"><?php _e( 'Pre-format phone number region', 'happyforms' ); ?></label>
43
+ <select id="<%= instance.id %>_mask_phone_country" class="widefat title" data-bind="mask_phone_country">
44
+ <option value="">- <?php _e( 'Select', 'happyforms' ); ?> -</option>
45
+ <?php
46
+ $phone_countries = $this->get_phone_countries_array();
47
+
48
+ foreach ( $phone_countries as $country_code => $country ) {
49
+ echo '<option value="'. $country['code'] .'"<% if (instance.mask_phone_country == "'. $country['code'] .'") { %> selected<% } %>>'. ucwords( strtolower( $country['name'] ) ) .'</option>';
50
+ }
51
+ ?>
52
+ </select>
53
+ </p>
54
+ </div>
55
+ <p>
56
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
57
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
58
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
59
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
60
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
61
+ </select>
62
+ </p>
63
+ <p class="width-options" style="display: none">
64
+ <label>
65
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
66
+ </label>
67
+ </p>
68
+ <p>
69
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
70
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
71
+ </p>
72
+ <p>
73
+ <label>
74
+ <input type="checkbox" class="checkbox confirmation-checkbox" value="1" <% if ( instance.confirmation_field ) { %>checked="checked"<% } %> data-bind="confirmation_field" /> <?php _e( 'Require confirmation of the value', 'happyforms' ); ?>
75
+ </label>
76
+ </p>
77
+ <p class="confirmation-field-setting" style="display: <%= (instance.confirmation_field == 1) ? 'block' : 'none' %>">
78
+ <label for="<%= instance.id %>_confirmation_field_label"><?php _e( 'Confirmation field title', 'happyforms' ); ?></label>
79
+ <input type="text" id="<%= instance.id %>_confirmation_field_label" class="widefat title" value="<%= instance.confirmation_field_label %>" data-bind="confirmation_field_label" />
80
+ </p>
81
+ <p>
82
+ <label>
83
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
84
+ </label>
85
+ </p>
86
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
87
+ </script>
inc/templates/parts/customize-placeholder.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-placeholder-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_placeholder_text"><?php _e( 'Text', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_placeholder_text" class="widefat title" name="placeholder_text" data-bind="placeholder_text"><%= instance.placeholder_text %></textarea>
23
+ </p>
24
+ <p>
25
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
26
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
27
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
28
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
29
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
30
+ </select>
31
+ </p>
32
+ <p class="width-options" style="display: none">
33
+ <label>
34
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
35
+ </label>
36
+ </p>
37
+ <p>
38
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
39
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
40
+ </p>
41
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
42
+ </script>
inc/templates/parts/customize-radio.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-radio-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_display_type"><?php _e( 'Display options', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_display_type" name="display_type" data-bind="display_type" class="widefat">
32
+ <option value="inline"<%= (instance.display_type == 'inline') ? ' selected' : '' %>><?php _e( 'Horizontal', 'happyforms' ); ?></option>
33
+ <option value="block"<%= (instance.display_type == 'block') ? ' selected' : '' %>><?php _e( 'Vertical', 'happyforms' ); ?></option>
34
+ </select>
35
+ </p>
36
+ <p>
37
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
38
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
39
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
40
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
41
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
42
+ </select>
43
+ </p>
44
+ <p class="width-options" style="display: none">
45
+ <label>
46
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
47
+ </label>
48
+ </p>
49
+ <p>
50
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
51
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
52
+ </p>
53
+ <p>
54
+ <label>
55
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
56
+ </label>
57
+ </p>
58
+ <div class="options">
59
+ <ul></ul>
60
+ <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
61
+ <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
62
+ </div>
63
+ <p class="links">
64
+ <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
65
+ </p>
66
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
67
+ </script>
68
+ <script type="text/template" id="customize-happyforms-radio-item-template">
69
+ <li class="happyforms-part-widget happyforms-part-widget--sub" data-item-id="<%= item.id %>">
70
+ <label>
71
+ <?php _e( 'Label', 'happyforms' ); ?>
72
+ <input type="text" class="widefat" name="option_label" value="<%= item.label %>" data-option-attribute="label">
73
+ </label>
74
+ <label class="happyforms-part-item-description">
75
+ <?php _e( 'Description', 'happyforms' ); ?>
76
+ <input type="text" class="widefat" name="option_description" value="<%= (typeof item.description !== 'undefined') ? item.description : '' %>" data-option-attribute="description">
77
+ </label>
78
+ <label>
79
+ <input type="checkbox" name="option_is_default" value="1" class="default-option-switch"<% if (item.is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Make this option default', 'happyforms' ); ?>
80
+ </label>
81
+ <div class="option-actions">
82
+ <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
83
+ </div>
84
+ </li>
85
+ </script>
inc/templates/parts/customize-rating.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-rating-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
32
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
33
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
34
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
35
+ </select>
36
+ </p>
37
+ <p class="width-options" style="display: none">
38
+ <label>
39
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
40
+ </label>
41
+ </p>
42
+ <p>
43
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
44
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
45
+ </p>
46
+ <p>
47
+ <label>
48
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
49
+ </label>
50
+ </p>
51
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
52
+ </script>
inc/templates/parts/customize-scale.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-scale-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_min_label"><?php _e( 'Minimum value label', 'happyforms' ); ?></label>
31
+ <input type="text" id="<%= instance.id %>_min_label" class="widefat title" value="<%= instance.min_label %>" data-bind="min_label" />
32
+ </p>
33
+ <p>
34
+ <label for="<%= instance.id %>_max_label"><?php _e( 'Maximum value label', 'happyforms' ); ?></label>
35
+ <input type="text" id="<%= instance.id %>_max_label" class="widefat title" value="<%= instance.max_label %>" data-bind="max_label" />
36
+ </p>
37
+ <p>
38
+ <label for="<%= instance.id %>_max_value"><?php _e( 'Minimum accepted value', 'happyforms' ); ?></label>
39
+ <input type="text" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.min_value %>" data-bind="min_value" />
40
+ </p>
41
+ <p>
42
+ <label for="<%= instance.id %>_max_value"><?php _e( 'Maximum accepted value', 'happyforms' ); ?></label>
43
+ <input type="text" id="<%= instance.id %>_max_value" class="widefat title" value="<%= instance.max_value %>" data-bind="max_value" />
44
+ </p>
45
+ <p>
46
+ <label for="<%= instance.id %>_default_value"><?php _e( 'Default value', 'happyforms' ); ?></label>
47
+ <input type="text" id="<%= instance.id %>_default_value" class="widefat title" value="<%= instance.default_value %>" data-bind="default_value" />
48
+ </p>
49
+ <p>
50
+ <label for="<%= instance.id %>_step"><?php _e( 'Step', 'happyforms' ); ?></label>
51
+ <select id="<%= instance.id %>_step" data-bind="step" class="widefat">
52
+ <option value="1"<%= (instance.step == '1') ? ' selected' : '' %>>1</option>
53
+ <option value="0.1"<%= (instance.width == '0.1') ? ' selected' : '' %>>0.1</option>
54
+ <option value="10"<%= (instance.width == '10') ? ' selected' : '' %>>10</option>
55
+ </select>
56
+ </p>
57
+ <p>
58
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
59
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
60
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
61
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
62
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
63
+ </select>
64
+ </p>
65
+ <p class="width-options" style="display: none">
66
+ <label>
67
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
68
+ </label>
69
+ </p>
70
+ <p>
71
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
72
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
73
+ </p>
74
+ <p>
75
+ <label>
76
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
77
+ </label>
78
+ </p>
79
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
80
+ </script>
inc/templates/parts/customize-select.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-select-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
32
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
33
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
34
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
35
+ </select>
36
+ </p>
37
+ <p class="width-options" style="display: none">
38
+ <label>
39
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
40
+ </label>
41
+ </p>
42
+ <p>
43
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
44
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
45
+ </p>
46
+ <p>
47
+ <label>
48
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
49
+ </label>
50
+ </p>
51
+ <div class="options">
52
+ <ul></ul>
53
+ <h3><?php _e( 'Options', 'happyforms' ); ?></h3>
54
+ <p class="no-options"><?php _e( 'No options added yet. Add one by clicking the <i>Add option</i> link below.', 'happyforms' ); ?></p>
55
+ </div>
56
+ <p class="links">
57
+ <a href="#" class="show-all-options" style="display: none"><?php _e( 'Show all', 'happyforms' ); ?> <span></span> <?php _e( 'options', 'happyforms' ); ?></a>
58
+ <a href="#" class="add-option"><?php _e( 'Add option', 'happyforms' ); ?></a>
59
+ </p>
60
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
61
+ </script>
62
+ <script type="text/template" id="customize-happyforms-select-item-template">
63
+ <li class="happyforms-part-widget happyforms-part-widget--sub" data-item-id="<%= item.id %>">
64
+ <label>
65
+ <?php _e( 'Label', 'happyforms' ); ?>
66
+ <input type="text" class="widefat" name="label" value="<%= item.label %>" data-option-attribute="label">
67
+ </label>
68
+ <label>
69
+ <input type="checkbox" name="is_default" value="1" class="default-option-switch"<% if (item.is_default == 1) { %> checked="checked"<% } %>> <?php _e( 'Make this option default', 'happyforms' ); ?>
70
+ </label>
71
+ <div class="option-actions">
72
+ <a href="#" class="delete-option"><?php _e( 'Delete', 'happyforms' ); ?></a>
73
+ </div>
74
+ </li>
75
+ </script>
inc/templates/parts/customize-single-line-text.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-single-line-text-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside input', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
37
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
38
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
39
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
40
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
41
+ </select>
42
+ </p>
43
+ <p class="width-options" style="display: none">
44
+ <label>
45
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
46
+ </label>
47
+ </p>
48
+ <p>
49
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
50
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
51
+ </p>
52
+ <p>
53
+ <label>
54
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
55
+ </label>
56
+ </p>
57
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
58
+ </script>
inc/templates/parts/customize-title.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="happyforms-customize-title-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ </select>
14
+ </p>
15
+ <p class="label_placement-options" style="display: none">
16
+ <label>
17
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
18
+ </label>
19
+ </p>
20
+ <p>
21
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
22
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
23
+ </p>
24
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
25
+ <label>
26
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
27
+ </label>
28
+ </p>
29
+ <p>
30
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
31
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
32
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
33
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
34
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
35
+ </select>
36
+ </p>
37
+ <p class="width-options" style="display: none">
38
+ <label>
39
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
40
+ </label>
41
+ </p>
42
+ <p>
43
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
44
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
45
+ </p>
46
+ <p>
47
+ <label>
48
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
49
+ </label>
50
+ </p>
51
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
52
+ </script>
inc/templates/parts/customize-website-url.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/template" id="customize-happyforms-website-url-template">
2
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-header.php' ); ?>
3
+ <p>
4
+ <label for="<%= instance.id %>_title"><?php _e( 'Title', 'happyforms' ); ?></label>
5
+ <input type="text" id="<%= instance.id %>_title" class="widefat title" value="<%= instance.label %>" data-bind="label" />
6
+ </p>
7
+ <p>
8
+ <label for="<%= instance.id %>_label_placement"><?php _e( 'Title placement', 'happyforms' ); ?></label>
9
+ <select id="<%= instance.id %>_label_placement" data-bind="label_placement">
10
+ <option value="above"<%= (instance.label_placement == 'above') ? ' selected' : '' %>><?php _e( 'Above', 'happyforms' ); ?></option>
11
+ <option value="left"<%= (instance.label_placement == 'left') ? ' selected' : '' %>><?php _e( 'Left', 'happyforms' ); ?></option>
12
+ <option value="below"<%= (instance.label_placement == 'below') ? ' selected' : '' %>><?php _e( 'Below', 'happyforms' ); ?></option>
13
+ <option value="inside"<%= (instance.label_placement == 'inside') ? ' selected' : '' %>><?php _e( 'Inside input', 'happyforms' ); ?></option>
14
+ <option value="as_placeholder"<%= (instance.label_placement == 'as_placeholder') ? ' selected' : '' %>><?php _e( 'Display as placeholder', 'happyforms' ); ?></option>
15
+ </select>
16
+ </p>
17
+ <p class="label_placement-options" style="display: none">
18
+ <label>
19
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="label_placement" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
20
+ </label>
21
+ </p>
22
+ <p>
23
+ <label for="<%= instance.id %>_description"><?php _e( 'Description', 'happyforms' ); ?></label>
24
+ <textarea id="<%= instance.id %>_description" data-bind="description"><%= instance.description %></textarea>
25
+ </p>
26
+ <p class="tooltip-description-wrap" style="display: <%= (instance.description != '') ? 'block' : 'none' %>">
27
+ <label>
28
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.tooltip_description ) { %>checked="checked"<% } %> data-bind="tooltip_description" /> <?php _e( 'Show description in a tooltip', 'happyforms' ); ?>
29
+ </label>
30
+ </p>
31
+ <p>
32
+ <label for="<%= instance.id %>_placeholder"><?php _e( 'Placeholder', 'happyforms' ); ?></label>
33
+ <input type="text" id="<%= instance.id %>_placeholder" class="widefat title" value="<%= instance.placeholder %>" data-bind="placeholder" />
34
+ </p>
35
+ <p>
36
+ <label for="<%= instance.id %>_width"><?php _e( 'Width', 'happyforms' ); ?></label>
37
+ <select id="<%= instance.id %>_width" name="width" data-bind="width" class="widefat">
38
+ <option value="full"<%= (instance.width == 'full') ? ' selected' : '' %>><?php _e( 'Full', 'happyforms' ); ?></option>
39
+ <option value="half"<%= (instance.width == 'half') ? ' selected' : '' %>><?php _e( 'Half', 'happyforms' ); ?></option>
40
+ <option value="third"<%= (instance.width == 'third') ? ' selected' : '' %>><?php _e( 'One third', 'happyforms' ); ?></option>
41
+ </select>
42
+ </p>
43
+ <p class="width-options" style="display: none">
44
+ <label>
45
+ <input type="checkbox" class="checkbox apply-all-check" value="" data-apply-to="width" /> <?php _e( 'Apply to all parts', 'happyforms' ); ?>
46
+ </label>
47
+ </p>
48
+ <p>
49
+ <label for="<%= instance.id %>_css_class"><?php _e( 'Custom CSS class', 'happyforms' ); ?></label>
50
+ <input type="text" id="<%= instance.id %>_css_class" class="widefat title" value="<%= instance.css_class %>" data-bind="css_class" />
51
+ </p>
52
+ <p>
53
+ <label>
54
+ <input type="checkbox" class="checkbox" value="1" <% if ( instance.required ) { %>checked="checked"<% } %> data-bind="required" /> <?php _e( 'This is a required field', 'happyforms' ); ?>
55
+ </label>
56
+ </p>
57
+ <?php include( happyforms_get_include_folder() . '/templates/customize-form-part-footer.php' ); ?>
58
+ </script>
inc/templates/parts/frontend-address.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <?php if ( 'simple' === $part['mode'] ) : ?>
10
+ <div class="happyforms-part-el-wrap">
11
+ <div class="happyforms-part__el">
12
+ <input name="<?php happyforms_the_part_name( $part, $form ); ?>[full]" class="happyforms-part__el--text-input happyforms-part__el--address" type="text" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
13
+ </div>
14
+ </div>
15
+ <?php elseif ( 'autocomplete' === $part['mode'] ) : ?>
16
+ <div class="happyforms-part-el-wrap">
17
+ <div class="happyforms-part__el">
18
+ <input name="<?php happyforms_the_part_name( $part, $form ); ?>[full]" class="happyforms-part__el--text-input happyforms-part__el--address-autocomplete" type="text" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
19
+ <div class="happyforms-part__el--address--results happyforms-part__el--address--results-google"></div>
20
+ </div>
21
+ </div>
22
+ <?php elseif ( 'country' === $part['mode'] ) : ?>
23
+ <div class="happyforms-part-el-wrap">
24
+ <div class="happyforms-part__el">
25
+ <input name="<?php happyforms_the_part_name( $part, $form ); ?>[country]" class="happyforms-part__el--text-input happyforms-part__el--address-autocomplete" type="text" placeholder="<?php _e( 'Country', 'happyforms' ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
26
+ <div class="happyforms-part__el--address--results happyforms-part__el--address--results-country"></div>
27
+ </div>
28
+ </div>
29
+ <?php else: ?>
30
+ <div class="happyforms-part-el-wrap">
31
+ <div class="happyforms-part__el">
32
+ <input name="<?php happyforms_the_part_name( $part, $form ); ?>[country]" class="happyforms-part__el--text-input happyforms-part__el--address-autocomplete" type="text" placeholder="<?php _e( 'Country', 'happyforms' ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> autocomplete="off" />
33
+ <div class="happyforms-part__el--address--results happyforms-part__el--address--results-country"></div>
34
+ </div>
35
+ <div class="happyforms-part__el">
36
+ <input name="<?php happyforms_the_part_name( $part, $form ); ?>[city]"class="happyforms-part__el happyforms-part__el--text-input happyforms-part__el--address-city" type="text" placeholder="<?php _e( 'City', 'happyforms' ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
37
+ </div>
38
+ </div>
39
+ <?php endif; ?>
40
+ <?php if ( 'inside' === $part['label_placement'] ) : ?>
41
+ <?php happyforms_the_part_label( $part, $form ); ?>
42
+ <?php endif; ?>
43
+ <?php happyforms_print_part_description( $part ); ?>
44
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
45
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
46
+ <?php endif; ?>
47
+ </div>
48
+ </div>
inc/templates/parts/frontend-checkbox.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
5
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
6
+ <?php endif; ?>
7
+ <div class="happyforms-part__el">
8
+ <?php foreach( $part['options'] as $option ) : ?>
9
+ <label class="option-label" id="<?php echo esc_attr( $option['id'] ); ?>">
10
+ <input type="checkbox" class="happyforms-visuallyhidden" name="<?php happyforms_the_part_name( $part, $form ); ?>[]" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> checked<?php endif; ?>>
11
+ <span class="checkmark"></span>
12
+ <span class="label"><?php echo esc_attr( $option['label'] ); ?></span>
13
+ </label>
14
+ <?php endforeach; ?>
15
+ </div>
16
+ <?php happyforms_print_part_description( $part ); ?>
17
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
18
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
19
+ <?php endif; ?>
20
+ </div>
21
+ </div>
inc/templates/parts/frontend-date.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'inside' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <div class="happyforms-part__el">
10
+ <?php if ( $part['date_type'] === 'datetime' || $part['date_type'] === 'date' ) : ?>
11
+ <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
12
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[month]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
13
+ <option value=""><?php _e( 'Month', 'happyforms' ); ?></option>
14
+ <?php for ( $i = 1; $i <= 12; $i++ ) : ?>
15
+ <option value="<?php echo $i; ?>"><?php echo date( 'F', mktime( 0, 0, 0, $i) ); ?></option>
16
+ <?php endfor; ?>
17
+ </select>
18
+ </div>
19
+ <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
20
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[day]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
21
+ <option value=""><?php _e( 'Day', 'happyforms' ); ?></option>
22
+ <?php for ( $i = 1; $i <= 31; $i++ ) : ?>
23
+ <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
24
+ <?php endfor; ?>
25
+ </select>
26
+ </div>
27
+ <div class="happyforms-part__select-wrap happyforms-part-date__date-input">
28
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[year]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
29
+ <option value=""><?php _e( 'Year', 'happyforms' ); ?></option>
30
+ <?php
31
+ $year_cutoff = 1910;
32
+ $year_current = date('Y');
33
+
34
+ for ( $i = $year_current; $i >= $year_cutoff; $i-- ) :
35
+ ?>
36
+ <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
37
+ <?php
38
+ endfor;
39
+ ?>
40
+ </select>
41
+ </div>
42
+ <?php endif; ?>
43
+ <?php if ( $part['date_type'] === 'datetime' || $part['date_type'] === 'time' ) : ?>
44
+ <div class="happyforms-part__select-wrap happyforms-part-date__time-input">
45
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[hour]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
46
+ <option value=""><?php _e( 'Hour', 'happyforms' ); ?></option>
47
+ <?php
48
+ if ( 24 === intval( $part['time_format'] ) ) {
49
+ $i_min = 0;
50
+ $i_max = 24;
51
+ } else {
52
+ $i_min = 1;
53
+ $i_max = 13;
54
+ }
55
+
56
+ for ( $i = $i_min; $i < $i_max; $i++ ) : ?>
57
+ <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
58
+ <?php endfor; ?>
59
+ </select>
60
+ </div>
61
+ <div class="happyforms-part__select-wrap happyforms-part-date__time-input">
62
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[minute]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
63
+ <option value=""><?php _e( 'Minute', 'happyforms' ); ?></option>
64
+ <?php
65
+ for ( $i = 0; $i < 60; $i++ ) :
66
+ ?>
67
+ <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
68
+ <?php
69
+ endfor;
70
+ ?>
71
+ </select>
72
+ </div>
73
+ <?php if ( 12 == intval( $part['time_format'] ) ) : ?>
74
+ <div class="happyforms-part__select-wrap happyforms-part-date__time-input happyforms-part-date__time-input--period">
75
+ <select name="<?php happyforms_the_part_name( $part, $form ); ?>[period]"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
76
+ <option value=""><?php _e( 'Period', 'happyforms' ); ?></option>
77
+ <option value="AM"><?php _e( 'AM', 'happyforms' ); ?></option>
78
+ <option value="PM"><?php _e( 'PM', 'happyforms' ); ?></option>
79
+ </select>
80
+ </div>
81
+ <?php endif; ?>
82
+ <?php endif; ?>
83
+ </div>
84
+ <?php if ( 'inside' === $part['label_placement'] ) : ?>
85
+ <?php happyforms_the_part_label( $part, $form ); ?>
86
+ <?php endif; ?>
87
+ <?php happyforms_print_part_description( $part ); ?>
88
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
89
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
90
+ <?php endif; ?>
91
+ </div>
92
+ </div>
inc/templates/parts/frontend-email.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <input type="email" id="<?php happyforms_the_part_id( $part, $form ); ?>" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?> />
10
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
11
+ <?php happyforms_the_part_label( $part, $form ); ?>
12
+ <?php endif; ?>
13
+ <?php happyforms_print_part_description( $part ); ?>
14
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
15
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
16
+ <?php endif; ?>
17
+ </div>
18
+ <?php if ( 1 === intval( $part['confirmation_field'] ) ) : ?>
19
+ <div class="happyforms-part-wrap happyforms-part-wrap--confirmation" id="<?php happyforms_the_part_id( $part, $form ); ?>-part_confirmation">
20
+ <div class="happyforms-message-notices" style="display: none">
21
+ <div class="happyforms-message-notice error">
22
+ <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
23
+ </div>
24
+ </div>
25
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
26
+ <label for="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__label happyforms-part__label--confirmation">
27
+ <span class="label"><?php echo esc_html( $part['confirmation_field_label'] ); ?></span>
28
+ <span class="happyforms-required"><?php echo happyforms_get_form_property( $form, 'hf_style_required_text' ); ?></span>
29
+ </label>
30
+ <?php endif; ?>
31
+ <input type="email" id="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" name="<?php happyforms_the_part_name( $part, $form ); ?>_confirmation" class="happyforms-part__el happyforms-part__el--text-input happyforms-confirmation-input" data-confirmation-of="<?php echo esc_attr( $part['id'] ); ?>" <?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?> />
32
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
33
+ <label for="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__label happyforms-part__label--confirmation">
34
+ <span class="label"><?php echo esc_html( $part['confirmation_field_label'] ); ?></span>
35
+ <span class="happyforms-required"><?php echo happyforms_get_form_property( $form, 'hf_style_required_text' ); ?></span>
36
+ </label>
37
+ <?php endif; ?>
38
+ </div>
39
+ <?php endif; ?>
40
+ </div>
inc/templates/parts/frontend-legal.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <div class="happyforms-part__el">
4
+ <label>
5
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" type="checkbox" name="<?php happyforms_the_part_name( $part, $form ); ?>" value="yes" required aria-required="true" /> <span><?php echo $part['legal_text']; ?></span>
6
+ </label>
7
+ </div>
8
+ </div>
9
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
10
+ </div>
inc/templates/parts/frontend-multi-line-text.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <textarea id="<?php happyforms_the_part_id( $part, $form ); ?>" class="happyforms-part__el happyforms-part__el--text-input" name="<?php happyforms_the_part_name( $part, $form ); ?>" rows="5" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>></textarea>
10
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
11
+ <?php happyforms_the_part_label( $part, $form ); ?>
12
+ <?php endif; ?>
13
+ <?php happyforms_print_part_description( $part ); ?>
14
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
15
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
16
+ <?php endif; ?>
17
+ </div>
18
+ </div>
inc/templates/parts/frontend-number.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <?php if ( ! $part['masked'] ) : ?>
10
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" class="happyforms-part__el happyforms-part__el--text-input" type="number" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" min="<?php echo esc_attr( $part['min_value'] ); ?>" max="<?php echo esc_attr( $part['max_value'] ); ?>" value="<?php echo esc_attr( $part['min_value'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
11
+ <?php else: ?>
12
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" class="happyforms-part__el happyforms-part__el--text-input happyforms-masked-input" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
13
+ <?php endif; ?>
14
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
15
+ <?php happyforms_the_part_label( $part, $form ); ?>
16
+ <?php endif; ?>
17
+ <?php happyforms_print_part_description( $part ); ?>
18
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
19
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
20
+ <?php endif; ?>
21
+ </div>
22
+ <?php if ( 1 === intval( $part['confirmation_field'] ) ) : ?>
23
+ <div class="happyforms-part-wrap happyforms-part-wrap--confirmation" id="<?php happyforms_the_part_id( $part, $form ); ?>-part_confirmation">
24
+ <div class="happyforms-message-notices" style="display: none">
25
+ <div class="happyforms-message-notice error">
26
+ <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
27
+ </div>
28
+ </div>
29
+ <label for="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__label happyforms-part__label--confirmation">
30
+ <span class="label"><?php echo esc_html( $part['confirmation_field_label'] ); ?></span>
31
+ <?php if ( 1 === intval( $part['required'] ) ) : ?>
32
+ <span class="happyforms-required"><?php echo happyforms_get_form_property( $form, 'hf_style_required_text' ); ?></span>
33
+ <?php endif; ?>
34
+ </label>
35
+ <?php if ( ! $part['masked'] ) : ?>
36
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__el happyforms-part__el--text-input happyforms-confirmation-input" type="number" name="<?php happyforms_the_part_name( $part, $form ); ?>_confirmation" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" min="<?php echo esc_attr( $part['min_value'] ); ?>" max="<?php echo esc_attr( $part['max_value'] ); ?>" value="<?php echo esc_attr( $part['min_value'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
37
+ <?php else: ?>
38
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__el happyforms-part__el--text-input happyforms-masked-input happyforms-confirmation-input" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>_confirmation" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
39
+ <?php endif; ?>
40
+ </div>
41
+ <?php endif; ?>
42
+ </div>
inc/templates/parts/frontend-phone.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
10
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
11
+ <?php happyforms_the_part_label( $part, $form ); ?>
12
+ <?php endif; ?>
13
+ <?php happyforms_print_part_description( $part ); ?>
14
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
15
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
16
+ <?php endif; ?>
17
+ </div>
18
+ <?php if ( 1 === intval( $part['confirmation_field'] ) ) : ?>
19
+ <div class="happyforms-part-wrap happyforms-part-wrap--confirmation" id="<?php happyforms_the_part_id( $part, $form ); ?>-part_confirmation">
20
+ <div class="happyforms-message-notices" style="display: none">
21
+ <div class="happyforms-message-notice error">
22
+ <h2><?php _e( 'Fields do not match.', 'happyforms' ); ?></h2>
23
+ </div>
24
+ </div>
25
+ <label for="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" class="happyforms-part__label happyforms-part__label--confirmation">
26
+ <span class="label"><?php echo esc_html( $part['confirmation_field_label'] ); ?></span>
27
+ <?php if ( 1 === intval( $part['required'] ) ) : ?>
28
+ <span class="happyforms-required"><?php echo happyforms_get_form_property( $form, 'hf_style_required_text' ); ?></span>
29
+ <?php endif; ?>
30
+ </label>
31
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>_confirmation" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>_confirmation" class="happyforms-confirmation-input" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
32
+ </div>
33
+ <?php endif; ?>
34
+ </div>
inc/templates/parts/frontend-placeholder.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <div class="happyforms-part__el"><?php echo $part['placeholder_text']; ?></div>
5
+ </div>
6
+ </div>
inc/templates/parts/frontend-radio.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
5
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
6
+ <?php endif; ?>
7
+ <div class="happyforms-part__el">
8
+ <?php foreach( $part['options'] as $option ) : ?>
9
+ <div class="happyforms-part__option happyforms-part-option" id="<?php echo esc_attr( $option['id'] ); ?>">
10
+ <label class="option-label">
11
+ <input type="radio" class="happyforms-visuallyhidden" name="<?php happyforms_the_part_name( $part, $form ); ?>" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> checked<?php endif; ?>>
12
+ <span class="checkmark"></span>
13
+ <span class="border"></span>
14
+ <span class="label"><?php echo esc_attr( $option['label'] ); ?></span>
15
+ </label>
16
+ <span class="happyforms-part-option__description"><?php echo esc_attr( $option['description'] ); ?></span>
17
+ </div>
18
+ <?php endforeach; ?>
19
+ </div>
20
+ <?php happyforms_print_part_description( $part ); ?>
21
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
22
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
23
+ <?php endif; ?>
24
+ </div>
25
+ </div>
inc/templates/parts/frontend-rating.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <div class="happyforms-part__el">
5
+ <input class="happyforms-visuallyhidden" type="radio" value="0" id="<?php echo esc_attr( $part['id'] ); ?>_0" name="<?php happyforms_the_part_name( $part, $form ); ?>" checked>
6
+
7
+ <?php for ( $i = 1; $i <= $part['stars_num']; $i++ ) { ?>
8
+ <input class="happyforms-visuallyhidden star_<?php echo esc_attr( $i ); ?>" type="radio" value="<?php echo esc_attr( $i ); ?>" id="<?php echo esc_attr( $part['id'] ); ?>_<?php echo esc_attr( $i ); ?>" name="<?php happyforms_the_part_name( $part, $form ); ?>">
9
+ <label class="happyforms-star__label" for="<?php echo esc_attr( $part['id'] ); ?>_<?php echo esc_attr( $i ); ?>">
10
+ <span class="happyforms-visuallyhidden"><?php echo esc_attr( $i ); ?> <?php _e( 'Stars', 'happyforms' ); ?></span>
11
+ <svg class="happyforms-star" viewBox="0 0 512 512" fill=""><path class="happyforms-star__star" d="M512 198.525l-176.89-25.704-79.11-160.291-79.108 160.291-176.892 25.704 128 124.769-30.216 176.176 158.216-83.179 158.216 83.179-30.217-176.176 128.001-124.769z"></path></svg>
12
+ </label>
13
+ <?php } ?>
14
+ </div>
15
+ <?php happyforms_print_part_description( $part ); ?>
16
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
17
+ </div>
18
+ </div>
inc/templates/parts/frontend-scale.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
5
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
6
+ <?php endif; ?>
7
+ <div class="happyforms-part--scale__labels">
8
+ <span class="label-min"><?php echo $part['min_label']; ?></span>
9
+ <span class="label-max"><?php echo $part['max_label']; ?></span>
10
+ </div>
11
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" type="range" name="<?php happyforms_the_part_name( $part, $form ); ?>" step="<?php echo esc_attr( $part['step'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input"
12
+ <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?>
13
+ min="<?php echo esc_attr( $part['min_value'] ); ?>" max="<?php echo esc_attr( $part['max_value'] ); ?>" value="<?php echo esc_attr( $part['default_value'] ); ?>"
14
+ />
15
+ <?php happyforms_print_part_description( $part ); ?>
16
+ <output for="<?php happyforms_the_part_id( $part, $form ); ?>"><?php echo $part['default_value']; ?></output>
17
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
18
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
19
+ <?php endif; ?>
20
+ </div>
21
+ </div>
inc/templates/parts/frontend-select.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
5
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
6
+ <?php endif; ?>
7
+ <div class="happyforms-part__select-wrap">
8
+ <select id="<?php happyforms_the_part_id( $part, $form ); ?>" name="<?php happyforms_the_part_name( $part, $form ); ?>" class="happyforms-part__el"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
9
+ <?php foreach( $part['options'] as $option ) : ?>
10
+ <option id="<?php echo esc_attr( $option['id'] ); ?>" value="<?php echo esc_attr( $option['label'] ); ?>"<?php if ( $option['is_default'] == 1 ) : ?> selected<?php endif; ?>><?php echo esc_attr( $option['label'] ); ?></option>
11
+ <?php endforeach; ?>
12
+ </select>
13
+ </div>
14
+ <?php happyforms_print_part_description( $part ); ?>
15
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
16
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
17
+ <?php endif; ?>
18
+ </div>
19
+ </div>
inc/templates/parts/frontend-single-line-text.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
10
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
11
+ <?php happyforms_the_part_label( $part, $form ); ?>
12
+ <?php endif; ?>
13
+ <?php happyforms_print_part_description( $part ); ?>
14
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
15
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
16
+ <?php endif; ?>
17
+ </div>
18
+ </div>
inc/templates/parts/frontend-title.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php happyforms_the_part_label( $part, $form ); ?>
4
+ <div class="happyforms-part__select-wrap">
5
+ <select id="<?php happyforms_the_part_id( $part, $form ); ?>" name="<?php happyforms_the_part_name( $part, $form ); ?>" class="happyforms-part__el"<?php if ( 1 === $part['required'] ) : ?> required aria-required="true"<?php endif; ?>>
6
+ <option value="">- <?php _e( 'Select', 'happyforms' ); ?> -</option>
7
+ <?php $honorifics = $this->get_honorifics(); foreach ( $honorifics as $title ) : ?>
8
+ <option value="<?php echo $title; ?>"><?php echo $title; ?></option>
9
+ <?php endforeach; ?>
10
+ </select>
11
+ </div>
12
+ <?php happyforms_print_part_description( $part ); ?>
13
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
14
+ </div>
15
+ </div>
inc/templates/parts/frontend-website-url.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="<?php happyforms_the_part_class( $part, $form ); ?>" id="<?php happyforms_the_part_id( $part, $form ); ?>-part" <?php happyforms_the_part_data_attributes( $part, $form ); ?>>
2
+ <div class="happyforms-part-wrap">
3
+ <?php if ( 'as_placeholder' !== $part['label_placement'] ) : ?>
4
+ <?php happyforms_the_part_label( $part, $form ); ?>
5
+ <?php endif; ?>
6
+ <?php if ( 'happyforms-form--part-error-notices-above' === happyforms_get_form_property( $form, 'part_error_notices_location' ) ) : ?>
7
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
8
+ <?php endif; ?>
9
+ <input id="<?php happyforms_the_part_id( $part, $form ); ?>" type="text" name="<?php happyforms_the_part_name( $part, $form ); ?>" placeholder="<?php echo esc_attr( $part['placeholder'] ); ?>" class="happyforms-part__el happyforms-part__el--text-input" <?php if ( 1 === $part['required'] ) : ?>required aria-required="true"<?php endif; ?> />
10
+ <?php if ( 'as_placeholder' === $part['label_placement'] ) : ?>
11
+ <?php happyforms_the_part_label( $part, $form ); ?>
12
+ <?php endif; ?>
13
+ <?php happyforms_print_part_description( $part ); ?>
14
+ <?php if ( 'happyforms-form--part-error-notices-below' === happyforms_get_form_property( $form, 'part_error_notices_location' ) || empty( happyforms_get_form_property( $form, 'part_error_notices_location' ) ) ) : ?>
15
+ <?php happyforms_message_notices( $form, happyforms_get_part_name( $part, $form ) ); ?>
16
+ <?php endif; ?>
17
+ </div>
18
+ </div>
inc/templates/preview-form-edit.php CHANGED
@@ -1,82 +1,41 @@
1
- <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); global $post; ?>
2
  <!DOCTYPE html>
3
- <html>
4
- <head>
5
- <meta charset="utf-8">
6
- <title><?php wp_title(); ?></title>
 
 
 
7
 
8
- <?php wp_head(); ?>
 
 
9
 
10
- <style type="text/css">
11
- <?php require_once( happyforms_get_include_folder() . '/templates/preview-inline.css' ); ?>
12
- </style>
13
- </head>
14
- <body>
15
- <?php $form = happyforms_get_form_controller()->get( $post->ID ); ?>
16
- <div id="happyforms-<?php echo esc_attr( $form['ID'] ); ?>" class="happyforms-form happyforms-form-preview happyforms-container">
17
- <form>
18
- <div id="happyforms-app" class="happyforms-flex" data-happyforms-form-id="<?php echo esc_attr( $form['ID'] ); ?>">
19
- <div id="message" class="updated published notice notice-success">
20
- <p>
21
- <?php
22
- printf(
23
- wp_kses(
24
- __( 'This is a preview of your new HappyForm. Once you’ve finished building, you can add this form to any Page, Post and Widget area. Have questions? <a href="%s" class="happyforms-ask-link" target="_blank">Ask for help in our support forums.</a>', 'happyforms' ),
25
- array( 'a' => array( 'class' => true, 'href' => true, 'target' => true ) )
26
- ),
27
- 'https://wordpress.org/support/plugin/happyforms'
28
- );
29
- ?>
30
- </p>
31
- </div>
32
 
33
- <div class="happyforms-part happyforms-part-editable happyforms-form-title" data-happyforms-form-id="<?php echo esc_attr( $form['ID'] ); ?>" data-happyforms-field-name="post_title">
34
- <h3 class="happyforms-form__title">
35
- <span class="title">
36
- <?php if ( get_the_title() ) { ?>
37
- <?php the_title(); ?>
38
- <?php } else { ?>
39
- <?php _e( 'Form ID', 'happyforms' ); ?> #<?php echo get_the_ID(); ?>
40
- <?php } ?>
41
- </span>
42
- <span class="happyforms-preview-badge">(<?php _e( 'Preview', 'happyforms' ); ?>)</span>
43
- </h3>
44
- </div>
45
 
46
- <?php
47
- foreach( $form['parts'] as $part ) {
48
- happyforms_message_notices( $form, $part['id'] );
49
- echo happyforms_get_part_library()->get_part_template( $part, $form );
50
- }
51
- ?>
52
 
53
- <div class="happyforms-part happyforms-part--submit">
54
- <?php $submit_button_label = get_post_meta( $post->ID, 'submit_button_label', true ); ?>
55
- <button type="submit" class="happyforms-button happyforms-button--submit"><?php echo ( $submit_button_label ) ? $submit_button_label : __( 'Submit Form', 'happyforms' ); ?></button>
56
- </div>
57
 
58
- <div id="happyforms-preview-styles">
59
- <?php do_action( 'happyforms_print_css', $form ); ?>
60
- </div>
61
- </div>
62
- </div>
63
- </form>
64
 
65
- <?php wp_footer(); ?>
 
 
 
66
 
67
- <script>
68
- jQuery(function($) {
69
- $('.happyforms-ask-link').on('click', function() {
70
- window.open($(this).attr('href'));
71
- });
72
 
73
- $('.happyforms-form').on('submit', function(e) {
74
- e.preventDefault();
75
-
76
- return false;
77
- });
78
- });
79
- </script>
80
- </body>
81
  </html>
82
- <?php endwhile; endif; ?>
 
1
  <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title><?php wp_title(); ?></title>
6
+ <?php wp_head(); ?>
7
+ </head>
8
+ <body class="happyforms-preview">
9
 
10
+ <div id="message" class="updated published notice notice-success">
11
+ <p><?php printf( __( 'This is a preview of your new HappyForm. Once you’ve finished building, you can add this form to any Page, Post and Widget area. Have questions? <a href="%s" class="happyforms-ask-link" target="_blank">Ask for help in our support forums.</a>', 'happyforms' ), 'https://wordpress.org/support/plugin/happyforms' ); ?></p>
12
+ </div>
13
 
14
+ <?php
15
+ function happyforms_the_form_title_preview( $title ) {
16
+ $before = '<div class="happyforms-block-editable happyforms-block-editable--title">';
17
+ $after = '</div>';
18
+ $title = "{$before}{$title}{$after}";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ return $title;
21
+ }
 
 
 
 
 
 
 
 
 
 
22
 
23
+ function happyforms_part_class_preview( $classes ) {
24
+ $classes[] = 'happyforms-block-editable happyforms-block-editable--part';
 
 
 
 
25
 
26
+ return $classes;
27
+ }
 
 
28
 
29
+ add_filter( 'happyforms_the_form_title', 'happyforms_the_form_title_preview' );
30
+ add_filter( 'happyforms_part_class', 'happyforms_part_class_preview' );
31
+ ?>
 
 
 
32
 
33
+ <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); global $post; ?>
34
+ <?php $form = happyforms_get_form_controller()->get( $post->ID ); ?>
35
+ <?php require_once( happyforms_get_include_folder() . '/templates/single-form.php' ); ?>
36
+ <?php endwhile; endif; ?>
37
 
38
+ <?php wp_footer(); ?>
 
 
 
 
39
 
40
+ </body>
 
 
 
 
 
 
 
41
  </html>
 
inc/templates/preview-form-new.php DELETED
@@ -1,65 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
-
6
- <?php wp_head(); ?>
7
-
8
- <style type="text/css">
9
- <?php require_once( happyforms_get_include_folder() . '/templates/preview-inline.css' ); ?>
10
- </style>
11
- </head>
12
- <body>
13
- <div id="happyforms-0" class="happyforms-container">
14
- <form class="happyforms-form">
15
- <div id="happyforms-app" class="happyforms-flex" data-happyforms-form-id="0">
16
- <div id="message" class="updated published notice notice-success">
17
- <p>
18
- <?php
19
- printf(
20
- wp_kses(
21
- __( 'This is a preview of your new HappyForm. Once you’ve finished building, you can add this form to any Page, Post and Widget area. Have questions? <a href="%s" class="happyforms-ask-link" target="_blank">Ask for help in our support forums.</a>', 'happyforms' ),
22
- array( 'a' => array( 'class' => true, 'href' => true, 'target' => true ) )
23
- ),
24
- 'https://wordpress.org/support/plugin/happyforms'
25
- );
26
- ?>
27
- </p>
28
- </div>
29
-
30
- <div class="happyforms-part happyforms-part-editable happyforms-form-title" data-happyforms-form-id="0" data-happyforms-field-name="post_title">
31
- <h3 class="happyforms-form__title">
32
- <span class="title"><?php _e( 'Untitled form', 'happyforms' ); ?></span>
33
- <span class="happyforms-preview-badge">(<?php _e( 'Preview', 'happyforms' ); ?>)</span>
34
- </h3>
35
- </div>
36
-
37
- <div class="happyforms-part happyforms-part--submit">
38
- <button type="submit" class="happyforms-button happyforms-button--submit"><?php _e( 'Submit Form', 'happyforms' ); ?></button>
39
- </div>
40
-
41
- <div id="happyforms-preview-styles">
42
- <?php do_action( 'happyforms_print_css', 0 ); ?>
43
- </div>
44
- </div>
45
- </div>
46
- </form>
47
-
48
- <?php wp_footer(); ?>
49
-
50
- <script>
51
- jQuery(function($) {
52
- $('.happyforms-ask-link').on('click', function() {
53
- window.open($(this).attr('href'));
54
- });
55
-
56
- $('.happyforms-form').on('submit', function(e) {
57
- e.preventDefault();
58
-
59
- return false;
60
- });
61
- });
62
- </script>
63
- </body>
64
- </html>
65
- <?php exit(); // to prevent extra content loading ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
inc/templates/{preview-form-part.php → preview-form-pencil.php} RENAMED
@@ -1,8 +1,5 @@
1
- <script type="text/template" id="happyforms-partial-template">
2
- <%= html %>
3
- </script>
4
  <script type="text/template" id="happyforms-pencil-template">
5
- <span class="customize-partial-edit-shortcut">
6
  <button aria-label="<?php _e( 'Click to edit this part.', 'happyforms' ); ?>" title="<?php _e( 'Click to edit this part.', 'happyforms' ); ?>" class="customize-partial-edit-shortcut-button happyforms-edit-pencil"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M13.89 3.39l2.71 2.72c.46.46.42 1.24.03 1.64l-8.01 8.02-5.56 1.16 1.16-5.58s7.6-7.63 7.99-8.03c.39-.39 1.22-.39 1.68.07zm-2.73 2.79l-5.59 5.61 1.11 1.11 5.54-5.65zm-2.97 8.23l5.58-5.6-1.07-1.08-5.59 5.6z"></path></svg></button>
7
  </span>
8
  </script>
 
 
 
1
  <script type="text/template" id="happyforms-pencil-template">
2
+ <span class="customize-partial-edit-shortcut happyforms-partial-edit-shortcut">
3
  <button aria-label="<?php _e( 'Click to edit this part.', 'happyforms' ); ?>" title="<?php _e( 'Click to edit this part.', 'happyforms' ); ?>" class="customize-partial-edit-shortcut-button happyforms-edit-pencil"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M13.89 3.39l2.71 2.72c.46.46.42 1.24.03 1.64l-8.01 8.02-5.56 1.16 1.16-5.58s7.6-7.63 7.99-8.03c.39-.39 1.22-.39 1.68.07zm-2.73 2.79l-5.59 5.61 1.11 1.11 5.54-5.65zm-2.97 8.23l5.58-5.6-1.07-1.08-5.59 5.6z"></path></svg></button>
4
  </span>
5
  </script>
inc/templates/{frontend-form.php → single-form.php} RENAMED
@@ -1,25 +1,19 @@
1
  <div class="happyforms-form" id="happyforms-<?php echo esc_attr( $form['ID'] ); ?>">
2
 
3
- <?php do_action( 'happyforms_print_css', $form ); ?>
4
-
5
- <?php happyforms_honeypot_styles( $form ); ?>
6
-
7
- <form action="<?php happyforms_form_action( $form['ID'] ); ?>" id="happyforms-form-<?php echo esc_attr( $form['ID'] ); ?>" method="post">
8
  <?php happyforms_action_field(); ?>
9
  <?php happyforms_redirect_field( $form ); ?>
10
  <?php happyforms_form_field( $form['ID'] ); ?>
11
  <?php happyforms_nonce_field( $form ); ?>
12
-
13
- <h3 class="happyforms-form__title"><?php echo esc_html( $form['post_title'] ); ?></h3>
14
-
15
  <?php happyforms_message_notices( $form, 'top' ); ?>
16
 
17
  <div class="happyforms-flex">
18
- <?php foreach ( $form['parts'] as $p => $part ) {
19
- echo happyforms_get_part_library()->get_part_template( $part, $form );
20
  } ?>
21
-
22
  <?php happyforms_honeypot( $form ); ?>
 
23
  <?php happyforms_submit( $form ); ?>
24
  </div>
25
 
1
  <div class="happyforms-form" id="happyforms-<?php echo esc_attr( $form['ID'] ); ?>">
2
 
3
+ <form action="<?php happyforms_form_action( $form['ID'] ); ?>" class="<?php happyforms_the_form_class( $form ); ?>" id="happyforms-form-<?php echo esc_attr( $form['ID'] ); ?>" method="post">
 
 
 
 
4
  <?php happyforms_action_field(); ?>
5
  <?php happyforms_redirect_field( $form ); ?>
6
  <?php happyforms_form_field( $form['ID'] ); ?>
7
  <?php happyforms_nonce_field( $form ); ?>
8
+ <?php happyforms_the_form_title( $form ); ?>
 
 
9
  <?php happyforms_message_notices( $form, 'top' ); ?>
10
 
11
  <div class="happyforms-flex">
12
+ <?php foreach ( $form['parts'] as $part ) {
13
+ happyforms_the_form_part( $part, $form );
14
  } ?>
 
15
  <?php happyforms_honeypot( $form ); ?>
16
+ <?php happyforms_recaptcha( $form ); ?>
17
  <?php happyforms_submit( $form ); ?>
18
  </div>
19
 
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: contact, contact form, email, feedback form, form, form builder, custom fo
5
  Requires at least: 4.8
6
  Tested up to: 4.9.2
7
  Requires PHP: 5.2.4
8
- Stable tag: 1.2.2
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -39,7 +39,7 @@ HappyForms is the simplest way for you to manage and respond to conversations wi
39
  * Confirmation message on submission.
40
  * Redirect to any webpage after the form is submitted.
41
  * Confirmation email sent to recipient.
42
- * One-click HoneyPot spam prevention.
43
  * Over 50 styles controls built-in.
44
 
45
  = Included HappyForms Form Parts: =
@@ -52,8 +52,12 @@ HappyForms is the simplest way for you to manage and respond to conversations wi
52
  * Single Choice — Radio buttons for single selection.
53
  * Dropdown — For long lists and single selection.
54
  * Number — For formatted numeric fields, like phone and price.
 
55
  * Date — Includes day and year picker for easy use.
56
- * Country — A dropdown listing all available countries.
 
 
 
57
  * Rating — Collect opinions using a zero to five star range.
58
  * Placeholder — For form descriptions and horizontal rules.
59
 
@@ -70,11 +74,16 @@ Absolutely! HappyForms gets out of the way and is designed to work with any them
70
 
71
  == Changelog ==
72
 
73
- = 1.2.2 =
74
- * Various bug fixes.
75
-
76
- = 1.2.1 =
77
- * Bug fix: a misnamed field was preventing Address part simple mode from working correctly.
 
 
 
 
 
78
 
79
  = 1.2.0 =
80
  * Bug fix: an error during the example form creation was preventing plugin activation.
@@ -100,16 +109,8 @@ Absolutely! HappyForms gets out of the way and is designed to work with any them
100
 
101
  == Upgrade Notice ==
102
 
103
- = 1.2.2 =
104
- * Bug fix: Date and multiple option parts sanitization caused errors on PHP 7.
105
- * Improvement: simplified Honeypot protection to avoid corner-cases.
106
- * Bug fix: an unset variable caused errors on PHP 7 during message submission storage.
107
- * Bug fix: unset, required checkboxes would prevent forms from submitting correctly.
108
- * Bug fix: removed misused filter causing fatal error on PHP 7.
109
- * Bug fix: mixed shortcodes were causing notices.
110
-
111
- = 1.2.1 =
112
- * Bug fix: Address part bug fix.
113
 
114
  = 1.2.0 =
115
  * Bug fix: an error during the example form creation was preventing plugin activation.
5
  Requires at least: 4.8
6
  Tested up to: 4.9.2
7
  Requires PHP: 5.2.4
8
+ Stable tag: 1.3
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
39
  * Confirmation message on submission.
40
  * Redirect to any webpage after the form is submitted.
41
  * Confirmation email sent to recipient.
42
+ * One-click HoneyPot and Google ReCaptcha spam prevention.
43
  * Over 50 styles controls built-in.
44
 
45
  = Included HappyForms Form Parts: =
52
  * Single Choice — Radio buttons for single selection.
53
  * Dropdown — For long lists and single selection.
54
  * Number — For formatted numeric fields, like phone and price.
55
+ * Phone - For formatted contact details.
56
  * Date — Includes day and year picker for easy use.
57
+ * Address — A dropdown listing all available countries.
58
+ * Scale — Collect opinions using a numeric slider.
59
+ * Title — Include personal honorific list.
60
+ * Legal — Required fine print before form submission.
61
  * Rating — Collect opinions using a zero to five star range.
62
  * Placeholder — For form descriptions and horizontal rules.
63
 
74
 
75
  == Changelog ==
76
 
77
+ = 1.3.0 =
78
+ * New feature: Parts duplication.
79
+ * New feature: “Title placement” setting now features options for displaying title as a placeholder with smooth transition, and place the title directly in the input field.
80
+ * New feature: Google ReCaptcha support.
81
+ * Improved: Better templates and filter coverage.
82
+ * Improved: Modal for adding a form to a content has been redesigned and refactored.
83
+ * Improved: Saving a form now displays an extended “Form saved” notice that contains a guide on how to insert form to a content. This message is dismissible.
84
+ * Improved: Parts in the Form Builder now show part title for better navigation.
85
+ * Improved: Dropdown part with lots of options now only reveals first 5 options on load with the option to reveal them all.
86
+ * Improved: Redesigned Style step with lots of new settings to make your forms even better looking.
87
 
88
  = 1.2.0 =
89
  * Bug fix: an error during the example form creation was preventing plugin activation.
109
 
110
  == Upgrade Notice ==
111
 
112
+ = 1.3.0 =
113
+ * Tons of new features, improvements and bugfixes.
 
 
 
 
 
 
 
 
114
 
115
  = 1.2.0 =
116
  * Bug fix: an error during the example form creation was preventing plugin activation.
trunk/assets/css/admin.css ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Admin menus
4
+ *
5
+ */
6
+ #toplevel_page_happyforms ul.wp-submenu li:nth-child(5) {
7
+ display: none;
8
+ }
9
+
10
+ #wp-admin-bar-happyforms .ab-icon svg {
11
+ width: 20px;
12
+ margin-top: 2px;
13
+ }
14
+
15
+ #wp-admin-bar-happyforms:hover .ab-icon .cls-2 {
16
+ fill: #00b9eb;
17
+ }
18
+
19
+ i.mce-i-happyforms-form-picker:before, i.mce-i-happyforms-form-picker:before {
20
+ content: '\f130';
21
+ display: block;
22
+ width: 20px;
23
+ height: 20px;
24
+ font: 400 20px/1 dashicons;
25
+ background-size: cover;
26
+ background-position: center;
27
+ }
28
+
29
+ /**
30
+ *
31
+ * Form admin screen
32
+ *
33
+ */
34
+ .fixed .column-messages {
35
+ width: 5.5em;
36
+ padding: 8px 0;
37
+ text-align: left;
38
+ }
39
+
40
+ .post-type-happyform .column-shortcode {
41
+ overflow: hidden;
42
+ }
43
+
44
+ .happyforms-shortcode-col span {
45
+ display: block;
46
+ margin-bottom: .2em;
47
+ line-height: 1.5em;
48
+ }
49
+
50
+ .happyforms-shortcode-col input {
51
+ position: absolute;
52
+ left: -999px;
53
+ }
54
+
55
+ .happyforms-shortcode-col a.happyforms-shortcode-clipboard {
56
+ display: none;
57
+ font-size: 13px;
58
+ line-height: 1.5em;
59
+ padding: 2px 0 0;
60
+ }
61
+
62
+ tr.type-happyform:hover .happyforms-shortcode-col a.happyforms-shortcode-clipboard {
63
+ display: inline-block;
64
+ }
65
+
66
+ /**
67
+ *
68
+ * Messages admin table screen
69
+ *
70
+ */
71
+ tr.happyforms-message-unread {
72
+ background-color: #e6f6fb !important;
73
+ }
74
+
75
+ .post-type-happyforms-message .page-title-action {
76
+ display: none;
77
+ }
78
+
79
+ /**
80
+ *
81
+ * Message edit screen
82
+ *
83
+ */
84
+ body.post-type-happyforms-message #post-body {
85
+ margin-left: -10px;
86
+ }
87
+
88
+ table.happyforms-message-data-table {
89
+ margin-top: 0;
90
+ box-shadow: 0 1px 1px rgba(0,0,0,0.04);
91
+ background: #fff;
92
+ border: 1px solid #e5e5e5;
93
+ }
94
+
95
+ .happyforms-message-data-table th {
96
+ padding: 20px 15px;
97
+ }
98
+
99
+ #happyforms-message-details .inside {
100
+ padding: 0;
101
+ }
102
+
103
+ #happyforms-message-details .inside .happyforms-message-form .logo {
104
+ color: #82878c;
105
+ }
106
+
107
+ #happyforms-message-details .misc-pub-trash:before {
108
+ font: normal 20px/1 dashicons;
109
+ speak: none;
110
+ display: inline-block;
111
+ margin-left: -1px;
112
+ padding-right: 3px;
113
+ vertical-align: top;
114
+ -webkit-font-smoothing: antialiased;
115
+ -moz-osx-font-smoothing: grayscale;
116
+ content: "\f182";
117
+ color: #82878c;
118
+ }
119
+
120
+ #happyforms-message-details .misc-pub-trash a {
121
+ text-decoration: none;
122
+ color: #a00;
123
+ }
124
+
125
+ p.happyforms-message-nav {
126
+ text-align: right;
127
+ }
128
+
129
+ p.happyforms-message-nav span.divider:first-child,
130
+ p.happyforms-message-nav span.divider:last-child {
131
+ display: none;
132
+ }
133
+
134
+ /**
135
+ *
136
+ * Automatic updates notice
137
+ *
138
+ */
139
+ .notice form#automatic-updates {
140
+ padding-bottom: 10px;
141
+ }
142
+
143
+ .notice-success #automatic-updates {
144
+ display: none;
145
+ }
146
+
147
+ .notice form#automatic-updates input {
148
+ display: inline-block;
149
+ }
150
+
151
+ .notice form#automatic-updates input[type="email"],
152
+ .notice form#automatic-updates input[type="password"] {
153
+ display: inline-block;
154
+ padding: 5px 7px;
155
+ margin: 0 1px;
156
+ }
157
+
158
+ /**
159
+ *
160
+ * Tracking page
161
+ *
162
+ */
163
+ .happyforms-welcome-panel {
164
+ max-width: 760px;
165
+ box-sizing: border-box;
166
+ position: relative;
167
+ }
168
+
169
+ .happyforms-welcome-panel .welcome-panel-content {
170
+ width: 460px;
171
+ margin-right: 33px;
172
+ padding-bottom: 25px;
173
+ }
174
+
175
+ .happyforms-welcome-panel .welcome-panel-content input[type="email"] {
176
+ width: 96%;
177
+ padding: 10px;
178
+ }
179
+
180
+ .happyforms-welcome-panel .welcome-panel-content .button-hero {
181
+ width: 96%;
182
+ text-align: center;
183
+ }
184
+
185
+ .happyforms-welcome-panel .welcome-panel-theme {
186
+ position: absolute;
187
+ top: 20px;
188
+ right: 20px;
189
+ bottom: 20px;
190
+ width: 250px;
191
+ background-image: url(../svg/welcome.svg);
192
+ background-position: center center;
193
+ background-repeat: no-repeat;
194
+ background-size: contain;
195
+ }
196
+
197
+ p.welcome-panel-footer {
198
+ max-width: 760px;
199
+ text-align: right;
200
+ color: #72777c;
201
+ }
202
+
203
+ p.welcome-panel-footer a {
204
+ color: inherit;
205
+ }
206
+
207
+ p.welcome-panel-footer a:hover,
208
+ p.welcome-panel-footer a:active {
209
+ color: #0073aa;
210
+ }
211
+
212
+ #available-widgets div[id*='widget-tpl-happyforms_widget-'] .widget-title:before {
213
+ content: '\f130';
214
+ }
215
+
216
+ .happyforms-editor-button span.dashicons {
217
+ position: relative;
218
+ top: 4px;
219
+ padding-right: 5px;
220
+ color: #888;
221
+ }
222
+
223
+ #happyforms-modal {
224
+ display: none;
225
+ }
226
+
227
+ .happyforms-dialog {
228
+ top: calc(50% - 150px) !important;
229
+ }
230
+
231
+ .happyforms-dialog .ui-dialog-title {
232
+ font-size: 14px;
233
+ }
234
+
235
+ .happyforms-dialog__select {
236
+ min-width: 290px;
237
+ }
238
+
239
+ .happyforms-dialog__button {
240
+ float: right;
241
+ margin-top: 18px !important;
242
+ }
243
+
244
+ #happyforms-notice-happyforms_form_saved_guide {
245
+ border-color: #46b450;
246
+ }
trunk/assets/css/customize.css ADDED
@@ -0,0 +1,856 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Customizer-wide
4
+ *
5
+ */
6
+ .wp-full-overlay {
7
+ z-index: 1000;
8
+ }
9
+
10
+ /**
11
+ *
12
+ * Header actions
13
+ *
14
+ */
15
+ #happyforms-save-button-wrapper {
16
+ transition: .18s margin ease-in-out;
17
+ float: right;
18
+ margin-top: 8px;
19
+ }
20
+
21
+ #happyforms-sidebar-controls {
22
+ display: relative;
23
+ }
24
+
25
+ #happyforms-close-link {
26
+ display: block;
27
+ position: absolute;
28
+ top: 0;
29
+ left: 0;
30
+ width: 45px;
31
+ height: 41px;
32
+ padding: 0 2px 0 0;
33
+ background: #eee;
34
+ border: none;
35
+ border-top: 4px solid #eee;
36
+ border-right: 1px solid #ddd;
37
+ color: #444;
38
+ text-align: left;
39
+ cursor: pointer;
40
+ transition: color .15s ease-in-out, border-color .15s ease-in-out, background .15s ease-in-out;
41
+ box-sizing: content-box;
42
+ text-decoration: none;
43
+ outline: 0;
44
+ line-height: 45px;
45
+ }
46
+
47
+ #happyforms-close-link:before {
48
+ font: normal 22px/45px dashicons;
49
+ content: "\f335";
50
+ position: relative;
51
+ top: -3px;
52
+ left: 13px;
53
+ }
54
+
55
+ #happyforms-close-link:hover,
56
+ #happyforms-close-link:focus {
57
+ background: #fff;
58
+ color: #0073aa;
59
+ border-top-color: #0073aa;
60
+ outline: none;
61
+ box-shadow: none;
62
+ }
63
+
64
+ /**
65
+ *
66
+ * Sidebar stacked view
67
+ *
68
+ */
69
+ #customize-controls .wp-full-overlay-sidebar-content {
70
+ bottom: 130px;
71
+ }
72
+
73
+ .happyforms-stack-view {
74
+ position: absolute;
75
+ width: 100%;
76
+ box-sizing: border-box;
77
+ border: 0;
78
+ padding: 12px;
79
+ }
80
+
81
+ .happyforms-step-description h1 {
82
+ font-size: 21px;
83
+ font-weight: 400;
84
+ line-height: 1.2;
85
+ text-align: center;
86
+ padding: 0;
87
+ margin: 15px 0;
88
+ }
89
+
90
+ .happyforms-step-description p {
91
+ font-size: 14px;
92
+ line-height: 1.5;
93
+ font-style: normal;
94
+ text-align: center;
95
+ margin: 0;
96
+ }
97
+
98
+ p.description a {
99
+ font-style: normal;
100
+ }
101
+
102
+ .happyforms-step-description p.description {
103
+ margin: 0 0 30px;
104
+ }
105
+
106
+ .happyforms-step-description ol {
107
+ font-size: 14px;
108
+ line-height: 1.5;
109
+ margin-bottom: 20px;
110
+ }
111
+
112
+ .happyforms-stack-view h2.group-title {
113
+ font-weight: 700;
114
+ font-size: 1.5em;
115
+ margin: 30px 0;
116
+ }
117
+
118
+ .happyforms-stack-view .customize-control:first-child h2.group-title {
119
+ margin: 5px 0 30px 0;
120
+ }
121
+
122
+ .customize-control {
123
+ float: none;
124
+ }
125
+
126
+ #customize-controls span.description {
127
+ display: block;
128
+ margin-bottom: 10px;
129
+ color: #999;
130
+ font-style: normal;
131
+ line-height: 18px;
132
+ }
133
+
134
+ .customize-control textarea {
135
+ width: 100%;
136
+ }
137
+
138
+ .happyforms-customize-heading h2 {
139
+ border-top: 1px solid #dbdbdb;
140
+ padding-top: 20px;
141
+ }
142
+
143
+ .panel-meta + .happyforms-customize-heading h2 {
144
+ padding-top: 0;
145
+ border-top: 0;
146
+ }
147
+
148
+ .happyforms-help-pointer {
149
+ z-index: 999999 !important;
150
+ }
151
+
152
+ .happyforms-help-pointer .wp-pointer-content {
153
+ padding: 10px 15px;
154
+ }
155
+
156
+ /**
157
+ *
158
+ * Footer steps
159
+ *
160
+ */
161
+ #customize-footer-actions {
162
+ height: 120px;
163
+ padding: 12px;
164
+ box-sizing: border-box;
165
+ display: none;
166
+ }
167
+
168
+ .happyforms-action-buttons {
169
+ margin-bottom: 15px;
170
+ }
171
+
172
+ .happyforms-action-buttons button.button-primary.button-hero,
173
+ .happyforms-action-buttons button.button-secondary.button-hero {
174
+ width: 48%;
175
+ margin: 0 1%;
176
+ padding: 0;
177
+ text-align: center;
178
+ }
179
+
180
+ .happyforms-action-buttons button.button-primary.button-hero:only-child,
181
+ .happyforms-action-buttons button.button-secondary.button-hero:only-child {
182
+ width: 100%;
183
+ }
184
+
185
+ .button-wide {
186
+ width: 100%;
187
+ text-align: center;
188
+ }
189
+
190
+ .happyforms-step-progress {
191
+ margin: 0 1%;
192
+ }
193
+
194
+ .happyforms-step-progress,
195
+ .happyforms-step-progress-bar {
196
+ height: 6px;
197
+ margin-bottom: 10px;
198
+ }
199
+
200
+ .happyforms-step-progress {
201
+ background-color: #cccccc;
202
+ }
203
+
204
+ .happyforms-step-progress-bar {
205
+ background-color: #0185ba;
206
+ }
207
+
208
+ p.happyforms-step-progress-counter {
209
+ text-align: center;
210
+ margin-bottom: 0;
211
+ }
212
+
213
+ /**
214
+ *
215
+ * Common form widget elements
216
+ *
217
+ */
218
+ .happyforms-widget {
219
+ margin: 0 auto 10px;
220
+ box-sizing: border-box;
221
+ box-shadow: 0 1px 1px rgba(0,0,0,0.04);
222
+ }
223
+
224
+ .happyforms-widget-top {
225
+ position: relative;
226
+ background: #fff;
227
+ color: #23282d;
228
+ border: 1px solid #e5e5e5;
229
+ line-height: 1.4em;
230
+ -webkit-transition: opacity 0.5s;
231
+ transition: opacity 0.5s;
232
+ z-index: 1;
233
+ }
234
+
235
+ .happyforms-widget-title h3 {
236
+ margin: 0;
237
+ padding: 13px 15px;
238
+ font-size: 13px !important;
239
+ line-height: 1;
240
+ overflow: hidden;
241
+ white-space: nowrap;
242
+ text-overflow: ellipsis;
243
+ user-select: none;
244
+ }
245
+
246
+ .happyforms-widget-content {
247
+ padding: 1px 10px 10px 10px;
248
+ line-height: 16px;
249
+ background: #fff;
250
+ border: 1px solid #e5e5e5;
251
+ border-top: 0;
252
+ }
253
+
254
+ .happyforms-widget-actions {
255
+ padding-bottom: 5px;
256
+ }
257
+
258
+ a.happyforms-form-remove,
259
+ a.happyforms-form-part-remove {
260
+ color: #a00;
261
+ }
262
+
263
+ a.happyforms-form-remove:hover,
264
+ a.happyforms-form-part-remove:hover {
265
+ color: #dc3232;
266
+ }
267
+
268
+ .happyforms-form-date {
269
+ color: #72777c;
270
+ }
271
+
272
+ /**
273
+ *
274
+ * Form edit
275
+ *
276
+ */
277
+ #happyforms-captcha-settings {
278
+ display: none;
279
+ }
280
+
281
+ /**
282
+ *
283
+ * Form build
284
+ *
285
+ */
286
+ .happyforms-parts-placeholder {
287
+ display: block;
288
+ border: 2px dashed #a1a1a1;
289
+ padding: 30px 30px 40px;
290
+ box-sizing: border-box;
291
+ text-align: center;
292
+ }
293
+
294
+ .happyforms-stack-view.has-parts .happyforms-parts-placeholder {
295
+ display: none;
296
+ }
297
+
298
+ .happyforms-parts-placeholder img {
299
+ margin-top: 30px;
300
+ width: 90%;
301
+ }
302
+
303
+ .happyforms-parts-placeholder p {
304
+ font-size: 14px;
305
+ color: #444;
306
+ margin: 0;
307
+ }
308
+
309
+ .happyforms-parts-placeholder p:last-of-type {
310
+ margin-bottom: 30px;
311
+ }
312
+
313
+ .happyforms-parts-placeholder__placeholder {
314
+ margin-bottom: 20px;
315
+ padding: 20px;
316
+ border: 2px dashed #a1a1a1;
317
+ }
318
+
319
+ .happyforms-parts-placeholder__placeholder:last-child {
320
+ margin-bottom: 0;
321
+ }
322
+
323
+ ul.happyforms-form-widgets {
324
+ margin-top: 0;
325
+ }
326
+
327
+ body.adding-happyforms-parts button.happyforms-open-parts-drawer:before {
328
+ -webkit-transform: rotate(45deg);
329
+ -ms-transform: rotate(45deg);
330
+ transform: rotate(45deg);
331
+ }
332
+
333
+ body.adding-happyforms-parts #customize-preview iframe {
334
+ width: calc(100% - 301px);
335
+ }
336
+
337
+ .happyforms-part-widget-top {
338
+ cursor: move;
339
+ }
340
+
341
+ .happyforms-part-widget-top:hover {
342
+ border-color: #999;
343
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
344
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
345
+ }
346
+
347
+ .happyforms-part-widget-title-action {
348
+ float: right;
349
+ cursor: pointer;
350
+ }
351
+
352
+ .happyforms-widget-action {
353
+ display: inline-block;
354
+ padding: 8px 10px;
355
+ margin: 0;
356
+ color: #72777c;
357
+ border: 0;
358
+ cursor: pointer;
359
+ outline: none;
360
+ border-radius: 0;
361
+ background-color: transparent;
362
+ }
363
+
364
+ .happyforms-widget-action .toggle-indicator {
365
+ display: inline-block;
366
+ font-size: 20px;
367
+ line-height: 1;
368
+ }
369
+
370
+ .happyforms-widget-action .toggle-indicator:before {
371
+ display: block;
372
+ content: '\f140';
373
+ font: normal 20px/1 dashicons;
374
+ padding: 1px 2px 1px 0px;
375
+ border-radius: 50%;
376
+ -webkit-font-smoothing: antialiased;
377
+ -moz-osx-font-smoothing: grayscale;
378
+ text-decoration: none !important;
379
+ }
380
+
381
+ .happyforms-widget-expanded .toggle-indicator:before {
382
+ content: '\f142';
383
+ }
384
+
385
+ .happyforms-widget-action:focus .toggle-indicator:before {
386
+ box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);
387
+ }
388
+
389
+ .happyforms-part-widget .links {
390
+ text-align: right;
391
+ }
392
+
393
+ .happyforms-part-widget .show-all-options {
394
+ float: left;
395
+ }
396
+
397
+ .happyforms-part-widget .options {
398
+ border: 1px solid #eee;
399
+ padding: 5px 10px 10px;
400
+ }
401
+
402
+ .happyforms-part-widget .options h3 {
403
+ margin-bottom: 0;
404
+ display: none;
405
+ }
406
+
407
+ .happyforms-part-widget .options p {
408
+ display: none;
409
+ }
410
+
411
+ .happyforms-part-widget .options li {
412
+ padding: 10px 0 15px;
413
+ border-bottom: 1px solid #eee;
414
+ }
415
+
416
+ .happyforms-part-widget .options ul:empty {
417
+ display: none;
418
+ }
419
+
420
+ .happyforms-part-widget .options ul:empty ~ h3,
421
+ .happyforms-part-widget .options ul:empty ~ p {
422
+ display: block;
423
+ }
424
+
425
+ .happyforms-part-widget .options li:last-child {
426
+ border-bottom: 0;
427
+ }
428
+
429
+ .happyforms-part-widget .options .option-actions {
430
+ margin: 0;
431
+ text-align: right;
432
+ }
433
+
434
+ .happyforms-part-widget .options .delete-option {
435
+ position: relative;
436
+ top: 5px;
437
+ color: #a00;
438
+ }
439
+
440
+ .happyforms-part-widget .options .delete-option:hover {
441
+ color: #dc3232;
442
+ }
443
+
444
+ .happyforms-part-widget .options .delete-option::after {
445
+ content: '';
446
+ display: table;
447
+ clear: both;
448
+ }
449
+
450
+ .happyforms-part-widget--sub label {
451
+ font-size: 13px;
452
+ }
453
+
454
+ .customize-control .happyforms-part-widget--sub input {
455
+ margin: 2px 0 5px;
456
+ }
457
+
458
+ /**
459
+ *
460
+ * Form parts drawer
461
+ *
462
+ */
463
+ body.adding-happyforms-parts .wp-full-overlay-main {
464
+ left: 300px;
465
+ }
466
+
467
+ #happyforms-parts-drawer {
468
+ position: absolute;
469
+ top: 0;
470
+ bottom: 0;
471
+ left: -301px;
472
+ overflow-x: hidden;
473
+ overflow-y: auto;
474
+ width: 300px;
475
+ margin: 0;
476
+ z-index: 4;
477
+ background: #eee;
478
+ border-right: 1px solid #ddd;
479
+ }
480
+
481
+ .happyforms-parts-drawer-header {
482
+ border-bottom: 1px solid #ddd;
483
+ }
484
+
485
+ .happyforms-parts-drawer-header-search {
486
+ padding: 13px 15px;
487
+ }
488
+
489
+ .happyforms-parts-drawer-header-search input {
490
+ width: 100%;
491
+ height: 32px;
492
+ margin: 1px 0;
493
+ padding: 6px 30px;
494
+ }
495
+
496
+ .happyforms-parts-drawer-header-search-icon {
497
+ display: block;
498
+ position: absolute;
499
+ top: 15px;
500
+ left: 16px;
501
+ width: 30px;
502
+ height: 30px;
503
+ line-height: 28px;
504
+ text-align: center;
505
+ color: #72777c;
506
+ }
507
+
508
+ .happyforms-parts-drawer-header-search-icon:after {
509
+ content: '\f179';
510
+ font: normal 20px/1 dashicons;
511
+ line-height: 30px;
512
+ vertical-align: middle;
513
+ -webkit-font-smoothing: antialiased;
514
+ }
515
+
516
+ input#part-search::placeholder {
517
+ color: #aaa;
518
+ }
519
+
520
+ ul.happyforms-parts-list {
521
+ margin: 0;
522
+ padding: 0;
523
+ list-style-type: none;
524
+ }
525
+
526
+ ul.happyforms-parts-list li.happyforms-parts-list-item {
527
+ position: relative;
528
+ margin-bottom: 0;
529
+ padding: 20px 15px 20px 60px;
530
+ background: #fff;
531
+ border-bottom: 1px solid #ddd;
532
+ border-left: 4px solid #fff;
533
+ -webkit-transition: .15s color ease-in-out, .15s background-color ease-in-out, .15s border-color ease-in-out;
534
+ transition: .15s color ease-in-out, .15s background-color ease-in-out, .15s border-color ease-in-out;
535
+ cursor: pointer;
536
+ }
537
+
538
+ ul.happyforms-parts-list li.happyforms-parts-list-item:hover {
539
+ background: #f3f3f5;
540
+ border-bottom-color: #ccc;
541
+ color: #0073aa;
542
+ border-left: 4px solid #0073aa;
543
+ }
544
+
545
+ ul.happyforms-parts-list li .happyforms-parts-list-item-title {
546
+ position: relative;
547
+ }
548
+
549
+ ul.happyforms-parts-list li .happyforms-parts-list-item-title:before {
550
+ content: "";
551
+ position: absolute;
552
+ top: 0;
553
+ right: 100%;
554
+ margin-right: 20px;
555
+ width: 20px;
556
+ height: 20px;
557
+ color: #32373c;
558
+ text-align: center;
559
+ box-sizing: border-box;
560
+ }
561
+
562
+ ul.happyforms-parts-list li[data-part-type="single_line_text"] .happyforms-parts-list-item-title:before {
563
+ background-image: url(../svg/icons/short-text.svg);
564
+ }
565
+
566
+ ul.happyforms-parts-list li[data-part-type="multi_line_text"] .happyforms-parts-list-item-title:before {
567
+ background-image: url(../svg/icons/long-text.svg);
568
+ }
569
+
570
+ ul.happyforms-parts-list li[data-part-type="email"] .happyforms-parts-list-item-title:before {
571
+ background-image: url(../svg/icons/email.svg);
572
+ }
573
+
574
+ ul.happyforms-parts-list li[data-part-type="website_url"] .happyforms-parts-list-item-title:before {
575
+ background-image: url(../svg/icons/website-link.svg);
576
+ }
577
+
578
+ ul.happyforms-parts-list li[data-part-type="number"] .happyforms-parts-list-item-title:before {
579
+ background-image: url(../svg/icons/number.svg);
580
+ }
581
+
582
+ ul.happyforms-parts-list li[data-part-type="date"] .happyforms-parts-list-item-title:before {
583
+ background-image: url(../svg/icons/date.svg);
584
+ }
585
+
586
+ ul.happyforms-parts-list li[data-part-type="checkbox"] .happyforms-parts-list-item-title:before {
587
+ background-image: url(../svg/icons/multiple-choice.svg);
588
+ }
589
+
590
+ ul.happyforms-parts-list li[data-part-type="radio"] .happyforms-parts-list-item-title:before {
591
+ background-image: url(../svg/icons/single-choice.svg);
592
+ }
593
+
594
+ ul.happyforms-parts-list li[data-part-type="select"] .happyforms-parts-list-item-title:before {
595
+ background-image: url(../svg/icons/dropdown.svg);
596
+ }
597
+
598
+ ul.happyforms-parts-list li[data-part-type="country"] .happyforms-parts-list-item-title:before {
599
+ background-image: url(../svg/icons/country.svg);
600
+ }
601
+
602
+ ul.happyforms-parts-list li[data-part-type="address"] .happyforms-parts-list-item-title:before {
603
+ background-image: url(../svg/icons/country.svg);
604
+ }
605
+
606
+ ul.happyforms-parts-list li[data-part-type="title"] .happyforms-parts-list-item-title:before {
607
+ background-image: url(../svg/icons/title.svg);
608
+ }
609
+
610
+ ul.happyforms-parts-list li[data-part-type="legal"] .happyforms-parts-list-item-title:before {
611
+ background-image: url(../svg/icons/legal.svg);
612
+ }
613
+
614
+ ul.happyforms-parts-list li[data-part-type="placeholder"] .happyforms-parts-list-item-title:before {
615
+ background-image: url(../svg/icons/placeholder.svg);
616
+ }
617
+
618
+ ul.happyforms-parts-list li[data-part-type="rating"] .happyforms-parts-list-item-title:before {
619
+ background-image: url(../svg/icons/rating.svg);
620
+ }
621
+
622
+ ul.happyforms-parts-list li[data-part-type="scale"] .happyforms-parts-list-item-title:before {
623
+ background-image: url(../svg/icons/scale.svg);
624
+ }
625
+
626
+ ul.happyforms-parts-list li[data-part-type="phone"] .happyforms-parts-list-item-title:before {
627
+ background-image: url(../svg/icons/phone.svg);
628
+ }
629
+
630
+ ul.happyforms-parts-list .happyforms-parts-list-item-title h3 {
631
+ margin: 0;
632
+ padding: 0 0 5px;
633
+ font-size: 14px;
634
+ line-height: 1;
635
+ overflow: hidden;
636
+ white-space: nowrap;
637
+ text-overflow: ellipsis;
638
+ }
639
+
640
+ ul.happyforms-parts-list .happyforms-parts-list-item-description {
641
+ padding: 0;
642
+ color: #72777c;
643
+ font-size: 12px;
644
+ }
645
+
646
+ .happyforms-part-widget .happyforms-widget-content {
647
+ display: none;
648
+ }
649
+
650
+ .happyforms-widget-expanded .happyforms-widget-content {
651
+ display: block;
652
+ }
653
+
654
+ ul.happyforms-style-controls {
655
+ position: relative;
656
+ float: left;
657
+ width: 100%;
658
+ height: 100%;
659
+ }
660
+
661
+ ul.happyforms-style-controls .customize-control {
662
+ margin-bottom: 20px;
663
+ padding: 0 12px;
664
+ box-sizing: border-box;
665
+ }
666
+
667
+ /* Style view */
668
+ .happyforms-stack-view.happyforms-style-view {
669
+ padding: 0;
670
+ overflow: hidden;
671
+ top: 0;
672
+ bottom: 0;
673
+ }
674
+
675
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control {
676
+ margin-bottom: 0;
677
+ padding: 0;
678
+ transform: translateX(0);
679
+ transition: .18s transform cubic-bezier(.645, .045, .355, 1),
680
+ .18s -webkit-transform cubic-bezier(.645, .045, .355, 1);
681
+ }
682
+
683
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control:first-child {
684
+ margin-top: 15px;
685
+ border-top: 1px solid #ddd;
686
+ }
687
+
688
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control.inactive {
689
+ transform: translateX(-100%);
690
+ }
691
+
692
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control.active {
693
+ transform: translateX(0);
694
+ }
695
+
696
+ ul.happyforms-style-controls .customize-control.happyforms-divider-control h3 {
697
+ text-transform: capitalize;
698
+ }
699
+
700
+ .happyforms-style-controls-group {
701
+ position: absolute;
702
+ top: 0;
703
+ left: 0;
704
+ z-index: 9999;
705
+ height: 0;
706
+ overflow: hidden;
707
+ width: 100%;
708
+ background-color: #eee;
709
+ transform: translateX(100%);
710
+ transition: .18s transform cubic-bezier(.645, .045, .355, 1),
711
+ .18s -webkit-transform cubic-bezier(.645, .045, .355, 1)
712
+ }
713
+
714
+ .happyforms-style-controls-group .accordion-section-title {
715
+ padding: 10px 10px 11px 14px;
716
+ }
717
+
718
+ .happyforms-style-controls-group .accordion-section-title .panel-title {
719
+ text-transform: capitalize;
720
+ }
721
+
722
+ .happyforms-style-controls-group.open {
723
+ height: 100%;
724
+ overflow: auto;
725
+ transform: translateX(0);
726
+ }
727
+
728
+ .happyforms-style-controls-group.closing {
729
+ transform: translateX(100%);
730
+ }
731
+
732
+ .control-section h3.accordion-section-title {
733
+ padding-right: 30px;
734
+ color: #555d66;
735
+ background-color: #fff;
736
+ border-bottom: 1px solid #ddd;
737
+ border-left: 4px solid #fff;
738
+ transition: .15s color ease-in-out, .15s background-color ease-in-out, .15s border-color ease-in-out;
739
+ font-size: 14px;
740
+ cursor: pointer;
741
+ }
742
+
743
+ .control-section h3.accordion-section-title:after {
744
+ content: "\f345" !important;
745
+ font: normal 20px/1 dashicons;
746
+ speak: none;
747
+ display: block;
748
+ -webkit-font-smoothing: antialiased;
749
+ -moz-osx-font-smoothing: grayscale;
750
+ text-decoration: none !important;
751
+ position: absolute;
752
+ top: 12px;
753
+ right: 10px;
754
+ z-index: 1;
755
+ color: #a0a5aa;
756
+ }
757
+
758
+ .control-section h3.accordion-section-title:hover {
759
+ border-left-color: #0073aa;
760
+ }
761
+
762
+ .control-section h3.accordion-section-title:hover:after {
763
+ color: #0073aa;
764
+ }
765
+
766
+ /* Tinymce control styles */
767
+ .customize-control .mce-tinymce {
768
+ border: 1px solid #ddd;
769
+ box-sizing: border-box;
770
+ }
771
+
772
+ /* Range control styles */
773
+ li.customize-control.happyforms-range-control:after {
774
+ content: '';
775
+ display: table;
776
+ clear: both;
777
+ }
778
+
779
+ li.customize-control.happyforms-range-control label {
780
+ display: block;
781
+ }
782
+
783
+ li.customize-control.happyforms-range-control input {
784
+ float: left;
785
+ width: 20%;
786
+ }
787
+
788
+ li.customize-control.happyforms-range-control .happyforms-range-slider {
789
+ float: left;
790
+ width: 70%;
791
+ margin-left: 5%;
792
+ margin-top: 9px;
793
+ }
794
+
795
+ li.customize-control.happyforms-range-control .ui-slider-handle {
796
+ position: absolute;
797
+ z-index: 2;
798
+ top: -.3em;
799
+ border-color: #777;
800
+ background: #777;
801
+ }
802
+
803
+ li.customize-control.happyforms-range-control .ui-slider-horizontal {
804
+ position: relative;
805
+ height: .6em;
806
+ border-color: #fff;
807
+ background: #fff;
808
+ }
809
+
810
+ li.customize-control.happyforms-range-control .ui-slider-handle {
811
+ width: 1.2em;
812
+ height: 1.2em;
813
+ border-radius: 100%;
814
+ }
815
+
816
+ li.customize-control.happyforms-range-control .ui-slider-handle:hover {
817
+ cursor: pointer;
818
+ }
819
+
820
+ /* Button set */
821
+ li.customize-control .happyforms-buttonset-container {
822
+ margin-top: 10px;
823
+ }
824
+
825
+ li.customize-control .happyforms-buttonset-container label {
826
+ padding: 7px 10px;
827
+ border: 1px solid #fff;
828
+ border-right-width: 0px;
829
+ }
830
+
831
+ li.customize-control .happyforms-buttonset-container label:last-child {
832
+ border-right-width: 1px;
833
+ }
834
+
835
+ li.customize-control .happyforms-buttonset-container .ui-state-hover {
836
+ background-color: #dedede;
837
+ }
838
+
839
+ li.customize-control .happyforms-buttonset-container .ui-state-active,
840
+ li.customize-control .happyforms-buttonset-container .ui-state-active.ui-state-hover {
841
+ background-color: #fff;
842
+ }
843
+
844
+ li.customize-control.happyforms-buttonset-control + .customize-control h2 {
845
+ margin-top: 1.8rem;
846
+ }
847
+
848
+ .happyforms-parts-expand-collapse-wrap {
849
+ float: right;
850
+ font-weight: normal;
851
+ font-size: 11px;
852
+ }
853
+
854
+ .happyforms-parts-expand-collapse-wrap .expand-collapse-all {
855
+ display: none;
856
+ }
trunk/assets/css/font-awesome.min.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*!
2
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
trunk/assets/css/frontend.css ADDED
@@ -0,0 +1,1445 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ /* colors */
3
+ --happyforms-color-primary: #000;
4
+ --happyforms-color-success: #39b54a;
5
+ --happyforms-color-error: #ff7550;
6
+ --happyforms-color-part-title: #000;
7
+ --happyforms-color-part-value: #000;
8
+ --happyforms-color-part-placeholder: #aaa;
9
+ --happyforms-color-part-required-text: #ff7550;
10
+ --happyforms-color-part-border: #dbdbdb;
11
+ --happyforms-color-part-border-focus: #000;
12
+ --happyforms-color-part-background: #fff;
13
+ --happyforms-color-part-background-focus: #fff;
14
+ --happyforms-color-submit-background: #000;
15
+ --happyforms-color-submit-background-hover: #dbdbdb;
16
+ --happyforms-color-submit-background-focus: #dbdbdb;
17
+ --happyforms-color-submit-border: transparent;
18
+ --happyforms-color-rating: #ccc;
19
+ --happyforms-color-rating-hover: #f39c00;
20
+ /* font */
21
+ --happyforms-form-title-font-size: 32px;
22
+ --happyforms-form-font-weight: normal;
23
+ --happyforms-part-title-font-size: 16px;
24
+ --happyforms-part-description-font-size: 14px;
25
+ --happyforms-part-value-font-size: 16px;
26
+ --happyforms-submit-button-font-size: 18px;
27
+ /* animations and transitions */
28
+ --happyforms-transition-duration: 0.25s;
29
+ }
30
+
31
+ .happyforms-flex {
32
+ display: flex;
33
+ flex-flow: row wrap;
34
+ align-items: flex-start;
35
+ max-width: 100%;
36
+ padding: 7.5% 0;
37
+ }
38
+
39
+ .happyforms-form form {
40
+ max-width: 100%;
41
+ border-style: solid;
42
+ border-width: 0;
43
+ font-weight: normal;
44
+ font-weight: var(--happyforms-form-font-weight);
45
+ background-color: transparent;
46
+ }
47
+
48
+ h3.happyforms-form__title {
49
+ margin: 0;
50
+ padding: 0 1%;
51
+ font-weight: bold;
52
+ font-size: 32px;
53
+ font-size: var(--happyforms-form-title-font-size);
54
+ color: #000;
55
+ color: var(--happyforms-color-primary);
56
+ }
57
+
58
+ .happyforms-form--hide-title h3.happyforms-form__title {
59
+ display: none;
60
+ }
61
+
62
+ /* parts - general */
63
+
64
+ .happyforms-form__part {
65
+ position: relative;
66
+ display: block;
67
+ width: 100%;
68
+ margin-bottom: 20px;
69
+ padding: 5px 1%;
70
+ }
71
+
72
+ @media screen and (min-width: 800px) {
73
+ .happyforms-part--width-half {
74
+ width: 50%;
75
+ }
76
+ .happyforms-part--width-third {
77
+ width: 33.333%;
78
+ }
79
+ }
80
+
81
+ .happyforms-part__label {
82
+ display: inline-block;
83
+ cursor: pointer;
84
+ margin-bottom: 20px;
85
+ font-size: 16px;
86
+ font-size: var(--happyforms-part-title-font-size);
87
+ }
88
+
89
+ .happyforms-part__label .label {
90
+ font-weight: bold;
91
+ color: #000;
92
+ color: var(--happyforms-color-part-title);
93
+ }
94
+
95
+ .happyforms-part__description {
96
+ display: block;
97
+ margin: 5px 0 0;
98
+ font-size: 14px;
99
+ font-size: var(--happyforms-part-description-font-size);
100
+ color: #000;
101
+ color: var(--happyforms-color-primary);
102
+ }
103
+
104
+ .happyforms-part input[type=text],
105
+ .happyforms-part input[type=email],
106
+ .happyforms-part input[type=tel],
107
+ .happyforms-part input[type=number],
108
+ .happyforms-part input[type=range],
109
+ .happyforms-part textarea {
110
+ width: 100%;
111
+ height: auto !important;
112
+ padding: 10px;
113
+ border-width: 1px;
114
+ border-style: solid;
115
+ border-color: #dbdbdb;
116
+ border-color: var(--happyforms-color-part-border);
117
+ border-radius: 6px;
118
+ box-shadow: none;
119
+ font-style: normal;
120
+ font-size: 16px;
121
+ font-size: var(--happyforms-part-value-font-size);
122
+ background-color: #fff;
123
+ background-color: var(--happyforms-color-part-background);
124
+ color: #000;
125
+ color: var(--happyforms-color-part-value);
126
+ transition-property: none;
127
+ transition-duration: 0.1s;
128
+ transition-duration: var(--happyforms-transition-duration);
129
+ transition-timing-function: ease-in;
130
+ }
131
+
132
+ .happyforms-form--part-border-off .happyforms-part input[type=text],
133
+ .happyforms-form--part-border-off .happyforms-part input[type=email],
134
+ .happyforms-form--part-border-off .happyforms-part input[type=tel],
135
+ .happyforms-form--part-border-off .happyforms-part input[type=number],
136
+ .happyforms-form--part-border-off .happyforms-part input[type=range],
137
+ .happyforms-form--part-border-off .happyforms-part textarea {
138
+ border-color: transparent;
139
+ }
140
+
141
+ .happyforms-part input[type=text]:focus,
142
+ .happyforms-part input[type=email]:focus,
143
+ .happyforms-part input[type=tel]:focus,
144
+ .happyforms-part input[type=number]:focus,
145
+ .happyforms-part textarea:focus {
146
+ border-width: 1px;
147
+ border-style: solid;
148
+ border-color: #000;
149
+ border-color: var(--happyforms-color-part-border-focus);
150
+ background-color: #fff;
151
+ background-color: var(--happyforms-color-part-background-focus);
152
+ }
153
+
154
+ .happyforms-form--part-border-off .happyforms-part input[type=text]:focus,
155
+ .happyforms-form--part-border-off .happyforms-part input[type=email]:focus,
156
+ .happyforms-form--part-border-off .happyforms-part input[type=tel]:focus,
157
+ .happyforms-form--part-border-off .happyforms-part input[type=number]:focus,
158
+ .happyforms-form--part-border-off .happyforms-part textarea:focus {
159
+ border-color: transparent;
160
+ }
161
+
162
+ .happyforms-part.happyforms-part--error input[type=text],
163
+ .happyforms-part.happyforms-part--error input[type=email],
164
+ .happyforms-part.happyforms-part--error input[type=tel],
165
+ .happyforms-part.happyforms-part--error input[type=number],
166
+ .happyforms-part.happyforms-part--error input[type=range],
167
+ .happyforms-part.happyforms-part--error textarea {
168
+ border-color: #ff7550;
169
+ border-color: var(--happyforms-color-error);
170
+ }
171
+
172
+ .happyforms-part.display-type--block .happyforms-part__el {
173
+ display: block;
174
+ }
175
+
176
+ /* placeholders */
177
+
178
+ .happyforms-part ::-webkit-input-placeholder {
179
+ font-weight: normal;
180
+ font-style: normal;
181
+ color: #aaa;
182
+ color: var(--happyforms-color-part-placeholder);
183
+ }
184
+
185
+ .happyforms-part ::-moz-placeholder {
186
+ font-weight: normal;
187
+ font-style: normal;
188
+ color: #aaa;
189
+ color: var(--happyforms-color-part-placeholder);
190
+ }
191
+
192
+ .happyforms-part ::-ms-placeholder {
193
+ font-weight: normal;
194
+ font-style: normal;
195
+ color: #aaa;
196
+ color: var(--happyforms-color-part-placeholder);
197
+ }
198
+
199
+ .happyforms-part ::placeholder {
200
+ font-weight: normal;
201
+ font-style: normal;
202
+ color: #aaa;
203
+ color: var(--happyforms-color-part-placeholder);
204
+ }
205
+
206
+ .happyforms-part-el-wrap {
207
+ position: relative;
208
+ }
209
+
210
+ .happyforms-part-wrap {
211
+ position: relative;
212
+ }
213
+
214
+ .happyforms-part-wrap--confirmation {
215
+ margin-top: 10px;
216
+ }
217
+
218
+ .happyforms-required {
219
+ color: #ff7550;
220
+ color: var(--happyforms-color-part-required-text);
221
+ }
222
+
223
+ /* label placement */
224
+
225
+ .happyforms-part--label-below .happyforms-part-wrap {
226
+ display: flex;
227
+ flex-flow: row wrap-reverse;
228
+ align-content: flex-end;
229
+ }
230
+
231
+ .happyforms-part--label-below .happyforms-part__label {
232
+ order: 2;
233
+ width: 100%;
234
+ margin-bottom: 5px;
235
+ }
236
+
237
+ .happyforms-part--label-above .happyforms-part__label--confirmation {
238
+ margin-top: 10px;
239
+ }
240
+
241
+ .happyforms-part--label-below input,
242
+ .happyforms-part--label-below textarea,
243
+ .happyforms-part--label-below select,
244
+ .happyforms-part--label-below .happyforms-part__select-wrap,
245
+ .happyforms-part--label-below .happyforms-part__el {
246
+ order: 3;
247
+ }
248
+
249
+ .happyforms-part--label-below .happyforms-part__description {
250
+ order: 1;
251
+ margin-top: 0;
252
+ }
253
+
254
+ .happyforms-part--label-below.happyforms-part--date .happyforms-part__el {
255
+ width: 100%;
256
+ order: 2;
257
+ }
258
+
259
+ .happyforms-part--label-left .happyforms-part__label {
260
+ float: left;
261
+ width: 25%;
262
+ }
263
+
264
+ .happyforms-part--label-left input.happyforms-part__el,
265
+ .happyforms-part--label-left textarea.happyforms-part__el,
266
+ .happyforms-part--label-left .happyforms-part__select-wrap {
267
+ float: right;
268
+ width: 75%;
269
+ }
270
+
271
+ .happyforms-part--label-left .happyforms-part__description {
272
+ clear: both;
273
+ float: right;
274
+ width: 75%;
275
+ }
276
+
277
+ .happyforms-part--label-below .happyforms-part__el,
278
+ .happyforms-part--label-below input.happyforms-part__el,
279
+ .happyforms-part--label-below select.happyforms-part__el,
280
+ .happyforms-part--label-below textarea.happyforms-part__el {
281
+ position: relative;
282
+ top: 5px;
283
+ margin-bottom: 10px;
284
+ }
285
+
286
+ /* parts - option labels */
287
+
288
+ .happyforms-part .option-label {
289
+ position: relative;
290
+ cursor: pointer;
291
+ display: inline-block;
292
+ margin-bottom: 10px;
293
+ padding: 0 5px 5px 0;
294
+ font-size: 16px;
295
+ font-size: var(--happyforms-part-value-font-size);
296
+ }
297
+
298
+ .happyforms-part--radio .option-label {
299
+ margin-right: 20px;
300
+ padding: 10px;
301
+ background-color: #fff;
302
+ }
303
+
304
+ .happyforms-part--radio .option-label .border {
305
+ position: absolute;
306
+ top: 0;
307
+ left: 0;
308
+ z-index: 0;
309
+ width: 100%;
310
+ height: 100%;
311
+ border-radius: 6px;
312
+ border: 1px solid;
313
+ border-color: #dbdbdb;
314
+ border-color: var(--happyforms-color-part-border);
315
+ background-color: #fff;
316
+ background-color: var(--happyforms-color-part-background);
317
+ transition: border-color var(--happyforms-transition-duration);
318
+ }
319
+
320
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio .option-label .border {
321
+ border-top-color: transparent;
322
+ border-left-color: transparent;
323
+ border-right-color: transparent;
324
+ }
325
+
326
+ .happyforms-form--part-border-off .option-label .border {
327
+ border-color: transparent;
328
+ }
329
+
330
+ .happyforms-part--radio .option-label input,
331
+ .happyforms-part--checkbox .option-label input {
332
+ top: 3px;
333
+ }
334
+
335
+ .happyforms-part--radio input:checked~.border,
336
+ .happyforms-part--radio .option-label:hover .border {
337
+ border-color: #000;
338
+ border-color: var(--happyforms-color-part-border-focus);
339
+ background-color: #fff;
340
+ background-color: var(--happyforms-color-part-background-focus);
341
+ }
342
+
343
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio input:checked~.border,
344
+ .happyforms-form--part-borders-bottom-only .happyforms-part--radio .option-label:hover .border {
345
+ border-top-color: transparent;
346
+ border-left-color: transparent;
347
+ border-right-color: transparent;
348
+ }
349
+
350
+ .happyforms-part--radio .option-label input:focus {
351
+ outline: 0;
352
+ }
353
+
354
+ .happyforms-part--radio .option-label .label,
355
+ .happyforms-part--checkbox .option-label .label {
356
+ position: relative;
357
+ display: inline-block;
358
+ margin-right: 15px;
359
+ padding: 0 10px;
360
+ }
361
+
362
+ .happyforms-part-option {
363
+ margin-bottom: 20px;
364
+ }
365
+
366
+ .happyforms-part-option__description {
367
+ display: block;
368
+ width: 100%;
369
+ max-width: 400px;
370
+ margin-top: 3px;
371
+ margin-right: 20px;
372
+ font-size: 12px;
373
+ color: #000;
374
+ color: var(--happyforms-color-primary);
375
+ }
376
+
377
+ .happyforms-part--radio.display-type--block .happyforms-part-option__description {
378
+ max-width: none;
379
+ }
380
+
381
+ .happyforms-part.display-type--block .option-label {
382
+ display: block;
383
+ margin-right: 0;
384
+ }
385
+
386
+ .happyforms-part--checkbox.display-type--block .option-label {
387
+ margin-bottom: 10px;
388
+ }
389
+
390
+ /* tooltips */
391
+
392
+ .happyforms-tooltip {
393
+ position: absolute;
394
+ bottom: 0;
395
+ left: 0;
396
+ right: 10px;
397
+ height: 50%;
398
+ overflow: visible;
399
+ pointer-events: none;
400
+ }
401
+
402
+ .happyforms-tooltip__trigger {
403
+ display: block;
404
+ position: absolute;
405
+ top: 48%;
406
+ right: 1px;
407
+ padding: 10px;
408
+ background-color: transparent;
409
+ -ms-transform: translate(0, -50%);
410
+ -webkit-transform: translate(0, -50%);
411
+ transform: translate(0, -50%);
412
+ pointer-events: auto;
413
+ cursor: pointer;
414
+ }
415
+
416
+ .happyforms-tooltip__trigger:after {
417
+ content: "?";
418
+ display: block;
419
+ width: 18px;
420
+ height: 18px;
421
+ border-radius: 50%;
422
+ font-style: normal;
423
+ font-size: 11px;
424
+ line-height: 18px;
425
+ color: #fff;
426
+ color: var(--happyforms-color-part-background);
427
+ text-align: center;
428
+ background-color: #000;
429
+ background-color: var(--happyforms-color-part-value);
430
+ }
431
+
432
+ .happyforms-tooltip .happyforms-part__description {
433
+ position: absolute;
434
+ z-index: 999;
435
+ top: 0;
436
+ right: 0;
437
+ transform: translate(0, -115%);
438
+ opacity: 0;
439
+ width: auto;
440
+ visibility: hidden;
441
+ padding: 10px 15px;
442
+ border: 1px solid #dbdbdb;
443
+ border-radius: 6px;
444
+ font-weight: normal;
445
+ color: #000;
446
+ color: var(--happyforms-color-primary);
447
+ text-align: center;
448
+ background-color: #fff;
449
+ background-color: var(--happyforms-color-part-background);
450
+ transition: opacity 0.2s;
451
+ }
452
+
453
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip .happyforms-part__description {
454
+ transform: translate(0, -100%);
455
+ }
456
+
457
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip {
458
+ height: 54%;
459
+ }
460
+
461
+ .happyforms-form--part-inner-padding-narrow .happyforms-tooltip .happyforms-part__description {
462
+ transform: translate(0, -120%);
463
+ }
464
+
465
+ .happyforms-form--part-inner-padding-narrow .happyforms-tooltip {
466
+ height: 42%;
467
+ }
468
+
469
+ .happyforms-form--part-inner-padding-wide .happyforms-tooltip .happyforms-part__description {
470
+ transform: translate(0, -100%);
471
+ }
472
+
473
+ .happyforms-tooltip .happyforms-part__description:before {
474
+ content: '';
475
+ position: absolute;
476
+ top: 100%;
477
+ right: 12px;
478
+ width: 0;
479
+ height: 0;
480
+ border: 8px solid transparent;
481
+ border-top-color: #dbdbdb;
482
+ }
483
+
484
+ .happyforms-tooltip .happyforms-part__description:after {
485
+ content: '';
486
+ position: absolute;
487
+ top: calc(100% - 1px);
488
+ right: 13px;
489
+ width: 0;
490
+ height: 0;
491
+ border: 7px solid transparent;
492
+ border-top-color: #fff;
493
+ border-top-color: var(--happyforms-color-part-background);
494
+ }
495
+
496
+ .happyforms-tooltip:hover .happyforms-part__description {
497
+ visibility: visible;
498
+ opacity: 1;
499
+ }
500
+
501
+ .happyforms-part--multi_line_text .happyforms-tooltip,
502
+ .happyforms-part--date .happyforms-tooltip,
503
+ .happyforms-part--select .happyforms-tooltip,
504
+ .happyforms-part--rating .happyforms-tooltip,
505
+ .happyforms-part--scale .happyforms-tooltip,
506
+ .happyforms-part--checkbox .happyforms-tooltip,
507
+ .happyforms-part--radio .happyforms-tooltip,
508
+ .happyforms-part--title .happyforms-tooltip {
509
+ top: 0;
510
+ bottom: auto;
511
+ }
512
+
513
+ .happyforms-part--multi_line_text .happyforms-tooltip,
514
+ .happyforms-part--checkbox .happyforms-tooltip,
515
+ .happyforms-part--radio .happyforms-tooltip {
516
+ height: 30px;
517
+ }
518
+
519
+ .happyforms-part--multi_line_text .happyforms-tooltip .happyforms-part__description,
520
+ .happyforms-part--checkbox .happyforms-tooltip .happyforms-part__description,
521
+ .happyforms-part--radio .happyforms-tooltip .happyforms-part__description {
522
+ transform: translate(0, -130%);
523
+ }
524
+
525
+ /* parts - radio, checkbox */
526
+
527
+ .happyforms-part--radio .happyforms-part__el {
528
+ display: flex;
529
+ }
530
+
531
+ .happyforms-part--radio {
532
+ margin-bottom: 0;
533
+ }
534
+
535
+ .happyforms-part--radio.display-type--block {
536
+ margin-bottom: 20px;
537
+ }
538
+
539
+ .happyforms-part--radio .checkmark,
540
+ .happyforms-part--checkbox .checkmark {
541
+ position: relative;
542
+ top: 4px;
543
+ z-index: 5;
544
+ display: inline-block;
545
+ width: 20px;
546
+ height: 20px;
547
+ border-radius: 50%;
548
+ border: 1px solid;
549
+ border-color: #dbdbdb;
550
+ border-color: var(--happyforms-color-part-border);
551
+ }
552
+
553
+ .happyforms-part--checkbox .checkmark {
554
+ border-radius: 0;
555
+ }
556
+
557
+ .happyforms-part.display-type--block .checkmark {
558
+ margin-right: 5px;
559
+ }
560
+
561
+ .happyforms-part--radio input:checked+.checkmark,
562
+ .happyforms-part--checkbox input:checked+.checkmark {
563
+ border-color: #000;
564
+ border-color: var(--happyforms-color-part-border-focus);
565
+ background-color: #000;
566
+ background-color: var(--happyforms-color-part-border-focus);
567
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAVCAYAAABVAo5cAAAA7UlEQVRIS7XUbRHCMAwG4DcSQAKTgAWQABaQgAW8IGFIAAlgYRJeLru2t6+un8vPNtfn0jYRbBQkdwBOIvIcErKFR/II4G3O7kRkb53q4ASzjkOrgh7MoQCaamAAs+itChiJKVpeYQJ2FpFXUYWpmJY4Akm2ALR/riLyW2uZHGwEkvwCOAyQxofmYg5cwKw7Q0uwHiSpE0Engy8cWopZkBHjrTE5eu2h6H+jL0krvAN4hE6J3F/Fhm9YAw1i019agkZhS32Yg0ZjM1AXEt80CVsEE9BkzAtGoFnYKmjQi2kZna8anZmzn8g2maX9AawIfKa8qZx5AAAAAElFTkSuQmCC);
568
+ background-size: 12px auto;
569
+ background-repeat: no-repeat;
570
+ background-position: center center;
571
+ }
572
+
573
+ /* parts - scale */
574
+
575
+ .happyforms-part input[type=range] {
576
+ -webkit-appearance: none;
577
+ padding: 0;
578
+ border: 0;
579
+ width: 100%;
580
+ }
581
+
582
+ .happyforms-part input[type=range]:focus {
583
+ border: 0;
584
+ outline: 0;
585
+ }
586
+
587
+ .happyforms-part input[type=range]::-webkit-slider-runnable-track {
588
+ width: 100%;
589
+ height: 1px;
590
+ cursor: pointer;
591
+ animate: 0.25s;
592
+ animate: var(--happyforms-transition-duration);
593
+ box-shadow: none;
594
+ background: #000;
595
+ background: var(--happyforms-color-part-value);
596
+ }
597
+
598
+ .happyforms-part input[type=range]::-webkit-slider-thumb {
599
+ -webkit-appearance: none;
600
+ width: 20px;
601
+ height: 20px;
602
+ margin-top: -10px;
603
+ border: 1px solid;
604
+ border-color: #000;
605
+ border-color: var(--happyforms-color-part-value);
606
+ border-radius: 50%;
607
+ box-shadow: none;
608
+ background: #000;
609
+ background: var(--happyforms-color-part-value);
610
+ cursor: pointer;
611
+ }
612
+
613
+ .happyforms-part input[type=range]:focus::-webkit-slider-runnable-track {
614
+ background: #000;
615
+ }
616
+
617
+ .happyforms-part input[type=range]::-moz-range-track {
618
+ width: 100%;
619
+ height: 1px;
620
+ cursor: pointer;
621
+ animate: 0.25s;
622
+ animate: var(--happyforms-transition-duration);
623
+ box-shadow: none;
624
+ background: #000;
625
+ background: var(--happyforms-color-part-value);
626
+ }
627
+
628
+ .happyforms-part input[type=range]::-moz-range-thumb {
629
+ width: 20px;
630
+ height: 20px;
631
+ margin-top: -10px;
632
+ border: 1px solid;
633
+ border-color: #000;
634
+ border-color: var(--happyforms-color-part-value);
635
+ border-radius: 50%;
636
+ box-shadow: none;
637
+ background: #000;
638
+ background: var(--happyforms-color-part-value);
639
+ cursor: pointer;
640
+ }
641
+
642
+ .happyforms-part input[type=range]::-ms-track {
643
+ width: 100%;
644
+ height: 1px;
645
+ cursor: pointer;
646
+ animate: 0.25s;
647
+ animate: var(--happyforms-transition-duration);
648
+ box-shadow: none;
649
+ background: #000;
650
+ background: var(--happyforms-color-part-value);
651
+ }
652
+
653
+ .happyforms-part input[type=range]::-ms-fill-lower {
654
+ background: #000;
655
+ background: var(--happyforms-color-part-value);
656
+ border: 0;
657
+ box-shadow: none;
658
+ }
659
+
660
+ .happyforms-part input[type=range]::-ms-fill-upper {
661
+ background: #000;
662
+ background: var(--happyforms-color-part-value);
663
+ border: 0;
664
+ box-shadow: none;
665
+ }
666
+
667
+ .happyforms-part input[type=range]::-ms-thumb {
668
+ width: 20px;
669
+ height: 20px;
670
+ margin-top: -10px;
671
+ border: 1px solid #000;
672
+ border: var(--happyforms-color-part-value);
673
+ border-radius: 50%;
674
+ box-shadow: none;
675
+ background: #000;
676
+ background: var(--happyforms-color-part-value);
677
+ cursor: pointer;
678
+ }
679
+
680
+ .happyforms-part input[type=range]:focus::-ms-fill-lower {
681
+ background: #000;
682
+ background: var(--happyforms-color-part-value);
683
+ }
684
+
685
+ .happyforms-part input[type=range]:focus::-ms-fill-upper {
686
+ background: #000;
687
+ background: var(--happyforms-color-part-value);
688
+ }
689
+
690
+ .happyforms-part--scale output {
691
+ display: block;
692
+ position: relative;
693
+ width: 30px;
694
+ text-align: center;
695
+ color: #d0d0d0;
696
+ }
697
+
698
+ .happyforms-part--scale__labels {
699
+ position: relative;
700
+ width: 100%;
701
+ }
702
+
703
+ .happyforms-part--scale__labels .label-min {
704
+ float: left;
705
+ }
706
+
707
+ .happyforms-part--scale__labels .label-max {
708
+ float: right;
709
+ }
710
+
711
+ .happyforms-part--label-below input,
712
+ .happyforms-part--label-below textarea,
713
+ .happyforms-part--label-below select,
714
+ .happyforms-part--label-below .happyforms-part__select-wrap,
715
+ .happyforms-part--label-below .happyforms-part__el {
716
+ order: 3;
717
+ }
718
+
719
+ .happyforms-part--label-below .happyforms-part__description {
720
+ order: 1;
721
+ margin-top: 0;
722
+ }
723
+
724
+ .happyforms-part--label-below.happyforms-part--date .happyforms-part__el {
725
+ width: 100%;
726
+ order: 2;
727
+ }
728
+
729
+ .happyforms-part--label-left .happyforms-part__label {
730
+ float: left;
731
+ width: 25%;
732
+ }
733
+
734
+ .happyforms-part--label-left input.happyforms-part__el,
735
+ .happyforms-part--label-left textarea.happyforms-part__el,
736
+ .happyforms-part--label-left .happyforms-part__select-wrap {
737
+ float: right;
738
+ width: 75%;
739
+ }
740
+
741
+ .happyforms-part--label-left .happyforms-part__description {
742
+ clear: both;
743
+ float: right;
744
+ width: 75%;
745
+ }
746
+
747
+ .happyforms-part--label-below .happyforms-part__el,
748
+ .happyforms-part--label-below input.happyforms-part__el,
749
+ .happyforms-part--label-below select.happyforms-part__el,
750
+ .happyforms-part--label-below textarea.happyforms-part__el {
751
+ position: relative;
752
+ top: 5px;
753
+ margin-bottom: 10px;
754
+ }
755
+
756
+ /* parts - placeholder */
757
+
758
+ .happyforms-part--placeholder p {
759
+ font-size: 16px;
760
+ color: #000;
761
+ }
762
+
763
+ .happyforms-part--placeholder p:first-child {
764
+ margin-top: 0;
765
+ }
766
+
767
+ .happyforms-part--placeholder p:last-child {
768
+ margin-bottom: 0;
769
+ }
770
+
771
+ /* parts - select */
772
+
773
+ .happyforms-part--select select,
774
+ .happyforms-part--date select,
775
+ .happyforms-part--title select {
776
+ position: relative;
777
+ -webkit-appearance: none;
778
+ -moz-appearance: none;
779
+ appearance: none;
780
+ width: 100%;
781
+ padding: 10px;
782
+ border: 1px solid;
783
+ border-radius: 6px;
784
+ border-color: #dbdbdb;
785
+ border-color: var(--happyforms-color-part-border);
786
+ line-height: 1.4;
787
+ background-color: #fff;
788
+ background-color: var(--happyforms-color-part-background);
789
+ font-size: 16px;
790
+ font-size: var(--happyforms-part-value-font-size);
791
+ }
792
+
793
+ .happyforms-form--part-border-off .happyforms-part--select select,
794
+ .happyforms-form--part-border-off .happyforms-part--date select,
795
+ .happyforms-form--part-border-off .happyforms-part--title select {
796
+ border-color: transparent;
797
+ }
798
+
799
+ .happyforms-part-date--date .happyforms-part-date__time-input {
800
+ display: none;
801
+ }
802
+
803
+ .happyforms-part-date--time .happyforms-part-date__date-input {
804
+ display: none;
805
+ }
806
+
807
+ .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__el,
808
+ .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__el {
809
+ flex-wrap: wrap;
810
+ }
811
+
812
+ .happyforms-part-date--datetime.happyforms-part--width-half .happyforms-part__select-wrap,
813
+ .happyforms-part-date--datetime.happyforms-part--width-third .happyforms-part__select-wrap {
814
+ min-width: 33.333%;
815
+ margin-bottom: 15px;
816
+ }
817
+
818
+ .happyforms-part__select-wrap {
819
+ position: relative;
820
+ flex: 1;
821
+ padding: 0 0 0 2%;
822
+ }
823
+
824
+ .happyforms-part__select-wrap:first-of-type {
825
+ padding-left: 0 !important;
826
+ }
827
+
828
+ .happyforms-part__select-wrap:after {
829
+ content: '';
830
+ position: absolute;
831
+ top: 22%;
832
+ right: 15px;
833
+ z-index: 999;
834
+ display: block;
835
+ width: 25px;
836
+ height: 25px;
837
+ font-size: 22px;
838
+ color: #000;
839
+ color: var(--happyforms-color-part-value);
840
+ fill: #000;
841
+ fill: var(--happyforms-color-part-value);
842
+ stroke: #000;
843
+ stroke: var(--happyforms-color-part-value);
844
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBkPSJNNSA4bDQgNCA0LTR6Ii8+PC9zdmc+);
845
+ background-size: cover;
846
+ background-repeat: no-repeat;
847
+ }
848
+
849
+ .happyforms-part--date .happyforms-part__select-wrap:after {
850
+ top: calc(46% - 12px);
851
+ right: 15px;
852
+ }
853
+
854
+ .happyforms-part--select select:focus,
855
+ .happyforms-part--date select:focus {
856
+ outline-width: 1px;
857
+ outline-color: #000000;
858
+ outline-color: var(--happyforms-color-part-value);
859
+ }
860
+
861
+ .happyforms-part--date .happyforms-part__el {
862
+ display: flex;
863
+ }
864
+
865
+ .happyforms-part__select-wrap:last-child {
866
+ padding-right: 0;
867
+ }
868
+
869
+ /* parts - rating */
870
+
871
+ .happyforms-part--rating .happyforms-rating-item-wrap {
872
+ float: left;
873
+ margin-right: 5px;
874
+ }
875
+
876
+ .happyforms-part--rating .happyforms-rating-item-wrap:last-child {
877
+ margin-right: 0;
878
+ }
879
+
880
+ .happyforms-part--rating .happyforms-star {
881
+ width: 35px;
882
+ height: 35px;
883
+ }
884
+
885
+ .happyforms-part--rating .happyforms-star__label {
886
+ cursor: pointer;
887
+ float: left;
888
+ margin-right: 5px;
889
+ color: #f39c00;
890
+ color: var(--happyforms-color-rating-hover);
891
+ }
892
+
893
+ .happyforms-part--rating .happyforms-star__star {
894
+ fill: currentColor;
895
+ stroke: currentColor;
896
+ stroke-width: 35px;
897
+ }
898
+
899
+ .happyforms-part--rating .happyforms-part-wrap {
900
+ fill: #ccc;
901
+ fill: var(--happyforms-color-rating);
902
+ color: transparent;
903
+ stroke: #ccc;
904
+ stroke: var(--happyforms-color-rating);
905
+ }
906
+
907
+ .happyforms-part--rating:hover .happyforms-part-wrap {
908
+ color: #ccc;
909
+ fill: #f39c00;
910
+ fill: var(--happyforms-color-rating-hover);
911
+ stroke: #f39c00;
912
+ stroke: var(--happyforms-color-rating-hover);
913
+ }
914
+
915
+ .happyforms-part--rating label {
916
+ fill: inherit;
917
+ color: inherit;
918
+ stroke: inherit;
919
+ }
920
+
921
+ .happyforms-part--rating .happyforms-star__label {
922
+ cursor: pointer;
923
+ float: left;
924
+ margin-right: 5px;
925
+ }
926
+
927
+ .happyforms-part--rating .happyforms-star__label {
928
+ color: #f39c00;
929
+ color: var(--happyforms-color-rating-hover);
930
+ }
931
+
932
+ .happyforms-part--rating:not(:hover) input:first-child:checked~label,
933
+ .happyforms-part--rating input:hover+label~label:not(:hover),
934
+ .happyforms-part--rating:hover input:checked+label:hover~label,
935
+ .happyforms-part--rating:not(:hover) input:checked+label~label {
936
+ color: #ccc;
937
+ color: var(--happyforms-color-rating);
938
+ }
939
+
940
+ /* parts - legal */
941
+
942
+ .happyforms-part--legal span {
943
+ margin-left: 5px;
944
+ font-weight: normal;
945
+ font-size: 16px;
946
+ font-size: var(--happyforms-part-value-font-size);
947
+ }
948
+
949
+ /* parts - address */
950
+
951
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part-el-wrap {
952
+ display: flex;
953
+ }
954
+
955
+ .happyforms-part--address .happyforms-part__el {
956
+ position: relative;
957
+ }
958
+
959
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el {
960
+ flex: 1;
961
+ }
962
+
963
+ .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
964
+ padding-right: 2%;
965
+ }
966
+
967
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
968
+ padding-right: 1%;
969
+ }
970
+
971
+ .happyforms-form--part-outer-padding-wide .happyforms-part--address.happyforms-part--address-country-city .happyforms-part__el:first-child {
972
+ padding-right: 6%;
973
+ }
974
+
975
+ .happyforms-part__el--address--results {
976
+ position: absolute;
977
+ z-index: 9999;
978
+ width: 100%;
979
+ margin: 2px 0 0;
980
+ padding: 0;
981
+ border-radius: 6px;
982
+ }
983
+
984
+ .happyforms-part__el--address--results ul {
985
+ list-style-type: none;
986
+ padding: 0;
987
+ border: 1px solid;
988
+ border-color: #000;
989
+ border-color: var(--happyforms-color-part-border-focus);
990
+ border-radius: 6px;
991
+ background-color: #fff;
992
+ background-color: var(--happyforms-color-part-background);
993
+ }
994
+
995
+ .happyforms-part__el--address--results ul li {
996
+ cursor: pointer;
997
+ list-style: none;
998
+ padding: 3px 10px;
999
+ border-bottom: 1px solid;
1000
+ border-color: #dbdbdb;
1001
+ border-color: var(--happyforms-color-part-border);
1002
+ font-size: 16px;
1003
+ font-size: var(--happyforms-part-value-font-size);
1004
+ color: #000;
1005
+ color: var(--happyforms-color-part-value);
1006
+ }
1007
+
1008
+ .happyforms-part__el--address--results ul li:hover {
1009
+ border-color: #000;
1010
+ border-color: var(--happyforms-color-part-border-focus);
1011
+ }
1012
+
1013
+ .happyforms-part__el--address--results-google ul:after {
1014
+ content: "";
1015
+ padding: 5px 10px 0;
1016
+ height: 16px;
1017
+ box-sizing: content-box;
1018
+ text-align: right;
1019
+ display: block;
1020
+ background-image: url(https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white3.png);
1021
+ background-position: calc(100% - 10px) center;
1022
+ background-repeat: no-repeat;
1023
+ background-size: 120px 14px;
1024
+ }
1025
+
1026
+ /* submit button */
1027
+
1028
+ .happyforms-part--submit {
1029
+ width: 100%;
1030
+ margin-bottom: 0;
1031
+ }
1032
+
1033
+ input[type=submit].happyforms-button--submit,
1034
+ input[type=submit][disabled].happyforms-button--submit,
1035
+ input[type=submit][disabled].happyforms-button--submit:hover {
1036
+ height: auto;
1037
+ padding: 17px 50px;
1038
+ border-radius: 6px;
1039
+ border: 1px solid transparent;
1040
+ border-color: var(--happyforms-color-submit-border);
1041
+ font-weight: normal;
1042
+ font-style: normal;
1043
+ font-size: 18px;
1044
+ font-size: var(--happyforms-submit-button-font-size);
1045
+ color: #fff;
1046
+ color: var(--happyforms-color-submit-text);
1047
+ background-color: #000;
1048
+ background-color: var(--happyforms-color-submit-background);
1049
+ text-transform: none;
1050
+ transition-property: all;
1051
+ transition-duration: 0.25s;
1052
+ transition-duration: var(--happyforms-transition-duration);
1053
+ transition-timing-function: ease-in;
1054
+ }
1055
+
1056
+ input[type=submit][disabled].happyforms-button--submit,
1057
+ input[type=submit][disabled].happyforms-button--submit:hover {
1058
+ cursor: default;
1059
+ opacity: 0.5;
1060
+ }
1061
+
1062
+ input[type=submit].happyforms-button--submit:hover {
1063
+ border-radius: 6px;
1064
+ border-color: transparent;
1065
+ border-color: var(--happyforms-color-submit-border);
1066
+ background-color: #dbdbdb;
1067
+ background-color: var(--happyforms-color-submit-background-hover);
1068
+ text-transform: none;
1069
+ color: #000000;
1070
+ color: var(--happyforms-color-submit-text-hover);
1071
+ }
1072
+
1073
+ input[type=submit].happyforms-button--submit:focus {
1074
+ border-radius: 6px;
1075
+ border-color: transparent;
1076
+ border-color: var(--happyforms-color-submit-border);
1077
+ background-color: #dbdbdb;
1078
+ background-color: var(--happyforms-color-submit-background-focus);
1079
+ text-transform: none;
1080
+ color: #000000;
1081
+ color: var(--happyforms-color-submit-text-hover);
1082
+ }
1083
+
1084
+ /* notices */
1085
+
1086
+ .happyforms-message-notice h2 {
1087
+ margin-top: 0;
1088
+ margin-bottom: 0;
1089
+ font-weight: bold;
1090
+ font-size: 14px !important;
1091
+ padding: 20px;
1092
+ color: #000;
1093
+ color: var(--happyforms-color-primary);
1094
+ }
1095
+
1096
+ .happyforms-message-notice.error h2 {
1097
+ margin-top: 0;
1098
+ margin-bottom: 5px;
1099
+ padding: 0;
1100
+ font-weight: normal;
1101
+ color: #ff7550;
1102
+ color: var(--happyforms-color-error);
1103
+ }
1104
+
1105
+ .happyforms-message-notice.success h2,
1106
+ .happyforms-message-notice.error-submission h2 {
1107
+ margin-top: 0 !important;
1108
+ margin-bottom: 0 !important;
1109
+ padding-top: 0 !important;
1110
+ padding-bottom: 0 !important;
1111
+ font-size: 16px !important;
1112
+ }
1113
+
1114
+ .happyforms-message-notice.success,
1115
+ .happyforms-message-notice.error-submission {
1116
+ padding: 25px 0;
1117
+ border: 3px solid;
1118
+ border-width: 3px;
1119
+ border-color: #000;
1120
+ border-color: var(--happyforms-color-primary);
1121
+ background-color: transparent;
1122
+ }
1123
+
1124
+ .happyforms-message-notice.success h2 {
1125
+ color: #39b54a;
1126
+ color: var(--happyforms-color-success);
1127
+ }
1128
+
1129
+ .happyforms-message-notice.error-submission {
1130
+ border-color: #ff7550;
1131
+ border-color: var(--happyforms-color-error);
1132
+ }
1133
+
1134
+ .happyforms-part .happyforms-message-notices {
1135
+ padding: 0;
1136
+ }
1137
+
1138
+ .happyforms-part .happyforms-message-notices h2 {
1139
+ font-size: 14px;
1140
+ }
1141
+
1142
+ .happyforms-part .happyforms-error+input,
1143
+ .happyforms-part .happyforms-error+textarea {
1144
+ border: 2px solid;
1145
+ border-color: #ff7550;
1146
+ border-color: var(--happyforms-color-error);
1147
+ }
1148
+
1149
+ .happyforms-form__title+.happyforms-message-notices {
1150
+ margin-top: 25px;
1151
+ }
1152
+
1153
+ /* umbrella classes */
1154
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=text],
1155
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=email],
1156
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=tel],
1157
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=number],
1158
+ .happyforms-form--part-border-radius-square .happyforms-part input[type=range],
1159
+ .happyforms-form--part-border-radius-square .happyforms-part textarea,
1160
+ .happyforms-form--part-border-radius-square .happyforms-part select,
1161
+ .happyforms-form--part-border-radius-square .happyforms-part__el--address--results ul {
1162
+ border-radius: 0px;
1163
+ }
1164
+
1165
+ .happyforms-form--part-border-radius-square .happyforms-part--radio .option-label .border {
1166
+ border-radius: 0px;
1167
+ }
1168
+
1169
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=text],
1170
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=email],
1171
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=tel],
1172
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=number],
1173
+ .happyforms-form--part-border-radius-pill .happyforms-part input[type=range],
1174
+ .happyforms-form--part-border-radius-pill .happyforms-part textarea,
1175
+ .happyforms-form--part-border-radius-pill .happyforms-part select {
1176
+ border-radius: 25px;
1177
+ padding-left: 25px;
1178
+ padding-right: 25px;
1179
+ }
1180
+
1181
+ .happyforms-form--part-border-radius-pill .happyforms-part__el--address--results ul {
1182
+ border-radius: 25px;
1183
+ }
1184
+
1185
+ .happyforms-form--part-border-radius-pill .happyforms-part--radio .option-label .border {
1186
+ border-radius: 25px;
1187
+ }
1188
+
1189
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-webkit-input-placeholder {
1190
+ color: transparent;
1191
+ transition: color var(--happyforms-transition-duration);
1192
+ }
1193
+
1194
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-moz-placeholder {
1195
+ color: transparent;
1196
+ transition: color var(--happyforms-transition-duration);
1197
+ }
1198
+
1199
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::-ms-placeholder {
1200
+ color: transparent;
1201
+ transition: color var(--happyforms-transition-duration);
1202
+ }
1203
+
1204
+ .happyforms-form--part-placeholder-toggle .happyforms-part ::placeholder {
1205
+ color: transparent;
1206
+ transition: color var(--happyforms-transition-duration);
1207
+ }
1208
+
1209
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-webkit-input-placeholder {
1210
+ color: #aaa;
1211
+ }
1212
+
1213
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-moz-placeholder {
1214
+ color: #aaa;
1215
+ }
1216
+
1217
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::-ms-placeholder {
1218
+ color: #aaa;
1219
+ }
1220
+
1221
+ .happyforms-form--part-placeholder-toggle .happyforms-part input:focus::placeholder {
1222
+ color: #aaa;
1223
+ }
1224
+
1225
+ /* labels */
1226
+
1227
+ .happyforms-part--label-inside label {
1228
+ position: absolute;
1229
+ top: 10px;
1230
+ left: 11px;
1231
+ }
1232
+
1233
+ .happyforms-part--label-inside input,
1234
+ .happyforms-part--label-inside textarea,
1235
+ .happyforms-part--label-as_placeholder input,
1236
+ .happyforms-part--label-as_placeholder textarea {
1237
+ padding-top: 35px !important;
1238
+ }
1239
+
1240
+ /* part borders */
1241
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=text],
1242
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=email],
1243
+ .happyforms-form--part-borders-bottom-only .happyforms-part input[type=number],
1244
+ .happyforms-form--part-borders-bottom-only .happyforms-part textarea,
1245
+ .happyforms-form--part-borders-bottom-only .happyforms-part select {
1246
+ border-top-color: transparent;
1247
+ border-left-color: transparent;
1248
+ border-right-color: transparent;
1249
+ }
1250
+
1251
+ /* part border transitions */
1252
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=text],
1253
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=email],
1254
+ .happyforms-form--part-disable-transitions .happyforms-part input[type=number],
1255
+ .happyforms-form--part-disable-transitions .happyforms-part textarea {
1256
+ transition-duration: 0s;
1257
+ }
1258
+
1259
+ .happyforms-part input[type=text],
1260
+ .happyforms-part input[type=email],
1261
+ .happyforms-part input[type=number],
1262
+ .happyforms-part textarea {
1263
+ transition: border-color 0.4s;
1264
+ transition: border-color var(--happyforms-transition-duration);
1265
+ }
1266
+
1267
+ /* part labels transitions */
1268
+ .happyforms-part--label-as_placeholder label {
1269
+ transition-duration: 0.4s;
1270
+ transition-duration: var(--happyforms-transition-duration);
1271
+ }
1272
+
1273
+ .happyforms-part--label-as_placeholder ::-webkit-input-placeholder {
1274
+ opacity: 0;
1275
+ }
1276
+
1277
+ .happyforms-part--label-as_placeholder ::-moz-placeholder {
1278
+ opacity: 0;
1279
+ }
1280
+
1281
+ .happyforms-part--label-as_placeholder ::-ms-placeholder {
1282
+ opacity: 0;
1283
+ }
1284
+
1285
+ .happyforms-part--label-as_placeholder ::placeholder {
1286
+ opacity: 0;
1287
+ }
1288
+
1289
+ .happyforms-part--label-as_placeholder label {
1290
+ position: absolute;
1291
+ left: 11px;
1292
+ top: 25px;
1293
+ transition-property: top;
1294
+ }
1295
+
1296
+ .happyforms-part--label-as_placeholder input:focus~label,
1297
+ .happyforms-part--label-as_placeholder textarea:focus~label,
1298
+ .happyforms-part--label-as_placeholder.happyforms-part--filled input~label,
1299
+ .happyforms-part--label-as_placeholder.happyforms-part--filled textarea~label {
1300
+ top: 10px;
1301
+ }
1302
+
1303
+ /* part padding */
1304
+
1305
+ .happyforms-form--part-outer-padding-narrow .happyforms-form__part {
1306
+ padding: 0 0.5%;
1307
+ }
1308
+
1309
+ .happyforms-form--part-outer-padding-narrow .happyforms-part__select-wrap {
1310
+ padding: 0 0 0 1%;
1311
+ }
1312
+
1313
+ .happyforms-form--part-outer-padding-narrow .happyforms-part-option {
1314
+ margin-right: -5px;
1315
+ }
1316
+
1317
+ .happyforms-form--part-outer-padding-narrow .happyforms-part.display-type--block .happyforms-part-option {
1318
+ margin-right: 0;
1319
+ margin-bottom: 5px;
1320
+ }
1321
+
1322
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--radio .option-label {
1323
+ margin-right: 15px;
1324
+ }
1325
+
1326
+ .happyforms-form--part-outer-padding-narrow .happyforms-part--checkbox.display-type--block .option-label {
1327
+ margin-bottom: 0;
1328
+ }
1329
+
1330
+ .happyforms-form--part-outer-padding-wide .happyforms-form__part {
1331
+ padding: 20px 3%;
1332
+ }
1333
+
1334
+ .happyforms-form--part-outer-padding-wide .happyforms-part .happyforms-part-option {
1335
+ margin-right: 15px;
1336
+ }
1337
+
1338
+ .happyforms-form--part-outer-padding-wide .happyforms-part.display-type--block .happyforms-part-option {
1339
+ margin-right: 0;
1340
+ margin-bottom: 35px;
1341
+ }
1342
+
1343
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=text],
1344
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=email],
1345
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=tel],
1346
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=number],
1347
+ .happyforms-form--part-inner-padding-narrow .happyforms-part input[type=range],
1348
+ .happyforms-form--part-inner-padding-narrow .happyforms-part textarea,
1349
+ .happyforms-form--part-inner-padding-narrow .happyforms-part select,
1350
+ .happyforms-form--part-inner-padding-narrow .happyforms-part .option-label {
1351
+ padding: 5px;
1352
+ }
1353
+
1354
+ .happyforms-form--part-inner-padding-narrow .happyforms-part--checkbox .option-label {
1355
+ margin-right: 0;
1356
+ margin-bottom: 0;
1357
+ padding-left: 0;
1358
+ padding-right: 0;
1359
+ }
1360
+
1361
+ .happyforms-form--part-inner-padding-narrow .happyforms-part--checkbox .option-label .label {
1362
+ padding-left: 5px;
1363
+ }
1364
+
1365
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=text],
1366
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=email],
1367
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=tel],
1368
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=number],
1369
+ .happyforms-form--part-inner-padding-wide .happyforms-part input[type=range],
1370
+ .happyforms-form--part-inner-padding-wide .happyforms-part textarea,
1371
+ .happyforms-form--part-inner-padding-wide .happyforms-part select,
1372
+ .happyforms-form--part-inner-padding-wide .happyforms-part .option-label {
1373
+ padding: 15px;
1374
+ }
1375
+
1376
+ .happyforms-form--part-inner-padding-wide .happyforms-part--checkbox .option-label {
1377
+ padding-left: 0;
1378
+ padding-right: 0;
1379
+ margin-right: 30px;
1380
+ }
1381
+
1382
+ .happyforms-form--part-inner-padding-wide .happyforms-part--checkbox .option-label .label {
1383
+ padding-left: 15px;
1384
+ }
1385
+
1386
+ .happyforms-form--part-hide-labels .happyforms-part__label {
1387
+ display: none;
1388
+ }
1389
+
1390
+ /* submit button */
1391
+
1392
+ .happyforms-form--submit-button-border-hide input[type=submit].happyforms-button--submit {
1393
+ border-width: 0;
1394
+ }
1395
+
1396
+ .happyforms-form--submit-button-border-radius-square input[type=submit].happyforms-button--submit {
1397
+ border-radius: 0;
1398
+ }
1399
+
1400
+ .happyforms-form--submit-button-border-radius-pill input[type=submit].happyforms-button--submit {
1401
+ border-radius: 30px;
1402
+ }
1403
+
1404
+ .happyforms-form--submit-button-fullwidth input[type=submit].happyforms-button--submit {
1405
+ width: 100%;
1406
+ }
1407
+
1408
+ .happyforms-form--submit-button-align-center .happyforms-part--submit {
1409
+ text-align: center;
1410
+ }
1411
+
1412
+ .happyforms-form--submit-button-align-right .happyforms-part--submit {
1413
+ text-align: right;
1414
+ }
1415
+
1416
+ .happyforms-form--submit-button-bold .happyforms-part--submit input[type=submit] {
1417
+ font-weight: bold;
1418
+ }
1419
+
1420
+ .happyforms-form--submit-button-disable-transitions input[type=submit] {
1421
+ transition-duration: 0s !important;
1422
+ }
1423
+
1424
+ .happyforms-form--part-title-font-weight-normal .happyforms-part__label .label {
1425
+ font-weight: normal;
1426
+ }
1427
+
1428
+ /* helpers */
1429
+ .happyforms-visuallyhidden {
1430
+ position: absolute;
1431
+ border: 0;
1432
+ clip: rect(0 0 0 0);
1433
+ width: 1px;
1434
+ height: 1px;
1435
+ margin: -1px;
1436
+ padding: 0;
1437
+ overflow: hidden;
1438
+ }
1439
+
1440
+ /* widget */
1441
+ .widget input[type=submit].happyforms-button--submit,
1442
+ .widget input[type=submit][disabled].happyforms-button--submit,
1443
+ .widget input[type=submit][disabled].happyforms-button--submit:hover {
1444
+ width: 100%;
1445
+ }
trunk/assets/css/preview.css ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body.happyforms-preview {
2
+ background-color: #fff !important;
3
+ padding: 40px;
4
+ }
5
+
6
+ body::before, body::after {
7
+ content: '';
8
+ display: none;
9
+ }
10
+
11
+ .happyforms-block-editable {
12
+ position: relative;
13
+ }
14
+
15
+ .customize-partial-edit-shortcut.happyforms-partial-edit-shortcut {
16
+ display: block;
17
+ position: absolute;
18
+ top: 0;
19
+ }
20
+
21
+ .notice {
22
+ margin-bottom: 15px;
23
+ }
24
+
25
+ .notice-success {
26
+ padding: 1px 12px;
27
+ border-left: 4px solid #46b450;
28
+ box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );
29
+ background: #fff;
30
+ }
31
+
32
+ .notice p {
33
+ margin: 10px 0;
34
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
35
+ font-size: 13px;
36
+ color: #444;
37
+ }
38
+
39
+ .notice a {
40
+ color: #0073aa;
41
+ text-decoration: underline;
42
+ transition: color 0.05s ease-in-out;
43
+ cursor: auto;
44
+ }
45
+
46
+ .notice a:hover {
47
+ color: #00a0d2;
48
+ }
49
+
50
+ /*.happyforms-flex {
51
+ padding: 2.5%;
52
+ overflow: visible;
53
+ }*/
54
+
55
+ /*.happyforms-form h3.happyforms-form__title {
56
+ display: flex !important;
57
+ align-items: center;
58
+ padding: 0;
59
+ }*/
60
+
61
+ .happyforms-preview-badge {
62
+ padding-left: 10px;
63
+ font-weight: 400;
64
+ font-size: 16px;
65
+ }
66
+
67
+ .happyforms-part.highlighted {
68
+ outline: 1px solid lightblue;
69
+ }
70
+
71
+ a.happyforms-ask-link {
72
+ cursor: pointer !important;
73
+ }
trunk/assets/fonts/FontAwesome.otf ADDED
Binary file
trunk/assets/fonts/fontawesome-webfont.eot ADDED
Binary file
trunk/assets/fonts/fontawesome-webfont.svg ADDED
@@ -0,0 +1,2671 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg>
4
+ <metadata>
5
+ Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
6
+ By ,,,
7
+ Copyright Dave Gandy 2016. All rights reserved.
8
+ </metadata>
9
+ <defs>
10
+ <font id="FontAwesome" horiz-adv-x="1536" >
11
+ <font-face
12
+ font-family="FontAwesome"
13
+ font-weight="400"
14
+ font-stretch="normal"
15
+ units-per-em="1792"
16
+ panose-1="0 0 0 0 0 0 0 0 0 0"
17
+ ascent="1536"
18
+ descent="-256"
19
+ bbox="-1.02083 -256.962 2304.6 1537.02"
20
+ underline-thickness="0"
21
+ underline-position="0"
22
+ unicode-range="U+0020-F500"
23
+ />
24
+ <missing-glyph horiz-adv-x="896"
25
+ d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
26
+ <glyph glyph-name=".notdef" horiz-adv-x="896"
27
+ d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
28
+ <glyph glyph-name=".null" horiz-adv-x="0"
29
+ />
30
+ <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597"
31
+ />
32
+ <glyph glyph-name="space" unicode=" " horiz-adv-x="448"
33
+ />
34
+ <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792"
35
+ />
36
+ <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792"
37
+ />
38
+ <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792"
39
+ />
40
+ <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792"
41
+ />
42
+ <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792"
43
+ />
44
+ <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792"
45
+ />
46
+ <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792"
47
+ />
48
+ <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792"
49
+ />
50
+ <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792"
51
+ />
52
+ <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792"
53
+ d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
54
+ <glyph glyph-name="music" unicode="&#xf001;"
55
+ d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
56
+ t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
57
+ <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664"
58
+ d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
59
+ t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
60
+ <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792"
61
+ d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
62
+ t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
63
+ M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
64
+ <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792"
65
+ d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
66
+ q-18 -18 -44 -18z" />
67
+ <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664"
68
+ d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
69
+ l502 -73q56 -9 56 -46z" />
70
+ <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664"
71
+ d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
72
+ l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
73
+ <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280"
74
+ d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
75
+ t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
76
+ <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920"
77
+ d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
78
+ q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
79
+ t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
80
+ q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
81
+ t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
82
+ <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664"
83
+ d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
84
+ h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
85
+ <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792"
86
+ d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
87
+ q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
88
+ h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
89
+ q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
90
+ <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792"
91
+ d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
92
+ q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
93
+ h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
94
+ <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792"
95
+ d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
96
+ <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408"
97
+ d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
98
+ t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
99
+ <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664"
100
+ d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
101
+ q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
102
+ t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
103
+ <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664"
104
+ d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
105
+ M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
106
+ " />
107
+ <glyph glyph-name="off" unicode="&#xf011;"
108
+ d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
109
+ t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
110
+ <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792"
111
+ d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
112
+ v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
113
+ <glyph glyph-name="cog" unicode="&#xf013;"
114
+ d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
115
+ q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
116
+ l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
117
+ q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
118
+ <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408"
119
+ d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
120
+ q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
121
+ q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
122
+ <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664"
123
+ d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
124
+ l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
125
+ <glyph glyph-name="file_alt" unicode="&#xf016;"
126
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
127
+ " />
128
+ <glyph glyph-name="time" unicode="&#xf017;"
129
+ d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
130
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
131
+ <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920"
132
+ d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
133
+ q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
134
+ <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664"
135
+ d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
136
+ q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
137
+ <glyph glyph-name="download" unicode="&#xf01a;"
138
+ d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
139
+ t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
140
+ <glyph glyph-name="upload" unicode="&#xf01b;"
141
+ d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
142
+ t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
143
+ <glyph glyph-name="inbox" unicode="&#xf01c;"
144
+ d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
145
+ q25 -61 25 -123z" />
146
+ <glyph glyph-name="play_circle" unicode="&#xf01d;"
147
+ d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
148
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
149
+ <glyph glyph-name="repeat" unicode="&#xf01e;"
150
+ d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
151
+ l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
152
+ <glyph glyph-name="refresh" unicode="&#xf021;"
153
+ d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
154
+ q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
155
+ q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
156
+ <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792"
157
+ d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
158
+ M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
159
+ M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
160
+ t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
161
+ t47 -113z" />
162
+ <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152"
163
+ d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
164
+ <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792"
165
+ d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
166
+ t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
167
+ <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664"
168
+ d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
169
+ t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
170
+ t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
171
+ <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768"
172
+ d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
173
+ <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152"
174
+ d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
175
+ t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
176
+ <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664"
177
+ d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
178
+ t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
179
+ t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
180
+ t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
181
+ <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408"
182
+ d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
183
+ M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
184
+ <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792"
185
+ d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
186
+ M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
187
+ <glyph glyph-name="tag" unicode="&#xf02b;"
188
+ d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
189
+ l715 -714q37 -39 37 -91z" />
190
+ <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920"
191
+ d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
192
+ l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
193
+ <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664"
194
+ d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
195
+ q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
196
+ q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
197
+ t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
198
+ <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280"
199
+ d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
200
+ <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664"
201
+ d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
202
+ v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
203
+ <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
204
+ d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
205
+ q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
206
+ <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664"
207
+ d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
208
+ q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
209
+ q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
210
+ <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408"
211
+ d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
212
+ q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
213
+ t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
214
+ t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
215
+ <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024"
216
+ d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
217
+ q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
218
+ <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792"
219
+ d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
220
+ t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
221
+ q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
222
+ q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
223
+ <glyph glyph-name="text_width" unicode="&#xf035;"
224
+ d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
225
+ t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
226
+ q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
227
+ t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
228
+ t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
229
+ <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792"
230
+ d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
231
+ t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
232
+ <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792"
233
+ d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
234
+ h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
235
+ <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792"
236
+ d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
237
+ t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
238
+ <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792"
239
+ d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
240
+ t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
241
+ <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792"
242
+ d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
243
+ t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
244
+ q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
245
+ t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
246
+ q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
247
+ <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792"
248
+ d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
249
+ t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
250
+ q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
251
+ <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792"
252
+ d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
253
+ t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
254
+ q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
255
+ <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792"
256
+ d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
257
+ q39 -17 39 -59z" />
258
+ <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920"
259
+ d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
260
+ q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
261
+ <glyph glyph-name="pencil" unicode="&#xf040;"
262
+ d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
263
+ q53 0 91 -38l235 -234q37 -39 37 -91z" />
264
+ <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024"
265
+ d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
266
+ <glyph glyph-name="adjust" unicode="&#xf042;"
267
+ d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
268
+ <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024"
269
+ d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
270
+ q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
271
+ <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792"
272
+ d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
273
+ q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
274
+ l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
275
+ <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664"
276
+ d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
277
+ q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
278
+ t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
279
+ <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664"
280
+ d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
281
+ q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
282
+ q24 -24 24 -57t-24 -57z" />
283
+ <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792"
284
+ d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
285
+ t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
286
+ <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024"
287
+ d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
288
+ <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792"
289
+ d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
290
+ q19 19 32 13t13 -32v-710q4 10 13 19z" />
291
+ <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664"
292
+ d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
293
+ <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408"
294
+ d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
295
+ <glyph glyph-name="pause" unicode="&#xf04c;"
296
+ d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
297
+ <glyph glyph-name="stop" unicode="&#xf04d;"
298
+ d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
299
+ <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664"
300
+ d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
301
+ <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792"
302
+ d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
303
+ q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
304
+ <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024"
305
+ d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
306
+ <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538"
307
+ d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
308
+ <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280"
309
+ d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
310
+ <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280"
311
+ d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
312
+ <glyph glyph-name="plus_sign" unicode="&#xf055;"
313
+ d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
314
+ t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
315
+ <glyph glyph-name="minus_sign" unicode="&#xf056;"
316
+ d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
317
+ t103 -385.5z" />
318
+ <glyph glyph-name="remove_sign" unicode="&#xf057;"
319
+ d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
320
+ q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
321
+ <glyph glyph-name="ok_sign" unicode="&#xf058;"
322
+ d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
323
+ t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
324
+ <glyph glyph-name="question_sign" unicode="&#xf059;"
325
+ d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
326
+ q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
327
+ t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
328
+ <glyph glyph-name="info_sign" unicode="&#xf05a;"
329
+ d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
330
+ t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
331
+ <glyph glyph-name="screenshot" unicode="&#xf05b;"
332
+ d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
333
+ q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
334
+ q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
335
+ <glyph glyph-name="remove_circle" unicode="&#xf05c;"
336
+ d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
337
+ l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
338
+ t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
339
+ <glyph glyph-name="ok_circle" unicode="&#xf05d;"
340
+ d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
341
+ t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
342
+ <glyph glyph-name="ban_circle" unicode="&#xf05e;"
343
+ d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
344
+ t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
345
+ <glyph glyph-name="arrow_left" unicode="&#xf060;"
346
+ d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
347
+ t32.5 -90.5z" />
348
+ <glyph glyph-name="arrow_right" unicode="&#xf061;"
349
+ d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
350
+ <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664"
351
+ d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
352
+ q37 -39 37 -91z" />
353
+ <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664"
354
+ d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
355
+ <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792"
356
+ d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
357
+ t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
358
+ <glyph glyph-name="resize_full" unicode="&#xf065;"
359
+ d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
360
+ q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
361
+ <glyph glyph-name="resize_small" unicode="&#xf066;"
362
+ d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
363
+ t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
364
+ <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408"
365
+ d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
366
+ <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408"
367
+ d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
368
+ <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664"
369
+ d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
370
+ q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
371
+ <glyph glyph-name="exclamation_sign" unicode="&#xf06a;"
372
+ d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
373
+ q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
374
+ <glyph glyph-name="gift" unicode="&#xf06b;"
375
+ d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
376
+ q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
377
+ t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
378
+ <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792"
379
+ d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
380
+ q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
381
+ t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
382
+ <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408"
383
+ d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
384
+ q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
385
+ <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792"
386
+ d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
387
+ t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
388
+ <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792"
389
+ d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
390
+ q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
391
+ q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
392
+ " />
393
+ <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792"
394
+ d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
395
+ q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
396
+ <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408"
397
+ d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
398
+ q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
399
+ <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664"
400
+ d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
401
+ M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
402
+ q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
403
+ h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
404
+ <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792"
405
+ d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
406
+ t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
407
+ v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
408
+ t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
409
+ <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792"
410
+ d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
411
+ q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
412
+ <glyph glyph-name="magnet" unicode="&#xf076;"
413
+ d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
414
+ q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
415
+ <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792"
416
+ d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
417
+ <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792"
418
+ d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
419
+ <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920"
420
+ d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
421
+ zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
422
+ " />
423
+ <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664"
424
+ d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
425
+ t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
426
+ <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664"
427
+ d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
428
+ <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920"
429
+ d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
430
+ t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
431
+ <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768"
432
+ d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
433
+ <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792"
434
+ d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
435
+ <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048"
436
+ d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
437
+ <glyph glyph-name="twitter_sign" unicode="&#xf081;"
438
+ d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
439
+ q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
440
+ t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
441
+ <glyph glyph-name="facebook_sign" unicode="&#xf082;"
442
+ d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
443
+ q0 119 84.5 203.5t203.5 84.5h960z" />
444
+ <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792"
445
+ d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
446
+ t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
447
+ q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
448
+ <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792"
449
+ d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
450
+ l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
451
+ t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
452
+ <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920"
453
+ d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
454
+ t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
455
+ l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
456
+ l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
457
+ q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
458
+ t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
459
+ q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
460
+ q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
461
+ <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792"
462
+ d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
463
+ q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
464
+ q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
465
+ <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;"
466
+ d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
467
+ t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
468
+ q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
469
+ q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
470
+ <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;"
471
+ d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
472
+ t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
473
+ M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
474
+ h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
475
+ <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896"
476
+ d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
477
+ <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792"
478
+ d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
479
+ q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
480
+ q224 0 351 -124t127 -344z" />
481
+ <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664"
482
+ d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
483
+ q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
484
+ <glyph glyph-name="linkedin_sign" unicode="&#xf08c;"
485
+ d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
486
+ q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
487
+ <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152"
488
+ d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
489
+ t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
490
+ <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792"
491
+ d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
492
+ q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
493
+ <glyph glyph-name="signin" unicode="&#xf090;"
494
+ d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
495
+ q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
496
+ <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664"
497
+ d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
498
+ t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
499
+ q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
500
+ <glyph glyph-name="github_sign" unicode="&#xf092;"
501
+ d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
502
+ q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
503
+ t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
504
+ q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
505
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
506
+ <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664"
507
+ d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
508
+ t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
509
+ <glyph glyph-name="lemon" unicode="&#xf094;"
510
+ d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
511
+ q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
512
+ q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
513
+ q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
514
+ <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408"
515
+ d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
516
+ q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
517
+ t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
518
+ <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408"
519
+ d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
520
+ q119 0 203.5 -84.5t84.5 -203.5z" />
521
+ <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280"
522
+ d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
523
+ q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
524
+ <glyph glyph-name="phone_sign" unicode="&#xf098;"
525
+ d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
526
+ t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
527
+ t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
528
+ " />
529
+ <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664"
530
+ d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
531
+ q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
532
+ <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024"
533
+ d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
534
+ <glyph glyph-name="github" unicode="&#xf09b;"
535
+ d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
536
+ q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
537
+ t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
538
+ q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
539
+ M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
540
+ <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664"
541
+ d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
542
+ t316.5 -131.5t131.5 -316.5z" />
543
+ <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920"
544
+ d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
545
+ q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
546
+ <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408"
547
+ d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
548
+ t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
549
+ q187 -186 294 -425.5t120 -501.5z" />
550
+ <glyph glyph-name="hdd" unicode="&#xf0a0;"
551
+ d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
552
+ h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
553
+ l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
554
+ <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792"
555
+ d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
556
+ t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
557
+ <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792"
558
+ d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
559
+ M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
560
+ t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
561
+ <glyph glyph-name="certificate" unicode="&#xf0a3;"
562
+ d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
563
+ l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
564
+ l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
565
+ <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792"
566
+ d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
567
+ q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
568
+ q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
569
+ t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
570
+ <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792"
571
+ d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
572
+ t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
573
+ M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
574
+ q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
575
+ <glyph glyph-name="hand_up" unicode="&#xf0a6;"
576
+ d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
577
+ q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
578
+ t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
579
+ q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
580
+ <glyph glyph-name="hand_down" unicode="&#xf0a7;"
581
+ d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
582
+ t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
583
+ q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
584
+ q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
585
+ <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;"
586
+ d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
587
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
588
+ <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;"
589
+ d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
590
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
591
+ <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;"
592
+ d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
593
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
594
+ <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;"
595
+ d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
596
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
597
+ <glyph glyph-name="globe" unicode="&#xf0ac;"
598
+ d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
599
+ q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
600
+ q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
601
+ q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
602
+ t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
603
+ q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
604
+ q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
605
+ t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
606
+ t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
607
+ q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
608
+ q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
609
+ q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
610
+ t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
611
+ q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
612
+ q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
613
+ <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664"
614
+ d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
615
+ t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
616
+ <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792"
617
+ d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
618
+ t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
619
+ <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408"
620
+ d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
621
+ <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792"
622
+ d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
623
+ t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
624
+ <glyph glyph-name="fullscreen" unicode="&#xf0b2;"
625
+ d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
626
+ l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
627
+ " />
628
+ <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920"
629
+ d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
630
+ t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
631
+ t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
632
+ t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
633
+ <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664"
634
+ d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
635
+ l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
636
+ t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
637
+ q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
638
+ <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920"
639
+ d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
640
+ " />
641
+ <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664"
642
+ d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
643
+ <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792"
644
+ d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
645
+ q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
646
+ q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
647
+ q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
648
+ q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
649
+ <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792"
650
+ d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
651
+ h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
652
+ <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408"
653
+ d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
654
+ l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
655
+ z" />
656
+ <glyph glyph-name="save" unicode="&#xf0c7;"
657
+ d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
658
+ h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
659
+ <glyph glyph-name="sign_blank" unicode="&#xf0c8;"
660
+ d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
661
+ <glyph glyph-name="reorder" unicode="&#xf0c9;"
662
+ d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
663
+ t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
664
+ <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792"
665
+ d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
666
+ t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
667
+ M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
668
+ <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792"
669
+ d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
670
+ q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
671
+ t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
672
+ q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
673
+ <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
674
+ d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
675
+ l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
676
+ l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
677
+ <glyph glyph-name="underline" unicode="&#xf0cd;"
678
+ d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
679
+ q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
680
+ q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
681
+ q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
682
+ <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664"
683
+ d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
684
+ v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
685
+ q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
686
+ q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
687
+ z" />
688
+ <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664"
689
+ d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
690
+ l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
691
+ <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792"
692
+ d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
693
+ t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
694
+ t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
695
+ <glyph glyph-name="pinterest" unicode="&#xf0d2;"
696
+ d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
697
+ q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
698
+ q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
699
+ <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;"
700
+ d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
701
+ t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
702
+ t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
703
+ <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;"
704
+ d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
705
+ h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
706
+ <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304"
707
+ d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
708
+ q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
709
+ <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920"
710
+ d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
711
+ v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
712
+ <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024"
713
+ d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
714
+ <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024"
715
+ d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
716
+ <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640"
717
+ d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
718
+ <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640"
719
+ d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
720
+ <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664"
721
+ d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
722
+ <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024"
723
+ d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
724
+ <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024"
725
+ d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
726
+ <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024"
727
+ d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
728
+ <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792"
729
+ d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
730
+ q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
731
+ <glyph glyph-name="linkedin" unicode="&#xf0e1;"
732
+ d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
733
+ q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
734
+ <glyph glyph-name="undo" unicode="&#xf0e2;"
735
+ d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
736
+ t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
737
+ <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792"
738
+ d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
739
+ t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
740
+ q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
741
+ q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
742
+ <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792"
743
+ d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
744
+ t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
745
+ t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
746
+ q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
747
+ <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792"
748
+ d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
749
+ q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
750
+ t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
751
+ <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792"
752
+ d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
753
+ t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
754
+ t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
755
+ q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
756
+ <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896"
757
+ d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
758
+ <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792"
759
+ d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
760
+ q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
761
+ z" />
762
+ <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664"
763
+ d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
764
+ q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
765
+ q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
766
+ <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792"
767
+ d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
768
+ h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
769
+ <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024"
770
+ d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
771
+ q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
772
+ q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
773
+ t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
774
+ <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792"
775
+ d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
776
+ q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
777
+ <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920"
778
+ d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
779
+ q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
780
+ <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920"
781
+ d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
782
+ q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
783
+ <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408"
784
+ d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
785
+ t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
786
+ t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
787
+ t271.5 -112.5t112.5 -271.5z" />
788
+ <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408"
789
+ d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
790
+ t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
791
+ t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
792
+ <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792"
793
+ d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
794
+ t66 -158z" />
795
+ <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792"
796
+ d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
797
+ t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
798
+ <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920"
799
+ d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
800
+ t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
801
+ <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408"
802
+ d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
803
+ t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
804
+ <glyph glyph-name="file_text_alt" unicode="&#xf0f6;"
805
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
806
+ M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
807
+ q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
808
+ <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408"
809
+ d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
810
+ M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
811
+ M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
812
+ M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
813
+ M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
814
+ M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
815
+ M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
816
+ M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
817
+ M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
818
+ M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
819
+ <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408"
820
+ d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
821
+ M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
822
+ M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
823
+ M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
824
+ M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
825
+ M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
826
+ t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
827
+ v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
828
+ <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920"
829
+ d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
830
+ t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
831
+ q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
832
+ <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792"
833
+ d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
834
+ q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
835
+ <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920"
836
+ d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
837
+ q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
838
+ <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664"
839
+ d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
840
+ <glyph glyph-name="h_sign" unicode="&#xf0fd;"
841
+ d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
842
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
843
+ <glyph glyph-name="f0fe" unicode="&#xf0fe;"
844
+ d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
845
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
846
+ <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024"
847
+ d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
848
+ t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
849
+ <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024"
850
+ d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
851
+ l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
852
+ <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152"
853
+ d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
854
+ q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
855
+ <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152"
856
+ d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
857
+ t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
858
+ <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640"
859
+ d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
860
+ <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640"
861
+ d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
862
+ <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152"
863
+ d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
864
+ <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152"
865
+ d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
866
+ <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920"
867
+ d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
868
+ t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
869
+ <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920"
870
+ d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
871
+ M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
872
+ <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152"
873
+ d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
874
+ q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
875
+ <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768"
876
+ d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
877
+ q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
878
+ <glyph glyph-name="circle_blank" unicode="&#xf10c;"
879
+ d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
880
+ t279.5 -279.5t103 -385.5z" />
881
+ <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664"
882
+ d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
883
+ M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
884
+ <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664"
885
+ d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
886
+ v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
887
+ <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792"
888
+ d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
889
+ t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
890
+ M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
891
+ q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
892
+ <glyph glyph-name="circle" unicode="&#xf111;"
893
+ d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
894
+ <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792"
895
+ d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
896
+ l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
897
+ <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664"
898
+ d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
899
+ q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
900
+ t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
901
+ q0 -87 -27 -168q136 -160 136 -398z" />
902
+ <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664"
903
+ d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
904
+ q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
905
+ <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920"
906
+ d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
907
+ v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
908
+ " />
909
+ <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792"
910
+ />
911
+ <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792"
912
+ />
913
+ <glyph glyph-name="smile" unicode="&#xf118;"
914
+ d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
915
+ t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
916
+ t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
917
+ <glyph glyph-name="frown" unicode="&#xf119;"
918
+ d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
919
+ t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
920
+ t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
921
+ <glyph glyph-name="meh" unicode="&#xf11a;"
922
+ d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
923
+ t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
924
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
925
+ <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920"
926
+ d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
927
+ t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
928
+ t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
929
+ <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920"
930
+ d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
931
+ h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
932
+ h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
933
+ q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
934
+ h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
935
+ <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792"
936
+ d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
937
+ h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
938
+ q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
939
+ <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792"
940
+ d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
941
+ q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
942
+ q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
943
+ q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
944
+ <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664"
945
+ d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
946
+ t9 -23z" />
947
+ <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920"
948
+ d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
949
+ l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
950
+ <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792"
951
+ d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
952
+ q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
953
+ <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664"
954
+ d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
955
+ l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
956
+ <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408"
957
+ d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
958
+ <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664"
959
+ d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
960
+ v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
961
+ <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024"
962
+ d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
963
+ q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
964
+ q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
965
+ <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664"
966
+ d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
967
+ q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
968
+ l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
969
+ t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
970
+ <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024"
971
+ d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
972
+ t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
973
+ <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640"
974
+ d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
975
+ q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
976
+ <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640"
977
+ d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
978
+ <glyph glyph-name="superscript" unicode="&#xf12b;"
979
+ d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
980
+ M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
981
+ t-65.5 -51.5t-30.5 -63h232v80h126z" />
982
+ <glyph glyph-name="subscript" unicode="&#xf12c;"
983
+ d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
984
+ M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
985
+ h232v80h126z" />
986
+ <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920"
987
+ d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
988
+ <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664"
989
+ d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
990
+ t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
991
+ q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
992
+ q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
993
+ <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152"
994
+ d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
995
+ t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
996
+ <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408"
997
+ d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
998
+ q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
999
+ t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
1000
+ <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280"
1001
+ d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
1002
+ t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
1003
+ <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664"
1004
+ d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
1005
+ q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
1006
+ <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408"
1007
+ d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
1008
+ q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
1009
+ q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
1010
+ <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664"
1011
+ d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
1012
+ q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
1013
+ <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792"
1014
+ d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
1015
+ <glyph glyph-name="chevron_sign_left" unicode="&#xf137;"
1016
+ d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
1017
+ t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1018
+ <glyph glyph-name="chevron_sign_right" unicode="&#xf138;"
1019
+ d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
1020
+ t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1021
+ <glyph glyph-name="chevron_sign_up" unicode="&#xf139;"
1022
+ d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
1023
+ t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1024
+ <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;"
1025
+ d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
1026
+ t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1027
+ <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408"
1028
+ d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
1029
+ <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792"
1030
+ d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
1031
+ <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792"
1032
+ d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
1033
+ q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
1034
+ t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
1035
+ <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152"
1036
+ d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
1037
+ v-320h736z" />
1038
+ <glyph glyph-name="bullseye" unicode="&#xf140;"
1039
+ d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
1040
+ t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
1041
+ q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1042
+ <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408"
1043
+ d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
1044
+ q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
1045
+ <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384"
1046
+ d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
1047
+ q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
1048
+ <glyph glyph-name="_303" unicode="&#xf143;"
1049
+ d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
1050
+ q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
1051
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1052
+ <glyph glyph-name="play_sign" unicode="&#xf144;"
1053
+ d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
1054
+ q16 -8 32 -8q17 0 32 9z" />
1055
+ <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792"
1056
+ d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
1057
+ t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
1058
+ <glyph glyph-name="minus_sign_alt" unicode="&#xf146;"
1059
+ d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
1060
+ t84.5 -203.5z" />
1061
+ <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408"
1062
+ d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
1063
+ t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
1064
+ <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024"
1065
+ d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
1066
+ <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024"
1067
+ d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
1068
+ <glyph glyph-name="check_sign" unicode="&#xf14a;"
1069
+ d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
1070
+ t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1071
+ <glyph glyph-name="edit_sign" unicode="&#xf14b;"
1072
+ d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
1073
+ v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1074
+ <glyph glyph-name="_312" unicode="&#xf14c;"
1075
+ d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
1076
+ q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1077
+ <glyph glyph-name="share_sign" unicode="&#xf14d;"
1078
+ d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
1079
+ t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1080
+ <glyph glyph-name="compass" unicode="&#xf14e;"
1081
+ d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
1082
+ t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1083
+ <glyph glyph-name="collapse" unicode="&#xf150;"
1084
+ d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
1085
+ v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1086
+ <glyph glyph-name="collapse_top" unicode="&#xf151;"
1087
+ d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
1088
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1089
+ <glyph glyph-name="_317" unicode="&#xf152;"
1090
+ d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
1091
+ t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1092
+ <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024"
1093
+ d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
1094
+ t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
1095
+ l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
1096
+ <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024"
1097
+ d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
1098
+ q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
1099
+ <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024"
1100
+ d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
1101
+ t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
1102
+ t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
1103
+ t53 -63.5t31.5 -76.5t13 -94z" />
1104
+ <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898"
1105
+ d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
1106
+ q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
1107
+ <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027"
1108
+ d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
1109
+ l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
1110
+ <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280"
1111
+ d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
1112
+ q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
1113
+ <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792"
1114
+ d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
1115
+ t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
1116
+ q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
1117
+ <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280"
1118
+ d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
1119
+ l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
1120
+ t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
1121
+ <glyph glyph-name="file" unicode="&#xf15b;"
1122
+ d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
1123
+ <glyph glyph-name="file_text" unicode="&#xf15c;"
1124
+ d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
1125
+ q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
1126
+ <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664"
1127
+ d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
1128
+ v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
1129
+ l230 -662h70z" />
1130
+ <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664"
1131
+ d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
1132
+ v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
1133
+ v119h121z" />
1134
+ <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792"
1135
+ d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
1136
+ q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
1137
+ q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
1138
+ <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792"
1139
+ d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
1140
+ q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
1141
+ q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
1142
+ <glyph glyph-name="sort_by_order" unicode="&#xf162;"
1143
+ d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
1144
+ zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
1145
+ t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
1146
+ <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;"
1147
+ d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
1148
+ t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
1149
+ q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
1150
+ <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664"
1151
+ d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
1152
+ q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
1153
+ t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
1154
+ <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664"
1155
+ d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
1156
+ t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
1157
+ t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
1158
+ <glyph glyph-name="youtube_sign" unicode="&#xf166;"
1159
+ d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
1160
+ q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
1161
+ q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
1162
+ q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
1163
+ q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
1164
+ h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1165
+ <glyph glyph-name="youtube" unicode="&#xf167;"
1166
+ d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
1167
+ q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
1168
+ q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
1169
+ q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
1170
+ q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
1171
+ <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408"
1172
+ d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
1173
+ q25 45 64 45h241q22 0 31 -15z" />
1174
+ <glyph glyph-name="xing_sign" unicode="&#xf169;"
1175
+ d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
1176
+ l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1177
+ <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792"
1178
+ d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
1179
+ l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
1180
+ q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
1181
+ <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792"
1182
+ d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
1183
+ <glyph glyph-name="stackexchange" unicode="&#xf16c;"
1184
+ d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
1185
+ <glyph glyph-name="instagram" unicode="&#xf16d;"
1186
+ d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
1187
+ q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
1188
+ t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
1189
+ q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
1190
+ <glyph glyph-name="flickr" unicode="&#xf16e;"
1191
+ d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
1192
+ t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
1193
+ <glyph glyph-name="adn" unicode="&#xf170;"
1194
+ d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1195
+ <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408"
1196
+ d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
1197
+ t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
1198
+ t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
1199
+ t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
1200
+ <glyph glyph-name="bitbucket_sign" unicode="&#xf172;"
1201
+ d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
1202
+ t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
1203
+ M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
1204
+ v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1205
+ <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024"
1206
+ d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
1207
+ q78 2 134 29z" />
1208
+ <glyph glyph-name="tumblr_sign" unicode="&#xf174;"
1209
+ d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
1210
+ M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1211
+ <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768"
1212
+ d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
1213
+ <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768"
1214
+ d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
1215
+ <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792"
1216
+ d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
1217
+ <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792"
1218
+ d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
1219
+ <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408"
1220
+ d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
1221
+ q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
1222
+ <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664"
1223
+ d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
1224
+ <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408"
1225
+ d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
1226
+ t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
1227
+ h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
1228
+ <glyph glyph-name="linux" unicode="&#xf17c;"
1229
+ d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
1230
+ M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
1231
+ q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
1232
+ q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
1233
+ t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
1234
+ q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
1235
+ q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
1236
+ q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
1237
+ q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
1238
+ t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
1239
+ t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
1240
+ q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
1241
+ t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
1242
+ q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
1243
+ t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
1244
+ t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
1245
+ <glyph glyph-name="dribble" unicode="&#xf17d;"
1246
+ d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
1247
+ t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
1248
+ q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
1249
+ t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1250
+ <glyph glyph-name="skype" unicode="&#xf17e;"
1251
+ d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
1252
+ t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
1253
+ q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
1254
+ q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
1255
+ <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280"
1256
+ d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
1257
+ M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
1258
+ l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
1259
+ <glyph glyph-name="trello" unicode="&#xf181;"
1260
+ d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
1261
+ q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
1262
+ <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280"
1263
+ d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
1264
+ q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
1265
+ <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024"
1266
+ d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
1267
+ M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
1268
+ <glyph glyph-name="gittip" unicode="&#xf184;"
1269
+ d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
1270
+ t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1271
+ <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792"
1272
+ d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
1273
+ l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
1274
+ q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
1275
+ <glyph glyph-name="_366" unicode="&#xf186;"
1276
+ d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
1277
+ t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
1278
+ <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792"
1279
+ d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
1280
+ q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
1281
+ <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664"
1282
+ d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
1283
+ q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
1284
+ t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
1285
+ <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920"
1286
+ d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
1287
+ t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
1288
+ q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
1289
+ q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
1290
+ q39 5 64 -2.5t31 -16.5z" />
1291
+ <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792"
1292
+ d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
1293
+ q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
1294
+ q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
1295
+ q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
1296
+ M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
1297
+ <glyph glyph-name="renren" unicode="&#xf18b;"
1298
+ d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
1299
+ q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
1300
+ <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408"
1301
+ d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
1302
+ t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
1303
+ t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
1304
+ t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
1305
+ <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280"
1306
+ d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
1307
+ " />
1308
+ <glyph glyph-name="_374" unicode="&#xf18e;"
1309
+ d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
1310
+ t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1311
+ <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;"
1312
+ d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
1313
+ t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1314
+ <glyph glyph-name="_376" unicode="&#xf191;"
1315
+ d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
1316
+ M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1317
+ <glyph glyph-name="dot_circle_alt" unicode="&#xf192;"
1318
+ d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
1319
+ t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1320
+ <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664"
1321
+ d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
1322
+ q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
1323
+ <glyph glyph-name="vimeo_square" unicode="&#xf194;"
1324
+ d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
1325
+ q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1326
+ <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152"
1327
+ d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
1328
+ q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
1329
+ <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408"
1330
+ d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
1331
+ q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
1332
+ <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176"
1333
+ d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
1334
+ t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
1335
+ q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
1336
+ <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664"
1337
+ d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
1338
+ q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
1339
+ t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
1340
+ <glyph glyph-name="_384" unicode="&#xf199;"
1341
+ d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
1342
+ q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
1343
+ t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
1344
+ <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792"
1345
+ d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
1346
+ t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
1347
+ t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
1348
+ t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
1349
+ t273 -182.5t331.5 -68z" />
1350
+ <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792"
1351
+ d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
1352
+ <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048"
1353
+ d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
1354
+ q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
1355
+ <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304"
1356
+ d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
1357
+ q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
1358
+ <glyph glyph-name="_389" unicode="&#xf19e;"
1359
+ d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
1360
+ q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
1361
+ <glyph glyph-name="uniF1A0" unicode="&#xf1a0;"
1362
+ d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
1363
+ t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
1364
+ <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792"
1365
+ d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
1366
+ t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
1367
+ q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
1368
+ t348 71t348 -71t286 -191t191 -286t71 -348z" />
1369
+ <glyph glyph-name="_392" unicode="&#xf1a2;"
1370
+ d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
1371
+ q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
1372
+ q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
1373
+ q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1374
+ <glyph glyph-name="_393" unicode="&#xf1a3;"
1375
+ d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
1376
+ v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
1377
+ t385.5 -103t279.5 -279.5t103 -385.5z" />
1378
+ <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920"
1379
+ d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
1380
+ v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
1381
+ <glyph glyph-name="_395" unicode="&#xf1a5;"
1382
+ d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
1383
+ t84.5 -203.5z" />
1384
+ <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048"
1385
+ d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
1386
+ v-369h123z" />
1387
+ <glyph glyph-name="_397" unicode="&#xf1a7;"
1388
+ d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
1389
+ v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
1390
+ q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1391
+ <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038"
1392
+ d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
1393
+ q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
1394
+ q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
1395
+ q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
1396
+ t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
1397
+ q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
1398
+ t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
1399
+ t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
1400
+ <glyph glyph-name="_399" unicode="&#xf1a9;"
1401
+ d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
1402
+ q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
1403
+ q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
1404
+ t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
1405
+ q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
1406
+ <glyph glyph-name="_400" unicode="&#xf1aa;"
1407
+ d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
1408
+ M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
1409
+ t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
1410
+ q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
1411
+ t135.5 51q85 0 145 -60.5t60 -145.5z" />
1412
+ <glyph glyph-name="f1ab" unicode="&#xf1ab;"
1413
+ d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
1414
+ q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
1415
+ q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
1416
+ M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
1417
+ q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
1418
+ q20 0 20 -21v-418z" />
1419
+ <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792"
1420
+ d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
1421
+ l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
1422
+ t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
1423
+ q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
1424
+ q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
1425
+ <glyph glyph-name="_403" unicode="&#xf1ad;"
1426
+ d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
1427
+ t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
1428
+ q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
1429
+ q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
1430
+ t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
1431
+ q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
1432
+ q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
1433
+ t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
1434
+ <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280"
1435
+ d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
1436
+ q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
1437
+ <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664"
1438
+ d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
1439
+ q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
1440
+ q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
1441
+ t100.5 134t141.5 55.5z" />
1442
+ <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768"
1443
+ d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
1444
+ <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792"
1445
+ d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
1446
+ " />
1447
+ <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304"
1448
+ d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
1449
+ t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
1450
+ v-400l434 -186q36 -16 57 -48t21 -70z" />
1451
+ <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048"
1452
+ d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
1453
+ q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
1454
+ q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
1455
+ <glyph glyph-name="_410" unicode="&#xf1b5;"
1456
+ d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
1457
+ t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
1458
+ t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
1459
+ <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792"
1460
+ d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
1461
+ q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
1462
+ q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
1463
+ <glyph glyph-name="_412" unicode="&#xf1b7;"
1464
+ d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
1465
+ q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
1466
+ q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
1467
+ " />
1468
+ <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792"
1469
+ d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
1470
+ l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
1471
+ t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
1472
+ q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
1473
+ <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048"
1474
+ d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
1475
+ q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
1476
+ l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
1477
+ <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048"
1478
+ d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
1479
+ t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
1480
+ M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
1481
+ <glyph glyph-name="_416" unicode="&#xf1bb;"
1482
+ d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
1483
+ q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
1484
+ <glyph glyph-name="_417" unicode="&#xf1bc;"
1485
+ d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
1486
+ q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
1487
+ q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1488
+ <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024"
1489
+ d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
1490
+ <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304"
1491
+ d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
1492
+ q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
1493
+ q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
1494
+ l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
1495
+ q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
1496
+ q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
1497
+ q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
1498
+ <glyph glyph-name="uniF1C0" unicode="&#xf1c0;"
1499
+ d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
1500
+ t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
1501
+ t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
1502
+ <glyph glyph-name="uniF1C1" unicode="&#xf1c1;"
1503
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1504
+ M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
1505
+ q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
1506
+ q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
1507
+ <glyph glyph-name="_422" unicode="&#xf1c2;"
1508
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1509
+ M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
1510
+ t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
1511
+ <glyph glyph-name="_423" unicode="&#xf1c3;"
1512
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1513
+ M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
1514
+ h-290v-107h68l189 -272l-194 -283h-68z" />
1515
+ <glyph glyph-name="_424" unicode="&#xf1c4;"
1516
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1517
+ M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
1518
+ <glyph glyph-name="_425" unicode="&#xf1c5;"
1519
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1520
+ M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
1521
+ <glyph glyph-name="_426" unicode="&#xf1c6;"
1522
+ d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
1523
+ v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
1524
+ q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
1525
+ <glyph glyph-name="_427" unicode="&#xf1c7;"
1526
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1527
+ M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
1528
+ q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
1529
+ <glyph glyph-name="_428" unicode="&#xf1c8;"
1530
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1531
+ M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
1532
+ <glyph glyph-name="_429" unicode="&#xf1c9;"
1533
+ d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
1534
+ M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
1535
+ l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
1536
+ <glyph glyph-name="_430" unicode="&#xf1ca;"
1537
+ d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
1538
+ q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
1539
+ <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792"
1540
+ d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
1541
+ q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
1542
+ <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048"
1543
+ d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
1544
+ q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
1545
+ t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
1546
+ <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792"
1547
+ d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
1548
+ q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
1549
+ t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
1550
+ <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792"
1551
+ d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
1552
+ t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
1553
+ <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792"
1554
+ d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
1555
+ t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
1556
+ t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
1557
+ q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
1558
+ <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792"
1559
+ d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
1560
+ l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
1561
+ q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
1562
+ q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
1563
+ t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
1564
+ t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
1565
+ <glyph glyph-name="uniF1D2" unicode="&#xf1d2;"
1566
+ d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
1567
+ q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
1568
+ q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
1569
+ q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1570
+ <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792"
1571
+ d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
1572
+ q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
1573
+ q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
1574
+ v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
1575
+ <glyph glyph-name="_439" unicode="&#xf1d4;"
1576
+ d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1577
+ <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280"
1578
+ d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
1579
+ t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
1580
+ t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
1581
+ <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792"
1582
+ d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
1583
+ q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
1584
+ t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
1585
+ t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
1586
+ <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048"
1587
+ d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
1588
+ q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
1589
+ q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
1590
+ q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
1591
+ <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792"
1592
+ d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
1593
+ <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792"
1594
+ d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
1595
+ l863 639l-478 -797z" />
1596
+ <glyph glyph-name="_445" unicode="&#xf1da;"
1597
+ d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
1598
+ t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
1599
+ t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
1600
+ <glyph glyph-name="_446" unicode="&#xf1db;"
1601
+ d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
1602
+ t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1603
+ <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792"
1604
+ d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
1605
+ t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
1606
+ t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
1607
+ q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
1608
+ q0 -26 -12 -48t-36 -22z" />
1609
+ <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280"
1610
+ d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
1611
+ q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
1612
+ <glyph glyph-name="_449" unicode="&#xf1de;"
1613
+ d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
1614
+ q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
1615
+ <glyph glyph-name="uniF1E0" unicode="&#xf1e0;"
1616
+ d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
1617
+ t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
1618
+ <glyph glyph-name="_451" unicode="&#xf1e1;"
1619
+ d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
1620
+ t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1621
+ <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792"
1622
+ d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
1623
+ t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
1624
+ q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
1625
+ t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
1626
+ <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792"
1627
+ d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
1628
+ l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
1629
+ <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792"
1630
+ d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
1631
+ v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
1632
+ q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
1633
+ zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
1634
+ t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
1635
+ <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792"
1636
+ d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
1637
+ M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
1638
+ <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792"
1639
+ d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
1640
+ l401 400q38 37 91 37t90 -37z" />
1641
+ <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792"
1642
+ d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
1643
+ t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
1644
+ M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
1645
+ t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
1646
+ <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792"
1647
+ d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
1648
+ <glyph glyph-name="_459" unicode="&#xf1e9;"
1649
+ d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
1650
+ q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
1651
+ t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
1652
+ q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
1653
+ <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048"
1654
+ d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
1655
+ t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
1656
+ <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048"
1657
+ d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
1658
+ q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
1659
+ M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
1660
+ <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792"
1661
+ d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
1662
+ t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
1663
+ t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
1664
+ t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
1665
+ M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
1666
+ h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
1667
+ <glyph glyph-name="_463" unicode="&#xf1ed;"
1668
+ d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
1669
+ q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
1670
+ q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
1671
+ <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792"
1672
+ d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
1673
+ q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
1674
+ <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304"
1675
+ d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
1676
+ q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
1677
+ q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
1678
+ <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304"
1679
+ d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
1680
+ q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
1681
+ M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
1682
+ h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
1683
+ q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
1684
+ q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
1685
+ q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
1686
+ q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
1687
+ q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
1688
+ h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
1689
+ t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
1690
+ <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304"
1691
+ d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
1692
+ q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
1693
+ v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
1694
+ q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
1695
+ t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
1696
+ <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304"
1697
+ d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
1698
+ M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
1699
+ l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
1700
+ v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
1701
+ q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
1702
+ q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
1703
+ t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
1704
+ h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
1705
+ t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
1706
+ <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304"
1707
+ d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
1708
+ t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
1709
+ q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
1710
+ t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
1711
+ l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
1712
+ q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
1713
+ <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304"
1714
+ d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
1715
+ q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
1716
+ q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
1717
+ q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
1718
+ q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
1719
+ <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048"
1720
+ d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
1721
+ l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
1722
+ l418 363q10 8 23.5 7t21.5 -11z" />
1723
+ <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048"
1724
+ d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
1725
+ q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
1726
+ q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
1727
+ <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408"
1728
+ d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
1729
+ q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
1730
+ q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
1731
+ <glyph glyph-name="_474" unicode="&#xf1f9;"
1732
+ d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
1733
+ t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
1734
+ t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
1735
+ <glyph glyph-name="_475" unicode="&#xf1fa;"
1736
+ d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
1737
+ q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
1738
+ t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
1739
+ t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
1740
+ <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792"
1741
+ d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
1742
+ t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
1743
+ <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792"
1744
+ d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
1745
+ t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
1746
+ <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792"
1747
+ d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
1748
+ t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
1749
+ t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
1750
+ h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
1751
+ q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
1752
+ <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048"
1753
+ d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
1754
+ <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792"
1755
+ d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
1756
+ <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048"
1757
+ d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
1758
+ t9 -23z" />
1759
+ <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792"
1760
+ d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
1761
+ q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
1762
+ t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
1763
+ q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
1764
+ <glyph glyph-name="_483" unicode="&#xf203;"
1765
+ d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
1766
+ q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
1767
+ q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
1768
+ q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
1769
+ <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048"
1770
+ d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
1771
+ t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
1772
+ t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
1773
+ <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048"
1774
+ d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
1775
+ t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
1776
+ <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304"
1777
+ d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
1778
+ q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
1779
+ q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
1780
+ q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
1781
+ <glyph glyph-name="_487" unicode="&#xf207;"
1782
+ d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
1783
+ h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
1784
+ t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
1785
+ <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048"
1786
+ d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
1787
+ q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
1788
+ q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
1789
+ <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280"
1790
+ d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
1791
+ t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
1792
+ t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
1793
+ q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
1794
+ q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
1795
+ t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
1796
+ <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048"
1797
+ d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
1798
+ q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
1799
+ t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
1800
+ t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
1801
+ <glyph glyph-name="_491" unicode="&#xf20b;"
1802
+ d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
1803
+ t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
1804
+ <glyph glyph-name="_492" unicode="&#xf20c;"
1805
+ d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
1806
+ q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
1807
+ q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
1808
+ <glyph glyph-name="_493" unicode="&#xf20d;"
1809
+ d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
1810
+ <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048"
1811
+ d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
1812
+ q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
1813
+ q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
1814
+ h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
1815
+ l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
1816
+ l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
1817
+ zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
1818
+ <glyph glyph-name="f210" unicode="&#xf210;"
1819
+ d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
1820
+ <glyph glyph-name="_496" unicode="&#xf211;"
1821
+ d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
1822
+ q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
1823
+ <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048"
1824
+ d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
1825
+ q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
1826
+ q209 0 374 -102q172 107 374 102z" />
1827
+ <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048"
1828
+ d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
1829
+ q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
1830
+ q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
1831
+ <glyph glyph-name="_499" unicode="&#xf214;"
1832
+ d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
1833
+ l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
1834
+ v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
1835
+ M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
1836
+ v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
1837
+ h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
1838
+ t-43 -34t-16.5 -53.5z" />
1839
+ <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048"
1840
+ d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
1841
+ q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
1842
+ <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048"
1843
+ d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
1844
+ t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
1845
+ t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
1846
+ q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
1847
+ <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664"
1848
+ d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
1849
+ t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
1850
+ q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
1851
+ <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664"
1852
+ d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
1853
+ t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
1854
+ q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
1855
+ <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048"
1856
+ d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
1857
+ l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
1858
+ <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048"
1859
+ d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
1860
+ q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
1861
+ q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
1862
+ v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
1863
+ q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
1864
+ <glyph glyph-name="_506" unicode="&#xf21b;"
1865
+ d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
1866
+ t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
1867
+ q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
1868
+ t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
1869
+ <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304"
1870
+ d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
1871
+ t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
1872
+ l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
1873
+ t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
1874
+ <glyph glyph-name="_508" unicode="&#xf21d;"
1875
+ d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
1876
+ q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
1877
+ q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
1878
+ t158.5 -65.5t65.5 -158.5z" />
1879
+ <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792"
1880
+ d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
1881
+ q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
1882
+ t127 -344z" />
1883
+ <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280"
1884
+ d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
1885
+ q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
1886
+ <glyph glyph-name="_511" unicode="&#xf222;"
1887
+ d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
1888
+ q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1889
+ <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280"
1890
+ d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
1891
+ t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
1892
+ t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1893
+ <glyph glyph-name="_513" unicode="&#xf224;"
1894
+ d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
1895
+ q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
1896
+ t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1897
+ <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792"
1898
+ d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
1899
+ q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
1900
+ t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
1901
+ t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1902
+ <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792"
1903
+ d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
1904
+ t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
1905
+ q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
1906
+ q0 -226 -154 -391q103 -57 218 -57z" />
1907
+ <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920"
1908
+ d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
1909
+ q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
1910
+ t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
1911
+ q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
1912
+ <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048"
1913
+ d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
1914
+ t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
1915
+ t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
1916
+ t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
1917
+ <glyph glyph-name="_518" unicode="&#xf229;"
1918
+ d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
1919
+ t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
1920
+ t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1921
+ <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280"
1922
+ d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
1923
+ t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
1924
+ t131.5 -316.5t316.5 -131.5z" />
1925
+ <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048"
1926
+ d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
1927
+ t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
1928
+ t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1929
+ <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280"
1930
+ d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
1931
+ t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
1932
+ <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280"
1933
+ d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
1934
+ t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
1935
+ <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792"
1936
+ />
1937
+ <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792"
1938
+ />
1939
+ <glyph glyph-name="_525" unicode="&#xf230;"
1940
+ d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
1941
+ <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280"
1942
+ d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
1943
+ l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
1944
+ q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
1945
+ <glyph glyph-name="_527" unicode="&#xf232;"
1946
+ d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
1947
+ t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
1948
+ l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
1949
+ <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792"
1950
+ d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
1951
+ q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
1952
+ <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048"
1953
+ d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
1954
+ t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
1955
+ t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
1956
+ <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048"
1957
+ d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
1958
+ q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
1959
+ t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
1960
+ <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048"
1961
+ d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
1962
+ q-26 0 -45 -19t-19 -45v-384h1152z" />
1963
+ <glyph glyph-name="_532" unicode="&#xf237;"
1964
+ d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
1965
+ <glyph glyph-name="_533" unicode="&#xf238;"
1966
+ d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
1967
+ t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
1968
+ <glyph glyph-name="_534" unicode="&#xf239;"
1969
+ d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
1970
+ t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
1971
+ <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792"
1972
+ d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
1973
+ q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
1974
+ <glyph glyph-name="_536" unicode="&#xf23b;"
1975
+ d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
1976
+ <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296"
1977
+ d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
1978
+ q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
1979
+ q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
1980
+ q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
1981
+ q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
1982
+ q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
1983
+ q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
1984
+ t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
1985
+ q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
1986
+ q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
1987
+ M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
1988
+ t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
1989
+ q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
1990
+ l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
1991
+ t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
1992
+ q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
1993
+ q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
1994
+ <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304"
1995
+ d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
1996
+ t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
1997
+ t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
1998
+ <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792"
1999
+ d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
2000
+ t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
2001
+ t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
2002
+ q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
2003
+ q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
2004
+ <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304"
2005
+ d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
2006
+ v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
2007
+ <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304"
2008
+ d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
2009
+ h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
2010
+ <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304"
2011
+ d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
2012
+ h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
2013
+ <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304"
2014
+ d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
2015
+ h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
2016
+ <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304"
2017
+ d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
2018
+ v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
2019
+ <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280"
2020
+ d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
2021
+ <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024"
2022
+ d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
2023
+ <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048"
2024
+ d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
2025
+ h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
2026
+ <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304"
2027
+ d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
2028
+ v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
2029
+ <glyph glyph-name="_549" unicode="&#xf249;"
2030
+ d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
2031
+ <glyph glyph-name="_550" unicode="&#xf24a;"
2032
+ d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
2033
+ z" />
2034
+ <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304"
2035
+ d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
2036
+ t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
2037
+ t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
2038
+ t90 38h2048q52 0 90 -38t38 -90z" />
2039
+ <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304"
2040
+ d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
2041
+ t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
2042
+ M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
2043
+ <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792"
2044
+ d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
2045
+ zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
2046
+ <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304"
2047
+ d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
2048
+ q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
2049
+ t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
2050
+ t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
2051
+ <glyph glyph-name="_555" unicode="&#xf250;"
2052
+ d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
2053
+ t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
2054
+ t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
2055
+ <glyph glyph-name="_556" unicode="&#xf251;"
2056
+ d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
2057
+ t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
2058
+ <glyph glyph-name="_557" unicode="&#xf252;"
2059
+ d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
2060
+ t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
2061
+ <glyph glyph-name="_558" unicode="&#xf253;"
2062
+ d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
2063
+ t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
2064
+ h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
2065
+ <glyph glyph-name="_559" unicode="&#xf254;"
2066
+ d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
2067
+ t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
2068
+ h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
2069
+ <glyph glyph-name="_560" unicode="&#xf255;"
2070
+ d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
2071
+ q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
2072
+ t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
2073
+ q72 69 174 69z" />
2074
+ <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792"
2075
+ d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
2076
+ t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
2077
+ h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
2078
+ <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792"
2079
+ d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
2080
+ q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
2081
+ t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
2082
+ t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
2083
+ q0 -42 -23 -78t-61 -53l-310 -141h91z" />
2084
+ <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048"
2085
+ d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
2086
+ q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
2087
+ q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
2088
+ <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048"
2089
+ d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
2090
+ t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
2091
+ q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
2092
+ l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
2093
+ <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792"
2094
+ d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
2095
+ q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
2096
+ v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
2097
+ v-384h32z" />
2098
+ <glyph glyph-name="_566" unicode="&#xf25b;"
2099
+ d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
2100
+ v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
2101
+ q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
2102
+ q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
2103
+ q0 -53 37.5 -90.5t90.5 -37.5h668z" />
2104
+ <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973"
2105
+ d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
2106
+ t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0