Our Team Showcase - Version 4.4.2

Version Description

  1. Improved query that pulls team members
Download this release

Release Info

Developer smartcat
Plugin Icon 128x128 Our Team Showcase
Version 4.4.2
Comparing to
See all releases

Code changes from version 4.4.1 to 4.4.2

assets/admin/css/admin.css CHANGED
@@ -1,199 +1,199 @@
1
- /* Global Admin */
2
-
3
- #menu-posts-team_member .wp-menu-image:before {
4
- color: #758355 !important;
5
- }
6
-
7
- #menu-posts-team_member:hover .wp-menu-image:before,
8
- #menu-posts-team_member.wp-menu-open .wp-menu-image:before {
9
- color: #a7bb6c !important;
10
- }
11
-
12
- /* edit.php */
13
- .ots-toggle {
14
- margin-bottom: 8px;
15
- }
16
-
17
- .ots-meta-box {
18
- border: none !important;
19
- }
20
-
21
- .ots-meta-box .regular-text {
22
- width: 100%;
23
- }
24
-
25
- .ots-meta-box input,
26
- .ots-meta-box textarea {
27
- border: 1px solid #ddd;
28
- box-shadow: inset 0 1px 2px rgba(0,0,0,.07);
29
- padding: 5px 8px;
30
- transition: 50ms border-color ease-in-out;
31
- }
32
-
33
- .ots-meta-box input[disabled],
34
- .ots-meta-box input[readonly],
35
- .ots-meta-box select[disabled],
36
- .ots-meta-box textarea[disabled] {
37
- border: 1px solid #bbb;
38
- background: #fff;
39
- }
40
-
41
- .ots-meta-box input[type=checkbox],
42
- .ots-meta-box input[type=radio] {
43
- margin-top: 4px;
44
- }
45
-
46
- div[id^="team-"] .inside {
47
- margin: 0 !important;
48
- padding: 0 !important;
49
- }
50
-
51
- .ots-meta-box tr:nth-child(odd) {
52
- background: #fafafa;
53
- }
54
-
55
- .ots-meta-box th {
56
- font-weight: 500;
57
- }
58
-
59
- .ots-meta-box th,
60
- .ots-meta-box td {
61
- display: block;
62
- float: none;
63
- padding: 5px 10px;
64
- }
65
-
66
- .ots-meta-box tr {
67
- border-bottom: 1px solid #ddd !important;
68
- display: block;
69
- padding: 5px 0;
70
- }
71
-
72
- .ots-member-skill-rating {
73
- width: 30%;
74
- margin-left: 4px;
75
- height: 30px !important;
76
- }
77
-
78
- .ots-member-skill-title {
79
- width: 66%;
80
- }
81
-
82
- #ots-member-other-icon {
83
- margin-bottom: 10px;
84
- }
85
-
86
- #ots-member-other-icon,
87
- #ots-member-other {
88
- width: 100%;
89
- }
90
-
91
- @media ( min-width: 767px ) {
92
-
93
- .ots-meta-box input[type=checkbox],
94
- .ots-meta-box input[type=radio] {
95
- margin-top: 0;
96
- margin-bottom: 2px;
97
- }
98
-
99
- }
100
-
101
- @media ( min-width: 769px ) {
102
-
103
- #team_member_image {
104
- width: 20%;
105
- }
106
-
107
- #team_member_image,
108
- .column-team_member_image {
109
- text-align: center;
110
- }
111
-
112
- #ots-member-other-icon {
113
- width: 28%;
114
- }
115
-
116
- #ots-member-other {
117
- width: 70%;
118
- float: right;
119
- }
120
-
121
- .ots-member-skill-rating {
122
- width: 32%;
123
- }
124
-
125
- }
126
-
127
- .ots-pro {
128
- color: #e05555;
129
- }
130
-
131
-
132
- .switch {
133
- position: relative;
134
- display: inline-block;
135
- width: 50px;
136
- height: 23px;
137
- margin-right: 10px;
138
- float: left;
139
- }
140
-
141
- .switch input {
142
- display:none;
143
- }
144
-
145
- .slider {
146
- position: absolute;
147
- cursor: pointer;
148
- top: 0;
149
- left: 0;
150
- right: 0;
151
- bottom: 0;
152
- background-color: #ccc;
153
- -webkit-transition: .4s;
154
- transition: .4s;
155
- }
156
-
157
- .slider:before {
158
- position: absolute;
159
- content: "";
160
- height: 16px;
161
- width: 16px;
162
- left: 4px;
163
- bottom: 4px;
164
- background-color: white;
165
- -webkit-transition: .4s;
166
- transition: .4s;
167
- }
168
-
169
- input:checked + .slider {
170
- background-color: #2196F3;
171
- }
172
-
173
- input:focus + .slider {
174
- box-shadow: 0 0 1px #2196F3;
175
- }
176
-
177
- input:checked + .slider:before {
178
- -webkit-transform: translateX(26px);
179
- -ms-transform: translateX(26px);
180
- transform: translateX(26px);
181
- }
182
-
183
- .slider.round {
184
- border-radius: 50px;
185
- }
186
-
187
- .slider.round:before {
188
- border-radius: 50%;
189
- }
190
-
191
- .tool-status-failed,
192
- .tool-status-failed th{
193
- color: red !important;
194
- }
195
-
196
- .tool-status-success,
197
- .tool-status-success th {
198
- color: green !important;
199
  }
1
+ /* Global Admin */
2
+
3
+ #menu-posts-team_member .wp-menu-image:before {
4
+ color: #758355 !important;
5
+ }
6
+
7
+ #menu-posts-team_member:hover .wp-menu-image:before,
8
+ #menu-posts-team_member.wp-menu-open .wp-menu-image:before {
9
+ color: #a7bb6c !important;
10
+ }
11
+
12
+ /* edit.php */
13
+ .ots-toggle {
14
+ margin-bottom: 8px;
15
+ }
16
+
17
+ .ots-meta-box {
18
+ border: none !important;
19
+ }
20
+
21
+ .ots-meta-box .regular-text {
22
+ width: 100%;
23
+ }
24
+
25
+ .ots-meta-box input,
26
+ .ots-meta-box textarea {
27
+ border: 1px solid #ddd;
28
+ box-shadow: inset 0 1px 2px rgba(0,0,0,.07);
29
+ padding: 5px 8px;
30
+ transition: 50ms border-color ease-in-out;
31
+ }
32
+
33
+ .ots-meta-box input[disabled],
34
+ .ots-meta-box input[readonly],
35
+ .ots-meta-box select[disabled],
36
+ .ots-meta-box textarea[disabled] {
37
+ border: 1px solid #bbb;
38
+ background: #fff;
39
+ }
40
+
41
+ .ots-meta-box input[type=checkbox],
42
+ .ots-meta-box input[type=radio] {
43
+ margin-top: 4px;
44
+ }
45
+
46
+ div[id^="team-"] .inside {
47
+ margin: 0 !important;
48
+ padding: 0 !important;
49
+ }
50
+
51
+ .ots-meta-box tr:nth-child(odd) {
52
+ background: #fafafa;
53
+ }
54
+
55
+ .ots-meta-box th {
56
+ font-weight: 500;
57
+ }
58
+
59
+ .ots-meta-box th,
60
+ .ots-meta-box td {
61
+ display: block;
62
+ float: none;
63
+ padding: 5px 10px;
64
+ }
65
+
66
+ .ots-meta-box tr {
67
+ border-bottom: 1px solid #ddd !important;
68
+ display: block;
69
+ padding: 5px 0;
70
+ }
71
+
72
+ .ots-member-skill-rating {
73
+ width: 30%;
74
+ margin-left: 4px;
75
+ height: 30px !important;
76
+ }
77
+
78
+ .ots-member-skill-title {
79
+ width: 66%;
80
+ }
81
+
82
+ #ots-member-other-icon {
83
+ margin-bottom: 10px;
84
+ }
85
+
86
+ #ots-member-other-icon,
87
+ #ots-member-other {
88
+ width: 100%;
89
+ }
90
+
91
+ @media ( min-width: 767px ) {
92
+
93
+ .ots-meta-box input[type=checkbox],
94
+ .ots-meta-box input[type=radio] {
95
+ margin-top: 0;
96
+ margin-bottom: 2px;
97
+ }
98
+
99
+ }
100
+
101
+ @media ( min-width: 769px ) {
102
+
103
+ #team_member_image {
104
+ width: 20%;
105
+ }
106
+
107
+ #team_member_image,
108
+ .column-team_member_image {
109
+ text-align: center;
110
+ }
111
+
112
+ #ots-member-other-icon {
113
+ width: 28%;
114
+ }
115
+
116
+ #ots-member-other {
117
+ width: 70%;
118
+ float: right;
119
+ }
120
+
121
+ .ots-member-skill-rating {
122
+ width: 32%;
123
+ }
124
+
125
+ }
126
+
127
+ .ots-pro {
128
+ color: #e05555;
129
+ }
130
+
131
+
132
+ .switch {
133
+ position: relative;
134
+ display: inline-block;
135
+ width: 50px;
136
+ height: 23px;
137
+ margin-right: 10px;
138
+ float: left;
139
+ }
140
+
141
+ .switch input {
142
+ display:none;
143
+ }
144
+
145
+ .slider {
146
+ position: absolute;
147
+ cursor: pointer;
148
+ top: 0;
149
+ left: 0;
150
+ right: 0;
151
+ bottom: 0;
152
+ background-color: #ccc;
153
+ -webkit-transition: .4s;
154
+ transition: .4s;
155
+ }
156
+
157
+ .slider:before {
158
+ position: absolute;
159
+ content: "";
160
+ height: 16px;
161
+ width: 16px;
162
+ left: 4px;
163
+ bottom: 4px;
164
+ background-color: white;
165
+ -webkit-transition: .4s;
166
+ transition: .4s;
167
+ }
168
+
169
+ input:checked + .slider {
170
+ background-color: #2196F3;
171
+ }
172
+
173
+ input:focus + .slider {
174
+ box-shadow: 0 0 1px #2196F3;
175
+ }
176
+
177
+ input:checked + .slider:before {
178
+ -webkit-transform: translateX(26px);
179
+ -ms-transform: translateX(26px);
180
+ transform: translateX(26px);
181
+ }
182
+
183
+ .slider.round {
184
+ border-radius: 50px;
185
+ }
186
+
187
+ .slider.round:before {
188
+ border-radius: 50%;
189
+ }
190
+
191
+ .tool-status-failed,
192
+ .tool-status-failed th{
193
+ color: red !important;
194
+ }
195
+
196
+ .tool-status-success,
197
+ .tool-status-success th {
198
+ color: green !important;
199
  }
assets/admin/css/settings.css CHANGED
@@ -1,467 +1,467 @@
1
-
2
- /* Settings page */
3
- #ots-display-limit-number {
4
- width: 160px;
5
- }
6
-
7
- .ots-admin-page {
8
- margin: -20px 0 0 -20px;
9
- padding-top: 20px;
10
- font-family: 'Lato', 'sans-serif' !important;
11
- }
12
-
13
- .ots-admin-page h2,
14
- .ots-admin-page .nav-tab-wrapper a,
15
- .ots-admin-page .form-table th,
16
- .ots-admin-page .title-bar {
17
- font-family: 'Oswald','sans-serif' !important;
18
- font-weight: 400 !important;
19
- }
20
-
21
- .ots-admin-page .notice {
22
- margin: 10px 10px 10px 20px !important;
23
- }
24
-
25
- .ots-admin-page .ots-admin-header {
26
- margin: 10px 10px 0 20px;
27
- }
28
-
29
- .ots-admin-page .button {
30
- font-family: 'Lato', 'sans-serif' !important;
31
- }
32
-
33
- .ots-admin-page .inner {
34
- padding: 0 10px 0 20px;
35
- }
36
-
37
- .ots-admin-page .nav-tab-wrapper {
38
- padding: 0 10px 0 20px;
39
- border-bottom: none !important;
40
- }
41
-
42
- .ots-admin-header {
43
- background: #3a3a3a;
44
- margin-bottom: 10px;
45
- padding: 10px;
46
- }
47
-
48
- .ots-admin-header .branding img {
49
- width: 100%;
50
- }
51
-
52
- .ots-admin-header .branding {
53
- max-width: 160px;
54
- display: none;
55
- margin-bottom: 5px;
56
- }
57
-
58
- .ots-admin-header .title-bar {
59
- display: table;
60
- margin: 0 5px;
61
- padding: 10px 0;
62
- width: 100%;
63
- }
64
-
65
- .ots-admin-header .title-bar .inner {
66
- padding: 0;
67
- display: table-cell;
68
- vertical-align: middle;
69
- background: transparent;
70
- }
71
-
72
- .ots-admin-header .title-bar .inner:last-of-type {
73
- min-width: 130px;
74
- }
75
-
76
- .ots-admin-header .cta {
77
- background: #0085ba;
78
- border: 2px solid #fff;
79
- padding: 15px 25px;
80
- color: #fff;
81
- border-radius: 3px;
82
- margin: 0 2px;
83
- font-size: 16px;
84
- text-transform: uppercase;
85
- transition: all .5s ease;
86
- cursor: pointer;
87
- letter-spacing: 3px;
88
- font-weight: 100;
89
- }
90
-
91
- .ots-admin-header a.cta {
92
- text-decoration: none;
93
- }
94
-
95
- .ots-admin-header .cta:hover {
96
- background: #00719e;
97
- }
98
-
99
- .ots-admin-header .cta-secondary {
100
- display: none;
101
- background: transparent;
102
- }
103
-
104
- .ots-admin-header .page-title {
105
- color: #fff;
106
- font-size: 42px;
107
- line-height: 38px;
108
- margin: 0;
109
- letter-spacing: 1px;
110
- text-transform: uppercase;
111
- text-align: left;
112
- }
113
-
114
- .ots-admin-page .nav-tab {
115
- border: 1px solid #ddd;
116
- background: #f9f9f9;
117
- margin: 10px 10px 0 0;
118
- font-size: 16px;
119
- }
120
-
121
- .ots-admin-page .nav-tab.nav-tab-active {
122
- border: 1px solid #ddd;
123
- }
124
-
125
- .ots-admin-page .form-table {
126
- background: #fff;
127
- margin-top: -1px;
128
- }
129
-
130
- .ots-admin-page .form-table tr {
131
- border: 1px solid #ddd;
132
- }
133
-
134
- .ots-admin-page .form-table th {
135
- padding-left: 10px;
136
- font-size: 16px;
137
- }
138
-
139
- .ots-admin-page .form-table td {
140
- padding: 10px 15px 15px 15px;
141
- }
142
-
143
- .ots-admin-page form h2 {
144
- background: #f9f9f9;
145
- padding: 0.8em 10px;
146
- margin: 10px 0 0;
147
- border: 1px solid #ddd;
148
- font-size: 18px;
149
- }
150
-
151
- .ots-admin-page form input,
152
- .ots-admin-page form select,
153
- .ots-admin-page form textarea {
154
- border-radius: 3px;
155
- border: 1px solid #ccc;
156
- padding: 3px 10px;
157
- }
158
-
159
- .ots-admin-page form input,
160
- .ots-admin-page form select {
161
- line-height: 30px;
162
- }
163
-
164
- .ots-admin-page form input:not([type="checkbox"]):not([type="radio"]),
165
- .ots-admin-page form select {
166
- height: 30px;
167
- }
168
-
169
- .ots-admin-page .form-table .regular-text {
170
- width: 100%;
171
- }
172
-
173
- @media( min-width: 600px ) {
174
-
175
- .ots-admin-page .nav-tab:first-of-type {
176
- margin-left: 0;
177
- }
178
-
179
- .ots-admin-header .title-bar .inner:last-of-type {
180
- padding-right: 20px;
181
- text-align: right;
182
- }
183
-
184
- .ots-admin-header .title-bar .inner .cta {
185
- margin-left: 5px;
186
- }
187
-
188
- .ots-admin-header .branding {
189
- display: block;
190
- }
191
-
192
- }
193
-
194
- .ots-admin-page .sidebar {
195
- display: none;
196
- width: 35%;
197
- margin-top: 10px;
198
- float: right;
199
- }
200
-
201
- .ots-admin-page .sidebar .widget {
202
- background: #fff;
203
- border: 1px solid #ddd;
204
- }
205
-
206
- .ots-admin-page .sidebar .widget .content {
207
- padding: 5px 20px;
208
- }
209
-
210
- .ots-admin-page .sidebar .widget h2 {
211
- margin: 0;
212
- padding: 0.8em 15px;
213
- background: #f9f9f9;
214
- border-bottom: 1px solid #ddd;
215
- }
216
-
217
- .ots-admin-page .sidebar .widget ul {
218
- display: table;
219
- }
220
-
221
- .ots-admin-page .sidebar .widget ul > li {
222
- display: table-row;
223
- }
224
-
225
- .ots-admin-page .sidebar .widget ul > li:before {
226
- content: " - ";
227
- display: table-cell;
228
- padding: 8px 5px;
229
- }
230
-
231
- @media( min-width: 783px ) {
232
-
233
- .ots-admin-page {
234
- background: #f9f9f9;
235
- }
236
-
237
- .ots-admin-page .ots-admin-header {
238
- margin-bottom: 10px;
239
- }
240
-
241
- .ots-admin-header .cta-secondary {
242
- display: inline;
243
- }
244
-
245
- .ots-admin-page .inner {
246
- padding-top: 10px;
247
- background: #f1f1f1;
248
- }
249
-
250
- .ots-admin-page .nav-tab {
251
- background: #f9f9f9;
252
- }
253
-
254
- .ots-admin-page .nav-tab.nav-tab-active {
255
- border-bottom: 1px solid #f3f3f3;
256
- background: #f3f3f3;
257
- }
258
-
259
- .ots-admin-page .nav-tab-wrapper {
260
- border-bottom: 1px solid #ddd !important;
261
- }
262
-
263
- .ots-admin-page .tabs-content {
264
- width: 62%;
265
- float: left;
266
- }
267
-
268
- .ots-admin-page .form-table td {
269
- padding: 10px 20px 10px 10px;
270
- }
271
-
272
- .ots-admin-page .form-table th {
273
- padding-left: 20px;
274
- vertical-align: middle;
275
- }
276
-
277
- .ots-admin-page form h2 {
278
- padding: 0.8em 15px;
279
- }
280
-
281
- .ots-admin-page .sidebar {
282
- display: inline-block;
283
- }
284
-
285
- .ots-admin-page .nav-tab {
286
- padding: 10px 15px;
287
- margin: -1px;
288
- }
289
-
290
- .ots-admin-page .nav-tab:first-of-type {
291
- margin-left: 0;
292
- }
293
- }
294
-
295
-
296
- /* Documentation Page */
297
-
298
- .ots-documentation .form-table th,
299
- .ots-documentation .form-table td {
300
- display: block;
301
- }
302
-
303
- .ots-documentation .form-table th {
304
- padding: 15px 20px 5px 20px;
305
- font-size: 16px;
306
- width: 80%;
307
- }
308
-
309
- .ots-documentation .form-table td {
310
- padding: 10px 20px;
311
- }
312
-
313
- .ots-documentation .form-table td p {
314
- margin: 0 10px 15px 10px;
315
- }
316
-
317
- .ots-documentation .media img {
318
- max-width: 100%;
319
- }
320
-
321
- .ots-documentation code {
322
- word-break: break-all;
323
- }
324
-
325
-
326
- .ots-documentation .widefat.data th,
327
- .ots-documentation .widefat.data td {
328
- display: table-cell;
329
- width: auto;
330
- }
331
-
332
- .ots-documentation .widefat.data tbody tr:nth-child(odd) {
333
- background: #f2f2f2;
334
- }
335
-
336
- /* Reorder Page */
337
-
338
- .ots-member {
339
- display: inline-block;
340
- background: #fff;
341
- border: 1px solid #ddd;
342
- height: 180px;
343
- vertical-align: top;
344
- width: 31%;
345
- cursor: pointer;
346
- transition: transform 0.5s ease, box-shadow 0.5s ease;
347
- position: relative;
348
- margin: 10px auto;
349
- }
350
-
351
- .ots-member:hover {
352
- transform: translateY(-10px);
353
- box-shadow: 0 10px 10px rgba(0, 0, 0, 0.5);
354
- }
355
-
356
- .ots-member .edit {
357
- color: #fff;
358
- border: 2px solid #fff;
359
- text-decoration: none;
360
- opacity: 0;
361
- position: absolute;
362
- right: 0;
363
- margin: -10px;
364
- background: #0085ba;
365
- border-radius: 50%;
366
- padding: 4px;
367
- z-index: 2;
368
- box-shadow: 0 5px 5px rgba(0, 0, 0, 0.5);
369
- transition: all 0.5s ease;
370
- }
371
-
372
- .ots-member:hover > .edit {
373
- opacity: 1;
374
- }
375
-
376
- .ots-member .edit:hover {
377
- filter: brightness(120%);
378
- box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
379
- }
380
-
381
- .ots-member .inner {
382
- padding: 10px;
383
- }
384
-
385
- .ots-member .inner .thumbnail {
386
- height: 100px;
387
- width: 100%;
388
- text-align: center;
389
- background-size: cover;
390
- background-position: center top;
391
- background-repeat: no-repeat;
392
- }
393
-
394
- .ots-member .name,
395
- .ots-member .job-title {
396
- text-overflow: ellipsis;
397
- overflow: hidden;
398
- white-space: nowrap;
399
- }
400
-
401
- .ots-member .name {
402
- margin-bottom: 4px;
403
- }
404
-
405
- @media screen and (min-width: 768px) {
406
-
407
- .ots-member {
408
- max-width: 14%;
409
- margin: 10px 5px;
410
- }
411
-
412
- }
413
-
414
- @media screen and (min-width: 1025px) {
415
-
416
- .ots-member {
417
- max-width: 10%;
418
- }
419
-
420
- }
421
-
422
-
423
- /* Add-ons Page */
424
-
425
- .ots-admin-page.ots-add-ons {
426
- background: #f1f1f1;
427
- }
428
-
429
- .ots-add-ons .ots-add-on {
430
- display: inline-block;
431
- position: relative;
432
- background: rgb(249, 249, 249);
433
- padding: 20px;
434
- min-height: 390px;
435
- vertical-align: top;
436
- border: 1px solid #ddd;
437
- margin: 10px 0 5px 0;
438
- }
439
- .ots-add-ons .ots-add-on .cta {
440
- text-align: center;
441
- padding: 5px;
442
- }
443
-
444
-
445
- .ots-add-ons .ots-add-on img {
446
- width: 100%;
447
- }
448
-
449
- .ots-add-ons .ots-add-on h2 {
450
- font-size: 24px;
451
- }
452
-
453
- .button {
454
- display: inline-block;
455
- margin-right: 3px !important;
456
- }
457
-
458
- @media(min-width: 768px) {
459
-
460
- .ots-add-ons .ots-add-on {
461
- max-width: 800px;
462
- float: left;
463
- margin: 0 10px 10px 0;
464
- min-height: 520px;
465
- }
466
-
467
  }
1
+
2
+ /* Settings page */
3
+ #ots-display-limit-number {
4
+ width: 160px;
5
+ }
6
+
7
+ .ots-admin-page {
8
+ margin: -20px 0 0 -20px;
9
+ padding-top: 20px;
10
+ font-family: 'Lato', 'sans-serif' !important;
11
+ }
12
+
13
+ .ots-admin-page h2,
14
+ .ots-admin-page .nav-tab-wrapper a,
15
+ .ots-admin-page .form-table th,
16
+ .ots-admin-page .title-bar {
17
+ font-family: 'Oswald','sans-serif' !important;
18
+ font-weight: 400 !important;
19
+ }
20
+
21
+ .ots-admin-page .notice {
22
+ margin: 10px 10px 10px 20px !important;
23
+ }
24
+
25
+ .ots-admin-page .ots-admin-header {
26
+ margin: 10px 10px 0 20px;
27
+ }
28
+
29
+ .ots-admin-page .button {
30
+ font-family: 'Lato', 'sans-serif' !important;
31
+ }
32
+
33
+ .ots-admin-page .inner {
34
+ padding: 0 10px 0 20px;
35
+ }
36
+
37
+ .ots-admin-page .nav-tab-wrapper {
38
+ padding: 0 10px 0 20px;
39
+ border-bottom: none !important;
40
+ }
41
+
42
+ .ots-admin-header {
43
+ background: #3a3a3a;
44
+ margin-bottom: 10px;
45
+ padding: 10px;
46
+ }
47
+
48
+ .ots-admin-header .branding img {
49
+ width: 100%;
50
+ }
51
+
52
+ .ots-admin-header .branding {
53
+ max-width: 160px;
54
+ display: none;
55
+ margin-bottom: 5px;
56
+ }
57
+
58
+ .ots-admin-header .title-bar {
59
+ display: table;
60
+ margin: 0 5px;
61
+ padding: 10px 0;
62
+ width: 100%;
63
+ }
64
+
65
+ .ots-admin-header .title-bar .inner {
66
+ padding: 0;
67
+ display: table-cell;
68
+ vertical-align: middle;
69
+ background: transparent;
70
+ }
71
+
72
+ .ots-admin-header .title-bar .inner:last-of-type {
73
+ min-width: 130px;
74
+ }
75
+
76
+ .ots-admin-header .cta {
77
+ background: #0085ba;
78
+ border: 2px solid #fff;
79
+ padding: 15px 25px;
80
+ color: #fff;
81
+ border-radius: 3px;
82
+ margin: 0 2px;
83
+ font-size: 16px;
84
+ text-transform: uppercase;
85
+ transition: all .5s ease;
86
+ cursor: pointer;
87
+ letter-spacing: 3px;
88
+ font-weight: 100;
89
+ }
90
+
91
+ .ots-admin-header a.cta {
92
+ text-decoration: none;
93
+ }
94
+
95
+ .ots-admin-header .cta:hover {
96
+ background: #00719e;
97
+ }
98
+
99
+ .ots-admin-header .cta-secondary {
100
+ display: none;
101
+ background: transparent;
102
+ }
103
+
104
+ .ots-admin-header .page-title {
105
+ color: #fff;
106
+ font-size: 42px;
107
+ line-height: 38px;
108
+ margin: 0;
109
+ letter-spacing: 1px;
110
+ text-transform: uppercase;
111
+ text-align: left;
112
+ }
113
+
114
+ .ots-admin-page .nav-tab {
115
+ border: 1px solid #ddd;
116
+ background: #f9f9f9;
117
+ margin: 10px 10px 0 0;
118
+ font-size: 16px;
119
+ }
120
+
121
+ .ots-admin-page .nav-tab.nav-tab-active {
122
+ border: 1px solid #ddd;
123
+ }
124
+
125
+ .ots-admin-page .form-table {
126
+ background: #fff;
127
+ margin-top: -1px;
128
+ }
129
+
130
+ .ots-admin-page .form-table tr {
131
+ border: 1px solid #ddd;
132
+ }
133
+
134
+ .ots-admin-page .form-table th {
135
+ padding-left: 10px;
136
+ font-size: 16px;
137
+ }
138
+
139
+ .ots-admin-page .form-table td {
140
+ padding: 10px 15px 15px 15px;
141
+ }
142
+
143
+ .ots-admin-page form h2 {
144
+ background: #f9f9f9;
145
+ padding: 0.8em 10px;
146
+ margin: 10px 0 0;
147
+ border: 1px solid #ddd;
148
+ font-size: 18px;
149
+ }
150
+
151
+ .ots-admin-page form input,
152
+ .ots-admin-page form select,
153
+ .ots-admin-page form textarea {
154
+ border-radius: 3px;
155
+ border: 1px solid #ccc;
156
+ padding: 3px 10px;
157
+ }
158
+
159
+ .ots-admin-page form input,
160
+ .ots-admin-page form select {
161
+ line-height: 30px;
162
+ }
163
+
164
+ .ots-admin-page form input:not([type="checkbox"]):not([type="radio"]),
165
+ .ots-admin-page form select {
166
+ height: 30px;
167
+ }
168
+
169
+ .ots-admin-page .form-table .regular-text {
170
+ width: 100%;
171
+ }
172
+
173
+ @media( min-width: 600px ) {
174
+
175
+ .ots-admin-page .nav-tab:first-of-type {
176
+ margin-left: 0;
177
+ }
178
+
179
+ .ots-admin-header .title-bar .inner:last-of-type {
180
+ padding-right: 20px;
181
+ text-align: right;
182
+ }
183
+
184
+ .ots-admin-header .title-bar .inner .cta {
185
+ margin-left: 5px;
186
+ }
187
+
188
+ .ots-admin-header .branding {
189
+ display: block;
190
+ }
191
+
192
+ }
193
+
194
+ .ots-admin-page .sidebar {
195
+ display: none;
196
+ width: 35%;
197
+ margin-top: 10px;
198
+ float: right;
199
+ }
200
+
201
+ .ots-admin-page .sidebar .widget {
202
+ background: #fff;
203
+ border: 1px solid #ddd;
204
+ }
205
+
206
+ .ots-admin-page .sidebar .widget .content {
207
+ padding: 5px 20px;
208
+ }
209
+
210
+ .ots-admin-page .sidebar .widget h2 {
211
+ margin: 0;
212
+ padding: 0.8em 15px;
213
+ background: #f9f9f9;
214
+ border-bottom: 1px solid #ddd;
215
+ }
216
+
217
+ .ots-admin-page .sidebar .widget ul {
218
+ display: table;
219
+ }
220
+
221
+ .ots-admin-page .sidebar .widget ul > li {
222
+ display: table-row;
223
+ }
224
+
225
+ .ots-admin-page .sidebar .widget ul > li:before {
226
+ content: " - ";
227
+ display: table-cell;
228
+ padding: 8px 5px;
229
+ }
230
+
231
+ @media( min-width: 783px ) {
232
+
233
+ .ots-admin-page {
234
+ background: #f9f9f9;
235
+ }
236
+
237
+ .ots-admin-page .ots-admin-header {
238
+ margin-bottom: 10px;
239
+ }
240
+
241
+ .ots-admin-header .cta-secondary {
242
+ display: inline;
243
+ }
244
+
245
+ .ots-admin-page .inner {
246
+ padding-top: 10px;
247
+ background: #f1f1f1;
248
+ }
249
+
250
+ .ots-admin-page .nav-tab {
251
+ background: #f9f9f9;
252
+ }
253
+
254
+ .ots-admin-page .nav-tab.nav-tab-active {
255
+ border-bottom: 1px solid #f3f3f3;
256
+ background: #f3f3f3;
257
+ }
258
+
259
+ .ots-admin-page .nav-tab-wrapper {
260
+ border-bottom: 1px solid #ddd !important;
261
+ }
262
+
263
+ .ots-admin-page .tabs-content {
264
+ width: 62%;
265
+ float: left;
266
+ }
267
+
268
+ .ots-admin-page .form-table td {
269
+ padding: 10px 20px 10px 10px;
270
+ }
271
+
272
+ .ots-admin-page .form-table th {
273
+ padding-left: 20px;
274
+ vertical-align: middle;
275
+ }
276
+
277
+ .ots-admin-page form h2 {
278
+ padding: 0.8em 15px;
279
+ }
280
+
281
+ .ots-admin-page .sidebar {
282
+ display: inline-block;
283
+ }
284
+
285
+ .ots-admin-page .nav-tab {
286
+ padding: 10px 15px;
287
+ margin: -1px;
288
+ }
289
+
290
+ .ots-admin-page .nav-tab:first-of-type {
291
+ margin-left: 0;
292
+ }
293
+ }
294
+
295
+
296
+ /* Documentation Page */
297
+
298
+ .ots-documentation .form-table th,
299
+ .ots-documentation .form-table td {
300
+ display: block;
301
+ }
302
+
303
+ .ots-documentation .form-table th {
304
+ padding: 15px 20px 5px 20px;
305
+ font-size: 16px;
306
+ width: 80%;
307
+ }
308
+
309
+ .ots-documentation .form-table td {
310
+ padding: 10px 20px;
311
+ }
312
+
313
+ .ots-documentation .form-table td p {
314
+ margin: 0 10px 15px 10px;
315
+ }
316
+
317
+ .ots-documentation .media img {
318
+ max-width: 100%;
319
+ }
320
+
321
+ .ots-documentation code {
322
+ word-break: break-all;
323
+ }
324
+
325
+
326
+ .ots-documentation .widefat.data th,
327
+ .ots-documentation .widefat.data td {
328
+ display: table-cell;
329
+ width: auto;
330
+ }
331
+
332
+ .ots-documentation .widefat.data tbody tr:nth-child(odd) {
333
+ background: #f2f2f2;
334
+ }
335
+
336
+ /* Reorder Page */
337
+
338
+ .ots-member {
339
+ display: inline-block;
340
+ background: #fff;
341
+ border: 1px solid #ddd;
342
+ height: 180px;
343
+ vertical-align: top;
344
+ width: 31%;
345
+ cursor: pointer;
346
+ transition: transform 0.5s ease, box-shadow 0.5s ease;
347
+ position: relative;
348
+ margin: 10px auto;
349
+ }
350
+
351
+ .ots-member:hover {
352
+ transform: translateY(-10px);
353
+ box-shadow: 0 10px 10px rgba(0, 0, 0, 0.5);
354
+ }
355
+
356
+ .ots-member .edit {
357
+ color: #fff;
358
+ border: 2px solid #fff;
359
+ text-decoration: none;
360
+ opacity: 0;
361
+ position: absolute;
362
+ right: 0;
363
+ margin: -10px;
364
+ background: #0085ba;
365
+ border-radius: 50%;
366
+ padding: 4px;
367
+ z-index: 2;
368
+ box-shadow: 0 5px 5px rgba(0, 0, 0, 0.5);
369
+ transition: all 0.5s ease;
370
+ }
371
+
372
+ .ots-member:hover > .edit {
373
+ opacity: 1;
374
+ }
375
+
376
+ .ots-member .edit:hover {
377
+ filter: brightness(120%);
378
+ box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
379
+ }
380
+
381
+ .ots-member .inner {
382
+ padding: 10px;
383
+ }
384
+
385
+ .ots-member .inner .thumbnail {
386
+ height: 100px;
387
+ width: 100%;
388
+ text-align: center;
389
+ background-size: cover;
390
+ background-position: center top;
391
+ background-repeat: no-repeat;
392
+ }
393
+
394
+ .ots-member .name,
395
+ .ots-member .job-title {
396
+ text-overflow: ellipsis;
397
+ overflow: hidden;
398
+ white-space: nowrap;
399
+ }
400
+
401
+ .ots-member .name {
402
+ margin-bottom: 4px;
403
+ }
404
+
405
+ @media screen and (min-width: 768px) {
406
+
407
+ .ots-member {
408
+ max-width: 14%;
409
+ margin: 10px 5px;
410
+ }
411
+
412
+ }
413
+
414
+ @media screen and (min-width: 1025px) {
415
+
416
+ .ots-member {
417
+ max-width: 10%;
418
+ }
419
+
420
+ }
421
+
422
+
423
+ /* Add-ons Page */
424
+
425
+ .ots-admin-page.ots-add-ons {
426
+ background: #f1f1f1;
427
+ }
428
+
429
+ .ots-add-ons .ots-add-on {
430
+ display: inline-block;
431
+ position: relative;
432
+ background: rgb(249, 249, 249);
433
+ padding: 20px;
434
+ min-height: 390px;
435
+ vertical-align: top;
436
+ border: 1px solid #ddd;
437
+ margin: 10px 0 5px 0;
438
+ }
439
+ .ots-add-ons .ots-add-on .cta {
440
+ text-align: center;
441
+ padding: 5px;
442
+ }
443
+
444
+
445
+ .ots-add-ons .ots-add-on img {
446
+ width: 100%;
447
+ }
448
+
449
+ .ots-add-ons .ots-add-on h2 {
450
+ font-size: 24px;
451
+ }
452
+
453
+ .button {
454
+ display: inline-block;
455
+ margin-right: 3px !important;
456
+ }
457
+
458
+ @media(min-width: 768px) {
459
+
460
+ .ots-add-ons .ots-add-on {
461
+ max-width: 800px;
462
+ float: left;
463
+ margin: 0 10px 10px 0;
464
+ min-height: 520px;
465
+ }
466
+
467
  }
assets/admin/js/customizer.js CHANGED
@@ -1,19 +1,19 @@
1
- ;(function ($) {
2
-
3
- $(document).on('change', '.ots-widget-display-all', function() {
4
- const checked = $(this).is(':checked'),
5
- $limit = $(this)
6
- .parents('.ots-widget-limit')
7
- .find('.ots-limit-number');
8
-
9
- $limit.prop('disabled', checked);
10
-
11
- if (!$(this).prop('checked')) {
12
- $limit.focus().val(1);
13
- } else {
14
- $limit.val('');
15
- }
16
-
17
- });
18
-
19
  })(jQuery);
1
+ ;(function ($) {
2
+
3
+ $(document).on('change', '.ots-widget-display-all', function() {
4
+ const checked = $(this).is(':checked'),
5
+ $limit = $(this)
6
+ .parents('.ots-widget-limit')
7
+ .find('.ots-limit-number');
8
+
9
+ $limit.prop('disabled', checked);
10
+
11
+ if (!$(this).prop('checked')) {
12
+ $limit.focus().val(1);
13
+ } else {
14
+ $limit.val('');
15
+ }
16
+
17
+ });
18
+
19
  })(jQuery);
assets/admin/js/reorder.js CHANGED
@@ -1,14 +1,14 @@
1
- jQuery(document).ready(function ($) {
2
-
3
- var members = $('#ots-team-member-order').sortable({
4
- update: update_order
5
- });
6
-
7
-
8
- function update_order() {
9
- $('[name="members_order"]').val(members.sortable('serialize'));
10
- }
11
-
12
- update_order();
13
-
14
  });
1
+ jQuery(document).ready(function ($) {
2
+
3
+ var members = $('#ots-team-member-order').sortable({
4
+ update: update_order
5
+ });
6
+
7
+
8
+ function update_order() {
9
+ $('[name="members_order"]').val(members.sortable('serialize'));
10
+ }
11
+
12
+ update_order();
13
+
14
  });
assets/admin/js/settings.js CHANGED
@@ -1,50 +1,50 @@
1
- jQuery(document).ready(function ($) {
2
-
3
-
4
- // ---------- Tools //
5
- $('#ots-import-replace-existing, #ots-import--button').prop('disabled', true);
6
-
7
- $('[name="ots_file_import"]').change(function (e) {
8
- $('#ots-import-replace-existing, #ots-import--button').prop('disabled', !$(this).get([0]).files.length);
9
- });
10
-
11
-
12
- $( '#ots-import-form' ).submit( function(e) {
13
-
14
- if( $( '#ots-import-replace-existing' ).prop('checked') === true ) {
15
-
16
- if (confirm( 'This will delete all your team members' )) {
17
- return true
18
- } else {
19
- return false
20
- }
21
-
22
- }
23
- });
24
-
25
-
26
- // -------------------
27
-
28
- var limit = $('#ots-display-limit-number');
29
-
30
-
31
- $('#ots-display-limit-all').change(function (e) {
32
-
33
- limit.prop('disabled', !limit.prop('disabled'));
34
-
35
- if (!$(e.target).prop('checked')) {
36
-
37
- limit.focus().val(1);
38
-
39
- } else {
40
-
41
- limit.val('');
42
-
43
- }
44
-
45
- });
46
-
47
-
48
- $('.wp-color-picker').wpColorPicker();
49
-
50
  });
1
+ jQuery(document).ready(function ($) {
2
+
3
+
4
+ // ---------- Tools //
5
+ $('#ots-import-replace-existing, #ots-import--button').prop('disabled', true);
6
+
7
+ $('[name="ots_file_import"]').change(function (e) {
8
+ $('#ots-import-replace-existing, #ots-import--button').prop('disabled', !$(this).get([0]).files.length);
9
+ });
10
+
11
+
12
+ $( '#ots-import-form' ).submit( function(e) {
13
+
14
+ if( $( '#ots-import-replace-existing' ).prop('checked') === true ) {
15
+
16
+ if (confirm( 'This will delete all your team members' )) {
17
+ return true
18
+ } else {
19
+ return false
20
+ }
21
+
22
+ }
23
+ });
24
+
25
+
26
+ // -------------------
27
+
28
+ var limit = $('#ots-display-limit-number');
29
+
30
+
31
+ $('#ots-display-limit-all').change(function (e) {
32
+
33
+ limit.prop('disabled', !limit.prop('disabled'));
34
+
35
+ if (!$(e.target).prop('checked')) {
36
+
37
+ limit.focus().val(1);
38
+
39
+ } else {
40
+
41
+ limit.val('');
42
+
43
+ }
44
+
45
+ });
46
+
47
+
48
+ $('.wp-color-picker').wpColorPicker();
49
+
50
  });
assets/css/common.css CHANGED
@@ -1,125 +1,125 @@
1
- .clear {
2
- clear: both;
3
- }
4
-
5
- .sc-left {
6
- float: left;
7
- box-sizing: border-box;
8
- }
9
-
10
- .width25,
11
- .width50,
12
- .width75 {
13
- width: 100%;
14
- padding: 20px 20px 20px 20px;
15
- }
16
-
17
- .sc_team_member .sc_team_member_name a {
18
- text-decoration: none;
19
- }
20
-
21
- .sc_team_single_disabled {
22
- cursor: default;
23
- }
24
- .sc-team-member-posts a {
25
- font-size: 18px;
26
- }
27
-
28
-
29
- #sc_our_team .sc_team_member .icons a {
30
- margin: 0 auto 5px auto;
31
- text-decoration: none;
32
- box-shadow: none;
33
- border: none;
34
- }
35
-
36
- #sc_our_team .sc_team_member .icons img {
37
- display: inline-block;
38
- box-shadow: none;
39
- border: none;
40
- margin: 0 2px 0 2px;
41
- }
42
-
43
- #sc_our_team .sc_team_member_inner {
44
- width: 100%;
45
- height: 100%;
46
- overflow: hidden;
47
- }
48
-
49
- #sc_our_team .sc_team_member .sc_team_more img {
50
- width: 50px;
51
- height: 50px;
52
- margin: 0 auto 0 auto;
53
- }
54
-
55
- #sc_our_team .sc_team_member .sc_team_more a,
56
- #sc_our_team .sc_team_member .sc_team_more img {
57
- box-shadow: none;
58
- border: none;
59
- }
60
-
61
-
62
- @media (min-width: 768px){
63
-
64
-
65
- #sc_our_team.sc-col3 .sc_team_member {
66
- width: 33.3%;
67
- }
68
-
69
- #sc_our_team.sc-col4 .sc_team_member {
70
- width: 25%;
71
- }
72
-
73
- #sc_our_team.sc-col2 .sc_team_member {
74
- width: 50%;
75
- }
76
-
77
- #sc_our_team.sc-col5 .sc_team_member {
78
- width: 20%;
79
- }
80
-
81
- #sc_our_team.sc-col10 .sc_team_member {
82
- width: 10%;
83
- }
84
-
85
- #sc_our_team.sc-col5 .sc_team_member {
86
- width: 17%;
87
- margin: 1%;
88
- }
89
-
90
- #sc_our_team.sc-col10 .sc_team_member {
91
- width: 10%;
92
- }
93
-
94
- .width25 {
95
- width: 24%;
96
- padding: 0 15px 0 15px;
97
- }
98
-
99
- .width50 {
100
- width: 49%;
101
- padding: 0 15px 0 15px;
102
- }
103
-
104
- .width75 {
105
- width: 73%;
106
- padding: 0 15px 0 15px;
107
- }
108
-
109
- }
110
-
111
- .sc-hidden-member {
112
- opacity: 0;
113
- width: 0;
114
- transform: translate(-50px,0);
115
- transition: 0.3s all ease-in-out;
116
- -moz-transition: 0.3s all ease-in-out;
117
- -webkit-transition: 0.3s all ease-in-out;
118
- }
119
-
120
- .sc-reveal-member {
121
-
122
- transform: translate( -50px, 0 );
123
- -moz-transform: translate( -50px, 0 );
124
- -webkit-transform: translate( -50px, 0 );
125
  }
1
+ .clear {
2
+ clear: both;
3
+ }
4
+
5
+ .sc-left {
6
+ float: left;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ .width25,
11
+ .width50,
12
+ .width75 {
13
+ width: 100%;
14
+ padding: 20px 20px 20px 20px;
15
+ }
16
+
17
+ .sc_team_member .sc_team_member_name a {
18
+ text-decoration: none;
19
+ }
20
+
21
+ .sc_team_single_disabled {
22
+ cursor: default;
23
+ }
24
+ .sc-team-member-posts a {
25
+ font-size: 18px;
26
+ }
27
+
28
+
29
+ #sc_our_team .sc_team_member .icons a {
30
+ margin: 0 auto 5px auto;
31
+ text-decoration: none;
32
+ box-shadow: none;
33
+ border: none;
34
+ }
35
+
36
+ #sc_our_team .sc_team_member .icons img {
37
+ display: inline-block;
38
+ box-shadow: none;
39
+ border: none;
40
+ margin: 0 2px 0 2px;
41
+ }
42
+
43
+ #sc_our_team .sc_team_member_inner {
44
+ width: 100%;
45
+ height: 100%;
46
+ overflow: hidden;
47
+ }
48
+
49
+ #sc_our_team .sc_team_member .sc_team_more img {
50
+ width: 50px;
51
+ height: 50px;
52
+ margin: 0 auto 0 auto;
53
+ }
54
+
55
+ #sc_our_team .sc_team_member .sc_team_more a,
56
+ #sc_our_team .sc_team_member .sc_team_more img {
57
+ box-shadow: none;
58
+ border: none;
59
+ }
60
+
61
+
62
+ @media (min-width: 768px){
63
+
64
+
65
+ #sc_our_team.sc-col3 .sc_team_member {
66
+ width: 33.3%;
67
+ }
68
+
69
+ #sc_our_team.sc-col4 .sc_team_member {
70
+ width: 25%;
71
+ }
72
+
73
+ #sc_our_team.sc-col2 .sc_team_member {
74
+ width: 50%;
75
+ }
76
+
77
+ #sc_our_team.sc-col5 .sc_team_member {
78
+ width: 20%;
79
+ }
80
+
81
+ #sc_our_team.sc-col10 .sc_team_member {
82
+ width: 10%;
83
+ }
84
+
85
+ #sc_our_team.sc-col5 .sc_team_member {
86
+ width: 17%;
87
+ margin: 1%;
88
+ }
89
+
90
+ #sc_our_team.sc-col10 .sc_team_member {
91
+ width: 10%;
92
+ }
93
+
94
+ .width25 {
95
+ width: 24%;
96
+ padding: 0 15px 0 15px;
97
+ }
98
+
99
+ .width50 {
100
+ width: 49%;
101
+ padding: 0 15px 0 15px;
102
+ }
103
+
104
+ .width75 {
105
+ width: 73%;
106
+ padding: 0 15px 0 15px;
107
+ }
108
+
109
+ }
110
+
111
+ .sc-hidden-member {
112
+ opacity: 0;
113
+ width: 0;
114
+ transform: translate(-50px,0);
115
+ transition: 0.3s all ease-in-out;
116
+ -moz-transition: 0.3s all ease-in-out;
117
+ -webkit-transition: 0.3s all ease-in-out;
118
+ }
119
+
120
+ .sc-reveal-member {
121
+
122
+ transform: translate( -50px, 0 );
123
+ -moz-transform: translate( -50px, 0 );
124
+ -webkit-transform: translate( -50px, 0 );
125
  }
assets/css/single.css CHANGED
@@ -1,37 +1,37 @@
1
- .sc_team_posts.sc_team_post .sc-team-member-posts {
2
- overflow: hidden;
3
- }
4
-
5
- .sc_team_posts.sc_team_post .sc-team-member-posts > div {
6
- overflow: hidden;
7
- }
8
-
9
- .sc-team-member-posts .width25 {
10
- padding: 0 0 0 0;
11
- width: 25% !important;
12
- text-align: center;
13
- }
14
- .sc-team-member-posts .width75 {
15
- width: 73%
16
- }
17
-
18
- .sc-team-member-posts .sc-team-member-post {
19
- margin: 0 0 15px 0;
20
- }
21
-
22
- .sc_team_posts a {
23
- font-size: 18px;
24
- }
25
-
26
- .smartcat_team_single_icons img {
27
- width: 25px;
28
- margin: 5px 5px 5px 5px
29
- ;
30
- display: inline-block !important;
31
- }
32
-
33
- .smartcat_team_single_icons img,
34
- .smartcat_team_single_icons a {
35
- box-shadow: none !important;
36
- border: none !important;
37
  }
1
+ .sc_team_posts.sc_team_post .sc-team-member-posts {
2
+ overflow: hidden;
3
+ }
4
+
5
+ .sc_team_posts.sc_team_post .sc-team-member-posts > div {
6
+ overflow: hidden;
7
+ }
8
+
9
+ .sc-team-member-posts .width25 {
10
+ padding: 0 0 0 0;
11
+ width: 25% !important;
12
+ text-align: center;
13
+ }
14
+ .sc-team-member-posts .width75 {
15
+ width: 73%
16
+ }
17
+
18
+ .sc-team-member-posts .sc-team-member-post {
19
+ margin: 0 0 15px 0;
20
+ }
21
+
22
+ .sc_team_posts a {
23
+ font-size: 18px;
24
+ }
25
+
26
+ .smartcat_team_single_icons img {
27
+ width: 25px;
28
+ margin: 5px 5px 5px 5px
29
+ ;
30
+ display: inline-block !important;
31
+ }
32
+
33
+ .smartcat_team_single_icons img,
34
+ .smartcat_team_single_icons a {
35
+ box-shadow: none !important;
36
+ border: none !important;
37
  }
assets/css/team-view.css CHANGED
@@ -1,508 +1,508 @@
1
- /** #grid **/
2
-
3
- .grid#sc_our_team {
4
- overflow: hidden;
5
- width: 100%;
6
- }
7
-
8
- .grid#sc_our_team .sc_team_member {
9
- overflow: hidden;
10
- box-sizing: border-box;
11
- padding: 5px 5px 5px 5px;
12
-
13
- }
14
-
15
- .grid#sc_our_team .sc_team_member:hover .icons {
16
- bottom: 20px;
17
- }
18
-
19
- .grid#sc_our_team .sc_team_member:hover .sc_team_member_name,
20
- .grid#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
21
- left: -100%;
22
- }
23
-
24
- .grid#sc_our_team .sc_team_member .wp-post-image {
25
- transition: 0.45s all ease-in-out;
26
- -moz-transition: 0.45s all ease-in-out;
27
- -webkit-transition: 0.45s all ease-in-out;
28
- }
29
-
30
- .grid#sc_our_team .sc_team_member .wp-post-image.zoomIn {
31
- transform: scale(1.1);
32
- -moz-transform: scale(1.1);
33
- -webkit-transform: scale(1.1);
34
- }
35
-
36
- .grid#sc_our_team .sc_team_member .icons {
37
- z-index: 9;
38
- position: absolute;
39
- bottom: -100px;
40
- display: block;
41
- width: 100%;
42
- text-align: center;
43
- transition: 0.45s all ease-in-out;
44
- -moz-transition: 0.45s all ease-in-out;
45
- -webkit-transition: 0.45s all ease-in-out;
46
- }
47
-
48
- .grid#sc_our_team .sc_team_member .icons.hidden {
49
- display: none;
50
- }
51
-
52
- .grid#sc_our_team .sc_team_member .sc_team_content {
53
- display: none;
54
- }
55
-
56
- .grid#sc_our_team .sc_team_member .icons img {
57
- width: 25px;
58
- }
59
-
60
- .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle,
61
- .grid#sc_our_team .sc_team_member .sc_team_member_name {
62
- height: 24px;
63
- line-height: 26px;
64
- }
65
-
66
- .grid#sc_our_team .sc_team_member img.wp-post-image {
67
- width: 100%;
68
- height: auto !important;
69
- max-width: inherit;
70
- display: block;
71
- margin: 0 auto 0 auto;
72
- float: none;
73
- border: none;
74
- padding: 0 0 0 0;
75
- }
76
-
77
- .grid#sc_our_team .sc_team_member .sc_team_member_name {
78
- padding: 0 30px 0 30px;
79
- position: absolute;
80
- left: 0;
81
- bottom: 40px;
82
- transition: 0.45s all ease-in-out;
83
- -moz-transition: 0.45s all ease-in-out;
84
- -webkit-transition: 0.45s all ease-in-out;
85
- overflow: hidden;
86
- opacity: 0.9;
87
- color: #fff;
88
- }
89
-
90
- .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle {
91
- position: absolute;
92
- bottom: 16px;
93
- left: 0;
94
- padding: 0 30px 0 30px;
95
- color: #fff;
96
- transition: 0.35s all ease-in-out;
97
- -moz-transition: 0.35s all ease-in-out;
98
- -webkit-transition: 0.35s all ease-in-out;
99
- opacity: 0.9;
100
- }
101
-
102
- .grid#sc_our_team .sc_team_member_inner {
103
- height: 170px;
104
- overflow: hidden;
105
- background-size: cover;
106
- position: relative;
107
- text-align: center;
108
- background: #404040;
109
- }
110
-
111
- .grid#sc_our_team .sc_team_member .sc_team_member_overlay {
112
- position: absolute;
113
- width: 100%;
114
- height: 100%;
115
- left: 0;
116
- bottom: 0;
117
- padding: 0 10px;
118
- color: #fff;
119
- background: rgba(50, 50, 50, 0.5);
120
- display: none;
121
- }
122
-
123
- .grid#sc_our_team .sc_team_member .sc_team_more {
124
- position: absolute;
125
- margin: -25px 0 0 0;
126
- width: 100%;
127
- transition: 0.45s all ease-in-out;
128
- -moz-transition: 0.45s all ease-in-out;
129
- -webkit-transition: 0.45s all ease-in-out;
130
- top: -25px;
131
- }
132
-
133
- .grid#sc_our_team .sc_team_member .sc_team_more.show {
134
- top: 50%;
135
- transform: rotate(360deg);
136
- -moz-transform: rotate(360deg);
137
- -webkit-transform: rotate(360deg);
138
- }
139
-
140
- .grid#sc_our_team .sc_team_member .sc_team_member_name a {
141
- color: #fff;
142
- }
143
-
144
- @media(min-width: 768px) {
145
-
146
- .grid#sc_our_team .sc_team_member {
147
- float: left;
148
- }
149
-
150
- }
151
-
152
- @media(min-width: 767px) and (max-width: 980px) {
153
-
154
- #sc_our_team.grid.sc-col4 .sc_team_member,
155
- #sc_our_team.grid.sc-col3 .sc_team_member,
156
- #sc_our_team.grid.sc-col2 .sc_team_member,
157
- #sc_our_team.grid.sc-col5 .sc_team_member {
158
- width: 45%;
159
- margin: 0 4% 15px 0;
160
- }
161
-
162
- }
163
-
164
- @media(max-width: 767px) {
165
-
166
- #sc_our_team.grid.sc-col4 .sc_team_member,
167
- #sc_our_team.grid.sc-col3 .sc_team_member,
168
- #sc_our_team.grid.sc-col2 .sc_team_member,
169
- #sc_our_team.grid.sc-col5 .sc_team_member {
170
- width: 100%;
171
- margin: 0 0 0 0;
172
- }
173
-
174
- }
175
-
176
-
177
- /** #grid-circles **/
178
-
179
- .grid_circles#sc_our_team .sc_team_member:hover .sc_team_member_name,
180
- .grid_circles#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
181
- left: -100%;
182
- }
183
-
184
- .grid_circles#sc_our_team .sc_team_member .icons {
185
- opacity: 0;
186
- position: absolute;
187
- text-align: center;
188
- transition: 0.45s all ease-in-out;
189
- -moz-transition: 0.45s all ease-in-out;
190
- -webkit-transition: 0.45s all ease-in-out;
191
- bottom: 20%;
192
- margin: 0 auto 0 auto;
193
- display: block;
194
- width: 100%;
195
- z-index: 9;
196
- }
197
-
198
- .grid_circles#sc_our_team .sc_team_member .icons.hidden {
199
- display: none;
200
- }
201
-
202
- .grid_circles#sc_our_team .sc_team_member .sc_team_content {
203
- display: none;
204
- }
205
-
206
- .grid_circles#sc_our_team .sc_team_member:hover .icons {
207
- opacity: 1;
208
- }
209
-
210
- .grid_circles#sc_our_team .sc_team_member .icons img {
211
- width: 25px;
212
- }
213
-
214
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle,
215
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
216
- height: 24px;
217
- line-height: 26px;
218
- }
219
-
220
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
221
- position: absolute;
222
- top: 40%;
223
- left: 0;
224
- margin: 0 auto 0 auto;
225
- width: 70%;
226
- display: block;
227
- transition: 0.45s all ease-in-out;
228
- -moz-transition: 0.45s all ease-in-out;
229
- -webkit-transition: 0.45s all ease-in-out;
230
- opacity: 0.9;
231
- }
232
-
233
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle {
234
- position: absolute;
235
- top: 40%;
236
- left: 0;
237
- margin: 24px auto 24px auto;
238
- width: 75%;
239
- display: block;
240
- color: #fff;
241
- transition: 0.30s all ease-in-out;
242
- -moz-transition: 0.30s all ease-in-out;
243
- -webkit-transition: 0.30s all ease-in-out;
244
- opacity: 0.9;
245
- }
246
-
247
- #sc_our_team.grid_circles .sc_team_member {
248
- margin: 10px auto 10px auto;
249
- }
250
-
251
- .grid_circles#sc_our_team .sc_team_member .sc_team_more {
252
- position: absolute;
253
- margin: -25px 0 0 0;
254
- width: 100%;
255
- transition: 0.45s all ease-in-out;
256
- -moz-transition: 0.45s all ease-in-out;
257
- -webkit-transition: 0.45s all ease-in-out;
258
- top: -25px;
259
- }
260
-
261
- .grid_circles#sc_our_team .sc_team_member .sc_team_more.show {
262
- top: 50%;
263
- transform: rotate(360deg);
264
- -moz-transform: rotate(360deg);
265
- -webkit-transform: rotate(360deg);
266
- }
267
-
268
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
269
- color: #fff;
270
- }
271
-
272
- .grid_circles#sc_our_team .sc_team_member {
273
- float: left;
274
- overflow: hidden;
275
- border-radius: 100%;
276
- text-align: center;
277
- box-shadow: 0 0 0 4px #fff, 0 0 0 7px #E2E2E2;
278
- position: relative;
279
- }
280
-
281
- .grid_circles#sc_our_team .sc_team_member .wp-post-image {
282
- border: none;
283
- padding: 0 0 0 0;
284
- float: none;
285
- margin: 0 0 0 0;
286
- width: 100%;
287
- height: 100%;
288
- max-width: inherit;
289
- }
290
-
291
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay {
292
- position: absolute;
293
- width: 100%;
294
- left: 0;
295
- top: 0;
296
- height: 100%;
297
- background: rgba(50,50,50,0.7);
298
- color: #fff;
299
- display: none;
300
- border-radius: 100%;
301
- }
302
-
303
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name {
304
- margin: 30px 0 0 0;
305
- font-size: 18px;
306
- }
307
-
308
- .grid_circles#sc_our_team .icons img {
309
- width: 25px;
310
- }
311
-
312
- @media(min-width: 768px){
313
-
314
- #sc_our_team.grid_circles.sc-col3 .sc_team_member {
315
- width: 31%;
316
- margin: 1% 1% 1% 1%;
317
- }
318
-
319
- #sc_our_team.grid_circles.sc-col4 .sc_team_member {
320
- width: 23%;
321
- margin: 1% 1% 1% 1%;
322
- }
323
-
324
- #sc_our_team.grid_circles.sc-col2 .sc_team_member {
325
- width: 48%;
326
- margin: 1% 1% 1% 1%;
327
- }
328
-
329
- }
330
-
331
- @media(min-width: 767px) and (max-width: 980px) {
332
-
333
- #sc_our_team.grid_circles.sc-col4 .sc_team_member,
334
- #sc_our_team.grid_circles.sc-col3 .sc_team_member,
335
- #sc_our_team.grid_circles.sc-col2 .sc_team_member,
336
- #sc_our_team.grid_circles.sc-col5 .sc_team_member {
337
- width: 45%;
338
- margin: 0 4% 15px 0;
339
- }
340
-
341
- }
342
-
343
- @media( max-width : 767px ) {
344
-
345
- #sc_our_team.grid_circles.sc-col4 .sc_team_member,
346
- #sc_our_team.grid_circles.sc-col3 .sc_team_member,
347
- #sc_our_team.grid_circles.sc-col2 .sc_team_member,
348
- #sc_our_team.grid_circles.sc-col5 .sc_team_member {
349
- width: 100%;
350
- }
351
-
352
- }
353
-
354
- /** #grid-circles-2 **/
355
-
356
- .grid_circles2#sc_our_team .sc_team_member .icons {
357
- opacity: 0;
358
- position: absolute;
359
- text-align: center;
360
- transition: 0.45s all ease-in-out;
361
- -moz-transition: 0.45s all ease-in-out;
362
- -webkit-transition: 0.45s all ease-in-out;
363
- bottom: 20%;
364
- margin: 0 auto 0 auto;
365
- display: block;
366
- width: 100%;
367
- z-index: 9;
368
- }
369
-
370
- .grid_circles2#sc_our_team .sc_team_member .icons.hidden {
371
- display: none;
372
- }
373
-
374
- .grid_circles2#sc_our_team .sc_team_member .sc_team_content {
375
- display: none;
376
- }
377
-
378
- .grid_circles2#sc_our_team .sc_team_member:hover .icons {
379
- opacity: 1;
380
- }
381
-
382
- .grid_circles2#sc_our_team .sc_team_member .icons img {
383
- width: 25px;
384
- }
385
-
386
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name {
387
- margin: 0 auto 0 auto;
388
- text-align: center;
389
- }
390
-
391
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name a {
392
- border: none;
393
- box-shadow: none;
394
- color: #fff;
395
- }
396
-
397
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle {
398
- margin: 24px auto 24px auto;
399
- }
400
-
401
- .grid_circles2#sc_our_team .sc_team_member:hover .sc_team_member_name,
402
- .grid_circles2#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
403
- opacity: 1;
404
- }
405
-
406
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name,
407
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle {
408
- position: absolute;
409
- top: 40%;
410
- left: 0;
411
- transition: 0.45s all ease-in-out;
412
- -moz-transition: 0.45s all ease-in-out;
413
- -webkit-transition: 0.45s all ease-in-out;
414
- z-index: 99;
415
- width: 100%;
416
- text-align: center;
417
- color: #fff;
418
- opacity: 0;
419
- }
420
-
421
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle span {
422
- display: inline-block;
423
- padding: 5px 0 0 0;
424
- }
425
-
426
- .grid_circles2#sc_our_team .sc_team_member {
427
- float: left;
428
- overflow: hidden;
429
- border-radius: 100%;
430
- text-align: center;
431
- box-shadow: 0 0 0 4px #fff, 0 0 0 7px #E2E2E2;
432
- position: relative;
433
- }
434
-
435
- .grid_circles2#sc_our_team .sc_team_member .wp-post-image {
436
- border: none;
437
- padding: 0;
438
- float: none;
439
- margin: 0;
440
- width: 100%;
441
- height: 100%;
442
- max-width: inherit;
443
- }
444
-
445
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_overlay {
446
- position: absolute;
447
- width: 100%;
448
- left: 0;
449
- top: 0;
450
- height: 100%;
451
- background: rgba(50, 50, 50, 0.7);
452
- color: #ffffff;
453
- display: none;
454
- border-radius: 100%;
455
- }
456
-
457
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name,
458
- .grid_circles2#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name {
459
- margin: 30px 0 0 0;
460
- font-size: 18px;
461
- }
462
-
463
- .grid_circles2#sc_our_team .icons img {
464
- width: 25px;
465
- }
466
-
467
- @media(min-width: 768px) {
468
-
469
- #sc_our_team.grid_circles2.sc-col3 .sc_team_member {
470
- width: 31%;
471
- margin: 1% 1% 1% 1%;
472
- }
473
-
474
- #sc_our_team.grid_circles2.sc-col4 .sc_team_member {
475
- width: 23%;
476
- margin: 1% 1% 1% 1%;
477
- }
478
-
479
- #sc_our_team.grid_circles2.sc-col2 .sc_team_member {
480
- width: 48%;
481
- margin: 1% 1% 1% 1%;
482
- }
483
-
484
- }
485
-
486
- @media(min-width: 767px) and (max-width: 980px) {
487
-
488
- #sc_our_team.grid_circles2.sc-col4 .sc_team_member,
489
- #sc_our_team.grid_circles2.sc-col3 .sc_team_member,
490
- #sc_our_team.grid_circles2.sc-col2 .sc_team_member,
491
- #sc_our_team.grid_circles2.sc-col5 .sc_team_member {
492
- width: 45%;
493
- margin: 0 4% 15px 0;
494
- }
495
-
496
- }
497
-
498
- @media(max-width : 767px) {
499
-
500
- #sc_our_team.grid_circles2.sc-col4 .sc_team_member,
501
- #sc_our_team.grid_circles2.sc-col3 .sc_team_member,
502
- #sc_our_team.grid_circles2.sc-col2 .sc_team_member,
503
- #sc_our_team.grid_circles2.sc-col5 .sc_team_member {
504
- width: 100%;
505
- margin: 10px 0 10px 0;
506
- }
507
-
508
- }
1
+ /** #grid **/
2
+
3
+ .grid#sc_our_team {
4
+ overflow: hidden;
5
+ width: 100%;
6
+ }
7
+
8
+ .grid#sc_our_team .sc_team_member {
9
+ overflow: hidden;
10
+ box-sizing: border-box;
11
+ padding: 5px 5px 5px 5px;
12
+
13
+ }
14
+
15
+ .grid#sc_our_team .sc_team_member:hover .icons {
16
+ bottom: 20px;
17
+ }
18
+
19
+ .grid#sc_our_team .sc_team_member:hover .sc_team_member_name,
20
+ .grid#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
21
+ left: -100%;
22
+ }
23
+
24
+ .grid#sc_our_team .sc_team_member .wp-post-image {
25
+ transition: 0.45s all ease-in-out;
26
+ -moz-transition: 0.45s all ease-in-out;
27
+ -webkit-transition: 0.45s all ease-in-out;
28
+ }
29
+
30
+ .grid#sc_our_team .sc_team_member .wp-post-image.zoomIn {
31
+ transform: scale(1.1);
32
+ -moz-transform: scale(1.1);
33
+ -webkit-transform: scale(1.1);
34
+ }
35
+
36
+ .grid#sc_our_team .sc_team_member .icons {
37
+ z-index: 9;
38
+ position: absolute;
39
+ bottom: -100px;
40
+ display: block;
41
+ width: 100%;
42
+ text-align: center;
43
+ transition: 0.45s all ease-in-out;
44
+ -moz-transition: 0.45s all ease-in-out;
45
+ -webkit-transition: 0.45s all ease-in-out;
46
+ }
47
+
48
+ .grid#sc_our_team .sc_team_member .icons.hidden {
49
+ display: none;
50
+ }
51
+
52
+ .grid#sc_our_team .sc_team_member .sc_team_content {
53
+ display: none;
54
+ }
55
+
56
+ .grid#sc_our_team .sc_team_member .icons img {
57
+ width: 25px;
58
+ }
59
+
60
+ .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle,
61
+ .grid#sc_our_team .sc_team_member .sc_team_member_name {
62
+ height: 24px;
63
+ line-height: 26px;
64
+ }
65
+
66
+ .grid#sc_our_team .sc_team_member img.wp-post-image {
67
+ width: 100%;
68
+ height: auto !important;
69
+ max-width: inherit;
70
+ display: block;
71
+ margin: 0 auto 0 auto;
72
+ float: none;
73
+ border: none;
74
+ padding: 0 0 0 0;
75
+ }
76
+
77
+ .grid#sc_our_team .sc_team_member .sc_team_member_name {
78
+ padding: 0 30px 0 30px;
79
+ position: absolute;
80
+ left: 0;
81
+ bottom: 40px;
82
+ transition: 0.45s all ease-in-out;
83
+ -moz-transition: 0.45s all ease-in-out;
84
+ -webkit-transition: 0.45s all ease-in-out;
85
+ overflow: hidden;
86
+ opacity: 0.9;
87
+ color: #fff;
88
+ }
89
+
90
+ .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle {
91
+ position: absolute;
92
+ bottom: 16px;
93
+ left: 0;
94
+ padding: 0 30px 0 30px;
95
+ color: #fff;
96
+ transition: 0.35s all ease-in-out;
97
+ -moz-transition: 0.35s all ease-in-out;
98
+ -webkit-transition: 0.35s all ease-in-out;
99
+ opacity: 0.9;
100
+ }
101
+
102
+ .grid#sc_our_team .sc_team_member_inner {
103
+ height: 170px;
104
+ overflow: hidden;
105
+ background-size: cover;
106
+ position: relative;
107
+ text-align: center;
108
+ background: #404040;
109
+ }
110
+
111
+ .grid#sc_our_team .sc_team_member .sc_team_member_overlay {
112
+ position: absolute;
113
+ width: 100%;
114
+ height: 100%;
115
+ left: 0;
116
+ bottom: 0;
117
+ padding: 0 10px;
118
+ color: #fff;
119
+ background: rgba(50, 50, 50, 0.5);
120
+ display: none;
121
+ }
122
+
123
+ .grid#sc_our_team .sc_team_member .sc_team_more {
124
+ position: absolute;
125
+ margin: -25px 0 0 0;
126
+ width: 100%;
127
+ transition: 0.45s all ease-in-out;
128
+ -moz-transition: 0.45s all ease-in-out;
129
+ -webkit-transition: 0.45s all ease-in-out;
130
+ top: -25px;
131
+ }
132
+
133
+ .grid#sc_our_team .sc_team_member .sc_team_more.show {
134
+ top: 50%;
135
+ transform: rotate(360deg);
136
+ -moz-transform: rotate(360deg);
137
+ -webkit-transform: rotate(360deg);
138
+ }
139
+
140
+ .grid#sc_our_team .sc_team_member .sc_team_member_name a {
141
+ color: #fff;
142
+ }
143
+
144
+ @media(min-width: 768px) {
145
+
146
+ .grid#sc_our_team .sc_team_member {
147
+ float: left;
148
+ }
149
+
150
+ }
151
+
152
+ @media(min-width: 767px) and (max-width: 980px) {
153
+
154
+ #sc_our_team.grid.sc-col4 .sc_team_member,
155
+ #sc_our_team.grid.sc-col3 .sc_team_member,
156
+ #sc_our_team.grid.sc-col2 .sc_team_member,
157
+ #sc_our_team.grid.sc-col5 .sc_team_member {
158
+ width: 45%;
159
+ margin: 0 4% 15px 0;
160
+ }
161
+
162
+ }
163
+
164
+ @media(max-width: 767px) {
165
+
166
+ #sc_our_team.grid.sc-col4 .sc_team_member,
167
+ #sc_our_team.grid.sc-col3 .sc_team_member,
168
+ #sc_our_team.grid.sc-col2 .sc_team_member,
169
+ #sc_our_team.grid.sc-col5 .sc_team_member {
170
+ width: 100%;
171
+ margin: 0 0 0 0;
172
+ }
173
+
174
+ }
175
+
176
+
177
+ /** #grid-circles **/
178
+
179
+ .grid_circles#sc_our_team .sc_team_member:hover .sc_team_member_name,
180
+ .grid_circles#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
181
+ left: -100%;
182
+ }
183
+
184
+ .grid_circles#sc_our_team .sc_team_member .icons {
185
+ opacity: 0;
186
+ position: absolute;
187
+ text-align: center;
188
+ transition: 0.45s all ease-in-out;
189
+ -moz-transition: 0.45s all ease-in-out;
190
+ -webkit-transition: 0.45s all ease-in-out;
191
+ bottom: 20%;
192
+ margin: 0 auto 0 auto;
193
+ display: block;
194
+ width: 100%;
195
+ z-index: 9;
196
+ }
197
+
198
+ .grid_circles#sc_our_team .sc_team_member .icons.hidden {
199
+ display: none;
200
+ }
201
+
202
+ .grid_circles#sc_our_team .sc_team_member .sc_team_content {
203
+ display: none;
204
+ }
205
+
206
+ .grid_circles#sc_our_team .sc_team_member:hover .icons {
207
+ opacity: 1;
208
+ }
209
+
210
+ .grid_circles#sc_our_team .sc_team_member .icons img {
211
+ width: 25px;
212
+ }
213
+
214
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle,
215
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
216
+ height: 24px;
217
+ line-height: 26px;
218
+ }
219
+
220
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
221
+ position: absolute;
222
+ top: 40%;
223
+ left: 0;
224
+ margin: 0 auto 0 auto;
225
+ width: 70%;
226
+ display: block;
227
+ transition: 0.45s all ease-in-out;
228
+ -moz-transition: 0.45s all ease-in-out;
229
+ -webkit-transition: 0.45s all ease-in-out;
230
+ opacity: 0.9;
231
+ }
232
+
233
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle {
234
+ position: absolute;
235
+ top: 40%;
236
+ left: 0;
237
+ margin: 24px auto 24px auto;
238
+ width: 75%;
239
+ display: block;
240
+ color: #fff;
241
+ transition: 0.30s all ease-in-out;
242
+ -moz-transition: 0.30s all ease-in-out;
243
+ -webkit-transition: 0.30s all ease-in-out;
244
+ opacity: 0.9;
245
+ }
246
+
247
+ #sc_our_team.grid_circles .sc_team_member {
248
+ margin: 10px auto 10px auto;
249
+ }
250
+
251
+ .grid_circles#sc_our_team .sc_team_member .sc_team_more {
252
+ position: absolute;
253
+ margin: -25px 0 0 0;
254
+ width: 100%;
255
+ transition: 0.45s all ease-in-out;
256
+ -moz-transition: 0.45s all ease-in-out;
257
+ -webkit-transition: 0.45s all ease-in-out;
258
+ top: -25px;
259
+ }
260
+
261
+ .grid_circles#sc_our_team .sc_team_member .sc_team_more.show {
262
+ top: 50%;
263
+ transform: rotate(360deg);
264
+ -moz-transform: rotate(360deg);
265
+ -webkit-transform: rotate(360deg);
266
+ }
267
+
268
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
269
+ color: #fff;
270
+ }
271
+
272
+ .grid_circles#sc_our_team .sc_team_member {
273
+ float: left;
274
+ overflow: hidden;
275
+ border-radius: 100%;
276
+ text-align: center;
277
+ box-shadow: 0 0 0 4px #fff, 0 0 0 7px #E2E2E2;
278
+ position: relative;
279
+ }
280
+
281
+ .grid_circles#sc_our_team .sc_team_member .wp-post-image {
282
+ border: none;
283
+ padding: 0 0 0 0;
284
+ float: none;
285
+ margin: 0 0 0 0;
286
+ width: 100%;
287
+ height: 100%;
288
+ max-width: inherit;
289
+ }
290
+
291
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay {
292
+ position: absolute;
293
+ width: 100%;
294
+ left: 0;
295
+ top: 0;
296
+ height: 100%;
297
+ background: rgba(50,50,50,0.7);
298
+ color: #fff;
299
+ display: none;
300
+ border-radius: 100%;
301
+ }
302
+
303
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name {
304
+ margin: 30px 0 0 0;
305
+ font-size: 18px;
306
+ }
307
+
308
+ .grid_circles#sc_our_team .icons img {
309
+ width: 25px;
310
+ }
311
+
312
+ @media(min-width: 768px){
313
+
314
+ #sc_our_team.grid_circles.sc-col3 .sc_team_member {
315
+ width: 31%;
316
+ margin: 1% 1% 1% 1%;
317
+ }
318
+
319
+ #sc_our_team.grid_circles.sc-col4 .sc_team_member {
320
+ width: 23%;
321
+ margin: 1% 1% 1% 1%;
322
+ }
323
+
324
+ #sc_our_team.grid_circles.sc-col2 .sc_team_member {
325
+ width: 48%;
326
+ margin: 1% 1% 1% 1%;
327
+ }
328
+
329
+ }
330
+
331
+ @media(min-width: 767px) and (max-width: 980px) {
332
+
333
+ #sc_our_team.grid_circles.sc-col4 .sc_team_member,
334
+ #sc_our_team.grid_circles.sc-col3 .sc_team_member,
335
+ #sc_our_team.grid_circles.sc-col2 .sc_team_member,
336
+ #sc_our_team.grid_circles.sc-col5 .sc_team_member {
337
+ width: 45%;
338
+ margin: 0 4% 15px 0;
339
+ }
340
+
341
+ }
342
+
343
+ @media( max-width : 767px ) {
344
+
345
+ #sc_our_team.grid_circles.sc-col4 .sc_team_member,
346
+ #sc_our_team.grid_circles.sc-col3 .sc_team_member,
347
+ #sc_our_team.grid_circles.sc-col2 .sc_team_member,
348
+ #sc_our_team.grid_circles.sc-col5 .sc_team_member {
349
+ width: 100%;
350
+ }
351
+
352
+ }
353
+
354
+ /** #grid-circles-2 **/
355
+
356
+ .grid_circles2#sc_our_team .sc_team_member .icons {
357
+ opacity: 0;
358
+ position: absolute;
359
+ text-align: center;
360
+ transition: 0.45s all ease-in-out;
361
+ -moz-transition: 0.45s all ease-in-out;
362
+ -webkit-transition: 0.45s all ease-in-out;
363
+ bottom: 20%;
364
+ margin: 0 auto 0 auto;
365
+ display: block;
366
+ width: 100%;
367
+ z-index: 9;
368
+ }
369
+
370
+ .grid_circles2#sc_our_team .sc_team_member .icons.hidden {
371
+ display: none;
372
+ }
373
+
374
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_content {
375
+ display: none;
376
+ }
377
+
378
+ .grid_circles2#sc_our_team .sc_team_member:hover .icons {
379
+ opacity: 1;
380
+ }
381
+
382
+ .grid_circles2#sc_our_team .sc_team_member .icons img {
383
+ width: 25px;
384
+ }
385
+
386
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name {
387
+ margin: 0 auto 0 auto;
388
+ text-align: center;
389
+ }
390
+
391
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name a {
392
+ border: none;
393
+ box-shadow: none;
394
+ color: #fff;
395
+ }
396
+
397
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle {
398
+ margin: 24px auto 24px auto;
399
+ }
400
+
401
+ .grid_circles2#sc_our_team .sc_team_member:hover .sc_team_member_name,
402
+ .grid_circles2#sc_our_team .sc_team_member:hover .sc_team_member_jobtitle {
403
+ opacity: 1;
404
+ }
405
+
406
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_name,
407
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle {
408
+ position: absolute;
409
+ top: 40%;
410
+ left: 0;
411
+ transition: 0.45s all ease-in-out;
412
+ -moz-transition: 0.45s all ease-in-out;
413
+ -webkit-transition: 0.45s all ease-in-out;
414
+ z-index: 99;
415
+ width: 100%;
416
+ text-align: center;
417
+ color: #fff;
418
+ opacity: 0;
419
+ }
420
+
421
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_jobtitle span {
422
+ display: inline-block;
423
+ padding: 5px 0 0 0;
424
+ }
425
+
426
+ .grid_circles2#sc_our_team .sc_team_member {
427
+ float: left;
428
+ overflow: hidden;
429
+ border-radius: 100%;
430
+ text-align: center;
431
+ box-shadow: 0 0 0 4px #fff, 0 0 0 7px #E2E2E2;
432
+ position: relative;
433
+ }
434
+
435
+ .grid_circles2#sc_our_team .sc_team_member .wp-post-image {
436
+ border: none;
437
+ padding: 0;
438
+ float: none;
439
+ margin: 0;
440
+ width: 100%;
441
+ height: 100%;
442
+ max-width: inherit;
443
+ }
444
+
445
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_overlay {
446
+ position: absolute;
447
+ width: 100%;
448
+ left: 0;
449
+ top: 0;
450
+ height: 100%;
451
+ background: rgba(50, 50, 50, 0.7);
452
+ color: #ffffff;
453
+ display: none;
454
+ border-radius: 100%;
455
+ }
456
+
457
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name,
458
+ .grid_circles2#sc_our_team .sc_team_member .sc_team_member_overlay .sc_team_member_name {
459
+ margin: 30px 0 0 0;
460
+ font-size: 18px;
461
+ }
462
+
463
+ .grid_circles2#sc_our_team .icons img {
464
+ width: 25px;
465
+ }
466
+
467
+ @media(min-width: 768px) {
468
+
469
+ #sc_our_team.grid_circles2.sc-col3 .sc_team_member {
470
+ width: 31%;
471
+ margin: 1% 1% 1% 1%;
472
+ }
473
+
474
+ #sc_our_team.grid_circles2.sc-col4 .sc_team_member {
475
+ width: 23%;
476
+ margin: 1% 1% 1% 1%;
477
+ }
478
+
479
+ #sc_our_team.grid_circles2.sc-col2 .sc_team_member {
480
+ width: 48%;
481
+ margin: 1% 1% 1% 1%;
482
+ }
483
+
484
+ }
485
+
486
+ @media(min-width: 767px) and (max-width: 980px) {
487
+
488
+ #sc_our_team.grid_circles2.sc-col4 .sc_team_member,
489
+ #sc_our_team.grid_circles2.sc-col3 .sc_team_member,
490
+ #sc_our_team.grid_circles2.sc-col2 .sc_team_member,
491
+ #sc_our_team.grid_circles2.sc-col5 .sc_team_member {
492
+ width: 45%;
493
+ margin: 0 4% 15px 0;
494
+ }
495
+
496
+ }
497
+
498
+ @media(max-width : 767px) {
499
+
500
+ #sc_our_team.grid_circles2.sc-col4 .sc_team_member,
501
+ #sc_our_team.grid_circles2.sc-col3 .sc_team_member,
502
+ #sc_our_team.grid_circles2.sc-col2 .sc_team_member,
503
+ #sc_our_team.grid_circles2.sc-col5 .sc_team_member {
504
+ width: 100%;
505
+ margin: 10px 0 10px 0;
506
+ }
507
+
508
+ }
assets/css/widgets.css CHANGED
@@ -1,25 +1,25 @@
1
- .widget#sc_our_team .sc_sidebar_team_member {
2
- width: 100%;
3
- overflow: hidden;
4
- margin: 0 0 10px 0;
5
- }
6
-
7
- .widget#sc_our_team .sc_sidebar_team_member .wp-post-image {
8
- float: left;
9
- width: 25%;
10
- border: 1px solid #d0d0d0;
11
- padding: 3px 3px 3px 3px;
12
- box-sizing: border-box;
13
- margin: 0 0 0 0;
14
- }
15
-
16
- .widget#sc_our_team .sc_sidebar_team_member .sc_team_member_overlay {
17
- float: left;
18
- width: 75%;
19
- padding: 0 0 0 10px;
20
- box-sizing: border-box;
21
- }
22
-
23
- .widget#sc_our_team .sc_sidebar_team_member .sc_team_member_overlay .sc_team_member_name {
24
- font-weight: bold;
25
- }
1
+ .widget#sc_our_team .sc_sidebar_team_member {
2
+ width: 100%;
3
+ overflow: hidden;
4
+ margin: 0 0 10px 0;
5
+ }
6
+
7
+ .widget#sc_our_team .sc_sidebar_team_member .wp-post-image {
8
+ float: left;
9
+ width: 25%;
10
+ border: 1px solid #d0d0d0;
11
+ padding: 3px 3px 3px 3px;
12
+ box-sizing: border-box;
13
+ margin: 0 0 0 0;
14
+ }
15
+
16
+ .widget#sc_our_team .sc_sidebar_team_member .sc_team_member_overlay {
17
+ float: left;
18
+ width: 75%;
19
+ padding: 0 0 0 10px;
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ .widget#sc_our_team .sc_sidebar_team_member .sc_team_member_overlay .sc_team_member_name {
24
+ font-weight: bold;
25
+ }
assets/data/demo.csv ADDED
@@ -0,0 +1,2 @@
 
 
1
+ name,title,bio,photo_url,email,phone,facebook,twitter,linkedin,instagram,pinterest,gplus,website,other_icon,other,article_bool,article_title,article1,article2,article3,skill_bool,skill_title,skill1,skill_value1,skill2,skill_value2,skill3,skill_value3,skill4,skill_value4,skill5,skill_value5,tags_bool,tags_title,tags,quote
2
+ John Smith,Software Developer,This is my bio,https://raw.githubusercontent.com/smartcatdev/docs/master/ots/bilal-hassan.jpg,bilal@smartcat.ca,8001234567,http://facebook.com,http://twitter,http://linkedin.com,http://instagram.com,http://pinterest.com,http://google.com,https://smartcatdesign.net,vimeo,http://vimeo.com,on,My favorite posts,3109,2374,2359,on,Skills,PHP,10,JavaScript,9,React,9,WordPress,10,CSS,9,on,Hobbies,"Basketball,Swimming,Music","Under promise, over deliver"
assets/fonts/fonts.css CHANGED
@@ -1,27 +1,27 @@
1
- /* oswald-regular - latin */
2
- @font-face {
3
- font-family: 'Oswald';
4
- font-style: normal;
5
- font-weight: 400;
6
- src: url('./oswald/oswald-regular.eot'); /* IE9 Compat Modes */
7
- src: local('Oswald Regular'), local('Oswald-Regular'),
8
- url('./oswald/oswald-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
9
- url('./oswald/oswald-regular.woff2') format('woff2'), /* Super Modern Browsers */
10
- url('./oswald/oswald-regular.woff') format('woff'), /* Modern Browsers */
11
- url('./oswald/oswald-regular.ttf') format('truetype'), /* Safari, Android, iOS */
12
- url('./oswald/oswald-regular.svg#Oswald') format('svg'); /* Legacy iOS */
13
- }
14
-
15
- /* lato-regular - latin */
16
- @font-face {
17
- font-family: 'Lato';
18
- font-style: normal;
19
- font-weight: 400;
20
- src: url('./lato/lato-regular.eot'); /* IE9 Compat Modes */
21
- src: local('Lato Regular'), local('Lato-Regular'),
22
- url('./lato/lato-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
23
- url('./lato/lato-regular.woff2') format('woff2'), /* Super Modern Browsers */
24
- url('./lato/lato-regular.woff') format('woff'), /* Modern Browsers */
25
- url('./lato/lato-regular.ttf') format('truetype'), /* Safari, Android, iOS */
26
- url('./lato/lato-regular.svg#Lato') format('svg'); /* Legacy iOS */
27
- }
1
+ /* oswald-regular - latin */
2
+ @font-face {
3
+ font-family: 'Oswald';
4
+ font-style: normal;
5
+ font-weight: 400;
6
+ src: url('./oswald/oswald-regular.eot'); /* IE9 Compat Modes */
7
+ src: local('Oswald Regular'), local('Oswald-Regular'),
8
+ url('./oswald/oswald-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
9
+ url('./oswald/oswald-regular.woff2') format('woff2'), /* Super Modern Browsers */
10
+ url('./oswald/oswald-regular.woff') format('woff'), /* Modern Browsers */
11
+ url('./oswald/oswald-regular.ttf') format('truetype'), /* Safari, Android, iOS */
12
+ url('./oswald/oswald-regular.svg#Oswald') format('svg'); /* Legacy iOS */
13
+ }
14
+
15
+ /* lato-regular - latin */
16
+ @font-face {
17
+ font-family: 'Lato';
18
+ font-style: normal;
19
+ font-weight: 400;
20
+ src: url('./lato/lato-regular.eot'); /* IE9 Compat Modes */
21
+ src: local('Lato Regular'), local('Lato-Regular'),
22
+ url('./lato/lato-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
23
+ url('./lato/lato-regular.woff2') format('woff2'), /* Super Modern Browsers */
24
+ url('./lato/lato-regular.woff') format('woff'), /* Modern Browsers */
25
+ url('./lato/lato-regular.ttf') format('truetype'), /* Safari, Android, iOS */
26
+ url('./lato/lato-regular.svg#Lato') format('svg'); /* Legacy iOS */
27
+ }
assets/fonts/lato/lato-regular.svg CHANGED
@@ -1,435 +1,435 @@
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 xmlns="http://www.w3.org/2000/svg">
4
- <defs >
5
- <font id="Lato" horiz-adv-x="1042" ><font-face
6
- font-family="Lato"
7
- units-per-em="2000"
8
- panose-1="2 15 5 2 2 2 4 3 2 3"
9
- ascent="1974"
10
- descent="-426"
11
- alphabetic="0" />
12
- <glyph unicode=" " glyph-name="space" horiz-adv-x="386" />
13
- <glyph unicode="!" glyph-name="exclam" horiz-adv-x="686" d="M430 1433V861Q430 816 429 773T424 687T417 598T406 500H285Q279 552 275 597T267 686T263 773T261 861V1433H430ZM218 110Q218 136 227 159T253 199T293 226T342 236Q368 236 391 226T431 199T457
14
- 159T467 110Q467 83 458 61T431 21T391 -5T342 -15Q316 -15 293 -6T254 21T228 60T218 110Z" />
15
- <glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="794" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307ZM640 1433V1143L624 988Q621 956 607 939T562 921Q536 921 522 938T501 988L485 1143V1433H640Z" />
16
- <glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1160" d="M790 423L706 0H625Q602 0 586 17T570 61Q570 65 570 68T572 77L643 423H396L325 68Q317 31 295 16T243 0H164L249 423H103Q80 423 67 434T54 474Q54 479 54 485T56 497L64 554H268L333 880H101L114
17
- 954Q119 983 137 997T194 1011H352L424 1369Q430 1399 451 1416T503 1433H583L499 1011H746L830 1433H909Q934 1433 950 1418T967 1379Q967 1371 966 1366L893 1011H1105L1092 936Q1087 907 1069 894T1012 880H874L809 554H988Q1012 554 1025 543T1038 502Q1038
18
- 497 1038 492T1036 480L1027 423H790ZM415 554H662L727 880H480L415 554Z" />
19
- <glyph unicode="$" glyph-name="dollar" horiz-adv-x="1160" d="M498 -12Q377 -1 278 47T106 171L159 253Q166 264 179 271T206 278Q225 278 249 259T308 216T391 168T508 137L545 668Q475 689 408 715T287 784T201 891T168 1053Q168 1126 196 1195T279 1319T414
20
- 1407T598 1446L608 1590Q610 1609 623 1624T658 1639H724L710 1441Q815 1428 891 1387T1027 1288L984 1222Q964 1192 938 1192Q924 1192 904 1204T854 1233T787 1266T700 1290L667 806Q739 784 809 758T935 691T1025 589T1060 435Q1060 345 1030 266T943 127T802
21
- 30T611 -14L599 -190Q597 -209 584 -223T549 -238H483L498 -12ZM891 407Q891 457 873 493T822 555T747 600T655 635L621 137Q686 143 736 165T821 223T873 304T891 407ZM336 1071Q336 1023 353 988T400 925T470 878T557 842L587 1293Q522 1287 475 1267T397 1217T351
22
- 1150T336 1071Z" />
23
- <glyph unicode="%" glyph-name="percent" horiz-adv-x="1572" d="M707 1087Q707 1003 681 937T612 825T510 755T389 731Q321 731 264 755T163 824T96 936T72 1087Q72 1173 96 1240T163 1353T263 1423T389 1447Q456 1447 514 1423T615 1353T682 1240T707 1087ZM568
24
- 1087Q568 1153 554 1199T516 1274T459 1317T389 1330Q352 1330 320 1317T263 1275T226 1199T212 1087Q212 1022 225 977T263 903T319 862T389 849Q426 849 458 861T515 902T554 976T568 1087ZM1208 1397Q1221 1414 1235 1423T1274 1433H1402L355 29Q345 16 331
25
- 8T298 0H166L1208 1397ZM1499 338Q1499 254 1473 188T1404 77T1303 7T1182 -17Q1114 -17 1057 7T956 76T889 188T865 338Q865 424 889 491T956 605T1056 675T1182 699Q1249 699 1307 675T1408 605T1475 492T1499 338ZM1361 338Q1361 404 1347 450T1309 526T1252
26
- 568T1182 581Q1145 581 1113 568T1056 526T1019 451T1005 338Q1005 273 1018 228T1056 155T1112 114T1182 101Q1219 101 1251 113T1308 154T1347 228T1361 338Z" />
27
- <glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="1406" d="M660 1449Q739 1449 804 1424T916 1356T991 1259T1023 1143L912 1121Q907 1120 903 1120Q890 1120 879 1127T862 1152Q855 1178 840 1206T800 1257T741 1295T660 1310Q610 1310 570 1294T502
28
- 1250T458 1183T442 1099Q442 1064 450 1032T476 968T520 901T585 828L997 409Q1035 476 1057 549T1088 697Q1090 716 1100 727T1128 738H1238Q1236 623 1201 512T1100 304L1400 0H1228Q1199 0 1181 7T1141 36L997 181Q903 90 781 37T511 -16Q431 -16 354 11T217
29
- 89T119 215T82 382Q82 452 105 514T170 630T269 725T394 797Q333 874 304 947T275 1098Q275 1171 301 1235T378 1346T499 1421T660 1449ZM263 396Q263 331 287 282T350 198T439 147T541 129Q653 129 742 170T899 279L476 706Q370 649 317 570T263 396Z" />
30
- <glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="460" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307Z" />
31
- <glyph unicode="(" glyph-name="parenleft" horiz-adv-x="600" d="M289 629Q289 415 344 214T503 -171Q509 -182 511 -190T513 -206Q513 -220 506 -229T488 -245L409 -293Q334 -178 282 -65T197 162T149 391T134 629Q134 750 149 866T196 1095T281 1322T409 1551L488
32
- 1502Q499 1495 506 1486T513 1463Q513 1448 503 1429Q398 1247 344 1045T289 629Z" />
33
- <glyph unicode=")" glyph-name="parenright" horiz-adv-x="600" d="M298 629Q298 843 244 1045T84 1429Q74 1448 74 1463Q74 1477 81 1486T99 1502L178 1551Q253 1435 305 1322T390 1096T438 866T453 629Q453 507 438 392T391 162T306 -65T178 -293L99 -245Q88
34
- -238 81 -229T74 -206Q74 -198 76 -190T84 -171Q188 12 243 213T298 629Z" />
35
- <glyph unicode="*" glyph-name="asterisk" horiz-adv-x="800" d="M354 863V1060Q354 1079 356 1096T366 1129Q346 1104 313 1084L141 985L97 1060L269 1160Q305 1181 342 1184Q322 1186 305 1191T269 1209L96 1310L140 1385L313 1285Q348 1265 370 1233Q361 1251
36
- 358 1269T354 1308V1506H442V1309Q442 1268 428 1237Q439 1252 452 1263T483 1285L655 1384L699 1309L527 1209Q510 1198 494 1192T459 1184Q477 1182 493 1177T527 1160L700 1059L656 984L483 1084Q465 1095 451 1106T426 1133Q442 1100 442 1061V863H354Z" />
37
- <glyph unicode="+" glyph-name="plus" horiz-adv-x="1160" d="M651 1166V739H1058V604H651V174H505V604H100V739H505V1166H651Z" />
38
- <glyph unicode="," glyph-name="comma" horiz-adv-x="424" d="M94 123Q94 146 102 166T126 202T164 227T212 236Q242 236 265 225T304 195T328 150T336 94Q336 49 323 1T286 -95T227 -188T146 -271L116 -242Q103 -230 103 -214Q103 -201 117 -187Q127 -176 142
39
- -158T174 -115T203 -62T223 0H210Q184 0 163 9T127 34T103 73T94 123Z" />
40
- <glyph unicode="-" glyph-name="hyphen" horiz-adv-x="694" d="M100 675H594V524H100V675Z" />
41
- <glyph unicode="." glyph-name="period" horiz-adv-x="424" d="M88 110Q88 136 97 159T123 199T163 226T212 236Q238 236 261 226T301 199T327 159T337 110Q337 83 328 61T301 21T261 -5T212 -15Q186 -15 163 -6T124 21T98 60T88 110Z" />
42
- <glyph unicode="/" glyph-name="slash" horiz-adv-x="746" d="M161 -21Q147 -56 120 -73T63 -90H-12L589 1407Q602 1439 626 1456T683 1473H758L161 -21Z" />
43
- <glyph unicode="0" glyph-name="zero" horiz-adv-x="1160" d="M1100 716Q1100 528 1060 391T949 163T784 29T579 -15Q469 -15 375 29T210 163T100 390T60 716Q60 904 100 1042T210 1270T374 1405T579 1449Q688 1449 783 1405T949 1271T1059 1042T1100 716ZM915
44
- 716Q915 880 888 991T814 1171T706 1268T579 1298Q513 1298 452 1269T345 1171T272 992T244 716Q244 552 271 441T345 262T452 165T579 135Q645 135 706 164T813 262T887 441T915 716Z" />
45
- <glyph unicode="1" glyph-name="one" horiz-adv-x="1160" d="M287 136H595V1113Q595 1157 598 1202L342 983Q332 975 322 972T303 968Q288 968 276 974T258 990L202 1067L628 1436H773V136H1055V0H287V136Z" />
46
- <glyph unicode="2" glyph-name="two" horiz-adv-x="1160" d="M601 1449Q692 1449 771 1422T907 1344T998 1218T1031 1050Q1031 970 1007 902T942 772T848 651T734 531L357 145Q397 156 438 162T517 169H997Q1026 169 1043 152T1060 108V0H104V61Q104 80 111 100T136
47
- 137L595 598Q652 656 699 709T779 817T831 926T849 1045Q849 1108 829 1155T774 1234T692 1280T591 1296Q537 1296 491 1280T410 1236T350 1168T315 1082Q307 1053 291 1040T249 1027Q244 1027 239 1027T226 1029L133 1045Q147 1143 187 1218T288 1345T429 1422T601
48
- 1449Z" />
49
- <glyph unicode="3" glyph-name="three" horiz-adv-x="1160" d="M620 1449Q711 1449 788 1423T920 1349T1007 1233T1038 1082Q1038 1014 1021 961T971 867T892 798T789 753Q929 716 999 629T1070 411Q1070 312 1033 233T930 99T779 14T593 -16Q479 -16 398 12T261
50
- 91T169 209T108 358L184 390Q205 399 226 399Q246 399 261 391T285 364Q287 360 289 356T293 346Q307 317 327 281T381 212T465 158T591 136Q666 136 722 160T816 224T873 311T892 406Q892 464 877 512T821 595T709 650T525 670V799Q616 800 680 819T786 871T845
51
- 950T864 1052Q864 1114 845 1160T791 1236T711 1281T610 1296Q556 1296 510 1280T429 1236T369 1168T333 1082Q325 1053 309 1040T268 1027Q263 1027 258 1027T245 1029L152 1045Q166 1143 206 1218T307 1345T448 1422T620 1449Z" />
52
- <glyph unicode="4" glyph-name="four" horiz-adv-x="1160" d="M903 517H1120V415Q1120 399 1111 388T1081 377H903V0H746V377H111Q91 377 77 388T58 417L40 508L737 1433H903V517ZM746 1108Q746 1134 747 1164T754 1226L233 517H746V1108Z" />
53
- <glyph unicode="5" glyph-name="five" horiz-adv-x="1160" d="M978 1355Q978 1317 954 1293T873 1268H423L357 892Q469 916 564 916Q676 916 761 883T905 792T992 655T1022 483Q1022 369 982 277T873 120T709 19T506 -16Q443 -16 385 -4T277 30T184 78T108 135L162
54
- 211Q180 237 210 237Q229 237 254 222T316 187T400 153T516 137Q591 137 651 161T753 229T819 336T842 475Q842 542 823 596T764 688T665 747T527 768Q473 768 415 759T295 730L183 763L299 1433H978V1355Z" />
55
- <glyph unicode="6" glyph-name="six" horiz-adv-x="1160" d="M650 878Q736 878 813 850T948 767T1040 633T1074 451Q1074 352 1038 267T938 119T782 20T582 -16Q474 -16 387 18T237 116T142 270T108 473Q108 567 150 673T283 901L646 1390Q660 1408 685 1420T742
56
- 1433H900L403 804Q454 839 516 858T650 878ZM280 442Q280 373 300 316T358 218T452 155T579 132Q651 132 709 155T808 219T872 316T895 438Q895 508 873 564T811 660T715 721T592 742Q520 742 462 718T364 652T302 556T280 442Z" />
57
- <glyph unicode="7" glyph-name="seven" horiz-adv-x="1160" d="M1084 1433V1353Q1084 1319 1077 1297T1061 1260L468 63Q455 37 432 19T370 0H243L845 1182Q858 1207 871 1228T902 1268H154Q137 1268 124 1281T110 1312V1433H1084Z" />
58
- <glyph unicode="8" glyph-name="eight" horiz-adv-x="1160" d="M579 -16Q472 -16 383 12T230 94T131 222T96 392Q96 530 168 619T374 747Q261 789 204 872T146 1072Q146 1151 177 1220T265 1340T401 1420T579 1449Q676 1449 756 1420T893 1340T981 1220T1012 1072Q1012
59
- 956 954 873T784 747Q918 709 990 620T1062 392Q1062 298 1027 223T928 94T775 13T579 -16ZM579 126Q649 126 704 145T798 200T857 285T878 395Q878 469 854 521T788 607T692 655T579 671Q520 671 466 656T371 607T305 522T280 395Q280 335 300 286T359 201T453
60
- 146T579 126ZM579 814Q649 814 698 835T779 892T824 974T838 1069Q838 1119 822 1163T773 1240T692 1292T579 1311Q515 1311 467 1292T386 1240T337 1163T320 1069Q320 1020 334 974T379 893T459 836T579 814Z" />
61
- <glyph unicode="9" glyph-name="nine" horiz-adv-x="1160" d="M549 588Q468 588 396 615T268 694T181 823T148 999Q148 1093 183 1175T281 1318T431 1414T622 1449Q725 1449 809 1415T953 1320T1045 1174T1078 986Q1078 924 1067 869T1033 760T981 655T911 546L562
62
- 42Q549 23 525 12T470 0H306L742 571Q764 600 783 626T819 678Q764 634 695 611T549 588ZM907 1007Q907 1074 886 1128T826 1221T736 1279T620 1300Q554 1300 500 1279T407 1219T347 1128T326 1012Q326 944 345 891T401 800T490 744T608 725Q680 725 735 748T829
63
- 811T887 901T907 1007Z" />
64
- <glyph unicode=":" glyph-name="colon" horiz-adv-x="504" d="M128 110Q128 136 137 159T163 199T203 226T252 236Q278 236 301 226T341 199T367 159T377 110Q377 83 368 61T341 21T301 -5T252 -15Q226 -15 203 -6T164 21T138 60T128 110ZM128 860Q128 886 137
65
- 909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z" />
66
- <glyph unicode=";" glyph-name="semicolon" horiz-adv-x="504" d="M134 123Q134 146 142 166T166 202T204 227T252 236Q282 236 305 225T344 195T368 150T376 94Q376 49 363 1T326 -95T267 -188T186 -271L156 -242Q143 -230 143 -214Q143 -201 157 -187Q167 -176
67
- 182 -158T214 -115T243 -62T263 0H250Q224 0 203 9T167 34T143 73T134 123ZM128 860Q128 886 137 909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z"
68
- />
69
- <glyph unicode="&lt;" glyph-name="less" horiz-adv-x="1160" d="M148 710L922 1111V984Q922 967 914 955T886 932L437 704Q417 693 395 686T347 672Q372 667 394 659T437 641L886 414Q906 404 914 391T922 362V234L148 636V710Z" />
70
- <glyph unicode="=" glyph-name="equal" horiz-adv-x="1160" d="M150 574H1009V439H150V574ZM150 909H1009V774H150V909Z" />
71
- <glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="1160" d="M238 234V362Q238 378 246 391T274 414L723 641Q743 651 764 659T811 672Q786 678 765 685T723 704L274 932Q254 942 246 954T238 984V1111L1011 710V636L238 234Z" />
72
- <glyph unicode="?" glyph-name="question" horiz-adv-x="796" d="M34 1305Q65 1334 102 1360T184 1406T280 1437T392 1449Q471 1449 538 1426T655 1361T732 1259T760 1124Q760 1048 738 993T681 897T605 825T529 767T468 713T438 653L420 500H298L286 666V677Q286
73
- 719 308 751T365 812T439 869T513 932T570 1011T593 1115Q593 1158 576 1193T530 1252T462 1290T377 1303Q316 1303 273 1288T199 1255T151 1222T120 1207Q95 1207 81 1230L34 1305ZM230 110Q230 136 239 159T265 199T305 226T354 236Q380 236 403 226T443 199T469
74
- 159T479 110Q479 83 470 61T443 21T403 -5T354 -15Q328 -15 305 -6T266 21T240 60T230 110Z" />
75
- <glyph unicode="@" glyph-name="at" horiz-adv-x="1644" d="M1167 186Q1089 186 1040 223T978 339Q920 258 852 223T706 188Q646 188 602 208T529 265T485 352T470 460Q470 545 502 631T599 787T758 901T979 945Q1046 945 1096 935T1192 904L1099 543Q1080 468
76
- 1080 419Q1080 383 1089 360T1113 323T1149 304T1193 299Q1242 299 1286 327T1363 406T1416 528T1436 687Q1436 825 1392 929T1270 1102T1087 1206T859 1241Q725 1241 608 1190T404 1049T267 836T217 568Q217 398 270 270T416 54T633 -77T901 -121Q1053 -121 1169
77
- -88T1371 -4Q1386 5 1398 5Q1419 5 1429 -19L1454 -85Q1347 -157 1211 -198T901 -239Q728 -239 579 -184T321 -26T149 228T86 568Q86 677 113 778T191 966T311 1126T467 1250T652 1330T859 1359Q951 1359 1039 1339T1205 1280T1350 1184T1463 1052T1537 886T1564
78
- 687Q1564 579 1534 488T1450 329T1324 224T1167 186ZM741 306Q772 306 803 316T864 351T918 419T960 527L1036 822Q997 831 951 831Q876 831 814 800T706 717T636 600T610 465Q610 393 643 350T741 306Z" />
79
- <glyph unicode="A" glyph-name="A" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532Z" />
80
- <glyph unicode="B" glyph-name="B" horiz-adv-x="1294" d="M174 0V1433H631Q763 1433 858 1407T1015 1333T1106 1216T1136 1059Q1136 1006 1120 957T1070 866T986 791T867 737Q1024 706 1104 624T1184 408Q1184 317 1151 242T1053 113T895 30T681 0H174ZM368 653V154H678Q761
81
- 154 820 173T918 226T975 308T993 413Q993 524 915 588T677 653H368ZM368 791H624Q706 791 766 809T865 859T924 936T943 1036Q943 1162 867 1221T631 1280H368V791Z" />
82
- <glyph unicode="C" glyph-name="C" horiz-adv-x="1370" d="M1184 296Q1200 296 1213 283L1289 200Q1201 98 1076 41T773 -16Q618 -16 492 37T277 187T139 419T90 716Q90 878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216
83
- 1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589 189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Z" />
84
- <glyph unicode="D" glyph-name="D" horiz-adv-x="1506" d="M1416 716Q1416 555 1365 423T1221 197T998 52T710 0H174V1433H710Q868 1433 998 1382T1221 1236T1365 1009T1416 716ZM1217 716Q1217 848 1181 952T1079 1128T919 1238T710 1276H369V157H710Q825 157
85
- 919 195T1079 304T1181 480T1217 716Z" />
86
- <glyph unicode="E" glyph-name="E" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057Z" />
87
- <glyph unicode="F" glyph-name="F" horiz-adv-x="1132" d="M1057 1433V1275H369V774H957V616H369V0H174V1433H1057Z" />
88
- <glyph unicode="G" glyph-name="G" horiz-adv-x="1468" d="M813 141Q871 141 919 146T1011 163T1092 189T1168 225V541H946Q927 541 916 552T904 579V689H1344V139Q1290 100 1232 71T1107 23T964 -6T799 -16Q643 -16 513 37T289 187T143 419T90 716Q90 880 141
89
- 1015T288 1246T519 1396T823 1449Q908 1449 981 1437T1116 1401T1232 1344T1331 1268L1276 1180Q1259 1153 1232 1153Q1216 1153 1197 1164Q1172 1178 1141 1198T1066 1236T961 1268T817 1281Q696 1281 598 1242T431 1129T325 951T288 716Q288 580 326 474T435
90
- 293T601 180T813 141Z" />
91
- <glyph unicode="H" glyph-name="H" horiz-adv-x="1512" d="M1336 0H1141V652H369V0H174V1433H369V794H1141V1433H1336V0Z" />
92
- <glyph unicode="I" glyph-name="I" horiz-adv-x="614" d="M404 0H210V1433H404V0Z" />
93
- <glyph unicode="J" glyph-name="J" horiz-adv-x="888" d="M713 495Q713 375 684 280T597 120T455 19T262 -16Q165 -16 60 12Q62 41 65 69T71 126Q73 143 83 153T115 164Q133 164 163 155T243 146Q309 146 360 166T447 228T501 335T520 491V1433H713V495Z" />
94
- <glyph unicode="K" glyph-name="K" horiz-adv-x="1362" d="M387 805H460Q498 805 520 814T563 847L1040 1387Q1062 1412 1082 1422T1135 1433H1300L754 816Q733 793 715 777T675 751Q703 742 724 724T768 679L1338 0H1170Q1151 0 1138 3T1116 11T1098 24T1082
95
- 41L587 610Q576 622 567 630T545 645T516 653T475 656H387V0H194V1433H387V805Z" />
96
- <glyph unicode="L" glyph-name="L" horiz-adv-x="1028" d="M368 163H988V0H174V1433H368V163Z" />
97
- <glyph unicode="M" glyph-name="M" horiz-adv-x="1840" d="M879 518Q893 494 903 468T924 414Q934 442 945 467T970 519L1455 1400Q1468 1423 1482 1428T1522 1433H1665V0H1495V1053Q1495 1074 1496 1098T1499 1147L1008 251Q983 206 938 206H910Q865 206 840
98
- 251L338 1150Q341 1124 342 1099T344 1053V0H174V1433H317Q343 1433 357 1428T384 1400L879 518V518Z" />
99
- <glyph unicode="N" glyph-name="N" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433Z" />
100
- <glyph unicode="O" glyph-name="O" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306
101
- 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" />
102
- <glyph unicode="P" glyph-name="P" horiz-adv-x="1222" d="M387 536V0H194V1433H617Q753 1433 853 1402T1020 1312T1118 1172T1151 989Q1151 889 1116 806T1014 663T846 570T617 536H387ZM387 690H617Q700 690 763 712T870 773T935 868T957 989Q957 1126 873 1203T617
103
- 1280H387V690Z" />
104
- <glyph unicode="Q" glyph-name="Q" horiz-adv-x="1596" d="M1505 716Q1505 615 1485 524T1425 355T1330 212T1204 101L1572 -296H1412Q1376 -296 1348 -286T1297 -251L1045 23Q988 5 927 -5T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287
105
- 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270
106
- 479T1306 716Z" />
107
- <glyph unicode="R" glyph-name="R" horiz-adv-x="1288" d="M387 598V0H194V1433H599Q735 1433 834 1406T997 1326T1093 1201T1124 1036Q1124 960 1100 894T1031 776T920 686T771 630Q807 609 835 569L1253 0H1081Q1028 0 1003 41L631 553Q614 577 594 587T534
108
- 598H387ZM387 739H590Q675 739 739 759T847 817T913 907T935 1022Q935 1150 851 1215T599 1280H387V739Z" />
109
- <glyph unicode="S" glyph-name="S" horiz-adv-x="1060" d="M908 1209Q899 1194 889 1187T863 1179Q846 1179 824 1196T767 1233T684 1271T566 1288Q501 1288 451 1271T368 1223T317 1153T300 1065Q300 1005 329 966T407 898T517 850T643 807T769 758T879 688T957
110
- 585T987 435Q987 341 955 259T862 115T711 19T507 -16Q368 -16 254 34T58 171L114 263Q122 274 133 281T159 289Q180 289 207 267T274 217T372 168T513 145Q582 145 636 164T727 217T785 300T805 407Q805 472 776 513T698 583T589 630T463 670T337 718T227 788T150
111
- 895T120 1055Q120 1131 149 1202T235 1328T373 1416T563 1449Q683 1449 782 1411T955 1301L908 1209Z" />
112
- <glyph unicode="T" glyph-name="T" horiz-adv-x="1180" d="M1150 1433V1270H687V0H493V1270H28V1433H1150Z" />
113
- <glyph unicode="U" glyph-name="U" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452 269T571
114
- 185T731 154Z" />
115
- <glyph unicode="V" glyph-name="V" horiz-adv-x="1360" d="M8 1433H163Q189 1433 205 1420T229 1387L634 376Q648 342 659 302T682 219Q691 262 701 302T726 376L1129 1387Q1136 1404 1153 1418T1195 1433H1351L767 0H592L8 1433Z" />
116
- <glyph unicode="W" glyph-name="W" horiz-adv-x="2038" d="M14 1433H175Q201 1433 218 1420T241 1387L537 391Q545 364 551 333T564 268Q571 302 578 333T594 391L931 1387Q937 1404 954 1418T997 1433H1053Q1079 1433 1095 1420T1119 1387L1454 391Q1472 339
117
- 1486 272Q1492 305 1497 335T1510 391L1807 1387Q1812 1405 1829 1419T1872 1433H2023L1576 0H1402L1039 1093Q1028 1124 1019 1165Q1014 1145 1010 1127T1000 1093L635 0H461L14 1433Z" />
118
- <glyph unicode="X" glyph-name="X" horiz-adv-x="1286" d="M507 736L34 1433H227Q248 1433 258 1426T276 1406L650 832Q657 853 671 878L1024 1402Q1033 1416 1043 1424T1069 1433H1254L779 745L1270 0H1078Q1056 0 1044 11T1023 37L639 638Q632 617 621 598L247
119
- 37Q238 23 227 12T194 0H14L507 736Z" />
120
- <glyph unicode="Y" glyph-name="Y" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570Z" />
121
- <glyph unicode="Z" glyph-name="Z" horiz-adv-x="1248" d="M1172 1433V1361Q1172 1327 1151 1297L340 158H1158V0H86V76Q86 106 105 133L917 1275H124V1433H1172Z" />
122
- <glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="600" d="M142 -289V1533H510V1463Q510 1441 497 1429T461 1416H292V-171H461Q483 -171 496 -183T510 -219V-289H142Z" />
123
- <glyph unicode="\" glyph-name="backslash" horiz-adv-x="750" d="M-20 1473H56Q89 1473 113 1456T150 1407L751 -90H676Q647 -90 619 -73T578 -21L-20 1473Z" />
124
- <glyph unicode="]" glyph-name="bracketright" horiz-adv-x="600" d="M90 -219Q90 -199 103 -185T139 -171H308V1416H139Q117 1416 104 1429T90 1463V1533H458V-289H90V-219Z" />
125
- <glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1160" d="M516 1433H631L989 787H860Q843 787 831 797T811 821L615 1173Q602 1196 593 1217T576 1260Q562 1216 539 1173L345 821Q337 807 326 797T294 787H158L516 1433Z" />
126
- <glyph unicode="_" glyph-name="underscore" horiz-adv-x="788" d="M788 -165V-285H0V-165H788Z" />
127
- <glyph unicode="`" glyph-name="grave" horiz-adv-x="614" d="M207 1449Q240 1449 256 1439T286 1405L435 1163H333Q312 1163 299 1169T272 1191L38 1449H207Z" />
128
- <glyph unicode="a" glyph-name="a" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 887
129
- 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 192T311
130
- 145T363 118T428 109Z" />
131
- <glyph unicode="b" glyph-name="b" horiz-adv-x="1118" d="M152 0V1473H331V867Q394 940 475 984T662 1029Q750 1029 821 996T942 898T1019 736T1046 513Q1046 401 1016 305T930 138T792 27T608 -14Q510 -14 442 24T322 130L313 38Q305 0 267 0H152ZM604 887Q517
132
- 887 452 847T331 734V244Q379 178 437 151T568 124Q710 124 786 225T862 513Q862 612 845 683T794 799T713 866T604 887Z" />
133
- <glyph unicode="c" glyph-name="c" horiz-adv-x="934" d="M837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775 208T811
134
- 224Q834 224 845 207L895 142Q829 61 730 24T521 -14Q426 -14 345 21T203 122T109 286T74 507Q74 620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Z" />
135
- <glyph unicode="d" glyph-name="d" horiz-adv-x="1118" d="M859 0Q821 0 811 37L795 160Q730 81 647 34T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q603 1031 669 1000T787 911V1473H965V0H859ZM514 130Q601 130
136
- 666 170T787 283V773Q738 839 680 865T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" />
137
- <glyph unicode="e" glyph-name="e" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 142Q921
138
- 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898Z" />
139
- <glyph unicode="f" glyph-name="f" horiz-adv-x="674" d="M186 0V861L74 874Q53 879 40 889T26 920V993H186V1091Q186 1178 210 1245T280 1359T390 1430T534 1454Q602 1454 660 1434L656 1345Q655 1325 639 1321T594 1317H563Q517 1317 480 1305T415 1266T374
140
- 1195T359 1086V993H652V864H365V0H186Z" />
141
- <glyph unicode="g" glyph-name="g" horiz-adv-x="1022" d="M487 1030Q553 1030 610 1016T715 973H990V907Q990 874 948 865L833 849Q867 784 867 704Q867 630 839 570T760 466T640 400T487 377Q416 377 353 394Q321 374 305 351T288 306Q288 270 317 252T394 225T503
142
- 215T627 209T752 193T861 157T938 88T967 -26Q967 -91 935 -152T841 -260T692 -336T493 -365Q382 -365 299 -343T160 -284T78 -199T50 -97Q50 -22 97 30T228 114Q185 134 160 167T134 257Q134 279 142 302T166 349T207 393T263 430Q188 472 146 541T103 704Q103
143
- 778 131 838T211 941T332 1007T487 1030ZM803 -55Q803 -17 782 6T725 41T642 60T543 68T437 74T334 85Q277 58 242 19T206 -74Q206 -108 223 -137T277 -188T367 -222T496 -235Q568 -235 625 -222T721 -185T782 -128T803 -55ZM487 495Q541 495 582 510T652 552T694
144
- 616T708 699Q708 792 652 847T487 902Q380 902 324 847T267 699Q267 654 281 617T324 552T393 510T487 495Z" />
145
- <glyph unicode="h" glyph-name="h" horiz-adv-x="1112" d="M146 0V1473H324V877Q389 946 468 987T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" />
146
- <glyph unicode="i" glyph-name="i" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM384 1331Q384 1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345
147
- 1422T373 1381T384 1331Z" />
148
- <glyph unicode="j" glyph-name="j" horiz-adv-x="508" d="M344 1013V-75Q344 -136 328 -188T278 -280T189 -341T58 -364Q25 -364 -2 -359T-56 -344L-48 -248Q-46 -235 -39 -232T-17 -228Q-9 -228 0 -228T22 -229Q100 -229 133 -193T166 -75V1013H344ZM384 1331Q384
149
- 1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345 1422T373 1381T384 1331Z" />
150
- <glyph unicode="k" glyph-name="k" horiz-adv-x="1048" d="M331 1473V606H377Q397 606 410 611T439 634L759 977Q774 993 789 1003T829 1013H991L618 616Q604 599 591 586T560 563Q578 551 592 536T620 500L1016 0H856Q834 0 819 8T789 35L456 450Q441 471 426
151
- 477T381 484H331V0H152V1473H331Z" />
152
- <glyph unicode="l" glyph-name="l" horiz-adv-x="512" d="M344 1473V0H166V1473H344Z" />
153
- <glyph unicode="m" glyph-name="m" horiz-adv-x="1642" d="M146 0V1013H252Q290 1013 300 976L313 872Q369 941 438 985T600 1029Q703 1029 766 972T858 818Q879 873 913 913T991 979T1082 1017T1181 1029Q1261 1029 1323 1004T1429 929T1496 809T1519 645V0H1341V645Q1341
154
- 764 1289 825T1138 887Q1094 887 1055 872T985 826T938 751T920 645V0H742V645Q742 767 693 827T550 887Q484 887 428 852T324 755V0H146Z" />
155
- <glyph unicode="n" glyph-name="n" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" />
156
- <glyph unicode="o" glyph-name="o" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 125Q706
157
- 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125Z" />
158
- <glyph unicode="p" glyph-name="p" horiz-adv-x="1104" d="M146 -343V1013H252Q290 1013 300 976L315 856Q380 935 463 983T656 1031Q743 1031 814 998T935 899T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q508 -14 442 17T324 105V-343H146ZM597
159
- 887Q510 887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" />
160
- <glyph unicode="q" glyph-name="q" horiz-adv-x="1118" d="M965 1013V-343H787V150Q723 76 642 31T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q608 1031 676 996T799 897L811 976Q821 1013 859 1013H965ZM514 130Q601
161
- 130 666 170T787 283V773Q739 837 680 864T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" />
162
- <glyph unicode="r" glyph-name="r" horiz-adv-x="806" d="M146 0V1013H248Q277 1013 288 1002T303 964L315 806Q367 912 443 971T623 1031Q665 1031 699 1022T762 995L739 862Q732 837 708 837Q694 837 665 846T584 856Q491 856 429 802T324 645V0H146Z" />
163
- <glyph unicode="s" glyph-name="s" horiz-adv-x="868" d="M726 846Q714 824 689 824Q674 824 655 835T609 859T543 884T453 896Q408 896 372 885T311 853T272 807T258 749Q258 710 280 684T340 639T424 606T520 575T617 538T701 488T760 415T783 310Q783 240 758
164
- 181T684 78T564 9T400 -16Q294 -16 208 18T62 107L104 175Q112 188 123 195T152 202Q170 202 190 188T238 157T307 126T409 112Q461 112 500 125T565 162T603 215T616 279Q616 321 594 348T534 395T450 429T353 460T256 496T171 548T112 624T89 735Q89 793 113
165
- 846T183 940T296 1005T449 1029Q549 1029 628 998T766 911L726 846Z" />
166
- <glyph unicode="t" glyph-name="t" horiz-adv-x="746" d="M453 -16Q333 -16 269 51T204 244V864H82Q66 864 55 873T44 903V974L210 995L251 1308Q253 1323 264 1332T292 1342H382V993H672V864H382V256Q382 192 413 161T493 130Q521 130 541 137T577 154T602 170T621
167
- 178Q635 178 646 161L698 76Q652 33 587 9T453 -16Z" />
168
- <glyph unicode="u" glyph-name="u" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300Z" />
169
- <glyph unicode="v" glyph-name="v" horiz-adv-x="1024" d="M18 1013H164Q185 1013 199 1002T219 976L476 324Q490 288 498 252T513 181Q521 216 530 252T553 324L813 976Q819 992 832 1002T866 1013H1005L592 0H431L18 1013Z" />
170
- <glyph unicode="w" glyph-name="w" horiz-adv-x="1532" d="M14 1013H154Q176 1013 190 1002T209 976L403 324Q411 288 418 255T430 187Q438 221 448 254T469 324L683 980Q688 995 700 1005T732 1015H809Q829 1015 842 1005T860 980L1069 324Q1080 289 1088 255T1105
171
- 188Q1110 221 1118 257T1135 324L1333 976Q1338 992 1352 1002T1385 1013H1519L1191 0H1050Q1024 0 1014 34L790 721Q782 744 777 767T767 814Q762 791 757 767T744 720L517 34Q506 0 476 0H342L14 1013Z" />
172
- <glyph unicode="x" glyph-name="x" horiz-adv-x="1008" d="M383 519L42 1013H213Q235 1013 245 1006T263 986L511 606Q520 634 537 662L755 982Q765 996 775 1004T800 1013H964L623 529L978 0H807Q785 0 773 11T752 37L497 434Q490 405 476 382L240 37Q230 23
173
- 219 12T187 0H28L383 519Z" />
174
- <glyph unicode="y" glyph-name="y" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443 -299Z" />
175
- <glyph unicode="z" glyph-name="z" horiz-adv-x="924" d="M853 937Q853 918 846 901T828 869L280 139H833V0H70V74Q70 87 76 104T95 138L646 873H101V1013H853V937Z" />
176
- <glyph unicode="{" glyph-name="braceleft" horiz-adv-x="600" d="M181 425Q181 488 146 528T44 569V676Q111 676 146 716T181 820Q181 870 173 919T156 1017T138 1116T130 1218Q130 1287 150 1345T212 1445T315 1510T459 1533H512V1454Q512 1434 498 1425T472
177
- 1416H452Q375 1416 331 1366T286 1229Q286 1173 293 1121T309 1020T325 921T332 822Q332 784 321 752T290 694T242 650T181 622Q214 613 241 595T289 550T321 492T332 423Q332 373 325 324T309 226T293 124T286 16Q286 -71 330 -121T452 -171H472Q484 -171 498
178
- -180T512 -209V-289H459Q377 -289 316 -266T213 -200T151 -100T130 27Q130 79 138 128T155 227T173 326T181 425Z" />
179
- <glyph unicode="|" glyph-name="bar" horiz-adv-x="600" d="M230 1533H368V-343H230V1533Z" />
180
- <glyph unicode="}" glyph-name="braceright" horiz-adv-x="600" d="M419 425Q419 375 427 326T444 228T462 129T470 27Q470 -42 449 -100T387 -200T285 -265T141 -289H88V-209Q88 -189 102 -180T128 -171H148Q225 -171 269 -121T314 16Q314 72 307 124T291 225T275
181
- 324T268 423Q268 460 279 492T310 550T358 594T419 622Q386 631 359 649T311 693T279 751T268 822Q268 872 275 921T291 1019T307 1121T314 1229Q314 1315 270 1365T148 1416H128Q116 1416 102 1425T88 1454V1533H141Q223 1533 284 1510T387 1445T449 1345T470
182
- 1218Q470 1166 462 1116T445 1017T427 919T419 820Q419 756 454 716T556 676V569Q489 569 454 529T419 425Z" />
183
- <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1160" d="M759 613Q824 613 860 655T898 768H1042Q1042 701 1024 645T971 549T885 487T770 465Q718 465 667 481T569 516T478 552T399 569Q334 569 298 527T260 414H116Q116 481 134 537T187 633T272
184
- 695T388 718Q440 718 491 702T589 666T680 630T759 613Z" />
185
- <glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="386" />
186
- <glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="686" d="M262 -343V198Q262 243 263 285T268 371T275 461T286 559H407Q413 507 417 461T425 372T429 286T431 198V-343H262ZM218 904Q218 931 227 953T254 993T293 1019T343 1029Q369 1029 391 1020T431
187
- 993T458 954T468 904Q468 878 458 855T431 815T392 788T343 778Q316 778 294 788T254 815T228 855T218 904Z" />
188
- <glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="1160" d="M561 -11Q469 -1 392 38T258 144T170 301T138 506Q138 617 171 710T267 873T422 982T633 1026L645 1205Q647 1225 660 1239T695 1254H761L745 1021Q827 1009 893 978T1013 897L967 835Q959 824
189
- 952 819T930 813Q918 813 902 821T863 842T809 866T735 885L683 123Q746 127 788 142T860 175T909 206T944 220Q955 220 964 216T978 204L1026 141Q966 69 874 32T674 -12L662 -187Q660 -206 647 -220T612 -235H546L561 -11ZM315 506Q315 344 382 248T571 129L623
190
- 889Q547 883 490 855T393 777T335 659T315 506Z" />
191
- <glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="1160" d="M52 672Q52 698 68 716T113 734H247V995Q247 1089 274 1171T356 1315T493 1412T685 1448Q763 1448 823 1429T931 1375T1012 1296T1071 1199L999 1153Q989 1147 979 1145T958 1142Q944 1142
192
- 932 1147T908 1167Q888 1192 868 1215T822 1256T763 1284T685 1295Q622 1295 574 1274T494 1214T446 1120T430 997V734H871V662Q871 644 856 629T819 614H430V371Q430 296 402 242T323 142Q352 147 380 150T439 154H1115V78Q1115 64 1110 51T1094 26T1070 7T1038
193
- 0H74V115Q108 125 139 142T194 184T232 244T247 325V614H52V672Z" />
194
- <glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="1160" d="M223 672Q223 729 239 779T285 874L132 1027L223 1117L374 965Q418 996 470 1013T580 1030Q637 1030 688 1014T782 967L935 1120L1024 1029L873 877Q904 833 921 782T938 672Q938 615 922
195
- 564T876 470L1028 319L937 227L785 379Q741 349 689 332T580 315Q523 315 473 331T378 377L225 224L136 315L287 467Q257 511 240 562T223 672ZM355 672Q355 626 372 586T421 515T492 466T580 448Q627 448 668 466T740 514T789 585T807 672Q807 719 789 760T741
196
- 832T669 880T580 898Q533 898 493 881T421 832T373 760T355 672Z" />
197
- <glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="1160" d="M146 625H452L44 1433H193Q219 1433 234 1421T260 1388L536 822Q550 787 560 758T577 700Q584 729 593 758T616 822L891 1388Q899 1405 915 1419T957 1433H1107L698 625H1005V523H665V418H1005V315H665V0H486V315H146V418H486V523H146V625Z"
198
- />
199
- <glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="600" d="M230 1533H368V739H230V1533ZM230 452H368V-343H230V452Z" />
200
- <glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="1006" d="M817 1265Q805 1243 780 1243Q765 1243 746 1254T700 1278T634 1303T544 1315Q496 1315 458 1303T393 1269T352 1220T338 1161Q338 1123 362 1095T426 1043T517 998T620 953T724 903T814 840T878
201
- 758T903 651Q903 570 864 507T741 405Q790 368 821 319T852 201Q852 131 827 72T754 -31T634 -100T470 -125Q364 -125 278 -91T132 -2L173 66Q181 79 192 86T221 93Q239 93 259 79T308 48T379 16T485 2Q535 2 574 14T641 49T682 103T696 172Q696 217 671 250T605
202
- 308T512 355T405 398T298 445T205 506T139 587T114 698Q114 776 157 838T293 936Q243 974 212 1026T180 1154Q180 1212 204 1265T274 1359T387 1423T540 1447Q640 1447 719 1416T857 1330L817 1265ZM272 726Q272 675 307 640T396 576T517 521T645 463Q699 489 723
203
- 526T747 611Q747 647 732 675T691 726T630 768T556 804T474 839T392 877Q326 847 299 811T272 726Z" />
204
- <glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="614" d="M239 1289Q239 1266 230 1246T205 1211T169 1187T125 1178Q103 1178 83 1187T48 1211T23 1246T14 1289Q14 1312 23 1333T47 1369T83 1394T125 1403Q148 1403 168 1394T205 1370T230 1333T239
205
- 1289ZM598 1289Q598 1266 589 1246T565 1211T529 1187T485 1178Q462 1178 442 1187T406 1211T382 1246T373 1289Q373 1312 382 1333T406 1369T441 1394T485 1403Q508 1403 528 1394T564 1370T589 1333T598 1289Z" />
206
- <glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="1596" d="M1030 463Q1038 468 1043 471T1055 475Q1066 475 1070 472T1080 463L1141 399Q1084 333 1001 297T802 260Q704 260 624 294T486 389T397 534T365 718Q365 819 399 903T495 1048T639 1142T821
207
- 1176Q929 1176 1005 1142T1138 1053L1092 988Q1087 982 1079 976T1059 970Q1045 970 1030 981T989 1005T926 1030T829 1042Q759 1042 703 1020T607 955T546 853T524 718Q524 641 545 581T605 479T696 417T811 395Q859 395 892 401T949 417T991 439T1030 463ZM68
208
- 716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167 86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168
209
- 716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666 1361 551 1311T351 1173T217 968T168 716Z" />
210
- <glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="684" d="M596 840H536Q518 840 509 845T492 869L480 918Q456 897 433 881T385 854T332 837T270 831Q232 831 200 841T143 871T106 922T92 993Q92 1027 111 1060T174 1120T290 1164T470 1184V1221Q470
211
- 1284 441 1314T355 1344Q317 1344 292 1335T249 1316T216 1297T185 1288Q171 1288 161 1295T146 1313L124 1355Q176 1404 236 1427T370 1450Q424 1450 466 1433T537 1386T581 1314T596 1221V840ZM309 923Q360 923 397 942T470 996V1101Q400 1099 352 1091T273 1069T230
212
- 1038T217 999Q217 957 243 940T309 923Z" />
213
- <glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="926" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138
214
- 518ZM434 518V541L683 930L741 902Q755 895 762 884T769 860Q769 843 759 827L600 566Q586 542 572 529Q587 515 600 493L759 232Q764 224 766 215T769 198Q769 170 741 157L683 129L434 518Z" />
215
- <glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="1160" d="M148 739H1008V315H857V604H148V739Z" />
216
- <glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="694" d="M100 675H594V524H100V675Z" />
217
- <glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="1596" d="M68 716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167
218
- 86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168 716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666
219
- 1361 551 1311T351 1173T217 968T168 716ZM654 626V272H498V1164H786Q958 1164 1041 1102T1124 917Q1124 823 1071 757T911 666Q928 656 940 641T964 606L1192 272H1044Q1011 272 995 297L794 599Q785 612 773 619T734 626H654ZM654 740H770Q825 740 863 750T925
220
- 781T959 830T970 897Q970 934 961 962T930 1008T873 1035T786 1044H654V740Z" />
221
- <glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="614" d="M20 1348H594V1231H20V1348Z" />
222
- <glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="794" d="M70 1128Q70 1195 95 1254T164 1356T267 1425T396 1450Q465 1450 524 1425T628 1357T697 1254T722 1128Q722 1062 697 1004T628 902T525 833T396 807Q327 807 268 832T164 901T95 1003T70 1128ZM197
223
- 1127Q197 1085 212 1049T254 985T317 943T396 927Q438 927 474 942T537 985T579 1048T594 1127Q594 1169 579 1206T537 1270T474 1313T396 1329Q354 1329 318 1314T254 1271T212 1206T197 1127Z" />
224
- <glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="1160" d="M651 1202V826H1058V690H651V322H505V690H100V826H505V1202H651ZM100 215H1058V80H100V215Z" />
225
- <glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="664" d="M346 1637Q398 1637 440 1622T513 1580T559 1515T576 1429Q576 1389 564 1355T530 1289T482 1229T425 1170L263 1005Q286 1011 309 1015T354 1019H549Q570 1019 581 1008T593 977V900H82V943Q82
226
- 956 87 970T104 996L325 1215Q350 1240 372 1266T410 1318T435 1371T445 1425Q445 1476 415 1503T340 1531Q294 1531 266 1507T223 1441Q215 1427 206 1419T179 1411Q175 1411 171 1411T161 1413L90 1425Q105 1531 174 1584T346 1637Z" />
227
- <glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="664" d="M354 1637Q405 1637 446 1623T516 1583T562 1523T578 1449Q578 1321 459 1276Q525 1257 559 1218T594 1117Q594 1062 573 1020T518 950T438 907T344 892Q287 892 245 904T173 941T121
228
- 1002T84 1085L139 1109Q154 1115 168 1115Q197 1115 208 1092Q214 1079 223 1063T247 1033T283 1010T337 1000Q368 1000 391 1010T431 1035T455 1071T463 1112Q463 1142 455 1163T427 1199T375 1220T295 1227V1314Q382 1315 417 1345T453 1427Q453 1477 424 1503T347
229
- 1529Q299 1529 271 1506T230 1442Q222 1426 214 1419T190 1411Q186 1411 182 1411T172 1413L105 1425Q112 1478 134 1517T188 1583T263 1623T354 1637Z" />
230
- <glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="614" d="M597 1449L364 1191Q350 1176 337 1170T302 1163H196L344 1405Q358 1428 374 1438T423 1449H597Z" />
231
- <glyph unicode="&#xb5;" glyph-name="mu" horiz-adv-x="1112" d="M300 1013V355Q300 246 354 186T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q730 74 660 40T502 6Q428 6 372 31T277 103Q284 61 287 18T290 -64V-343H201Q163 -343
232
- 143 -323T122 -267V1013H300Z" />
233
- <glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="1338" d="M1302 1433V1280H1083V-201H926V1280H649V-201H492V660Q388 660 305 690T164 773T74 897T42 1049Q42 1135 73 1205T163 1326T305 1405T492 1433H1302Z" />
234
- <glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="546" d="M124 593Q124 624 135 652T167 700T215 732T272 744Q303 744 331 732T379 700T411 652T423 593Q423 563 411 536T379 489T331 457T272 445Q242 445 215 456T168 488T136 536T124 593Z" />
235
- <glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="614" d="M172 -247Q178 -247 186 -250T205 -258T232 -266T269 -270Q311 -270 332 -254T354 -211Q354 -192 343 -179T312 -157T261 -142T193 -131L236 10H348L324 -70Q414 -90 454 -124T495 -213Q495
236
- -245 479 -270T435 -314T366 -341T278 -351Q237 -351 200 -343T132 -320L149 -265Q155 -247 172 -247Z" />
237
- <glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="664" d="M173 985H320V1425L324 1468L217 1380Q205 1371 191 1371Q168 1371 159 1385L120 1441L342 1631H450V985H580V900H173V985Z" />
238
- <glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="762" d="M382 1449Q452 1449 508 1428T605 1366T667 1269T689 1140Q689 1068 667 1010T605 912T509 850T382 828Q311 828 254 849T157 911T94 1010T72 1140Q72 1211 94 1268T156 1366T254 1427T382
239
- 1449ZM382 934Q466 934 507 986T549 1139Q549 1239 508 1291T382 1343Q295 1343 254 1291T212 1139Q212 1039 253 987T382 934Z" />
240
- <glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="926" d="M236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541V518L236 129ZM781 541V518L532
241
- 129L474 157Q446 170 446 198Q446 215 456 232L615 493Q628 517 642 529Q630 540 615 566L456 827Q446 844 446 861Q446 889 474 902L532 930L781 541Z" />
242
- <glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="1424" d="M1295 267H1404V202Q1404 191 1397 184T1377 176H1295V0H1186V176H880Q862 176 852 184T839 204L829 261L1171 729H1295V267ZM155 788H302V1228L306 1271L199 1183Q187 1174 173 1174Q150
243
- 1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM1186 508Q1186 527 1187 549T1191 594L950 267H1186V508ZM434 53Q415 22 393 11T342 0H266L1084 1372Q1102 1401 1125 1417T1180 1433H1257L434 53Z" />
244
- <glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="1424" d="M1126 737Q1178 737 1220 722T1293 680T1339 615T1356 529Q1356 489 1344 455T1310 389T1262 329T1205 270L1043 105Q1066 111 1089 115T1134 119H1329Q1350 119 1361 108T1373 77V0H862V43Q862
245
- 56 867 70T884 96L1105 315Q1130 340 1152 366T1190 418T1215 471T1225 525Q1225 576 1195 603T1120 631Q1074 631 1046 607T1003 541Q995 527 986 519T959 511Q955 511 951 511T941 513L870 525Q885 631 954 684T1126 737ZM155 788H302V1228L306 1271L199 1183Q187
246
- 1174 173 1174Q150 1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM390 53Q371 22 349 11T298 0H222L1040 1372Q1058 1401 1081 1417T1136 1433H1213L390 53Z" />
247
- <glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="1426" d="M1296 267H1405V202Q1405 191 1398 184T1378 176H1296V0H1187V176H881Q863 176 853 184T840 204L830 261L1172 729H1296V267ZM338 1440Q389 1440 430 1426T500 1386T546 1326T562 1252Q562
248
- 1124 443 1079Q509 1060 543 1021T578 920Q578 865 557 823T502 753T422 710T328 695Q271 695 229 707T157 744T105 805T68 888L123 912Q138 918 152 918Q181 918 192 895Q198 882 207 866T231 836T267 813T321 803Q352 803 375 813T415 838T439 874T447 915Q447
249
- 945 439 966T411 1002T359 1023T279 1030V1117Q366 1118 401 1148T437 1230Q437 1280 408 1306T331 1332Q283 1332 255 1309T214 1245Q206 1229 198 1222T174 1214Q170 1214 166 1214T156 1216L89 1228Q96 1281 118 1320T172 1386T247 1426T338 1440ZM1187 508Q1187
250
- 527 1188 549T1192 594L951 267H1187V508ZM439 53Q420 22 398 11T347 0H271L1089 1372Q1107 1401 1130 1417T1185 1433H1262L439 53Z" />
251
- <glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="796" d="M770 -212Q739 -241 702 -267T620 -313T524 -344T412 -356Q333 -356 266 -334T149 -271T72 -171T44 -37Q44 39 66 92T123 183T199 248T275 299T336 347T366 405L384 559H506L518 392V380Q518
252
- 336 496 305T439 249T365 201T291 147T234 77T211 -22Q211 -66 228 -100T274 -159T342 -197T427 -210Q488 -210 531 -195T605 -162T654 -129T685 -114Q699 -114 707 -120T723 -137L770 -212ZM324 903Q324 929 333 952T359 992T399 1019T448 1029Q474 1029 497 1019T537
253
- 992T563 952T573 903Q573 876 564 854T537 814T497 788T448 778Q422 778 399 787T360 814T334 853T324 903Z" />
254
- <glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM520
255
- 1782Q552 1782 568 1776T604 1749L815 1546H676Q655 1546 643 1549T614 1565L319 1782H520Z" />
256
- <glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM1021
257
- 1782L727 1566Q710 1554 697 1550T663 1546H525L736 1749Q746 1759 754 1765T772 1775T792 1780T820 1782H1021Z" />
258
- <glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414
259
- 532ZM1006 1546H871Q859 1546 845 1549T822 1559L692 1654Q684 1658 680 1662Q672 1656 668 1654L538 1559Q529 1553 515 1550T489 1546H354L592 1756H768L1006 1546Z" />
260
- <glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM801
261
- 1663Q836 1663 854 1683T874 1741H972Q972 1698 961 1662T929 1600T877 1559T806 1544Q771 1544 739 1557T678 1585T622 1614T572 1627Q538 1627 520 1606T500 1548H400Q400 1591 411 1627T444 1690T497 1731T568 1746Q603 1746 635 1733T696 1705T751 1676T801
262
- 1663Z" />
263
- <glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM578
264
- 1666Q578 1644 569 1625T545 1590T510 1567T466 1558Q445 1558 426 1566T391 1590T367 1624T358 1666Q358 1689 367 1709T391 1745T425 1769T466 1778Q489 1778 509 1769T545 1745T569 1710T578 1666ZM1004 1666Q1004 1644 995 1625T971 1590T936 1567T894 1558Q871
265
- 1558 851 1566T816 1590T793 1624T784 1666Q784 1689 792 1709T816 1745T851 1769T894 1778Q916 1778 936 1769T971 1745T995 1710T1004 1666Z" />
266
- <glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM489
267
- 1659Q489 1698 504 1731T545 1787T605 1824T677 1837Q716 1837 750 1824T811 1788T853 1731T868 1659Q868 1621 853 1589T812 1534T751 1498T677 1485Q639 1485 605 1498T546 1534T505 1589T489 1659ZM578 1659Q578 1616 605 1588T679 1559Q724 1559 751 1587T779
268
- 1659Q779 1704 752 1732T679 1760Q632 1760 605 1732T578 1659Z" />
269
- <glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1858" d="M733 1433H1754V1275H1005L1065 799H1624V647H1084L1145 158H1754V0H982L933 392H377L198 45Q187 25 169 13T124 0H-24L733 1433ZM450 532H915L821 1285Q809 1244 795 1210T766 1144L450 532Z" />
270
- <glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="1370" d="M643 -247Q649 -247 657 -250T676 -258T703 -266T740 -270Q782 -270 803 -254T825 -211Q825 -192 814 -179T783 -157T732 -142T664 -131L700 -13Q561 -1 448 57T256 211T133 435T90 716Q90
271
- 878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216 1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589
272
- 189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Q1200 296 1213 283L1289 200Q1206 103 1090 47T811 -15L795 -70Q885 -90 925 -124T966 -213Q966 -245 950 -270T906 -314T837 -341T749 -351Q708 -351 671 -343T603 -320L620 -265Q626
273
- -247 643 -247Z" />
274
- <glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM468 1782Q500 1782 516 1776T552 1749L763 1546H624Q603 1546 591 1549T562 1565L267 1782H468Z" />
275
- <glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM969 1782L675 1566Q658 1554 645 1550T611 1546H473L684 1749Q694 1759 702 1765T720 1775T740 1780T768 1782H969Z" />
276
- <glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM954 1546H819Q807 1546 793 1549T770 1559L640 1654Q632 1658 628 1662Q620 1656 616 1654L486 1559Q477 1553 463 1550T437
277
- 1546H302L540 1756H716L954 1546Z" />
278
- <glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM526 1666Q526 1644 517 1625T493 1590T458 1567T414 1558Q393 1558 374 1566T339 1590T315 1624T306 1666Q306 1689 315
279
- 1709T339 1745T373 1769T414 1778Q437 1778 457 1769T493 1745T517 1710T526 1666ZM952 1666Q952 1644 943 1625T919 1590T884 1567T842 1558Q819 1558 799 1566T764 1590T741 1624T732 1666Q732 1689 740 1709T764 1745T799 1769T842 1778Q864 1778 884 1769T919
280
- 1745T943 1710T952 1666Z" />
281
- <glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM405 1782Q437 1782 453 1776T489 1749L700 1546H561Q540 1546 528 1549T499 1565L204 1782H405Z" />
282
- <glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM906 1782L612 1566Q595 1554 582 1550T548 1546H410L621 1749Q631 1759 639 1765T657 1775T677 1780T705 1782H906Z" />
283
- <glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM635 1546H500Q488 1546 474 1549T451 1559L321 1654Q313 1658 309 1662Q301 1656 297 1654L167 1559Q158 1553 144 1550T118 1546H-17L221 1756H397L635 1546Z" />
284
- <glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM206 1666Q206 1644 197 1625T173 1590T138 1567T94 1558Q73 1558 54 1566T19 1590T-5 1624T-14 1666Q-14 1689 -5 1709T19 1745T53 1769T94 1778Q117 1778 137 1769T173
285
- 1745T197 1710T206 1666ZM632 1666Q632 1644 623 1625T599 1590T564 1567T522 1558Q499 1558 479 1566T444 1590T421 1624T412 1666Q412 1689 420 1709T444 1745T479 1769T522 1778Q544 1778 564 1769T599 1745T623 1710T632 1666Z" />
286
- <glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="1578" d="M50 780H247V1433H782Q940 1433 1070 1382T1294 1236T1438 1009T1489 716Q1489 555 1438 423T1294 197T1071 52T782 0H247V666H50V780ZM1290 716Q1290 848 1254 952T1152 1128T992 1238T782 1276H441V780H822V666H441V157H782Q898
287
- 157 992 195T1152 304T1254 480T1290 716Z" />
288
- <glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433ZM901 1663Q936
289
- 1663 954 1683T974 1741H1072Q1072 1698 1061 1662T1029 1600T977 1559T906 1544Q871 1544 839 1557T778 1585T722 1614T672 1627Q638 1627 620 1606T600 1548H500Q500 1591 511 1627T544 1690T597 1731T668 1746Q703 1746 735 1733T796 1705T851 1676T901 1663Z"
290
- />
291
- <glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
292
- 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM640 1782Q672 1782 688 1776T724 1749L935 1546H796Q775
293
- 1546 763 1549T734 1565L439 1782H640Z" />
294
- <glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
295
- 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1141 1782L847 1566Q830 1554 817 1550T783 1546H645L856
296
- 1749Q866 1759 874 1765T892 1775T912 1780T940 1782H1141Z" />
297
- <glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
298
- 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1126 1546H991Q979 1546 965 1549T942 1559L812 1654Q804
299
- 1658 800 1662Q792 1656 788 1654L658 1559Q649 1553 635 1550T609 1546H474L712 1756H888L1126 1546Z" />
300
- <glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
301
- 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM921 1663Q956 1663 974 1683T994 1741H1092Q1092 1698 1081
302
- 1662T1049 1600T997 1559T926 1544Q891 1544 859 1557T798 1585T742 1614T692 1627Q658 1627 640 1606T620 1548H520Q520 1591 531 1627T564 1690T617 1731T688 1746Q723 1746 755 1733T816 1705T871 1676T921 1663Z" />
303
- <glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
304
- 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM698 1666Q698 1644 689 1625T665 1590T630 1567T586 1558Q565
305
- 1558 546 1566T511 1590T487 1624T478 1666Q478 1689 487 1709T511 1745T545 1769T586 1778Q609 1778 629 1769T665 1745T689 1710T698 1666ZM1124 1666Q1124 1644 1115 1625T1091 1590T1056 1567T1014 1558Q991 1558 971 1566T936 1590T913 1624T904 1666Q904
306
- 1689 912 1709T936 1745T971 1769T1014 1778Q1036 1778 1056 1769T1091 1745T1115 1710T1124 1666Z" />
307
- <glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="1160" d="M1017 1014L673 670L1027 317L932 221L578 575L221 219L126 315L482 671L137 1016L232 1112L577 766L921 1110L1017 1014Z" />
308
- <glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q690 -15 596 9T423 82L323 -54Q301 -83 272 -96T214 -109H136L327 151Q215 249 154 393T92 716Q92 877 143 1011T287 1243T510 1395T798
309
- 1449Q913 1449 1013 1420T1196 1337L1278 1448Q1298 1475 1314 1486T1362 1498H1462L1290 1263Q1393 1165 1449 1026T1505 716ZM290 716Q290 581 327 476T434 297L1093 1196Q1033 1238 959 1259T798 1281Q683 1281 589 1242T429 1131T326 953T290 716ZM1306 716Q1306
310
- 842 1274 942T1181 1115L526 223Q642 153 798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" />
311
- <glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452
312
- 269T571 185T731 154ZM570 1782Q602 1782 618 1776T654 1749L865 1546H726Q705 1546 693 1549T664 1565L369 1782H570Z" />
313
- <glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452
314
- 269T571 185T731 154ZM1071 1782L777 1566Q760 1554 747 1550T713 1546H575L786 1749Q796 1759 804 1765T822 1775T842 1780T870 1782H1071Z" />
315
- <glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378
316
- 398T452 269T571 185T731 154ZM1056 1546H921Q909 1546 895 1549T872 1559L742 1654Q734 1658 730 1662Q722 1656 718 1654L588 1559Q579 1553 565 1550T539 1546H404L642 1756H818L1056 1546Z" />
317
- <glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378
318
- 398T452 269T571 185T731 154ZM628 1666Q628 1644 619 1625T595 1590T560 1567T516 1558Q495 1558 476 1566T441 1590T417 1624T408 1666Q408 1689 417 1709T441 1745T475 1769T516 1778Q539 1778 559 1769T595 1745T619 1710T628 1666ZM1054 1666Q1054 1644 1045
319
- 1625T1021 1590T986 1567T944 1558Q921 1558 901 1566T866 1590T843 1624T834 1666Q834 1689 842 1709T866 1745T901 1769T944 1778Q966 1778 986 1769T1021 1745T1045 1710T1054 1666Z" />
320
- <glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570ZM971 1782L677
321
- 1566Q660 1554 647 1550T613 1546H475L686 1749Q696 1759 704 1765T722 1775T742 1780T770 1782H971Z" />
322
- <glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="1222" d="M387 272V0H194V1433H387V1169H617Q753 1169 853 1138T1020 1048T1118 908T1151 725Q1151 625 1116 542T1014 399T846 306T617 272H387ZM387 426H617Q700 426 763 448T870 509T935 604T957 725Q957
323
- 862 873 939T617 1016H387V426Z" />
324
- <glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="1218" d="M673 1454Q776 1454 851 1424T976 1348T1048 1246T1072 1140Q1072 1080 1051 1037T997 961T928 903T858 854T805 805T783 747Q783 708 809 682T876 634T962 588T1049 529T1115 443T1142
325
- 314Q1142 236 1114 175T1035 72T918 7T771 -16Q674 -16 595 18T456 107L497 175Q505 188 516 195T545 202Q563 202 583 188T630 157T695 126T786 112Q830 112 865 125T924 162T962 217T975 286Q975 342 947 377T877 437T786 484T695 534T625 604T597 712Q597 765
326
- 619 804T675 875T748 934T820 991T876 1056T899 1140Q899 1172 887 1204T846 1263T774 1305T666 1322Q598 1322 543 1301T448 1238T387 1133T365 986V0H186V992Q186 1096 220 1181T319 1327T473 1421T673 1454Z" />
327
- <glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
328
- 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
329
- 192T311 145T363 118T428 109ZM428 1449Q461 1449 477 1439T507 1405L656 1163H554Q533 1163 520 1169T493 1191L259 1449H428Z" />
330
- <glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
331
- 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
332
- 192T311 145T363 118T428 109ZM818 1449L585 1191Q571 1176 558 1170T523 1163H417L565 1405Q579 1428 595 1438T644 1449H818Z" />
333
- <glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515
334
- 887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263
335
- 221 276 192T311 145T363 118T428 109ZM833 1169H714Q693 1169 674 1183L546 1309L529 1326L513 1309L384 1183Q378 1178 367 1174T344 1169H221L444 1433H610L833 1169Z" />
336
- <glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
337
- 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
338
- 192T311 145T363 118T428 109ZM638 1325Q674 1325 693 1346T714 1411H822Q822 1364 810 1325T774 1257T718 1214T645 1198Q610 1198 580 1212T522 1244T471 1275T424 1290Q352 1290 350 1202H239Q239 1250 252 1289T289 1357T346 1401T418 1417Q453 1417 483 1403T541
339
- 1371T591 1340T638 1325Z" />
340
- <glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515
341
- 887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263
342
- 221 276 192T311 145T363 118T428 109ZM460 1289Q460 1266 451 1246T426 1211T390 1187T346 1178Q324 1178 304 1187T269 1211T244 1246T235 1289Q235 1312 244 1333T268 1369T304 1394T346 1403Q369 1403 389 1394T426 1370T451 1333T460 1289ZM819 1289Q819 1266
343
- 810 1246T786 1211T750 1187T706 1178Q683 1178 663 1187T627 1211T603 1246T594 1289Q594 1312 603 1333T627 1369T662 1394T706 1403Q729 1403 749 1394T785 1370T810 1333T819 1289Z" />
344
- <glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
345
- 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
346
- 192T311 145T363 118T428 109ZM328 1315Q328 1357 344 1391T387 1450T451 1488T527 1502Q568 1502 604 1489T669 1450T713 1391T729 1315Q729 1274 713 1240T669 1182T605 1145T527 1131Q487 1131 451 1144T388 1182T344 1240T328 1315ZM428 1315Q428 1271 455
347
- 1243T529 1215Q574 1215 601 1243T629 1315Q629 1360 602 1388T529 1416Q482 1416 455 1388T428 1315Z" />
348
- <glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="1632" d="M1166 1029Q1248 1029 1318 997T1440 904T1521 756T1551 556Q1551 515 1543 501T1510 486H883Q887 395 910 328T971 215T1062 148T1180 126Q1249 126 1295 140T1371 173T1421 205T1456 220Q1470
349
- 220 1479 216T1494 203L1541 142Q1508 102 1465 73T1372 24T1269 -4T1164 -14Q1047 -14 952 42T801 215Q774 153 731 109T634 37T522 -3T403 -16Q334 -16 277 1T179 54T115 142T92 267Q92 327 125 385T231 489T424 564T715 598V648Q715 766 665 829T515 892Q450
350
- 892 406 875T329 836T273 798T226 780Q208 780 195 789T173 813L141 870Q225 951 315 991T519 1031Q639 1031 712 980T818 838Q872 926 958 977T1166 1029ZM715 486Q592 481 506 464T366 418T288 354T263 276Q263 189 313 149T444 109Q501 109 550 127T636 182T694
351
- 274T715 403V486ZM1159 898Q1098 898 1050 878T968 818T913 723T885 597H1393Q1393 662 1378 717T1332 813T1259 875T1159 898Z" />
352
- <glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="934" d="M400 -247Q406 -247 414 -250T433 -258T460 -266T497 -270Q539 -270 560 -254T582 -211Q582 -192 571 -179T540 -157T489 -142T421 -131L458 -10Q375 1 305 40T183 146T103 303T74 507Q74
353
- 620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775
354
- 208T811 224Q822 224 830 220T845 207L895 142Q836 70 751 33T569 -12L552 -70Q642 -90 682 -124T723 -213Q723 -245 707 -270T663 -314T594 -341T506 -351Q465 -351 428 -343T360 -320L377 -265Q383 -247 400 -247Z" />
355
- <glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
356
- 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM451 1449Q484 1449 500 1439T530 1405L679 1163H577Q556
357
- 1163 543 1169T516 1191L282 1449H451Z" />
358
- <glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
359
- 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM841 1449L608 1191Q594 1176 581 1170T546 1163H440L588
360
- 1405Q602 1428 618 1438T667 1449H841Z" />
361
- <glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904
362
- 207L954 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM856 1169H737Q716 1169 697 1183L569 1309L552
363
- 1326L536 1309L407 1183Q401 1178 390 1174T367 1169H244L467 1433H633L856 1169Z" />
364
- <glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
365
- 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM483 1289Q483 1266 474 1246T449 1211T413 1187T369
366
- 1178Q347 1178 327 1187T292 1211T267 1246T258 1289Q258 1312 267 1333T291 1369T327 1394T369 1403Q392 1403 412 1394T449 1370T474 1333T483 1289ZM842 1289Q842 1266 833 1246T809 1211T773 1187T729 1178Q706 1178 686 1187T650 1211T626 1246T617 1289Q617
367
- 1312 626 1333T650 1369T685 1394T729 1403Q752 1403 772 1394T808 1370T833 1333T842 1289Z" />
368
- <glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM418 1449Q451 1449 467 1439T497 1405L646 1163H544Q523 1163 510 1169T483 1191L249 1449H418Z" />
369
- <glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM808 1449L575 1191Q561 1176 548 1170T513 1163H407L555 1405Q569 1428 585 1438T634 1449H808Z" />
370
- <glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM822 1169H703Q682 1169 663 1183L535 1309L518 1326L502 1309L373 1183Q367 1178 356 1174T333 1169H210L433 1433H599L822 1169Z" />
371
- <glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM450 1289Q450 1266 441 1246T416 1211T380 1187T336 1178Q314 1178 294 1187T259 1211T234 1246T225 1289Q225 1312 234 1333T258 1369T294 1394T336 1403Q359
372
- 1403 379 1394T416 1370T441 1333T450 1289ZM809 1289Q809 1266 800 1246T776 1211T740 1187T696 1178Q673 1178 653 1187T617 1211T593 1246T584 1289Q584 1312 593 1333T617 1369T652 1394T696 1403Q719 1403 739 1394T775 1370T800 1333T809 1289Z" />
373
- <glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="1106" d="M417 1065Q413 1072 411 1078T408 1091Q408 1113 431 1128L534 1200Q489 1220 439 1237T331 1268Q313 1273 301 1286T288 1323Q288 1338 293 1352L313 1414Q409 1398 499 1368T670 1290L837 1412L872
374
- 1355Q880 1342 880 1331Q880 1310 858 1294L761 1227Q821 1178 870 1116T955 977T1009 807T1029 604Q1029 461 998 347T906 153T753 30T541 -13Q443 -13 358 20T211 114T112 265T76 466Q76 560 107 643T196 790T336 890T523 927Q623 927 711 884T865 754Q845 890
375
- 787 985T634 1144L450 1009L417 1065ZM545 125Q616 125 673 152T771 233T835 370T861 564Q845 607 819 647T756 719T669 769T557 788Q482 788 426 763T331 695T274 592T254 464Q254 383 277 320T340 213T432 148T545 125Z" />
376
- <glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146ZM675
377
- 1325Q711 1325 730 1346T751 1411H859Q859 1364 847 1325T811 1257T755 1214T682 1198Q647 1198 617 1212T559 1244T508 1275T461 1290Q389 1290 387 1202H276Q276 1250 289 1289T326 1357T383 1401T455 1417Q490 1417 520 1403T578 1371T628 1340T675 1325Z" />
378
- <glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
379
- 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM458 1449Q491 1449 507 1439T537 1405L686 1163H584Q563 1163 550 1169T523 1191L289 1449H458Z" />
380
- <glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
381
- 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM848 1449L615 1191Q601 1176 588 1170T553 1163H447L595 1405Q609 1428 625 1438T674 1449H848Z" />
382
- <glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
383
- 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM863 1169H744Q723 1169 704 1183L576 1309L559 1326L543 1309L414 1183Q408 1178 397 1174T374 1169H251L474 1433H640L863
384
- 1169Z" />
385
- <glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
386
- 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM668 1325Q704 1325 723 1346T744 1411H852Q852 1364 840 1325T804 1257T748 1214T675 1198Q640 1198 610 1212T552 1244T501
387
- 1275T454 1290Q382 1290 380 1202H269Q269 1250 282 1289T319 1357T376 1401T448 1417Q483 1417 513 1403T571 1371T621 1340T668 1325Z" />
388
- <glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
389
- 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM490 1289Q490 1266 481 1246T456 1211T420 1187T376 1178Q354 1178 334 1187T299 1211T274 1246T265 1289Q265 1312
390
- 274 1333T298 1369T334 1394T376 1403Q399 1403 419 1394T456 1370T481 1333T490 1289ZM849 1289Q849 1266 840 1246T816 1211T780 1187T736 1178Q713 1178 693 1187T657 1211T633 1246T624 1289Q624 1312 633 1333T657 1369T692 1394T736 1403Q759 1403 779 1394T815
391
- 1370T840 1333T849 1289Z" />
392
- <glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="1160" d="M100 739H1058V604H100V739ZM454 1026Q454 1052 463 1075T489 1115T528 1142T578 1152Q604 1152 626 1142T666 1115T693 1075T703 1026Q703 999 693 977T666 937T627 911T578 901Q551 901 529
393
- 910T490 937T464 976T454 1026ZM454 314Q454 340 463 363T489 403T528 430T578 440Q604 440 626 430T666 403T693 363T703 314Q703 287 693 265T666 225T627 199T578 189Q551 189 529 198T490 225T464 264T454 314Z" />
394
- <glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="1112" d="M912 884Q973 816 1006 721T1039 507Q1039 387 1006 291T910 127T758 23T557 -14Q481 -14 416 3T296 52L241 -22Q219 -51 190 -63T131 -76H64L209 120Q143 189 108 286T73 507Q73 626 107 722T204
395
- 887T356 992T557 1029Q636 1029 703 1010T827 956L895 1047Q915 1074 931 1085T979 1097H1069L912 884ZM246 506Q246 346 305 249L741 839Q668 895 557 895Q481 895 423 868T326 791T266 669T246 506ZM557 120Q632 120 689 146T786 223T846 344T866 506Q866 657
396
- 814 753L381 168Q451 120 557 120Z" />
397
- <glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM452 1449Q485
398
- 1449 501 1439T531 1405L680 1163H578Q557 1163 544 1169T517 1191L283 1449H452Z" />
399
- <glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM842 1449L609
400
- 1191Q595 1176 582 1170T547 1163H441L589 1405Q603 1428 619 1438T668 1449H842Z" />
401
- <glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM857
402
- 1169H738Q717 1169 698 1183L570 1309L553 1326L537 1309L408 1183Q402 1178 391 1174T368 1169H245L468 1433H634L857 1169Z" />
403
- <glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM484
404
- 1289Q484 1266 475 1246T450 1211T414 1187T370 1178Q348 1178 328 1187T293 1211T268 1246T259 1289Q259 1312 268 1333T292 1369T328 1394T370 1403Q393 1403 413 1394T450 1370T475 1333T484 1289ZM843 1289Q843 1266 834 1246T810 1211T774 1187T730 1178Q707
405
- 1178 687 1187T651 1211T627 1246T618 1289Q618 1312 627 1333T651 1369T686 1394T730 1403Q753 1403 773 1394T809 1370T834 1333T843 1289Z" />
406
- <glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443
407
- -299ZM825 1449L592 1191Q578 1176 565 1170T530 1163H424L572 1405Q586 1428 602 1438T651 1449H825Z" />
408
- <glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="1104" d="M146 -343V1473H324V866Q387 940 469 984T656 1029Q743 1029 814 996T935 898T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q507 -14 441 20T324 118V-343H146ZM597 887Q510
409
- 887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" />
410
- <glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443
411
- -299ZM467 1289Q467 1266 458 1246T433 1211T397 1187T353 1178Q331 1178 311 1187T276 1211T251 1246T242 1289Q242 1312 251 1333T275 1369T311 1394T353 1403Q376 1403 396 1394T433 1370T458 1333T467 1289ZM826 1289Q826 1266 817 1246T793 1211T757 1187T713
412
- 1178Q690 1178 670 1187T634 1211T610 1246T601 1289Q601 1312 610 1333T634 1369T669 1394T713 1403Q736 1403 756 1394T792 1370T817 1333T826 1289Z" />
413
- <glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="1112" d="M156 655H956V525H156V655Z" />
414
- <glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="1642" d="M156 655H1486V525H156V655Z" />
415
- <glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="424" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219 210
416
- 1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012Z" />
417
- <glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="424" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301 175
418
- 1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508Z" />
419
- <glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="424" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142
420
- 140Q135 151 135 162Q135 186 162 197L271 241Z" />
421
- <glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="728" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219
422
- 210 1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012ZM418 1012Q389 1060 376 1108T362 1205Q362 1295 406 1377T531 1529L586 1495Q594 1490 596 1484T599 1472Q599 1458 589 1448Q573 1428 558 1406T531 1360T512 1308T505 1251Q505 1219 514 1185T547
423
- 1113Q554 1102 554 1090Q554 1066 527 1056L418 1012Z" />
424
- <glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="728" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301
425
- 175 1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508ZM575 1508Q604 1460 617 1412T630 1316Q630 1225 586 1143T462 991L407 1025Q399 1030 397 1036T394 1048Q394 1062 404 1072Q420 1091 435 1113T462 1160T481 1212T488 1269Q488 1301 479 1335T446
426
- 1407Q439 1418 439 1429Q439 1453 466 1464L575 1508Z" />
427
- <glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="728" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142 140Q135
428
- 151 135 162Q135 186 162 197L271 241ZM575 241Q604 193 617 145T630 49Q630 -42 586 -124T462 -276L407 -242Q399 -237 397 -231T394 -219Q394 -205 404 -195Q420 -176 435 -154T462 -107T481 -55T488 2Q488 34 479 68T446 140Q439 151 439 162Q439 186 466 197L575
429
- 241Z" />
430
- <glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="1160" d="M208 595Q208 672 237 740T317 858T434 938T578 968Q655 968 723 939T841 859T921 740T951 595Q951 518 922 451T842 333T723 254T578 224Q502 224 435 253T317 333T238 450T208 595Z" />
431
- <glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="632" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138 518Z" />
432
- <glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="632" d="M485 541V518L236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541Z" />
433
- </font>
434
- </defs>
435
- </svg>
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 xmlns="http://www.w3.org/2000/svg">
4
+ <defs >
5
+ <font id="Lato" horiz-adv-x="1042" ><font-face
6
+ font-family="Lato"
7
+ units-per-em="2000"
8
+ panose-1="2 15 5 2 2 2 4 3 2 3"
9
+ ascent="1974"
10
+ descent="-426"
11
+ alphabetic="0" />
12
+ <glyph unicode=" " glyph-name="space" horiz-adv-x="386" />
13
+ <glyph unicode="!" glyph-name="exclam" horiz-adv-x="686" d="M430 1433V861Q430 816 429 773T424 687T417 598T406 500H285Q279 552 275 597T267 686T263 773T261 861V1433H430ZM218 110Q218 136 227 159T253 199T293 226T342 236Q368 236 391 226T431 199T457
14
+ 159T467 110Q467 83 458 61T431 21T391 -5T342 -15Q316 -15 293 -6T254 21T228 60T218 110Z" />
15
+ <glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="794" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307ZM640 1433V1143L624 988Q621 956 607 939T562 921Q536 921 522 938T501 988L485 1143V1433H640Z" />
16
+ <glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1160" d="M790 423L706 0H625Q602 0 586 17T570 61Q570 65 570 68T572 77L643 423H396L325 68Q317 31 295 16T243 0H164L249 423H103Q80 423 67 434T54 474Q54 479 54 485T56 497L64 554H268L333 880H101L114
17
+ 954Q119 983 137 997T194 1011H352L424 1369Q430 1399 451 1416T503 1433H583L499 1011H746L830 1433H909Q934 1433 950 1418T967 1379Q967 1371 966 1366L893 1011H1105L1092 936Q1087 907 1069 894T1012 880H874L809 554H988Q1012 554 1025 543T1038 502Q1038
18
+ 497 1038 492T1036 480L1027 423H790ZM415 554H662L727 880H480L415 554Z" />
19
+ <glyph unicode="$" glyph-name="dollar" horiz-adv-x="1160" d="M498 -12Q377 -1 278 47T106 171L159 253Q166 264 179 271T206 278Q225 278 249 259T308 216T391 168T508 137L545 668Q475 689 408 715T287 784T201 891T168 1053Q168 1126 196 1195T279 1319T414
20
+ 1407T598 1446L608 1590Q610 1609 623 1624T658 1639H724L710 1441Q815 1428 891 1387T1027 1288L984 1222Q964 1192 938 1192Q924 1192 904 1204T854 1233T787 1266T700 1290L667 806Q739 784 809 758T935 691T1025 589T1060 435Q1060 345 1030 266T943 127T802
21
+ 30T611 -14L599 -190Q597 -209 584 -223T549 -238H483L498 -12ZM891 407Q891 457 873 493T822 555T747 600T655 635L621 137Q686 143 736 165T821 223T873 304T891 407ZM336 1071Q336 1023 353 988T400 925T470 878T557 842L587 1293Q522 1287 475 1267T397 1217T351
22
+ 1150T336 1071Z" />
23
+ <glyph unicode="%" glyph-name="percent" horiz-adv-x="1572" d="M707 1087Q707 1003 681 937T612 825T510 755T389 731Q321 731 264 755T163 824T96 936T72 1087Q72 1173 96 1240T163 1353T263 1423T389 1447Q456 1447 514 1423T615 1353T682 1240T707 1087ZM568
24
+ 1087Q568 1153 554 1199T516 1274T459 1317T389 1330Q352 1330 320 1317T263 1275T226 1199T212 1087Q212 1022 225 977T263 903T319 862T389 849Q426 849 458 861T515 902T554 976T568 1087ZM1208 1397Q1221 1414 1235 1423T1274 1433H1402L355 29Q345 16 331
25
+ 8T298 0H166L1208 1397ZM1499 338Q1499 254 1473 188T1404 77T1303 7T1182 -17Q1114 -17 1057 7T956 76T889 188T865 338Q865 424 889 491T956 605T1056 675T1182 699Q1249 699 1307 675T1408 605T1475 492T1499 338ZM1361 338Q1361 404 1347 450T1309 526T1252
26
+ 568T1182 581Q1145 581 1113 568T1056 526T1019 451T1005 338Q1005 273 1018 228T1056 155T1112 114T1182 101Q1219 101 1251 113T1308 154T1347 228T1361 338Z" />
27
+ <glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="1406" d="M660 1449Q739 1449 804 1424T916 1356T991 1259T1023 1143L912 1121Q907 1120 903 1120Q890 1120 879 1127T862 1152Q855 1178 840 1206T800 1257T741 1295T660 1310Q610 1310 570 1294T502
28
+ 1250T458 1183T442 1099Q442 1064 450 1032T476 968T520 901T585 828L997 409Q1035 476 1057 549T1088 697Q1090 716 1100 727T1128 738H1238Q1236 623 1201 512T1100 304L1400 0H1228Q1199 0 1181 7T1141 36L997 181Q903 90 781 37T511 -16Q431 -16 354 11T217
29
+ 89T119 215T82 382Q82 452 105 514T170 630T269 725T394 797Q333 874 304 947T275 1098Q275 1171 301 1235T378 1346T499 1421T660 1449ZM263 396Q263 331 287 282T350 198T439 147T541 129Q653 129 742 170T899 279L476 706Q370 649 317 570T263 396Z" />
30
+ <glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="460" d="M307 1433V1143L291 988Q288 956 274 939T229 921Q203 921 189 938T168 988L152 1143V1433H307Z" />
31
+ <glyph unicode="(" glyph-name="parenleft" horiz-adv-x="600" d="M289 629Q289 415 344 214T503 -171Q509 -182 511 -190T513 -206Q513 -220 506 -229T488 -245L409 -293Q334 -178 282 -65T197 162T149 391T134 629Q134 750 149 866T196 1095T281 1322T409 1551L488
32
+ 1502Q499 1495 506 1486T513 1463Q513 1448 503 1429Q398 1247 344 1045T289 629Z" />
33
+ <glyph unicode=")" glyph-name="parenright" horiz-adv-x="600" d="M298 629Q298 843 244 1045T84 1429Q74 1448 74 1463Q74 1477 81 1486T99 1502L178 1551Q253 1435 305 1322T390 1096T438 866T453 629Q453 507 438 392T391 162T306 -65T178 -293L99 -245Q88
34
+ -238 81 -229T74 -206Q74 -198 76 -190T84 -171Q188 12 243 213T298 629Z" />
35
+ <glyph unicode="*" glyph-name="asterisk" horiz-adv-x="800" d="M354 863V1060Q354 1079 356 1096T366 1129Q346 1104 313 1084L141 985L97 1060L269 1160Q305 1181 342 1184Q322 1186 305 1191T269 1209L96 1310L140 1385L313 1285Q348 1265 370 1233Q361 1251
36
+ 358 1269T354 1308V1506H442V1309Q442 1268 428 1237Q439 1252 452 1263T483 1285L655 1384L699 1309L527 1209Q510 1198 494 1192T459 1184Q477 1182 493 1177T527 1160L700 1059L656 984L483 1084Q465 1095 451 1106T426 1133Q442 1100 442 1061V863H354Z" />
37
+ <glyph unicode="+" glyph-name="plus" horiz-adv-x="1160" d="M651 1166V739H1058V604H651V174H505V604H100V739H505V1166H651Z" />
38
+ <glyph unicode="," glyph-name="comma" horiz-adv-x="424" d="M94 123Q94 146 102 166T126 202T164 227T212 236Q242 236 265 225T304 195T328 150T336 94Q336 49 323 1T286 -95T227 -188T146 -271L116 -242Q103 -230 103 -214Q103 -201 117 -187Q127 -176 142
39
+ -158T174 -115T203 -62T223 0H210Q184 0 163 9T127 34T103 73T94 123Z" />
40
+ <glyph unicode="-" glyph-name="hyphen" horiz-adv-x="694" d="M100 675H594V524H100V675Z" />
41
+ <glyph unicode="." glyph-name="period" horiz-adv-x="424" d="M88 110Q88 136 97 159T123 199T163 226T212 236Q238 236 261 226T301 199T327 159T337 110Q337 83 328 61T301 21T261 -5T212 -15Q186 -15 163 -6T124 21T98 60T88 110Z" />
42
+ <glyph unicode="/" glyph-name="slash" horiz-adv-x="746" d="M161 -21Q147 -56 120 -73T63 -90H-12L589 1407Q602 1439 626 1456T683 1473H758L161 -21Z" />
43
+ <glyph unicode="0" glyph-name="zero" horiz-adv-x="1160" d="M1100 716Q1100 528 1060 391T949 163T784 29T579 -15Q469 -15 375 29T210 163T100 390T60 716Q60 904 100 1042T210 1270T374 1405T579 1449Q688 1449 783 1405T949 1271T1059 1042T1100 716ZM915
44
+ 716Q915 880 888 991T814 1171T706 1268T579 1298Q513 1298 452 1269T345 1171T272 992T244 716Q244 552 271 441T345 262T452 165T579 135Q645 135 706 164T813 262T887 441T915 716Z" />
45
+ <glyph unicode="1" glyph-name="one" horiz-adv-x="1160" d="M287 136H595V1113Q595 1157 598 1202L342 983Q332 975 322 972T303 968Q288 968 276 974T258 990L202 1067L628 1436H773V136H1055V0H287V136Z" />
46
+ <glyph unicode="2" glyph-name="two" horiz-adv-x="1160" d="M601 1449Q692 1449 771 1422T907 1344T998 1218T1031 1050Q1031 970 1007 902T942 772T848 651T734 531L357 145Q397 156 438 162T517 169H997Q1026 169 1043 152T1060 108V0H104V61Q104 80 111 100T136
47
+ 137L595 598Q652 656 699 709T779 817T831 926T849 1045Q849 1108 829 1155T774 1234T692 1280T591 1296Q537 1296 491 1280T410 1236T350 1168T315 1082Q307 1053 291 1040T249 1027Q244 1027 239 1027T226 1029L133 1045Q147 1143 187 1218T288 1345T429 1422T601
48
+ 1449Z" />
49
+ <glyph unicode="3" glyph-name="three" horiz-adv-x="1160" d="M620 1449Q711 1449 788 1423T920 1349T1007 1233T1038 1082Q1038 1014 1021 961T971 867T892 798T789 753Q929 716 999 629T1070 411Q1070 312 1033 233T930 99T779 14T593 -16Q479 -16 398 12T261
50
+ 91T169 209T108 358L184 390Q205 399 226 399Q246 399 261 391T285 364Q287 360 289 356T293 346Q307 317 327 281T381 212T465 158T591 136Q666 136 722 160T816 224T873 311T892 406Q892 464 877 512T821 595T709 650T525 670V799Q616 800 680 819T786 871T845
51
+ 950T864 1052Q864 1114 845 1160T791 1236T711 1281T610 1296Q556 1296 510 1280T429 1236T369 1168T333 1082Q325 1053 309 1040T268 1027Q263 1027 258 1027T245 1029L152 1045Q166 1143 206 1218T307 1345T448 1422T620 1449Z" />
52
+ <glyph unicode="4" glyph-name="four" horiz-adv-x="1160" d="M903 517H1120V415Q1120 399 1111 388T1081 377H903V0H746V377H111Q91 377 77 388T58 417L40 508L737 1433H903V517ZM746 1108Q746 1134 747 1164T754 1226L233 517H746V1108Z" />
53
+ <glyph unicode="5" glyph-name="five" horiz-adv-x="1160" d="M978 1355Q978 1317 954 1293T873 1268H423L357 892Q469 916 564 916Q676 916 761 883T905 792T992 655T1022 483Q1022 369 982 277T873 120T709 19T506 -16Q443 -16 385 -4T277 30T184 78T108 135L162
54
+ 211Q180 237 210 237Q229 237 254 222T316 187T400 153T516 137Q591 137 651 161T753 229T819 336T842 475Q842 542 823 596T764 688T665 747T527 768Q473 768 415 759T295 730L183 763L299 1433H978V1355Z" />
55
+ <glyph unicode="6" glyph-name="six" horiz-adv-x="1160" d="M650 878Q736 878 813 850T948 767T1040 633T1074 451Q1074 352 1038 267T938 119T782 20T582 -16Q474 -16 387 18T237 116T142 270T108 473Q108 567 150 673T283 901L646 1390Q660 1408 685 1420T742
56
+ 1433H900L403 804Q454 839 516 858T650 878ZM280 442Q280 373 300 316T358 218T452 155T579 132Q651 132 709 155T808 219T872 316T895 438Q895 508 873 564T811 660T715 721T592 742Q520 742 462 718T364 652T302 556T280 442Z" />
57
+ <glyph unicode="7" glyph-name="seven" horiz-adv-x="1160" d="M1084 1433V1353Q1084 1319 1077 1297T1061 1260L468 63Q455 37 432 19T370 0H243L845 1182Q858 1207 871 1228T902 1268H154Q137 1268 124 1281T110 1312V1433H1084Z" />
58
+ <glyph unicode="8" glyph-name="eight" horiz-adv-x="1160" d="M579 -16Q472 -16 383 12T230 94T131 222T96 392Q96 530 168 619T374 747Q261 789 204 872T146 1072Q146 1151 177 1220T265 1340T401 1420T579 1449Q676 1449 756 1420T893 1340T981 1220T1012 1072Q1012
59
+ 956 954 873T784 747Q918 709 990 620T1062 392Q1062 298 1027 223T928 94T775 13T579 -16ZM579 126Q649 126 704 145T798 200T857 285T878 395Q878 469 854 521T788 607T692 655T579 671Q520 671 466 656T371 607T305 522T280 395Q280 335 300 286T359 201T453
60
+ 146T579 126ZM579 814Q649 814 698 835T779 892T824 974T838 1069Q838 1119 822 1163T773 1240T692 1292T579 1311Q515 1311 467 1292T386 1240T337 1163T320 1069Q320 1020 334 974T379 893T459 836T579 814Z" />
61
+ <glyph unicode="9" glyph-name="nine" horiz-adv-x="1160" d="M549 588Q468 588 396 615T268 694T181 823T148 999Q148 1093 183 1175T281 1318T431 1414T622 1449Q725 1449 809 1415T953 1320T1045 1174T1078 986Q1078 924 1067 869T1033 760T981 655T911 546L562
62
+ 42Q549 23 525 12T470 0H306L742 571Q764 600 783 626T819 678Q764 634 695 611T549 588ZM907 1007Q907 1074 886 1128T826 1221T736 1279T620 1300Q554 1300 500 1279T407 1219T347 1128T326 1012Q326 944 345 891T401 800T490 744T608 725Q680 725 735 748T829
63
+ 811T887 901T907 1007Z" />
64
+ <glyph unicode=":" glyph-name="colon" horiz-adv-x="504" d="M128 110Q128 136 137 159T163 199T203 226T252 236Q278 236 301 226T341 199T367 159T377 110Q377 83 368 61T341 21T301 -5T252 -15Q226 -15 203 -6T164 21T138 60T128 110ZM128 860Q128 886 137
65
+ 909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z" />
66
+ <glyph unicode=";" glyph-name="semicolon" horiz-adv-x="504" d="M134 123Q134 146 142 166T166 202T204 227T252 236Q282 236 305 225T344 195T368 150T376 94Q376 49 363 1T326 -95T267 -188T186 -271L156 -242Q143 -230 143 -214Q143 -201 157 -187Q167 -176
67
+ 182 -158T214 -115T243 -62T263 0H250Q224 0 203 9T167 34T143 73T134 123ZM128 860Q128 886 137 909T163 949T203 976T252 986Q278 986 301 976T341 949T367 909T377 860Q377 833 368 811T341 771T301 745T252 735Q226 735 203 744T164 771T138 810T128 860Z"
68
+ />
69
+ <glyph unicode="&lt;" glyph-name="less" horiz-adv-x="1160" d="M148 710L922 1111V984Q922 967 914 955T886 932L437 704Q417 693 395 686T347 672Q372 667 394 659T437 641L886 414Q906 404 914 391T922 362V234L148 636V710Z" />
70
+ <glyph unicode="=" glyph-name="equal" horiz-adv-x="1160" d="M150 574H1009V439H150V574ZM150 909H1009V774H150V909Z" />
71
+ <glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="1160" d="M238 234V362Q238 378 246 391T274 414L723 641Q743 651 764 659T811 672Q786 678 765 685T723 704L274 932Q254 942 246 954T238 984V1111L1011 710V636L238 234Z" />
72
+ <glyph unicode="?" glyph-name="question" horiz-adv-x="796" d="M34 1305Q65 1334 102 1360T184 1406T280 1437T392 1449Q471 1449 538 1426T655 1361T732 1259T760 1124Q760 1048 738 993T681 897T605 825T529 767T468 713T438 653L420 500H298L286 666V677Q286
73
+ 719 308 751T365 812T439 869T513 932T570 1011T593 1115Q593 1158 576 1193T530 1252T462 1290T377 1303Q316 1303 273 1288T199 1255T151 1222T120 1207Q95 1207 81 1230L34 1305ZM230 110Q230 136 239 159T265 199T305 226T354 236Q380 236 403 226T443 199T469
74
+ 159T479 110Q479 83 470 61T443 21T403 -5T354 -15Q328 -15 305 -6T266 21T240 60T230 110Z" />
75
+ <glyph unicode="@" glyph-name="at" horiz-adv-x="1644" d="M1167 186Q1089 186 1040 223T978 339Q920 258 852 223T706 188Q646 188 602 208T529 265T485 352T470 460Q470 545 502 631T599 787T758 901T979 945Q1046 945 1096 935T1192 904L1099 543Q1080 468
76
+ 1080 419Q1080 383 1089 360T1113 323T1149 304T1193 299Q1242 299 1286 327T1363 406T1416 528T1436 687Q1436 825 1392 929T1270 1102T1087 1206T859 1241Q725 1241 608 1190T404 1049T267 836T217 568Q217 398 270 270T416 54T633 -77T901 -121Q1053 -121 1169
77
+ -88T1371 -4Q1386 5 1398 5Q1419 5 1429 -19L1454 -85Q1347 -157 1211 -198T901 -239Q728 -239 579 -184T321 -26T149 228T86 568Q86 677 113 778T191 966T311 1126T467 1250T652 1330T859 1359Q951 1359 1039 1339T1205 1280T1350 1184T1463 1052T1537 886T1564
78
+ 687Q1564 579 1534 488T1450 329T1324 224T1167 186ZM741 306Q772 306 803 316T864 351T918 419T960 527L1036 822Q997 831 951 831Q876 831 814 800T706 717T636 600T610 465Q610 393 643 350T741 306Z" />
79
+ <glyph unicode="A" glyph-name="A" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532Z" />
80
+ <glyph unicode="B" glyph-name="B" horiz-adv-x="1294" d="M174 0V1433H631Q763 1433 858 1407T1015 1333T1106 1216T1136 1059Q1136 1006 1120 957T1070 866T986 791T867 737Q1024 706 1104 624T1184 408Q1184 317 1151 242T1053 113T895 30T681 0H174ZM368 653V154H678Q761
81
+ 154 820 173T918 226T975 308T993 413Q993 524 915 588T677 653H368ZM368 791H624Q706 791 766 809T865 859T924 936T943 1036Q943 1162 867 1221T631 1280H368V791Z" />
82
+ <glyph unicode="C" glyph-name="C" horiz-adv-x="1370" d="M1184 296Q1200 296 1213 283L1289 200Q1201 98 1076 41T773 -16Q618 -16 492 37T277 187T139 419T90 716Q90 878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216
83
+ 1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589 189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Z" />
84
+ <glyph unicode="D" glyph-name="D" horiz-adv-x="1506" d="M1416 716Q1416 555 1365 423T1221 197T998 52T710 0H174V1433H710Q868 1433 998 1382T1221 1236T1365 1009T1416 716ZM1217 716Q1217 848 1181 952T1079 1128T919 1238T710 1276H369V157H710Q825 157
85
+ 919 195T1079 304T1181 480T1217 716Z" />
86
+ <glyph unicode="E" glyph-name="E" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057Z" />
87
+ <glyph unicode="F" glyph-name="F" horiz-adv-x="1132" d="M1057 1433V1275H369V774H957V616H369V0H174V1433H1057Z" />
88
+ <glyph unicode="G" glyph-name="G" horiz-adv-x="1468" d="M813 141Q871 141 919 146T1011 163T1092 189T1168 225V541H946Q927 541 916 552T904 579V689H1344V139Q1290 100 1232 71T1107 23T964 -6T799 -16Q643 -16 513 37T289 187T143 419T90 716Q90 880 141
89
+ 1015T288 1246T519 1396T823 1449Q908 1449 981 1437T1116 1401T1232 1344T1331 1268L1276 1180Q1259 1153 1232 1153Q1216 1153 1197 1164Q1172 1178 1141 1198T1066 1236T961 1268T817 1281Q696 1281 598 1242T431 1129T325 951T288 716Q288 580 326 474T435
90
+ 293T601 180T813 141Z" />
91
+ <glyph unicode="H" glyph-name="H" horiz-adv-x="1512" d="M1336 0H1141V652H369V0H174V1433H369V794H1141V1433H1336V0Z" />
92
+ <glyph unicode="I" glyph-name="I" horiz-adv-x="614" d="M404 0H210V1433H404V0Z" />
93
+ <glyph unicode="J" glyph-name="J" horiz-adv-x="888" d="M713 495Q713 375 684 280T597 120T455 19T262 -16Q165 -16 60 12Q62 41 65 69T71 126Q73 143 83 153T115 164Q133 164 163 155T243 146Q309 146 360 166T447 228T501 335T520 491V1433H713V495Z" />
94
+ <glyph unicode="K" glyph-name="K" horiz-adv-x="1362" d="M387 805H460Q498 805 520 814T563 847L1040 1387Q1062 1412 1082 1422T1135 1433H1300L754 816Q733 793 715 777T675 751Q703 742 724 724T768 679L1338 0H1170Q1151 0 1138 3T1116 11T1098 24T1082
95
+ 41L587 610Q576 622 567 630T545 645T516 653T475 656H387V0H194V1433H387V805Z" />
96
+ <glyph unicode="L" glyph-name="L" horiz-adv-x="1028" d="M368 163H988V0H174V1433H368V163Z" />
97
+ <glyph unicode="M" glyph-name="M" horiz-adv-x="1840" d="M879 518Q893 494 903 468T924 414Q934 442 945 467T970 519L1455 1400Q1468 1423 1482 1428T1522 1433H1665V0H1495V1053Q1495 1074 1496 1098T1499 1147L1008 251Q983 206 938 206H910Q865 206 840
98
+ 251L338 1150Q341 1124 342 1099T344 1053V0H174V1433H317Q343 1433 357 1428T384 1400L879 518V518Z" />
99
+ <glyph unicode="N" glyph-name="N" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433Z" />
100
+ <glyph unicode="O" glyph-name="O" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306
101
+ 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" />
102
+ <glyph unicode="P" glyph-name="P" horiz-adv-x="1222" d="M387 536V0H194V1433H617Q753 1433 853 1402T1020 1312T1118 1172T1151 989Q1151 889 1116 806T1014 663T846 570T617 536H387ZM387 690H617Q700 690 763 712T870 773T935 868T957 989Q957 1126 873 1203T617
103
+ 1280H387V690Z" />
104
+ <glyph unicode="Q" glyph-name="Q" horiz-adv-x="1596" d="M1505 716Q1505 615 1485 524T1425 355T1330 212T1204 101L1572 -296H1412Q1376 -296 1348 -286T1297 -251L1045 23Q988 5 927 -5T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287
105
+ 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270
106
+ 479T1306 716Z" />
107
+ <glyph unicode="R" glyph-name="R" horiz-adv-x="1288" d="M387 598V0H194V1433H599Q735 1433 834 1406T997 1326T1093 1201T1124 1036Q1124 960 1100 894T1031 776T920 686T771 630Q807 609 835 569L1253 0H1081Q1028 0 1003 41L631 553Q614 577 594 587T534
108
+ 598H387ZM387 739H590Q675 739 739 759T847 817T913 907T935 1022Q935 1150 851 1215T599 1280H387V739Z" />
109
+ <glyph unicode="S" glyph-name="S" horiz-adv-x="1060" d="M908 1209Q899 1194 889 1187T863 1179Q846 1179 824 1196T767 1233T684 1271T566 1288Q501 1288 451 1271T368 1223T317 1153T300 1065Q300 1005 329 966T407 898T517 850T643 807T769 758T879 688T957
110
+ 585T987 435Q987 341 955 259T862 115T711 19T507 -16Q368 -16 254 34T58 171L114 263Q122 274 133 281T159 289Q180 289 207 267T274 217T372 168T513 145Q582 145 636 164T727 217T785 300T805 407Q805 472 776 513T698 583T589 630T463 670T337 718T227 788T150
111
+ 895T120 1055Q120 1131 149 1202T235 1328T373 1416T563 1449Q683 1449 782 1411T955 1301L908 1209Z" />
112
+ <glyph unicode="T" glyph-name="T" horiz-adv-x="1180" d="M1150 1433V1270H687V0H493V1270H28V1433H1150Z" />
113
+ <glyph unicode="U" glyph-name="U" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452 269T571
114
+ 185T731 154Z" />
115
+ <glyph unicode="V" glyph-name="V" horiz-adv-x="1360" d="M8 1433H163Q189 1433 205 1420T229 1387L634 376Q648 342 659 302T682 219Q691 262 701 302T726 376L1129 1387Q1136 1404 1153 1418T1195 1433H1351L767 0H592L8 1433Z" />
116
+ <glyph unicode="W" glyph-name="W" horiz-adv-x="2038" d="M14 1433H175Q201 1433 218 1420T241 1387L537 391Q545 364 551 333T564 268Q571 302 578 333T594 391L931 1387Q937 1404 954 1418T997 1433H1053Q1079 1433 1095 1420T1119 1387L1454 391Q1472 339
117
+ 1486 272Q1492 305 1497 335T1510 391L1807 1387Q1812 1405 1829 1419T1872 1433H2023L1576 0H1402L1039 1093Q1028 1124 1019 1165Q1014 1145 1010 1127T1000 1093L635 0H461L14 1433Z" />
118
+ <glyph unicode="X" glyph-name="X" horiz-adv-x="1286" d="M507 736L34 1433H227Q248 1433 258 1426T276 1406L650 832Q657 853 671 878L1024 1402Q1033 1416 1043 1424T1069 1433H1254L779 745L1270 0H1078Q1056 0 1044 11T1023 37L639 638Q632 617 621 598L247
119
+ 37Q238 23 227 12T194 0H14L507 736Z" />
120
+ <glyph unicode="Y" glyph-name="Y" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570Z" />
121
+ <glyph unicode="Z" glyph-name="Z" horiz-adv-x="1248" d="M1172 1433V1361Q1172 1327 1151 1297L340 158H1158V0H86V76Q86 106 105 133L917 1275H124V1433H1172Z" />
122
+ <glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="600" d="M142 -289V1533H510V1463Q510 1441 497 1429T461 1416H292V-171H461Q483 -171 496 -183T510 -219V-289H142Z" />
123
+ <glyph unicode="\" glyph-name="backslash" horiz-adv-x="750" d="M-20 1473H56Q89 1473 113 1456T150 1407L751 -90H676Q647 -90 619 -73T578 -21L-20 1473Z" />
124
+ <glyph unicode="]" glyph-name="bracketright" horiz-adv-x="600" d="M90 -219Q90 -199 103 -185T139 -171H308V1416H139Q117 1416 104 1429T90 1463V1533H458V-289H90V-219Z" />
125
+ <glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1160" d="M516 1433H631L989 787H860Q843 787 831 797T811 821L615 1173Q602 1196 593 1217T576 1260Q562 1216 539 1173L345 821Q337 807 326 797T294 787H158L516 1433Z" />
126
+ <glyph unicode="_" glyph-name="underscore" horiz-adv-x="788" d="M788 -165V-285H0V-165H788Z" />
127
+ <glyph unicode="`" glyph-name="grave" horiz-adv-x="614" d="M207 1449Q240 1449 256 1439T286 1405L435 1163H333Q312 1163 299 1169T272 1191L38 1449H207Z" />
128
+ <glyph unicode="a" glyph-name="a" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450 887
129
+ 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276 192T311
130
+ 145T363 118T428 109Z" />
131
+ <glyph unicode="b" glyph-name="b" horiz-adv-x="1118" d="M152 0V1473H331V867Q394 940 475 984T662 1029Q750 1029 821 996T942 898T1019 736T1046 513Q1046 401 1016 305T930 138T792 27T608 -14Q510 -14 442 24T322 130L313 38Q305 0 267 0H152ZM604 887Q517
132
+ 887 452 847T331 734V244Q379 178 437 151T568 124Q710 124 786 225T862 513Q862 612 845 683T794 799T713 866T604 887Z" />
133
+ <glyph unicode="c" glyph-name="c" horiz-adv-x="934" d="M837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775 208T811
134
+ 224Q834 224 845 207L895 142Q829 61 730 24T521 -14Q426 -14 345 21T203 122T109 286T74 507Q74 620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Z" />
135
+ <glyph unicode="d" glyph-name="d" horiz-adv-x="1118" d="M859 0Q821 0 811 37L795 160Q730 81 647 34T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q603 1031 669 1000T787 911V1473H965V0H859ZM514 130Q601 130
136
+ 666 170T787 283V773Q738 839 680 865T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" />
137
+ <glyph unicode="e" glyph-name="e" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954 142Q921
138
+ 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898Z" />
139
+ <glyph unicode="f" glyph-name="f" horiz-adv-x="674" d="M186 0V861L74 874Q53 879 40 889T26 920V993H186V1091Q186 1178 210 1245T280 1359T390 1430T534 1454Q602 1454 660 1434L656 1345Q655 1325 639 1321T594 1317H563Q517 1317 480 1305T415 1266T374
140
+ 1195T359 1086V993H652V864H365V0H186Z" />
141
+ <glyph unicode="g" glyph-name="g" horiz-adv-x="1022" d="M487 1030Q553 1030 610 1016T715 973H990V907Q990 874 948 865L833 849Q867 784 867 704Q867 630 839 570T760 466T640 400T487 377Q416 377 353 394Q321 374 305 351T288 306Q288 270 317 252T394 225T503
142
+ 215T627 209T752 193T861 157T938 88T967 -26Q967 -91 935 -152T841 -260T692 -336T493 -365Q382 -365 299 -343T160 -284T78 -199T50 -97Q50 -22 97 30T228 114Q185 134 160 167T134 257Q134 279 142 302T166 349T207 393T263 430Q188 472 146 541T103 704Q103
143
+ 778 131 838T211 941T332 1007T487 1030ZM803 -55Q803 -17 782 6T725 41T642 60T543 68T437 74T334 85Q277 58 242 19T206 -74Q206 -108 223 -137T277 -188T367 -222T496 -235Q568 -235 625 -222T721 -185T782 -128T803 -55ZM487 495Q541 495 582 510T652 552T694
144
+ 616T708 699Q708 792 652 847T487 902Q380 902 324 847T267 699Q267 654 281 617T324 552T393 510T487 495Z" />
145
+ <glyph unicode="h" glyph-name="h" horiz-adv-x="1112" d="M146 0V1473H324V877Q389 946 468 987T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" />
146
+ <glyph unicode="i" glyph-name="i" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM384 1331Q384 1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345
147
+ 1422T373 1381T384 1331Z" />
148
+ <glyph unicode="j" glyph-name="j" horiz-adv-x="508" d="M344 1013V-75Q344 -136 328 -188T278 -280T189 -341T58 -364Q25 -364 -2 -359T-56 -344L-48 -248Q-46 -235 -39 -232T-17 -228Q-9 -228 0 -228T22 -229Q100 -229 133 -193T166 -75V1013H344ZM384 1331Q384
149
+ 1305 374 1283T346 1243T305 1215T256 1205Q230 1205 208 1215T168 1242T140 1282T130 1331Q130 1357 140 1380T167 1421T207 1449T256 1459Q282 1459 305 1449T345 1422T373 1381T384 1331Z" />
150
+ <glyph unicode="k" glyph-name="k" horiz-adv-x="1048" d="M331 1473V606H377Q397 606 410 611T439 634L759 977Q774 993 789 1003T829 1013H991L618 616Q604 599 591 586T560 563Q578 551 592 536T620 500L1016 0H856Q834 0 819 8T789 35L456 450Q441 471 426
151
+ 477T381 484H331V0H152V1473H331Z" />
152
+ <glyph unicode="l" glyph-name="l" horiz-adv-x="512" d="M344 1473V0H166V1473H344Z" />
153
+ <glyph unicode="m" glyph-name="m" horiz-adv-x="1642" d="M146 0V1013H252Q290 1013 300 976L313 872Q369 941 438 985T600 1029Q703 1029 766 972T858 818Q879 873 913 913T991 979T1082 1017T1181 1029Q1261 1029 1323 1004T1429 929T1496 809T1519 645V0H1341V645Q1341
154
+ 764 1289 825T1138 887Q1094 887 1055 872T985 826T938 751T920 645V0H742V645Q742 767 693 827T550 887Q484 887 428 852T324 755V0H146Z" />
155
+ <glyph unicode="n" glyph-name="n" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146Z" />
156
+ <glyph unicode="o" glyph-name="o" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556 125Q706
157
+ 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125Z" />
158
+ <glyph unicode="p" glyph-name="p" horiz-adv-x="1104" d="M146 -343V1013H252Q290 1013 300 976L315 856Q380 935 463 983T656 1031Q743 1031 814 998T935 899T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q508 -14 442 17T324 105V-343H146ZM597
159
+ 887Q510 887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" />
160
+ <glyph unicode="q" glyph-name="q" horiz-adv-x="1118" d="M965 1013V-343H787V150Q723 76 642 31T455 -14Q368 -14 297 19T176 118T99 280T72 503Q72 615 102 711T188 879T326 990T510 1031Q608 1031 676 996T799 897L811 976Q821 1013 859 1013H965ZM514 130Q601
161
+ 130 666 170T787 283V773Q739 837 680 864T550 892Q408 892 332 791T256 503Q256 404 273 334T323 218T404 151T514 130Z" />
162
+ <glyph unicode="r" glyph-name="r" horiz-adv-x="806" d="M146 0V1013H248Q277 1013 288 1002T303 964L315 806Q367 912 443 971T623 1031Q665 1031 699 1022T762 995L739 862Q732 837 708 837Q694 837 665 846T584 856Q491 856 429 802T324 645V0H146Z" />
163
+ <glyph unicode="s" glyph-name="s" horiz-adv-x="868" d="M726 846Q714 824 689 824Q674 824 655 835T609 859T543 884T453 896Q408 896 372 885T311 853T272 807T258 749Q258 710 280 684T340 639T424 606T520 575T617 538T701 488T760 415T783 310Q783 240 758
164
+ 181T684 78T564 9T400 -16Q294 -16 208 18T62 107L104 175Q112 188 123 195T152 202Q170 202 190 188T238 157T307 126T409 112Q461 112 500 125T565 162T603 215T616 279Q616 321 594 348T534 395T450 429T353 460T256 496T171 548T112 624T89 735Q89 793 113
165
+ 846T183 940T296 1005T449 1029Q549 1029 628 998T766 911L726 846Z" />
166
+ <glyph unicode="t" glyph-name="t" horiz-adv-x="746" d="M453 -16Q333 -16 269 51T204 244V864H82Q66 864 55 873T44 903V974L210 995L251 1308Q253 1323 264 1332T292 1342H382V993H672V864H382V256Q382 192 413 161T493 130Q521 130 541 137T577 154T602 170T621
167
+ 178Q635 178 646 161L698 76Q652 33 587 9T453 -16Z" />
168
+ <glyph unicode="u" glyph-name="u" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300Z" />
169
+ <glyph unicode="v" glyph-name="v" horiz-adv-x="1024" d="M18 1013H164Q185 1013 199 1002T219 976L476 324Q490 288 498 252T513 181Q521 216 530 252T553 324L813 976Q819 992 832 1002T866 1013H1005L592 0H431L18 1013Z" />
170
+ <glyph unicode="w" glyph-name="w" horiz-adv-x="1532" d="M14 1013H154Q176 1013 190 1002T209 976L403 324Q411 288 418 255T430 187Q438 221 448 254T469 324L683 980Q688 995 700 1005T732 1015H809Q829 1015 842 1005T860 980L1069 324Q1080 289 1088 255T1105
171
+ 188Q1110 221 1118 257T1135 324L1333 976Q1338 992 1352 1002T1385 1013H1519L1191 0H1050Q1024 0 1014 34L790 721Q782 744 777 767T767 814Q762 791 757 767T744 720L517 34Q506 0 476 0H342L14 1013Z" />
172
+ <glyph unicode="x" glyph-name="x" horiz-adv-x="1008" d="M383 519L42 1013H213Q235 1013 245 1006T263 986L511 606Q520 634 537 662L755 982Q765 996 775 1004T800 1013H964L623 529L978 0H807Q785 0 773 11T752 37L497 434Q490 405 476 382L240 37Q230 23
173
+ 219 12T187 0H28L383 519Z" />
174
+ <glyph unicode="y" glyph-name="y" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443 -299Z" />
175
+ <glyph unicode="z" glyph-name="z" horiz-adv-x="924" d="M853 937Q853 918 846 901T828 869L280 139H833V0H70V74Q70 87 76 104T95 138L646 873H101V1013H853V937Z" />
176
+ <glyph unicode="{" glyph-name="braceleft" horiz-adv-x="600" d="M181 425Q181 488 146 528T44 569V676Q111 676 146 716T181 820Q181 870 173 919T156 1017T138 1116T130 1218Q130 1287 150 1345T212 1445T315 1510T459 1533H512V1454Q512 1434 498 1425T472
177
+ 1416H452Q375 1416 331 1366T286 1229Q286 1173 293 1121T309 1020T325 921T332 822Q332 784 321 752T290 694T242 650T181 622Q214 613 241 595T289 550T321 492T332 423Q332 373 325 324T309 226T293 124T286 16Q286 -71 330 -121T452 -171H472Q484 -171 498
178
+ -180T512 -209V-289H459Q377 -289 316 -266T213 -200T151 -100T130 27Q130 79 138 128T155 227T173 326T181 425Z" />
179
+ <glyph unicode="|" glyph-name="bar" horiz-adv-x="600" d="M230 1533H368V-343H230V1533Z" />
180
+ <glyph unicode="}" glyph-name="braceright" horiz-adv-x="600" d="M419 425Q419 375 427 326T444 228T462 129T470 27Q470 -42 449 -100T387 -200T285 -265T141 -289H88V-209Q88 -189 102 -180T128 -171H148Q225 -171 269 -121T314 16Q314 72 307 124T291 225T275
181
+ 324T268 423Q268 460 279 492T310 550T358 594T419 622Q386 631 359 649T311 693T279 751T268 822Q268 872 275 921T291 1019T307 1121T314 1229Q314 1315 270 1365T148 1416H128Q116 1416 102 1425T88 1454V1533H141Q223 1533 284 1510T387 1445T449 1345T470
182
+ 1218Q470 1166 462 1116T445 1017T427 919T419 820Q419 756 454 716T556 676V569Q489 569 454 529T419 425Z" />
183
+ <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1160" d="M759 613Q824 613 860 655T898 768H1042Q1042 701 1024 645T971 549T885 487T770 465Q718 465 667 481T569 516T478 552T399 569Q334 569 298 527T260 414H116Q116 481 134 537T187 633T272
184
+ 695T388 718Q440 718 491 702T589 666T680 630T759 613Z" />
185
+ <glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="386" />
186
+ <glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="686" d="M262 -343V198Q262 243 263 285T268 371T275 461T286 559H407Q413 507 417 461T425 372T429 286T431 198V-343H262ZM218 904Q218 931 227 953T254 993T293 1019T343 1029Q369 1029 391 1020T431
187
+ 993T458 954T468 904Q468 878 458 855T431 815T392 788T343 778Q316 778 294 788T254 815T228 855T218 904Z" />
188
+ <glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="1160" d="M561 -11Q469 -1 392 38T258 144T170 301T138 506Q138 617 171 710T267 873T422 982T633 1026L645 1205Q647 1225 660 1239T695 1254H761L745 1021Q827 1009 893 978T1013 897L967 835Q959 824
189
+ 952 819T930 813Q918 813 902 821T863 842T809 866T735 885L683 123Q746 127 788 142T860 175T909 206T944 220Q955 220 964 216T978 204L1026 141Q966 69 874 32T674 -12L662 -187Q660 -206 647 -220T612 -235H546L561 -11ZM315 506Q315 344 382 248T571 129L623
190
+ 889Q547 883 490 855T393 777T335 659T315 506Z" />
191
+ <glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="1160" d="M52 672Q52 698 68 716T113 734H247V995Q247 1089 274 1171T356 1315T493 1412T685 1448Q763 1448 823 1429T931 1375T1012 1296T1071 1199L999 1153Q989 1147 979 1145T958 1142Q944 1142
192
+ 932 1147T908 1167Q888 1192 868 1215T822 1256T763 1284T685 1295Q622 1295 574 1274T494 1214T446 1120T430 997V734H871V662Q871 644 856 629T819 614H430V371Q430 296 402 242T323 142Q352 147 380 150T439 154H1115V78Q1115 64 1110 51T1094 26T1070 7T1038
193
+ 0H74V115Q108 125 139 142T194 184T232 244T247 325V614H52V672Z" />
194
+ <glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="1160" d="M223 672Q223 729 239 779T285 874L132 1027L223 1117L374 965Q418 996 470 1013T580 1030Q637 1030 688 1014T782 967L935 1120L1024 1029L873 877Q904 833 921 782T938 672Q938 615 922
195
+ 564T876 470L1028 319L937 227L785 379Q741 349 689 332T580 315Q523 315 473 331T378 377L225 224L136 315L287 467Q257 511 240 562T223 672ZM355 672Q355 626 372 586T421 515T492 466T580 448Q627 448 668 466T740 514T789 585T807 672Q807 719 789 760T741
196
+ 832T669 880T580 898Q533 898 493 881T421 832T373 760T355 672Z" />
197
+ <glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="1160" d="M146 625H452L44 1433H193Q219 1433 234 1421T260 1388L536 822Q550 787 560 758T577 700Q584 729 593 758T616 822L891 1388Q899 1405 915 1419T957 1433H1107L698 625H1005V523H665V418H1005V315H665V0H486V315H146V418H486V523H146V625Z"
198
+ />
199
+ <glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="600" d="M230 1533H368V739H230V1533ZM230 452H368V-343H230V452Z" />
200
+ <glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="1006" d="M817 1265Q805 1243 780 1243Q765 1243 746 1254T700 1278T634 1303T544 1315Q496 1315 458 1303T393 1269T352 1220T338 1161Q338 1123 362 1095T426 1043T517 998T620 953T724 903T814 840T878
201
+ 758T903 651Q903 570 864 507T741 405Q790 368 821 319T852 201Q852 131 827 72T754 -31T634 -100T470 -125Q364 -125 278 -91T132 -2L173 66Q181 79 192 86T221 93Q239 93 259 79T308 48T379 16T485 2Q535 2 574 14T641 49T682 103T696 172Q696 217 671 250T605
202
+ 308T512 355T405 398T298 445T205 506T139 587T114 698Q114 776 157 838T293 936Q243 974 212 1026T180 1154Q180 1212 204 1265T274 1359T387 1423T540 1447Q640 1447 719 1416T857 1330L817 1265ZM272 726Q272 675 307 640T396 576T517 521T645 463Q699 489 723
203
+ 526T747 611Q747 647 732 675T691 726T630 768T556 804T474 839T392 877Q326 847 299 811T272 726Z" />
204
+ <glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="614" d="M239 1289Q239 1266 230 1246T205 1211T169 1187T125 1178Q103 1178 83 1187T48 1211T23 1246T14 1289Q14 1312 23 1333T47 1369T83 1394T125 1403Q148 1403 168 1394T205 1370T230 1333T239
205
+ 1289ZM598 1289Q598 1266 589 1246T565 1211T529 1187T485 1178Q462 1178 442 1187T406 1211T382 1246T373 1289Q373 1312 382 1333T406 1369T441 1394T485 1403Q508 1403 528 1394T564 1370T589 1333T598 1289Z" />
206
+ <glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="1596" d="M1030 463Q1038 468 1043 471T1055 475Q1066 475 1070 472T1080 463L1141 399Q1084 333 1001 297T802 260Q704 260 624 294T486 389T397 534T365 718Q365 819 399 903T495 1048T639 1142T821
207
+ 1176Q929 1176 1005 1142T1138 1053L1092 988Q1087 982 1079 976T1059 970Q1045 970 1030 981T989 1005T926 1030T829 1042Q759 1042 703 1020T607 955T546 853T524 718Q524 641 545 581T605 479T696 417T811 395Q859 395 892 401T949 417T991 439T1030 463ZM68
208
+ 716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167 86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168
209
+ 716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666 1361 551 1311T351 1173T217 968T168 716Z" />
210
+ <glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="684" d="M596 840H536Q518 840 509 845T492 869L480 918Q456 897 433 881T385 854T332 837T270 831Q232 831 200 841T143 871T106 922T92 993Q92 1027 111 1060T174 1120T290 1164T470 1184V1221Q470
211
+ 1284 441 1314T355 1344Q317 1344 292 1335T249 1316T216 1297T185 1288Q171 1288 161 1295T146 1313L124 1355Q176 1404 236 1427T370 1450Q424 1450 466 1433T537 1386T581 1314T596 1221V840ZM309 923Q360 923 397 942T470 996V1101Q400 1099 352 1091T273 1069T230
212
+ 1038T217 999Q217 957 243 940T309 923Z" />
213
+ <glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="926" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138
214
+ 518ZM434 518V541L683 930L741 902Q755 895 762 884T769 860Q769 843 759 827L600 566Q586 542 572 529Q587 515 600 493L759 232Q764 224 766 215T769 198Q769 170 741 157L683 129L434 518Z" />
215
+ <glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="1160" d="M148 739H1008V315H857V604H148V739Z" />
216
+ <glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="694" d="M100 675H594V524H100V675Z" />
217
+ <glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="1596" d="M68 716Q68 817 94 910T167 1085T282 1233T430 1348T604 1422T798 1448Q899 1448 992 1422T1167 1348T1315 1234T1429 1086T1503 911T1529 716Q1529 616 1503 523T1430 348T1315 201T1167
218
+ 86T993 12T798 -14Q697 -14 604 12T430 86T282 200T168 348T94 522T68 716ZM168 716Q168 627 190 545T253 392T351 262T478 163T629 99T798 76Q930 76 1045 126T1246 262T1381 465T1431 716Q1431 805 1409 888T1345 1042T1247 1173T1119 1273T968 1338T798 1361Q666
219
+ 1361 551 1311T351 1173T217 968T168 716ZM654 626V272H498V1164H786Q958 1164 1041 1102T1124 917Q1124 823 1071 757T911 666Q928 656 940 641T964 606L1192 272H1044Q1011 272 995 297L794 599Q785 612 773 619T734 626H654ZM654 740H770Q825 740 863 750T925
220
+ 781T959 830T970 897Q970 934 961 962T930 1008T873 1035T786 1044H654V740Z" />
221
+ <glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="614" d="M20 1348H594V1231H20V1348Z" />
222
+ <glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="794" d="M70 1128Q70 1195 95 1254T164 1356T267 1425T396 1450Q465 1450 524 1425T628 1357T697 1254T722 1128Q722 1062 697 1004T628 902T525 833T396 807Q327 807 268 832T164 901T95 1003T70 1128ZM197
223
+ 1127Q197 1085 212 1049T254 985T317 943T396 927Q438 927 474 942T537 985T579 1048T594 1127Q594 1169 579 1206T537 1270T474 1313T396 1329Q354 1329 318 1314T254 1271T212 1206T197 1127Z" />
224
+ <glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="1160" d="M651 1202V826H1058V690H651V322H505V690H100V826H505V1202H651ZM100 215H1058V80H100V215Z" />
225
+ <glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="664" d="M346 1637Q398 1637 440 1622T513 1580T559 1515T576 1429Q576 1389 564 1355T530 1289T482 1229T425 1170L263 1005Q286 1011 309 1015T354 1019H549Q570 1019 581 1008T593 977V900H82V943Q82
226
+ 956 87 970T104 996L325 1215Q350 1240 372 1266T410 1318T435 1371T445 1425Q445 1476 415 1503T340 1531Q294 1531 266 1507T223 1441Q215 1427 206 1419T179 1411Q175 1411 171 1411T161 1413L90 1425Q105 1531 174 1584T346 1637Z" />
227
+ <glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="664" d="M354 1637Q405 1637 446 1623T516 1583T562 1523T578 1449Q578 1321 459 1276Q525 1257 559 1218T594 1117Q594 1062 573 1020T518 950T438 907T344 892Q287 892 245 904T173 941T121
228
+ 1002T84 1085L139 1109Q154 1115 168 1115Q197 1115 208 1092Q214 1079 223 1063T247 1033T283 1010T337 1000Q368 1000 391 1010T431 1035T455 1071T463 1112Q463 1142 455 1163T427 1199T375 1220T295 1227V1314Q382 1315 417 1345T453 1427Q453 1477 424 1503T347
229
+ 1529Q299 1529 271 1506T230 1442Q222 1426 214 1419T190 1411Q186 1411 182 1411T172 1413L105 1425Q112 1478 134 1517T188 1583T263 1623T354 1637Z" />
230
+ <glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="614" d="M597 1449L364 1191Q350 1176 337 1170T302 1163H196L344 1405Q358 1428 374 1438T423 1449H597Z" />
231
+ <glyph unicode="&#xb5;" glyph-name="mu" horiz-adv-x="1112" d="M300 1013V355Q300 246 354 186T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q730 74 660 40T502 6Q428 6 372 31T277 103Q284 61 287 18T290 -64V-343H201Q163 -343
232
+ 143 -323T122 -267V1013H300Z" />
233
+ <glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="1338" d="M1302 1433V1280H1083V-201H926V1280H649V-201H492V660Q388 660 305 690T164 773T74 897T42 1049Q42 1135 73 1205T163 1326T305 1405T492 1433H1302Z" />
234
+ <glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="546" d="M124 593Q124 624 135 652T167 700T215 732T272 744Q303 744 331 732T379 700T411 652T423 593Q423 563 411 536T379 489T331 457T272 445Q242 445 215 456T168 488T136 536T124 593Z" />
235
+ <glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="614" d="M172 -247Q178 -247 186 -250T205 -258T232 -266T269 -270Q311 -270 332 -254T354 -211Q354 -192 343 -179T312 -157T261 -142T193 -131L236 10H348L324 -70Q414 -90 454 -124T495 -213Q495
236
+ -245 479 -270T435 -314T366 -341T278 -351Q237 -351 200 -343T132 -320L149 -265Q155 -247 172 -247Z" />
237
+ <glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="664" d="M173 985H320V1425L324 1468L217 1380Q205 1371 191 1371Q168 1371 159 1385L120 1441L342 1631H450V985H580V900H173V985Z" />
238
+ <glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="762" d="M382 1449Q452 1449 508 1428T605 1366T667 1269T689 1140Q689 1068 667 1010T605 912T509 850T382 828Q311 828 254 849T157 911T94 1010T72 1140Q72 1211 94 1268T156 1366T254 1427T382
239
+ 1449ZM382 934Q466 934 507 986T549 1139Q549 1239 508 1291T382 1343Q295 1343 254 1291T212 1139Q212 1039 253 987T382 934Z" />
240
+ <glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="926" d="M236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541V518L236 129ZM781 541V518L532
241
+ 129L474 157Q446 170 446 198Q446 215 456 232L615 493Q628 517 642 529Q630 540 615 566L456 827Q446 844 446 861Q446 889 474 902L532 930L781 541Z" />
242
+ <glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="1424" d="M1295 267H1404V202Q1404 191 1397 184T1377 176H1295V0H1186V176H880Q862 176 852 184T839 204L829 261L1171 729H1295V267ZM155 788H302V1228L306 1271L199 1183Q187 1174 173 1174Q150
243
+ 1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM1186 508Q1186 527 1187 549T1191 594L950 267H1186V508ZM434 53Q415 22 393 11T342 0H266L1084 1372Q1102 1401 1125 1417T1180 1433H1257L434 53Z" />
244
+ <glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="1424" d="M1126 737Q1178 737 1220 722T1293 680T1339 615T1356 529Q1356 489 1344 455T1310 389T1262 329T1205 270L1043 105Q1066 111 1089 115T1134 119H1329Q1350 119 1361 108T1373 77V0H862V43Q862
245
+ 56 867 70T884 96L1105 315Q1130 340 1152 366T1190 418T1215 471T1225 525Q1225 576 1195 603T1120 631Q1074 631 1046 607T1003 541Q995 527 986 519T959 511Q955 511 951 511T941 513L870 525Q885 631 954 684T1126 737ZM155 788H302V1228L306 1271L199 1183Q187
246
+ 1174 173 1174Q150 1174 141 1188L102 1244L324 1434H432V788H562V703H155V788ZM390 53Q371 22 349 11T298 0H222L1040 1372Q1058 1401 1081 1417T1136 1433H1213L390 53Z" />
247
+ <glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="1426" d="M1296 267H1405V202Q1405 191 1398 184T1378 176H1296V0H1187V176H881Q863 176 853 184T840 204L830 261L1172 729H1296V267ZM338 1440Q389 1440 430 1426T500 1386T546 1326T562 1252Q562
248
+ 1124 443 1079Q509 1060 543 1021T578 920Q578 865 557 823T502 753T422 710T328 695Q271 695 229 707T157 744T105 805T68 888L123 912Q138 918 152 918Q181 918 192 895Q198 882 207 866T231 836T267 813T321 803Q352 803 375 813T415 838T439 874T447 915Q447
249
+ 945 439 966T411 1002T359 1023T279 1030V1117Q366 1118 401 1148T437 1230Q437 1280 408 1306T331 1332Q283 1332 255 1309T214 1245Q206 1229 198 1222T174 1214Q170 1214 166 1214T156 1216L89 1228Q96 1281 118 1320T172 1386T247 1426T338 1440ZM1187 508Q1187
250
+ 527 1188 549T1192 594L951 267H1187V508ZM439 53Q420 22 398 11T347 0H271L1089 1372Q1107 1401 1130 1417T1185 1433H1262L439 53Z" />
251
+ <glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="796" d="M770 -212Q739 -241 702 -267T620 -313T524 -344T412 -356Q333 -356 266 -334T149 -271T72 -171T44 -37Q44 39 66 92T123 183T199 248T275 299T336 347T366 405L384 559H506L518 392V380Q518
252
+ 336 496 305T439 249T365 201T291 147T234 77T211 -22Q211 -66 228 -100T274 -159T342 -197T427 -210Q488 -210 531 -195T605 -162T654 -129T685 -114Q699 -114 707 -120T723 -137L770 -212ZM324 903Q324 929 333 952T359 992T399 1019T448 1029Q474 1029 497 1019T537
253
+ 992T563 952T573 903Q573 876 564 854T537 814T497 788T448 778Q422 778 399 787T360 814T334 853T324 903Z" />
254
+ <glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM520
255
+ 1782Q552 1782 568 1776T604 1749L815 1546H676Q655 1546 643 1549T614 1565L319 1782H520Z" />
256
+ <glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM1021
257
+ 1782L727 1566Q710 1554 697 1550T663 1546H525L736 1749Q746 1759 754 1765T772 1775T792 1780T820 1782H1021Z" />
258
+ <glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414
259
+ 532ZM1006 1546H871Q859 1546 845 1549T822 1559L692 1654Q684 1658 680 1662Q672 1656 668 1654L538 1559Q529 1553 515 1550T489 1546H354L592 1756H768L1006 1546Z" />
260
+ <glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM801
261
+ 1663Q836 1663 854 1683T874 1741H972Q972 1698 961 1662T929 1600T877 1559T806 1544Q771 1544 739 1557T678 1585T622 1614T572 1627Q538 1627 520 1606T500 1548H400Q400 1591 411 1627T444 1690T497 1731T568 1746Q603 1746 635 1733T696 1705T751 1676T801
262
+ 1663Z" />
263
+ <glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM578
264
+ 1666Q578 1644 569 1625T545 1590T510 1567T466 1558Q445 1558 426 1566T391 1590T367 1624T358 1666Q358 1689 367 1709T391 1745T425 1769T466 1778Q489 1778 509 1769T545 1745T569 1710T578 1666ZM1004 1666Q1004 1644 995 1625T971 1590T936 1567T894 1558Q871
265
+ 1558 851 1566T816 1590T793 1624T784 1666Q784 1689 792 1709T816 1745T851 1769T894 1778Q916 1778 936 1769T971 1745T995 1710T1004 1666Z" />
266
+ <glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="1360" d="M1353 0H1203Q1177 0 1161 13T1137 46L1003 392H360L226 46Q219 28 202 14T160 0H10L583 1433H780L1353 0ZM414 532H949L724 1115Q702 1169 681 1250Q670 1209 660 1175T639 1114L414 532ZM489
267
+ 1659Q489 1698 504 1731T545 1787T605 1824T677 1837Q716 1837 750 1824T811 1788T853 1731T868 1659Q868 1621 853 1589T812 1534T751 1498T677 1485Q639 1485 605 1498T546 1534T505 1589T489 1659ZM578 1659Q578 1616 605 1588T679 1559Q724 1559 751 1587T779
268
+ 1659Q779 1704 752 1732T679 1760Q632 1760 605 1732T578 1659Z" />
269
+ <glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1858" d="M733 1433H1754V1275H1005L1065 799H1624V647H1084L1145 158H1754V0H982L933 392H377L198 45Q187 25 169 13T124 0H-24L733 1433ZM450 532H915L821 1285Q809 1244 795 1210T766 1144L450 532Z" />
270
+ <glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="1370" d="M643 -247Q649 -247 657 -250T676 -258T703 -266T740 -270Q782 -270 803 -254T825 -211Q825 -192 814 -179T783 -157T732 -142T664 -131L700 -13Q561 -1 448 57T256 211T133 435T90 716Q90
271
+ 878 142 1013T290 1245T517 1395T810 1449Q968 1449 1082 1400T1286 1267L1223 1178Q1216 1168 1207 1162T1181 1155Q1168 1155 1154 1164T1119 1188T1072 1218T1008 1248T922 1271T809 1281Q694 1281 599 1242T434 1129T327 951T288 716Q288 582 326 477T431 300T589
272
+ 189T785 151Q849 151 900 158T994 182T1075 222T1151 281Q1168 296 1184 296Q1200 296 1213 283L1289 200Q1206 103 1090 47T811 -15L795 -70Q885 -90 925 -124T966 -213Q966 -245 950 -270T906 -314T837 -341T749 -351Q708 -351 671 -343T603 -320L620 -265Q626
273
+ -247 643 -247Z" />
274
+ <glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM468 1782Q500 1782 516 1776T552 1749L763 1546H624Q603 1546 591 1549T562 1565L267 1782H468Z" />
275
+ <glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM969 1782L675 1566Q658 1554 645 1550T611 1546H473L684 1749Q694 1759 702 1765T720 1775T740 1780T768 1782H969Z" />
276
+ <glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM954 1546H819Q807 1546 793 1549T770 1559L640 1654Q632 1658 628 1662Q620 1656 616 1654L486 1559Q477 1553 463 1550T437
277
+ 1546H302L540 1756H716L954 1546Z" />
278
+ <glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="1162" d="M1057 1433V1275H369V799H926V647H369V158H1057V0H174V1433H1057ZM526 1666Q526 1644 517 1625T493 1590T458 1567T414 1558Q393 1558 374 1566T339 1590T315 1624T306 1666Q306 1689 315
279
+ 1709T339 1745T373 1769T414 1778Q437 1778 457 1769T493 1745T517 1710T526 1666ZM952 1666Q952 1644 943 1625T919 1590T884 1567T842 1558Q819 1558 799 1566T764 1590T741 1624T732 1666Q732 1689 740 1709T764 1745T799 1769T842 1778Q864 1778 884 1769T919
280
+ 1745T943 1710T952 1666Z" />
281
+ <glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM405 1782Q437 1782 453 1776T489 1749L700 1546H561Q540 1546 528 1549T499 1565L204 1782H405Z" />
282
+ <glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM906 1782L612 1566Q595 1554 582 1550T548 1546H410L621 1749Q631 1759 639 1765T657 1775T677 1780T705 1782H906Z" />
283
+ <glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM635 1546H500Q488 1546 474 1549T451 1559L321 1654Q313 1658 309 1662Q301 1656 297 1654L167 1559Q158 1553 144 1550T118 1546H-17L221 1756H397L635 1546Z" />
284
+ <glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="614" d="M404 0H210V1433H404V0ZM206 1666Q206 1644 197 1625T173 1590T138 1567T94 1558Q73 1558 54 1566T19 1590T-5 1624T-14 1666Q-14 1689 -5 1709T19 1745T53 1769T94 1778Q117 1778 137 1769T173
285
+ 1745T197 1710T206 1666ZM632 1666Q632 1644 623 1625T599 1590T564 1567T522 1558Q499 1558 479 1566T444 1590T421 1624T412 1666Q412 1689 420 1709T444 1745T479 1769T522 1778Q544 1778 564 1769T599 1745T623 1710T632 1666Z" />
286
+ <glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="1578" d="M50 780H247V1433H782Q940 1433 1070 1382T1294 1236T1438 1009T1489 716Q1489 555 1438 423T1294 197T1071 52T782 0H247V666H50V780ZM1290 716Q1290 848 1254 952T1152 1128T992 1238T782 1276H441V780H822V666H441V157H782Q898
287
+ 157 992 195T1152 304T1254 480T1290 716Z" />
288
+ <glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="1512" d="M274 1433Q300 1433 312 1427T341 1400L1171 320Q1168 346 1167 370T1166 418V1433H1336V0H1238Q1215 0 1200 8T1169 35L340 1114Q342 1089 343 1065T344 1021V0H174V1433H274V1433ZM901 1663Q936
289
+ 1663 954 1683T974 1741H1072Q1072 1698 1061 1662T1029 1600T977 1559T906 1544Q871 1544 839 1557T778 1585T722 1614T672 1627Q638 1627 620 1606T600 1548H500Q500 1591 511 1627T544 1690T597 1731T668 1746Q703 1746 735 1733T796 1705T851 1676T901 1663Z"
290
+ />
291
+ <glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
292
+ 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM640 1782Q672 1782 688 1776T724 1749L935 1546H796Q775
293
+ 1546 763 1549T734 1565L439 1782H640Z" />
294
+ <glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
295
+ 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1141 1782L847 1566Q830 1554 817 1550T783 1546H645L856
296
+ 1749Q866 1759 874 1765T892 1775T912 1780T940 1782H1141Z" />
297
+ <glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
298
+ 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM1126 1546H991Q979 1546 965 1549T942 1559L812 1654Q804
299
+ 1658 800 1662Q792 1656 788 1654L658 1559Q649 1553 635 1550T609 1546H474L712 1756H888L1126 1546Z" />
300
+ <glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
301
+ 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM921 1663Q956 1663 974 1683T994 1741H1092Q1092 1698 1081
302
+ 1662T1049 1600T997 1559T926 1544Q891 1544 859 1557T798 1585T742 1614T692 1627Q658 1627 640 1606T620 1548H520Q520 1591 531 1627T564 1690T617 1731T688 1746Q723 1746 755 1733T816 1705T871 1676T921 1663Z" />
303
+ <glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q640 -15 510 38T287 189T143 420T92 716Q92 877 143 1011T287 1243T510 1395T798 1449Q956 1449 1086 1395T1310 1244T1454 1012T1505
304
+ 716ZM1306 716Q1306 848 1270 953T1168 1130T1008 1242T798 1281Q683 1281 589 1242T429 1131T326 953T290 716Q290 584 326 480T428 303T589 192T798 153Q914 153 1008 191T1168 302T1270 479T1306 716ZM698 1666Q698 1644 689 1625T665 1590T630 1567T586 1558Q565
305
+ 1558 546 1566T511 1590T487 1624T478 1666Q478 1689 487 1709T511 1745T545 1769T586 1778Q609 1778 629 1769T665 1745T689 1710T698 1666ZM1124 1666Q1124 1644 1115 1625T1091 1590T1056 1567T1014 1558Q991 1558 971 1566T936 1590T913 1624T904 1666Q904
306
+ 1689 912 1709T936 1745T971 1769T1014 1778Q1036 1778 1056 1769T1091 1745T1115 1710T1124 1666Z" />
307
+ <glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="1160" d="M1017 1014L673 670L1027 317L932 221L578 575L221 219L126 315L482 671L137 1016L232 1112L577 766L921 1110L1017 1014Z" />
308
+ <glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="1596" d="M1505 716Q1505 555 1454 421T1310 189T1087 39T798 -15Q690 -15 596 9T423 82L323 -54Q301 -83 272 -96T214 -109H136L327 151Q215 249 154 393T92 716Q92 877 143 1011T287 1243T510 1395T798
309
+ 1449Q913 1449 1013 1420T1196 1337L1278 1448Q1298 1475 1314 1486T1362 1498H1462L1290 1263Q1393 1165 1449 1026T1505 716ZM290 716Q290 581 327 476T434 297L1093 1196Q1033 1238 959 1259T798 1281Q683 1281 589 1242T429 1131T326 953T290 716ZM1306 716Q1306
310
+ 842 1274 942T1181 1115L526 223Q642 153 798 153Q914 153 1008 191T1168 302T1270 479T1306 716Z" />
311
+ <glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452
312
+ 269T571 185T731 154ZM570 1782Q602 1782 618 1776T654 1749L865 1546H726Q705 1546 693 1549T664 1565L369 1782H570Z" />
313
+ <glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378 398T452
314
+ 269T571 185T731 154ZM1071 1782L777 1566Q760 1554 747 1550T713 1546H575L786 1749Q796 1759 804 1765T822 1775T842 1780T870 1782H1071Z" />
315
+ <glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378
316
+ 398T452 269T571 185T731 154ZM1056 1546H921Q909 1546 895 1549T872 1559L742 1654Q734 1658 730 1662Q722 1656 718 1654L588 1559Q579 1553 565 1550T539 1546H404L642 1756H818L1056 1546Z" />
317
+ <glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="1460" d="M731 154Q820 154 890 184T1008 268T1082 397T1108 562V1433H1301V562Q1301 438 1262 332T1149 149T969 27T731 -17Q599 -17 493 27T313 148T200 332T160 562V1433H353V563Q353 473 378
318
+ 398T452 269T571 185T731 154ZM628 1666Q628 1644 619 1625T595 1590T560 1567T516 1558Q495 1558 476 1566T441 1590T417 1624T408 1666Q408 1689 417 1709T441 1745T475 1769T516 1778Q539 1778 559 1769T595 1745T619 1710T628 1666ZM1054 1666Q1054 1644 1045
319
+ 1625T1021 1590T986 1567T944 1558Q921 1558 901 1566T866 1590T843 1624T834 1666Q834 1689 842 1709T866 1745T901 1769T944 1778Q966 1778 986 1769T1021 1745T1045 1710T1054 1666Z" />
320
+ <glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="1258" d="M726 570V0H533V570L8 1433H178Q204 1433 219 1420T245 1388L573 831Q593 796 606 765T631 704Q642 735 655 766T688 831L1015 1388Q1024 1404 1039 1418T1080 1433H1252L726 570ZM971 1782L677
321
+ 1566Q660 1554 647 1550T613 1546H475L686 1749Q696 1759 704 1765T722 1775T742 1780T770 1782H971Z" />
322
+ <glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="1222" d="M387 272V0H194V1433H387V1169H617Q753 1169 853 1138T1020 1048T1118 908T1151 725Q1151 625 1116 542T1014 399T846 306T617 272H387ZM387 426H617Q700 426 763 448T870 509T935 604T957 725Q957
323
+ 862 873 939T617 1016H387V426Z" />
324
+ <glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="1218" d="M673 1454Q776 1454 851 1424T976 1348T1048 1246T1072 1140Q1072 1080 1051 1037T997 961T928 903T858 854T805 805T783 747Q783 708 809 682T876 634T962 588T1049 529T1115 443T1142
325
+ 314Q1142 236 1114 175T1035 72T918 7T771 -16Q674 -16 595 18T456 107L497 175Q505 188 516 195T545 202Q563 202 583 188T630 157T695 126T786 112Q830 112 865 125T924 162T962 217T975 286Q975 342 947 377T877 437T786 484T695 534T625 604T597 712Q597 765
326
+ 619 804T675 875T748 934T820 991T876 1056T899 1140Q899 1172 887 1204T846 1263T774 1305T666 1322Q598 1322 543 1301T448 1238T387 1133T365 986V0H186V992Q186 1096 220 1181T319 1327T473 1421T673 1454Z" />
327
+ <glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
328
+ 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
329
+ 192T311 145T363 118T428 109ZM428 1449Q461 1449 477 1439T507 1405L656 1163H554Q533 1163 520 1169T493 1191L259 1449H428Z" />
330
+ <glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
331
+ 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
332
+ 192T311 145T363 118T428 109ZM818 1449L585 1191Q571 1176 558 1170T523 1163H417L565 1405Q579 1428 595 1438T644 1449H818Z" />
333
+ <glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515
334
+ 887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263
335
+ 221 276 192T311 145T363 118T428 109ZM833 1169H714Q693 1169 674 1183L546 1309L529 1326L513 1309L384 1183Q378 1178 367 1174T344 1169H221L444 1433H610L833 1169Z" />
336
+ <glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
337
+ 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
338
+ 192T311 145T363 118T428 109ZM638 1325Q674 1325 693 1346T714 1411H822Q822 1364 810 1325T774 1257T718 1214T645 1198Q610 1198 580 1212T522 1244T471 1275T424 1290Q352 1290 350 1202H239Q239 1250 252 1289T289 1357T346 1401T418 1417Q453 1417 483 1403T541
339
+ 1371T591 1340T638 1325Z" />
340
+ <glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515
341
+ 887Q450 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263
342
+ 221 276 192T311 145T363 118T428 109ZM460 1289Q460 1266 451 1246T426 1211T390 1187T346 1178Q324 1178 304 1187T269 1211T244 1246T235 1289Q235 1312 244 1333T268 1369T304 1394T346 1403Q369 1403 389 1394T426 1370T451 1333T460 1289ZM819 1289Q819 1266
343
+ 810 1246T786 1211T750 1187T706 1178Q683 1178 663 1187T627 1211T603 1246T594 1289Q594 1312 603 1333T627 1369T662 1394T706 1403Q729 1403 749 1394T785 1370T810 1333T819 1289Z" />
344
+ <glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="1014" d="M890 0H811Q785 0 769 8T748 42L728 136Q688 100 650 72T570 24T481 -6T375 -16Q316 -16 265 0T175 50T115 133T92 253Q92 313 125 368T231 467T424 537T715 569V648Q715 766 665 826T515 887Q450
345
+ 887 406 871T329 834T273 797T226 780Q208 780 195 789T173 813L141 870Q225 951 322 991T537 1031Q622 1031 688 1003T799 925T867 804T890 648V0ZM428 109Q475 109 514 118T587 145T653 188T715 245V456Q592 452 506 437T366 396T288 337T263 261Q263 221 276
346
+ 192T311 145T363 118T428 109ZM328 1315Q328 1357 344 1391T387 1450T451 1488T527 1502Q568 1502 604 1489T669 1450T713 1391T729 1315Q729 1274 713 1240T669 1182T605 1145T527 1131Q487 1131 451 1144T388 1182T344 1240T328 1315ZM428 1315Q428 1271 455
347
+ 1243T529 1215Q574 1215 601 1243T629 1315Q629 1360 602 1388T529 1416Q482 1416 455 1388T428 1315Z" />
348
+ <glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="1632" d="M1166 1029Q1248 1029 1318 997T1440 904T1521 756T1551 556Q1551 515 1543 501T1510 486H883Q887 395 910 328T971 215T1062 148T1180 126Q1249 126 1295 140T1371 173T1421 205T1456 220Q1470
349
+ 220 1479 216T1494 203L1541 142Q1508 102 1465 73T1372 24T1269 -4T1164 -14Q1047 -14 952 42T801 215Q774 153 731 109T634 37T522 -3T403 -16Q334 -16 277 1T179 54T115 142T92 267Q92 327 125 385T231 489T424 564T715 598V648Q715 766 665 829T515 892Q450
350
+ 892 406 875T329 836T273 798T226 780Q208 780 195 789T173 813L141 870Q225 951 315 991T519 1031Q639 1031 712 980T818 838Q872 926 958 977T1166 1029ZM715 486Q592 481 506 464T366 418T288 354T263 276Q263 189 313 149T444 109Q501 109 550 127T636 182T694
351
+ 274T715 403V486ZM1159 898Q1098 898 1050 878T968 818T913 723T885 597H1393Q1393 662 1378 717T1332 813T1259 875T1159 898Z" />
352
+ <glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="934" d="M400 -247Q406 -247 414 -250T433 -258T460 -266T497 -270Q539 -270 560 -254T582 -211Q582 -192 571 -179T540 -157T489 -142T421 -131L458 -10Q375 1 305 40T183 146T103 303T74 507Q74
353
+ 620 105 716T197 881T347 990T551 1029Q657 1029 739 995T884 897L837 833Q829 822 821 816T798 810Q783 810 766 822T721 850T656 877T561 890Q487 890 430 864T335 787T277 666T257 507Q257 415 278 344T337 224T429 150T552 124Q617 124 659 139T729 174T775
354
+ 208T811 224Q822 224 830 220T845 207L895 142Q836 70 751 33T569 -12L552 -70Q642 -90 682 -124T723 -213Q723 -245 707 -270T663 -314T594 -341T506 -351Q465 -351 428 -343T360 -320L377 -265Q383 -247 400 -247Z" />
355
+ <glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
356
+ 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM451 1449Q484 1449 500 1439T530 1405L679 1163H577Q556
357
+ 1163 543 1169T516 1191L282 1449H451Z" />
358
+ <glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
359
+ 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM841 1449L608 1191Q594 1176 581 1170T546 1163H440L588
360
+ 1405Q602 1428 618 1438T667 1449H841Z" />
361
+ <glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904
362
+ 207L954 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM856 1169H737Q716 1169 697 1183L569 1309L552
363
+ 1326L536 1309L407 1183Q401 1178 390 1174T367 1169H244L467 1433H633L856 1169Z" />
364
+ <glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="1048" d="M547 1029Q638 1029 715 999T848 911T935 769T967 576Q967 534 958 520T924 506H250Q252 410 276 339T342 221T442 150T572 126Q639 126 687 141T771 175T829 208T870 224Q892 224 904 207L954
365
+ 142Q921 102 875 73T777 24T668 -4T557 -14Q452 -14 364 21T211 125T110 295T74 527Q74 633 106 725T200 884T349 990T547 1029ZM551 898Q422 898 348 824T256 617H807Q807 679 790 730T740 819T660 877T551 898ZM483 1289Q483 1266 474 1246T449 1211T413 1187T369
366
+ 1178Q347 1178 327 1187T292 1211T267 1246T258 1289Q258 1312 267 1333T291 1369T327 1394T369 1403Q392 1403 412 1394T449 1370T474 1333T483 1289ZM842 1289Q842 1266 833 1246T809 1211T773 1187T729 1178Q706 1178 686 1187T650 1211T626 1246T617 1289Q617
367
+ 1312 626 1333T650 1369T685 1394T729 1403Q752 1403 772 1394T808 1370T833 1333T842 1289Z" />
368
+ <glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM418 1449Q451 1449 467 1439T497 1405L646 1163H544Q523 1163 510 1169T483 1191L249 1449H418Z" />
369
+ <glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM808 1449L575 1191Q561 1176 548 1170T513 1163H407L555 1405Q569 1428 585 1438T634 1449H808Z" />
370
+ <glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM822 1169H703Q682 1169 663 1183L535 1309L518 1326L502 1309L373 1183Q367 1178 356 1174T333 1169H210L433 1433H599L822 1169Z" />
371
+ <glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="512" d="M344 1013V0H166V1013H344ZM450 1289Q450 1266 441 1246T416 1211T380 1187T336 1178Q314 1178 294 1187T259 1211T234 1246T225 1289Q225 1312 234 1333T258 1369T294 1394T336 1403Q359
372
+ 1403 379 1394T416 1370T441 1333T450 1289ZM809 1289Q809 1266 800 1246T776 1211T740 1187T696 1178Q673 1178 653 1187T617 1211T593 1246T584 1289Q584 1312 593 1333T617 1369T652 1394T696 1403Q719 1403 739 1394T775 1370T800 1333T809 1289Z" />
373
+ <glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="1106" d="M417 1065Q413 1072 411 1078T408 1091Q408 1113 431 1128L534 1200Q489 1220 439 1237T331 1268Q313 1273 301 1286T288 1323Q288 1338 293 1352L313 1414Q409 1398 499 1368T670 1290L837 1412L872
374
+ 1355Q880 1342 880 1331Q880 1310 858 1294L761 1227Q821 1178 870 1116T955 977T1009 807T1029 604Q1029 461 998 347T906 153T753 30T541 -13Q443 -13 358 20T211 114T112 265T76 466Q76 560 107 643T196 790T336 890T523 927Q623 927 711 884T865 754Q845 890
375
+ 787 985T634 1144L450 1009L417 1065ZM545 125Q616 125 673 152T771 233T835 370T861 564Q845 607 819 647T756 719T669 769T557 788Q482 788 426 763T331 695T274 592T254 464Q254 383 277 320T340 213T432 148T545 125Z" />
376
+ <glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="1112" d="M146 0V1013H252Q290 1013 300 976L314 866Q380 939 461 984T650 1029Q733 1029 796 1002T902 924T967 802T989 645V0H811V645Q811 760 759 823T598 887Q519 887 451 849T324 746V0H146ZM675
377
+ 1325Q711 1325 730 1346T751 1411H859Q859 1364 847 1325T811 1257T755 1214T682 1198Q647 1198 617 1212T559 1244T508 1275T461 1290Q389 1290 387 1202H276Q276 1250 289 1289T326 1357T383 1401T455 1417Q490 1417 520 1403T578 1371T628 1340T675 1325Z" />
378
+ <glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
379
+ 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM458 1449Q491 1449 507 1439T537 1405L686 1163H584Q563 1163 550 1169T523 1191L289 1449H458Z" />
380
+ <glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
381
+ 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM848 1449L615 1191Q601 1176 588 1170T553 1163H447L595 1405Q609 1428 625 1438T674 1449H848Z" />
382
+ <glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
383
+ 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM863 1169H744Q723 1169 704 1183L576 1309L559 1326L543 1309L414 1183Q408 1178 397 1174T374 1169H251L474 1433H640L863
384
+ 1169Z" />
385
+ <glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
386
+ 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM668 1325Q704 1325 723 1346T744 1411H852Q852 1364 840 1325T804 1257T748 1214T675 1198Q640 1198 610 1212T552 1244T501
387
+ 1275T454 1290Q382 1290 380 1202H269Q269 1250 282 1289T319 1357T376 1401T448 1417Q483 1417 513 1403T571 1371T621 1340T668 1325Z" />
388
+ <glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="1112" d="M556 1029Q667 1029 756 992T908 887T1004 723T1038 507Q1038 387 1005 291T909 127T757 23T556 -14Q445 -14 356 22T203 127T106 291T72 507Q72 626 106 722T203 887T355 992T556 1029ZM556
389
+ 125Q706 125 780 225T854 506Q854 687 780 788T556 889Q480 889 424 863T331 788T275 668T256 506Q256 416 274 345T330 226T424 151T556 125ZM490 1289Q490 1266 481 1246T456 1211T420 1187T376 1178Q354 1178 334 1187T299 1211T274 1246T265 1289Q265 1312
390
+ 274 1333T298 1369T334 1394T376 1403Q399 1403 419 1394T456 1370T481 1333T490 1289ZM849 1289Q849 1266 840 1246T816 1211T780 1187T736 1178Q713 1178 693 1187T657 1211T633 1246T624 1289Q624 1312 633 1333T657 1369T692 1394T736 1403Q759 1403 779 1394T815
391
+ 1370T840 1333T849 1289Z" />
392
+ <glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="1160" d="M100 739H1058V604H100V739ZM454 1026Q454 1052 463 1075T489 1115T528 1142T578 1152Q604 1152 626 1142T666 1115T693 1075T703 1026Q703 999 693 977T666 937T627 911T578 901Q551 901 529
393
+ 910T490 937T464 976T454 1026ZM454 314Q454 340 463 363T489 403T528 430T578 440Q604 440 626 430T666 403T693 363T703 314Q703 287 693 265T666 225T627 199T578 189Q551 189 529 198T490 225T464 264T454 314Z" />
394
+ <glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="1112" d="M912 884Q973 816 1006 721T1039 507Q1039 387 1006 291T910 127T758 23T557 -14Q481 -14 416 3T296 52L241 -22Q219 -51 190 -63T131 -76H64L209 120Q143 189 108 286T73 507Q73 626 107 722T204
395
+ 887T356 992T557 1029Q636 1029 703 1010T827 956L895 1047Q915 1074 931 1085T979 1097H1069L912 884ZM246 506Q246 346 305 249L741 839Q668 895 557 895Q481 895 423 868T326 791T266 669T246 506ZM557 120Q632 120 689 146T786 223T846 344T866 506Q866 657
396
+ 814 753L381 168Q451 120 557 120Z" />
397
+ <glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM452 1449Q485
398
+ 1449 501 1439T531 1405L680 1163H578Q557 1163 544 1169T517 1191L283 1449H452Z" />
399
+ <glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM842 1449L609
400
+ 1191Q595 1176 582 1170T547 1163H441L589 1405Q603 1428 619 1438T668 1449H842Z" />
401
+ <glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM857
402
+ 1169H738Q717 1169 698 1183L570 1309L553 1326L537 1309L408 1183Q402 1178 391 1174T368 1169H245L468 1433H634L857 1169Z" />
403
+ <glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="1112" d="M300 1013V367Q300 252 353 189T513 126Q591 126 660 163T787 266V1013H965V0H859Q821 0 811 37L797 146Q731 73 649 29T461 -16Q378 -16 315 11T208 89T144 210T122 367V1013H300ZM484
404
+ 1289Q484 1266 475 1246T450 1211T414 1187T370 1178Q348 1178 328 1187T293 1211T268 1246T259 1289Q259 1312 268 1333T292 1369T328 1394T370 1403Q393 1403 413 1394T450 1370T475 1333T484 1289ZM843 1289Q843 1266 834 1246T810 1211T774 1187T730 1178Q707
405
+ 1178 687 1187T651 1211T627 1246T618 1289Q618 1312 627 1333T651 1369T686 1394T730 1403Q753 1403 773 1394T809 1370T834 1333T843 1289Z" />
406
+ <glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443
407
+ -299ZM825 1449L592 1191Q578 1176 565 1170T530 1163H424L572 1405Q586 1428 602 1438T651 1449H825Z" />
408
+ <glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="1104" d="M146 -343V1473H324V866Q387 940 469 984T656 1029Q743 1029 814 996T935 898T1012 736T1039 513Q1039 401 1009 305T923 138T786 27T602 -14Q507 -14 441 20T324 118V-343H146ZM597 887Q510
409
+ 887 445 847T324 734V244Q373 178 431 151T562 124Q703 124 779 225T855 513Q855 612 838 683T787 799T706 866T597 887Z" />
410
+ <glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="1024" d="M443 -299Q434 -319 421 -331T379 -343H247L432 59L14 1013H168Q191 1013 204 1002T223 976L494 338Q503 316 509 294T521 249Q528 272 535 294T551 339L814 976Q820 992 834 1002T866 1013H1008L443
411
+ -299ZM467 1289Q467 1266 458 1246T433 1211T397 1187T353 1178Q331 1178 311 1187T276 1211T251 1246T242 1289Q242 1312 251 1333T275 1369T311 1394T353 1403Q376 1403 396 1394T433 1370T458 1333T467 1289ZM826 1289Q826 1266 817 1246T793 1211T757 1187T713
412
+ 1178Q690 1178 670 1187T634 1211T610 1246T601 1289Q601 1312 610 1333T634 1369T669 1394T713 1403Q736 1403 756 1394T792 1370T817 1333T826 1289Z" />
413
+ <glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="1112" d="M156 655H956V525H156V655Z" />
414
+ <glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="1642" d="M156 655H1486V525H156V655Z" />
415
+ <glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="424" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219 210
416
+ 1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012Z" />
417
+ <glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="424" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301 175
418
+ 1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508Z" />
419
+ <glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="424" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142
420
+ 140Q135 151 135 162Q135 186 162 197L271 241Z" />
421
+ <glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="728" d="M114 1012Q85 1060 72 1108T58 1205Q58 1295 102 1377T227 1529L282 1495Q290 1490 292 1484T295 1472Q295 1458 285 1448Q269 1428 254 1406T227 1360T208 1308T201 1251Q201 1219
422
+ 210 1185T243 1113Q250 1102 250 1090Q250 1066 223 1056L114 1012ZM418 1012Q389 1060 376 1108T362 1205Q362 1295 406 1377T531 1529L586 1495Q594 1490 596 1484T599 1472Q599 1458 589 1448Q573 1428 558 1406T531 1360T512 1308T505 1251Q505 1219 514 1185T547
423
+ 1113Q554 1102 554 1090Q554 1066 527 1056L418 1012Z" />
424
+ <glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="728" d="M271 1508Q300 1460 313 1412T326 1316Q326 1225 282 1143T158 991L103 1025Q95 1030 93 1036T90 1048Q90 1062 100 1072Q116 1091 131 1113T158 1160T177 1212T184 1269Q184 1301
425
+ 175 1335T142 1407Q135 1418 135 1429Q135 1453 162 1464L271 1508ZM575 1508Q604 1460 617 1412T630 1316Q630 1225 586 1143T462 991L407 1025Q399 1030 397 1036T394 1048Q394 1062 404 1072Q420 1091 435 1113T462 1160T481 1212T488 1269Q488 1301 479 1335T446
426
+ 1407Q439 1418 439 1429Q439 1453 466 1464L575 1508Z" />
427
+ <glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="728" d="M271 241Q300 193 313 145T326 49Q326 -42 282 -124T158 -276L103 -242Q95 -237 93 -231T90 -219Q90 -205 100 -195Q116 -176 131 -154T158 -107T177 -55T184 2Q184 34 175 68T142 140Q135
428
+ 151 135 162Q135 186 162 197L271 241ZM575 241Q604 193 617 145T630 49Q630 -42 586 -124T462 -276L407 -242Q399 -237 397 -231T394 -219Q394 -205 404 -195Q420 -176 435 -154T462 -107T481 -55T488 2Q488 34 479 68T446 140Q439 151 439 162Q439 186 466 197L575
429
+ 241Z" />
430
+ <glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="1160" d="M208 595Q208 672 237 740T317 858T434 938T578 968Q655 968 723 939T841 859T921 740T951 595Q951 518 922 451T842 333T723 254T578 224Q502 224 435 253T317 333T238 450T208 595Z" />
431
+ <glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="632" d="M138 518V541L387 930L445 902Q459 895 466 884T473 860Q473 843 463 827L304 566Q290 542 276 529Q291 515 304 493L463 232Q468 224 470 215T473 198Q473 170 445 157L387 129L138 518Z" />
432
+ <glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="632" d="M485 541V518L236 129L178 157Q150 170 150 198Q150 215 160 232L319 493Q332 517 346 529Q334 540 319 566L160 827Q150 844 150 861Q150 889 178 902L236 930L485 541Z" />
433
+ </font>
434
+ </defs>
435
+ </svg>
assets/fonts/oswald/oswald-regular.svg CHANGED
@@ -1,309 +1,309 @@
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 xmlns="http://www.w3.org/2000/svg">
4
- <defs >
5
- <font id="Oswald" horiz-adv-x="458" ><font-face
6
- font-family="Oswald"
7
- units-per-em="1000"
8
- panose-1="0 0 5 0 0 0 0 0 0 0"
9
- ascent="1193"
10
- descent="-289"
11
- alphabetic="0" />
12
- <glyph unicode=" " glyph-name="space" horiz-adv-x="229" />
13
- <glyph unicode="!" glyph-name="exclam" horiz-adv-x="208" d="M50 810H158L122 173H84L50 810ZM50 110H158V0H50V110Z" />
14
- <glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="380" d="M85 810H182L143 562H85V810ZM234 810H331L292 562H234V810Z" />
15
- <glyph unicode="#" glyph-name="numbersign" horiz-adv-x="486" d="M75 290H32V370H87L101 467H34V548H112L150 810H257L219 548H309L347 810H453L415 548H456V467H404L389 370H453V290H378L336 0H229L271 290H182L141 0H34L75 290ZM283 370L297 467H208L193 370H283Z" />
16
- <glyph unicode="$" glyph-name="dollar" horiz-adv-x="491" d="M247 -8Q148 -6 96 56T39 227L139 254Q144 176 169 128T254 80Q298 80 320 104T343 175Q343 224 322 256T255 331L119 451Q78 488 60 529T41 630Q41 716 89 765T223 817V884H258V817Q341 811 383
17
- 760T435 608L339 582Q334 651 313 690T239 730Q142 730 142 641Q142 605 154 582T195 531L332 411Q385 362 416 308T448 184Q448 102 403 52T281 -7V-77H247V-8Z" />
18
- <glyph unicode="%" glyph-name="percent" horiz-adv-x="891" d="M112 380T74 429T36 568V631Q36 723 73 769T193 816Q276 816 313 771T350 636V565Q350 475 313 428T193 380Q112 380 74 429ZM512 811H604L382 0H289L512 811ZM228 461T240 489T253 565V636Q253
19
- 684 241 709T193 735Q157 735 146 709T134 635V564Q134 516 146 489T193 461Q228 461 240 489ZM542 -5T542 183V246Q542 337 578 384T698 431Q781 431 818 386T855 250V180Q855 89 818 42T698 -5Q542 -5 542 183ZM733 76T745 103T758 179V251Q758 299 746 324T698
20
- 350Q662 350 651 324T639 250V179Q639 131 651 104T698 76Q733 76 745 103Z" />
21
- <glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="606" d="M151 -9T105 41T58 173Q58 244 89 300T176 407L154 448Q122 506 105 548T88 638Q88 719 134 768T261 817Q336 817 384 777T433 667Q433 596 390 531T281 402L403 210Q432 266 443 372H549Q549
22
- 316 526 252T471 143Q485 125 506 114T550 102V-8H536Q509 -8 487 4T450 28T407 70Q378 34 334 13T233 -9Q151 -9 105 41ZM278 500T302 557T326 667Q326 696 309 712T261 729Q227 729 211 703T195 638Q195 596 208 554T244 460Q278 500 302 557ZM294 80T342 140L218
23
- 331Q194 300 180 258T165 173Q165 133 181 107T233 80Q294 80 342 140Z" />
24
- <glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="366" d="M85 810H182L143 562H85V810Z" />
25
- <glyph unicode="(" glyph-name="parenleft" horiz-adv-x="298" d="M179 -193T137 -123T84 49T73 311Q73 472 83 574T136 746T268 817V745Q226 744 206 687T181 548T176 336V265Q176 144 181 64T207 -69T268 -123V-194Q179 -193 137 -123Z" />
26
- <glyph unicode=")" glyph-name="parenright" horiz-adv-x="260" d="M29 -122Q71 -121 91 -64T117 75T122 288V358Q122 479 117 559T91 692T29 746V817Q119 817 161 747T214 575T225 313Q225 152 215 50T162 -122T29 -194V-122Z" />
27
- <glyph unicode="*" glyph-name="asterisk" horiz-adv-x="398" d="M84 507L163 618L45 663L71 731L184 671L172 809H253L240 671L354 731L379 663L261 617L341 507L276 469L212 594L147 469L84 507Z" />
28
- <glyph unicode="+" glyph-name="plus" horiz-adv-x="415" d="M165 375H25V456H165V619H245V456H390V375H245V212H165V375Z" />
29
- <glyph unicode="," glyph-name="comma" horiz-adv-x="187" d="M40 -85Q67 -76 82 -54T98 0H41V115H151V2Q151 -51 128 -82T57 -131L40 -85Z" />
30
- <glyph unicode="-" glyph-name="hyphen" horiz-adv-x="321" d="M49 342H272V261H49V342Z" />
31
- <glyph unicode="." glyph-name="period" horiz-adv-x="188" d="M49 119H156V0H49V119Z" />
32
- <glyph unicode="/" glyph-name="slash" horiz-adv-x="369" d="M247 810H340L121 0H29L247 810Z" />
33
- <glyph unicode="0" glyph-name="zero" horiz-adv-x="491" d="M146 -9T96 56T45 230V579Q45 690 94 753T246 817Q347 817 396 754T446 579V230Q446 120 396 56T246 -9Q146 -9 96 56ZM338 79T338 229V580Q338 649 319 689T246 730Q193 730 173 690T153 580V229Q153
34
- 79 246 79Q338 79 338 229Z" />
35
- <glyph unicode="1" glyph-name="one" horiz-adv-x="467" d="M222 670Q220 667 162 656T81 641V722Q203 751 248 810H329V0H222V670Z" />
36
- <glyph unicode="2" glyph-name="two" horiz-adv-x="478" d="M41 76L247 397Q262 421 267 427Q302 483 318 520T334 609Q334 667 315 698T253 729Q157 729 157 580V553H50V581Q50 695 97 756T248 817Q344 817 393 763T442 608Q442 559 431 521T403 454T353 374L167
37
- 90H423V0H41V76Z" />
38
- <glyph unicode="3" glyph-name="three" horiz-adv-x="467" d="M141 -9T91 45T40 199V226H146V208Q148 146 167 113T238 80Q292 80 311 117T331 229Q331 297 306 335T225 378Q221 379 210 379V486H224Q281 488 306 516T331 609Q331 669 311 699T239 730Q187 730
39
- 168 697T146 600V583H40V610Q40 709 90 763T239 817Q337 817 387 763T438 609Q438 538 407 493T322 432Q377 415 407 363T438 229Q438 116 390 54T238 -9Q141 -9 91 45Z" />
40
- <glyph unicode="4" glyph-name="four" horiz-adv-x="491" d="M273 213H40V332L248 810H381V314H471V213H381V0H273V213ZM273 314V674L148 314H273Z" />
41
- <glyph unicode="5" glyph-name="five" horiz-adv-x="476" d="M138 -8T93 51T47 227H154Q154 159 172 118T245 77Q286 77 306 101T331 164T337 270Q337 331 331 367T305 423T246 443Q215 443 192 424T156 376H65V810H414V703H162L155 479Q198 524 272 524Q365 524
42
- 404 461T444 284Q444 146 399 69T243 -8Q138 -8 93 51Z" />
43
- <glyph unicode="6" glyph-name="six" horiz-adv-x="489" d="M153 -9T104 64T54 257V530Q54 661 100 739T253 817Q347 817 398 766T451 620L452 608H344Q344 670 324 699T253 729Q161 729 161 556V433Q177 459 207 474T279 489Q374 489 414 429T454 255Q454 136
44
- 405 64T253 -9Q153 -9 104 64ZM303 80T324 121T346 229Q346 290 341 326T316 385T253 408Q222 408 199 392T161 353V232Q161 163 182 122T253 80Q303 80 324 121Z" />
45
- <glyph unicode="7" glyph-name="seven" horiz-adv-x="385" d="M244 726H27V810H351V758L201 0H98L244 726Z" />
46
- <glyph unicode="8" glyph-name="eight" horiz-adv-x="478" d="M134 -9T87 52T40 228Q40 305 65 351T140 427Q50 487 50 608Q50 707 97 762T240 817Q335 817 381 762T428 608Q428 543 405 500T338 427Q387 396 413 350T439 228Q439 114 392 53T240 -9Q134 -9 87
47
- 52ZM323 477T323 614Q323 668 304 701T240 734Q196 734 176 701T155 614Q155 554 174 516T240 476Q323 477 323 614ZM294 76T315 115T336 226Q336 291 314 332T240 374Q188 373 165 332T142 226Q142 155 163 116T240 76Q294 76 315 115Z" />
48
- <glyph unicode="9" glyph-name="nine" horiz-adv-x="489" d="M150 -9T99 43T46 192V201H153Q153 139 173 110T246 80Q336 80 336 253V376Q320 350 291 335T218 320Q123 320 84 380T44 554Q44 673 93 745T245 817Q345 817 394 744T444 552V280Q444 149 398 70T245
49
- -9Q150 -9 99 43ZM304 401T336 457V577Q336 729 245 729Q195 729 174 688T152 580Q152 519 157 483T182 424T245 401Q304 401 336 457Z" />
50
- <glyph unicode=":" glyph-name="colon" horiz-adv-x="197" d="M60 529H168V415H60V529ZM60 210H168V96H60V210Z" />
51
- <glyph unicode=";" glyph-name="semicolon" horiz-adv-x="215" d="M59 565H167V446H59V565ZM58 1Q116 5 116 68H59V182H170V70Q170 15 148 -14T76 -46L58 1Z" />
52
- <glyph unicode="&lt;" glyph-name="less" horiz-adv-x="373" d="M29 238V345L315 549V441L110 292L315 143V36L29 238Z" />
53
- <glyph unicode="=" glyph-name="equal" horiz-adv-x="415" d="M54 538H361V456H54V538ZM54 360H361V279H54V360Z" />
54
- <glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="373" d="M58 143L264 293L58 441V549L345 346V239L58 36V143Z" />
55
- <glyph unicode="?" glyph-name="question" horiz-adv-x="487" d="M162 327Q250 403 295 469T341 615Q341 664 316 694T245 724Q205 724 182 702T158 642Q158 624 165 592L65 573Q54 604 54 636Q54 717 104 767T245 817Q340 817 393 763T446 612Q446 548 422 495T358
56
- 397T257 300V203H162V327ZM157 110H264V0H157V110Z" />
57
- <glyph unicode="@" glyph-name="at" horiz-adv-x="904" d="M350 -134T258 -88T112 51T59 282Q59 457 116 575T274 751T511 810Q626 810 705 757T822 617T861 426Q861 337 832 262T747 142T621 98Q578 98 551 123T522 190Q513 154 490 129T427 100L413 99Q348 99
58
- 313 151T277 279Q277 355 307 431T392 555T514 604Q529 604 547 597T579 579L589 596H667L610 229Q607 210 607 192Q607 175 612 167T633 158Q675 158 709 193T763 287T783 417Q783 503 753 573T661 684T504 726Q400 726 322 672T200 519T156 286Q156 119 243 34T479
59
- -51Q567 -51 661 -24L680 -102Q569 -134 470 -134Q350 -134 258 -88ZM465 181T490 207T525 287L560 520Q545 525 532 525Q492 525 457 492T399 401T377 278Q377 236 392 209T437 181Q465 181 490 207Z" />
60
- <glyph unicode="A" glyph-name="A" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314Z" />
61
- <glyph unicode="B" glyph-name="B" horiz-adv-x="524" d="M63 810H249Q359 810 412 761T465 607Q465 452 349 436Q421 419 454 369T487 231Q487 122 436 61T279 0H63V810ZM243 472Q313 472 340 502T367 607Q367 661 351 686T301 719T203 726H176V472H243ZM252
62
- 81Q302 81 329 96T368 144T379 231Q379 309 347 347T243 386H176V81H252Z" />
63
- <glyph unicode="C" glyph-name="C" horiz-adv-x="515" d="M146 -9T97 62T48 260V546Q48 679 96 748T266 817Q375 817 422 758T470 584V520H363V577Q363 633 358 663T333 711T267 729Q221 729 199 710T169 656T162 563V242Q162 180 172 145T204 95T267 80Q310 80
64
- 331 99T357 151T363 241V301H470V241Q470 120 425 56T266 -9Q146 -9 97 62Z" />
65
- <glyph unicode="D" glyph-name="D" horiz-adv-x="527" d="M63 810H239Q370 810 424 750T479 563V265Q479 131 426 66T248 0H63V810ZM240 81Q299 81 325 104T358 166T365 286V549Q365 618 357 654T321 708T237 726H176V81H240Z" />
66
- <glyph unicode="E" glyph-name="E" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810Z" />
67
- <glyph unicode="F" glyph-name="F" horiz-adv-x="391" d="M63 810H376V729H176V459H331V379H176V0H63V810Z" />
68
- <glyph unicode="G" glyph-name="G" horiz-adv-x="535" d="M146 -10T97 59T48 266V537Q48 631 67 691T134 784T265 817Q377 817 426 760T476 581V551H370V576Q370 634 363 665T334 713T267 729Q220 729 197 708T168 650T161 554V254Q161 161 183 121T270 80Q333
69
- 80 356 124T380 265V321H277V401H482V0H411L400 93Q362 -10 256 -10Q146 -10 97 59Z" />
70
- <glyph unicode="H" glyph-name="H" horiz-adv-x="561" d="M63 810H176V460H384V810H497V0H384V379H176V0H63V810Z" />
71
- <glyph unicode="I" glyph-name="I" horiz-adv-x="248" d="M69 810H180V0H69V810Z" />
72
- <glyph unicode="J" glyph-name="J" horiz-adv-x="301" d="M7 62Q58 62 82 71T116 106T125 185V810H237V183Q237 110 222 67T169 2T61 -19H7V62Z" />
73
- <glyph unicode="K" glyph-name="K" horiz-adv-x="495" d="M63 810H176V428L362 810H467L307 453L493 0H383L228 380L176 286V0H63V810Z" />
74
- <glyph unicode="L" glyph-name="L" horiz-adv-x="397" d="M63 810H176V81H383V0H63V810Z" />
75
- <glyph unicode="M" glyph-name="M" horiz-adv-x="660" d="M76 810H187L330 153L474 810H584L599 0H508L499 588L362 0H298L162 588L153 0H61L76 810Z" />
76
- <glyph unicode="N" glyph-name="N" horiz-adv-x="528" d="M63 810H140L370 272V810H464V0H392L159 553V0H63V810Z" />
77
- <glyph unicode="O" glyph-name="O" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184 694T162 584V229Q162
78
- 154 184 117T270 80Q333 80 355 117Z" />
79
- <glyph unicode="P" glyph-name="P" horiz-adv-x="480" d="M63 810H264Q369 810 416 753T464 586Q464 487 413 432T265 377H176V0H63V810ZM228 458Q278 458 305 469T345 507T357 585Q357 647 348 676T313 717T229 729H176V458H228Z" />
80
- <glyph unicode="Q" glyph-name="Q" horiz-adv-x="541" d="M374 -134T289 -8L270 -9Q151 -9 100 58T48 254V561Q48 687 100 752T270 817Q388 817 440 752T492 561V253Q492 60 373 10Q423 -55 453 -75L435 -164Q374 -134 289 -8ZM334 80T356 117T378 229V584Q378
81
- 658 356 693T270 729Q206 729 184 694T162 584V229Q162 154 184 117T270 80Q334 80 356 117Z" />
82
- <glyph unicode="R" glyph-name="R" horiz-adv-x="519" d="M63 810H226Q349 810 406 760T464 595Q464 439 364 406L479 0H370L264 380H176V0H63V810ZM219 461Q292 461 323 490T355 595Q355 645 344 673T305 715T226 729H176V461H219Z" />
83
- <glyph unicode="S" glyph-name="S" horiz-adv-x="473" d="M152 -9T99 54T39 227L139 254Q144 176 169 128T254 80Q298 80 320 104T343 175Q343 224 322 256T255 331L119 451Q78 488 60 529T41 630Q41 720 93 768T236 817Q331 817 378 766T435 608L339 582Q334
84
- 651 313 690T239 730Q142 730 142 641Q142 605 154 582T195 531L332 411Q385 362 416 308T448 184Q448 95 394 43T254 -9Q152 -9 99 54Z" />
85
- <glyph unicode="T" glyph-name="T" horiz-adv-x="400" d="M146 726H-1V810H402V726H259V0H146V726Z" />
86
- <glyph unicode="U" glyph-name="U" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25Z" />
87
- <glyph unicode="V" glyph-name="V" horiz-adv-x="505" d="M23 810H129L257 213L379 810H482L303 0H204L23 810Z" />
88
- <glyph unicode="W" glyph-name="W" horiz-adv-x="729" d="M36 810H130L217 228L326 807H406L516 225L601 810H693L563 0H481L368 600L254 0H168L36 810Z" />
89
- <glyph unicode="X" glyph-name="X" horiz-adv-x="482" d="M182 424L16 810H121L244 524L356 810H461L291 415L469 0H364L232 305L118 0H13L182 424Z" />
90
- <glyph unicode="Y" glyph-name="Y" horiz-adv-x="481" d="M187 286L12 810H117L241 419L363 810H469L295 286V0H187V286Z" />
91
- <glyph unicode="Z" glyph-name="Z" horiz-adv-x="417" d="M38 81L276 729H53V810H396V761L145 81H396V0H38V81Z" />
92
- <glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="340" d="M63 810H283V755H170V-129H283V-184H63V810Z" />
93
- <glyph unicode="\" glyph-name="backslash" horiz-adv-x="369" d="M29 810H121L340 0H247L29 810Z" />
94
- <glyph unicode="]" glyph-name="bracketright" horiz-adv-x="310" d="M26 -129H139V754H26V810H247V-184H26V-129Z" />
95
- <glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="443" d="M168 810H276L410 487H308L222 730L135 487H34L168 810Z" />
96
- <glyph unicode="_" glyph-name="underscore" horiz-adv-x="344" d="M0 -53H344V-134H0V-53Z" />
97
- <glyph unicode="`" glyph-name="grave" horiz-adv-x="278" d="M57 810H164L221 612H167L57 810Z" />
98
- <glyph unicode="a" glyph-name="a" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74 387 0H289Q278
99
- 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100Z" />
100
- <glyph unicode="b" glyph-name="b" horiz-adv-x="447" d="M209 -8T163 42V0H56V810H163V532Q210 586 272 586Q351 586 377 519T404 369V229Q404 -8 261 -8Q209 -8 163 42ZM276 76T286 113T297 229V369Q297 433 285 467T235 502Q200 502 163 473V102Q196 76 239
101
- 76Q276 76 286 113Z" />
102
- <glyph unicode="c" glyph-name="c" horiz-adv-x="411" d="M144 -8T107 19T57 96T43 222V355Q43 433 56 483T107 559T212 586Q274 586 308 566T356 507T370 404V370H273V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156 119T175
103
- 82T214 71Q251 71 262 95T273 171V218H370V178Q370 84 336 38T212 -8Q144 -8 107 19Z" />
104
- <glyph unicode="d" glyph-name="d" horiz-adv-x="442" d="M112 -8T78 47T43 227V339Q43 454 73 520T185 586Q236 586 281 541V810H388V0H281V37Q239 -8 186 -8Q112 -8 78 47ZM247 76T281 98V477Q244 502 213 502Q150 502 150 381V218Q150 148 163 112T215 76Q247
105
- 76 281 98Z" />
106
- <glyph unicode="e" glyph-name="e" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214 -8Q147
107
- -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273Z" />
108
- <glyph unicode="f" glyph-name="f" horiz-adv-x="287" d="M88 499H19V578H88V608Q88 668 97 704T133 761T213 781Q236 781 283 776V696Q275 697 263 699T243 701Q214 701 205 683T195 626V578H283V499H195V0H88V499Z" />
109
- <glyph unicode="g" glyph-name="g" horiz-adv-x="435" d="M131 -179T76 -162T20 -89Q20 -44 43 -11T103 41Q76 49 62 66T47 103Q47 133 62 155T111 208Q77 234 61 273T44 380Q44 481 85 533T207 586Q253 586 282 570T326 522Q333 533 355 551T404 582L420 589L447
110
- 520Q427 516 392 503T349 483Q356 465 361 433T367 377Q367 282 330 230T207 177Q180 177 152 184Q150 181 142 167T133 140Q133 129 144 123T181 114Q196 112 226 110T271 106Q405 94 405 -35Q405 -112 364 -145T234 -179Q131 -179 76 -162ZM250 252T263 282T276
111
- 380Q276 449 263 480T208 512Q166 512 152 481T137 380Q137 318 151 285T207 252Q250 252 263 282ZM279 -95T301 -82T323 -38Q323 -10 306 3T244 21L153 29Q138 17 124 -3T110 -46Q110 -64 119 -74T154 -90T232 -95Q279 -95 301 -82Z" />
112
- <glyph unicode="h" glyph-name="h" horiz-adv-x="445" d="M57 810H164V518Q236 586 309 586Q356 586 375 552T395 468V0H288V437Q288 470 278 486T242 502Q207 502 164 464V0H57V810Z" />
113
- <glyph unicode="i" glyph-name="i" horiz-adv-x="229" d="M61 776H168V664H61V776ZM61 578H168V0H61V578Z" />
114
- <glyph unicode="j" glyph-name="j" horiz-adv-x="230" d="M69 776H177V664H69V776ZM-3 -146T-19 -139V-62Q2 -65 9 -65Q42 -65 55 -47T69 5V578H176V-6Q176 -74 139 -110T36 -146Q-3 -146 -19 -139Z" />
115
- <glyph unicode="k" glyph-name="k" horiz-adv-x="429" d="M56 811H163V328L319 578H431L295 352L427 0H320L212 296L163 222V1H56V811Z" />
116
- <glyph unicode="l" glyph-name="l" horiz-adv-x="229" d="M64 810H171V0H64V810Z" />
117
- <glyph unicode="m" glyph-name="m" horiz-adv-x="680" d="M54 578H153V523Q182 555 216 571T289 588Q363 588 383 515Q443 588 527 588Q572 588 600 555T629 454V0H531V447Q531 485 519 501T484 518Q461 518 437 506T391 471V454V0H293V447Q293 485 281 501T246
118
- 518Q223 518 199 506T153 471V0H54V578Z" />
119
- <glyph unicode="n" glyph-name="n" horiz-adv-x="439" d="M54 578H161V521Q230 586 302 586Q349 586 369 552T389 468V0H282V437Q282 470 272 486T236 502Q204 502 161 466V0H54V578Z" />
120
- <glyph unicode="o" glyph-name="o" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183 507 170
121
- 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88Z" />
122
- <glyph unicode="p" glyph-name="p" horiz-adv-x="446" d="M54 578H161V532Q208 586 271 586Q350 586 376 519T403 369V229Q403 123 371 58T259 -8Q208 -8 161 43V-190H54V578ZM275 76T285 113T296 229V369Q296 433 284 467T234 502Q197 502 161 472V102Q196 76
123
- 238 76Q275 76 285 113Z" />
124
- <glyph unicode="q" glyph-name="q" horiz-adv-x="443" d="M282 37Q240 -8 187 -8Q113 -8 79 47T44 227V339Q44 454 74 520T186 586Q237 586 282 541V578H389V-190H282V37ZM250 76T282 98V477Q245 502 214 502Q151 502 151 381V218Q151 148 164 112T216 76Q250 76 282 98Z" />
125
- <glyph unicode="r" glyph-name="r" horiz-adv-x="321" d="M57 578H164V496Q194 545 225 565T292 585Q301 585 309 584V466Q277 478 250 478Q224 478 204 466T164 422V0H57V578Z" />
126
- <glyph unicode="s" glyph-name="s" horiz-adv-x="374" d="M118 -8T75 36T25 154L114 181Q121 125 139 98T192 71Q220 71 238 88T256 133Q256 178 209 218L110 303Q76 332 58 363T39 441Q39 510 79 548T188 586Q254 586 291 544T335 434L263 407Q256 456 240 481T192
127
- 507Q166 507 150 490T135 448Q135 415 164 390L266 296Q304 262 326 226T348 140Q348 68 305 30T188 -8Q118 -8 75 36Z" />
128
- <glyph unicode="t" glyph-name="t" horiz-adv-x="308" d="M142 -8T113 26T83 130V507H22V578H83V747H190V578H283V507H190V137Q190 102 201 88T243 74Q263 74 282 77V-2Q242 -8 208 -8Q142 -8 113 26Z" />
129
- <glyph unicode="u" glyph-name="u" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26Z" />
130
- <glyph unicode="v" glyph-name="v" horiz-adv-x="385" d="M15 578H123L194 113L266 578H370L260 0H129L15 578Z" />
131
- <glyph unicode="w" glyph-name="w" horiz-adv-x="588" d="M28 578H116L176 152L253 578H335L412 154L472 578H560L464 0H374L295 408L217 0H121L28 578Z" />
132
- <glyph unicode="x" glyph-name="x" horiz-adv-x="389" d="M139 304L12 578H114L199 395L274 578H379L247 291L381 0H279L188 196L110 0H9L139 304Z" />
133
- <glyph unicode="y" glyph-name="y" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63Z" />
134
- <glyph unicode="z" glyph-name="z" horiz-adv-x="347" d="M32 72L209 498H50V578H324V520L146 81H320V0H32V72Z" />
135
- <glyph unicode="{" glyph-name="braceleft" horiz-adv-x="300" d="M189 -191T154 -178T108 -126T98 10V151Q98 207 94 232T77 267T40 276V350Q65 350 77 359T93 394T98 476V616Q98 713 108 751T153 803T277 817V738Q242 738 229 731T213 701T210 616V460Q210 389
136
- 193 355T144 313Q176 306 193 272T210 167V10Q210 -53 213 -75T229 -104T277 -112V-191Q189 -191 154 -178Z" />
137
- <glyph unicode="|" glyph-name="bar" horiz-adv-x="239" d="M70 810H169V-148H69L70 810Z" />
138
- <glyph unicode="}" glyph-name="braceright" horiz-adv-x="321" d="M44 -112Q79 -112 92 -105T108 -75T111 10V167Q111 238 128 272T178 313Q145 321 128 355T111 460V616Q111 678 108 700T92 730T44 738V817Q132 817 167 804T213 752T223 616V476Q223 419 227
139
- 394T243 359T281 350V276Q255 276 244 267T228 233T223 151V10Q223 -87 213 -125T168 -177T44 -191V-112Z" />
140
- <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="447" d="M279 363T260 370T215 393Q193 406 177 413T146 420Q133 420 113 409T73 382L35 433Q60 459 95 482T154 506Q171 506 189 499T232 476Q256 463 272 456T302 449Q315 449 331 459T374 489L412
141
- 440Q387 411 354 387T296 363Q279 363 260 370Z" />
142
- <glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="229" />
143
- <glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="208" d="M50 632H158V522H50V632ZM85 458H123L158 -178H50L85 458Z" />
144
- <glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="388" d="M178 -6Q99 3 71 59T43 222V355Q43 463 71 519T179 584V656H213V586Q274 586 308 566T356 506T370 404V370H273V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156
145
- 119T175 82T214 71Q251 71 262 95T273 171V218H370V178Q370 84 336 38T212 -8V-79H178V-6Z" />
146
- <glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="398" d="M2 54L61 80V354H2V434H61V526Q61 618 72 679T121 779T230 817Q370 817 372 644V611H292Q292 666 280 698T230 730Q193 730 181 695T167 598V434H287V354H167V81H371V0H2V54Z" />
147
- <glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="550" d="M38 201L118 280Q92 308 78 345T63 423Q63 463 77 500T118 566L38 645L53 660L132 581Q160 608 197 622T275 637Q316 637 353 623T418 581L497 660L512 645L433 566Q458 537 472 501T486 423Q486
148
- 382 472 345T432 280L512 201L497 186L418 265Q389 238 353 223T275 209Q234 208 198 223T132 265L53 186L38 201ZM321 252T359 275T419 337T441 423Q441 469 419 508T359 571T275 594Q229 594 192 571T132 509T110 423Q110 377 132 338T191 275T275 252Q321 252
149
- 359 275Z" />
150
- <glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="457" d="M185 115H96V185H185V250H96V319H174L10 810H115L238 419L360 810H467L304 319H381V250H292V185H381V115H292V0H185V115Z" />
151
- <glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="212" d="M63 810H149V400H63V810ZM63 256H149V-153H63V256Z" />
152
- <glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="427" d="M144 -8T102 34T43 145L124 172Q155 80 214 80Q246 80 264 97T282 147Q282 187 240 218L125 293Q85 318 64 348T42 425Q42 473 65 507T127 557Q92 580 69 611T45 682Q45 745 91 781T214 817Q284
153
- 817 325 775T383 667L302 640Q287 679 267 704T213 730Q185 730 169 714T152 669Q152 652 162 638T187 613L316 529Q349 508 367 474T386 395Q386 349 367 317T313 266Q346 238 364 210T383 142Q383 70 337 31T214 -8Q144 -8 102 34ZM260 334T274 351T289 392Q290
154
- 411 281 430T253 462L197 500Q178 490 164 470T149 425Q149 409 157 394T178 370L240 325Q260 334 274 351Z" />
155
- <glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="400" d="M60 810H167V699H60V810ZM231 810H339V699H231V810Z" />
156
- <glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="862" d="M296 -11T206 50T72 207T29 412Q29 520 72 616T205 773T431 834Q566 834 656 774T790 617T833 412Q833 303 791 207T658 50T431 -11Q296 -11 206 50ZM551 33T630 86T748 226T787 412Q787
157
- 512 749 598T631 737T434 790Q317 790 238 737T120 598T81 412Q81 312 119 226T237 87T434 33Q551 33 630 86ZM356 124T315 152T260 232T245 364V471Q245 553 260 605T316 684T432 712Q501 712 539 692T592 630T607 523V496H502V523Q502 583 487 606T434 630Q404
158
- 630 388 618T366 576T360 494V336Q360 284 367 257T390 218T434 207Q475 207 488 232T502 311V343H607V318Q607 220 569 172T432 124Q356 124 315 152Z" />
159
- <glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="443" d="M134 321T106 352T77 432Q77 481 101 512T160 560T256 598L276 605V658Q276 700 267 722T233 745Q181 745 181 657H93Q95 732 132 777T234 822Q312 822 341 775T370 628V327H284V391Q268
160
- 360 240 341T178 321Q134 321 106 352ZM233 403T250 417T276 450V563Q240 544 220 531T186 499T172 454Q172 430 183 417T213 403Q233 403 250 417Z" />
161
- <glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="455" d="M31 269V321L194 549V415L112 295L194 174V41L31 269ZM225 269V321L389 549V415L307 295L389 174V41L225 269Z" />
162
- <glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="387" d="M305 368H40V449H360V256H305V368Z" />
163
- <glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="344" d="M58 548H288V467H58V548Z" />
164
- <glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="888" d="M310 -13T221 47T89 202T46 405Q46 512 88 607T220 763T444 823Q578 823 667 763T799 608T842 405Q842 297 800 202T669 47T444 -13Q310 -13 221 47ZM556 37T633 89T747 224T784 405Q784
165
- 502 747 585T634 720T444 771Q331 771 254 720T140 586T103 405Q103 308 140 225T254 89T444 37Q556 37 633 89ZM292 674H448Q617 674 617 520Q617 428 532 392L628 144H531L446 373H385V144H292V674ZM418 423Q459 423 481 432T512 463T521 522Q521 567 503 589T440
166
- 612H385V423H418Z" />
167
- <glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="284" d="M46 810H238V745H46V810Z" />
168
- <glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="453" d="M148 481T103 526T58 650Q58 728 103 772T226 817Q304 817 349 773T395 650Q395 571 350 526T226 481Q148 481 103 526ZM267 553T290 579T313 650Q313 694 290 720T226 747Q185 747 162 721T139
169
- 650Q139 606 162 580T226 553Q267 553 290 579Z" />
170
- <glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="368" d="M144 262H57V344H144V431H226V344H313V262H226V175H144V262ZM57 82H313V0H57V82Z" />
171
- <glyph unicode="&#xb2;" glyph-name="uni00B2" horiz-adv-x="422" d="M77 494L201 629Q247 678 264 706T281 760Q281 790 267 806T224 823Q187 823 171 799T155 727H76V741Q76 812 112 855T224 898Q289 898 326 863T363 765Q363 718 342 681T266 589L183 503H368V433H77V494Z"
172
- />
173
- <glyph unicode="&#xb3;" glyph-name="uni00B3" horiz-adv-x="426" d="M147 423T113 459T78 559V575H157V571Q157 498 222 498Q278 498 278 563Q278 596 265 612T221 629H195V695H218Q273 695 273 760Q273 789 259 806T218 823Q157 823 157 750V746H78V762Q78 828
174
- 116 863T220 898Q283 898 319 866T355 776Q355 733 337 704T289 664Q360 640 360 554Q360 490 323 457T220 423Q147 423 113 459Z" />
175
- <glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="277" d="M115 810H222L110 612H56L115 810Z" />
176
- <glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="441" d="M50 578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q239 17 191 2Q174 -3 159 -3V-175H51L50 578Z" />
177
- <glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="492" d="M199 515Q123 515 78 553T32 662Q32 736 80 773T215 810H429V-96H352V759H275V-96H199V515Z" />
178
- <glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="176" d="M36 432H144V322H36V432Z" />
179
- <glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="352" d="M118 -235T80 -225V-171Q104 -178 131 -178Q158 -178 175 -169T192 -139Q192 -114 172 -102T107 -83V0H161V-56Q211 -56 241 -79T272 -142Q272 -188 238 -211T147 -235Q118 -235 80 -225Z" />
180
- <glyph unicode="&#xb9;" glyph-name="uni00B9" horiz-adv-x="340" d="M172 789L80 753V822L211 888H250V433H172V789Z" />
181
- <glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="443" d="M138 320T103 367T67 505V637Q67 727 102 774T222 822Q302 822 339 773T376 637V505Q376 418 339 369T222 320Q138 320 103 367ZM249 398T262 413T279 453T282 517V625Q282 665 279 688T263
182
- 727T220 743Q179 743 168 713T156 625V517Q156 459 168 429T220 398Q249 398 262 413Z" />
183
- <glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="481" d="M57 174L148 295L57 415V549L230 321V269L57 41V174ZM252 174L343 295L252 415V549L424 321V269L252 41V174Z" />
184
- <glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="945" d="M184 967L92 931V1000L223 1066H262V611H184V967ZM586 810H678L307 0H215L586 810ZM677 107H505V166L696 455H755V168H799V107H755V0H677V107ZM677 168L676 314L584 168H677Z" />
185
- <glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="945" d="M405 967L313 931V1000L444 1066H483V611H405V967ZM551 810H643L272 0H180L551 810ZM555 61L679 196Q725 245 742 273T759 327Q759 357 745 373T702 390Q665 390 649 366T633 294H554V308Q554
186
- 379 590 422T702 465Q767 465 804 430T841 332Q841 285 820 248T744 156L661 70H846V0H555V61Z" />
187
- <glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="874" d="M384 598T350 634T315 734V750H394V746Q394 673 459 673Q515 673 515 738Q515 771 502 787T458 804H432V870H455Q510 870 510 935Q510 964 496 981T455 998Q394 998 394 925V921H315V937Q315
188
- 1003 353 1038T457 1073Q520 1073 556 1041T592 951Q592 908 574 879T526 839Q597 815 597 729Q597 665 560 632T457 598Q384 598 350 634ZM627 810H719L348 0H256L627 810ZM718 107H546V166L737 455H796V168H840V107H796V0H718V107ZM718 168L717 314L625 168H718Z"
189
- />
190
- <glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="487" d="M344 518H237V628H344V518ZM339 301Q251 225 206 159T160 13Q160 -36 185 -66T256 -96Q296 -96 319 -74T343 -14Q343 5 336 36L436 55Q447 24 447 -8Q447 -89 397 -139T256 -189Q161 -189
191
- 108 -135T55 16Q55 80 79 133T143 231T244 328V425H339V301Z" />
192
- <glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM110 1056H217L274 858H221L110 1056Z" />
193
- <glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM277 1056H384L272 858H218L277 1056Z" />
194
- <glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM191 1042H300L387 867H306L245 988L185 867H105L191 1042Z" />
195
- <glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM302 932T286 939T248 959Q228 970 216 975T191 981Q173 981 165 972T157 940H96Q96 1048 176 1048Q193
196
- 1048 208 1042T244 1023Q264 1011 276 1006T303 1000Q321 1000 328 1009T336 1042H396Q396 991 380 962T322 932Q302 932 286 939Z" />
197
- <glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM106 1042H214V931H106V1042ZM278 1042H386V931H278V1042Z" />
198
- <glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM196 828T165 858T134 940Q134 991 164 1021T246 1051Q297 1051 327 1021T358 940Q358 889 327 859T246
199
- 828Q196 828 165 858ZM272 882T288 897T304 940Q304 967 289 982T246 998Q219 998 204 983T188 940Q188 913 203 898T246 882Q272 882 288 897Z" />
200
- <glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="635" d="M290 810H605V728H400V460H547V379H400V82H605V0H292V205H143L57 0H-51L290 810ZM292 286V605L173 286H292Z" />
201
- <glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="515" d="M363 520V577Q363 633 358 663T333 711T267 729Q221 729 199 710T169 656T162 563V242Q162 180 172 145T204 95T267 80Q310 80 331 99T357 151T363 241V301H470V241Q470 125 429 61T285 -8V-56Q335
202
- -56 365 -79T396 -142Q396 -188 362 -211T271 -235Q242 -235 204 -225V-171Q228 -178 255 -178Q282 -178 299 -169T316 -139Q316 -114 296 -102T231 -83V-7Q131 4 90 74T48 260V546Q48 679 96 748T266 817Q375 817 422 758T470 584V520H363Z" />
203
- <glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM88 1056H195L252 858H199L88 1056Z" />
204
- <glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM255 1056H362L250 858H196L255 1056Z" />
205
- <glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM169 1042H278L365 867H284L223 988L163 867H83L169 1042Z" />
206
- <glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM84 1042H192V931H84V1042ZM256 1042H364V931H256V1042Z" />
207
- <glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="248" d="M69 810H180V0H69V810ZM-12 1056H95L152 858H99L-12 1056Z" />
208
- <glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="248" d="M69 810H180V0H69V810ZM155 1056H262L150 858H96L155 1056Z" />
209
- <glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="248" d="M69 810H180V0H69V810ZM69 1042H178L265 867H184L123 988L63 867H-17L69 1042Z" />
210
- <glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="248" d="M69 810H180V0H69V810ZM-16 1042H92V931H-16V1042ZM156 1042H264V931H156V1042Z" />
211
- <glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="518" d="M63 388H14V453H63V810H239Q370 810 424 750T479 563V265Q479 131 426 66T248 0H63V388ZM240 81Q299 81 325 104T358 166T365 286V549Q365 618 357 654T321 708T237 726H176V453H237V388H176V81H240Z" />
212
- <glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="528" d="M63 810H140L370 272V810H464V0H392L159 553V0H63V810ZM320 932T304 939T266 959Q246 970 234 975T209 981Q191 981 183 972T175 940H114Q114 1048 194 1048Q211 1048 226 1042T262 1023Q282
213
- 1011 294 1006T321 1000Q339 1000 346 1009T354 1042H414Q414 991 398 962T340 932Q320 932 304 939Z" />
214
- <glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
215
- 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM134 1056H241L298 858H245L134 1056Z" />
216
- <glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
217
- 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM301 1056H408L296 858H242L301 1056Z" />
218
- <glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729
219
- 184 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM215 1042H324L411 867H330L269 988L209 867H129L215 1042Z" />
220
- <glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
221
- 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM326 932T310 939T272 959Q252 970 240 975T215 981Q197 981 189 972T181 940H120Q120 1048 200 1048Q217 1048 232 1042T268 1023Q288 1011 300 1006T327 1000Q345 1000 352 1009T360 1042H420Q420 991
222
- 404 962T346 932Q326 932 310 939Z" />
223
- <glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729
224
- 184 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM130 1042H238V931H130V1042ZM302 1042H410V931H302V1042Z" />
225
- <glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="383" d="M49 308L138 397L49 486L103 540L191 451L280 540L334 486L245 397L334 308L280 254L191 343L103 254L49 308Z" />
226
- <glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="540" d="M491 737T491 561V253Q491 127 439 59T270 -9Q217 -9 181 4L160 -74L121 -62L143 21Q93 51 71 109T48 254V561Q48 687 100 752T270 817Q315 817 353 806L373 880L413 870L392 791Q491 737 491
227
- 561ZM162 169T174 137L329 717Q307 729 270 729Q206 729 184 694T162 584V229Q162 169 174 137ZM377 584Q377 651 362 681L206 96Q230 80 270 80Q333 80 355 117T377 229V584Z" />
228
- <glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM136 1056H243L300 858H247L136 1056Z" />
229
- <glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM303 1056H410L298 858H244L303 1056Z" />
230
- <glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM217 1042H326L413 867H332L271
231
- 988L211 867H131L217 1042Z" />
232
- <glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM132 1042H240V931H132V1042ZM304
233
- 1042H412V931H304V1042Z" />
234
- <glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="481" d="M187 286L12 810H117L241 419L363 810H469L295 286V0H187V286ZM272 1056H379L267 858H213L272 1056Z" />
235
- <glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="503" d="M63 810H176V704H293Q391 704 438 642T486 469Q486 233 274 233H176V0H63V810ZM246 324Q315 324 345 355T376 469Q376 546 349 578T259 610H176V324H246Z" />
236
- <glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="515" d="M223 80Q275 80 303 97T342 147T353 232Q353 298 322 336T230 375L231 464Q281 464 302 506T324 611Q324 669 307 700T244 731Q199 731 183 702T166 613V0H59V612Q59 709 105 764T241 819Q335
237
- 819 382 766T429 611Q429 541 405 498T330 428Q392 412 425 360T459 232Q459 114 403 53T223 -9V80Z" />
238
- <glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
239
- 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM83 824H190L247 626H194L83 824Z" />
240
- <glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
241
- 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM250 824H357L245 626H191L250 824Z" />
242
- <glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377
243
- 74 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM164 810H273L360 635H279L218 756L158 635H78L164 810Z" />
244
- <glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
245
- 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM275 700T259 707T221 727Q201 738 189 743T164 749Q146 749 138 740T130 708H69Q69 816 149
246
- 816Q166 816 181 810T217 791Q237 779 249 774T276 768Q294 768 301 777T309 810H369Q369 759 353 730T295 700Q275 700 259 707Z" />
247
- <glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377
248
- 74 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM79 810H187V699H79V810ZM251 810H359V699H251V810Z" />
249
- <glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74 387
250
- 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM169 596T138 626T107 708Q107 759 137 789T219 819Q270 819 300 789T331 708Q331 657 300 627T219
251
- 596Q169 596 138 626ZM245 650T261 665T277 708Q277 735 262 750T219 766Q192 766 177 751T161 708Q161 681 176 666T219 650Q245 650 261 665Z" />
252
- <glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="653" d="M609 201V177Q609 88 569 40T444 -8Q392 -8 358 24T315 109Q293 56 257 24T171 -8Q135 -8 106 10T60 59T43 126Q43 201 82 243T197 306L275 327V402Q275 453 262 478T214 504Q151 504 151 409H45Q46
253
- 491 90 538T214 586Q256 586 285 566T327 511Q342 545 378 565T463 586Q533 586 568 548T604 443Q604 394 583 365T531 323T453 297L382 282V255Q382 197 384 163T401 103T445 77Q477 77 489 103T502 176V201H609ZM382 340L437 353Q474 364 490 381T506 436Q506
254
- 464 492 481T447 499Q411 499 397 473T382 397V340ZM275 265Q266 263 250 258T229 250Q190 233 170 210T150 149Q150 116 165 96T202 75Q233 75 254 110T275 211V265Z" />
255
- <glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="411" d="M273 370V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156 119T175 82T214 71Q251 71 262 95T273 171V218H370V178Q370 90 340 44T233 -7V-56Q283 -56 313
256
- -79T344 -142Q344 -188 310 -211T219 -235Q190 -235 152 -225V-171Q176 -178 203 -178Q230 -178 247 -169T264 -139Q264 -114 244 -102T179 -83V-6Q100 3 72 59T43 222V355Q43 433 56 483T107 559T212 586Q274 586 308 566T356 507T370 404V370H273Z" />
257
- <glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214
258
- -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM75 824H182L239 626H186L75 824Z" />
259
- <glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214
260
- -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM242 824H349L237 626H183L242 824Z" />
261
- <glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338
262
- 40T214 -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM156 810H265L352 635H271L210 756L150 635H70L156 810Z" />
263
- <glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338
264
- 40T214 -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM71 810H179V699H71V810ZM243 810H351V699H243V810Z" />
265
- <glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="224" d="M61 578H168V0H61V578ZM-21 824H86L143 626H90L-21 824Z" />
266
- <glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="224" d="M61 578H168V0H61V578ZM146 824H253L141 626H87L146 824Z" />
267
- <glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="224" d="M61 578H168V0H61V578ZM60 810H169L256 635H175L114 756L54 635H-26L60 810Z" />
268
- <glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="224" d="M61 578H168V0H61V578ZM-25 810H83V699H-25V810ZM147 810H255V699H147V810Z" />
269
- <glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="471" d="M156 -9T118 18T66 96T52 225V292Q52 418 85 487T209 557Q266 557 306 521Q297 615 271 655L152 618V672L242 698Q220 723 183 735T77 749L82 819Q178 818 235 796T326 725L442 759V705L353 681Q386
270
- 609 401 538T416 377V237Q416 119 372 55T227 -9Q156 -9 118 18ZM279 76T294 110T309 219L310 343Q310 380 308 436Q306 437 297 446T271 462T236 469Q192 469 176 426T159 284L158 206Q158 142 172 109T230 76Q279 76 294 110Z" />
271
- <glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="439" d="M54 578H161V521Q230 586 302 586Q349 586 369 552T389 468V0H282V437Q282 470 272 486T236 502Q204 502 161 466V0H54V578ZM276 700T260 707T222 727Q202 738 190 743T165 749Q147 749 139
272
- 740T131 708H70Q70 816 150 816Q167 816 182 810T218 791Q238 779 250 774T277 768Q295 768 302 777T310 810H370Q370 759 354 730T296 700Q276 700 260 707Z" />
273
- <glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
274
- 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM76 824H183L240 626H187L76 824Z" />
275
- <glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
276
- 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM243 824H350L238 626H184L243 824Z" />
277
- <glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212
278
- 507Q183 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM157 810H266L353 635H272L211 756L151 635H71L157 810Z" />
279
- <glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
280
- 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM268 700T252 707T214 727Q194 738 182 743T157 749Q139 749 131 740T123 708H62Q62 816 142 816Q159 816 174 810T210 791Q230 779 242 774T269 768Q287 768 294 777T302 810H362Q362
281
- 759 346 730T288 700Q268 700 252 707Z" />
282
- <glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212
283
- 507Q183 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM72 810H180V699H72V810ZM244 810H352V699H244V810Z" />
284
- <glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="346" d="M130 638H215V527H130V638ZM19 450H328V372H19V450ZM130 283H215V172H130V283Z" />
285
- <glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="424" d="M380 498T380 373V205Q380 101 342 47T212 -8Q166 -8 133 6L96 -95L64 -84L102 25Q43 73 43 205V373Q43 477 81 531T212 586Q260 586 295 570L330 668L367 656L328 547Q380 498 380 373ZM150
286
- 160L262 476Q249 507 212 507Q183 507 170 490T153 448T150 379V198V160ZM273 379V395L165 95Q179 71 212 71Q241 71 254 88T270 130T273 198V379Z" />
287
- <glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM84 824H191L248 626H195L84 824Z" />
288
- <glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM251 824H358L246 626H192L251 824Z" />
289
- <glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM165 810H274L361 635H280L219 756L159 635H79L165 810Z" />
290
- <glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM80 810H188V699H80V810ZM252 810H360V699H252V810Z" />
291
- <glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63ZM227 824H334L222 626H168L227 824Z" />
292
- <glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="447" d="M55 810H162V532Q209 586 272 586Q351 586 377 519T404 369V229Q404 123 372 58T260 -8Q209 -8 162 43V-190H55V810ZM276 76T286 114T297 229V369Q297 433 285 467T234 502Q198 502 162 472V102Q197
293
- 76 239 76Q276 76 286 114Z" />
294
- <glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63ZM56 810H164V699H56V810ZM228 810H336V699H228V810Z"
295
- />
296
- <glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="494" d="M8 285H487V204H8V285Z" />
297
- <glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="965" d="M8 347H958V269H8V347Z" />
298
- <glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="208" d="M31 676Q31 757 54 799T130 843L149 804Q119 801 107 775T95 691H148V579H31V676Z" />
299
- <glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="208" d="M59 585Q89 587 101 613T113 697H60V810H177V713Q177 632 154 590T78 545L59 585Z" />
300
- <glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="208" d="M59 -93Q89 -91 101 -65T113 19H60V132H177V35Q177 -46 154 -88T78 -133L59 -93Z" />
301
- <glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="384" d="M31 676Q31 757 54 799T130 843L149 804Q119 801 107 775T95 691H148V579H31V676ZM207 676Q207 757 230 799T306 843L325 804Q295 801 283 775T271 691H324V579H207V676Z" />
302
- <glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="384" d="M59 585Q89 587 101 613T113 697H60V810H177V713Q177 632 154 590T78 545L59 585ZM235 585Q265 587 277 613T289 697H236V810H353V713Q353 632 330 590T254 545L235 585Z" />
303
- <glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="384" d="M235 -93Q265 -91 277 -65T289 19H236V132H353V35Q353 -46 330 -88T254 -133L235 -93ZM59 -93Q89 -91 101 -65T113 19H60V132H177V35Q177 -46 154 -88T78 -133L59 -93Z" />
304
- <glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="363" d="M128 272T98 304T68 390Q68 444 98 475T181 507Q235 507 265 475T295 390Q295 335 265 304T181 272Q128 272 98 304Z" />
305
- <glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="275" d="M43 269V321L242 549V415L125 295L242 174V41L43 269Z" />
306
- <glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="292" d="M60 227L177 348L60 467V602L258 374V321L60 93V227Z" />
307
- </font>
308
- </defs>
309
- </svg>
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 xmlns="http://www.w3.org/2000/svg">
4
+ <defs >
5
+ <font id="Oswald" horiz-adv-x="458" ><font-face
6
+ font-family="Oswald"
7
+ units-per-em="1000"
8
+ panose-1="0 0 5 0 0 0 0 0 0 0"
9
+ ascent="1193"
10
+ descent="-289"
11
+ alphabetic="0" />
12
+ <glyph unicode=" " glyph-name="space" horiz-adv-x="229" />
13
+ <glyph unicode="!" glyph-name="exclam" horiz-adv-x="208" d="M50 810H158L122 173H84L50 810ZM50 110H158V0H50V110Z" />
14
+ <glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="380" d="M85 810H182L143 562H85V810ZM234 810H331L292 562H234V810Z" />
15
+ <glyph unicode="#" glyph-name="numbersign" horiz-adv-x="486" d="M75 290H32V370H87L101 467H34V548H112L150 810H257L219 548H309L347 810H453L415 548H456V467H404L389 370H453V290H378L336 0H229L271 290H182L141 0H34L75 290ZM283 370L297 467H208L193 370H283Z" />
16
+ <glyph unicode="$" glyph-name="dollar" horiz-adv-x="491" d="M247 -8Q148 -6 96 56T39 227L139 254Q144 176 169 128T254 80Q298 80 320 104T343 175Q343 224 322 256T255 331L119 451Q78 488 60 529T41 630Q41 716 89 765T223 817V884H258V817Q341 811 383
17
+ 760T435 608L339 582Q334 651 313 690T239 730Q142 730 142 641Q142 605 154 582T195 531L332 411Q385 362 416 308T448 184Q448 102 403 52T281 -7V-77H247V-8Z" />
18
+ <glyph unicode="%" glyph-name="percent" horiz-adv-x="891" d="M112 380T74 429T36 568V631Q36 723 73 769T193 816Q276 816 313 771T350 636V565Q350 475 313 428T193 380Q112 380 74 429ZM512 811H604L382 0H289L512 811ZM228 461T240 489T253 565V636Q253
19
+ 684 241 709T193 735Q157 735 146 709T134 635V564Q134 516 146 489T193 461Q228 461 240 489ZM542 -5T542 183V246Q542 337 578 384T698 431Q781 431 818 386T855 250V180Q855 89 818 42T698 -5Q542 -5 542 183ZM733 76T745 103T758 179V251Q758 299 746 324T698
20
+ 350Q662 350 651 324T639 250V179Q639 131 651 104T698 76Q733 76 745 103Z" />
21
+ <glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="606" d="M151 -9T105 41T58 173Q58 244 89 300T176 407L154 448Q122 506 105 548T88 638Q88 719 134 768T261 817Q336 817 384 777T433 667Q433 596 390 531T281 402L403 210Q432 266 443 372H549Q549
22
+ 316 526 252T471 143Q485 125 506 114T550 102V-8H536Q509 -8 487 4T450 28T407 70Q378 34 334 13T233 -9Q151 -9 105 41ZM278 500T302 557T326 667Q326 696 309 712T261 729Q227 729 211 703T195 638Q195 596 208 554T244 460Q278 500 302 557ZM294 80T342 140L218
23
+ 331Q194 300 180 258T165 173Q165 133 181 107T233 80Q294 80 342 140Z" />
24
+ <glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="366" d="M85 810H182L143 562H85V810Z" />
25
+ <glyph unicode="(" glyph-name="parenleft" horiz-adv-x="298" d="M179 -193T137 -123T84 49T73 311Q73 472 83 574T136 746T268 817V745Q226 744 206 687T181 548T176 336V265Q176 144 181 64T207 -69T268 -123V-194Q179 -193 137 -123Z" />
26
+ <glyph unicode=")" glyph-name="parenright" horiz-adv-x="260" d="M29 -122Q71 -121 91 -64T117 75T122 288V358Q122 479 117 559T91 692T29 746V817Q119 817 161 747T214 575T225 313Q225 152 215 50T162 -122T29 -194V-122Z" />
27
+ <glyph unicode="*" glyph-name="asterisk" horiz-adv-x="398" d="M84 507L163 618L45 663L71 731L184 671L172 809H253L240 671L354 731L379 663L261 617L341 507L276 469L212 594L147 469L84 507Z" />
28
+ <glyph unicode="+" glyph-name="plus" horiz-adv-x="415" d="M165 375H25V456H165V619H245V456H390V375H245V212H165V375Z" />
29
+ <glyph unicode="," glyph-name="comma" horiz-adv-x="187" d="M40 -85Q67 -76 82 -54T98 0H41V115H151V2Q151 -51 128 -82T57 -131L40 -85Z" />
30
+ <glyph unicode="-" glyph-name="hyphen" horiz-adv-x="321" d="M49 342H272V261H49V342Z" />
31
+ <glyph unicode="." glyph-name="period" horiz-adv-x="188" d="M49 119H156V0H49V119Z" />
32
+ <glyph unicode="/" glyph-name="slash" horiz-adv-x="369" d="M247 810H340L121 0H29L247 810Z" />
33
+ <glyph unicode="0" glyph-name="zero" horiz-adv-x="491" d="M146 -9T96 56T45 230V579Q45 690 94 753T246 817Q347 817 396 754T446 579V230Q446 120 396 56T246 -9Q146 -9 96 56ZM338 79T338 229V580Q338 649 319 689T246 730Q193 730 173 690T153 580V229Q153
34
+ 79 246 79Q338 79 338 229Z" />
35
+ <glyph unicode="1" glyph-name="one" horiz-adv-x="467" d="M222 670Q220 667 162 656T81 641V722Q203 751 248 810H329V0H222V670Z" />
36
+ <glyph unicode="2" glyph-name="two" horiz-adv-x="478" d="M41 76L247 397Q262 421 267 427Q302 483 318 520T334 609Q334 667 315 698T253 729Q157 729 157 580V553H50V581Q50 695 97 756T248 817Q344 817 393 763T442 608Q442 559 431 521T403 454T353 374L167
37
+ 90H423V0H41V76Z" />
38
+ <glyph unicode="3" glyph-name="three" horiz-adv-x="467" d="M141 -9T91 45T40 199V226H146V208Q148 146 167 113T238 80Q292 80 311 117T331 229Q331 297 306 335T225 378Q221 379 210 379V486H224Q281 488 306 516T331 609Q331 669 311 699T239 730Q187 730
39
+ 168 697T146 600V583H40V610Q40 709 90 763T239 817Q337 817 387 763T438 609Q438 538 407 493T322 432Q377 415 407 363T438 229Q438 116 390 54T238 -9Q141 -9 91 45Z" />
40
+ <glyph unicode="4" glyph-name="four" horiz-adv-x="491" d="M273 213H40V332L248 810H381V314H471V213H381V0H273V213ZM273 314V674L148 314H273Z" />
41
+ <glyph unicode="5" glyph-name="five" horiz-adv-x="476" d="M138 -8T93 51T47 227H154Q154 159 172 118T245 77Q286 77 306 101T331 164T337 270Q337 331 331 367T305 423T246 443Q215 443 192 424T156 376H65V810H414V703H162L155 479Q198 524 272 524Q365 524
42
+ 404 461T444 284Q444 146 399 69T243 -8Q138 -8 93 51Z" />
43
+ <glyph unicode="6" glyph-name="six" horiz-adv-x="489" d="M153 -9T104 64T54 257V530Q54 661 100 739T253 817Q347 817 398 766T451 620L452 608H344Q344 670 324 699T253 729Q161 729 161 556V433Q177 459 207 474T279 489Q374 489 414 429T454 255Q454 136
44
+ 405 64T253 -9Q153 -9 104 64ZM303 80T324 121T346 229Q346 290 341 326T316 385T253 408Q222 408 199 392T161 353V232Q161 163 182 122T253 80Q303 80 324 121Z" />
45
+ <glyph unicode="7" glyph-name="seven" horiz-adv-x="385" d="M244 726H27V810H351V758L201 0H98L244 726Z" />
46
+ <glyph unicode="8" glyph-name="eight" horiz-adv-x="478" d="M134 -9T87 52T40 228Q40 305 65 351T140 427Q50 487 50 608Q50 707 97 762T240 817Q335 817 381 762T428 608Q428 543 405 500T338 427Q387 396 413 350T439 228Q439 114 392 53T240 -9Q134 -9 87
47
+ 52ZM323 477T323 614Q323 668 304 701T240 734Q196 734 176 701T155 614Q155 554 174 516T240 476Q323 477 323 614ZM294 76T315 115T336 226Q336 291 314 332T240 374Q188 373 165 332T142 226Q142 155 163 116T240 76Q294 76 315 115Z" />
48
+ <glyph unicode="9" glyph-name="nine" horiz-adv-x="489" d="M150 -9T99 43T46 192V201H153Q153 139 173 110T246 80Q336 80 336 253V376Q320 350 291 335T218 320Q123 320 84 380T44 554Q44 673 93 745T245 817Q345 817 394 744T444 552V280Q444 149 398 70T245
49
+ -9Q150 -9 99 43ZM304 401T336 457V577Q336 729 245 729Q195 729 174 688T152 580Q152 519 157 483T182 424T245 401Q304 401 336 457Z" />
50
+ <glyph unicode=":" glyph-name="colon" horiz-adv-x="197" d="M60 529H168V415H60V529ZM60 210H168V96H60V210Z" />
51
+ <glyph unicode=";" glyph-name="semicolon" horiz-adv-x="215" d="M59 565H167V446H59V565ZM58 1Q116 5 116 68H59V182H170V70Q170 15 148 -14T76 -46L58 1Z" />
52
+ <glyph unicode="&lt;" glyph-name="less" horiz-adv-x="373" d="M29 238V345L315 549V441L110 292L315 143V36L29 238Z" />
53
+ <glyph unicode="=" glyph-name="equal" horiz-adv-x="415" d="M54 538H361V456H54V538ZM54 360H361V279H54V360Z" />
54
+ <glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="373" d="M58 143L264 293L58 441V549L345 346V239L58 36V143Z" />
55
+ <glyph unicode="?" glyph-name="question" horiz-adv-x="487" d="M162 327Q250 403 295 469T341 615Q341 664 316 694T245 724Q205 724 182 702T158 642Q158 624 165 592L65 573Q54 604 54 636Q54 717 104 767T245 817Q340 817 393 763T446 612Q446 548 422 495T358
56
+ 397T257 300V203H162V327ZM157 110H264V0H157V110Z" />
57
+ <glyph unicode="@" glyph-name="at" horiz-adv-x="904" d="M350 -134T258 -88T112 51T59 282Q59 457 116 575T274 751T511 810Q626 810 705 757T822 617T861 426Q861 337 832 262T747 142T621 98Q578 98 551 123T522 190Q513 154 490 129T427 100L413 99Q348 99
58
+ 313 151T277 279Q277 355 307 431T392 555T514 604Q529 604 547 597T579 579L589 596H667L610 229Q607 210 607 192Q607 175 612 167T633 158Q675 158 709 193T763 287T783 417Q783 503 753 573T661 684T504 726Q400 726 322 672T200 519T156 286Q156 119 243 34T479
59
+ -51Q567 -51 661 -24L680 -102Q569 -134 470 -134Q350 -134 258 -88ZM465 181T490 207T525 287L560 520Q545 525 532 525Q492 525 457 492T399 401T377 278Q377 236 392 209T437 181Q465 181 490 207Z" />
60
+ <glyph unicode="A" glyph-name="A" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314Z" />
61
+ <glyph unicode="B" glyph-name="B" horiz-adv-x="524" d="M63 810H249Q359 810 412 761T465 607Q465 452 349 436Q421 419 454 369T487 231Q487 122 436 61T279 0H63V810ZM243 472Q313 472 340 502T367 607Q367 661 351 686T301 719T203 726H176V472H243ZM252
62
+ 81Q302 81 329 96T368 144T379 231Q379 309 347 347T243 386H176V81H252Z" />
63
+ <glyph unicode="C" glyph-name="C" horiz-adv-x="515" d="M146 -9T97 62T48 260V546Q48 679 96 748T266 817Q375 817 422 758T470 584V520H363V577Q363 633 358 663T333 711T267 729Q221 729 199 710T169 656T162 563V242Q162 180 172 145T204 95T267 80Q310 80
64
+ 331 99T357 151T363 241V301H470V241Q470 120 425 56T266 -9Q146 -9 97 62Z" />
65
+ <glyph unicode="D" glyph-name="D" horiz-adv-x="527" d="M63 810H239Q370 810 424 750T479 563V265Q479 131 426 66T248 0H63V810ZM240 81Q299 81 325 104T358 166T365 286V549Q365 618 357 654T321 708T237 726H176V81H240Z" />
66
+ <glyph unicode="E" glyph-name="E" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810Z" />
67
+ <glyph unicode="F" glyph-name="F" horiz-adv-x="391" d="M63 810H376V729H176V459H331V379H176V0H63V810Z" />
68
+ <glyph unicode="G" glyph-name="G" horiz-adv-x="535" d="M146 -10T97 59T48 266V537Q48 631 67 691T134 784T265 817Q377 817 426 760T476 581V551H370V576Q370 634 363 665T334 713T267 729Q220 729 197 708T168 650T161 554V254Q161 161 183 121T270 80Q333
69
+ 80 356 124T380 265V321H277V401H482V0H411L400 93Q362 -10 256 -10Q146 -10 97 59Z" />
70
+ <glyph unicode="H" glyph-name="H" horiz-adv-x="561" d="M63 810H176V460H384V810H497V0H384V379H176V0H63V810Z" />
71
+ <glyph unicode="I" glyph-name="I" horiz-adv-x="248" d="M69 810H180V0H69V810Z" />
72
+ <glyph unicode="J" glyph-name="J" horiz-adv-x="301" d="M7 62Q58 62 82 71T116 106T125 185V810H237V183Q237 110 222 67T169 2T61 -19H7V62Z" />
73
+ <glyph unicode="K" glyph-name="K" horiz-adv-x="495" d="M63 810H176V428L362 810H467L307 453L493 0H383L228 380L176 286V0H63V810Z" />
74
+ <glyph unicode="L" glyph-name="L" horiz-adv-x="397" d="M63 810H176V81H383V0H63V810Z" />
75
+ <glyph unicode="M" glyph-name="M" horiz-adv-x="660" d="M76 810H187L330 153L474 810H584L599 0H508L499 588L362 0H298L162 588L153 0H61L76 810Z" />
76
+ <glyph unicode="N" glyph-name="N" horiz-adv-x="528" d="M63 810H140L370 272V810H464V0H392L159 553V0H63V810Z" />
77
+ <glyph unicode="O" glyph-name="O" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184 694T162 584V229Q162
78
+ 154 184 117T270 80Q333 80 355 117Z" />
79
+ <glyph unicode="P" glyph-name="P" horiz-adv-x="480" d="M63 810H264Q369 810 416 753T464 586Q464 487 413 432T265 377H176V0H63V810ZM228 458Q278 458 305 469T345 507T357 585Q357 647 348 676T313 717T229 729H176V458H228Z" />
80
+ <glyph unicode="Q" glyph-name="Q" horiz-adv-x="541" d="M374 -134T289 -8L270 -9Q151 -9 100 58T48 254V561Q48 687 100 752T270 817Q388 817 440 752T492 561V253Q492 60 373 10Q423 -55 453 -75L435 -164Q374 -134 289 -8ZM334 80T356 117T378 229V584Q378
81
+ 658 356 693T270 729Q206 729 184 694T162 584V229Q162 154 184 117T270 80Q334 80 356 117Z" />
82
+ <glyph unicode="R" glyph-name="R" horiz-adv-x="519" d="M63 810H226Q349 810 406 760T464 595Q464 439 364 406L479 0H370L264 380H176V0H63V810ZM219 461Q292 461 323 490T355 595Q355 645 344 673T305 715T226 729H176V461H219Z" />
83
+ <glyph unicode="S" glyph-name="S" horiz-adv-x="473" d="M152 -9T99 54T39 227L139 254Q144 176 169 128T254 80Q298 80 320 104T343 175Q343 224 322 256T255 331L119 451Q78 488 60 529T41 630Q41 720 93 768T236 817Q331 817 378 766T435 608L339 582Q334
84
+ 651 313 690T239 730Q142 730 142 641Q142 605 154 582T195 531L332 411Q385 362 416 308T448 184Q448 95 394 43T254 -9Q152 -9 99 54Z" />
85
+ <glyph unicode="T" glyph-name="T" horiz-adv-x="400" d="M146 726H-1V810H402V726H259V0H146V726Z" />
86
+ <glyph unicode="U" glyph-name="U" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25Z" />
87
+ <glyph unicode="V" glyph-name="V" horiz-adv-x="505" d="M23 810H129L257 213L379 810H482L303 0H204L23 810Z" />
88
+ <glyph unicode="W" glyph-name="W" horiz-adv-x="729" d="M36 810H130L217 228L326 807H406L516 225L601 810H693L563 0H481L368 600L254 0H168L36 810Z" />
89
+ <glyph unicode="X" glyph-name="X" horiz-adv-x="482" d="M182 424L16 810H121L244 524L356 810H461L291 415L469 0H364L232 305L118 0H13L182 424Z" />
90
+ <glyph unicode="Y" glyph-name="Y" horiz-adv-x="481" d="M187 286L12 810H117L241 419L363 810H469L295 286V0H187V286Z" />
91
+ <glyph unicode="Z" glyph-name="Z" horiz-adv-x="417" d="M38 81L276 729H53V810H396V761L145 81H396V0H38V81Z" />
92
+ <glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="340" d="M63 810H283V755H170V-129H283V-184H63V810Z" />
93
+ <glyph unicode="\" glyph-name="backslash" horiz-adv-x="369" d="M29 810H121L340 0H247L29 810Z" />
94
+ <glyph unicode="]" glyph-name="bracketright" horiz-adv-x="310" d="M26 -129H139V754H26V810H247V-184H26V-129Z" />
95
+ <glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="443" d="M168 810H276L410 487H308L222 730L135 487H34L168 810Z" />
96
+ <glyph unicode="_" glyph-name="underscore" horiz-adv-x="344" d="M0 -53H344V-134H0V-53Z" />
97
+ <glyph unicode="`" glyph-name="grave" horiz-adv-x="278" d="M57 810H164L221 612H167L57 810Z" />
98
+ <glyph unicode="a" glyph-name="a" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74 387 0H289Q278
99
+ 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100Z" />
100
+ <glyph unicode="b" glyph-name="b" horiz-adv-x="447" d="M209 -8T163 42V0H56V810H163V532Q210 586 272 586Q351 586 377 519T404 369V229Q404 -8 261 -8Q209 -8 163 42ZM276 76T286 113T297 229V369Q297 433 285 467T235 502Q200 502 163 473V102Q196 76 239
101
+ 76Q276 76 286 113Z" />
102
+ <glyph unicode="c" glyph-name="c" horiz-adv-x="411" d="M144 -8T107 19T57 96T43 222V355Q43 433 56 483T107 559T212 586Q274 586 308 566T356 507T370 404V370H273V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156 119T175
103
+ 82T214 71Q251 71 262 95T273 171V218H370V178Q370 84 336 38T212 -8Q144 -8 107 19Z" />
104
+ <glyph unicode="d" glyph-name="d" horiz-adv-x="442" d="M112 -8T78 47T43 227V339Q43 454 73 520T185 586Q236 586 281 541V810H388V0H281V37Q239 -8 186 -8Q112 -8 78 47ZM247 76T281 98V477Q244 502 213 502Q150 502 150 381V218Q150 148 163 112T215 76Q247
105
+ 76 281 98Z" />
106
+ <glyph unicode="e" glyph-name="e" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214 -8Q147
107
+ -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273Z" />
108
+ <glyph unicode="f" glyph-name="f" horiz-adv-x="287" d="M88 499H19V578H88V608Q88 668 97 704T133 761T213 781Q236 781 283 776V696Q275 697 263 699T243 701Q214 701 205 683T195 626V578H283V499H195V0H88V499Z" />
109
+ <glyph unicode="g" glyph-name="g" horiz-adv-x="435" d="M131 -179T76 -162T20 -89Q20 -44 43 -11T103 41Q76 49 62 66T47 103Q47 133 62 155T111 208Q77 234 61 273T44 380Q44 481 85 533T207 586Q253 586 282 570T326 522Q333 533 355 551T404 582L420 589L447
110
+ 520Q427 516 392 503T349 483Q356 465 361 433T367 377Q367 282 330 230T207 177Q180 177 152 184Q150 181 142 167T133 140Q133 129 144 123T181 114Q196 112 226 110T271 106Q405 94 405 -35Q405 -112 364 -145T234 -179Q131 -179 76 -162ZM250 252T263 282T276
111
+ 380Q276 449 263 480T208 512Q166 512 152 481T137 380Q137 318 151 285T207 252Q250 252 263 282ZM279 -95T301 -82T323 -38Q323 -10 306 3T244 21L153 29Q138 17 124 -3T110 -46Q110 -64 119 -74T154 -90T232 -95Q279 -95 301 -82Z" />
112
+ <glyph unicode="h" glyph-name="h" horiz-adv-x="445" d="M57 810H164V518Q236 586 309 586Q356 586 375 552T395 468V0H288V437Q288 470 278 486T242 502Q207 502 164 464V0H57V810Z" />
113
+ <glyph unicode="i" glyph-name="i" horiz-adv-x="229" d="M61 776H168V664H61V776ZM61 578H168V0H61V578Z" />
114
+ <glyph unicode="j" glyph-name="j" horiz-adv-x="230" d="M69 776H177V664H69V776ZM-3 -146T-19 -139V-62Q2 -65 9 -65Q42 -65 55 -47T69 5V578H176V-6Q176 -74 139 -110T36 -146Q-3 -146 -19 -139Z" />
115
+ <glyph unicode="k" glyph-name="k" horiz-adv-x="429" d="M56 811H163V328L319 578H431L295 352L427 0H320L212 296L163 222V1H56V811Z" />
116
+ <glyph unicode="l" glyph-name="l" horiz-adv-x="229" d="M64 810H171V0H64V810Z" />
117
+ <glyph unicode="m" glyph-name="m" horiz-adv-x="680" d="M54 578H153V523Q182 555 216 571T289 588Q363 588 383 515Q443 588 527 588Q572 588 600 555T629 454V0H531V447Q531 485 519 501T484 518Q461 518 437 506T391 471V454V0H293V447Q293 485 281 501T246
118
+ 518Q223 518 199 506T153 471V0H54V578Z" />
119
+ <glyph unicode="n" glyph-name="n" horiz-adv-x="439" d="M54 578H161V521Q230 586 302 586Q349 586 369 552T389 468V0H282V437Q282 470 272 486T236 502Q204 502 161 466V0H54V578Z" />
120
+ <glyph unicode="o" glyph-name="o" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183 507 170
121
+ 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88Z" />
122
+ <glyph unicode="p" glyph-name="p" horiz-adv-x="446" d="M54 578H161V532Q208 586 271 586Q350 586 376 519T403 369V229Q403 123 371 58T259 -8Q208 -8 161 43V-190H54V578ZM275 76T285 113T296 229V369Q296 433 284 467T234 502Q197 502 161 472V102Q196 76
123
+ 238 76Q275 76 285 113Z" />
124
+ <glyph unicode="q" glyph-name="q" horiz-adv-x="443" d="M282 37Q240 -8 187 -8Q113 -8 79 47T44 227V339Q44 454 74 520T186 586Q237 586 282 541V578H389V-190H282V37ZM250 76T282 98V477Q245 502 214 502Q151 502 151 381V218Q151 148 164 112T216 76Q250 76 282 98Z" />
125
+ <glyph unicode="r" glyph-name="r" horiz-adv-x="321" d="M57 578H164V496Q194 545 225 565T292 585Q301 585 309 584V466Q277 478 250 478Q224 478 204 466T164 422V0H57V578Z" />
126
+ <glyph unicode="s" glyph-name="s" horiz-adv-x="374" d="M118 -8T75 36T25 154L114 181Q121 125 139 98T192 71Q220 71 238 88T256 133Q256 178 209 218L110 303Q76 332 58 363T39 441Q39 510 79 548T188 586Q254 586 291 544T335 434L263 407Q256 456 240 481T192
127
+ 507Q166 507 150 490T135 448Q135 415 164 390L266 296Q304 262 326 226T348 140Q348 68 305 30T188 -8Q118 -8 75 36Z" />
128
+ <glyph unicode="t" glyph-name="t" horiz-adv-x="308" d="M142 -8T113 26T83 130V507H22V578H83V747H190V578H283V507H190V137Q190 102 201 88T243 74Q263 74 282 77V-2Q242 -8 208 -8Q142 -8 113 26Z" />
129
+ <glyph unicode="u" glyph-name="u" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26Z" />
130
+ <glyph unicode="v" glyph-name="v" horiz-adv-x="385" d="M15 578H123L194 113L266 578H370L260 0H129L15 578Z" />
131
+ <glyph unicode="w" glyph-name="w" horiz-adv-x="588" d="M28 578H116L176 152L253 578H335L412 154L472 578H560L464 0H374L295 408L217 0H121L28 578Z" />
132
+ <glyph unicode="x" glyph-name="x" horiz-adv-x="389" d="M139 304L12 578H114L199 395L274 578H379L247 291L381 0H279L188 196L110 0H9L139 304Z" />
133
+ <glyph unicode="y" glyph-name="y" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63Z" />
134
+ <glyph unicode="z" glyph-name="z" horiz-adv-x="347" d="M32 72L209 498H50V578H324V520L146 81H320V0H32V72Z" />
135
+ <glyph unicode="{" glyph-name="braceleft" horiz-adv-x="300" d="M189 -191T154 -178T108 -126T98 10V151Q98 207 94 232T77 267T40 276V350Q65 350 77 359T93 394T98 476V616Q98 713 108 751T153 803T277 817V738Q242 738 229 731T213 701T210 616V460Q210 389
136
+ 193 355T144 313Q176 306 193 272T210 167V10Q210 -53 213 -75T229 -104T277 -112V-191Q189 -191 154 -178Z" />
137
+ <glyph unicode="|" glyph-name="bar" horiz-adv-x="239" d="M70 810H169V-148H69L70 810Z" />
138
+ <glyph unicode="}" glyph-name="braceright" horiz-adv-x="321" d="M44 -112Q79 -112 92 -105T108 -75T111 10V167Q111 238 128 272T178 313Q145 321 128 355T111 460V616Q111 678 108 700T92 730T44 738V817Q132 817 167 804T213 752T223 616V476Q223 419 227
139
+ 394T243 359T281 350V276Q255 276 244 267T228 233T223 151V10Q223 -87 213 -125T168 -177T44 -191V-112Z" />
140
+ <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="447" d="M279 363T260 370T215 393Q193 406 177 413T146 420Q133 420 113 409T73 382L35 433Q60 459 95 482T154 506Q171 506 189 499T232 476Q256 463 272 456T302 449Q315 449 331 459T374 489L412
141
+ 440Q387 411 354 387T296 363Q279 363 260 370Z" />
142
+ <glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="229" />
143
+ <glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="208" d="M50 632H158V522H50V632ZM85 458H123L158 -178H50L85 458Z" />
144
+ <glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="388" d="M178 -6Q99 3 71 59T43 222V355Q43 463 71 519T179 584V656H213V586Q274 586 308 566T356 506T370 404V370H273V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156
145
+ 119T175 82T214 71Q251 71 262 95T273 171V218H370V178Q370 84 336 38T212 -8V-79H178V-6Z" />
146
+ <glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="398" d="M2 54L61 80V354H2V434H61V526Q61 618 72 679T121 779T230 817Q370 817 372 644V611H292Q292 666 280 698T230 730Q193 730 181 695T167 598V434H287V354H167V81H371V0H2V54Z" />
147
+ <glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="550" d="M38 201L118 280Q92 308 78 345T63 423Q63 463 77 500T118 566L38 645L53 660L132 581Q160 608 197 622T275 637Q316 637 353 623T418 581L497 660L512 645L433 566Q458 537 472 501T486 423Q486
148
+ 382 472 345T432 280L512 201L497 186L418 265Q389 238 353 223T275 209Q234 208 198 223T132 265L53 186L38 201ZM321 252T359 275T419 337T441 423Q441 469 419 508T359 571T275 594Q229 594 192 571T132 509T110 423Q110 377 132 338T191 275T275 252Q321 252
149
+ 359 275Z" />
150
+ <glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="457" d="M185 115H96V185H185V250H96V319H174L10 810H115L238 419L360 810H467L304 319H381V250H292V185H381V115H292V0H185V115Z" />
151
+ <glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="212" d="M63 810H149V400H63V810ZM63 256H149V-153H63V256Z" />
152
+ <glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="427" d="M144 -8T102 34T43 145L124 172Q155 80 214 80Q246 80 264 97T282 147Q282 187 240 218L125 293Q85 318 64 348T42 425Q42 473 65 507T127 557Q92 580 69 611T45 682Q45 745 91 781T214 817Q284
153
+ 817 325 775T383 667L302 640Q287 679 267 704T213 730Q185 730 169 714T152 669Q152 652 162 638T187 613L316 529Q349 508 367 474T386 395Q386 349 367 317T313 266Q346 238 364 210T383 142Q383 70 337 31T214 -8Q144 -8 102 34ZM260 334T274 351T289 392Q290
154
+ 411 281 430T253 462L197 500Q178 490 164 470T149 425Q149 409 157 394T178 370L240 325Q260 334 274 351Z" />
155
+ <glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="400" d="M60 810H167V699H60V810ZM231 810H339V699H231V810Z" />
156
+ <glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="862" d="M296 -11T206 50T72 207T29 412Q29 520 72 616T205 773T431 834Q566 834 656 774T790 617T833 412Q833 303 791 207T658 50T431 -11Q296 -11 206 50ZM551 33T630 86T748 226T787 412Q787
157
+ 512 749 598T631 737T434 790Q317 790 238 737T120 598T81 412Q81 312 119 226T237 87T434 33Q551 33 630 86ZM356 124T315 152T260 232T245 364V471Q245 553 260 605T316 684T432 712Q501 712 539 692T592 630T607 523V496H502V523Q502 583 487 606T434 630Q404
158
+ 630 388 618T366 576T360 494V336Q360 284 367 257T390 218T434 207Q475 207 488 232T502 311V343H607V318Q607 220 569 172T432 124Q356 124 315 152Z" />
159
+ <glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="443" d="M134 321T106 352T77 432Q77 481 101 512T160 560T256 598L276 605V658Q276 700 267 722T233 745Q181 745 181 657H93Q95 732 132 777T234 822Q312 822 341 775T370 628V327H284V391Q268
160
+ 360 240 341T178 321Q134 321 106 352ZM233 403T250 417T276 450V563Q240 544 220 531T186 499T172 454Q172 430 183 417T213 403Q233 403 250 417Z" />
161
+ <glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="455" d="M31 269V321L194 549V415L112 295L194 174V41L31 269ZM225 269V321L389 549V415L307 295L389 174V41L225 269Z" />
162
+ <glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="387" d="M305 368H40V449H360V256H305V368Z" />
163
+ <glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="344" d="M58 548H288V467H58V548Z" />
164
+ <glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="888" d="M310 -13T221 47T89 202T46 405Q46 512 88 607T220 763T444 823Q578 823 667 763T799 608T842 405Q842 297 800 202T669 47T444 -13Q310 -13 221 47ZM556 37T633 89T747 224T784 405Q784
165
+ 502 747 585T634 720T444 771Q331 771 254 720T140 586T103 405Q103 308 140 225T254 89T444 37Q556 37 633 89ZM292 674H448Q617 674 617 520Q617 428 532 392L628 144H531L446 373H385V144H292V674ZM418 423Q459 423 481 432T512 463T521 522Q521 567 503 589T440
166
+ 612H385V423H418Z" />
167
+ <glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="284" d="M46 810H238V745H46V810Z" />
168
+ <glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="453" d="M148 481T103 526T58 650Q58 728 103 772T226 817Q304 817 349 773T395 650Q395 571 350 526T226 481Q148 481 103 526ZM267 553T290 579T313 650Q313 694 290 720T226 747Q185 747 162 721T139
169
+ 650Q139 606 162 580T226 553Q267 553 290 579Z" />
170
+ <glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="368" d="M144 262H57V344H144V431H226V344H313V262H226V175H144V262ZM57 82H313V0H57V82Z" />
171
+ <glyph unicode="&#xb2;" glyph-name="uni00B2" horiz-adv-x="422" d="M77 494L201 629Q247 678 264 706T281 760Q281 790 267 806T224 823Q187 823 171 799T155 727H76V741Q76 812 112 855T224 898Q289 898 326 863T363 765Q363 718 342 681T266 589L183 503H368V433H77V494Z"
172
+ />
173
+ <glyph unicode="&#xb3;" glyph-name="uni00B3" horiz-adv-x="426" d="M147 423T113 459T78 559V575H157V571Q157 498 222 498Q278 498 278 563Q278 596 265 612T221 629H195V695H218Q273 695 273 760Q273 789 259 806T218 823Q157 823 157 750V746H78V762Q78 828
174
+ 116 863T220 898Q283 898 319 866T355 776Q355 733 337 704T289 664Q360 640 360 554Q360 490 323 457T220 423Q147 423 113 459Z" />
175
+ <glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="277" d="M115 810H222L110 612H56L115 810Z" />
176
+ <glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="441" d="M50 578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q239 17 191 2Q174 -3 159 -3V-175H51L50 578Z" />
177
+ <glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="492" d="M199 515Q123 515 78 553T32 662Q32 736 80 773T215 810H429V-96H352V759H275V-96H199V515Z" />
178
+ <glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="176" d="M36 432H144V322H36V432Z" />
179
+ <glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="352" d="M118 -235T80 -225V-171Q104 -178 131 -178Q158 -178 175 -169T192 -139Q192 -114 172 -102T107 -83V0H161V-56Q211 -56 241 -79T272 -142Q272 -188 238 -211T147 -235Q118 -235 80 -225Z" />
180
+ <glyph unicode="&#xb9;" glyph-name="uni00B9" horiz-adv-x="340" d="M172 789L80 753V822L211 888H250V433H172V789Z" />
181
+ <glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="443" d="M138 320T103 367T67 505V637Q67 727 102 774T222 822Q302 822 339 773T376 637V505Q376 418 339 369T222 320Q138 320 103 367ZM249 398T262 413T279 453T282 517V625Q282 665 279 688T263
182
+ 727T220 743Q179 743 168 713T156 625V517Q156 459 168 429T220 398Q249 398 262 413Z" />
183
+ <glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="481" d="M57 174L148 295L57 415V549L230 321V269L57 41V174ZM252 174L343 295L252 415V549L424 321V269L252 41V174Z" />
184
+ <glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="945" d="M184 967L92 931V1000L223 1066H262V611H184V967ZM586 810H678L307 0H215L586 810ZM677 107H505V166L696 455H755V168H799V107H755V0H677V107ZM677 168L676 314L584 168H677Z" />
185
+ <glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="945" d="M405 967L313 931V1000L444 1066H483V611H405V967ZM551 810H643L272 0H180L551 810ZM555 61L679 196Q725 245 742 273T759 327Q759 357 745 373T702 390Q665 390 649 366T633 294H554V308Q554
186
+ 379 590 422T702 465Q767 465 804 430T841 332Q841 285 820 248T744 156L661 70H846V0H555V61Z" />
187
+ <glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="874" d="M384 598T350 634T315 734V750H394V746Q394 673 459 673Q515 673 515 738Q515 771 502 787T458 804H432V870H455Q510 870 510 935Q510 964 496 981T455 998Q394 998 394 925V921H315V937Q315
188
+ 1003 353 1038T457 1073Q520 1073 556 1041T592 951Q592 908 574 879T526 839Q597 815 597 729Q597 665 560 632T457 598Q384 598 350 634ZM627 810H719L348 0H256L627 810ZM718 107H546V166L737 455H796V168H840V107H796V0H718V107ZM718 168L717 314L625 168H718Z"
189
+ />
190
+ <glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="487" d="M344 518H237V628H344V518ZM339 301Q251 225 206 159T160 13Q160 -36 185 -66T256 -96Q296 -96 319 -74T343 -14Q343 5 336 36L436 55Q447 24 447 -8Q447 -89 397 -139T256 -189Q161 -189
191
+ 108 -135T55 16Q55 80 79 133T143 231T244 328V425H339V301Z" />
192
+ <glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM110 1056H217L274 858H221L110 1056Z" />
193
+ <glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM277 1056H384L272 858H218L277 1056Z" />
194
+ <glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM191 1042H300L387 867H306L245 988L185 867H105L191 1042Z" />
195
+ <glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM302 932T286 939T248 959Q228 970 216 975T191 981Q173 981 165 972T157 940H96Q96 1048 176 1048Q193
196
+ 1048 208 1042T244 1023Q264 1011 276 1006T303 1000Q321 1000 328 1009T336 1042H396Q396 991 380 962T322 932Q302 932 286 939Z" />
197
+ <glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM106 1042H214V931H106V1042ZM278 1042H386V931H278V1042Z" />
198
+ <glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="492" d="M191 810H300L473 0H366L329 204H164L125 0H19L191 810ZM314 285L246 650L179 285H314ZM196 828T165 858T134 940Q134 991 164 1021T246 1051Q297 1051 327 1021T358 940Q358 889 327 859T246
199
+ 828Q196 828 165 858ZM272 882T288 897T304 940Q304 967 289 982T246 998Q219 998 204 983T188 940Q188 913 203 898T246 882Q272 882 288 897Z" />
200
+ <glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="635" d="M290 810H605V728H400V460H547V379H400V82H605V0H292V205H143L57 0H-51L290 810ZM292 286V605L173 286H292Z" />
201
+ <glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="515" d="M363 520V577Q363 633 358 663T333 711T267 729Q221 729 199 710T169 656T162 563V242Q162 180 172 145T204 95T267 80Q310 80 331 99T357 151T363 241V301H470V241Q470 125 429 61T285 -8V-56Q335
202
+ -56 365 -79T396 -142Q396 -188 362 -211T271 -235Q242 -235 204 -225V-171Q228 -178 255 -178Q282 -178 299 -169T316 -139Q316 -114 296 -102T231 -83V-7Q131 4 90 74T48 260V546Q48 679 96 748T266 817Q375 817 422 758T470 584V520H363Z" />
203
+ <glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM88 1056H195L252 858H199L88 1056Z" />
204
+ <glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM255 1056H362L250 858H196L255 1056Z" />
205
+ <glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM169 1042H278L365 867H284L223 988L163 867H83L169 1042Z" />
206
+ <glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="407" d="M63 810H377V726H176V458H339V378H176V81H379V0H63V810ZM84 1042H192V931H84V1042ZM256 1042H364V931H256V1042Z" />
207
+ <glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="248" d="M69 810H180V0H69V810ZM-12 1056H95L152 858H99L-12 1056Z" />
208
+ <glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="248" d="M69 810H180V0H69V810ZM155 1056H262L150 858H96L155 1056Z" />
209
+ <glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="248" d="M69 810H180V0H69V810ZM69 1042H178L265 867H184L123 988L63 867H-17L69 1042Z" />
210
+ <glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="248" d="M69 810H180V0H69V810ZM-16 1042H92V931H-16V1042ZM156 1042H264V931H156V1042Z" />
211
+ <glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="518" d="M63 388H14V453H63V810H239Q370 810 424 750T479 563V265Q479 131 426 66T248 0H63V388ZM240 81Q299 81 325 104T358 166T365 286V549Q365 618 357 654T321 708T237 726H176V453H237V388H176V81H240Z" />
212
+ <glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="528" d="M63 810H140L370 272V810H464V0H392L159 553V0H63V810ZM320 932T304 939T266 959Q246 970 234 975T209 981Q191 981 183 972T175 940H114Q114 1048 194 1048Q211 1048 226 1042T262 1023Q282
213
+ 1011 294 1006T321 1000Q339 1000 346 1009T354 1042H414Q414 991 398 962T340 932Q320 932 304 939Z" />
214
+ <glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
215
+ 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM134 1056H241L298 858H245L134 1056Z" />
216
+ <glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
217
+ 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM301 1056H408L296 858H242L301 1056Z" />
218
+ <glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729
219
+ 184 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM215 1042H324L411 867H330L269 988L209 867H129L215 1042Z" />
220
+ <glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729 184
221
+ 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM326 932T310 939T272 959Q252 970 240 975T215 981Q197 981 189 972T181 940H120Q120 1048 200 1048Q217 1048 232 1042T268 1023Q288 1011 300 1006T327 1000Q345 1000 352 1009T360 1042H420Q420 991
222
+ 404 962T346 932Q326 932 310 939Z" />
223
+ <glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="539" d="M151 -9T100 58T48 254V561Q48 687 100 752T270 817Q388 817 439 752T491 561V253Q491 127 439 59T270 -9Q151 -9 100 58ZM333 80T355 117T377 229V584Q377 658 355 693T270 729Q206 729
224
+ 184 694T162 584V229Q162 154 184 117T270 80Q333 80 355 117ZM130 1042H238V931H130V1042ZM302 1042H410V931H302V1042Z" />
225
+ <glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="383" d="M49 308L138 397L49 486L103 540L191 451L280 540L334 486L245 397L334 308L280 254L191 343L103 254L49 308Z" />
226
+ <glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="540" d="M491 737T491 561V253Q491 127 439 59T270 -9Q217 -9 181 4L160 -74L121 -62L143 21Q93 51 71 109T48 254V561Q48 687 100 752T270 817Q315 817 353 806L373 880L413 870L392 791Q491 737 491
227
+ 561ZM162 169T174 137L329 717Q307 729 270 729Q206 729 184 694T162 584V229Q162 169 174 137ZM377 584Q377 651 362 681L206 96Q230 80 270 80Q333 80 355 117T377 229V584Z" />
228
+ <glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM136 1056H243L300 858H247L136 1056Z" />
229
+ <glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM303 1056H410L298 858H244L303 1056Z" />
230
+ <glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM217 1042H326L413 867H332L271
231
+ 988L211 867H131L217 1042Z" />
232
+ <glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="543" d="M187 -9T140 25T74 120T56 273V810H164V268Q164 176 185 128T272 80Q337 80 358 128T380 268V810H487V273Q487 181 469 120T404 25T272 -9Q187 -9 140 25ZM132 1042H240V931H132V1042ZM304
233
+ 1042H412V931H304V1042Z" />
234
+ <glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="481" d="M187 286L12 810H117L241 419L363 810H469L295 286V0H187V286ZM272 1056H379L267 858H213L272 1056Z" />
235
+ <glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="503" d="M63 810H176V704H293Q391 704 438 642T486 469Q486 233 274 233H176V0H63V810ZM246 324Q315 324 345 355T376 469Q376 546 349 578T259 610H176V324H246Z" />
236
+ <glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="515" d="M223 80Q275 80 303 97T342 147T353 232Q353 298 322 336T230 375L231 464Q281 464 302 506T324 611Q324 669 307 700T244 731Q199 731 183 702T166 613V0H59V612Q59 709 105 764T241 819Q335
237
+ 819 382 766T429 611Q429 541 405 498T330 428Q392 412 425 360T459 232Q459 114 403 53T223 -9V80Z" />
238
+ <glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
239
+ 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM83 824H190L247 626H194L83 824Z" />
240
+ <glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
241
+ 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM250 824H357L245 626H191L250 824Z" />
242
+ <glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377
243
+ 74 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM164 810H273L360 635H279L218 756L158 635H78L164 810Z" />
244
+ <glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74
245
+ 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM275 700T259 707T221 727Q201 738 189 743T164 749Q146 749 138 740T130 708H69Q69 816 149
246
+ 816Q166 816 181 810T217 791Q237 779 249 774T276 768Q294 768 301 777T309 810H369Q369 759 353 730T295 700Q275 700 259 707Z" />
247
+ <glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377
248
+ 74 387 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM79 810H187V699H79V810ZM251 810H359V699H251V810Z" />
249
+ <glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="426" d="M125 -8T99 11T57 61T42 126Q42 194 71 236T144 303T270 361V402Q270 459 259 482T212 506Q151 506 151 424V395L45 399L46 420Q51 507 94 546T219 586Q302 586 339 541T377 403V139Q377 74 387
250
+ 0H289Q278 57 275 85Q263 46 234 19T158 -8Q125 -8 99 11ZM221 84T241 100T270 132V296Q226 270 204 256T166 217T149 159Q149 123 162 104T200 84Q221 84 241 100ZM169 596T138 626T107 708Q107 759 137 789T219 819Q270 819 300 789T331 708Q331 657 300 627T219
251
+ 596Q169 596 138 626ZM245 650T261 665T277 708Q277 735 262 750T219 766Q192 766 177 751T161 708Q161 681 176 666T219 650Q245 650 261 665Z" />
252
+ <glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="653" d="M609 201V177Q609 88 569 40T444 -8Q392 -8 358 24T315 109Q293 56 257 24T171 -8Q135 -8 106 10T60 59T43 126Q43 201 82 243T197 306L275 327V402Q275 453 262 478T214 504Q151 504 151 409H45Q46
253
+ 491 90 538T214 586Q256 586 285 566T327 511Q342 545 378 565T463 586Q533 586 568 548T604 443Q604 394 583 365T531 323T453 297L382 282V255Q382 197 384 163T401 103T445 77Q477 77 489 103T502 176V201H609ZM382 340L437 353Q474 364 490 381T506 436Q506
254
+ 464 492 481T447 499Q411 499 397 473T382 397V340ZM275 265Q266 263 250 258T229 250Q190 233 170 210T150 149Q150 116 165 96T202 75Q233 75 254 110T275 211V265Z" />
255
+ <glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="411" d="M273 370V405Q273 462 261 484T213 507Q186 507 173 495T155 456T150 377V195Q150 145 156 119T175 82T214 71Q251 71 262 95T273 171V218H370V178Q370 90 340 44T233 -7V-56Q283 -56 313
256
+ -79T344 -142Q344 -188 310 -211T219 -235Q190 -235 152 -225V-171Q176 -178 203 -178Q230 -178 247 -169T264 -139Q264 -114 244 -102T179 -83V-6Q100 3 72 59T43 222V355Q43 433 56 483T107 559T212 586Q274 586 308 566T356 507T370 404V370H273Z" />
257
+ <glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214
258
+ -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM75 824H182L239 626H186L75 824Z" />
259
+ <glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338 40T214
260
+ -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM242 824H349L237 626H183L242 824Z" />
261
+ <glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338
262
+ 40T214 -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM156 810H265L352 635H271L210 756L150 635H70L156 810Z" />
263
+ <glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="421" d="M147 -8T110 17T58 93T43 223V355Q43 475 80 530T214 586Q284 586 319 557T366 476T378 334V287H150V210Q150 158 152 132T168 89T213 71Q248 71 260 94T273 166V201H377V179Q377 88 338
264
+ 40T214 -8Q147 -8 110 17ZM273 345V397Q273 456 262 481T213 507Q187 507 174 495T155 456T150 376V345H273ZM71 810H179V699H71V810ZM243 810H351V699H243V810Z" />
265
+ <glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="224" d="M61 578H168V0H61V578ZM-21 824H86L143 626H90L-21 824Z" />
266
+ <glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="224" d="M61 578H168V0H61V578ZM146 824H253L141 626H87L146 824Z" />
267
+ <glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="224" d="M61 578H168V0H61V578ZM60 810H169L256 635H175L114 756L54 635H-26L60 810Z" />
268
+ <glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="224" d="M61 578H168V0H61V578ZM-25 810H83V699H-25V810ZM147 810H255V699H147V810Z" />
269
+ <glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="471" d="M156 -9T118 18T66 96T52 225V292Q52 418 85 487T209 557Q266 557 306 521Q297 615 271 655L152 618V672L242 698Q220 723 183 735T77 749L82 819Q178 818 235 796T326 725L442 759V705L353 681Q386
270
+ 609 401 538T416 377V237Q416 119 372 55T227 -9Q156 -9 118 18ZM279 76T294 110T309 219L310 343Q310 380 308 436Q306 437 297 446T271 462T236 469Q192 469 176 426T159 284L158 206Q158 142 172 109T230 76Q279 76 294 110Z" />
271
+ <glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="439" d="M54 578H161V521Q230 586 302 586Q349 586 369 552T389 468V0H282V437Q282 470 272 486T236 502Q204 502 161 466V0H54V578ZM276 700T260 707T222 727Q202 738 190 743T165 749Q147 749 139
272
+ 740T131 708H70Q70 816 150 816Q167 816 182 810T218 791Q238 779 250 774T277 768Q295 768 302 777T310 810H370Q370 759 354 730T296 700Q276 700 260 707Z" />
273
+ <glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
274
+ 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM76 824H183L240 626H187L76 824Z" />
275
+ <glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
276
+ 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM243 824H350L238 626H184L243 824Z" />
277
+ <glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212
278
+ 507Q183 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM157 810H266L353 635H272L211 756L151 635H71L157 810Z" />
279
+ <glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212 507Q183
280
+ 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM268 700T252 707T214 727Q194 738 182 743T157 749Q139 749 131 740T123 708H62Q62 816 142 816Q159 816 174 810T210 791Q230 779 242 774T269 768Q287 768 294 777T302 810H362Q362
281
+ 759 346 730T288 700Q268 700 252 707Z" />
282
+ <glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="424" d="M120 -8T82 46T43 205V373Q43 477 81 531T212 586Q303 586 341 532T380 373V205Q380 101 342 47T212 -8Q120 -8 82 46ZM241 71T254 88T270 130T273 198V379Q273 422 270 447T254 490T212
283
+ 507Q183 507 170 490T153 448T150 379V198Q150 155 153 130T169 88T212 71Q241 71 254 88ZM72 810H180V699H72V810ZM244 810H352V699H244V810Z" />
284
+ <glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="346" d="M130 638H215V527H130V638ZM19 450H328V372H19V450ZM130 283H215V172H130V283Z" />
285
+ <glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="424" d="M380 498T380 373V205Q380 101 342 47T212 -8Q166 -8 133 6L96 -95L64 -84L102 25Q43 73 43 205V373Q43 477 81 531T212 586Q260 586 295 570L330 668L367 656L328 547Q380 498 380 373ZM150
286
+ 160L262 476Q249 507 212 507Q183 507 170 490T153 448T150 379V198V160ZM273 379V395L165 95Q179 71 212 71Q241 71 254 88T270 130T273 198V379Z" />
287
+ <glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM84 824H191L248 626H195L84 824Z" />
288
+ <glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM251 824H358L246 626H192L251 824Z" />
289
+ <glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM165 810H274L361 635H280L219 756L159 635H79L165 810Z" />
290
+ <glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="440" d="M90 -8T70 26T50 110V578H157V142Q157 109 167 93T203 76Q235 76 278 112V578H385V0H278V57Q209 -8 137 -8Q90 -8 70 26ZM80 810H188V699H80V810ZM252 810H360V699H252V810Z" />
291
+ <glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63ZM227 824H334L222 626H168L227 824Z" />
292
+ <glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="447" d="M55 810H162V532Q209 586 272 586Q351 586 377 519T404 369V229Q404 123 372 58T260 -8Q209 -8 162 43V-190H55V810ZM276 76T286 114T297 229V369Q297 433 285 467T234 502Q198 502 162 472V102Q197
293
+ 76 239 76Q276 76 286 114Z" />
294
+ <glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="392" d="M45 -63Q105 -63 127 -54T150 -20Q150 -14 146 6L133 66L128 86Q78 294 12 578H120L198 146L273 578H381L243 -32Q229 -93 184 -119T58 -145H45V-63ZM56 810H164V699H56V810ZM228 810H336V699H228V810Z"
295
+ />
296
+ <glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="494" d="M8 285H487V204H8V285Z" />
297
+ <glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="965" d="M8 347H958V269H8V347Z" />
298
+ <glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="208" d="M31 676Q31 757 54 799T130 843L149 804Q119 801 107 775T95 691H148V579H31V676Z" />
299
+ <glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="208" d="M59 585Q89 587 101 613T113 697H60V810H177V713Q177 632 154 590T78 545L59 585Z" />
300
+ <glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="208" d="M59 -93Q89 -91 101 -65T113 19H60V132H177V35Q177 -46 154 -88T78 -133L59 -93Z" />
301
+ <glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="384" d="M31 676Q31 757 54 799T130 843L149 804Q119 801 107 775T95 691H148V579H31V676ZM207 676Q207 757 230 799T306 843L325 804Q295 801 283 775T271 691H324V579H207V676Z" />
302
+ <glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="384" d="M59 585Q89 587 101 613T113 697H60V810H177V713Q177 632 154 590T78 545L59 585ZM235 585Q265 587 277 613T289 697H236V810H353V713Q353 632 330 590T254 545L235 585Z" />
303
+ <glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="384" d="M235 -93Q265 -91 277 -65T289 19H236V132H353V35Q353 -46 330 -88T254 -133L235 -93ZM59 -93Q89 -91 101 -65T113 19H60V132H177V35Q177 -46 154 -88T78 -133L59 -93Z" />
304
+ <glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="363" d="M128 272T98 304T68 390Q68 444 98 475T181 507Q235 507 265 475T295 390Q295 335 265 304T181 272Q128 272 98 304Z" />
305
+ <glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="275" d="M43 269V321L242 549V415L125 295L242 174V41L43 269Z" />
306
+ <glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="292" d="M60 227L177 348L60 467V602L258 374V321L60 93V227Z" />
307
+ </font>
308
+ </defs>
309
+ </svg>
assets/js/script.js CHANGED
@@ -1,44 +1,44 @@
1
- jQuery(document).ready(function ($) {
2
-
3
- do_resize();
4
-
5
- $(window).resize(function () {
6
- do_resize();
7
-
8
- });
9
-
10
- function do_resize() {
11
-
12
- $('.ots-team-view').each(function (index, el) {
13
-
14
- var members = $(el).find('#sc_our_team.grid .sc_team_member, ' +
15
- '#sc_our_team.grid_circles .sc_team_member,' +
16
- '#sc_our_team.grid_circles2 .sc_team_member');
17
-
18
- var member_height = members.width();
19
-
20
- members.each(function (index, el) {
21
- $(el).find('.sc_team_member_inner').css({height: member_height});
22
- });
23
-
24
-
25
- members.mouseenter(function () {
26
-
27
- $(this).find('.sc_team_member_overlay').stop(true, false).fadeIn(440);
28
- $(this).find('.wp-post-image').addClass('zoomIn');
29
- $(this).find('.sc_team_more').addClass('show');
30
-
31
- }).mouseleave(function () {
32
-
33
- $(this).find('.sc_team_member_overlay').stop(true, false).fadeOut(440);
34
- $(this).find('.wp-post-image').removeClass('zoomIn');
35
- $(this).find('.sc_team_more').removeClass('show');
36
-
37
- });
38
-
39
- });
40
-
41
-
42
- }
43
-
44
- });
1
+ jQuery(document).ready(function ($) {
2
+
3
+ do_resize();
4
+
5
+ $(window).resize(function () {
6
+ do_resize();
7
+
8
+ });
9
+
10
+ function do_resize() {
11
+
12
+ $('.ots-team-view').each(function (index, el) {
13
+
14
+ var members = $(el).find('#sc_our_team.grid .sc_team_member, ' +
15
+ '#sc_our_team.grid_circles .sc_team_member,' +
16
+ '#sc_our_team.grid_circles2 .sc_team_member');
17
+
18
+ var member_height = members.width();
19
+
20
+ members.each(function (index, el) {
21
+ $(el).find('.sc_team_member_inner').css({height: member_height});
22
+ });
23
+
24
+
25
+ members.mouseenter(function () {
26
+
27
+ $(this).find('.sc_team_member_overlay').stop(true, false).fadeIn(440);
28
+ $(this).find('.wp-post-image').addClass('zoomIn');
29
+ $(this).find('.sc_team_more').addClass('show');
30
+
31
+ }).mouseleave(function () {
32
+
33
+ $(this).find('.sc_team_member_overlay').stop(true, false).fadeOut(440);
34
+ $(this).find('.wp-post-image').removeClass('zoomIn');
35
+ $(this).find('.sc_team_more').removeClass('show');
36
+
37
+ });
38
+
39
+ });
40
+
41
+
42
+ }
43
+
44
+ });
constants.php CHANGED
@@ -1,161 +1,161 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- const VERSION = '4.4.1';
6
-
7
-
8
- interface Options {
9
-
10
- /**
11
- * @since 4.0.0
12
- */
13
- const REWRITE_SLUG = 'ots-team-rewrite-slug';
14
-
15
- /**
16
- * @since 4.0.0
17
- */
18
- const TEMPLATE = 'ots-team-template';
19
-
20
- /**
21
- * @since 4.0.0
22
- */
23
- const GRID_COLUMNS = 'ots-team-grid-columns';
24
-
25
- /**
26
- * @since 4.0.0
27
- */
28
- const MARGIN = 'ots-team-margin';
29
-
30
- /**
31
- * @since 4.0.0
32
- */
33
- const SHOW_SOCIAL = 'ots-team-show-social';
34
-
35
- /**
36
- * @since 4.0.0
37
- */
38
- const SOCIAL_LINK_ACTION = 'ots-team-social-link-action';
39
-
40
- /**
41
- * @since 4.0.0
42
- */
43
- const DISPLAY_NAME = 'ots-team-display-name';
44
-
45
- /**
46
- * @since 4.0.0
47
- */
48
- const DISPLAY_TITLE = 'ots-team-display-title';
49
-
50
- /**
51
- * @since 4.0.0
52
- */
53
- const DISPLAY_LIMIT = 'ots-team-display-limit';
54
-
55
- /**
56
- * @since 4.0.0
57
- */
58
- const MAIN_COLOR = 'ots-team-main-color';
59
-
60
- /**
61
- * @since 4.0.0
62
- */
63
- const SINGLE_TEMPLATE = 'ots-single-template';
64
-
65
- /**
66
- * @since 4.0.0
67
- */
68
- const DEFAULT_AVATAR = 'ots-default-avatar';
69
-
70
- /**
71
- * @since 4.0.0
72
- */
73
- const SHOW_SINGLE_SOCIAL = 'ots-show-single-social';
74
-
75
- /**
76
- * @since 4.0.0
77
- */
78
- const PLUGIN_VERSION = 'ots-plugin-version';
79
-
80
- /**
81
- * @since 4.0.0
82
- */
83
- const NUKE = 'ots-nuke-install';
84
-
85
-
86
- /**
87
- * @since 4.3.0
88
- */
89
- const EXPORT_BUTTON = 'ots-export-button';
90
-
91
- /**
92
- * @since 4.3.0
93
- */
94
- const IMPORT_BUTTON = 'ots-import-button';
95
-
96
- }
97
-
98
- interface Defaults {
99
-
100
- /**
101
- * @since 4.0.0
102
- */
103
- const REWRITE_SLUG = 'team-member';
104
-
105
- /**
106
- * @since 4.0.0
107
- */
108
- const TEMPLATE = 'grid';
109
-
110
- /**
111
- * @since 4.0.0
112
- */
113
- const GRID_COLUMNS = 3;
114
-
115
- /**
116
- * @since 4.0.0
117
- */
118
- const MARGIN = 5;
119
-
120
- /**
121
- * @since 4.0.0
122
- */
123
- const SHOW_SOCIAL = 'on';
124
-
125
- /**
126
- * @since 4.0.0
127
- */
128
- const SOCIAL_LINK_ACTION = 'on';
129
-
130
- /**
131
- * @since 4.0.0
132
- */
133
- const DISPLAY_NAME = 'on';
134
-
135
- /**
136
- * @since 4.0.0
137
- */
138
- const DISPLAY_TITLE = 'on';
139
-
140
- /**
141
- * @since 4.0.0
142
- */
143
- const DISPLAY_LIMIT = 'all';
144
-
145
- /**
146
- * @since 4.0.0
147
- */
148
- const MAIN_COLOR = '#1f7dcf';
149
-
150
- /**
151
- * @since 4.0.0
152
- */
153
- const SINGLE_TEMPLATE = 'standard';
154
-
155
- /**
156
- * @since 4.0.0
157
- */
158
- const SHOW_SINGLE_SOCIAL = 'on';
159
-
160
-
161
- }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ const VERSION = '4.4.2';
6
+
7
+
8
+ interface Options {
9
+
10
+ /**
11
+ * @since 4.0.0
12
+ */
13
+ const REWRITE_SLUG = 'ots-team-rewrite-slug';
14
+
15
+ /**
16
+ * @since 4.0.0
17
+ */
18
+ const TEMPLATE = 'ots-team-template';
19
+
20
+ /**
21
+ * @since 4.0.0
22
+ */
23
+ const GRID_COLUMNS = 'ots-team-grid-columns';
24
+
25
+ /**
26
+ * @since 4.0.0
27
+ */
28
+ const MARGIN = 'ots-team-margin';
29
+
30
+ /**
31
+ * @since 4.0.0
32
+ */
33
+ const SHOW_SOCIAL = 'ots-team-show-social';
34
+
35
+ /**
36
+ * @since 4.0.0
37
+ */
38
+ const SOCIAL_LINK_ACTION = 'ots-team-social-link-action';
39
+
40
+ /**
41
+ * @since 4.0.0
42
+ */
43
+ const DISPLAY_NAME = 'ots-team-display-name';
44
+
45
+ /**
46
+ * @since 4.0.0
47
+ */
48
+ const DISPLAY_TITLE = 'ots-team-display-title';
49
+
50
+ /**
51
+ * @since 4.0.0
52
+ */
53
+ const DISPLAY_LIMIT = 'ots-team-display-limit';
54
+
55
+ /**
56
+ * @since 4.0.0
57
+ */
58
+ const MAIN_COLOR = 'ots-team-main-color';
59
+
60
+ /**
61
+ * @since 4.0.0
62
+ */
63
+ const SINGLE_TEMPLATE = 'ots-single-template';
64
+
65
+ /**
66
+ * @since 4.0.0
67
+ */
68
+ const DEFAULT_AVATAR = 'ots-default-avatar';
69
+
70
+ /**
71
+ * @since 4.0.0
72
+ */
73
+ const SHOW_SINGLE_SOCIAL = 'ots-show-single-social';
74
+
75
+ /**
76
+ * @since 4.0.0
77
+ */
78
+ const PLUGIN_VERSION = 'ots-plugin-version';
79
+
80
+ /**
81
+ * @since 4.0.0
82
+ */
83
+ const NUKE = 'ots-nuke-install';
84
+
85
+
86
+ /**
87
+ * @since 4.3.0
88
+ */
89
+ const EXPORT_BUTTON = 'ots-export-button';
90
+
91
+ /**
92
+ * @since 4.3.0
93
+ */
94
+ const IMPORT_BUTTON = 'ots-import-button';
95
+
96
+ }
97
+
98
+ interface Defaults {
99
+
100
+ /**
101
+ * @since 4.0.0
102
+ */
103
+ const REWRITE_SLUG = 'team-member';
104
+
105
+ /**
106
+ * @since 4.0.0
107
+ */
108
+ const TEMPLATE = 'grid';
109
+
110
+ /**
111
+ * @since 4.0.0
112
+ */
113
+ const GRID_COLUMNS = 3;
114
+
115
+ /**
116
+ * @since 4.0.0
117
+ */
118
+ const MARGIN = 5;
119
+
120
+ /**
121
+ * @since 4.0.0
122
+ */
123
+ const SHOW_SOCIAL = 'on';
124
+
125
+ /**
126
+ * @since 4.0.0
127
+ */
128
+ const SOCIAL_LINK_ACTION = 'on';
129
+
130
+ /**
131
+ * @since 4.0.0
132
+ */
133
+ const DISPLAY_NAME = 'on';
134
+
135
+ /**
136
+ * @since 4.0.0
137
+ */
138
+ const DISPLAY_TITLE = 'on';
139
+
140
+ /**
141
+ * @since 4.0.0
142
+ */
143
+ const DISPLAY_LIMIT = 'all';
144
+
145
+ /**
146
+ * @since 4.0.0
147
+ */
148
+ const MAIN_COLOR = '#1f7dcf';
149
+
150
+ /**
151
+ * @since 4.0.0
152
+ */
153
+ const SINGLE_TEMPLATE = 'standard';
154
+
155
+ /**
156
+ * @since 4.0.0
157
+ */
158
+ const SHOW_SINGLE_SOCIAL = 'on';
159
+
160
+
161
+ }
includes/TeamMainWidget.php CHANGED
@@ -1,256 +1,256 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- class TeamMainWidget extends \WP_Widget {
6
-
7
- public function __construct() {
8
-
9
- $options = array(
10
- 'description' => __( 'Use this widget to display the Our Team anywhere on the site.', 'ots' )
11
- );
12
-
13
- parent::__construct( 'ots_main_widget', __( 'Our Team Widget', 'ots' ), $options );
14
-
15
- }
16
-
17
- private function single_templates() {
18
-
19
- $default = array(
20
- 'disable' => __( 'Disabled', 'ots' )
21
- );
22
-
23
- return apply_filters( 'ots_inline_templates', $default );
24
-
25
- }
26
-
27
- private function parse_args( $instance ) {
28
-
29
- $defaults = array(
30
- 'id' => '',
31
- 'title' => __( 'Meet Our Team', 'ots' ),
32
- 'group' => '',
33
- 'limit' => 'all',
34
- 'columns' => Defaults::GRID_COLUMNS,
35
- 'template' => Defaults::TEMPLATE,
36
- 'single_template' => Defaults::SINGLE_TEMPLATE
37
- );
38
-
39
- return wp_parse_args( $instance, $defaults );
40
-
41
- }
42
-
43
- public function widget( $args, $instance ) {
44
-
45
- enqueue_team_view_scripts();
46
-
47
- $instance = $this->parse_args( $instance );
48
-
49
- echo $args[ 'before_widget' ];
50
- echo $args[ 'before_title' ] . esc_html( $instance['title'] ) . $args[ 'after_title' ];
51
-
52
- echo do_team_view_output( $instance );
53
-
54
- }
55
-
56
- public function update( $new_instance, $old_instance ) {
57
-
58
- $instance = $old_instance;
59
-
60
- $id = $new_instance['id'];
61
- $title = $new_instance['title'];
62
- $group = $new_instance['group'];
63
- $limit = $new_instance['limit'];
64
- $columns = $new_instance['columns'];
65
- $template = $new_instance['template'];
66
- $single = $new_instance['single_template'];
67
-
68
-
69
- $groups = get_groups( 'slug' );
70
-
71
- $instance['id'] = sanitize_title( $id );
72
- $instance['title'] = strip_tags( $title );
73
- $instance['group'] = array_key_exists( $group, $groups ) ? $group : '';
74
-
75
- $group_templates = get_templates();
76
- $single_templates = $this->single_templates();
77
-
78
- $instance['columns'] = absint( $columns ) > 0 ? $columns : Defaults::GRID_COLUMNS;
79
-
80
- $instance['template'] = array_key_exists( $template, $group_templates ) ? $template : Defaults::TEMPLATE;
81
- $instance['single_template'] = array_key_exists( $single, $single_templates ) ? $single : Defaults::SINGLE_TEMPLATE;
82
-
83
- if( strtolower( $limit ) === 'all' || $limit > 0 ) {
84
- $instance['limit'] = $limit;
85
- } else {
86
- $instance['limit'] = 'all';
87
- }
88
-
89
- return $instance;
90
-
91
- }
92
-
93
- public function form( $instance ) {
94
-
95
- $instance = $this->parse_args( $instance ); ?>
96
-
97
- <p>
98
-
99
- <label for="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>">
100
- <?php _e( 'Title', 'ots' ); ?>
101
- </label>
102
-
103
- <input class="widefat"
104
- id="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>"
105
- name="<?php esc_attr_e( $this->get_field_name( 'title' ) ); ?>"
106
- value="<?php esc_attr_e( $instance['title'] ); ?>" />
107
-
108
- </p>
109
- <p>
110
-
111
- <label for="<?php esc_attr_e( $this->get_field_id( 'id' ) ); ?>">
112
- <?php _e( 'ID', 'ots' ); ?>
113
- </label>
114
-
115
- <input class="widefat"
116
- id="<?php esc_attr_e( $this->get_field_id( 'id' ) ); ?>"
117
- name="<?php esc_attr_e( $this->get_field_name( 'id' ) ); ?>"
118
- value="<?php esc_attr_e( $instance['id'] ); ?>" />
119
-
120
- </p>
121
- <p>
122
-
123
- <label for="<?php esc_attr_e( $this->get_field_id( 'template' ) ); ?>">
124
- <?php _e( 'Template', 'ots' ); ?>
125
- </label>
126
-
127
- <?php
128
-
129
- $args = array(
130
- 'name' => $this->get_field_name( 'template' ),
131
- 'selected' => $instance['template'],
132
- 'options' => array( '' => __( 'Select a template', 'ots' ) ) + get_templates(),
133
- 'attrs' => array(
134
- 'class' => 'widefat',
135
- 'id' => $this->get_field_id( 'template' )
136
- )
137
- );
138
-
139
- settings_select_box( $args );
140
-
141
- ?>
142
-
143
- </p>
144
- <p>
145
-
146
- <?php $templates = $this->single_templates(); ?>
147
-
148
- <?php if ( count( $templates ) == 1 ) : ?>
149
-
150
- <input type="hidden"
151
- value="disable"
152
- name="<?php esc_attr_e( $this->get_field_name( 'single_template' ) ); ?>"/>
153
-
154
- <label>
155
-
156
- <input type="checkbox"
157
- value="standard"
158
- name="<?php esc_attr_e( $this->get_field_name( 'single_template' ) ); ?>"
159
-
160
- <?php checked( 'disable', $instance['single_template'] ); ?>/>
161
-
162
- <?php _e( 'Enable linking to single members', 'ots' ); ?>
163
-
164
- </label>
165
-
166
- <?php else : ?>
167
-
168
-
169
- <label for="<?php esc_attr_e( $this->get_field_id( 'single_template' ) ); ?>">
170
- <?php _e( 'Single Template', 'ots' ); ?>
171
- </label>
172
-
173
- <?php
174
-
175
- $args = array(
176
- 'name' => $this->get_field_name( 'single_template' ),
177
- 'selected' => $instance['single_template'],
178
- 'options' => array( '' => __( 'Single Member', 'ots' ) ) + $templates,
179
- 'attrs' => array(
180
- 'class' => 'widefat',
181
- 'id' => $this->get_field_id( 'single_template' )
182
- )
183
- );
184
-
185
- settings_select_box( $args );
186
-
187
- ?>
188
-
189
- <?php endif; ?>
190
-
191
- </p>
192
- <p>
193
-
194
- <label for="<?php esc_attr_e( $this->get_field_id( 'group' ) ); ?>">
195
- <?php _e( 'Group', 'ots' ); ?>
196
- </label>
197
-
198
- <?php
199
-
200
- $args = array(
201
- 'name' => $this->get_field_name( 'group' ),
202
- 'selected' => $instance['group'],
203
- 'options' => array( '' => __( 'All Groups', 'ots' ) ) + get_groups( 'slug' ),
204
- 'attrs' => array(
205
- 'class' => 'widefat',
206
- 'id' => $this->get_field_id( 'group' )
207
- )
208
- );
209
-
210
- settings_select_box( $args );
211
-
212
- ?>
213
-
214
- </p>
215
- <p>
216
- <label for="<?php esc_attr_e( $this->get_field_id( 'columns' ) ); ?>"
217
- class="sc_our_team_widget_columns_label">
218
- <?php _e( 'Grid Columns', 'ots' ); ?>
219
- </label>
220
-
221
- <input class="widefat ots-grid-columns"
222
- type="number"
223
- id="<?php esc_attr_e( $this->get_field_id( 'columns' ) ); ?>"
224
- name="<?php esc_attr_e( $this->get_field_name( 'columns' ) ); ?>"
225
- value="<?php echo esc_attr_e( absint( $instance['columns'] ) ); ?>" />
226
- </p>
227
- <div class="ots-widget-limit">
228
- <p>
229
- <label for="<?php esc_attr_e( $this->get_field_id( 'limit' ) ); ?>"
230
- class="sc_our_team_widget_limit_label">
231
- <?php _e( 'Limit to Show', 'ots' ); ?>
232
- </label>
233
-
234
- <input class="widefat ots-limit-number"
235
- type="number"
236
- id="<?php esc_attr_e( $this->get_field_id( 'limit' ) ); ?>"
237
- name="<?php esc_attr_e( $this->get_field_name( 'limit' ) ); ?>"
238
- value="<?php echo ( strtolower( $instance['limit'] ) !== 'all' ? esc_attr( $instance['limit'] ) : '' ); ?>"
239
-
240
- <?php disabled( 'all', strtolower( $instance['limit'] ) ); ?> />
241
- </p>
242
- <p>
243
- <?php _e( '- or -', 'ots' ); ?>
244
-
245
- <label>
246
- <input type="checkbox"
247
- class="ots-widget-display-all"
248
- name="<?php esc_attr_e( $this->get_field_name( 'limit' ) ); ?>"
249
- <?php checked( 'all', strtolower( $instance['limit'] ) ); ?> /><?php _e( 'Display All', 'ots' ); ?>
250
- </label>
251
- </p>
252
- </div>
253
-
254
- <?php }
255
-
256
- }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ class TeamMainWidget extends \WP_Widget {
6
+
7
+ public function __construct() {
8
+
9
+ $options = array(
10
+ 'description' => __( 'Use this widget to display the Our Team anywhere on the site.', 'ots' )
11
+ );
12
+
13
+ parent::__construct( 'ots_main_widget', __( 'Our Team Widget', 'ots' ), $options );
14
+
15
+ }
16
+
17
+ private function single_templates() {
18
+
19
+ $default = array(
20
+ 'disable' => __( 'Disabled', 'ots' )
21
+ );
22
+
23
+ return apply_filters( 'ots_inline_templates', $default );
24
+
25
+ }
26
+
27
+ private function parse_args( $instance ) {
28
+
29
+ $defaults = array(
30
+ 'id' => '',
31
+ 'title' => __( 'Meet Our Team', 'ots' ),
32
+ 'group' => '',
33
+ 'limit' => 'all',
34
+ 'columns' => Defaults::GRID_COLUMNS,
35
+ 'template' => Defaults::TEMPLATE,
36
+ 'single_template' => Defaults::SINGLE_TEMPLATE
37
+ );
38
+
39
+ return wp_parse_args( $instance, $defaults );
40
+
41
+ }
42
+
43
+ public function widget( $args, $instance ) {
44
+
45
+ enqueue_team_view_scripts();
46
+
47
+ $instance = $this->parse_args( $instance );
48
+
49
+ echo $args[ 'before_widget' ];
50
+ echo $args[ 'before_title' ] . esc_html( $instance['title'] ) . $args[ 'after_title' ];
51
+
52
+ echo do_team_view_output( $instance );
53
+
54
+ }
55
+
56
+ public function update( $new_instance, $old_instance ) {
57
+
58
+ $instance = $old_instance;
59
+
60
+ $id = $new_instance['id'];
61
+ $title = $new_instance['title'];
62
+ $group = $new_instance['group'];
63
+ $limit = $new_instance['limit'];
64
+ $columns = $new_instance['columns'];
65
+ $template = $new_instance['template'];
66
+ $single = $new_instance['single_template'];
67
+
68
+
69
+ $groups = get_groups( 'slug' );
70
+
71
+ $instance['id'] = sanitize_title( $id );
72
+ $instance['title'] = strip_tags( $title );
73
+ $instance['group'] = array_key_exists( $group, $groups ) ? $group : '';
74
+
75
+ $group_templates = get_templates();
76
+ $single_templates = $this->single_templates();
77
+
78
+ $instance['columns'] = absint( $columns ) > 0 ? $columns : Defaults::GRID_COLUMNS;
79
+
80
+ $instance['template'] = array_key_exists( $template, $group_templates ) ? $template : Defaults::TEMPLATE;
81
+ $instance['single_template'] = array_key_exists( $single, $single_templates ) ? $single : Defaults::SINGLE_TEMPLATE;
82
+
83
+ if( strtolower( $limit ) === 'all' || $limit > 0 ) {
84
+ $instance['limit'] = $limit;
85
+ } else {
86
+ $instance['limit'] = 'all';
87
+ }
88
+
89
+ return $instance;
90
+
91
+ }
92
+
93
+ public function form( $instance ) {
94
+
95
+ $instance = $this->parse_args( $instance ); ?>
96
+
97
+ <p>
98
+
99
+ <label for="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>">
100
+ <?php _e( 'Title', 'ots' ); ?>
101
+ </label>
102
+
103
+ <input class="widefat"
104
+ id="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>"
105
+ name="<?php esc_attr_e( $this->get_field_name( 'title' ) ); ?>"
106
+ value="<?php esc_attr_e( $instance['title'] ); ?>" />
107
+
108
+ </p>
109
+ <p>
110
+
111
+ <label for="<?php esc_attr_e( $this->get_field_id( 'id' ) ); ?>">
112
+ <?php _e( 'ID', 'ots' ); ?>
113
+ </label>
114
+
115
+ <input class="widefat"
116
+ id="<?php esc_attr_e( $this->get_field_id( 'id' ) ); ?>"
117
+ name="<?php esc_attr_e( $this->get_field_name( 'id' ) ); ?>"
118
+ value="<?php esc_attr_e( $instance['id'] ); ?>" />
119
+
120
+ </p>
121
+ <p>
122
+
123
+ <label for="<?php esc_attr_e( $this->get_field_id( 'template' ) ); ?>">
124
+ <?php _e( 'Template', 'ots' ); ?>
125
+ </label>
126
+
127
+ <?php
128
+
129
+ $args = array(
130
+ 'name' => $this->get_field_name( 'template' ),
131
+ 'selected' => $instance['template'],
132
+ 'options' => array( '' => __( 'Select a template', 'ots' ) ) + get_templates(),
133
+ 'attrs' => array(
134
+ 'class' => 'widefat',
135
+ 'id' => $this->get_field_id( 'template' )
136
+ )
137
+ );
138
+
139
+ settings_select_box( $args );
140
+
141
+ ?>
142
+
143
+ </p>
144
+ <p>
145
+
146
+ <?php $templates = $this->single_templates(); ?>
147
+
148
+ <?php if ( count( $templates ) == 1 ) : ?>
149
+
150
+ <input type="hidden"
151
+ value="disable"
152
+ name="<?php esc_attr_e( $this->get_field_name( 'single_template' ) ); ?>"/>
153
+
154
+ <label>
155
+
156
+ <input type="checkbox"
157
+ value="standard"
158
+ name="<?php esc_attr_e( $this->get_field_name( 'single_template' ) ); ?>"
159
+
160
+ <?php checked( 'disable', $instance['single_template'] ); ?>/>
161
+
162
+ <?php _e( 'Enable linking to single members', 'ots' ); ?>
163
+
164
+ </label>
165
+
166
+ <?php else : ?>
167
+
168
+
169
+ <label for="<?php esc_attr_e( $this->get_field_id( 'single_template' ) ); ?>">
170
+ <?php _e( 'Single Template', 'ots' ); ?>
171
+ </label>
172
+
173
+ <?php
174
+
175
+ $args = array(
176
+ 'name' => $this->get_field_name( 'single_template' ),
177
+ 'selected' => $instance['single_template'],
178
+ 'options' => array( '' => __( 'Single Member', 'ots' ) ) + $templates,
179
+ 'attrs' => array(
180
+ 'class' => 'widefat',
181
+ 'id' => $this->get_field_id( 'single_template' )
182
+ )
183
+ );
184
+
185
+ settings_select_box( $args );
186
+
187
+ ?>
188
+
189
+ <?php endif; ?>
190
+
191
+ </p>
192
+ <p>
193
+
194
+ <label for="<?php esc_attr_e( $this->get_field_id( 'group' ) ); ?>">
195
+ <?php _e( 'Group', 'ots' ); ?>
196
+ </label>
197
+
198
+ <?php
199
+
200
+ $args = array(
201
+ 'name' => $this->get_field_name( 'group' ),
202
+ 'selected' => $instance['group'],
203
+ 'options' => array( '' => __( 'All Groups', 'ots' ) ) + get_groups( 'slug' ),
204
+ 'attrs' => array(
205
+ 'class' => 'widefat',
206
+ 'id' => $this->get_field_id( 'group' )
207
+ )
208
+ );
209
+
210
+ settings_select_box( $args );
211
+
212
+ ?>
213
+
214
+ </p>
215
+ <p>
216
+ <label for="<?php esc_attr_e( $this->get_field_id( 'columns' ) ); ?>"
217
+ class="sc_our_team_widget_columns_label">
218
+ <?php _e( 'Grid Columns', 'ots' ); ?>
219
+ </label>
220
+
221
+ <input class="widefat ots-grid-columns"
222
+ type="number"
223
+ id="<?php esc_attr_e( $this->get_field_id( 'columns' ) ); ?>"
224
+ name="<?php esc_attr_e( $this->get_field_name( 'columns' ) ); ?>"
225
+ value="<?php echo esc_attr_e( absint( $instance['columns'] ) ); ?>" />
226
+ </p>
227
+ <div class="ots-widget-limit">
228
+ <p>
229
+ <label for="<?php esc_attr_e( $this->get_field_id( 'limit' ) ); ?>"
230
+ class="sc_our_team_widget_limit_label">
231
+ <?php _e( 'Limit to Show', 'ots' ); ?>
232
+ </label>
233
+
234
+ <input class="widefat ots-limit-number"
235
+ type="number"
236
+ id="<?php esc_attr_e( $this->get_field_id( 'limit' ) ); ?>"
237
+ name="<?php esc_attr_e( $this->get_field_name( 'limit' ) ); ?>"
238
+ value="<?php echo ( strtolower( $instance['limit'] ) !== 'all' ? esc_attr( $instance['limit'] ) : '' ); ?>"
239
+
240
+ <?php disabled( 'all', strtolower( $instance['limit'] ) ); ?> />
241
+ </p>
242
+ <p>
243
+ <?php _e( '- or -', 'ots' ); ?>
244
+
245
+ <label>
246
+ <input type="checkbox"
247
+ class="ots-widget-display-all"
248
+ name="<?php esc_attr_e( $this->get_field_name( 'limit' ) ); ?>"
249
+ <?php checked( 'all', strtolower( $instance['limit'] ) ); ?> /><?php _e( 'Display All', 'ots' ); ?>
250
+ </label>
251
+ </p>
252
+ </div>
253
+
254
+ <?php }
255
+
256
+ }
includes/TeamMember.php CHANGED
@@ -1,129 +1,129 @@
1
- <?php
2
-
3
-
4
- namespace ots;
5
-
6
- /**
7
- * Helper class for interacting with team members.
8
- *
9
- * @package ots
10
- * @since 4.0.0
11
- */
12
- class TeamMember {
13
-
14
- protected $post;
15
-
16
- protected static $prefix = 'team_member_';
17
-
18
-
19
- public function __construct( \WP_Post $member ) {
20
- $this->post = $member;
21
- }
22
-
23
- public function __get( $key ) {
24
- return $this->get_metadata( $key );
25
- }
26
-
27
- public function __set( $key, $value ) {
28
- $this->set_metadata( $key, $value );
29
- }
30
-
31
- public function __isset( $key ) {
32
-
33
- $meta = get_post_meta( $this->post->ID, $this->prefix( $key ) );
34
-
35
- return !empty( $meta );
36
-
37
- }
38
-
39
- public function __unset( $key ) {
40
- return delete_post_meta( $this->post->ID, $this->prefix( $key ) );
41
- }
42
-
43
- public function get_metadata( $key, $default = '', $single = true ) {
44
- $meta = get_post_meta( $this->post->ID, $this->prefix( $key ), $single );
45
-
46
- return !empty( $meta ) ? $meta : $default;
47
-
48
- }
49
-
50
- public function set_metadata( $key, $val = '', $unique = false ) {
51
-
52
- $key = $this->prefix( $key );
53
-
54
- if( !metadata_exists( 'post', $this->post->ID, $key ) ) {
55
- return add_post_meta( $this->post->ID, $key, $val, $unique );
56
- } else {
57
- return update_post_meta( $this->post->ID, $key, $val );
58
- }
59
-
60
- }
61
-
62
- public function get_id() {
63
-
64
- return $this->post->ID;
65
-
66
- }
67
-
68
-
69
- public function get_name() {
70
-
71
- return $this->post->post_title;
72
-
73
- }
74
-
75
-
76
- public function get_bio() {
77
-
78
- return $this->post->post_content;
79
-
80
- }
81
-
82
-
83
- public function get_groups() {
84
-
85
- return get_the_terms( get_post( $this->get_id() ), 'team_member_position' );
86
-
87
- }
88
-
89
- public function set_name( $name ) {
90
-
91
- wp_update_post( array(
92
- 'ID' => $this->get_id(),
93
- 'post_title' => $name
94
- ) );
95
-
96
- }
97
-
98
- public function set_bio( $bio ) {
99
-
100
- wp_update_post( array(
101
- 'ID' => $this->get_id(),
102
- 'post_content' => $bio
103
- ) );
104
-
105
- }
106
-
107
-
108
- public function in_group( $id ) {
109
-
110
- $groups = $this->get_groups();
111
-
112
- foreach ( $groups as $group ) {
113
-
114
- if ( $group->term_id == $id ) {
115
- return true;
116
- }
117
-
118
- }
119
-
120
- return false;
121
-
122
- }
123
-
124
-
125
- protected function prefix( $key ) {
126
- return self::$prefix . $key;
127
- }
128
-
129
  }
1
+ <?php
2
+
3
+
4
+ namespace ots;
5
+
6
+ /**
7
+ * Helper class for interacting with team members.
8
+ *
9
+ * @package ots
10
+ * @since 4.0.0
11
+ */
12
+ class TeamMember {
13
+
14
+ protected $post;
15
+
16
+ protected static $prefix = 'team_member_';
17
+
18
+
19
+ public function __construct( \WP_Post $member ) {
20
+ $this->post = $member;
21
+ }
22
+
23
+ public function __get( $key ) {
24
+ return $this->get_metadata( $key );
25
+ }
26
+
27
+ public function __set( $key, $value ) {
28
+ $this->set_metadata( $key, $value );
29
+ }
30
+
31
+ public function __isset( $key ) {
32
+
33
+ $meta = get_post_meta( $this->post->ID, $this->prefix( $key ) );
34
+
35
+ return !empty( $meta );
36
+
37
+ }
38
+
39
+ public function __unset( $key ) {
40
+ return delete_post_meta( $this->post->ID, $this->prefix( $key ) );
41
+ }
42
+
43
+ public function get_metadata( $key, $default = '', $single = true ) {
44
+ $meta = get_post_meta( $this->post->ID, $this->prefix( $key ), $single );
45
+
46
+ return !empty( $meta ) ? $meta : $default;
47
+
48
+ }
49
+
50
+ public function set_metadata( $key, $val = '', $unique = false ) {
51
+
52
+ $key = $this->prefix( $key );
53
+
54
+ if( !metadata_exists( 'post', $this->post->ID, $key ) ) {
55
+ return add_post_meta( $this->post->ID, $key, $val, $unique );
56
+ } else {
57
+ return update_post_meta( $this->post->ID, $key, $val );
58
+ }
59
+
60
+ }
61
+
62
+ public function get_id() {
63
+
64
+ return $this->post->ID;
65
+
66
+ }
67
+
68
+
69
+ public function get_name() {
70
+
71
+ return $this->post->post_title;
72
+
73
+ }
74
+
75
+
76
+ public function get_bio() {
77
+
78
+ return $this->post->post_content;
79
+
80
+ }
81
+
82
+
83
+ public function get_groups() {
84
+
85
+ return get_the_terms( get_post( $this->get_id() ), 'team_member_position' );
86
+
87
+ }
88
+
89
+ public function set_name( $name ) {
90
+
91
+ wp_update_post( array(
92
+ 'ID' => $this->get_id(),
93
+ 'post_title' => $name
94
+ ) );
95
+
96
+ }
97
+
98
+ public function set_bio( $bio ) {
99
+
100
+ wp_update_post( array(
101
+ 'ID' => $this->get_id(),
102
+ 'post_content' => $bio
103
+ ) );
104
+
105
+ }
106
+
107
+
108
+ public function in_group( $id ) {
109
+
110
+ $groups = $this->get_groups();
111
+
112
+ foreach ( $groups as $group ) {
113
+
114
+ if ( $group->term_id == $id ) {
115
+ return true;
116
+ }
117
+
118
+ }
119
+
120
+ return false;
121
+
122
+ }
123
+
124
+
125
+ protected function prefix( $key ) {
126
+ return self::$prefix . $key;
127
+ }
128
+
129
  }
includes/TeamSidebarWidget.php CHANGED
@@ -1,225 +1,225 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Widget to display a list of team members.
7
- *
8
- * @package ots
9
- * @since 4.0.0
10
- */
11
- /**
12
- * Class TeamWidget
13
- * @package ots
14
- */
15
- class TeamSidebarWidget extends \WP_Widget {
16
-
17
-
18
- public function __construct() {
19
-
20
- $options = array(
21
- 'description' => __( 'Use this widget to display the Our Team anywhere on the site.', 'ots' )
22
- );
23
-
24
- parent::__construct( 'smatcat_team_widget', __( 'Our Team Sidebar Widget', 'ots' ), $options );
25
-
26
- }
27
-
28
- private function parse_args( $instance ) {
29
-
30
- $defaults = array(
31
- 'sc_our_team_widget_title' => __( 'Meet Our Team', 'ots' ),
32
- 'sc_our_team_widget_limit' => 'all',
33
- 'sc_our_team_widget_group' => ''
34
- );
35
-
36
- return wp_parse_args( $instance, $defaults );
37
-
38
- }
39
-
40
- /**
41
- * Render the widget.
42
- *
43
- * @param array $args
44
- * @param array $instance
45
- * @since 4.0.0
46
- */
47
- public function widget( $args, $instance ) {
48
-
49
- $instance = $this->parse_args( $instance );
50
-
51
- echo $args[ 'before_widget' ];
52
- echo $args[ 'before_title' ] . esc_html( $instance['sc_our_team_widget_title'] ) . $args[ 'after_title' ];
53
-
54
- $limit = $instance['sc_our_team_widget_limit'];
55
- $group = $instance['sc_our_team_widget_group'] !== 'ignore-group' ? $instance['sc_our_team_widget_group'] : '';
56
-
57
- $members = get_members_in_order( $limit, $group );
58
-
59
- ?>
60
-
61
- <?php if ( $members->have_posts() ) : ?>
62
-
63
- <div id="sc_our_team" class="widget">
64
-
65
- <?php while ( $members->have_posts() ) : $members->the_post(); ?>
66
-
67
- <div itemscope itemtype="http://schema.org/Person" class="sc_sidebar_team_member">
68
-
69
- <?php if( get_option( Options::SINGLE_TEMPLATE ) !== 'disabled' ) : ?>
70
-
71
- <a href="<?php the_permalink(); ?>"
72
- title="<?php the_title_attribute(); ?>"
73
- rel="bookmark"><?php member_avatar(); ?></a>
74
-
75
- <?php else : ?>
76
-
77
- <?php member_avatar(); ?>
78
-
79
- <?php endif; ?>
80
-
81
- <div class="sc_team_member_overlay">
82
-
83
- <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
84
- <div itemprop="jobtitle" class="sc_team_member_jobtitle">
85
- <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
86
- </div>
87
-
88
- </div>
89
-
90
- </div>
91
-
92
- <?php wp_reset_postdata(); ?>
93
-
94
- <?php endwhile; ?>
95
-
96
- </div>
97
-
98
- <?php endif; ?>
99
-
100
- <?php }
101
-
102
-
103
- /**
104
- * Save updated widget settings.
105
- *
106
- * @param array $new_instance
107
- * @param array $old_instance
108
- * @return array
109
- * @since 4.0.0
110
- */
111
- public function update( $new_instance, $old_instance ) {
112
-
113
- $instance = $old_instance;
114
-
115
- $title = $new_instance['sc_our_team_widget_title'];
116
- $group = $new_instance['sc_our_team_widget_group'];
117
- $limit = $new_instance['sc_our_team_widget_limit'];
118
-
119
- $instance['sc_our_team_widget_title'] = strip_tags( $title );
120
- $instance['sc_our_team_widget_group'] = strip_tags( $group );
121
-
122
- if( strtolower( $limit ) === 'all' || $limit > 0 ) {
123
- $instance['sc_our_team_widget_limit'] = $limit;
124
- } else {
125
- $instance['sc_our_team_widget_limit'] = 'all';
126
- }
127
-
128
- return $instance;
129
-
130
- }
131
-
132
- /**
133
- * Output the widget settings form.
134
- *
135
- * @param array $instance
136
- * @since 4.0.0
137
- * @return void
138
- */
139
- public function form( $instance ) {
140
-
141
- $terms = get_terms( array(
142
- 'taxonomy' => 'team_member_position',
143
- 'hide_empty' => false
144
- ) );
145
-
146
- $instance = $this->parse_args( $instance );
147
-
148
- $title = $instance['sc_our_team_widget_title'];
149
- $group = $instance['sc_our_team_widget_group'];
150
- $limit = $instance['sc_our_team_widget_limit'];
151
-
152
- ?>
153
-
154
- <p>
155
-
156
- <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_title' ) ); ?>"
157
- class="sc_our_team_widget_title_label">
158
- <?php _e( 'Title: ', 'ots' ); ?>
159
- </label>
160
-
161
- <input class="widefat"
162
- id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_title' ) ); ?>"
163
- name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_title' ) ); ?>"
164
- value="<?php esc_attr_e( $title ); ?>" />
165
-
166
- </p>
167
- <p>
168
-
169
- <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_group' ) ); ?>"
170
- class="sc_our_team_widget_group_label">
171
- <?php _e( 'Group', 'ots' ); ?>
172
- </label>
173
-
174
- <select id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_group' ) ); ?>"
175
- name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_group' ) ); ?>"
176
- class="widefat">
177
-
178
- <option value="ignore-group"><?php _e( 'All Groups', 'ots' ); ?></option>
179
-
180
- <?php foreach( $terms as $term ) : ?>
181
-
182
- <option value="<?php esc_attr_e( $term->slug ); ?>"
183
- <?php selected( $group, $term->slug ); ?>><?php esc_html_e( $term->name ); ?>
184
- </option>
185
-
186
- <?php endforeach; ?>
187
-
188
- </select>
189
-
190
- </p>
191
- <div class="ots-widget-limit">
192
- <p>
193
- <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_limit' ) ); ?>"
194
- class="sc_our_team_widget_limit_label">
195
- <?php _e( 'Limit to Show', 'ots' ); ?>
196
- </label>
197
-
198
- <input class="widefat ots-limit-number"
199
- type="number"
200
- min="1"
201
- id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_limit' ) ); ?>"
202
- name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_limit' ) ); ?>"
203
- value="<?php echo $limit !== 'all' ? esc_attr_e( $limit ) : ''; ?>"
204
-
205
- <?php disabled( 'all', strtolower( $limit ) ); ?> />
206
-
207
- </p>
208
- <p>
209
- <?php _e( '- or -', 'ots' ); ?>
210
-
211
- <label>
212
- <input type="checkbox"
213
- class="ots-widget-display-all"
214
- name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_limit' ) ); ?>"
215
-
216
- <?php checked( 'all', strtolower( $limit ) ); ?>
217
- <?php disabled( true, is_numeric( $limit ) ); ?>/><?php _e( 'Display All', 'ots' ); ?>
218
-
219
- </label>
220
- </p>
221
- </div>
222
-
223
- <?php }
224
-
225
- }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Widget to display a list of team members.
7
+ *
8
+ * @package ots
9
+ * @since 4.0.0
10
+ */
11
+ /**
12
+ * Class TeamWidget
13
+ * @package ots
14
+ */
15
+ class TeamSidebarWidget extends \WP_Widget {
16
+
17
+
18
+ public function __construct() {
19
+
20
+ $options = array(
21
+ 'description' => __( 'Use this widget to display the Our Team anywhere on the site.', 'ots' )
22
+ );
23
+
24
+ parent::__construct( 'smatcat_team_widget', __( 'Our Team Sidebar Widget', 'ots' ), $options );
25
+
26
+ }
27
+
28
+ private function parse_args( $instance ) {
29
+
30
+ $defaults = array(
31
+ 'sc_our_team_widget_title' => __( 'Meet Our Team', 'ots' ),
32
+ 'sc_our_team_widget_limit' => 'all',
33
+ 'sc_our_team_widget_group' => ''
34
+ );
35
+
36
+ return wp_parse_args( $instance, $defaults );
37
+
38
+ }
39
+
40
+ /**
41
+ * Render the widget.
42
+ *
43
+ * @param array $args
44
+ * @param array $instance
45
+ * @since 4.0.0
46
+ */
47
+ public function widget( $args, $instance ) {
48
+
49
+ $instance = $this->parse_args( $instance );
50
+
51
+ echo $args[ 'before_widget' ];
52
+ echo $args[ 'before_title' ] . esc_html( $instance['sc_our_team_widget_title'] ) . $args[ 'after_title' ];
53
+
54
+ $limit = $instance['sc_our_team_widget_limit'];
55
+ $group = $instance['sc_our_team_widget_group'] !== 'ignore-group' ? $instance['sc_our_team_widget_group'] : '';
56
+
57
+ $members = get_members_in_order( $limit, $group );
58
+
59
+ ?>
60
+
61
+ <?php if ( $members->have_posts() ) : ?>
62
+
63
+ <div id="sc_our_team" class="widget">
64
+
65
+ <?php while ( $members->have_posts() ) : $members->the_post(); ?>
66
+
67
+ <div itemscope itemtype="http://schema.org/Person" class="sc_sidebar_team_member">
68
+
69
+ <?php if( get_option( Options::SINGLE_TEMPLATE ) !== 'disabled' ) : ?>
70
+
71
+ <a href="<?php the_permalink(); ?>"
72
+ title="<?php the_title_attribute(); ?>"
73
+ rel="bookmark"><?php member_avatar(); ?></a>
74
+
75
+ <?php else : ?>
76
+
77
+ <?php member_avatar(); ?>
78
+
79
+ <?php endif; ?>
80
+
81
+ <div class="sc_team_member_overlay">
82
+
83
+ <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
84
+ <div itemprop="jobtitle" class="sc_team_member_jobtitle">
85
+ <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
86
+ </div>
87
+
88
+ </div>
89
+
90
+ </div>
91
+
92
+ <?php wp_reset_postdata(); ?>
93
+
94
+ <?php endwhile; ?>
95
+
96
+ </div>
97
+
98
+ <?php endif; ?>
99
+
100
+ <?php }
101
+
102
+
103
+ /**
104
+ * Save updated widget settings.
105
+ *
106
+ * @param array $new_instance
107
+ * @param array $old_instance
108
+ * @return array
109
+ * @since 4.0.0
110
+ */
111
+ public function update( $new_instance, $old_instance ) {
112
+
113
+ $instance = $old_instance;
114
+
115
+ $title = $new_instance['sc_our_team_widget_title'];
116
+ $group = $new_instance['sc_our_team_widget_group'];
117
+ $limit = $new_instance['sc_our_team_widget_limit'];
118
+
119
+ $instance['sc_our_team_widget_title'] = strip_tags( $title );
120
+ $instance['sc_our_team_widget_group'] = strip_tags( $group );
121
+
122
+ if( strtolower( $limit ) === 'all' || $limit > 0 ) {
123
+ $instance['sc_our_team_widget_limit'] = $limit;
124
+ } else {
125
+ $instance['sc_our_team_widget_limit'] = 'all';
126
+ }
127
+
128
+ return $instance;
129
+
130
+ }
131
+
132
+ /**
133
+ * Output the widget settings form.
134
+ *
135
+ * @param array $instance
136
+ * @since 4.0.0
137
+ * @return void
138
+ */
139
+ public function form( $instance ) {
140
+
141
+ $terms = get_terms( array(
142
+ 'taxonomy' => 'team_member_position',
143
+ 'hide_empty' => false
144
+ ) );
145
+
146
+ $instance = $this->parse_args( $instance );
147
+
148
+ $title = $instance['sc_our_team_widget_title'];
149
+ $group = $instance['sc_our_team_widget_group'];
150
+ $limit = $instance['sc_our_team_widget_limit'];
151
+
152
+ ?>
153
+
154
+ <p>
155
+
156
+ <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_title' ) ); ?>"
157
+ class="sc_our_team_widget_title_label">
158
+ <?php _e( 'Title: ', 'ots' ); ?>
159
+ </label>
160
+
161
+ <input class="widefat"
162
+ id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_title' ) ); ?>"
163
+ name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_title' ) ); ?>"
164
+ value="<?php esc_attr_e( $title ); ?>" />
165
+
166
+ </p>
167
+ <p>
168
+
169
+ <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_group' ) ); ?>"
170
+ class="sc_our_team_widget_group_label">
171
+ <?php _e( 'Group', 'ots' ); ?>
172
+ </label>
173
+
174
+ <select id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_group' ) ); ?>"
175
+ name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_group' ) ); ?>"
176
+ class="widefat">
177
+
178
+ <option value="ignore-group"><?php _e( 'All Groups', 'ots' ); ?></option>
179
+
180
+ <?php foreach( $terms as $term ) : ?>
181
+
182
+ <option value="<?php esc_attr_e( $term->slug ); ?>"
183
+ <?php selected( $group, $term->slug ); ?>><?php esc_html_e( $term->name ); ?>
184
+ </option>
185
+
186
+ <?php endforeach; ?>
187
+
188
+ </select>
189
+
190
+ </p>
191
+ <div class="ots-widget-limit">
192
+ <p>
193
+ <label for="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_limit' ) ); ?>"
194
+ class="sc_our_team_widget_limit_label">
195
+ <?php _e( 'Limit to Show', 'ots' ); ?>
196
+ </label>
197
+
198
+ <input class="widefat ots-limit-number"
199
+ type="number"
200
+ min="1"
201
+ id="<?php esc_attr_e( $this->get_field_id( 'sc_our_team_widget_limit' ) ); ?>"
202
+ name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_limit' ) ); ?>"
203
+ value="<?php echo $limit !== 'all' ? esc_attr_e( $limit ) : ''; ?>"
204
+
205
+ <?php disabled( 'all', strtolower( $limit ) ); ?> />
206
+
207
+ </p>
208
+ <p>
209
+ <?php _e( '- or -', 'ots' ); ?>
210
+
211
+ <label>
212
+ <input type="checkbox"
213
+ class="ots-widget-display-all"
214
+ name="<?php esc_attr_e( $this->get_field_name( 'sc_our_team_widget_limit' ) ); ?>"
215
+
216
+ <?php checked( 'all', strtolower( $limit ) ); ?>
217
+ <?php disabled( true, is_numeric( $limit ) ); ?>/><?php _e( 'Display All', 'ots' ); ?>
218
+
219
+ </label>
220
+ </p>
221
+ </div>
222
+
223
+ <?php }
224
+
225
+ }
includes/add-ons.php CHANGED
@@ -1,95 +1,95 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
-
6
- /**
7
- * Registers the add-ons submenu page.
8
- *
9
- * @since 4.0.0
10
- */
11
- function add_addons_pages() {
12
-
13
- add_submenu_page( 'edit.php?post_type=team_member', __( 'Add-ons', 'ots' ), __( 'Add-ons', 'ots' ), 'manage_options', 'ots-add-ons', 'ots\do_addons_page' );
14
-
15
- }
16
-
17
- add_action( 'admin_menu', 'ots\add_addons_pages' );
18
-
19
-
20
- /**
21
- * Renders the add-ons admin page.
22
- *
23
- * @since 4.0.0
24
- */
25
- function do_addons_page() { ?>
26
-
27
- <div class="wrap ots-admin-page ots-add-ons">
28
-
29
- <div class="ots-admin-header">
30
-
31
- <div class="title-bar">
32
-
33
- <div class="inner">
34
-
35
- <div class="branding">
36
- <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
37
- </div>
38
-
39
- <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
40
-
41
- </div>
42
-
43
- <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
44
-
45
- <div class="inner">
46
-
47
- <a href="http://wordpressteamplugin.com/templates/"
48
- class="cta cta-secondary"
49
- target="_blank">
50
- <?php _e( 'View Demo', 'ots' ); ?>
51
- </a>
52
-
53
- <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
54
- class="cta cta-primary"
55
- target="_blank">
56
- <?php _e( 'Go Pro', 'ots' ); ?>
57
- </a>
58
-
59
- </div>
60
-
61
- <?php endif; ?>
62
-
63
- </div>
64
-
65
- <div class="clear"></div>
66
-
67
- </div>
68
-
69
- <h2 style="display: none"></h2>
70
-
71
- <div class="inner">
72
-
73
- <div class="ots-add-on">
74
- <img src="https://ps.w.org/our-team-enhanced/assets/banner-772x250.jpg" />
75
- <h2><?php _e( 'Our Team Showcase Pro', 'ots' ); ?></h2>
76
- <p style="font-size: 16px"><?php _e( 'Feature-loaded Pro version of Our Team Showcase adds additional professional templates to your Team Showcase, including a Staff Directory, Honeycomb Layout, Carousel, Stacked Layout, as well as 4 impressive Single Member views: Slide-in Side Panel, Single with team sidebar, Popup V-Card and a Custom Page Single View. It also adds new features such as Team Member Skills, Tags/hobbies, Favorite Content and more!', 'ots' ); ?></p>
77
-
78
-
79
- <h2><?php _e( 'Our Community Hub - Member Login Portal', 'ots' ); ?></h2>
80
- <p style="font-size: 16px"><?php _e( 'For a limited time, upgrading to Our Team Showcase Pro comes bundled with <strong class="ots-pro">Our Community Hub add-on for free ($40 value)</strong>. This add-on creates a private login-portal for your team members, and allows you to restrict posts and pages to be accessible only by your community members.') ?></p>
81
-
82
- <div class="cta">
83
- <a target="_blank" href="http://wordpressteamplugin.com/templates/" class="button button-default" style="font-size: 18px;"><?php _e( 'View Demo', 'ots' ); ?></a>
84
- <a target="_blank" href="https://smartcatdesign.net/downloads/our-team-showcase/" class="button button-primary" style="font-size: 18px">Go Pro</a>
85
- </div>
86
-
87
- </div>
88
-
89
- <div class="clear"></div>
90
-
91
- </div>
92
-
93
- </div>
94
-
95
- <?php }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+
6
+ /**
7
+ * Registers the add-ons submenu page.
8
+ *
9
+ * @since 4.0.0
10
+ */
11
+ function add_addons_pages() {
12
+
13
+ add_submenu_page( 'edit.php?post_type=team_member', __( 'Add-ons', 'ots' ), __( 'Add-ons', 'ots' ), 'manage_options', 'ots-add-ons', 'ots\do_addons_page' );
14
+
15
+ }
16
+
17
+ add_action( 'admin_menu', 'ots\add_addons_pages' );
18
+
19
+
20
+ /**
21
+ * Renders the add-ons admin page.
22
+ *
23
+ * @since 4.0.0
24
+ */
25
+ function do_addons_page() { ?>
26
+
27
+ <div class="wrap ots-admin-page ots-add-ons">
28
+
29
+ <div class="ots-admin-header">
30
+
31
+ <div class="title-bar">
32
+
33
+ <div class="inner">
34
+
35
+ <div class="branding">
36
+ <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
37
+ </div>
38
+
39
+ <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
40
+
41
+ </div>
42
+
43
+ <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
44
+
45
+ <div class="inner">
46
+
47
+ <a href="http://wordpressteamplugin.com/templates/"
48
+ class="cta cta-secondary"
49
+ target="_blank">
50
+ <?php _e( 'View Demo', 'ots' ); ?>
51
+ </a>
52
+
53
+ <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
54
+ class="cta cta-primary"
55
+ target="_blank">
56
+ <?php _e( 'Go Pro', 'ots' ); ?>
57
+ </a>
58
+
59
+ </div>
60
+
61
+ <?php endif; ?>
62
+
63
+ </div>
64
+
65
+ <div class="clear"></div>
66
+
67
+ </div>
68
+
69
+ <h2 style="display: none"></h2>
70
+
71
+ <div class="inner">
72
+
73
+ <div class="ots-add-on">
74
+ <img src="https://ps.w.org/our-team-enhanced/assets/banner-772x250.jpg" />
75
+ <h2><?php _e( 'Our Team Showcase Pro', 'ots' ); ?></h2>
76
+ <p style="font-size: 16px"><?php _e( 'Feature-loaded Pro version of Our Team Showcase adds additional professional templates to your Team Showcase, including a Staff Directory, Honeycomb Layout, Carousel, Stacked Layout, as well as 4 impressive Single Member views: Slide-in Side Panel, Single with team sidebar, Popup V-Card and a Custom Page Single View. It also adds new features such as Team Member Skills, Tags/hobbies, Favorite Content and more!', 'ots' ); ?></p>
77
+
78
+
79
+ <h2><?php _e( 'Our Community Hub - Member Login Portal', 'ots' ); ?></h2>
80
+ <p style="font-size: 16px"><?php _e( 'For a limited time, upgrading to Our Team Showcase Pro comes bundled with <strong class="ots-pro">Our Community Hub add-on for free ($40 value)</strong>. This add-on creates a private login-portal for your team members, and allows you to restrict posts and pages to be accessible only by your community members.') ?></p>
81
+
82
+ <div class="cta">
83
+ <a target="_blank" href="http://wordpressteamplugin.com/templates/" class="button button-default" style="font-size: 18px;"><?php _e( 'View Demo', 'ots' ); ?></a>
84
+ <a target="_blank" href="https://smartcatdesign.net/downloads/our-team-showcase/" class="button button-primary" style="font-size: 18px">Go Pro</a>
85
+ </div>
86
+
87
+ </div>
88
+
89
+ <div class="clear"></div>
90
+
91
+ </div>
92
+
93
+ </div>
94
+
95
+ <?php }
includes/admin-settings.php CHANGED
@@ -1,812 +1,812 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Enqueue scripts used in the plugin settings page.
7
- *
8
- * @param $hook
9
- * @since 4.0.0
10
- */
11
- function enqueue_settings_scripts( $hook ) {
12
-
13
- wp_enqueue_style( 'ots-admin-css', asset( 'admin/css/admin.css' ), null, VERSION );
14
-
15
- if( strpos( $hook, 'ots' ) !== false ) {
16
-
17
- wp_enqueue_script( 'ots-settings-js', asset( 'admin/js/settings.js' ), array( 'jquery', 'wp-color-picker' ), VERSION );
18
- wp_enqueue_script( 'ots-reorder-js', asset( 'admin/js/reorder.js' ), array( 'jquery', 'jquery-ui-sortable' ), VERSION );
19
-
20
- wp_enqueue_style( 'ots-settings-fonts', asset( 'fonts/fonts.css' ), null, VERSION );
21
- wp_enqueue_style( 'ots-settings-css', asset( 'admin/css/settings.css' ), null, VERSION );
22
- wp_enqueue_style( 'wp-color-picker' );
23
-
24
- }
25
-
26
- }
27
-
28
- add_action( 'admin_enqueue_scripts', 'ots\enqueue_settings_scripts' );
29
-
30
-
31
- /**
32
- * Register admin menu pages.
33
- *
34
- * @since 4.0.0
35
- */
36
- function add_menu_pages() {
37
-
38
- add_submenu_page( 'edit.php?post_type=team_member', __( 'Re-Order Members', 'ots' ), __( 'Re-Order Members', 'ots' ), 'manage_options', 'ots-reorder-members', 'ots\do_member_reorder_page' );
39
- add_submenu_page( 'edit.php?post_type=team_member', __( 'Our Team Settings', 'ots' ), __( 'Settings', 'ots' ), 'manage_options', 'ots-settings', 'ots\do_settings_page' );
40
- add_submenu_page( 'edit.php?post_type=team_member', __( 'Our Team Tools', 'ots' ), __( 'Import/Export', 'ots' ), 'manage_options', 'ots-import-export', 'ots\do_import_export_page' );
41
-
42
- }
43
-
44
- add_action( 'admin_menu', 'ots\add_menu_pages' );
45
-
46
-
47
- /**
48
- * Register settings with the settings API.
49
- *
50
- * @since 4.0.0
51
- */
52
- function register_settings() {
53
-
54
- register_setting( 'ots-team-view', Options::TEMPLATE, array(
55
- 'type' => 'string',
56
- 'default' => Defaults::TEMPLATE,
57
- 'sanitize_callback' => 'ots\sanitize_template'
58
- ) );
59
-
60
- register_setting( 'ots-team-view', Options::GRID_COLUMNS, array(
61
- 'type' => 'integer',
62
- 'default' => Defaults::GRID_COLUMNS,
63
- 'sanitize_callback' => 'intval'
64
- ) );
65
-
66
- register_setting( 'ots-team-view', Options::MARGIN, array(
67
- 'type' => 'integer',
68
- 'default' => Defaults::MARGIN,
69
- 'sanitize_callback' => 'intval'
70
- ) );
71
-
72
- register_setting( 'ots-team-view', Options::SHOW_SOCIAL, array(
73
- 'type' => 'string',
74
- 'default' => Defaults::SHOW_SOCIAL,
75
- 'sanitize_callback' => 'ots\sanitize_checkbox'
76
- ) );
77
-
78
- register_setting( 'ots-team-view', Options::SOCIAL_LINK_ACTION, array(
79
- 'type' => 'string',
80
- 'default' => Defaults::SOCIAL_LINK_ACTION,
81
- 'sanitize_callback' => 'ots\sanitize_checkbox'
82
- ) );
83
-
84
- register_setting( 'ots-team-view', Options::DISPLAY_NAME, array(
85
- 'type' => 'string',
86
- 'default' => Defaults::DISPLAY_NAME,
87
- 'sanitize_callback' => 'ots\sanitize_checkbox'
88
- ) );
89
-
90
- register_setting( 'ots-team-view', Options::DISPLAY_TITLE, array(
91
- 'type' => 'string',
92
- 'default' => Defaults::DISPLAY_TITLE,
93
- 'sanitize_callback' => 'ots\sanitize_checkbox'
94
- ) );
95
-
96
- register_setting( 'ots-team-view', Options::DISPLAY_LIMIT, array(
97
- 'default' => Defaults::DISPLAY_LIMIT,
98
- 'sanitize_callback' => 'ots\sanitize_display_limit'
99
- ) );
100
-
101
- register_setting( 'ots-team-view', Options::MAIN_COLOR, array(
102
- 'type' => 'string',
103
- 'default' => Defaults::MAIN_COLOR,
104
- 'sanitize_callback' => 'sanitize_hex_color'
105
- ) );
106
-
107
- register_setting( 'ots-single-member-view', Options::SINGLE_TEMPLATE, array(
108
- 'type' => 'string',
109
- 'default' => Defaults::SINGLE_TEMPLATE,
110
- 'sanitize_callback' => 'ots\sanitize_single_template'
111
- ) );
112
-
113
- register_setting( 'ots-single-member-view', Options::SHOW_SINGLE_SOCIAL, array(
114
- 'type' => 'string',
115
- 'default' => Defaults::SHOW_SINGLE_SOCIAL,
116
- 'sanitize_callback' => 'ots\sanitize_checkbox'
117
- ) );
118
-
119
- register_setting( 'ots-single-member-view', Options::REWRITE_SLUG, array(
120
- 'type' => 'string',
121
- 'default' => Defaults::REWRITE_SLUG,
122
- 'sanitize_callback' => 'sanitize_title'
123
- ) );
124
-
125
- register_setting( 'ots-advanced', Options::NUKE, array(
126
- 'type' => 'string',
127
- 'default' => '',
128
- 'sanitize_callback' => 'ots\sanitize_checkbox'
129
- ) );
130
-
131
-
132
- }
133
-
134
- add_action( 'init', 'ots\register_settings' );
135
-
136
-
137
- /**
138
- * Add settings sections for admin settings pages.
139
- *
140
- * @since 4.0.0
141
- */
142
- function add_settings_sections() {
143
-
144
- add_settings_section( 'layout', __( 'Layout', 'ots' ), '', 'ots-team-view' );
145
- add_settings_section( 'display', __( 'Display', 'ots' ), '', 'ots-team-view' );
146
- add_settings_section( 'single-general', __( 'General', 'ots' ), '', 'ots-single-member-view' );
147
- add_settings_section( 'single-layout', __( 'Layout', 'ots' ), '', 'ots-single-member-view' );
148
- add_settings_section( 'single-display', __( 'Display', 'ots' ), '', 'ots-single-member-view' );
149
- add_settings_section( 'advanced', __( 'Advanced', 'ots' ), '', 'ots-advanced' );
150
-
151
- }
152
-
153
- add_action( 'admin_init', 'ots\add_settings_sections' );
154
-
155
-
156
- /**
157
- * Add settings fields to pages and settings sections.
158
- *
159
- * @since 4.0.0
160
- */
161
- function add_settings_fields() {
162
-
163
- $display_field_previews = apply_filters( 'ots_enable_pro_preview', true );
164
-
165
- $templates = array( '' => __( 'Select a template', 'ots' ) ) + get_templates();
166
-
167
- $preview_templates = !$display_field_previews ? array() : array(
168
- 'grid2' => __( 'Grid - Boxes 2 (Pro)', 'ots' ),
169
- 'grid3' => __( 'Grid - Boxes 3 (Pro)', 'ots' ),
170
- 'list-stacked' => __( 'List - Stacked (Pro)', 'ots' ),
171
- 'honey-comb' => __( 'Honey Comb (Pro)', 'ots' ),
172
- 'carousel' => __( 'Carousel (Pro)', 'ots' ),
173
- 'staff-directory' => __( 'Staff Directory (Pro)' )
174
- );
175
-
176
-
177
- /**
178
- * Team View settings
179
- *
180
- * @since 4.0.0
181
- */
182
- add_settings_field(
183
- Options::TEMPLATE,
184
- __( 'Template', 'ots' ),
185
- 'ots\settings_select_box',
186
- 'ots-team-view',
187
- 'layout',
188
- array(
189
- 'name' => Options::TEMPLATE,
190
- 'selected' => get_option( Options::TEMPLATE ),
191
- 'attrs' => array( 'class' => 'regular-text' ),
192
- 'options' => $templates + $preview_templates,
193
- 'disabled_options' => array_keys( $preview_templates ),
194
- 'description' => __( 'Template that displays team members where the short-code is output', 'ots' )
195
- )
196
- );
197
-
198
- add_settings_field(
199
- Options::GRID_COLUMNS,
200
- __( 'Grid Columns', 'ots' ),
201
- 'ots\settings_select_box',
202
- 'ots-team-view',
203
- 'layout',
204
- array(
205
- 'name' => Options::GRID_COLUMNS,
206
- 'attrs' => array( 'class' => 'regular-text' ),
207
- 'selected' => get_option( Options::GRID_COLUMNS ),
208
- 'options' => array(
209
- 2 => 2,
210
- 3 => 3,
211
- 4 => 4,
212
- 5 => 5,
213
- 10 => 10
214
- ),
215
- 'description' => __( 'The maximum number of members to display per row', 'ots' )
216
- )
217
- );
218
-
219
- add_settings_field(
220
- Options::MARGIN,
221
- __( 'Margin', 'ots' ),
222
- 'ots\settings_select_box',
223
- 'ots-team-view',
224
- 'layout',
225
- array(
226
- 'name' => Options::MARGIN,
227
- 'attrs' => array( 'class' => 'regular-text' ),
228
- 'selected' => get_option( Options::MARGIN ),
229
- 'options' => array(
230
- 0 => __( 'No Margin', 'ots' ),
231
- 5 => 5,
232
- 10 => 10,
233
- 15 => 15
234
- ),
235
- 'description' => __( 'The spacing between each team member', 'ots' )
236
- )
237
- );
238
-
239
- add_settings_field(
240
- Options::DISPLAY_LIMIT,
241
- __( 'Display Limit', 'ots' ),
242
- 'ots\display_limit_field',
243
- 'ots-team-view',
244
- 'layout'
245
- );
246
-
247
- add_settings_field(
248
- Options::MAIN_COLOR,
249
- __( 'Main Color', 'ots' ),
250
- 'ots\settings_text_box',
251
- 'ots-team-view',
252
- 'display',
253
- array(
254
- 'name' => Options::MAIN_COLOR,
255
- 'value' => get_option( Options::MAIN_COLOR ),
256
- 'attrs' => array(
257
- 'class' => 'wp-color-picker'
258
- )
259
- )
260
- );
261
-
262
- add_settings_field(
263
- Options::SHOW_SOCIAL,
264
- __( 'Show Social Icons', 'ots' ),
265
- 'ots\settings_check_box',
266
- 'ots-team-view',
267
- 'display',
268
- array(
269
- 'name' => Options::SHOW_SOCIAL,
270
- 'checked' => get_option( Options::SHOW_SOCIAL ),
271
- 'label' => __( 'Show social icons', 'ots' )
272
- )
273
- );
274
-
275
- add_settings_field(
276
- Options::SOCIAL_LINK_ACTION,
277
- __( 'Social Links', 'ots' ),
278
- 'ots\settings_check_box',
279
- 'ots-team-view',
280
- 'display',
281
- array(
282
- 'name' => Options::SOCIAL_LINK_ACTION,
283
- 'checked' => get_option( Options::SOCIAL_LINK_ACTION ),
284
- 'label' => __( 'Open social links in a new tab', 'ots' )
285
- )
286
- );
287
-
288
- add_settings_field(
289
- Options::DISPLAY_NAME,
290
- __( 'Display Name', 'ots' ),
291
- 'ots\settings_check_box',
292
- 'ots-team-view',
293
- 'display',
294
- array(
295
- 'name' => Options::DISPLAY_NAME,
296
- 'checked' => get_option( Options::DISPLAY_NAME ),
297
- 'label' => __( 'Display team member\'s name' , 'ots' )
298
- )
299
- );
300
-
301
- add_settings_field(
302
- Options::DISPLAY_TITLE,
303
- __( 'Display Title', 'ots' ),
304
- 'ots\settings_check_box',
305
- 'ots-team-view',
306
- 'display',
307
- array(
308
- 'name' => Options::DISPLAY_TITLE,
309
- 'checked' => get_option( Options::DISPLAY_TITLE ),
310
- 'label' => __( 'Display team member\'s job title', 'ots' )
311
- )
312
- );
313
-
314
- if( $display_field_previews ) {
315
-
316
- add_settings_field( 'pro-max-word-count', __( 'Max Word Count', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
317
- add_settings_field( 'pro-name-font-size', __( 'Name Font Size', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
318
- add_settings_field( 'pro-title-font-size', __( 'Title Font Size', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
319
- add_settings_field( 'pro-icon-style', __( 'Icon Style', 'ots' ),'ots\do_pro_only_field', 'ots-team-view', 'display' );
320
-
321
- }
322
-
323
- $templates = array( '' => __( 'Select a template', 'ots' ) ) + get_single_templates();
324
-
325
- $preview_templates = !$display_field_previews ? array() : array(
326
- 'custom' => __( 'Custom Template (Pro)', 'ots' ),
327
- 'sidebar' => __( 'Single with a Sidebar (Pro)', 'ots' ),
328
- 'card-popup' => __( 'Popup Card (Pro)', 'ots' ),
329
- 'side-panel' => __( 'Side Panel (Pro)', 'ots' )
330
- );
331
-
332
-
333
- /**
334
- * Single Member View settings
335
- *
336
- * @since 4.0.0
337
- */
338
- add_settings_field(
339
- Options::REWRITE_SLUG,
340
- __( 'Team Member URL Slug', 'ots' ),
341
- 'ots\settings_text_box',
342
- 'ots-single-member-view',
343
- 'single-general',
344
- array(
345
- 'name' => Options::REWRITE_SLUG,
346
- 'value' => get_option( Options::REWRITE_SLUG ),
347
- 'attrs' => array( 'class' => 'regular-text' ),
348
- 'description' => __( 'The URL slug for all single team members: ', 'ots' ) . home_url( '/{slug}/member-name' )
349
- )
350
- );
351
-
352
- add_settings_field(
353
- Options::SINGLE_TEMPLATE,
354
- __( 'Template', 'ots' ),
355
- 'ots\settings_select_box',
356
- 'ots-single-member-view',
357
- 'single-layout',
358
- array(
359
- 'name' => Options::SINGLE_TEMPLATE,
360
- 'selected' => get_option( Options::SINGLE_TEMPLATE ),
361
- 'attrs' => array( 'class' => 'regular-text' ),
362
- 'options' => $templates + $preview_templates,
363
- 'disabled_options' => array_keys( $preview_templates ),
364
- 'description' => __( 'Can be either a custom template (redirect) or an inline template (no redirect)', 'ots' )
365
- )
366
- );
367
-
368
- add_settings_field(
369
- Options::SHOW_SINGLE_SOCIAL,
370
- __( 'Show Single Social', 'ots' ),
371
- 'ots\settings_check_box',
372
- 'ots-single-member-view',
373
- 'single-display',
374
- array(
375
- 'name' => Options::SHOW_SINGLE_SOCIAL,
376
- 'checked' => get_option( Options::SHOW_SINGLE_SOCIAL ),
377
- 'label' => __( 'Show social icons for single members', 'ots' )
378
- )
379
- );
380
-
381
- if( $display_field_previews ) {
382
-
383
- add_settings_field( 'pro-card-popup-margin-top', __( 'Card Popup Top Margin', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-layout' );
384
- add_settings_field( 'pro-display-skills-bar', __( 'Display Skills Bar', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
385
- add_settings_field( 'pro-skills-title', __( 'Skills Title', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
386
- add_settings_field( 'pro-image-style', __( 'Image Style', 'ots' ),'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
387
-
388
- }
389
-
390
- /**
391
- * Advanced settings
392
- */
393
- add_settings_field(
394
- Options::NUKE,
395
- __( 'Erase Data', 'ots' ),
396
- 'ots\settings_check_box',
397
- 'ots-advanced',
398
- 'advanced',
399
- array(
400
- 'name' => Options::NUKE,
401
- 'checked' => get_option( Options::NUKE ),
402
- 'label' => __( 'Erase all data on uninstall', 'ots' )
403
- )
404
- );
405
-
406
- }
407
-
408
- add_action( 'admin_init', 'ots\add_settings_fields' );
409
-
410
-
411
- /**
412
- * Flush rewrite rules when the team member post type slug is changed.
413
- *
414
- * @param $option
415
- * @since 4.0.0
416
- */
417
- function team_member_slug_changed( $option ) {
418
-
419
- if ( $option === Options::REWRITE_SLUG ) {
420
- register_team_member_post_type();
421
- flush_rewrite_rules();
422
- }
423
-
424
- }
425
-
426
- add_action( 'updated_option', 'ots\team_member_slug_changed' );
427
-
428
-
429
- /**
430
- * Output the settings page.
431
- *
432
- * @since 4.0.0
433
- */
434
- function do_settings_page() {
435
-
436
- $tabs = apply_filters( 'ots_settings_page_tabs', array(
437
- 'ots-team-view' => __( 'Team View', 'ots' ),
438
- 'ots-single-member-view' => __( 'Single Member View', 'ots' ),
439
- 'ots-advanced' => __( 'Advanced', 'ots' ),
440
- ) );
441
-
442
- reset( $tabs );
443
-
444
- $active = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ? $_GET['tab'] : key( $tabs );
445
-
446
- ?>
447
-
448
- <div class="wrap ots-admin-page">
449
-
450
- <div class="ots-admin-header">
451
-
452
- <div class="title-bar">
453
-
454
- <div class="inner">
455
-
456
- <div class="branding">
457
- <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
458
- </div>
459
-
460
- <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
461
-
462
- </div>
463
-
464
- <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
465
-
466
- <div class="inner">
467
-
468
- <a href="http://wordpressteamplugin.com/templates/"
469
- class="cta cta-secondary"
470
- target="_blank">
471
- <?php _e( 'View Demo', 'ots' ); ?>
472
- </a>
473
-
474
- <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
475
- class="cta cta-primary"
476
- target="_blank">
477
- <?php _e( 'Go Pro', 'ots' ); ?>
478
- </a>
479
-
480
- </div>
481
-
482
- <?php endif; ?>
483
-
484
- </div>
485
-
486
- <div class="clear"></div>
487
-
488
- </div>
489
-
490
- <h2 style="display: none"></h2>
491
-
492
- <?php settings_errors(); ?>
493
-
494
- <h2 class="nav-tab-wrapper">
495
-
496
- <?php foreach( $tabs as $tab => $title ) : ?>
497
-
498
- <a href="<?php echo add_query_arg( 'tab', $tab ); ?>"
499
- class="nav-tab <?php echo $active == $tab ? 'nav-tab-active' : ''; ?>"><?php esc_html_e( $title ); ?></a>
500
-
501
- <?php endforeach; ?>
502
-
503
- </h2>
504
-
505
- <div class="inner">
506
-
507
- <div class="tabs-content">
508
-
509
- <form method="post" action="options.php">
510
-
511
- <?php do_settings_sections( $active ); ?>
512
-
513
- <?php settings_fields( $active ); ?>
514
-
515
- <?php submit_button(); ?>
516
-
517
- </form>
518
-
519
- </div>
520
-
521
- <div class="sidebar">
522
-
523
- <div class="widget">
524
- <h2>
525
- <?php _e( 'Try Buildr Theme!', 'ots' ); ?>
526
- <a style="float: right" class="button button-primary" href="<?php echo esc_url( admin_url( 'theme-install.php?search=buildr' ) ); ?>"><?php _e( 'Free Download', 'ots' ); ?></a>
527
- </h2>
528
- <div class="content">
529
-
530
- <p>
531
- <?php _e( 'Buildr is a unique free theme, with features you would only find in a Pro version. It is the most customizable free theme, that looks amazing out of the box. Also, it is well integrated with Our Team Showcase. Try it out!', 'ots' ) ?>
532
- </p>
533
-
534
- <img src="https://i.imgur.com/nJHSD5W.jpg" style="width: 100%"/>
535
- </div>
536
- </div>
537
-
538
- <div class="widget">
539
- <h2><?php _e( 'Quick Reference', 'ots' ); ?></h2>
540
- <div class="content">
541
- <ul>
542
- <li><?php _e( 'Image recommended size is 400x400 px. To achieve the best appearance, please ensure all team member images are the same size.', 'ots' ); ?></li>
543
- <li><?php _e( 'To display the team members, add <code>[our-team]</code> short-code in a widget, post or page', 'ots' ); ?></li>
544
- <li><?php _e( 'To display members from a specific group, add <code>[our-team group="name of your group"]</code>', 'ots' ); ?></li>
545
- <li><?php _e( 'To display members from a multiple groups, add <code>[our-team group="group1,group2"]</code>', 'ots' ); ?></li>
546
- <li><?php _e( 'To override the template choice from the short-code, add <code>[our-team template="grid"]</code>. <i>Template options include: grid, grid_circles, grid_circles2, carousel, hc and stacked.</i>', 'ots' ); ?></li>
547
- <li><?php _e( 'To override the single template choice from the short-code add <code>[our-team single_template="vcard"]</code>. Alternatively you can set it to panel', 'ots' ); ?></li>
548
- <li><?php _e( 'To override the number of columns from the short-code add <code>[our-team columns="4"]</code>.', 'ots' ); ?></li>
549
- <li><?php _e( 'Need more help? Check out the full plugin documentation manual', 'ots' ); ?>
550
- <a href="<?php echo admin_url( 'edit.php?post_type=team_member&page=ots-docs' ); ?>">
551
- <?php _e( 'Go to documentation', 'ots' ); ?>
552
- </a>
553
- </li>
554
- </ul>
555
- </div>
556
- </div>
557
-
558
- <?php do_action( 'ots_admin_sidebar_widgets' ); ?>
559
-
560
- </div>
561
-
562
- <div class="clear"></div>
563
-
564
- </div>
565
-
566
- </div>
567
-
568
- <?php }
569
-
570
-
571
- /**
572
- * Output a select box for a settings field.
573
- *
574
- * @param array $args {
575
- * string $name The name of the setting as registered with the settings API.
576
- * array $attrs An array of HTML attributes for the field.
577
- * array $options An array of key value pairs that are used for the options.
578
- * string $selected The current value of the select box.
579
- * string $description A description for the field.
580
- * array $disabled_options An array of options that are disabled by default.
581
- * }
582
- *
583
- * @since 4.0.0
584
- */
585
- function settings_select_box( array $args ) {
586
-
587
- $defaults = array(
588
- 'attrs' => array(),
589
- 'disabled_options' => array(),
590
- 'selected' => '',
591
- 'description' => ''
592
- );
593
-
594
- $args = wp_parse_args( $args, $defaults );
595
-
596
- echo '<select name="' . esc_attr( $args['name'] ) . '" ' . print_attrs( $args['attrs'], false ) . '>';
597
-
598
- foreach( $args['options'] as $value => $label ) {
599
-
600
- echo '<option value="' . esc_attr( $value ) . '" ';
601
-
602
- selected( $value, $args['selected'] );
603
- disabled( true, in_array( $value, $args['disabled_options'] ) );
604
-
605
- echo ' >' . esc_html( $label ) . '</option>';
606
-
607
- }
608
-
609
- echo '</select>';
610
-
611
- if( !empty( $args['description'] ) ) {
612
- echo '<p class="description">' . esc_html( $args['description'] ) . '</p>';
613
- }
614
-
615
- }
616
-
617
- /**
618
- * Output a radio group for a settings field.
619
- *
620
- * @param array $args {
621
- * string $name The name of the setting as registered with the settings API.
622
- * array $attrs An array of HTML attributes for the field.
623
- * array $options An array of key value pairs that are used for the options.
624
- * string $selected The current value of the select box.
625
- * string $before Html to output before the opening <label> tag.
626
- * string $after Html to output after the closing </label> tag.
627
- * array $disabled_options An array of options to be disabled by default.
628
- * }
629
- *
630
- * @since 4.0.0
631
- */
632
- function settings_radio_buttons( array $args ) {
633
-
634
- $defaults = array(
635
- 'attrs' => array(),
636
- 'before' => '',
637
- 'after' => '',
638
- 'selected' => '',
639
- 'disabled_options' => array()
640
- );
641
-
642
- $args = wp_parse_args( $args, $defaults );
643
-
644
- foreach( $args['options'] as $value => $label ) {
645
-
646
- echo $args['before'] .
647
-
648
- '<label><input type="radio" name="' . esc_attr( $args['name'] ) . '" value="' . $value . '" ';
649
-
650
- print_attrs( $args['attrs'] );
651
-
652
- checked( $value, $args['selected'] );
653
- disabled( true, in_array( $value, $args['disabled_options'] ) );
654
-
655
- echo '/>' . $label . '</label>' . $args['after'];
656
-
657
- }
658
-
659
- }
660
-
661
-
662
- /**
663
- * Output a check box for a settings field.
664
- *
665
- * @param array $args {
666
- * string $name The name of the setting as registered with the settings API.
667
- * array $attrs An array of HTML attributes for the field.
668
- * array $checked Whether or not the checkbox is currently checked.
669
- * string $label The label for the checkbox.
670
- * }
671
- *
672
- * @since 4.0.0
673
- */
674
- function settings_check_box( array $args ) {
675
-
676
- $defaults = array(
677
- 'attrs' => array(),
678
- 'checked' => false,
679
- 'label' => ''
680
- );
681
-
682
- $args = wp_parse_args( $args, $defaults );
683
-
684
- echo '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="off" />';
685
-
686
- echo '<label>
687
- <input type="checkbox"
688
- value="on"
689
- name="' . esc_attr( $args['name'] ) . '" ';
690
-
691
- print_attrs( $args['attrs'] );
692
-
693
- checked( 'on', $args['checked'] );
694
-
695
- echo ' />' . esc_html( $args['label'] ) . '</label>';
696
-
697
- }
698
-
699
-
700
- /**
701
- * Output a text box for a settings field.
702
- *
703
- * @param array $args {
704
- * string $name The name of the setting as registered with the settings API.
705
- * array $attrs An array of HTML attributes for the field.
706
- * array $value The current value of the text box.
707
- * string $description The description to display below the field.
708
- * }
709
- *
710
- * @since 4.0.0
711
- */
712
- function settings_text_box( array $args ) {
713
-
714
- $defaults = array(
715
- 'attrs' => array(),
716
- 'value' => '',
717
- 'description' => ''
718
- );
719
-
720
- $args = wp_parse_args( $args, $defaults );
721
-
722
- echo '<input name="' . esc_attr( $args['name'] ) . '"
723
- value="' . $args['value'] . '" ';
724
-
725
- print_attrs( $args['attrs'] );
726
-
727
- echo ' />';
728
-
729
- if( !empty( $args['description'] ) ) {
730
- echo '<p class="description">' . esc_html( $args['description'] ) . '</p>';
731
- }
732
-
733
- }
734
-
735
-
736
- /**
737
- * Outputs disabled placeholder fields.
738
- *
739
- * @since 4.0.0
740
- */
741
- function do_pro_only_field() {
742
-
743
- echo '<p class="description">' . __( 'Pro version only', 'ots' ) . '</p>';
744
-
745
- }
746
-
747
-
748
- /**
749
- * Output a number input and checkbox for the display limit field.
750
- *
751
- * @since 4.0.0
752
- */
753
- function display_limit_field() {
754
-
755
- $value = get_option( Options::DISPLAY_LIMIT ); ?>
756
-
757
- <input type="number"
758
- min="1"
759
- id="ots-display-limit-number"
760
- placeholder="<?php esc_attr_e( '# of members', 'ots' ); ?>"
761
- name="<?php esc_attr_e( Options::DISPLAY_LIMIT ); ?>"
762
- value="<?php $value !== 'on' ? esc_attr_e( $value ) : ''; ?>"
763
-
764
- <?php disabled( $value, 'all' ); ?> >
765
-
766
- <?php _e( ' - or - ', 'ots' ); ?>
767
-
768
- <label>
769
-
770
- <input type="checkbox"
771
- id="ots-display-limit-all"
772
- value="all"
773
- name="<?php esc_attr_e( Options::DISPLAY_LIMIT ); ?>"
774
-
775
- <?php checked( $value, 'all' ); ?> >
776
-
777
- <?php _e( 'Display all', 'ots' ); ?>
778
-
779
- </label>
780
-
781
- <p class="description"><?php _e( 'The maximum number of members to display', 'ots' ); ?></p>
782
-
783
- <?php }
784
-
785
-
786
- function settings_toggle( array $args ) {
787
-
788
- $defaults = array(
789
- 'attrs' => array(),
790
- 'checked' => false,
791
- 'label' => '',
792
- 'slider' => ''
793
- );
794
-
795
- $args = wp_parse_args( $args, $defaults );
796
-
797
- echo '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="off" />';
798
-
799
- echo '<label class="switch">
800
- <input type="checkbox"
801
- value="on"
802
- name="' . esc_attr( $args['name'] ) . '" ';
803
-
804
- print_attrs( $args['attrs'] );
805
-
806
- checked( 'on', $args['checked'] );
807
-
808
- echo ' /><span class="slider ' . esc_attr( $args['slider'] ) . '"></label> ';
809
- echo '<span class="label">' . esc_html( $args['label'] ) . '</span>';
810
-
811
- }
812
-
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Enqueue scripts used in the plugin settings page.
7
+ *
8
+ * @param $hook
9
+ * @since 4.0.0
10
+ */
11
+ function enqueue_settings_scripts( $hook ) {
12
+
13
+ wp_enqueue_style( 'ots-admin-css', asset( 'admin/css/admin.css' ), null, VERSION );
14
+
15
+ if( strpos( $hook, 'ots' ) !== false ) {
16
+
17
+ wp_enqueue_script( 'ots-settings-js', asset( 'admin/js/settings.js' ), array( 'jquery', 'wp-color-picker' ), VERSION );
18
+ wp_enqueue_script( 'ots-reorder-js', asset( 'admin/js/reorder.js' ), array( 'jquery', 'jquery-ui-sortable' ), VERSION );
19
+
20
+ wp_enqueue_style( 'ots-settings-fonts', asset( 'fonts/fonts.css' ), null, VERSION );
21
+ wp_enqueue_style( 'ots-settings-css', asset( 'admin/css/settings.css' ), null, VERSION );
22
+ wp_enqueue_style( 'wp-color-picker' );
23
+
24
+ }
25
+
26
+ }
27
+
28
+ add_action( 'admin_enqueue_scripts', 'ots\enqueue_settings_scripts' );
29
+
30
+
31
+ /**
32
+ * Register admin menu pages.
33
+ *
34
+ * @since 4.0.0
35
+ */
36
+ function add_menu_pages() {
37
+
38
+ add_submenu_page( 'edit.php?post_type=team_member', __( 'Re-Order Members', 'ots' ), __( 'Re-Order Members', 'ots' ), 'manage_options', 'ots-reorder-members', 'ots\do_member_reorder_page' );
39
+ add_submenu_page( 'edit.php?post_type=team_member', __( 'Our Team Settings', 'ots' ), __( 'Settings', 'ots' ), 'manage_options', 'ots-settings', 'ots\do_settings_page' );
40
+ add_submenu_page( 'edit.php?post_type=team_member', __( 'Our Team Tools', 'ots' ), __( 'Import/Export', 'ots' ), 'manage_options', 'ots-import-export', 'ots\do_import_export_page' );
41
+
42
+ }
43
+
44
+ add_action( 'admin_menu', 'ots\add_menu_pages' );
45
+
46
+
47
+ /**
48
+ * Register settings with the settings API.
49
+ *
50
+ * @since 4.0.0
51
+ */
52
+ function register_settings() {
53
+
54
+ register_setting( 'ots-team-view', Options::TEMPLATE, array(
55
+ 'type' => 'string',
56
+ 'default' => Defaults::TEMPLATE,
57
+ 'sanitize_callback' => 'ots\sanitize_template'
58
+ ) );
59
+
60
+ register_setting( 'ots-team-view', Options::GRID_COLUMNS, array(
61
+ 'type' => 'integer',
62
+ 'default' => Defaults::GRID_COLUMNS,
63
+ 'sanitize_callback' => 'intval'
64
+ ) );
65
+
66
+ register_setting( 'ots-team-view', Options::MARGIN, array(
67
+ 'type' => 'integer',
68
+ 'default' => Defaults::MARGIN,
69
+ 'sanitize_callback' => 'intval'
70
+ ) );
71
+
72
+ register_setting( 'ots-team-view', Options::SHOW_SOCIAL, array(
73
+ 'type' => 'string',
74
+ 'default' => Defaults::SHOW_SOCIAL,
75
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
76
+ ) );
77
+
78
+ register_setting( 'ots-team-view', Options::SOCIAL_LINK_ACTION, array(
79
+ 'type' => 'string',
80
+ 'default' => Defaults::SOCIAL_LINK_ACTION,
81
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
82
+ ) );
83
+
84
+ register_setting( 'ots-team-view', Options::DISPLAY_NAME, array(
85
+ 'type' => 'string',
86
+ 'default' => Defaults::DISPLAY_NAME,
87
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
88
+ ) );
89
+
90
+ register_setting( 'ots-team-view', Options::DISPLAY_TITLE, array(
91
+ 'type' => 'string',
92
+ 'default' => Defaults::DISPLAY_TITLE,
93
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
94
+ ) );
95
+
96
+ register_setting( 'ots-team-view', Options::DISPLAY_LIMIT, array(
97
+ 'default' => Defaults::DISPLAY_LIMIT,
98
+ 'sanitize_callback' => 'ots\sanitize_display_limit'
99
+ ) );
100
+
101
+ register_setting( 'ots-team-view', Options::MAIN_COLOR, array(
102
+ 'type' => 'string',
103
+ 'default' => Defaults::MAIN_COLOR,
104
+ 'sanitize_callback' => 'sanitize_hex_color'
105
+ ) );
106
+
107
+ register_setting( 'ots-single-member-view', Options::SINGLE_TEMPLATE, array(
108
+ 'type' => 'string',
109
+ 'default' => Defaults::SINGLE_TEMPLATE,
110
+ 'sanitize_callback' => 'ots\sanitize_single_template'
111
+ ) );
112
+
113
+ register_setting( 'ots-single-member-view', Options::SHOW_SINGLE_SOCIAL, array(
114
+ 'type' => 'string',
115
+ 'default' => Defaults::SHOW_SINGLE_SOCIAL,
116
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
117
+ ) );
118
+
119
+ register_setting( 'ots-single-member-view', Options::REWRITE_SLUG, array(
120
+ 'type' => 'string',
121
+ 'default' => Defaults::REWRITE_SLUG,
122
+ 'sanitize_callback' => 'sanitize_title'
123
+ ) );
124
+
125
+ register_setting( 'ots-advanced', Options::NUKE, array(
126
+ 'type' => 'string',
127
+ 'default' => '',
128
+ 'sanitize_callback' => 'ots\sanitize_checkbox'
129
+ ) );
130
+
131
+
132
+ }
133
+
134
+ add_action( 'init', 'ots\register_settings' );
135
+
136
+
137
+ /**
138
+ * Add settings sections for admin settings pages.
139
+ *
140
+ * @since 4.0.0
141
+ */
142
+ function add_settings_sections() {
143
+
144
+ add_settings_section( 'layout', __( 'Layout', 'ots' ), '', 'ots-team-view' );
145
+ add_settings_section( 'display', __( 'Display', 'ots' ), '', 'ots-team-view' );
146
+ add_settings_section( 'single-general', __( 'General', 'ots' ), '', 'ots-single-member-view' );
147
+ add_settings_section( 'single-layout', __( 'Layout', 'ots' ), '', 'ots-single-member-view' );
148
+ add_settings_section( 'single-display', __( 'Display', 'ots' ), '', 'ots-single-member-view' );
149
+ add_settings_section( 'advanced', __( 'Advanced', 'ots' ), '', 'ots-advanced' );
150
+
151
+ }
152
+
153
+ add_action( 'admin_init', 'ots\add_settings_sections' );
154
+
155
+
156
+ /**
157
+ * Add settings fields to pages and settings sections.
158
+ *
159
+ * @since 4.0.0
160
+ */
161
+ function add_settings_fields() {
162
+
163
+ $display_field_previews = apply_filters( 'ots_enable_pro_preview', true );
164
+
165
+ $templates = array( '' => __( 'Select a template', 'ots' ) ) + get_templates();
166
+
167
+ $preview_templates = !$display_field_previews ? array() : array(
168
+ 'grid2' => __( 'Grid - Boxes 2 (Pro)', 'ots' ),
169
+ 'grid3' => __( 'Grid - Boxes 3 (Pro)', 'ots' ),
170
+ 'list-stacked' => __( 'List - Stacked (Pro)', 'ots' ),
171
+ 'honey-comb' => __( 'Honey Comb (Pro)', 'ots' ),
172
+ 'carousel' => __( 'Carousel (Pro)', 'ots' ),
173
+ 'staff-directory' => __( 'Staff Directory (Pro)' )
174
+ );
175
+
176
+
177
+ /**
178
+ * Team View settings
179
+ *
180
+ * @since 4.0.0
181
+ */
182
+ add_settings_field(
183
+ Options::TEMPLATE,
184
+ __( 'Template', 'ots' ),
185
+ 'ots\settings_select_box',
186
+ 'ots-team-view',
187
+ 'layout',
188
+ array(
189
+ 'name' => Options::TEMPLATE,
190
+ 'selected' => get_option( Options::TEMPLATE ),
191
+ 'attrs' => array( 'class' => 'regular-text' ),
192
+ 'options' => $templates + $preview_templates,
193
+ 'disabled_options' => array_keys( $preview_templates ),
194
+ 'description' => __( 'Template that displays team members where the short-code is output', 'ots' )
195
+ )
196
+ );
197
+
198
+ add_settings_field(
199
+ Options::GRID_COLUMNS,
200
+ __( 'Grid Columns', 'ots' ),
201
+ 'ots\settings_select_box',
202
+ 'ots-team-view',
203
+ 'layout',
204
+ array(
205
+ 'name' => Options::GRID_COLUMNS,
206
+ 'attrs' => array( 'class' => 'regular-text' ),
207
+ 'selected' => get_option( Options::GRID_COLUMNS ),
208
+ 'options' => array(
209
+ 2 => 2,
210
+ 3 => 3,
211
+ 4 => 4,
212
+ 5 => 5,
213
+ 10 => 10
214
+ ),
215
+ 'description' => __( 'The maximum number of members to display per row', 'ots' )
216
+ )
217
+ );
218
+
219
+ add_settings_field(
220
+ Options::MARGIN,
221
+ __( 'Margin', 'ots' ),
222
+ 'ots\settings_select_box',
223
+ 'ots-team-view',
224
+ 'layout',
225
+ array(
226
+ 'name' => Options::MARGIN,
227
+ 'attrs' => array( 'class' => 'regular-text' ),
228
+ 'selected' => get_option( Options::MARGIN ),
229
+ 'options' => array(
230
+ 0 => __( 'No Margin', 'ots' ),
231
+ 5 => 5,
232
+ 10 => 10,
233
+ 15 => 15
234
+ ),
235
+ 'description' => __( 'The spacing between each team member', 'ots' )
236
+ )
237
+ );
238
+
239
+ add_settings_field(
240
+ Options::DISPLAY_LIMIT,
241
+ __( 'Display Limit', 'ots' ),
242
+ 'ots\display_limit_field',
243
+ 'ots-team-view',
244
+ 'layout'
245
+ );
246
+
247
+ add_settings_field(
248
+ Options::MAIN_COLOR,
249
+ __( 'Main Color', 'ots' ),
250
+ 'ots\settings_text_box',
251
+ 'ots-team-view',
252
+ 'display',
253
+ array(
254
+ 'name' => Options::MAIN_COLOR,
255
+ 'value' => get_option( Options::MAIN_COLOR ),
256
+ 'attrs' => array(
257
+ 'class' => 'wp-color-picker'
258
+ )
259
+ )
260
+ );
261
+
262
+ add_settings_field(
263
+ Options::SHOW_SOCIAL,
264
+ __( 'Show Social Icons', 'ots' ),
265
+ 'ots\settings_check_box',
266
+ 'ots-team-view',
267
+ 'display',
268
+ array(
269
+ 'name' => Options::SHOW_SOCIAL,
270
+ 'checked' => get_option( Options::SHOW_SOCIAL ),
271
+ 'label' => __( 'Show social icons', 'ots' )
272
+ )
273
+ );
274
+
275
+ add_settings_field(
276
+ Options::SOCIAL_LINK_ACTION,
277
+ __( 'Social Links', 'ots' ),
278
+ 'ots\settings_check_box',
279
+ 'ots-team-view',
280
+ 'display',
281
+ array(
282
+ 'name' => Options::SOCIAL_LINK_ACTION,
283
+ 'checked' => get_option( Options::SOCIAL_LINK_ACTION ),
284
+ 'label' => __( 'Open social links in a new tab', 'ots' )
285
+ )
286
+ );
287
+
288
+ add_settings_field(
289
+ Options::DISPLAY_NAME,
290
+ __( 'Display Name', 'ots' ),
291
+ 'ots\settings_check_box',
292
+ 'ots-team-view',
293
+ 'display',
294
+ array(
295
+ 'name' => Options::DISPLAY_NAME,
296
+ 'checked' => get_option( Options::DISPLAY_NAME ),
297
+ 'label' => __( 'Display team member\'s name' , 'ots' )
298
+ )
299
+ );
300
+
301
+ add_settings_field(
302
+ Options::DISPLAY_TITLE,
303
+ __( 'Display Title', 'ots' ),
304
+ 'ots\settings_check_box',
305
+ 'ots-team-view',
306
+ 'display',
307
+ array(
308
+ 'name' => Options::DISPLAY_TITLE,
309
+ 'checked' => get_option( Options::DISPLAY_TITLE ),
310
+ 'label' => __( 'Display team member\'s job title', 'ots' )
311
+ )
312
+ );
313
+
314
+ if( $display_field_previews ) {
315
+
316
+ add_settings_field( 'pro-max-word-count', __( 'Max Word Count', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
317
+ add_settings_field( 'pro-name-font-size', __( 'Name Font Size', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
318
+ add_settings_field( 'pro-title-font-size', __( 'Title Font Size', 'ots' ), 'ots\do_pro_only_field', 'ots-team-view', 'display' );
319
+ add_settings_field( 'pro-icon-style', __( 'Icon Style', 'ots' ),'ots\do_pro_only_field', 'ots-team-view', 'display' );
320
+
321
+ }
322
+
323
+ $templates = array( '' => __( 'Select a template', 'ots' ) ) + get_single_templates();
324
+
325
+ $preview_templates = !$display_field_previews ? array() : array(
326
+ 'custom' => __( 'Custom Template (Pro)', 'ots' ),
327
+ 'sidebar' => __( 'Single with a Sidebar (Pro)', 'ots' ),
328
+ 'card-popup' => __( 'Popup Card (Pro)', 'ots' ),
329
+ 'side-panel' => __( 'Side Panel (Pro)', 'ots' )
330
+ );
331
+
332
+
333
+ /**
334
+ * Single Member View settings
335
+ *
336
+ * @since 4.0.0
337
+ */
338
+ add_settings_field(
339
+ Options::REWRITE_SLUG,
340
+ __( 'Team Member URL Slug', 'ots' ),
341
+ 'ots\settings_text_box',
342
+ 'ots-single-member-view',
343
+ 'single-general',
344
+ array(
345
+ 'name' => Options::REWRITE_SLUG,
346
+ 'value' => get_option( Options::REWRITE_SLUG ),
347
+ 'attrs' => array( 'class' => 'regular-text' ),
348
+ 'description' => __( 'The URL slug for all single team members: ', 'ots' ) . home_url( '/{slug}/member-name' )
349
+ )
350
+ );
351
+
352
+ add_settings_field(
353
+ Options::SINGLE_TEMPLATE,
354
+ __( 'Template', 'ots' ),
355
+ 'ots\settings_select_box',
356
+ 'ots-single-member-view',
357
+ 'single-layout',
358
+ array(
359
+ 'name' => Options::SINGLE_TEMPLATE,
360
+ 'selected' => get_option( Options::SINGLE_TEMPLATE ),
361
+ 'attrs' => array( 'class' => 'regular-text' ),
362
+ 'options' => $templates + $preview_templates,
363
+ 'disabled_options' => array_keys( $preview_templates ),
364
+ 'description' => __( 'Can be either a custom template (redirect) or an inline template (no redirect)', 'ots' )
365
+ )
366
+ );
367
+
368
+ add_settings_field(
369
+ Options::SHOW_SINGLE_SOCIAL,
370
+ __( 'Show Single Social', 'ots' ),
371
+ 'ots\settings_check_box',
372
+ 'ots-single-member-view',
373
+ 'single-display',
374
+ array(
375
+ 'name' => Options::SHOW_SINGLE_SOCIAL,
376
+ 'checked' => get_option( Options::SHOW_SINGLE_SOCIAL ),
377
+ 'label' => __( 'Show social icons for single members', 'ots' )
378
+ )
379
+ );
380
+
381
+ if( $display_field_previews ) {
382
+
383
+ add_settings_field( 'pro-card-popup-margin-top', __( 'Card Popup Top Margin', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-layout' );
384
+ add_settings_field( 'pro-display-skills-bar', __( 'Display Skills Bar', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
385
+ add_settings_field( 'pro-skills-title', __( 'Skills Title', 'ots' ), 'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
386
+ add_settings_field( 'pro-image-style', __( 'Image Style', 'ots' ),'ots\do_pro_only_field', 'ots-single-member-view', 'single-display' );
387
+
388
+ }
389
+
390
+ /**
391
+ * Advanced settings
392
+ */
393
+ add_settings_field(
394
+ Options::NUKE,
395
+ __( 'Erase Data', 'ots' ),
396
+ 'ots\settings_check_box',
397
+ 'ots-advanced',
398
+ 'advanced',
399
+ array(
400
+ 'name' => Options::NUKE,
401
+ 'checked' => get_option( Options::NUKE ),
402
+ 'label' => __( 'Erase all data on uninstall', 'ots' )
403
+ )
404
+ );
405
+
406
+ }
407
+
408
+ add_action( 'admin_init', 'ots\add_settings_fields' );
409
+
410
+
411
+ /**
412
+ * Flush rewrite rules when the team member post type slug is changed.
413
+ *
414
+ * @param $option
415
+ * @since 4.0.0
416
+ */
417
+ function team_member_slug_changed( $option ) {
418
+
419
+ if ( $option === Options::REWRITE_SLUG ) {
420
+ register_team_member_post_type();
421
+ flush_rewrite_rules();
422
+ }
423
+
424
+ }
425
+
426
+ add_action( 'updated_option', 'ots\team_member_slug_changed' );
427
+
428
+
429
+ /**
430
+ * Output the settings page.
431
+ *
432
+ * @since 4.0.0
433
+ */
434
+ function do_settings_page() {
435
+
436
+ $tabs = apply_filters( 'ots_settings_page_tabs', array(
437
+ 'ots-team-view' => __( 'Team View', 'ots' ),
438
+ 'ots-single-member-view' => __( 'Single Member View', 'ots' ),
439
+ 'ots-advanced' => __( 'Advanced', 'ots' ),
440
+ ) );
441
+
442
+ reset( $tabs );
443
+
444
+ $active = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ? $_GET['tab'] : key( $tabs );
445
+
446
+ ?>
447
+
448
+ <div class="wrap ots-admin-page">
449
+
450
+ <div class="ots-admin-header">
451
+
452
+ <div class="title-bar">
453
+
454
+ <div class="inner">
455
+
456
+ <div class="branding">
457
+ <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
458
+ </div>
459
+
460
+ <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
461
+
462
+ </div>
463
+
464
+ <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
465
+
466
+ <div class="inner">
467
+
468
+ <a href="http://wordpressteamplugin.com/templates/"
469
+ class="cta cta-secondary"
470
+ target="_blank">
471
+ <?php _e( 'View Demo', 'ots' ); ?>
472
+ </a>
473
+
474
+ <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
475
+ class="cta cta-primary"
476
+ target="_blank">
477
+ <?php _e( 'Go Pro', 'ots' ); ?>
478
+ </a>
479
+
480
+ </div>
481
+
482
+ <?php endif; ?>
483
+
484
+ </div>
485
+
486
+ <div class="clear"></div>
487
+
488
+ </div>
489
+
490
+ <h2 style="display: none"></h2>
491
+
492
+ <?php settings_errors(); ?>
493
+
494
+ <h2 class="nav-tab-wrapper">
495
+
496
+ <?php foreach( $tabs as $tab => $title ) : ?>
497
+
498
+ <a href="<?php echo add_query_arg( 'tab', $tab ); ?>"
499
+ class="nav-tab <?php echo $active == $tab ? 'nav-tab-active' : ''; ?>"><?php esc_html_e( $title ); ?></a>
500
+
501
+ <?php endforeach; ?>
502
+
503
+ </h2>
504
+
505
+ <div class="inner">
506
+
507
+ <div class="tabs-content">
508
+
509
+ <form method="post" action="options.php">
510
+
511
+ <?php do_settings_sections( $active ); ?>
512
+
513
+ <?php settings_fields( $active ); ?>
514
+
515
+ <?php submit_button(); ?>
516
+
517
+ </form>
518
+
519
+ </div>
520
+
521
+ <div class="sidebar">
522
+
523
+ <div class="widget">
524
+ <h2>
525
+ <?php _e( 'Try Buildr Theme!', 'ots' ); ?>
526
+ <a style="float: right" class="button button-primary" href="<?php echo esc_url( admin_url( 'theme-install.php?search=buildr' ) ); ?>"><?php _e( 'Free Download', 'ots' ); ?></a>
527
+ </h2>
528
+ <div class="content">
529
+
530
+ <p>
531
+ <?php _e( 'Buildr is a unique free theme, with features you would only find in a Pro version. It is the most customizable free theme, that looks amazing out of the box. Also, it is well integrated with Our Team Showcase. Try it out!', 'ots' ) ?>
532
+ </p>
533
+
534
+ <img src="https://i.imgur.com/nJHSD5W.jpg" style="width: 100%"/>
535
+ </div>
536
+ </div>
537
+
538
+ <div class="widget">
539
+ <h2><?php _e( 'Quick Reference', 'ots' ); ?></h2>
540
+ <div class="content">
541
+ <ul>
542
+ <li><?php _e( 'Image recommended size is 400x400 px. To achieve the best appearance, please ensure all team member images are the same size.', 'ots' ); ?></li>
543
+ <li><?php _e( 'To display the team members, add <code>[our-team]</code> short-code in a widget, post or page', 'ots' ); ?></li>
544
+ <li><?php _e( 'To display members from a specific group, add <code>[our-team group="name of your group"]</code>', 'ots' ); ?></li>
545
+ <li><?php _e( 'To display members from a multiple groups, add <code>[our-team group="group1,group2"]</code>', 'ots' ); ?></li>
546
+ <li><?php _e( 'To override the template choice from the short-code, add <code>[our-team template="grid"]</code>. <i>Template options include: grid, grid_circles, grid_circles2, carousel, hc and stacked.</i>', 'ots' ); ?></li>
547
+ <li><?php _e( 'To override the single template choice from the short-code add <code>[our-team single_template="vcard"]</code>. Alternatively you can set it to panel', 'ots' ); ?></li>
548
+ <li><?php _e( 'To override the number of columns from the short-code add <code>[our-team columns="4"]</code>.', 'ots' ); ?></li>
549
+ <li><?php _e( 'Need more help? Check out the full plugin documentation manual', 'ots' ); ?>
550
+ <a href="<?php echo admin_url( 'edit.php?post_type=team_member&page=ots-docs' ); ?>">
551
+ <?php _e( 'Go to documentation', 'ots' ); ?>
552
+ </a>
553
+ </li>
554
+ </ul>
555
+ </div>
556
+ </div>
557
+
558
+ <?php do_action( 'ots_admin_sidebar_widgets' ); ?>
559
+
560
+ </div>
561
+
562
+ <div class="clear"></div>
563
+
564
+ </div>
565
+
566
+ </div>
567
+
568
+ <?php }
569
+
570
+
571
+ /**
572
+ * Output a select box for a settings field.
573
+ *
574
+ * @param array $args {
575
+ * string $name The name of the setting as registered with the settings API.
576
+ * array $attrs An array of HTML attributes for the field.
577
+ * array $options An array of key value pairs that are used for the options.
578
+ * string $selected The current value of the select box.
579
+ * string $description A description for the field.
580
+ * array $disabled_options An array of options that are disabled by default.
581
+ * }
582
+ *
583
+ * @since 4.0.0
584
+ */
585
+ function settings_select_box( array $args ) {
586
+
587
+ $defaults = array(
588
+ 'attrs' => array(),
589
+ 'disabled_options' => array(),
590
+ 'selected' => '',
591
+ 'description' => ''
592
+ );
593
+
594
+ $args = wp_parse_args( $args, $defaults );
595
+
596
+ echo '<select name="' . esc_attr( $args['name'] ) . '" ' . print_attrs( $args['attrs'], false ) . '>';
597
+
598
+ foreach( $args['options'] as $value => $label ) {
599
+
600
+ echo '<option value="' . esc_attr( $value ) . '" ';
601
+
602
+ selected( $value, $args['selected'] );
603
+ disabled( true, in_array( $value, $args['disabled_options'] ) );
604
+
605
+ echo ' >' . esc_html( $label ) . '</option>';
606
+
607
+ }
608
+
609
+ echo '</select>';
610
+
611
+ if( !empty( $args['description'] ) ) {
612
+ echo '<p class="description">' . esc_html( $args['description'] ) . '</p>';
613
+ }
614
+
615
+ }
616
+
617
+ /**
618
+ * Output a radio group for a settings field.
619
+ *
620
+ * @param array $args {
621
+ * string $name The name of the setting as registered with the settings API.
622
+ * array $attrs An array of HTML attributes for the field.
623
+ * array $options An array of key value pairs that are used for the options.
624
+ * string $selected The current value of the select box.
625
+ * string $before Html to output before the opening <label> tag.
626
+ * string $after Html to output after the closing </label> tag.
627
+ * array $disabled_options An array of options to be disabled by default.
628
+ * }
629
+ *
630
+ * @since 4.0.0
631
+ */
632
+ function settings_radio_buttons( array $args ) {
633
+
634
+ $defaults = array(
635
+ 'attrs' => array(),
636
+ 'before' => '',
637
+ 'after' => '',
638
+ 'selected' => '',
639
+ 'disabled_options' => array()
640
+ );
641
+
642
+ $args = wp_parse_args( $args, $defaults );
643
+
644
+ foreach( $args['options'] as $value => $label ) {
645
+
646
+ echo $args['before'] .
647
+
648
+ '<label><input type="radio" name="' . esc_attr( $args['name'] ) . '" value="' . $value . '" ';
649
+
650
+ print_attrs( $args['attrs'] );
651
+
652
+ checked( $value, $args['selected'] );
653
+ disabled( true, in_array( $value, $args['disabled_options'] ) );
654
+
655
+ echo '/>' . $label . '</label>' . $args['after'];
656
+
657
+ }
658
+
659
+ }
660
+
661
+
662
+ /**
663
+ * Output a check box for a settings field.
664
+ *
665
+ * @param array $args {
666
+ * string $name The name of the setting as registered with the settings API.
667
+ * array $attrs An array of HTML attributes for the field.
668
+ * array $checked Whether or not the checkbox is currently checked.
669
+ * string $label The label for the checkbox.
670
+ * }
671
+ *
672
+ * @since 4.0.0
673
+ */
674
+ function settings_check_box( array $args ) {
675
+
676
+ $defaults = array(
677
+ 'attrs' => array(),
678
+ 'checked' => false,
679
+ 'label' => ''
680
+ );
681
+
682
+ $args = wp_parse_args( $args, $defaults );
683
+
684
+ echo '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="off" />';
685
+
686
+ echo '<label>
687
+ <input type="checkbox"
688
+ value="on"
689
+ name="' . esc_attr( $args['name'] ) . '" ';
690
+
691
+ print_attrs( $args['attrs'] );
692
+
693
+ checked( 'on', $args['checked'] );
694
+
695
+ echo ' />' . esc_html( $args['label'] ) . '</label>';
696
+
697
+ }
698
+
699
+
700
+ /**
701
+ * Output a text box for a settings field.
702
+ *
703
+ * @param array $args {
704
+ * string $name The name of the setting as registered with the settings API.
705
+ * array $attrs An array of HTML attributes for the field.
706
+ * array $value The current value of the text box.
707
+ * string $description The description to display below the field.
708
+ * }
709
+ *
710
+ * @since 4.0.0
711
+ */
712
+ function settings_text_box( array $args ) {
713
+
714
+ $defaults = array(
715
+ 'attrs' => array(),
716
+ 'value' => '',
717
+ 'description' => ''
718
+ );
719
+
720
+ $args = wp_parse_args( $args, $defaults );
721
+
722
+ echo '<input name="' . esc_attr( $args['name'] ) . '"
723
+ value="' . $args['value'] . '" ';
724
+
725
+ print_attrs( $args['attrs'] );
726
+
727
+ echo ' />';
728
+
729
+ if( !empty( $args['description'] ) ) {
730
+ echo '<p class="description">' . esc_html( $args['description'] ) . '</p>';
731
+ }
732
+
733
+ }
734
+
735
+
736
+ /**
737
+ * Outputs disabled placeholder fields.
738
+ *
739
+ * @since 4.0.0
740
+ */
741
+ function do_pro_only_field() {
742
+
743
+ echo '<p class="description">' . __( 'Pro version only', 'ots' ) . '</p>';
744
+
745
+ }
746
+
747
+
748
+ /**
749
+ * Output a number input and checkbox for the display limit field.
750
+ *
751
+ * @since 4.0.0
752
+ */
753
+ function display_limit_field() {
754
+
755
+ $value = get_option( Options::DISPLAY_LIMIT ); ?>
756
+
757
+ <input type="number"
758
+ min="1"
759
+ id="ots-display-limit-number"
760
+ placeholder="<?php esc_attr_e( '# of members', 'ots' ); ?>"
761
+ name="<?php esc_attr_e( Options::DISPLAY_LIMIT ); ?>"
762
+ value="<?php $value !== 'on' ? esc_attr_e( $value ) : ''; ?>"
763
+
764
+ <?php disabled( $value, 'all' ); ?> >
765
+
766
+ <?php _e( ' - or - ', 'ots' ); ?>
767
+
768
+ <label>
769
+
770
+ <input type="checkbox"
771
+ id="ots-display-limit-all"
772
+ value="all"
773
+ name="<?php esc_attr_e( Options::DISPLAY_LIMIT ); ?>"
774
+
775
+ <?php checked( $value, 'all' ); ?> >
776
+
777
+ <?php _e( 'Display all', 'ots' ); ?>
778
+
779
+ </label>
780
+
781
+ <p class="description"><?php _e( 'The maximum number of members to display', 'ots' ); ?></p>
782
+
783
+ <?php }
784
+
785
+
786
+ function settings_toggle( array $args ) {
787
+
788
+ $defaults = array(
789
+ 'attrs' => array(),
790
+ 'checked' => false,
791
+ 'label' => '',
792
+ 'slider' => ''
793
+ );
794
+
795
+ $args = wp_parse_args( $args, $defaults );
796
+
797
+ echo '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="off" />';
798
+
799
+ echo '<label class="switch">
800
+ <input type="checkbox"
801
+ value="on"
802
+ name="' . esc_attr( $args['name'] ) . '" ';
803
+
804
+ print_attrs( $args['attrs'] );
805
+
806
+ checked( 'on', $args['checked'] );
807
+
808
+ echo ' /><span class="slider ' . esc_attr( $args['slider'] ) . '"></label> ';
809
+ echo '<span class="label">' . esc_html( $args['label'] ) . '</span>';
810
+
811
+ }
812
+
includes/documentation.php CHANGED
@@ -1,707 +1,707 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
-
6
- /**
7
- * Registers the documentation page.
8
- *
9
- * @since 4.0.0
10
- */
11
- function add_documentation_pages() {
12
-
13
- add_submenu_page( 'edit.php?post_type=team_member', __( 'Documentation', 'ots' ), __( 'Documentation', 'ots' ), 'manage_options', 'ots-docs', 'ots\do_documentation_page' );
14
-
15
- }
16
-
17
- add_action( 'admin_menu', 'ots\add_documentation_pages' );
18
-
19
-
20
- /**
21
- * Add sections to the documentation page.
22
- *
23
- * @since 4.0.0
24
- */
25
- function add_documentation_sections() {
26
-
27
- add_settings_section( 'plugin-usage', __( 'Displaying the team', 'ots' ), '', 'ots-getting-started' );
28
- add_settings_section( 'templates', __( 'Templates', 'ots' ), '', 'ots-getting-started' );
29
- add_settings_section( 'widgets', __( 'Widgets', 'ots' ), '', 'ots-getting-started' );
30
-
31
- add_settings_section( 'manage-members', __( 'Managing Members', 'ots-pro' ), '', 'ots-portal' );
32
- add_settings_section( 'restrict-posts', __( 'Restricting Posts and Pages', 'ots-pro' ), '', 'ots-portal' );
33
- add_settings_section( 'portal-usage', __( 'Using the Community Hub', 'ots-pro' ), '', 'ots-portal' );
34
-
35
- add_settings_section( 'export-general', __( 'Exporting Team Members', 'ots-pro' ), '', 'ots-import-export' );
36
- add_settings_section( 'import-general', __( 'Importing Team Members', 'ots-pro' ), '', 'ots-import-export' );
37
-
38
- add_settings_section( 'shortcode-general', __( 'Shortcode Details', 'ots-pro' ), '', 'ots-shortcode' );
39
-
40
- }
41
-
42
- add_action( 'admin_init', 'ots\add_documentation_sections' );
43
-
44
-
45
- /**
46
- * Add each document topic to its respective section.
47
- *
48
- * @since 4.0.0
49
- */
50
- function add_documentation_fields() {
51
-
52
- add_settings_field( 'usage', '', 'ots\doc_usage', 'ots-getting-started', 'plugin-usage' );
53
- add_settings_field( 'templates', __( 'Team View Templates', 'ots' ), 'ots\doc_templates', 'ots-getting-started', 'templates' );
54
- add_settings_field( 'shortcode-templates', __( 'Setting a Template and Using Shortcodes', 'ots' ), 'ots\doc_shortcode_templates', 'ots-getting-started', 'templates' );
55
- add_settings_field( 'shortcode-columns', __( 'Setting The number of columns Using Shortcodes', 'ots' ), 'ots\doc_shortcode_columns', 'ots-getting-started', 'templates' );
56
- add_settings_field( 'shortcode-ids', __( 'Setting The ID of a Shortcode Instance', 'ots' ), 'ots\doc_shortcode_ids', 'ots-getting-started', 'templates' );
57
- add_settings_field( 'single-templates', __( 'Single Member View Templates', 'ots' ), 'ots\doc_single_templates', 'ots-getting-started', 'templates' );
58
- add_settings_field( 'override-templates', __( 'Overriding Templates', 'ots' ), 'ots\doc_override_templates', 'ots-getting-started', 'templates' );
59
- add_settings_field( 'custom-templates', __( 'Custom Templates - <i class="ots-pro">Pro Version</i>', 'ots' ), 'ots\doc_custom_templates', 'ots-getting-started', 'templates' );
60
- add_settings_field( 'main-widget', __( 'Main Widget', 'ots' ), 'ots\doc_main_widget', 'ots-getting-started', 'widgets' );
61
- add_settings_field( 'sidebar-widget', __( 'Sidebar Widget', 'ots' ), 'ots\doc_sidebar_widget', 'ots-getting-started', 'widgets' );
62
-
63
- add_settings_field( 'whatis-hub', __( 'What is the Community Hub ?', 'ots-pro' ), 'ots\doc_whatis_hub', 'ots-portal', 'manage-members' );
64
- add_settings_field( 'manage-members', __( 'Enable or Disable Community Access', 'ots-pro' ), 'ots\doc_manage_members', 'ots-portal', 'manage-members' );
65
- add_settings_field( 'redirect-posts', __( 'Redirecting Users From Restricted Content', 'ots-pro' ), 'ots\doc_redirect_posts', 'ots-portal', 'restrict-posts' );
66
- add_settings_field( 'restrict-posts', __( 'Restricting Posts and Pages to Members Only', 'ots-pro' ), 'ots\doc_restrict_posts', 'ots-portal', 'restrict-posts' );
67
- add_settings_field( 'restrict-groups', __( 'Restricting Posts and Pages by Group', 'ots-pro' ), 'ots\doc_restrict_groups', 'ots-portal', 'restrict-posts' );
68
- add_settings_field( 'portal-overview', __( 'Community Hub Overview', 'ots-pro' ), 'ots\doc_portal_overview', 'ots-portal', 'portal-usage' );
69
- add_settings_field( 'editing-profile', __( 'Editing Your Profile', 'ots-pro' ), 'ots\doc_editing_profile', 'ots-portal', 'portal-usage' );
70
- add_settings_field( 'viewing-profile', __( 'Viewing Others Profiles', 'ots-pro' ), 'ots\doc_viewing_profile', 'ots-portal', 'portal-usage' );
71
- add_settings_field( 'reset-password', __( 'Resetting Your Password', 'ots-pro' ), 'ots\doc_reset_password', 'ots-portal', 'portal-usage' );
72
-
73
- add_settings_field( 'export-basics', __( 'Export Team Members', 'ots-pro' ), 'ots\doc_export_team', 'ots-import-export', 'export-general' );
74
- add_settings_field( 'import-basics', __( 'Import Team Members', 'ots-pro' ), 'ots\doc_import_team', 'ots-import-export', 'import-general' );
75
-
76
- add_settings_field( 'shortcode-details', __( 'Shortcode Details', 'ots-pro' ), 'ots\doc_shortcode_details', 'ots-shortcode', 'shortcode-general' );
77
-
78
- }
79
-
80
- add_action( 'admin_init', 'ots\add_documentation_fields' );
81
-
82
- /**
83
- * Render the usage topic.
84
- *
85
- * @since 4.0.0
86
- */
87
- function doc_usage() { ?>
88
-
89
- <div>
90
-
91
- <h3>Using the Shortcode</h3>
92
- This is the primary recommended way to display your team. Simply add <code>[our-team]</code> to any page, post, widget etc.. and that will render the team members.
93
- You can have multiple shortcodes per page. When you use the shortcode without any parameters, the plugin will display your team members according to the layout and appearance settings you have set in the
94
- plugin's <a href="<?php echo esc_url( admin_url( 'edit.php?post_type=team_member&page=ots-settings' ) ) ?>">Settings page.</a>
95
- <br>
96
- You can add parameters to the shortcode which allows you to customize the output for each instance of the shortcode.<br><br>
97
- <strong><a herf="">Click here </a></strong> for a list of all the available Shortcode parameters.
98
-
99
-
100
- <h3>Using the Widgets</h3>
101
- The plugin creates two custom widgets that you can use to display your team members. <strong>Our Team Widget</strong> and <strong>Our Team Sidebar Widget</strong>.
102
- You can place these widgets in any of the widget areas provided by your theme.
103
-
104
- <h3>Using PHP Code</h3>
105
- Sometimes you may want to call the shortcode directly from your PHP template code. You can leverage WordPress's <code>do_shortcode</code> method for this.
106
- <br>
107
- <code>echo do_shortcode( '[our-team group="developers"]' );</code>
108
-
109
-
110
-
111
- </div>
112
-
113
- <?php }
114
-
115
-
116
- /**
117
- * Render the templates topic.
118
- *
119
- * @since 4.0.0
120
- */
121
- function doc_templates() { ?>
122
-
123
- <p>
124
- <?php _e( 'To view the Template options for Our Team Showcase, visit the ', 'ots' ); ?>
125
- <a target="_blank" href="http://wordpressteamplugin.com/templates/"><?php _e( 'Our Team Showcase Demo Page', 'ots' ); ?></a>.
126
- </p>
127
- <p>
128
- <i>
129
- <?php _e( 'Please note that several of these demo templates are only available in the Pro version.', 'ots' ); ?>
130
- </i>
131
- </p>
132
-
133
- <?php }
134
-
135
-
136
- /**
137
- * Render the short-code topic.
138
- *
139
- * @since 4.0.0
140
- */
141
- function doc_shortcode_templates() { ?>
142
-
143
- <p>
144
- <?php _e( 'The default template, "Grid - Boxes", can be changed to one of several other options. Each one will display your team showcase in a different visual arrangement. The template can be changed in the ', 'ots' ); ?>
145
- <a href="<?php menu_page_url( 'ots-settings' ); ?>"><?php _e( 'plugin settings', 'ots' ); ?></a>.
146
- </p>
147
- <p>
148
- <?php _e( 'If you wish to display the Showcase in more than one configuration on the site, you can also modify the short-code to specify a different template for that version of output of the plugin.', 'ots' ); ?>
149
- </p>
150
- <p>
151
- <?php _e( 'Example:', 'ots' ); ?> <code>[our-team template="grid"]</code>
152
- </p>
153
- <p>
154
- <?php _e( 'The short-code values for each of the templates are:', 'ots' ); ?>
155
- </p>
156
- <p>
157
- <code>[our-team template="carousel"]</code>
158
- <br>
159
- <code>[our-team template="grid"]</code>
160
- <br>
161
- <code>[our-team template="grid2"]</code>
162
- <br>
163
- <code>[our-team template="grid3"]</code>
164
- <br>
165
- <code>[our-team template="grid_cirlces"]</code>
166
- <br>
167
- <code>[our-team template="grid_circles2"]</code>
168
- <br>
169
- <code>[our-team template="hc"]</code>
170
- <br>
171
- <code>[our-team template="stacked"]</code>
172
- <br>
173
- <code>[our-team template="directory"]</code>
174
- </p>
175
-
176
- <?php }
177
-
178
-
179
- function doc_shortcode_ids() { ?>
180
-
181
- <p>
182
- <?php _e( 'Each shortcode instance can optionally be given a unique <i>HTML identifier</i>. In the shortcode this makes it easier to modify the behaviour or appearance of individual shortcode instances on the same page. To set the shortcode ID, simply pass the <code>id="your-unique-id"</code> parameter along with any other shortcode options.', 'ots' ); ?>
183
- </p>
184
-
185
- <?php }
186
-
187
- function doc_shortcode_columns() { ?>
188
-
189
- <p>
190
- <?php _e( 'You can set the number of columns from the settings page of the plugin, alternatively, you can also set it from the shortcode directly.', 'ots' ); ?>
191
- </p>
192
-
193
- <p>
194
- <code>[our-team template="grid3" columns="4"]</code>
195
- </p>
196
-
197
- <?php }
198
-
199
-
200
- /**
201
- * Render the single templates topic.
202
- *
203
- * @since 4.0.0
204
- */
205
- function doc_single_templates() { ?>
206
-
207
- <p>
208
- <strong><?php _e( 'Theme Default (Single Post)', 'ots' ); ?></strong>
209
- </p>
210
- <p>
211
- <?php _e( 'This will load the single member page based on your theme\'s single.php file.', 'ots' ); ?>
212
- </p>
213
- <p>
214
- <strong><?php _e( 'Custom Template', 'ots' ); ?></strong>
215
- </p>
216
- <p>
217
- <?php _e( 'This will load the single member page from a custom template file (team_members_template.php).', 'ots' ); ?>
218
- </p>
219
- <p>
220
- <strong>
221
- <?php _e( 'Card Popup <code>[our-team single_template="vcard"]</code>', 'ots' ); ?> - <i class="ots-pro"><?php _e( 'Pro Version', 'ots' ); ?></i>
222
- </strong>
223
- </p>
224
- <p class="media">
225
- <a href="<?php echo esc_url( asset( 'images/demo/card.jpg' ) ); ?>" target="_blank">
226
- <img src="<?php echo esc_url( asset( 'images/demo/card.jpg' ) ); ?>">
227
- </a>
228
- </p>
229
- <p>
230
- <?php _e( 'This will load a light-box and the member details in a sliding box.', 'ots' ); ?>
231
- </p>
232
- <p>
233
- <strong>
234
- <?php _e( 'Side Panel <code>[our-team single_template="panel"]</code>', 'ots' ); ?> - <i class="ots-pro"><?php _e( 'Pro Version', 'ots' ); ?></i>
235
- </strong>
236
- </p>
237
- <p class="media">
238
- <a href="<?php echo esc_url( asset( 'images/demo/panel-1.jpg' ) ); ?>" target="_blank">
239
- <img src="<?php echo esc_url( asset( 'images/demo/panel-1.jpg' ) ); ?>">
240
- </a>
241
- </p>
242
- <p>
243
- <?php _e( 'If you do not wish to include a full single profile for each Team Member, you can disable single member view in the', 'ots' ); ?>
244
- <a target="_blank" href="<?php menu_page_url( 'ots-settings' ); ?>"><?php _e( ' plugin settings', 'ots' ); ?></a>.
245
- </p>
246
-
247
- <?php }
248
-
249
-
250
- /**
251
- *
252
- */
253
- function doc_override_templates() { ?>
254
-
255
- <p>
256
- <?php _e( 'Our Team Showcase allows you to customize the team templates, without having to edit the plugin code. ', 'ots' ) ?>
257
- </p>
258
-
259
- <p>
260
- <?php _e( 'To customize a template, copy the template file that you want to edit from the plugin to the root of your theme, and prefix it with "team-template-". ', 'ots' ) ?>
261
- </p>
262
-
263
- <p>
264
- <?php _e( 'For example, if you want to customize the default grid template, copy grid.php from <code>our-team-enhanced/templates/grid.php</code> and place it in your theme root. Then edit the file name so it becomes '
265
- . '<code>team-template-grid.php</code>. Once you do that, you can start making any edits to the template within your theme, and these changes will be maintained when the plugin is updated.', 'ots' ) ?>
266
- </p>
267
-
268
- <?php }
269
-
270
- /**
271
- * Render the custom templates topic.
272
- *
273
- * @since 4.0.0
274
- */
275
- function doc_custom_templates() { ?>
276
-
277
- <p>
278
- <?php _e( 'The plugin allows you to choose between several options for displaying single members. By default, the team member single page follows the theme\'s single.php file. You can choose to use the custom template, which is included in the plugin. In the Team plugin Settings page, under Single Member View Settings, select Custom Template. That tells the plugin to use the included custom template file. ', 'ots' ); ?>
279
- </p>
280
- <p>
281
- <strong><?php _e( 'Overriding the Custom Template', 'ots' ); ?></strong>
282
- </p>
283
- <p>
284
- <?php _e( 'To override the file, do not edit it from the plugin. Instead, create the file <code>/{THEME_ROOT}/team_members_template.php</code> and copy the contents of <code>/{PLUGIN_DIR}/templates/team_members_template.php</code> into it. You can then edit this file to your liking.', 'ots' ); ?>
285
- </p>
286
-
287
- <?php }
288
-
289
-
290
- function doc_main_widget() { ?>
291
-
292
- <p class="alignright">
293
- <img src="<?php echo esc_url( asset( 'images/doc/ots-widget.jpg' ) ); ?>"/>
294
- </p>
295
-
296
- <p>
297
- <?php _e( 'The plugin also includes a widget that can output the same templates as the shortcode in your theme\'s widget areas. Simply go to Appearance - Widgets and find the widget titled "Our Team Widget".', 'ots' ); ?>
298
- </p>
299
- <p>
300
- <?php _e( 'You can drag & drop the widget into any widget placeholder and then configure to your liking.', 'ots' ); ?>
301
- </p>
302
-
303
-
304
-
305
- <?php }
306
-
307
-
308
- function doc_sidebar_widget() { ?>
309
-
310
- <p>
311
- <?php _e( 'The plugin comes with an easy to use widget designed for appearing in your site Sidebar. Go to Appearance - Widgets and find the widget titled "Our Team Sidebar Widget".', 'ots' ); ?>
312
- </p>
313
- <p class="media">
314
- <a href="<?php echo esc_url( asset( 'images/demo/sidebar-widget.jpg' ) ); ?>" target="_blank">
315
- <img src="<?php echo esc_url( asset( 'images/demo/sidebar-widget.jpg' ) ); ?>">
316
- </a>
317
- </p>
318
- <p>
319
- <?php _e( 'You can drag & drop the widget into any widget placeholder.', 'ots' ); ?>
320
- </p>
321
-
322
- <?php }
323
-
324
- function doc_whatis_hub() { ?>
325
-
326
- <p>
327
- <?php _e( 'Our Community Hub is included in <strong>Our Team Showcase Pro</strong>, which creates a private, password-protected area on your site that can be only accessed by your team members.', 'ots' ); ?>
328
- </p>
329
-
330
- <p>
331
- <?php _e( 'Allow your team members to <strong>login and update</strong> their own user profiles', 'ots' ); ?><br>
332
- <?php _e( 'Secure posts and pages so that they can only be accessed by your team members', 'ots' ); ?> <br>
333
- <?php _e( 'A social hub for your company where you can share news, events and updates', 'ots' ); ?> <br>
334
-
335
- </p>
336
- <h2><?php _e( 'Our Community Hub creates a private, password-protected area on your site, where team members can login, view protected posts & pages, write comments, "like" and "favorite" content.' ); ?></h2>
337
-
338
- <br>
339
-
340
- <p class="media">
341
- <img src="<?php echo esc_url( asset( 'images/doc/portal-1.jpg' ) ); ?>"/>
342
- </p>
343
-
344
-
345
- <?php }
346
-
347
- function doc_manage_members() { ?>
348
-
349
- <div>
350
- <p>
351
- <?php _e( 'Member Portal access can be enabled or disabled for each team member with the Member Portal meta box. Once enabled, they will be able to log in and start using the portal.', 'ots' ); ?>
352
- </p>
353
- <p class="media">
354
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-1.jpg' ) ); ?>">
355
- <img src="<?php echo esc_url( asset( 'images/doc/manage-members-1.jpg' ) ); ?>">
356
- </a>
357
- </p>
358
- <p>
359
- <?php _e( 'Each members status will display in the <i>Portal Status</i> column the Team Members list table for easy viewing.', 'ots' ); ?>
360
- </p>
361
- <p class="media">
362
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-2.jpg' ) ); ?>">
363
- <img src="<?php echo esc_url( asset( 'images/doc/manage-members-2.jpg' ) ); ?>">
364
- </a>
365
- </p>
366
-
367
- <p>
368
- <i>
369
- <?php _e( 'Note: When bulk enabling access, all newly activated members will have a new password auto generated and sent to their contact email address', 'ots' ); ?>
370
- </i>
371
- </p>
372
- <p class="media">
373
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-3.jpg' ) ); ?>">
374
- <img src="<?php echo esc_url( asset( 'images/doc/manage-members-3.jpg' ) ); ?>">
375
- </a>
376
- </p>
377
- </div>
378
-
379
- <?php }
380
-
381
-
382
- function doc_redirect_posts() { ?>
383
-
384
- <div>
385
- <p>
386
- <?php _e( 'If a user does not have sufficient privileges to view a particular post or page, you can customize the page that they will be redirected to, each can be overridden on a post level.', 'ots' ); ?>
387
- </p>
388
- <p class="media">
389
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-1.jpg' ) ); ?>">
390
- <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-1.jpg' ) ); ?>">
391
- </a>
392
- </p>
393
- </div>
394
-
395
- <?php }
396
-
397
-
398
- function doc_restrict_posts() { ?>
399
-
400
- <div>
401
- <p>
402
- <?php _e( 'In the <i>Member Portal Restriction</i> meta box you can control who can see a post or page.', 'ots' ); ?>
403
- </p>
404
- <p>
405
- <?php _e( 'Restricting a post to <strong>All logged in members</strong> under Access will cause the post to no longer be public and only viewable only by members who are logged in.', 'ots' ); ?>
406
- </p>
407
- <p class="media">
408
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-2.jpg' ) ); ?>">
409
- <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-2.jpg' ) ); ?>">
410
- </a>
411
- </p>
412
- </div>
413
-
414
- <?php }
415
-
416
-
417
- function doc_restrict_groups() { ?>
418
-
419
- <div>
420
- <p>
421
- <?php _e( 'Posts and Pages can also be restricted to one or more groups so that only members of those groups will be able to view them.', 'ots' ); ?>
422
- </p>
423
- <p class="media">
424
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-3.jpg' ) ); ?>">
425
- <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-3.jpg' ) ); ?>">
426
- </a>
427
- </p>
428
- <p>
429
- <?php _e( 'The <strong>Portal Status</strong> of each post is also conveniently viewable in the Posts list table.', 'ots' ); ?>
430
- </p>
431
- <p class="media">
432
- <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-4.jpg' ) ); ?>">
433
- <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-4.jpg' ) ); ?>">
434
- </a>
435
- </p>
436
- </div>
437
-
438
- <?php }
439
-
440
-
441
- function doc_reset_password() { ?>
442
-
443
- <p>
444
- <?php _e( 'If a user has forgotten or lost their password, they can request a new one by selecting the <strong>Forgot Password</strong> link on the login page. A new password will be automatically be generated and sent to their contact email.', 'ots' ); ?>
445
- </p>
446
-
447
- <?php }
448
-
449
- function doc_portal_overview() { ?>
450
-
451
- <div>
452
- <p><?php _e( 'On the portal homepage, members can view previews of recent posts which they can like or comment on. The sidebar contains a list of all pages that the user can access from within the portal and a list of members who are in the same group.', 'ots' ); ?></p>
453
- <p class="media">
454
- <img> <code>portal home screenshot</code>
455
- </p>
456
- <p>
457
- <?php _e( 'Users can also click into each post to read the full content and if it is the first time a user is viewing the post, the number of views will be incremented.', 'ots' ); ?>
458
- </p>
459
- <p>
460
- <i><?php _e( 'Tip: Hover over a post\'s views or likes to see which members have viewed or liked the post.', 'ots' ); ?></i>
461
- </p>
462
- <p class="media">
463
- <img> <code>screenshot of likes & views tooltip</code>
464
- </p>
465
- <p><?php _e( 'Members can navigate through the portal using the slide-out navigation menu which provides quick links back to the portal home, the user\'s profile page and to log out of the portal.', 'ots' ); ?></p>
466
- <p class="media">
467
- <img> <code>screenshot of nav drawer</code>
468
- </p>
469
- </div>
470
-
471
- <?php }
472
-
473
-
474
- function doc_editing_profile() { ?>
475
-
476
- <div>
477
- <p><?php _e( 'On the edit profile page users have the ability to update all aspects of their profile including their name, bio and contact information. Users can also change their password and set their profile image and cover photo.', 'ots' ); ?></p>
478
- <p>
479
- <i><?php _e( 'Note: Changes made here will also be reflected on the public site.', 'ots' ); ?></i>
480
- </p>
481
- <p class="media">
482
- <img> <code>screenshot of profile edit page</code>
483
- </p>
484
- </div>
485
-
486
- <?php }
487
-
488
- function doc_viewing_profile() { ?>
489
-
490
- <div>
491
- <p><?php _e( 'When logged into the portal, users will be able to see a customized version of the single Team Member template that integrates with the team portal\'s appearance.', 'ots' ); ?></p>
492
- <p class="media">
493
- <img> <code>screenshot of team member page</code>
494
- </p>
495
- </div>
496
-
497
- <?php }
498
-
499
-
500
- function doc_export_team() { ?>
501
-
502
- <div>
503
- <p><?php _e( 'The Export feature allows you to export all your team data to a CSV file. This allows you to view the team members in Excel - as well as migrate the team data to a different site or software that you may be using.', 'ots' ); ?></p>
504
- <p><?php _e( 'To use this feature, go to Import/Export menu item under Team and click the Export button. The plugin will generate an export file and store it in the Uploads folder. You can click the Download button to download a copy of the file.', 'ots' ); ?></p>
505
- </div>
506
-
507
- <?php }
508
-
509
- function doc_import_team() { ?>
510
-
511
- <div>
512
- <p><?php _e( 'The Import feature allows you to import team members from a csv file. For companies with large staff directories this can be a very effective way of bulk adding new members to the team.', 'ots' ); ?></p>
513
- <p><?php _e( 'To use this feature, go to Import/Export menu item under Team, select the CSV file that contains your team member data from your computer and click the Import button.', 'ots' ); ?></p>
514
-
515
- <p>
516
- <a href="//raw.githubusercontent.com/smartcatdev/docs/master/ots/demo-data.csv" class="button button-primary" download="team-export.csv"><?php _e( 'Download Sample CSV', 'ots' ); ?></a>
517
- </p>
518
-
519
-
520
- <h3><?php _e( 'Important notes', 'ots' ); ?></h3>
521
-
522
- <p>
523
- <?php _e( '1. Please note that the Import tool will attempt to import member images, this requires the plugin to '
524
- . 'create the image files on the destination website - the web server must have access to create files in PHP '
525
- . 'otherwise the import will fail', 'ots' ); ?>
526
- </p>
527
- <p>
528
- <?php _e( '2. The Import feature will not import posts from the "Favorite articles" - It will simply assign the member\'s favorite posts to the IDs', 'ots' ); ?>
529
- </p>
530
-
531
- <p>
532
- <?php _e( '3. The Import feature will not import member groups, or attempt to create them. This is mainly for team member only at this time.', 'ots' ); ?>
533
- </p>
534
-
535
- <p>
536
- <?php _e( '4. If you are getting an error that the file you\'re uploading is not a CSV, please ensure that there are no extra spaces or commas in the CSV files.', 'ots' ); ?>
537
- </p>
538
-
539
- </div>
540
-
541
- <?php }
542
-
543
- /**
544
- *
545
- * @since 4.4
546
- */
547
- function doc_shortcode_details() { ?>
548
-
549
- <table class="widefat data">
550
- <thead>
551
- <tr>
552
- <th>Parameter</th>
553
- <th>Accepted Values</th>
554
- <th>Description</th>
555
- </tr>
556
- </thead>
557
- <tbody>
558
- <tr>
559
- <td>group</td>
560
- <td><i>The slug of the group.</i></td>
561
- <td>Example: <i>development-team</i></td>
562
- </tr>
563
- <tr>
564
- <td>Template</td>
565
- <td>
566
- grid, grid2, grid3, grid_circles, grid_circles2, hc, stacked, directory
567
- </td>
568
- <td>Allows you to set the template for the Team display</td>
569
- </tr>
570
- <tr>
571
- <td>Columns</td>
572
- <td>
573
- 1, 2, 3, 4
574
- </td>
575
- <td>Set the number of team members per row</td>
576
- </tr>
577
- <tr>
578
- <td>limit</td>
579
- <td>
580
- <i>number</i>
581
- </td>
582
- <td>Set the total number of team members to display</td>
583
- </tr>
584
- <tr>
585
- <td>id</td>
586
- <td>
587
- <i>your-unique-id</i>
588
- </td>
589
- <td>Give each team member view a unique ID. Useful for developers who want to make customizations per shortcode</td>
590
- </tr>
591
- <tr>
592
- <td>single_template</td>
593
- <td>
594
- vcard, panel, custom, disabled
595
- </td>
596
- <td>Give each team member view a unique ID. Useful for developers who want to make customizations per shortcode</td>
597
- </tr>
598
- <tr>
599
- <td>show_filter</td>
600
- <td>
601
- true, false
602
- </td>
603
- <td>Display buttons that allow viewers to filter your team members by group. You must have groups with assigned team members for this to work.</td>
604
- </tr>
605
- <tr>
606
- <td>show_search</td>
607
- <td>
608
- true, false
609
- </td>
610
- <td>Display a search bar allowing viewers to search team members by name, title, bio etc...</td>
611
- </tr>
612
- </tbody>
613
-
614
-
615
- </table>
616
-
617
-
618
- <?php }
619
-
620
-
621
- /**
622
- * Render the documentation page.
623
- *
624
- * @since 4.0.0
625
- */
626
- function do_documentation_page() {
627
-
628
- $tabs = array(
629
- 'ots-getting-started' => __( 'Getting Started', 'ots' ),
630
- 'ots-portal' => __( 'Community Hub', 'ots-pro' ),
631
- 'ots-import-export' => __( 'Import & Export', 'ots-pro' ),
632
- 'ots-shortcode' => __( 'Shortcode Parameters', 'ots-pro' )
633
- );
634
-
635
- $tabs = apply_filters( 'ots_documentation_tabs', $tabs );
636
-
637
- reset( $tabs );
638
-
639
- $active = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ? $_GET['tab'] : key( $tabs );
640
-
641
- ?>
642
-
643
- <div class="wrap ots-admin-page ots-documentation">
644
-
645
- <div class="ots-admin-header">
646
-
647
- <div class="title-bar">
648
-
649
- <div class="inner">
650
-
651
- <div class="branding">
652
- <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
653
- </div>
654
-
655
- <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
656
-
657
- </div>
658
-
659
- <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
660
-
661
- <div class="inner">
662
-
663
- <a href="http://wordpressteamplugin.com/templates/"
664
- class="cta cta-secondary"
665
- target="_blank">
666
- <?php _e( 'View Demo', 'ots' ); ?>
667
- </a>
668
-
669
- <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
670
- class="cta cta-primary"
671
- target="_blank">
672
- <?php _e( 'Go Pro', 'ots' ); ?>
673
- </a>
674
-
675
- </div>
676
-
677
- <?php endif; ?>
678
-
679
- </div>
680
-
681
- <div class="clear"></div>
682
-
683
- </div>
684
-
685
- <h2 style="display: none"></h2>
686
-
687
- <h2 class="nav-tab-wrapper">
688
-
689
- <?php foreach( $tabs as $tab => $title ) : ?>
690
-
691
- <a href="<?php echo esc_url( add_query_arg( 'tab', $tab ) ); ?>"
692
- class="nav-tab <?php echo $active == $tab ? 'nav-tab-active' : ''; ?>"><?php esc_html_e( $title ); ?></a>
693
-
694
- <?php endforeach; ?>
695
-
696
- </h2>
697
-
698
- <div class="inner">
699
-
700
- <form><?php do_settings_sections( $active ); ?></form>
701
-
702
- </div>
703
-
704
- </div>
705
-
706
- <?php }
707
-
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+
6
+ /**
7
+ * Registers the documentation page.
8
+ *
9
+ * @since 4.0.0
10
+ */
11
+ function add_documentation_pages() {
12
+
13
+ add_submenu_page( 'edit.php?post_type=team_member', __( 'Documentation', 'ots' ), __( 'Documentation', 'ots' ), 'manage_options', 'ots-docs', 'ots\do_documentation_page' );
14
+
15
+ }
16
+
17
+ add_action( 'admin_menu', 'ots\add_documentation_pages' );
18
+
19
+
20
+ /**
21
+ * Add sections to the documentation page.
22
+ *
23
+ * @since 4.0.0
24
+ */
25
+ function add_documentation_sections() {
26
+
27
+ add_settings_section( 'plugin-usage', __( 'Displaying the team', 'ots' ), '', 'ots-getting-started' );
28
+ add_settings_section( 'templates', __( 'Templates', 'ots' ), '', 'ots-getting-started' );
29
+ add_settings_section( 'widgets', __( 'Widgets', 'ots' ), '', 'ots-getting-started' );
30
+
31
+ add_settings_section( 'manage-members', __( 'Managing Members', 'ots-pro' ), '', 'ots-portal' );
32
+ add_settings_section( 'restrict-posts', __( 'Restricting Posts and Pages', 'ots-pro' ), '', 'ots-portal' );
33
+ add_settings_section( 'portal-usage', __( 'Using the Community Hub', 'ots-pro' ), '', 'ots-portal' );
34
+
35
+ add_settings_section( 'export-general', __( 'Exporting Team Members', 'ots-pro' ), '', 'ots-import-export' );
36
+ add_settings_section( 'import-general', __( 'Importing Team Members', 'ots-pro' ), '', 'ots-import-export' );
37
+
38
+ add_settings_section( 'shortcode-general', __( 'Shortcode Details', 'ots-pro' ), '', 'ots-shortcode' );
39
+
40
+ }
41
+
42
+ add_action( 'admin_init', 'ots\add_documentation_sections' );
43
+
44
+
45
+ /**
46
+ * Add each document topic to its respective section.
47
+ *
48
+ * @since 4.0.0
49
+ */
50
+ function add_documentation_fields() {
51
+
52
+ add_settings_field( 'usage', '', 'ots\doc_usage', 'ots-getting-started', 'plugin-usage' );
53
+ add_settings_field( 'templates', __( 'Team View Templates', 'ots' ), 'ots\doc_templates', 'ots-getting-started', 'templates' );
54
+ add_settings_field( 'shortcode-templates', __( 'Setting a Template and Using Shortcodes', 'ots' ), 'ots\doc_shortcode_templates', 'ots-getting-started', 'templates' );
55
+ add_settings_field( 'shortcode-columns', __( 'Setting The number of columns Using Shortcodes', 'ots' ), 'ots\doc_shortcode_columns', 'ots-getting-started', 'templates' );
56
+ add_settings_field( 'shortcode-ids', __( 'Setting The ID of a Shortcode Instance', 'ots' ), 'ots\doc_shortcode_ids', 'ots-getting-started', 'templates' );
57
+ add_settings_field( 'single-templates', __( 'Single Member View Templates', 'ots' ), 'ots\doc_single_templates', 'ots-getting-started', 'templates' );
58
+ add_settings_field( 'override-templates', __( 'Overriding Templates', 'ots' ), 'ots\doc_override_templates', 'ots-getting-started', 'templates' );
59
+ add_settings_field( 'custom-templates', __( 'Custom Templates - <i class="ots-pro">Pro Version</i>', 'ots' ), 'ots\doc_custom_templates', 'ots-getting-started', 'templates' );
60
+ add_settings_field( 'main-widget', __( 'Main Widget', 'ots' ), 'ots\doc_main_widget', 'ots-getting-started', 'widgets' );
61
+ add_settings_field( 'sidebar-widget', __( 'Sidebar Widget', 'ots' ), 'ots\doc_sidebar_widget', 'ots-getting-started', 'widgets' );
62
+
63
+ add_settings_field( 'whatis-hub', __( 'What is the Community Hub ?', 'ots-pro' ), 'ots\doc_whatis_hub', 'ots-portal', 'manage-members' );
64
+ add_settings_field( 'manage-members', __( 'Enable or Disable Community Access', 'ots-pro' ), 'ots\doc_manage_members', 'ots-portal', 'manage-members' );
65
+ add_settings_field( 'redirect-posts', __( 'Redirecting Users From Restricted Content', 'ots-pro' ), 'ots\doc_redirect_posts', 'ots-portal', 'restrict-posts' );
66
+ add_settings_field( 'restrict-posts', __( 'Restricting Posts and Pages to Members Only', 'ots-pro' ), 'ots\doc_restrict_posts', 'ots-portal', 'restrict-posts' );
67
+ add_settings_field( 'restrict-groups', __( 'Restricting Posts and Pages by Group', 'ots-pro' ), 'ots\doc_restrict_groups', 'ots-portal', 'restrict-posts' );
68
+ add_settings_field( 'portal-overview', __( 'Community Hub Overview', 'ots-pro' ), 'ots\doc_portal_overview', 'ots-portal', 'portal-usage' );
69
+ add_settings_field( 'editing-profile', __( 'Editing Your Profile', 'ots-pro' ), 'ots\doc_editing_profile', 'ots-portal', 'portal-usage' );
70
+ add_settings_field( 'viewing-profile', __( 'Viewing Others Profiles', 'ots-pro' ), 'ots\doc_viewing_profile', 'ots-portal', 'portal-usage' );
71
+ add_settings_field( 'reset-password', __( 'Resetting Your Password', 'ots-pro' ), 'ots\doc_reset_password', 'ots-portal', 'portal-usage' );
72
+
73
+ add_settings_field( 'export-basics', __( 'Export Team Members', 'ots-pro' ), 'ots\doc_export_team', 'ots-import-export', 'export-general' );
74
+ add_settings_field( 'import-basics', __( 'Import Team Members', 'ots-pro' ), 'ots\doc_import_team', 'ots-import-export', 'import-general' );
75
+
76
+ add_settings_field( 'shortcode-details', __( 'Shortcode Details', 'ots-pro' ), 'ots\doc_shortcode_details', 'ots-shortcode', 'shortcode-general' );
77
+
78
+ }
79
+
80
+ add_action( 'admin_init', 'ots\add_documentation_fields' );
81
+
82
+ /**
83
+ * Render the usage topic.
84
+ *
85
+ * @since 4.0.0
86
+ */
87
+ function doc_usage() { ?>
88
+
89
+ <div>
90
+
91
+ <h3>Using the Shortcode</h3>
92
+ This is the primary recommended way to display your team. Simply add <code>[our-team]</code> to any page, post, widget etc.. and that will render the team members.
93
+ You can have multiple shortcodes per page. When you use the shortcode without any parameters, the plugin will display your team members according to the layout and appearance settings you have set in the
94
+ plugin's <a href="<?php echo esc_url( admin_url( 'edit.php?post_type=team_member&page=ots-settings' ) ) ?>">Settings page.</a>
95
+ <br>
96
+ You can add parameters to the shortcode which allows you to customize the output for each instance of the shortcode.<br><br>
97
+ <strong><a herf="">Click here </a></strong> for a list of all the available Shortcode parameters.
98
+
99
+
100
+ <h3>Using the Widgets</h3>
101
+ The plugin creates two custom widgets that you can use to display your team members. <strong>Our Team Widget</strong> and <strong>Our Team Sidebar Widget</strong>.
102
+ You can place these widgets in any of the widget areas provided by your theme.
103
+
104
+ <h3>Using PHP Code</h3>
105
+ Sometimes you may want to call the shortcode directly from your PHP template code. You can leverage WordPress's <code>do_shortcode</code> method for this.
106
+ <br>
107
+ <code>echo do_shortcode( '[our-team group="developers"]' );</code>
108
+
109
+
110
+
111
+ </div>
112
+
113
+ <?php }
114
+
115
+
116
+ /**
117
+ * Render the templates topic.
118
+ *
119
+ * @since 4.0.0
120
+ */
121
+ function doc_templates() { ?>
122
+
123
+ <p>
124
+ <?php _e( 'To view the Template options for Our Team Showcase, visit the ', 'ots' ); ?>
125
+ <a target="_blank" href="http://wordpressteamplugin.com/templates/"><?php _e( 'Our Team Showcase Demo Page', 'ots' ); ?></a>.
126
+ </p>
127
+ <p>
128
+ <i>
129
+ <?php _e( 'Please note that several of these demo templates are only available in the Pro version.', 'ots' ); ?>
130
+ </i>
131
+ </p>
132
+
133
+ <?php }
134
+
135
+
136
+ /**
137
+ * Render the short-code topic.
138
+ *
139
+ * @since 4.0.0
140
+ */
141
+ function doc_shortcode_templates() { ?>
142
+
143
+ <p>
144
+ <?php _e( 'The default template, "Grid - Boxes", can be changed to one of several other options. Each one will display your team showcase in a different visual arrangement. The template can be changed in the ', 'ots' ); ?>
145
+ <a href="<?php menu_page_url( 'ots-settings' ); ?>"><?php _e( 'plugin settings', 'ots' ); ?></a>.
146
+ </p>
147
+ <p>
148
+ <?php _e( 'If you wish to display the Showcase in more than one configuration on the site, you can also modify the short-code to specify a different template for that version of output of the plugin.', 'ots' ); ?>
149
+ </p>
150
+ <p>
151
+ <?php _e( 'Example:', 'ots' ); ?> <code>[our-team template="grid"]</code>
152
+ </p>
153
+ <p>
154
+ <?php _e( 'The short-code values for each of the templates are:', 'ots' ); ?>
155
+ </p>
156
+ <p>
157
+ <code>[our-team template="carousel"]</code>
158
+ <br>
159
+ <code>[our-team template="grid"]</code>
160
+ <br>
161
+ <code>[our-team template="grid2"]</code>
162
+ <br>
163
+ <code>[our-team template="grid3"]</code>
164
+ <br>
165
+ <code>[our-team template="grid_cirlces"]</code>
166
+ <br>
167
+ <code>[our-team template="grid_circles2"]</code>
168
+ <br>
169
+ <code>[our-team template="hc"]</code>
170
+ <br>
171
+ <code>[our-team template="stacked"]</code>
172
+ <br>
173
+ <code>[our-team template="directory"]</code>
174
+ </p>
175
+
176
+ <?php }
177
+
178
+
179
+ function doc_shortcode_ids() { ?>
180
+
181
+ <p>
182
+ <?php _e( 'Each shortcode instance can optionally be given a unique <i>HTML identifier</i>. In the shortcode this makes it easier to modify the behaviour or appearance of individual shortcode instances on the same page. To set the shortcode ID, simply pass the <code>id="your-unique-id"</code> parameter along with any other shortcode options.', 'ots' ); ?>
183
+ </p>
184
+
185
+ <?php }
186
+
187
+ function doc_shortcode_columns() { ?>
188
+
189
+ <p>
190
+ <?php _e( 'You can set the number of columns from the settings page of the plugin, alternatively, you can also set it from the shortcode directly.', 'ots' ); ?>
191
+ </p>
192
+
193
+ <p>
194
+ <code>[our-team template="grid3" columns="4"]</code>
195
+ </p>
196
+
197
+ <?php }
198
+
199
+
200
+ /**
201
+ * Render the single templates topic.
202
+ *
203
+ * @since 4.0.0
204
+ */
205
+ function doc_single_templates() { ?>
206
+
207
+ <p>
208
+ <strong><?php _e( 'Theme Default (Single Post)', 'ots' ); ?></strong>
209
+ </p>
210
+ <p>
211
+ <?php _e( 'This will load the single member page based on your theme\'s single.php file.', 'ots' ); ?>
212
+ </p>
213
+ <p>
214
+ <strong><?php _e( 'Custom Template', 'ots' ); ?></strong>
215
+ </p>
216
+ <p>
217
+ <?php _e( 'This will load the single member page from a custom template file (team_members_template.php).', 'ots' ); ?>
218
+ </p>
219
+ <p>
220
+ <strong>
221
+ <?php _e( 'Card Popup <code>[our-team single_template="vcard"]</code>', 'ots' ); ?> - <i class="ots-pro"><?php _e( 'Pro Version', 'ots' ); ?></i>
222
+ </strong>
223
+ </p>
224
+ <p class="media">
225
+ <a href="<?php echo esc_url( asset( 'images/demo/card.jpg' ) ); ?>" target="_blank">
226
+ <img src="<?php echo esc_url( asset( 'images/demo/card.jpg' ) ); ?>">
227
+ </a>
228
+ </p>
229
+ <p>
230
+ <?php _e( 'This will load a light-box and the member details in a sliding box.', 'ots' ); ?>
231
+ </p>
232
+ <p>
233
+ <strong>
234
+ <?php _e( 'Side Panel <code>[our-team single_template="panel"]</code>', 'ots' ); ?> - <i class="ots-pro"><?php _e( 'Pro Version', 'ots' ); ?></i>
235
+ </strong>
236
+ </p>
237
+ <p class="media">
238
+ <a href="<?php echo esc_url( asset( 'images/demo/panel-1.jpg' ) ); ?>" target="_blank">
239
+ <img src="<?php echo esc_url( asset( 'images/demo/panel-1.jpg' ) ); ?>">
240
+ </a>
241
+ </p>
242
+ <p>
243
+ <?php _e( 'If you do not wish to include a full single profile for each Team Member, you can disable single member view in the', 'ots' ); ?>
244
+ <a target="_blank" href="<?php menu_page_url( 'ots-settings' ); ?>"><?php _e( ' plugin settings', 'ots' ); ?></a>.
245
+ </p>
246
+
247
+ <?php }
248
+
249
+
250
+ /**
251
+ *
252
+ */
253
+ function doc_override_templates() { ?>
254
+
255
+ <p>
256
+ <?php _e( 'Our Team Showcase allows you to customize the team templates, without having to edit the plugin code. ', 'ots' ) ?>
257
+ </p>
258
+
259
+ <p>
260
+ <?php _e( 'To customize a template, copy the template file that you want to edit from the plugin to the root of your theme, and prefix it with "team-template-". ', 'ots' ) ?>
261
+ </p>
262
+
263
+ <p>
264
+ <?php _e( 'For example, if you want to customize the default grid template, copy grid.php from <code>our-team-enhanced/templates/grid.php</code> and place it in your theme root. Then edit the file name so it becomes '
265
+ . '<code>team-template-grid.php</code>. Once you do that, you can start making any edits to the template within your theme, and these changes will be maintained when the plugin is updated.', 'ots' ) ?>
266
+ </p>
267
+
268
+ <?php }
269
+
270
+ /**
271
+ * Render the custom templates topic.
272
+ *
273
+ * @since 4.0.0
274
+ */
275
+ function doc_custom_templates() { ?>
276
+
277
+ <p>
278
+ <?php _e( 'The plugin allows you to choose between several options for displaying single members. By default, the team member single page follows the theme\'s single.php file. You can choose to use the custom template, which is included in the plugin. In the Team plugin Settings page, under Single Member View Settings, select Custom Template. That tells the plugin to use the included custom template file. ', 'ots' ); ?>
279
+ </p>
280
+ <p>
281
+ <strong><?php _e( 'Overriding the Custom Template', 'ots' ); ?></strong>
282
+ </p>
283
+ <p>
284
+ <?php _e( 'To override the file, do not edit it from the plugin. Instead, create the file <code>/{THEME_ROOT}/team_members_template.php</code> and copy the contents of <code>/{PLUGIN_DIR}/templates/team_members_template.php</code> into it. You can then edit this file to your liking.', 'ots' ); ?>
285
+ </p>
286
+
287
+ <?php }
288
+
289
+
290
+ function doc_main_widget() { ?>
291
+
292
+ <p class="alignright">
293
+ <img src="<?php echo esc_url( asset( 'images/doc/ots-widget.jpg' ) ); ?>"/>
294
+ </p>
295
+
296
+ <p>
297
+ <?php _e( 'The plugin also includes a widget that can output the same templates as the shortcode in your theme\'s widget areas. Simply go to Appearance - Widgets and find the widget titled "Our Team Widget".', 'ots' ); ?>
298
+ </p>
299
+ <p>
300
+ <?php _e( 'You can drag & drop the widget into any widget placeholder and then configure to your liking.', 'ots' ); ?>
301
+ </p>
302
+
303
+
304
+
305
+ <?php }
306
+
307
+
308
+ function doc_sidebar_widget() { ?>
309
+
310
+ <p>
311
+ <?php _e( 'The plugin comes with an easy to use widget designed for appearing in your site Sidebar. Go to Appearance - Widgets and find the widget titled "Our Team Sidebar Widget".', 'ots' ); ?>
312
+ </p>
313
+ <p class="media">
314
+ <a href="<?php echo esc_url( asset( 'images/demo/sidebar-widget.jpg' ) ); ?>" target="_blank">
315
+ <img src="<?php echo esc_url( asset( 'images/demo/sidebar-widget.jpg' ) ); ?>">
316
+ </a>
317
+ </p>
318
+ <p>
319
+ <?php _e( 'You can drag & drop the widget into any widget placeholder.', 'ots' ); ?>
320
+ </p>
321
+
322
+ <?php }
323
+
324
+ function doc_whatis_hub() { ?>
325
+
326
+ <p>
327
+ <?php _e( 'Our Community Hub is included in <strong>Our Team Showcase Pro</strong>, which creates a private, password-protected area on your site that can be only accessed by your team members.', 'ots' ); ?>
328
+ </p>
329
+
330
+ <p>
331
+ <?php _e( 'Allow your team members to <strong>login and update</strong> their own user profiles', 'ots' ); ?><br>
332
+ <?php _e( 'Secure posts and pages so that they can only be accessed by your team members', 'ots' ); ?> <br>
333
+ <?php _e( 'A social hub for your company where you can share news, events and updates', 'ots' ); ?> <br>
334
+
335
+ </p>
336
+ <h2><?php _e( 'Our Community Hub creates a private, password-protected area on your site, where team members can login, view protected posts & pages, write comments, "like" and "favorite" content.' ); ?></h2>
337
+
338
+ <br>
339
+
340
+ <p class="media">
341
+ <img src="<?php echo esc_url( asset( 'images/doc/portal-1.jpg' ) ); ?>"/>
342
+ </p>
343
+
344
+
345
+ <?php }
346
+
347
+ function doc_manage_members() { ?>
348
+
349
+ <div>
350
+ <p>
351
+ <?php _e( 'Member Portal access can be enabled or disabled for each team member with the Member Portal meta box. Once enabled, they will be able to log in and start using the portal.', 'ots' ); ?>
352
+ </p>
353
+ <p class="media">
354
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-1.jpg' ) ); ?>">
355
+ <img src="<?php echo esc_url( asset( 'images/doc/manage-members-1.jpg' ) ); ?>">
356
+ </a>
357
+ </p>
358
+ <p>
359
+ <?php _e( 'Each members status will display in the <i>Portal Status</i> column the Team Members list table for easy viewing.', 'ots' ); ?>
360
+ </p>
361
+ <p class="media">
362
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-2.jpg' ) ); ?>">
363
+ <img src="<?php echo esc_url( asset( 'images/doc/manage-members-2.jpg' ) ); ?>">
364
+ </a>
365
+ </p>
366
+
367
+ <p>
368
+ <i>
369
+ <?php _e( 'Note: When bulk enabling access, all newly activated members will have a new password auto generated and sent to their contact email address', 'ots' ); ?>
370
+ </i>
371
+ </p>
372
+ <p class="media">
373
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/manage-members-3.jpg' ) ); ?>">
374
+ <img src="<?php echo esc_url( asset( 'images/doc/manage-members-3.jpg' ) ); ?>">
375
+ </a>
376
+ </p>
377
+ </div>
378
+
379
+ <?php }
380
+
381
+
382
+ function doc_redirect_posts() { ?>
383
+
384
+ <div>
385
+ <p>
386
+ <?php _e( 'If a user does not have sufficient privileges to view a particular post or page, you can customize the page that they will be redirected to, each can be overridden on a post level.', 'ots' ); ?>
387
+ </p>
388
+ <p class="media">
389
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-1.jpg' ) ); ?>">
390
+ <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-1.jpg' ) ); ?>">
391
+ </a>
392
+ </p>
393
+ </div>
394
+
395
+ <?php }
396
+
397
+
398
+ function doc_restrict_posts() { ?>
399
+
400
+ <div>
401
+ <p>
402
+ <?php _e( 'In the <i>Member Portal Restriction</i> meta box you can control who can see a post or page.', 'ots' ); ?>
403
+ </p>
404
+ <p>
405
+ <?php _e( 'Restricting a post to <strong>All logged in members</strong> under Access will cause the post to no longer be public and only viewable only by members who are logged in.', 'ots' ); ?>
406
+ </p>
407
+ <p class="media">
408
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-2.jpg' ) ); ?>">
409
+ <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-2.jpg' ) ); ?>">
410
+ </a>
411
+ </p>
412
+ </div>
413
+
414
+ <?php }
415
+
416
+
417
+ function doc_restrict_groups() { ?>
418
+
419
+ <div>
420
+ <p>
421
+ <?php _e( 'Posts and Pages can also be restricted to one or more groups so that only members of those groups will be able to view them.', 'ots' ); ?>
422
+ </p>
423
+ <p class="media">
424
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-3.jpg' ) ); ?>">
425
+ <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-3.jpg' ) ); ?>">
426
+ </a>
427
+ </p>
428
+ <p>
429
+ <?php _e( 'The <strong>Portal Status</strong> of each post is also conveniently viewable in the Posts list table.', 'ots' ); ?>
430
+ </p>
431
+ <p class="media">
432
+ <a target="_blank" href="<?php echo esc_url( asset( 'images/doc/restrict-posts-4.jpg' ) ); ?>">
433
+ <img src="<?php echo esc_url( asset( 'images/doc/restrict-posts-4.jpg' ) ); ?>">
434
+ </a>
435
+ </p>
436
+ </div>
437
+
438
+ <?php }
439
+
440
+
441
+ function doc_reset_password() { ?>
442
+
443
+ <p>
444
+ <?php _e( 'If a user has forgotten or lost their password, they can request a new one by selecting the <strong>Forgot Password</strong> link on the login page. A new password will be automatically be generated and sent to their contact email.', 'ots' ); ?>
445
+ </p>
446
+
447
+ <?php }
448
+
449
+ function doc_portal_overview() { ?>
450
+
451
+ <div>
452
+ <p><?php _e( 'On the portal homepage, members can view previews of recent posts which they can like or comment on. The sidebar contains a list of all pages that the user can access from within the portal and a list of members who are in the same group.', 'ots' ); ?></p>
453
+ <p class="media">
454
+ <img> <code>portal home screenshot</code>
455
+ </p>
456
+ <p>
457
+ <?php _e( 'Users can also click into each post to read the full content and if it is the first time a user is viewing the post, the number of views will be incremented.', 'ots' ); ?>
458
+ </p>
459
+ <p>
460
+ <i><?php _e( 'Tip: Hover over a post\'s views or likes to see which members have viewed or liked the post.', 'ots' ); ?></i>
461
+ </p>
462
+ <p class="media">
463
+ <img> <code>screenshot of likes & views tooltip</code>
464
+ </p>
465
+ <p><?php _e( 'Members can navigate through the portal using the slide-out navigation menu which provides quick links back to the portal home, the user\'s profile page and to log out of the portal.', 'ots' ); ?></p>
466
+ <p class="media">
467
+ <img> <code>screenshot of nav drawer</code>
468
+ </p>
469
+ </div>
470
+
471
+ <?php }
472
+
473
+
474
+ function doc_editing_profile() { ?>
475
+
476
+ <div>
477
+ <p><?php _e( 'On the edit profile page users have the ability to update all aspects of their profile including their name, bio and contact information. Users can also change their password and set their profile image and cover photo.', 'ots' ); ?></p>
478
+ <p>
479
+ <i><?php _e( 'Note: Changes made here will also be reflected on the public site.', 'ots' ); ?></i>
480
+ </p>
481
+ <p class="media">
482
+ <img> <code>screenshot of profile edit page</code>
483
+ </p>
484
+ </div>
485
+
486
+ <?php }
487
+
488
+ function doc_viewing_profile() { ?>
489
+
490
+ <div>
491
+ <p><?php _e( 'When logged into the portal, users will be able to see a customized version of the single Team Member template that integrates with the team portal\'s appearance.', 'ots' ); ?></p>
492
+ <p class="media">
493
+ <img> <code>screenshot of team member page</code>
494
+ </p>
495
+ </div>
496
+
497
+ <?php }
498
+
499
+
500
+ function doc_export_team() { ?>
501
+
502
+ <div>
503
+ <p><?php _e( 'The Export feature allows you to export all your team data to a CSV file. This allows you to view the team members in Excel - as well as migrate the team data to a different site or software that you may be using.', 'ots' ); ?></p>
504
+ <p><?php _e( 'To use this feature, go to Import/Export menu item under Team and click the Export button. The plugin will generate an export file and store it in the Uploads folder. You can click the Download button to download a copy of the file.', 'ots' ); ?></p>
505
+ </div>
506
+
507
+ <?php }
508
+
509
+ function doc_import_team() { ?>
510
+
511
+ <div>
512
+ <p><?php _e( 'The Import feature allows you to import team members from a csv file. For companies with large staff directories this can be a very effective way of bulk adding new members to the team.', 'ots' ); ?></p>
513
+ <p><?php _e( 'To use this feature, go to Import/Export menu item under Team, select the CSV file that contains your team member data from your computer and click the Import button.', 'ots' ); ?></p>
514
+
515
+ <p>
516
+ <a href="<?php echo asset('data/demo.csv' ) ?>" class="button button-primary" download="team-export.csv"><?php _e( 'Download Sample CSV', 'ots' ); ?></a>
517
+ </p>
518
+
519
+
520
+ <h3><?php _e( 'Important notes', 'ots' ); ?></h3>
521
+
522
+ <p>
523
+ <?php _e( '1. Please note that the Import tool will attempt to import member images, this requires the plugin to '
524
+ . 'create the image files on the destination website - the web server must have access to create files in PHP '
525
+ . 'otherwise the import will fail', 'ots' ); ?>
526
+ </p>
527
+ <p>
528
+ <?php _e( '2. The Import feature will not import posts from the "Favorite articles" - It will simply assign the member\'s favorite posts to the IDs', 'ots' ); ?>
529
+ </p>
530
+
531
+ <p>
532
+ <?php _e( '3. The Import feature will not import member groups, or attempt to create them. This is mainly for team member only at this time.', 'ots' ); ?>
533
+ </p>
534
+
535
+ <p>
536
+ <?php _e( '4. If you are getting an error that the file you\'re uploading is not a CSV, please ensure that there are no extra spaces or commas in the CSV files.', 'ots' ); ?>
537
+ </p>
538
+
539
+ </div>
540
+
541
+ <?php }
542
+
543
+ /**
544
+ *
545
+ * @since 4.4
546
+ */
547
+ function doc_shortcode_details() { ?>
548
+
549
+ <table class="widefat data">
550
+ <thead>
551
+ <tr>
552
+ <th>Parameter</th>
553
+ <th>Accepted Values</th>
554
+ <th>Description</th>
555
+ </tr>
556
+ </thead>
557
+ <tbody>
558
+ <tr>
559
+ <td>group</td>
560
+ <td><i>The slug of the group.</i></td>
561
+ <td>Example: <i>development-team</i></td>
562
+ </tr>
563
+ <tr>
564
+ <td>Template</td>
565
+ <td>
566
+ grid, grid2, grid3, grid_circles, grid_circles2, hc, stacked, directory
567
+ </td>
568
+ <td>Allows you to set the template for the Team display</td>
569
+ </tr>
570
+ <tr>
571
+ <td>Columns</td>
572
+ <td>
573
+ 1, 2, 3, 4
574
+ </td>
575
+ <td>Set the number of team members per row</td>
576
+ </tr>
577
+ <tr>
578
+ <td>limit</td>
579
+ <td>
580
+ <i>number</i>
581
+ </td>
582
+ <td>Set the total number of team members to display</td>
583
+ </tr>
584
+ <tr>
585
+ <td>id</td>
586
+ <td>
587
+ <i>your-unique-id</i>
588
+ </td>
589
+ <td>Give each team member view a unique ID. Useful for developers who want to make customizations per shortcode</td>
590
+ </tr>
591
+ <tr>
592
+ <td>single_template</td>
593
+ <td>
594
+ vcard, panel, custom, disabled
595
+ </td>
596
+ <td>Give each team member view a unique ID. Useful for developers who want to make customizations per shortcode</td>
597
+ </tr>
598
+ <tr>
599
+ <td>show_filter</td>
600
+ <td>
601
+ true, false
602
+ </td>
603
+ <td>Display buttons that allow viewers to filter your team members by group. You must have groups with assigned team members for this to work.</td>
604
+ </tr>
605
+ <tr>
606
+ <td>show_search</td>
607
+ <td>
608
+ true, false
609
+ </td>
610
+ <td>Display a search bar allowing viewers to search team members by name, title, bio etc...</td>
611
+ </tr>
612
+ </tbody>
613
+
614
+
615
+ </table>
616
+
617
+
618
+ <?php }
619
+
620
+
621
+ /**
622
+ * Render the documentation page.
623
+ *
624
+ * @since 4.0.0
625
+ */
626
+ function do_documentation_page() {
627
+
628
+ $tabs = array(
629
+ 'ots-getting-started' => __( 'Getting Started', 'ots' ),
630
+ 'ots-portal' => __( 'Community Hub', 'ots-pro' ),
631
+ 'ots-import-export' => __( 'Import & Export', 'ots-pro' ),
632
+ 'ots-shortcode' => __( 'Shortcode Parameters', 'ots-pro' )
633
+ );
634
+
635
+ $tabs = apply_filters( 'ots_documentation_tabs', $tabs );
636
+
637
+ reset( $tabs );
638
+
639
+ $active = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ? $_GET['tab'] : key( $tabs );
640
+
641
+ ?>
642
+
643
+ <div class="wrap ots-admin-page ots-documentation">
644
+
645
+ <div class="ots-admin-header">
646
+
647
+ <div class="title-bar">
648
+
649
+ <div class="inner">
650
+
651
+ <div class="branding">
652
+ <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
653
+ </div>
654
+
655
+ <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
656
+
657
+ </div>
658
+
659
+ <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
660
+
661
+ <div class="inner">
662
+
663
+ <a href="http://wordpressteamplugin.com/templates/"
664
+ class="cta cta-secondary"
665
+ target="_blank">
666
+ <?php _e( 'View Demo', 'ots' ); ?>
667
+ </a>
668
+
669
+ <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
670
+ class="cta cta-primary"
671
+ target="_blank">
672
+ <?php _e( 'Go Pro', 'ots' ); ?>
673
+ </a>
674
+
675
+ </div>
676
+
677
+ <?php endif; ?>
678
+
679
+ </div>
680
+
681
+ <div class="clear"></div>
682
+
683
+ </div>
684
+
685
+ <h2 style="display: none"></h2>
686
+
687
+ <h2 class="nav-tab-wrapper">
688
+
689
+ <?php foreach( $tabs as $tab => $title ) : ?>
690
+
691
+ <a href="<?php echo esc_url( add_query_arg( 'tab', $tab ) ); ?>"
692
+ class="nav-tab <?php echo $active == $tab ? 'nav-tab-active' : ''; ?>"><?php esc_html_e( $title ); ?></a>
693
+
694
+ <?php endforeach; ?>
695
+
696
+ </h2>
697
+
698
+ <div class="inner">
699
+
700
+ <form><?php do_settings_sections( $active ); ?></form>
701
+
702
+ </div>
703
+
704
+ </div>
705
+
706
+ <?php }
707
+
includes/extension-licensing.php CHANGED
@@ -1,1198 +1,1198 @@
1
- <?php
2
-
3
- /**
4
- * Provides common framework for managing extension updates and a license management page.
5
- *
6
- * @version 1.0.0
7
- */
8
- if( !class_exists( 'SC_License_Manager' ) ) :
9
-
10
- class SC_License_Manager {
11
-
12
- private $id;
13
- private $extensions = array();
14
-
15
- private $page_args;
16
- private $page_type;
17
-
18
- private $hook = '';
19
-
20
- /**
21
- * SC_License_Manager constructor.
22
- *
23
- * @param string $id The extension's unique ID.
24
- * @param string $page_type The type of page for the license management page.
25
- * @param array $page_args Arguments to pass to add_{type}_page().
26
- * @since 1.0.0
27
- */
28
- public function __construct( $id, $page_type = 'options', $page_args = array() ) {
29
-
30
- $this->id = $id;
31
- $this->page_type = $page_type;
32
- $this->page_args = $page_args;
33
-
34
- $this->init();
35
- }
36
-
37
- /**
38
- * Add hooks an initialize extension registration.
39
- *
40
- * @since 1.0.0
41
- */
42
- private function init() {
43
-
44
- $this->schedule_cron();
45
-
46
- add_action( 'admin_menu', array( $this, 'add_license_page' ) );
47
- add_action( 'admin_init', array( $this, 'register_settings' ) );
48
- add_action( 'admin_init', array( $this, 'activate_license' ) );
49
- add_action( 'admin_init', array( $this, 'deactivate_license' ) );
50
- add_action( 'admin_notices', array( $this, 'expired_license_notifications' ) );
51
- add_action( 'admin_notices', array( $this, 'inactive_license_notifications' ) );
52
- add_action( 'admin_print_styles', array( $this, 'print_styles' ) );
53
-
54
- add_action( "{$this->id}_extensions_license_check", array( $this, 'check_licenses' ) );
55
-
56
- // Extensions hook onto this to register their licenses
57
- do_action( "{$this->id}_register_extensions", $this );
58
-
59
- }
60
-
61
- private function is_license_page() {
62
- return $this->hook == get_current_screen()->id;
63
- }
64
-
65
- /**
66
- * Setup a cron that will deactivate licenses of expired plugins.
67
- *
68
- * @since 1.0.0
69
- */
70
- public function schedule_cron() {
71
- if ( !wp_next_scheduled( "{$this->id}_extensions_license_check" ) ) {
72
- wp_schedule_event( time(), 'daily', "{$this->id}_extensions_license_check" );
73
- }
74
- }
75
-
76
- /**
77
- * Cron job will only be cleared if there are no extensions registered.
78
- *
79
- * @since 1.0.0
80
- */
81
- public function clear_cron() {
82
- if( empty( $this->extensions ) ) {
83
- wp_clear_scheduled_hook( "{$this->id}_extensions_license_check" );
84
- }
85
- }
86
-
87
- /**
88
- * Display any notifications for expired licenses.
89
- *
90
- * @since 1.0.0
91
- */
92
- public function expired_license_notifications() {
93
-
94
- if( !$this->is_license_page() ) {
95
-
96
- $notices = get_option( "{$this->id}-extension-notices", array() );
97
-
98
- foreach( $notices as $ext ) {
99
-
100
- // Make sure the extension is still installed
101
- if( array_key_exists( $ext, $this->extensions ) ) { ?>
102
-
103
- <div class="notice notice-warning is-dismissible">
104
- <p>
105
- <?php _e( 'Your license for ' . $this->extensions[ $ext ]['item'] . ' has expired. Please renew it at ' ); ?>
106
- <a href="<?php esc_url( $this->extensions[ $ext ]['url'] ); ?>"><?php echo esc_url( $this->extensions[ $ext ]['url'] ); ?></a>
107
- </p>
108
- </div>
109
-
110
- <?php }
111
-
112
- }
113
-
114
- }
115
-
116
- }
117
-
118
- /**
119
- * Display any notifications for inactive licenses.
120
- *
121
- * @since 1.0.0
122
- */
123
- public function inactive_license_notifications() {
124
-
125
- if( !$this->is_license_page() ) {
126
-
127
- $notices = get_option( "{$this->id}-extension-notices", array() );
128
-
129
- foreach( $this->extensions as $id => $ext ) {
130
-
131
- // Make sure the license hasn't been marked as expired
132
- if( get_option( $this->extensions[ $id ]['options']['status'] ) !== 'valid' && !array_key_exists( $id, $notices ) ) { ?>
133
-
134
- <div class="notice notice-warning is-dismissible">
135
- <p>
136
- <?php _e( '<strong>' . $this->extensions[ $id ]['item'] . '</strong> is active but license has not been activated!' ); ?>
137
- <a href="<?php menu_page_url( $this->page_args['menu_slug'] ); ?>"><?php _e( 'Activate now.' ); ?></a>
138
- </p>
139
- </div>
140
-
141
- <?php }
142
-
143
- }
144
-
145
- }
146
-
147
- }
148
-
149
- /**
150
- * Deactivates expired licenses and sets the flag to notify the admin.
151
- *
152
- * @since 1.0.0
153
- */
154
- public function check_licenses() {
155
-
156
- $notices = get_option( "{$this->id}-extension-notices", array() );
157
-
158
- foreach ( $this->extensions as $id => $extension ) {
159
-
160
- $license_data = $this->get_license_data( $id );
161
-
162
- if( $license_data ) {
163
-
164
- if( $license_data['license'] !== 'valid' ) {
165
-
166
- delete_option( $extension['options']['status'] );
167
- delete_option( $extension['options']['expiration'] );
168
-
169
- if( !in_array( $id, $notices ) ) {
170
- $notices[] = $id;
171
- }
172
-
173
- } else {
174
-
175
- // Refresh the expiration date
176
- update_option( $extension['options']['expiration'], $license_data['expires'] );
177
-
178
- }
179
-
180
- }
181
-
182
- }
183
-
184
- update_option( "{$this->id}-extension-notices", $notices );
185
-
186
- }
187
-
188
- /**
189
- * Add an extension license to be managed.
190
- *
191
- * @param string $id The ID of the extension.
192
- * @param string $store_url The URL of the EDD Marketplace.
193
- * @param string $plugin_file The file of the extension plugin.
194
- * @param array $option_keys {
195
- *
196
- * The option keys where the license data will be stored.
197
- *
198
- * string $license The option to use to store the license key.
199
- * string $status The option to use to store the license status.
200
- * string $expiration The option to use to store the license expiration date.
201
- * }
202
- * @param array $edd_args EDD updater arguments. @see \EDD_SL_Plugin_Updater
203
- * @since 1.0.0
204
- */
205
- public function add_license( $id, $store_url, $plugin_file, array $option_keys, array $edd_args ) {
206
-
207
- if( !array_key_exists( $id, $this->extensions ) ) {
208
-
209
- $edd_args['license'] = trim( get_option( $option_keys['license'] ) );
210
-
211
- $this->extensions[ $id ] = array(
212
- 'updater' => new EDD_SL_Plugin_Updater( $store_url, $plugin_file, $edd_args ),
213
- 'options' => $option_keys,
214
- 'url' => $store_url,
215
- 'item' => $edd_args['item_name']
216
- );
217
-
218
- }
219
-
220
- }
221
-
222
- /**
223
- * Adds the menu page to the WordPress admin if there is at least 1 extension registered.
224
- *
225
- * @since 1.0.0
226
- */
227
- public function add_license_page() {
228
-
229
- if( !empty( $this->extensions ) ) {
230
- $this->hook = call_user_func_array( "add_{$this->page_type}_page", $this->parse_page_args() );
231
- }
232
-
233
- }
234
-
235
- /**
236
- * Registers license options with the Settings API and configures their sanitize callback.
237
- *
238
- * @since 1.0.0
239
- */
240
- public function register_settings() {
241
-
242
- foreach( $this->extensions as $extension ) {
243
-
244
- $args = array(
245
- 'type' => 'string',
246
- 'sanitize_callback' => function ( $new ) use ( $extension ) {
247
-
248
- if ( $new != get_option( $extension['options']['license'] ) ) {
249
- delete_option( $extension['options']['status'] );
250
- delete_option( $extension['options']['expiration'] );
251
- }
252
-
253
- return $new;
254
-
255
- }
256
- );
257
-
258
- register_setting( "{$this->id}_extensions", $extension['options']['license'], $args );
259
- }
260
-
261
- }
262
-
263
- /**
264
- * Converts and organizes the associative $page_args array to a numerically indexed array for use with
265
- * add_{type}_page().
266
- *
267
- * @since 1.0.0
268
- * @return array The converted array.
269
- */
270
- private function parse_page_args() {
271
-
272
- $page_args = array();
273
-
274
- if( $this->page_type == 'submenu' ) {
275
- $page_args[] = $this->page_args['parent_slug'];
276
- }
277
-
278
- $common_args = array(
279
- 'page_title',
280
- 'menu_title',
281
- 'capability',
282
- 'menu_slug'
283
- );
284
-
285
- foreach( $common_args as $arg ) {
286
- if( isset( $this->page_args[ $arg ] ) ) {
287
- $page_args[] = $this->page_args[ $arg ];
288
- }
289
- }
290
-
291
- $page_args[] = array( $this, 'do_license_page' );
292
-
293
- if( $this->page_type == 'menu_page' ) {
294
- $page_args[] = !empty( $this->page_args['icon_url'] ) ? $this->page_args['icon_url'] : '';
295
- $page_args[] = !empty( $this->page_args['position'] ) ? $this->page_args['position'] : null;
296
- }
297
-
298
- return $page_args;
299
-
300
- }
301
-
302
- /**
303
- * Handler for extension activation requests.
304
- *
305
- * @since 1.0.0
306
- */
307
- public function activate_license() {
308
-
309
- if ( isset( $_POST["{$this->id}_activate_license"] ) &&
310
- check_admin_referer( "{$this->id}_license_activation", $_POST["{$this->id}_activate_license"] . '_activation_nonce' ) ) {
311
-
312
- if ( !array_key_exists( $_POST["{$this->id}_activate_license"], $this->extensions ) ) {
313
- return;
314
- }
315
-
316
- $extension = $this->extensions[ $_POST["{$this->id}_activate_license"] ];
317
-
318
- $api_params = array(
319
- 'edd_action' => 'activate_license',
320
- 'license' => get_option( $extension['options']['license'] ),
321
- 'item_name' => urlencode( $extension['item'] ),
322
- 'url' => home_url()
323
- );
324
-
325
- $request = array(
326
- 'timeout' => 15,
327
- 'sslverify' => false,
328
- 'body' => $api_params
329
- );
330
-
331
- $response = wp_remote_post( $extension['url'], $request );
332
-
333
- if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
334
-
335
- if ( is_wp_error( $response ) ) {
336
- $message = $response->get_error_message();
337
- } else {
338
- $message = __( 'An error occurred, please try again.' );
339
- }
340
-
341
- } else {
342
-
343
- $license_data = json_decode( wp_remote_retrieve_body( $response ), true );
344
-
345
- if ( false === $license_data['success'] ) {
346
-
347
- switch( $license_data['error'] ) {
348
-
349
- case 'expired' :
350
- $message = sprintf(
351
- __( 'Your license key expired on %s.' ),
352
- date_i18n( get_option( 'date_format' ), strtotime( $license_data['expires'], current_time( 'timestamp' ) ) )
353
- );
354
-
355
- break;
356
-
357
- case 'revoked' :
358
- $message = __( 'Your license key has been disabled.' );
359
-
360
- break;
361
-
362
- case 'missing' :
363
- $message = __( 'Invalid license.' );
364
-
365
- break;
366
-
367
- case 'invalid' :
368
- case 'site_inactive' :
369
- $message = __( 'Your license is not active for this URL.' );
370
-
371
- break;
372
-
373
- case 'item_name_mismatch' :
374
- $message = sprintf( __( 'This appears to be an invalid license key for %s.' ), $extension['item'] );
375
-
376
- break;
377
-
378
- case 'no_activations_left':
379
- $message = __( 'Your license key has reached its activation limit.' );
380
-
381
- break;
382
-
383
- default :
384
- $message = __( 'An error occurred, please try again.' );
385
-
386
- break;
387
- }
388
-
389
- }
390
-
391
- if( $license_data['license'] === 'valid' ) {
392
-
393
- update_option( $extension['options']['status'], $license_data['license'] );
394
- update_option( $extension['options']['expiration'], $license_data['expires'] );
395
-
396
- $this->clear_expiration_notice( $_POST["{$this->id}_activate_license"] );
397
-
398
- }
399
-
400
- }
401
-
402
- if ( !empty( $message ) ) {
403
- add_settings_error( "{$this->id}_extensions", 'activation-error', $message );
404
- }
405
-
406
- }
407
- }
408
-
409
- /**
410
- * Handler for deactivation requests.
411
- *
412
- * @since 1.0.0
413
- */
414
- public function deactivate_license() {
415
-
416
- if ( isset( $_POST["{$this->id}_deactivate_license"] ) &&
417
- check_admin_referer( "{$this->id}_license_deactivation", $_POST["{$this->id}_deactivate_license"] . '_deactivation_nonce' ) ) {
418
-
419
- if ( !array_key_exists( $_POST["{$this->id}_deactivate_license"], $this->extensions ) ) {
420
- return;
421
- }
422
-
423
- $extension = $this->extensions[ $_POST["{$this->id}_deactivate_license"] ];
424
-
425
- $api_params = array(
426
- 'edd_action' => 'deactivate_license',
427
- 'license' => get_option( $extension['options']['license'] ),
428
- 'item_name' => urlencode( $extension['item'] ),
429
- 'url' => home_url()
430
- );
431
-
432
- $request = array(
433
- 'timeout' => 15,
434
- 'sslverify' => false,
435
- 'body' => $api_params
436
- );
437
-
438
- $response = wp_remote_post( $extension['url'], $request );
439
-
440
- if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
441
-
442
- if ( is_wp_error( $response ) ) {
443
- $message = $response->get_error_message();
444
- } else {
445
- $message = __( 'An error occurred, please try again.' );
446
- }
447
-
448
- add_settings_error( "{$this->id}_extensions", 'deactivation-error', $message );
449
-
450
- } else {
451
-
452
- $license_data = json_decode( wp_remote_retrieve_body( $response ), true );
453
-
454
- if( $license_data['license'] == 'deactivated' ) {
455
- delete_option( $extension['options']['status'] );
456
- delete_option( $extension['options']['expiration'] );
457
- }
458
-
459
- }
460
-
461
- }
462
-
463
- }
464
-
465
- /**
466
- * Retrieves the license data for an extension.
467
- *
468
- * @param string $id The ID of the extension.
469
- * @return array|bool|mixed|object
470
- * @since 1.0.0
471
- */
472
- public function get_license_data( $id ) {
473
-
474
- if( array_key_exists( $id, $this->extensions ) ) {
475
-
476
- $extension = $this->extensions[ $id ];
477
-
478
- $license = trim( get_option( $extension['options']['license'] ) );
479
-
480
- $api_params = array(
481
- 'edd_action' => 'check_license',
482
- 'license' => $license,
483
- 'item_name' => urlencode( $extension['item'] ),
484
- 'url' => home_url()
485
- );
486
-
487
- $request = array(
488
- 'timeout' => 15,
489
- 'sslverify' => false,
490
- 'body' => $api_params
491
- );
492
-
493
- $response = wp_remote_post( $extension['url'], $request );
494
-
495
- if ( is_wp_error( $response ) ) {
496
- return false;
497
- }
498
-
499
- return json_decode( wp_remote_retrieve_body( $response ), true );
500
- }
501
-
502
- return false;
503
-
504
- }
505
-
506
- /**
507
- * Clears the expiration notification of an extension.
508
- *
509
- * @param string $id The ID of the extension.
510
- * @since 1.0.0
511
- */
512
- public function clear_expiration_notice( $id ) {
513
-
514
- $notices = get_option( "{$this->id}-extension-notices", array() );
515
-
516
- if( in_array( $id, $notices ) ) {
517
- unset( $notices[ array_search( $id, $notices ) ] );
518
- }
519
-
520
- update_option( "{$this->id}-extension-notices", $notices );
521
-
522
- }
523
-
524
- /**
525
- * Outputs the license management page.
526
- *
527
- * @since 1.0.0
528
- */
529
- public function do_license_page() {
530
-
531
- settings_errors( "{$this->id}_extensions" ); ?>
532
-
533
- <div class="wrap <?php esc_attr_e( "{$this->id}-licenses" ); ?> license-activation-page">
534
-
535
- <h2><?php _e( $this->page_args['page_title'] ); ?></h2>
536
-
537
- <form method="post" action="options.php">
538
-
539
- <?php foreach ( $this->extensions as $id => $extension ) : ?>
540
-
541
- <?php $this->do_license_field( $id, $extension ); ?>
542
-
543
- <?php endforeach; ?>
544
-
545
- <?php settings_fields( "{$this->id}_extensions" ); ?>
546
-
547
- <div class="clear"></div>
548
-
549
- <?php submit_button(); ?>
550
-
551
- </form>
552
-
553
- </div>
554
-
555
- <?php }
556
-
557
- /**
558
- * Outputs a license management field for an extension.
559
- *
560
- * @param string $id The ID of the extension.
561
- * @param array $extension The extension data.
562
- * @since 1.0.0
563
- */
564
- public function do_license_field( $id, $extension ) {
565
-
566
- $key = get_option( $extension['options']['license'] );
567
- $exp = get_option( $extension['options']['expiration'] );
568
- $status = get_option( $extension['options']['status'] );
569
-
570
- ?>
571
-
572
- <div class="license-activation">
573
-
574
- <div class="inner">
575
-
576
- <h3><?php echo $extension['item']; ?></h3>
577
-
578
- <p>
579
-
580
- <input class="license-key"
581
- type="text"
582
- name="<?php esc_attr_e( $extension['options']['license'] ); ?>"
583
- value="<?php esc_attr_e( $key ); ?>" />
584
-
585
- <?php if( !empty( $key ) ) : ?>
586
-
587
- <?php if( $status === 'valid' ) : ?>
588
-
589
- <button class="button button-secondary"
590
- type="submit"
591
- name="<?php esc_attr_e( "{$this->id}_deactivate_license" ); ?>"
592
- value="<?php esc_attr_e( $id ); ?>"><?php _e( 'Deactivate License' ); ?></button>
593
-
594
- <?php wp_nonce_field( "{$this->id}_license_deactivation", "{$id}_deactivation_nonce" ); ?>
595
-
596
- <?php else : ?>
597
-
598
- <button class="button button-secondary"
599
- type="submit"
600
- name="<?php esc_attr_e( "{$this->id}_activate_license" ); ?>"
601
- value="<?php esc_attr_e( $id ); ?>"><?php _e( 'Activate License' ); ?></button>
602
-
603
-
604
- <?php wp_nonce_field( "{$this->id}_license_activation", "{$id}_activation_nonce" ); ?>
605
-
606
- <?php endif; ?>
607
-
608
- <?php else : ?>
609
-
610
- <span class="description"><?php _e( 'Please enter your license key' ); ?></span>
611
-
612
- <?php endif; ?>
613
-
614
- </p>
615
-
616
- <?php if( $exp ) : ?>
617
-
618
- <div class="license-expiration">
619
-
620
- <?php if( $exp !== 'lifetime' ) : ?>
621
-
622
- <?php echo __( 'Your license key expires on ' ) . date_i18n( get_option( 'date_format' ), strtotime( $exp, current_time( 'timestamp' ) ) ); ?>
623
-
624
- <?php else : ?>
625
-
626
- <?php _e( 'This is a lifetime licence' ); ?>
627
-
628
- <?php endif; ?>
629
-
630
- </div>
631
-
632
- <?php endif; ?>
633
-
634
- </div>
635
-
636
- </div>
637
-
638
-
639
- <?php }
640
-
641
-
642
- /**
643
- * Print default styles for license page.
644
- *
645
- * @since 1.0.0
646
- */
647
- public function print_styles() {
648
-
649
- if( $this->is_license_page() ) : ?>
650
-
651
- <style id="<?php esc_attr_e( "{$this->id}-license-management-styles" ); ?>">
652
-
653
- .license-activation-page .submit {
654
- margin-top: 0;
655
- }
656
-
657
- .license-activation {
658
- background: #fff;
659
- border: 1px solid #ddd;
660
- margin: 10px 0;
661
- }
662
-
663
- .license-activation h3 {
664
- margin: 0;
665
- padding: 10px;
666
- background: #f9f9f9;
667
- border-bottom: 1px solid #ddd;
668
- }
669
-
670
- .license-activation p {
671
- margin: 10px;
672
- }
673
-
674
- .license-activation .description {
675
- margin-top: 5px;
676
- display: block;
677
- }
678
-
679
- .license-activation input {
680
- width: 100%;
681
- }
682
-
683
- .license-activation .button {
684
- margin: 5px 0 !important;
685
- width: 100%;
686
- }
687
-
688
- .license-activation .license-expiration {
689
- padding: 10px 10px 20px 10px;
690
- border-top: 1px solid #ddd;
691
- }
692
-
693
- @media( min-width: 600px ) {
694
-
695
- .license-activation .button {
696
- width: inherit;
697
- }
698
-
699
- }
700
-
701
- @media( min-width: 783px ) {
702
-
703
- .license-activation {
704
- width: 30%;
705
- float: left;
706
- margin-right: 10px;
707
- }
708
-
709
- }
710
-
711
- </style>
712
-
713
- <?php endif;
714
-
715
- }
716
-
717
- }
718
-
719
-
720
- endif;
721
-
722
-
723
- /**
724
- * Allows plugins to use their own update API.
725
- *
726
- * @author Easy Digital Downloads
727
- * @version 1.6.12
728
- */
729
- if( !class_exists( 'EDD_SL_Plugin_Updater' ) ) :
730
-
731
- class EDD_SL_Plugin_Updater {
732
-
733
- private $api_url = '';
734
- private $api_data = array();
735
- private $name = '';
736
- private $slug = '';
737
- private $version = '';
738
- private $wp_override = false;
739
- private $cache_key = '';
740
-
741
- /**
742
- * Class constructor.
743
- *
744
- * @uses plugin_basename()
745
- * @uses hook()
746
- *
747
- * @param string $_api_url The URL pointing to the custom API endpoint.
748
- * @param string $_plugin_file Path to the plugin file.
749
- * @param array $_api_data Optional data to send with API calls.
750
- */
751
- public function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
752
-
753
- global $edd_plugin_data;
754
-
755
- $this->api_url = trailingslashit( $_api_url );
756
- $this->api_data = $_api_data;
757
- $this->name = plugin_basename( $_plugin_file );
758
- $this->slug = basename( $_plugin_file, '.php' );
759
- $this->version = $_api_data['version'];
760
- $this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false;
761
- $this->beta = ! empty( $this->api_data['beta'] ) ? true : false;
762
- $this->cache_key = md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
763
-
764
- $edd_plugin_data[ $this->slug ] = $this->api_data;
765
-
766
- // Set up hooks.
767
- $this->init();
768
-
769
- }
770
-
771
- /**
772
- * Set up WordPress filters to hook into WP's update process.
773
- *
774
- * @uses add_filter()
775
- *
776
- * @return void
777
- */
778
- public function init() {
779
-
780
- add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
781
- add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
782
- remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10 );
783
- add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 );
784
- add_action( 'admin_init', array( $this, 'show_changelog' ) );
785
-
786
- }
787
-
788
- /**
789
- * Check for Updates at the defined API endpoint and modify the update array.
790
- *
791
- * This function dives into the update API just when WordPress creates its update array,
792
- * then adds a custom API call and injects the custom plugin data retrieved from the API.
793
- * It is reassembled from parts of the native WordPress plugin update code.
794
- * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
795
- *
796
- * @uses api_request()
797
- *
798
- * @param array $_transient_data Update array build by WordPress.
799
- * @return array Modified update array with custom plugin data.
800
- */
801
- public function check_update( $_transient_data ) {
802
-
803
- global $pagenow;
804
-
805
- if ( ! is_object( $_transient_data ) ) {
806
- $_transient_data = new stdClass;
807
- }
808
-
809
- if ( 'plugins.php' == $pagenow && is_multisite() ) {
810
- return $_transient_data;
811
- }
812
-
813
- if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) {
814
- return $_transient_data;
815
- }
816
-
817
- $version_info = $this->get_cached_version_info();
818
-
819
- if ( false === $version_info ) {
820
- $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
821
-
822
- $this->set_version_info_cache( $version_info );
823
-
824
- }
825
-
826
- if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
827
-
828
- if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
829
-
830
- $_transient_data->response[ $this->name ] = $version_info;
831
-
832
- }
833
-
834
- $_transient_data->last_checked = current_time( 'timestamp' );
835
- $_transient_data->checked[ $this->name ] = $this->version;
836
-
837
- }
838
-
839
- return $_transient_data;
840
- }
841
-
842
- /**
843
- * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise!
844
- *
845
- * @param string $file
846
- * @param array $plugin
847
- */
848
- public function show_update_notification( $file, $plugin ) {
849
-
850
- if ( is_network_admin() ) {
851
- return;
852
- }
853
-
854
- if( ! current_user_can( 'update_plugins' ) ) {
855
- return;
856
- }
857
-
858
- if( ! is_multisite() ) {
859
- return;
860
- }
861
-
862
- if ( $this->name != $file ) {
863
- return;
864
- }
865
-
866
- // Remove our filter on the site transient
867
- remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 );
868
-
869
- $update_cache = get_site_transient( 'update_plugins' );
870
-
871
- $update_cache = is_object( $update_cache ) ? $update_cache : new stdClass();
872
-
873
- if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) {
874
-
875
- $version_info = $this->get_cached_version_info();
876
-
877
- if ( false === $version_info ) {
878
- $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
879
-
880
- $this->set_version_info_cache( $version_info );
881
- }
882
-
883
- if ( ! is_object( $version_info ) ) {
884
- return;
885
- }
886
-
887
- if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
888
-
889
- $update_cache->response[ $this->name ] = $version_info;
890
-
891
- }
892
-
893
- $update_cache->last_checked = current_time( 'timestamp' );
894
- $update_cache->checked[ $this->name ] = $this->version;
895
-
896
- set_site_transient( 'update_plugins', $update_cache );
897
-
898
- } else {
899
-
900
- $version_info = $update_cache->response[ $this->name ];
901
-
902
- }
903
-
904
- // Restore our filter
905
- add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
906
-
907
- if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) {
908
-
909
- // build a plugin list row, with update notification
910
- $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
911
- # <tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange">
912
- echo '<tr class="plugin-update-tr" id="' . $this->slug . '-update" data-slug="' . $this->slug . '" data-plugin="' . $this->slug . '/' . $file . '">';
913
- echo '<td colspan="3" class="plugin-update colspanchange">';
914
- echo '<div class="update-message notice inline notice-warning notice-alt">';
915
-
916
- $changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' );
917
-
918
- if ( empty( $version_info->download_link ) ) {
919
- printf(
920
- __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'easy-digital-downloads' ),
921
- esc_html( $version_info->name ),
922
- '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
923
- esc_html( $version_info->new_version ),
924
- '</a>'
925
- );
926
- } else {
927
- printf(
928
- __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'easy-digital-downloads' ),
929
- esc_html( $version_info->name ),
930
- '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
931
- esc_html( $version_info->new_version ),
932
- '</a>',
933
- '<a href="' . esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $this->name, 'upgrade-plugin_' . $this->name ) ) .'">',
934
- '</a>'
935
- );
936
- }
937
-
938
- do_action( "in_plugin_update_message-{$file}", $plugin, $version_info );
939
-
940
- echo '</div></td></tr>';
941
- }
942
- }
943
-
944
- /**
945
- * Updates information on the "View version x.x details" page with custom data.
946
- *
947
- * @uses api_request()
948
- *
949
- * @param mixed $_data
950
- * @param string $_action
951
- * @param object $_args
952
- * @return object $_data
953
- */
954
- public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
955
-
956
- if ( $_action != 'plugin_information' ) {
957
-
958
- return $_data;
959
-
960
- }
961
-
962
- if ( ! isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) {
963
-
964
- return $_data;
965
-
966
- }
967
-
968
- $to_send = array(
969
- 'slug' => $this->slug,
970
- 'is_ssl' => is_ssl(),
971
- 'fields' => array(
972
- 'banners' => array(),
973
- 'reviews' => false
974
- )
975
- );
976
-
977
- $cache_key = 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
978
-
979
- // Get the transient where we store the api request for this plugin for 24 hours
980
- $edd_api_request_transient = $this->get_cached_version_info( $cache_key );
981
-
982
- //If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now.
983
- if ( empty( $edd_api_request_transient ) ) {
984
-
985
- $api_response = $this->api_request( 'plugin_information', $to_send );
986
-
987
- // Expires in 3 hours
988
- $this->set_version_info_cache( $api_response, $cache_key );
989
-
990
- if ( false !== $api_response ) {
991
- $_data = $api_response;
992
- }
993
-
994
- } else {
995
- $_data = $edd_api_request_transient;
996
- }
997
-
998
- // Convert sections into an associative array, since we're getting an object, but Core expects an array.
999
- if ( isset( $_data->sections ) && ! is_array( $_data->sections ) ) {
1000
- $new_sections = array();
1001
- foreach ( $_data->sections as $key => $value ) {
1002
- $new_sections[ $key ] = $value;
1003
- }
1004
-
1005
- $_data->sections = $new_sections;
1006
- }
1007
-
1008
- // Convert banners into an associative array, since we're getting an object, but Core expects an array.
1009
- if ( isset( $_data->banners ) && ! is_array( $_data->banners ) ) {
1010
- $new_banners = array();
1011
- foreach ( $_data->banners as $key => $value ) {
1012
- $new_banners[ $key ] = $value;
1013
- }
1014
-
1015
- $_data->banners = $new_banners;
1016
- }
1017
-
1018
- return $_data;
1019
- }
1020
-
1021
- /**
1022
- * Disable SSL verification in order to prevent download update failures
1023
- *
1024
- * @param array $args
1025
- * @param string $url
1026
- * @return object $array
1027
- */
1028
- public function http_request_args( $args, $url ) {
1029
- // If it is an https request and we are performing a package download, disable ssl verification
1030
- if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
1031
- $args['sslverify'] = false;
1032
- }
1033
- return $args;
1034
- }
1035
-
1036
- /**
1037
- * Calls the API and, if successfull, returns the object delivered by the API.
1038
- *
1039
- * @uses get_bloginfo()
1040
- * @uses wp_remote_post()
1041
- * @uses is_wp_error()
1042
- *
1043
- * @param string $_action The requested action.
1044
- * @param array $_data Parameters for the API action.
1045
- * @return false|object
1046
- */
1047
- private function api_request( $_action, $_data ) {
1048
-
1049
- global $wp_version;
1050
-
1051
- $data = array_merge( $this->api_data, $_data );
1052
-
1053
- if ( $data['slug'] != $this->slug ) {
1054
- return;
1055
- }
1056
-
1057
- if( $this->api_url == trailingslashit (home_url() ) ) {
1058
- return false; // Don't allow a plugin to ping itself
1059
- }
1060
-
1061
- $api_params = array(
1062
- 'edd_action' => 'get_version',
1063
- 'license' => ! empty( $data['license'] ) ? $data['license'] : '',
1064
- 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
1065
- 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
1066
- 'version' => isset( $data['version'] ) ? $data['version'] : false,
1067
- 'slug' => $data['slug'],
1068
- 'author' => $data['author'],
1069
- 'url' => home_url(),
1070
- 'beta' => ! empty( $data['beta'] ),
1071
- );
1072
-
1073
- $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
1074
-
1075
- if ( ! is_wp_error( $request ) ) {
1076
- $request = json_decode( wp_remote_retrieve_body( $request ) );
1077
- }
1078
-
1079
- if ( $request && isset( $request->sections ) ) {
1080
- $request->sections = maybe_unserialize( $request->sections );
1081
- } else {
1082
- $request = false;
1083
- }
1084
-
1085
- if ( $request && isset( $request->banners ) ) {
1086
- $request->banners = maybe_unserialize( $request->banners );
1087
- }
1088
-
1089
- if( ! empty( $request->sections ) ) {
1090
- foreach( $request->sections as $key => $section ) {
1091
- $request->$key = (array) $section;
1092
- }
1093
- }
1094
-
1095
- return $request;
1096
- }
1097
-
1098
- public function show_changelog() {
1099
-
1100
- global $edd_plugin_data;
1101
-
1102
- if( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action'] ) {
1103
- return;
1104
- }
1105
-
1106
- if( empty( $_REQUEST['plugin'] ) ) {
1107
- return;
1108
- }
1109
-
1110
- if( empty( $_REQUEST['slug'] ) ) {
1111
- return;
1112
- }
1113
-
1114
- if( ! current_user_can( 'update_plugins' ) ) {
1115
- wp_die( __( 'You do not have permission to install plugin updates', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
1116
- }
1117
-
1118
- $data = $edd_plugin_data[ $_REQUEST['slug'] ];
1119
- $beta = ! empty( $data['beta'] ) ? true : false;
1120
- $cache_key = md5( 'edd_plugin_' . sanitize_key( $_REQUEST['plugin'] ) . '_' . $beta . '_version_info' );
1121
- $version_info = $this->get_cached_version_info( $cache_key );
1122
-
1123
- if( false === $version_info ) {
1124
-
1125
- $api_params = array(
1126
- 'edd_action' => 'get_version',
1127
- 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
1128
- 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
1129
- 'slug' => $_REQUEST['slug'],
1130
- 'author' => $data['author'],
1131
- 'url' => home_url(),
1132
- 'beta' => ! empty( $data['beta'] )
1133
- );
1134
-
1135
- $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
1136
-
1137
- if ( ! is_wp_error( $request ) ) {
1138
- $version_info = json_decode( wp_remote_retrieve_body( $request ) );
1139
- }
1140
-
1141
-
1142
- if ( ! empty( $version_info ) && isset( $version_info->sections ) ) {
1143
- $version_info->sections = maybe_unserialize( $version_info->sections );
1144
- } else {
1145
- $version_info = false;
1146
- }
1147
-
1148
- if( ! empty( $version_info ) ) {
1149
- foreach( $version_info->sections as $key => $section ) {
1150
- $version_info->$key = (array) $section;
1151
- }
1152
- }
1153
-
1154
- $this->set_version_info_cache( $version_info, $cache_key );
1155
-
1156
- }
1157
-
1158
- if( ! empty( $version_info ) && isset( $version_info->sections['changelog'] ) ) {
1159
- echo '<div style="background:#fff;padding:10px;">' . $version_info->sections['changelog'] . '</div>';
1160
- }
1161
-
1162
- exit;
1163
- }
1164
-
1165
- public function get_cached_version_info( $cache_key = '' ) {
1166
-
1167
- if( empty( $cache_key ) ) {
1168
- $cache_key = $this->cache_key;
1169
- }
1170
-
1171
- $cache = get_option( $cache_key );
1172
-
1173
- if( empty( $cache['timeout'] ) || current_time( 'timestamp' ) > $cache['timeout'] ) {
1174
- return false; // Cache is expired
1175
- }
1176
-
1177
- return json_decode( $cache['value'] );
1178
-
1179
- }
1180
-
1181
- public function set_version_info_cache( $value = '', $cache_key = '' ) {
1182
-
1183
- if( empty( $cache_key ) ) {
1184
- $cache_key = $this->cache_key;
1185
- }
1186
-
1187
- $data = array(
1188
- 'timeout' => strtotime( '+3 hours', current_time( 'timestamp' ) ),
1189
- 'value' => json_encode( $value )
1190
- );
1191
-
1192
- update_option( $cache_key, $data );
1193
-
1194
- }
1195
-
1196
- }
1197
-
1198
  endif;
1
+ <?php
2
+
3
+ /**
4
+ * Provides common framework for managing extension updates and a license management page.
5
+ *
6
+ * @version 1.0.0
7
+ */
8
+ if( !class_exists( 'SC_License_Manager' ) ) :
9
+
10
+ class SC_License_Manager {
11
+
12
+ private $id;
13
+ private $extensions = array();
14
+
15
+ private $page_args;
16
+ private $page_type;
17
+
18
+ private $hook = '';
19
+
20
+ /**
21
+ * SC_License_Manager constructor.
22
+ *
23
+ * @param string $id The extension's unique ID.
24
+ * @param string $page_type The type of page for the license management page.
25
+ * @param array $page_args Arguments to pass to add_{type}_page().
26
+ * @since 1.0.0
27
+ */
28
+ public function __construct( $id, $page_type = 'options', $page_args = array() ) {
29
+
30
+ $this->id = $id;
31
+ $this->page_type = $page_type;
32
+ $this->page_args = $page_args;
33
+
34
+ $this->init();
35
+ }
36
+
37
+ /**
38
+ * Add hooks an initialize extension registration.
39
+ *
40
+ * @since 1.0.0
41
+ */
42
+ private function init() {
43
+
44
+ $this->schedule_cron();
45
+
46
+ add_action( 'admin_menu', array( $this, 'add_license_page' ) );
47
+ add_action( 'admin_init', array( $this, 'register_settings' ) );
48
+ add_action( 'admin_init', array( $this, 'activate_license' ) );
49
+ add_action( 'admin_init', array( $this, 'deactivate_license' ) );
50
+ add_action( 'admin_notices', array( $this, 'expired_license_notifications' ) );
51
+ add_action( 'admin_notices', array( $this, 'inactive_license_notifications' ) );
52
+ add_action( 'admin_print_styles', array( $this, 'print_styles' ) );
53
+
54
+ add_action( "{$this->id}_extensions_license_check", array( $this, 'check_licenses' ) );
55
+
56
+ // Extensions hook onto this to register their licenses
57
+ do_action( "{$this->id}_register_extensions", $this );
58
+
59
+ }
60
+
61
+ private function is_license_page() {
62
+ return $this->hook == get_current_screen()->id;
63
+ }
64
+
65
+ /**
66
+ * Setup a cron that will deactivate licenses of expired plugins.
67
+ *
68
+ * @since 1.0.0
69
+ */
70
+ public function schedule_cron() {
71
+ if ( !wp_next_scheduled( "{$this->id}_extensions_license_check" ) ) {
72
+ wp_schedule_event( time(), 'daily', "{$this->id}_extensions_license_check" );
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Cron job will only be cleared if there are no extensions registered.
78
+ *
79
+ * @since 1.0.0
80
+ */
81
+ public function clear_cron() {
82
+ if( empty( $this->extensions ) ) {
83
+ wp_clear_scheduled_hook( "{$this->id}_extensions_license_check" );
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Display any notifications for expired licenses.
89
+ *
90
+ * @since 1.0.0
91
+ */
92
+ public function expired_license_notifications() {
93
+
94
+ if( !$this->is_license_page() ) {
95
+
96
+ $notices = get_option( "{$this->id}-extension-notices", array() );
97
+
98
+ foreach( $notices as $ext ) {
99
+
100
+ // Make sure the extension is still installed
101
+ if( array_key_exists( $ext, $this->extensions ) ) { ?>
102
+
103
+ <div class="notice notice-warning is-dismissible">
104
+ <p>
105
+ <?php _e( 'Your license for ' . $this->extensions[ $ext ]['item'] . ' has expired. Please renew it at ' ); ?>
106
+ <a href="<?php esc_url( $this->extensions[ $ext ]['url'] ); ?>"><?php echo esc_url( $this->extensions[ $ext ]['url'] ); ?></a>
107
+ </p>
108
+ </div>
109
+
110
+ <?php }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ }
117
+
118
+ /**
119
+ * Display any notifications for inactive licenses.
120
+ *
121
+ * @since 1.0.0
122
+ */
123
+ public function inactive_license_notifications() {
124
+
125
+ if( !$this->is_license_page() ) {
126
+
127
+ $notices = get_option( "{$this->id}-extension-notices", array() );
128
+
129
+ foreach( $this->extensions as $id => $ext ) {
130
+
131
+ // Make sure the license hasn't been marked as expired
132
+ if( get_option( $this->extensions[ $id ]['options']['status'] ) !== 'valid' && !array_key_exists( $id, $notices ) ) { ?>
133
+
134
+ <div class="notice notice-warning is-dismissible">
135
+ <p>
136
+ <?php _e( '<strong>' . $this->extensions[ $id ]['item'] . '</strong> is active but license has not been activated!' ); ?>
137
+ <a href="<?php menu_page_url( $this->page_args['menu_slug'] ); ?>"><?php _e( 'Activate now.' ); ?></a>
138
+ </p>
139
+ </div>
140
+
141
+ <?php }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+ /**
150
+ * Deactivates expired licenses and sets the flag to notify the admin.
151
+ *
152
+ * @since 1.0.0
153
+ */
154
+ public function check_licenses() {
155
+
156
+ $notices = get_option( "{$this->id}-extension-notices", array() );
157
+
158
+ foreach ( $this->extensions as $id => $extension ) {
159
+
160
+ $license_data = $this->get_license_data( $id );
161
+
162
+ if( $license_data ) {
163
+
164
+ if( $license_data['license'] !== 'valid' ) {
165
+
166
+ delete_option( $extension['options']['status'] );
167
+ delete_option( $extension['options']['expiration'] );
168
+
169
+ if( !in_array( $id, $notices ) ) {
170
+ $notices[] = $id;
171
+ }
172
+
173
+ } else {
174
+
175
+ // Refresh the expiration date
176
+ update_option( $extension['options']['expiration'], $license_data['expires'] );
177
+
178
+ }
179
+
180
+ }
181
+
182
+ }
183
+
184
+ update_option( "{$this->id}-extension-notices", $notices );
185
+
186
+ }
187
+
188
+ /**
189
+ * Add an extension license to be managed.
190
+ *
191
+ * @param string $id The ID of the extension.
192
+ * @param string $store_url The URL of the EDD Marketplace.
193
+ * @param string $plugin_file The file of the extension plugin.
194
+ * @param array $option_keys {
195
+ *
196
+ * The option keys where the license data will be stored.
197
+ *
198
+ * string $license The option to use to store the license key.
199
+ * string $status The option to use to store the license status.
200
+ * string $expiration The option to use to store the license expiration date.
201
+ * }
202
+ * @param array $edd_args EDD updater arguments. @see \EDD_SL_Plugin_Updater
203
+ * @since 1.0.0
204
+ */
205
+ public function add_license( $id, $store_url, $plugin_file, array $option_keys, array $edd_args ) {
206
+
207
+ if( !array_key_exists( $id, $this->extensions ) ) {
208
+
209
+ $edd_args['license'] = trim( get_option( $option_keys['license'] ) );
210
+
211
+ $this->extensions[ $id ] = array(
212
+ 'updater' => new EDD_SL_Plugin_Updater( $store_url, $plugin_file, $edd_args ),
213
+ 'options' => $option_keys,
214
+ 'url' => $store_url,
215
+ 'item' => $edd_args['item_name']
216
+ );
217
+
218
+ }
219
+
220
+ }
221
+
222
+ /**
223
+ * Adds the menu page to the WordPress admin if there is at least 1 extension registered.
224
+ *
225
+ * @since 1.0.0
226
+ */
227
+ public function add_license_page() {
228
+
229
+ if( !empty( $this->extensions ) ) {
230
+ $this->hook = call_user_func_array( "add_{$this->page_type}_page", $this->parse_page_args() );
231
+ }
232
+
233
+ }
234
+
235
+ /**
236
+ * Registers license options with the Settings API and configures their sanitize callback.
237
+ *
238
+ * @since 1.0.0
239
+ */
240
+ public function register_settings() {
241
+
242
+ foreach( $this->extensions as $extension ) {
243
+
244
+ $args = array(
245
+ 'type' => 'string',
246
+ 'sanitize_callback' => function ( $new ) use ( $extension ) {
247
+
248
+ if ( $new != get_option( $extension['options']['license'] ) ) {
249
+ delete_option( $extension['options']['status'] );
250
+ delete_option( $extension['options']['expiration'] );
251
+ }
252
+
253
+ return $new;
254
+
255
+ }
256
+ );
257
+
258
+ register_setting( "{$this->id}_extensions", $extension['options']['license'], $args );
259
+ }
260
+
261
+ }
262
+
263
+ /**
264
+ * Converts and organizes the associative $page_args array to a numerically indexed array for use with
265
+ * add_{type}_page().
266
+ *
267
+ * @since 1.0.0
268
+ * @return array The converted array.
269
+ */
270
+ private function parse_page_args() {
271
+
272
+ $page_args = array();
273
+
274
+ if( $this->page_type == 'submenu' ) {
275
+ $page_args[] = $this->page_args['parent_slug'];
276
+ }
277
+
278
+ $common_args = array(
279
+ 'page_title',
280
+ 'menu_title',
281
+ 'capability',
282
+ 'menu_slug'
283
+ );
284
+
285
+ foreach( $common_args as $arg ) {
286
+ if( isset( $this->page_args[ $arg ] ) ) {
287
+ $page_args[] = $this->page_args[ $arg ];
288
+ }
289
+ }
290
+
291
+ $page_args[] = array( $this, 'do_license_page' );
292
+
293
+ if( $this->page_type == 'menu_page' ) {
294
+ $page_args[] = !empty( $this->page_args['icon_url'] ) ? $this->page_args['icon_url'] : '';
295
+ $page_args[] = !empty( $this->page_args['position'] ) ? $this->page_args['position'] : null;
296
+ }
297
+
298
+ return $page_args;
299
+
300
+ }
301
+
302
+ /**
303
+ * Handler for extension activation requests.
304
+ *
305
+ * @since 1.0.0
306
+ */
307
+ public function activate_license() {
308
+
309
+ if ( isset( $_POST["{$this->id}_activate_license"] ) &&
310
+ check_admin_referer( "{$this->id}_license_activation", $_POST["{$this->id}_activate_license"] . '_activation_nonce' ) ) {
311
+
312
+ if ( !array_key_exists( $_POST["{$this->id}_activate_license"], $this->extensions ) ) {
313
+ return;
314
+ }
315
+
316
+ $extension = $this->extensions[ $_POST["{$this->id}_activate_license"] ];
317
+
318
+ $api_params = array(
319
+ 'edd_action' => 'activate_license',
320
+ 'license' => get_option( $extension['options']['license'] ),
321
+ 'item_name' => urlencode( $extension['item'] ),
322
+ 'url' => home_url()
323
+ );
324
+
325
+ $request = array(
326
+ 'timeout' => 15,
327
+ 'sslverify' => false,
328
+ 'body' => $api_params
329
+ );
330
+
331
+ $response = wp_remote_post( $extension['url'], $request );
332
+
333
+ if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
334
+
335
+ if ( is_wp_error( $response ) ) {
336
+ $message = $response->get_error_message();
337
+ } else {
338
+ $message = __( 'An error occurred, please try again.' );
339
+ }
340
+
341
+ } else {
342
+
343
+ $license_data = json_decode( wp_remote_retrieve_body( $response ), true );
344
+
345
+ if ( false === $license_data['success'] ) {
346
+
347
+ switch( $license_data['error'] ) {
348
+
349
+ case 'expired' :
350
+ $message = sprintf(
351
+ __( 'Your license key expired on %s.' ),
352
+ date_i18n( get_option( 'date_format' ), strtotime( $license_data['expires'], current_time( 'timestamp' ) ) )
353
+ );
354
+
355
+ break;
356
+
357
+ case 'revoked' :
358
+ $message = __( 'Your license key has been disabled.' );
359
+
360
+ break;
361
+
362
+ case 'missing' :
363
+ $message = __( 'Invalid license.' );
364
+
365
+ break;
366
+
367
+ case 'invalid' :
368
+ case 'site_inactive' :
369
+ $message = __( 'Your license is not active for this URL.' );
370
+
371
+ break;
372
+
373
+ case 'item_name_mismatch' :
374
+ $message = sprintf( __( 'This appears to be an invalid license key for %s.' ), $extension['item'] );
375
+
376
+ break;
377
+
378
+ case 'no_activations_left':
379
+ $message = __( 'Your license key has reached its activation limit.' );
380
+
381
+ break;
382
+
383
+ default :
384
+ $message = __( 'An error occurred, please try again.' );
385
+
386
+ break;
387
+ }
388
+
389
+ }
390
+
391
+ if( $license_data['license'] === 'valid' ) {
392
+
393
+ update_option( $extension['options']['status'], $license_data['license'] );
394
+ update_option( $extension['options']['expiration'], $license_data['expires'] );
395
+
396
+ $this->clear_expiration_notice( $_POST["{$this->id}_activate_license"] );
397
+
398
+ }
399
+
400
+ }
401
+
402
+ if ( !empty( $message ) ) {
403
+ add_settings_error( "{$this->id}_extensions", 'activation-error', $message );
404
+ }
405
+
406
+ }
407
+ }
408
+
409
+ /**
410
+ * Handler for deactivation requests.
411
+ *
412
+ * @since 1.0.0
413
+ */
414
+ public function deactivate_license() {
415
+
416
+ if ( isset( $_POST["{$this->id}_deactivate_license"] ) &&
417
+ check_admin_referer( "{$this->id}_license_deactivation", $_POST["{$this->id}_deactivate_license"] . '_deactivation_nonce' ) ) {
418
+
419
+ if ( !array_key_exists( $_POST["{$this->id}_deactivate_license"], $this->extensions ) ) {
420
+ return;
421
+ }
422
+
423
+ $extension = $this->extensions[ $_POST["{$this->id}_deactivate_license"] ];
424
+
425
+ $api_params = array(
426
+ 'edd_action' => 'deactivate_license',
427
+ 'license' => get_option( $extension['options']['license'] ),
428
+ 'item_name' => urlencode( $extension['item'] ),
429
+ 'url' => home_url()
430
+ );
431
+
432
+ $request = array(
433
+ 'timeout' => 15,
434
+ 'sslverify' => false,
435
+ 'body' => $api_params
436
+ );
437
+
438
+ $response = wp_remote_post( $extension['url'], $request );
439
+
440
+ if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
441
+
442
+ if ( is_wp_error( $response ) ) {
443
+ $message = $response->get_error_message();
444
+ } else {
445
+ $message = __( 'An error occurred, please try again.' );
446
+ }
447
+
448
+ add_settings_error( "{$this->id}_extensions", 'deactivation-error', $message );
449
+
450
+ } else {
451
+
452
+ $license_data = json_decode( wp_remote_retrieve_body( $response ), true );
453
+
454
+ if( $license_data['license'] == 'deactivated' ) {
455
+ delete_option( $extension['options']['status'] );
456
+ delete_option( $extension['options']['expiration'] );
457
+ }
458
+
459
+ }
460
+
461
+ }
462
+
463
+ }
464
+
465
+ /**
466
+ * Retrieves the license data for an extension.
467
+ *
468
+ * @param string $id The ID of the extension.
469
+ * @return array|bool|mixed|object
470
+ * @since 1.0.0
471
+ */
472
+ public function get_license_data( $id ) {
473
+
474
+ if( array_key_exists( $id, $this->extensions ) ) {
475
+
476
+ $extension = $this->extensions[ $id ];
477
+
478
+ $license = trim( get_option( $extension['options']['license'] ) );
479
+
480
+ $api_params = array(
481
+ 'edd_action' => 'check_license',
482
+ 'license' => $license,
483
+ 'item_name' => urlencode( $extension['item'] ),
484
+ 'url' => home_url()
485
+ );
486
+
487
+ $request = array(
488
+ 'timeout' => 15,
489
+ 'sslverify' => false,
490
+ 'body' => $api_params
491
+ );
492
+
493
+ $response = wp_remote_post( $extension['url'], $request );
494
+
495
+ if ( is_wp_error( $response ) ) {
496
+ return false;
497
+ }
498
+
499
+ return json_decode( wp_remote_retrieve_body( $response ), true );
500
+ }
501
+
502
+ return false;
503
+
504
+ }
505
+
506
+ /**
507
+ * Clears the expiration notification of an extension.
508
+ *
509
+ * @param string $id The ID of the extension.
510
+ * @since 1.0.0
511
+ */
512
+ public function clear_expiration_notice( $id ) {
513
+
514
+ $notices = get_option( "{$this->id}-extension-notices", array() );
515
+
516
+ if( in_array( $id, $notices ) ) {
517
+ unset( $notices[ array_search( $id, $notices ) ] );
518
+ }
519
+
520
+ update_option( "{$this->id}-extension-notices", $notices );
521
+
522
+ }
523
+
524
+ /**
525
+ * Outputs the license management page.
526
+ *
527
+ * @since 1.0.0
528
+ */
529
+ public function do_license_page() {
530
+
531
+ settings_errors( "{$this->id}_extensions" ); ?>
532
+
533
+ <div class="wrap <?php esc_attr_e( "{$this->id}-licenses" ); ?> license-activation-page">
534
+
535
+ <h2><?php _e( $this->page_args['page_title'] ); ?></h2>
536
+
537
+ <form method="post" action="options.php">
538
+
539
+ <?php foreach ( $this->extensions as $id => $extension ) : ?>
540
+
541
+ <?php $this->do_license_field( $id, $extension ); ?>
542
+
543
+ <?php endforeach; ?>
544
+
545
+ <?php settings_fields( "{$this->id}_extensions" ); ?>
546
+
547
+ <div class="clear"></div>
548
+
549
+ <?php submit_button(); ?>
550
+
551
+ </form>
552
+
553
+ </div>
554
+
555
+ <?php }
556
+
557
+ /**
558
+ * Outputs a license management field for an extension.
559
+ *
560
+ * @param string $id The ID of the extension.
561
+ * @param array $extension The extension data.
562
+ * @since 1.0.0
563
+ */
564
+ public function do_license_field( $id, $extension ) {
565
+
566
+ $key = get_option( $extension['options']['license'] );
567
+ $exp = get_option( $extension['options']['expiration'] );
568
+ $status = get_option( $extension['options']['status'] );
569
+
570
+ ?>
571
+
572
+ <div class="license-activation">
573
+
574
+ <div class="inner">
575
+
576
+ <h3><?php echo $extension['item']; ?></h3>
577
+
578
+ <p>
579
+
580
+ <input class="license-key"
581
+ type="text"
582
+ name="<?php esc_attr_e( $extension['options']['license'] ); ?>"
583
+ value="<?php esc_attr_e( $key ); ?>" />
584
+
585
+ <?php if( !empty( $key ) ) : ?>
586
+
587
+ <?php if( $status === 'valid' ) : ?>
588
+
589
+ <button class="button button-secondary"
590
+ type="submit"
591
+ name="<?php esc_attr_e( "{$this->id}_deactivate_license" ); ?>"
592
+ value="<?php esc_attr_e( $id ); ?>"><?php _e( 'Deactivate License' ); ?></button>
593
+
594
+ <?php wp_nonce_field( "{$this->id}_license_deactivation", "{$id}_deactivation_nonce" ); ?>
595
+
596
+ <?php else : ?>
597
+
598
+ <button class="button button-secondary"
599
+ type="submit"
600
+ name="<?php esc_attr_e( "{$this->id}_activate_license" ); ?>"
601
+ value="<?php esc_attr_e( $id ); ?>"><?php _e( 'Activate License' ); ?></button>
602
+
603
+
604
+ <?php wp_nonce_field( "{$this->id}_license_activation", "{$id}_activation_nonce" ); ?>
605
+
606
+ <?php endif; ?>
607
+
608
+ <?php else : ?>
609
+
610
+ <span class="description"><?php _e( 'Please enter your license key' ); ?></span>
611
+
612
+ <?php endif; ?>
613
+
614
+ </p>
615
+
616
+ <?php if( $exp ) : ?>
617
+
618
+ <div class="license-expiration">
619
+
620
+ <?php if( $exp !== 'lifetime' ) : ?>
621
+
622
+ <?php echo __( 'Your license key expires on ' ) . date_i18n( get_option( 'date_format' ), strtotime( $exp, current_time( 'timestamp' ) ) ); ?>
623
+
624
+ <?php else : ?>
625
+
626
+ <?php _e( 'This is a lifetime licence' ); ?>
627
+
628
+ <?php endif; ?>
629
+
630
+ </div>
631
+
632
+ <?php endif; ?>
633
+
634
+ </div>
635
+
636
+ </div>
637
+
638
+
639
+ <?php }
640
+
641
+
642
+ /**
643
+ * Print default styles for license page.
644
+ *
645
+ * @since 1.0.0
646
+ */
647
+ public function print_styles() {
648
+
649
+ if( $this->is_license_page() ) : ?>
650
+
651
+ <style id="<?php esc_attr_e( "{$this->id}-license-management-styles" ); ?>">
652
+
653
+ .license-activation-page .submit {
654
+ margin-top: 0;
655
+ }
656
+
657
+ .license-activation {
658
+ background: #fff;
659
+ border: 1px solid #ddd;
660
+ margin: 10px 0;
661
+ }
662
+
663
+ .license-activation h3 {
664
+ margin: 0;
665
+ padding: 10px;
666
+ background: #f9f9f9;
667
+ border-bottom: 1px solid #ddd;
668
+ }
669
+
670
+ .license-activation p {
671
+ margin: 10px;
672
+ }
673
+
674
+ .license-activation .description {
675
+ margin-top: 5px;
676
+ display: block;
677
+ }
678
+
679
+ .license-activation input {
680
+ width: 100%;
681
+ }
682
+
683
+ .license-activation .button {
684
+ margin: 5px 0 !important;
685
+ width: 100%;
686
+ }
687
+
688
+ .license-activation .license-expiration {
689
+ padding: 10px 10px 20px 10px;
690
+ border-top: 1px solid #ddd;
691
+ }
692
+
693
+ @media( min-width: 600px ) {
694
+
695
+ .license-activation .button {
696
+ width: inherit;
697
+ }
698
+
699
+ }
700
+
701
+ @media( min-width: 783px ) {
702
+
703
+ .license-activation {
704
+ width: 30%;
705
+ float: left;
706
+ margin-right: 10px;
707
+ }
708
+
709
+ }
710
+
711
+ </style>
712
+
713
+ <?php endif;
714
+
715
+ }
716
+
717
+ }
718
+
719
+
720
+ endif;
721
+
722
+
723
+ /**
724
+ * Allows plugins to use their own update API.
725
+ *
726
+ * @author Easy Digital Downloads
727
+ * @version 1.6.12
728
+ */
729
+ if( !class_exists( 'EDD_SL_Plugin_Updater' ) ) :
730
+
731
+ class EDD_SL_Plugin_Updater {
732
+
733
+ private $api_url = '';
734
+ private $api_data = array();
735
+ private $name = '';
736
+ private $slug = '';
737
+ private $version = '';
738
+ private $wp_override = false;
739
+ private $cache_key = '';
740
+
741
+ /**
742
+ * Class constructor.
743
+ *
744
+ * @uses plugin_basename()
745
+ * @uses hook()
746
+ *
747
+ * @param string $_api_url The URL pointing to the custom API endpoint.
748
+ * @param string $_plugin_file Path to the plugin file.
749
+ * @param array $_api_data Optional data to send with API calls.
750
+ */
751
+ public function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
752
+
753
+ global $edd_plugin_data;
754
+
755
+ $this->api_url = trailingslashit( $_api_url );
756
+ $this->api_data = $_api_data;
757
+ $this->name = plugin_basename( $_plugin_file );
758
+ $this->slug = basename( $_plugin_file, '.php' );
759
+ $this->version = $_api_data['version'];
760
+ $this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false;
761
+ $this->beta = ! empty( $this->api_data['beta'] ) ? true : false;
762
+ $this->cache_key = md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
763
+
764
+ $edd_plugin_data[ $this->slug ] = $this->api_data;
765
+
766
+ // Set up hooks.
767
+ $this->init();
768
+
769
+ }
770
+
771
+ /**
772
+ * Set up WordPress filters to hook into WP's update process.
773
+ *
774
+ * @uses add_filter()
775
+ *
776
+ * @return void
777
+ */
778
+ public function init() {
779
+
780
+ add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
781
+ add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
782
+ remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10 );
783
+ add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 );
784
+ add_action( 'admin_init', array( $this, 'show_changelog' ) );
785
+
786
+ }
787
+
788
+ /**
789
+ * Check for Updates at the defined API endpoint and modify the update array.
790
+ *
791
+ * This function dives into the update API just when WordPress creates its update array,
792
+ * then adds a custom API call and injects the custom plugin data retrieved from the API.
793
+ * It is reassembled from parts of the native WordPress plugin update code.
794
+ * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
795
+ *
796
+ * @uses api_request()
797
+ *
798
+ * @param array $_transient_data Update array build by WordPress.
799
+ * @return array Modified update array with custom plugin data.
800
+ */
801
+ public function check_update( $_transient_data ) {
802
+
803
+ global $pagenow;
804
+
805
+ if ( ! is_object( $_transient_data ) ) {
806
+ $_transient_data = new stdClass;
807
+ }
808
+
809
+ if ( 'plugins.php' == $pagenow && is_multisite() ) {
810
+ return $_transient_data;
811
+ }
812
+
813
+ if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) {
814
+ return $_transient_data;
815
+ }
816
+
817
+ $version_info = $this->get_cached_version_info();
818
+
819
+ if ( false === $version_info ) {
820
+ $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
821
+
822
+ $this->set_version_info_cache( $version_info );
823
+
824
+ }
825
+
826
+ if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
827
+
828
+ if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
829
+
830
+ $_transient_data->response[ $this->name ] = $version_info;
831
+
832
+ }
833
+
834
+ $_transient_data->last_checked = current_time( 'timestamp' );
835
+ $_transient_data->checked[ $this->name ] = $this->version;
836
+
837
+ }
838
+
839
+ return $_transient_data;
840
+ }
841
+
842
+ /**
843
+ * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise!
844
+ *
845
+ * @param string $file
846
+ * @param array $plugin
847
+ */
848
+ public function show_update_notification( $file, $plugin ) {
849
+
850
+ if ( is_network_admin() ) {
851
+ return;
852
+ }
853
+
854
+ if( ! current_user_can( 'update_plugins' ) ) {
855
+ return;
856
+ }
857
+
858
+ if( ! is_multisite() ) {
859
+ return;
860
+ }
861
+
862
+ if ( $this->name != $file ) {
863
+ return;
864
+ }
865
+
866
+ // Remove our filter on the site transient
867
+ remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 );
868
+
869
+ $update_cache = get_site_transient( 'update_plugins' );
870
+
871
+ $update_cache = is_object( $update_cache ) ? $update_cache : new stdClass();
872
+
873
+ if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) {
874
+
875
+ $version_info = $this->get_cached_version_info();
876
+
877
+ if ( false === $version_info ) {
878
+ $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
879
+
880
+ $this->set_version_info_cache( $version_info );
881
+ }
882
+
883
+ if ( ! is_object( $version_info ) ) {
884
+ return;
885
+ }
886
+
887
+ if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
888
+
889
+ $update_cache->response[ $this->name ] = $version_info;
890
+
891
+ }
892
+
893
+ $update_cache->last_checked = current_time( 'timestamp' );
894
+ $update_cache->checked[ $this->name ] = $this->version;
895
+
896
+ set_site_transient( 'update_plugins', $update_cache );
897
+
898
+ } else {
899
+
900
+ $version_info = $update_cache->response[ $this->name ];
901
+
902
+ }
903
+
904
+ // Restore our filter
905
+ add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
906
+
907
+ if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) {
908
+
909
+ // build a plugin list row, with update notification
910
+ $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
911
+ # <tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange">
912
+ echo '<tr class="plugin-update-tr" id="' . $this->slug . '-update" data-slug="' . $this->slug . '" data-plugin="' . $this->slug . '/' . $file . '">';
913
+ echo '<td colspan="3" class="plugin-update colspanchange">';
914
+ echo '<div class="update-message notice inline notice-warning notice-alt">';
915
+
916
+ $changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' );
917
+
918
+ if ( empty( $version_info->download_link ) ) {
919
+ printf(
920
+ __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'easy-digital-downloads' ),
921
+ esc_html( $version_info->name ),
922
+ '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
923
+ esc_html( $version_info->new_version ),
924
+ '</a>'
925
+ );
926
+ } else {
927
+ printf(
928
+ __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'easy-digital-downloads' ),
929
+ esc_html( $version_info->name ),
930
+ '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
931
+ esc_html( $version_info->new_version ),
932
+ '</a>',
933
+ '<a href="' . esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $this->name, 'upgrade-plugin_' . $this->name ) ) .'">',
934
+ '</a>'
935
+ );
936
+ }
937
+
938
+ do_action( "in_plugin_update_message-{$file}", $plugin, $version_info );
939
+
940
+ echo '</div></td></tr>';
941
+ }
942
+ }
943
+
944
+ /**
945
+ * Updates information on the "View version x.x details" page with custom data.
946
+ *
947
+ * @uses api_request()
948
+ *
949
+ * @param mixed $_data
950
+ * @param string $_action
951
+ * @param object $_args
952
+ * @return object $_data
953
+ */
954
+ public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
955
+
956
+ if ( $_action != 'plugin_information' ) {
957
+
958
+ return $_data;
959
+
960
+ }
961
+
962
+ if ( ! isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) {
963
+
964
+ return $_data;
965
+
966
+ }
967
+
968
+ $to_send = array(
969
+ 'slug' => $this->slug,
970
+ 'is_ssl' => is_ssl(),
971
+ 'fields' => array(
972
+ 'banners' => array(),
973
+ 'reviews' => false
974
+ )
975
+ );
976
+
977
+ $cache_key = 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
978
+
979
+ // Get the transient where we store the api request for this plugin for 24 hours
980
+ $edd_api_request_transient = $this->get_cached_version_info( $cache_key );
981
+
982
+ //If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now.
983
+ if ( empty( $edd_api_request_transient ) ) {
984
+
985
+ $api_response = $this->api_request( 'plugin_information', $to_send );
986
+
987
+ // Expires in 3 hours
988
+ $this->set_version_info_cache( $api_response, $cache_key );
989
+
990
+ if ( false !== $api_response ) {
991
+ $_data = $api_response;
992
+ }
993
+
994
+ } else {
995
+ $_data = $edd_api_request_transient;
996
+ }
997
+
998
+ // Convert sections into an associative array, since we're getting an object, but Core expects an array.
999
+ if ( isset( $_data->sections ) && ! is_array( $_data->sections ) ) {
1000
+ $new_sections = array();
1001
+ foreach ( $_data->sections as $key => $value ) {
1002
+ $new_sections[ $key ] = $value;
1003
+ }
1004
+
1005
+ $_data->sections = $new_sections;
1006
+ }
1007
+
1008
+ // Convert banners into an associative array, since we're getting an object, but Core expects an array.
1009
+ if ( isset( $_data->banners ) && ! is_array( $_data->banners ) ) {
1010
+ $new_banners = array();
1011
+ foreach ( $_data->banners as $key => $value ) {
1012
+ $new_banners[ $key ] = $value;
1013
+ }
1014
+
1015
+ $_data->banners = $new_banners;
1016
+ }
1017
+
1018
+ return $_data;
1019
+ }
1020
+
1021
+ /**
1022
+ * Disable SSL verification in order to prevent download update failures
1023
+ *
1024
+ * @param array $args
1025
+ * @param string $url
1026
+ * @return object $array
1027
+ */
1028
+ public function http_request_args( $args, $url ) {
1029
+ // If it is an https request and we are performing a package download, disable ssl verification
1030
+ if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
1031
+ $args['sslverify'] = false;
1032
+ }
1033
+ return $args;
1034
+ }
1035
+
1036
+ /**
1037
+ * Calls the API and, if successfull, returns the object delivered by the API.
1038
+ *
1039
+ * @uses get_bloginfo()
1040
+ * @uses wp_remote_post()
1041
+ * @uses is_wp_error()
1042
+ *
1043
+ * @param string $_action The requested action.
1044
+ * @param array $_data Parameters for the API action.
1045
+ * @return false|object
1046
+ */
1047
+ private function api_request( $_action, $_data ) {
1048
+
1049
+ global $wp_version;
1050
+
1051
+ $data = array_merge( $this->api_data, $_data );
1052
+
1053
+ if ( $data['slug'] != $this->slug ) {
1054
+ return;
1055
+ }
1056
+
1057
+ if( $this->api_url == trailingslashit (home_url() ) ) {
1058
+ return false; // Don't allow a plugin to ping itself
1059
+ }
1060
+
1061
+ $api_params = array(
1062
+ 'edd_action' => 'get_version',
1063
+ 'license' => ! empty( $data['license'] ) ? $data['license'] : '',
1064
+ 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
1065
+ 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
1066
+ 'version' => isset( $data['version'] ) ? $data['version'] : false,
1067
+ 'slug' => $data['slug'],
1068
+ 'author' => $data['author'],
1069
+ 'url' => home_url(),
1070
+ 'beta' => ! empty( $data['beta'] ),
1071
+ );
1072
+
1073
+ $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
1074
+
1075
+ if ( ! is_wp_error( $request ) ) {
1076
+ $request = json_decode( wp_remote_retrieve_body( $request ) );
1077
+ }
1078
+
1079
+ if ( $request && isset( $request->sections ) ) {
1080
+ $request->sections = maybe_unserialize( $request->sections );
1081
+ } else {
1082
+ $request = false;
1083
+ }
1084
+
1085
+ if ( $request && isset( $request->banners ) ) {
1086
+ $request->banners = maybe_unserialize( $request->banners );
1087
+ }
1088
+
1089
+ if( ! empty( $request->sections ) ) {
1090
+ foreach( $request->sections as $key => $section ) {
1091
+ $request->$key = (array) $section;
1092
+ }
1093
+ }
1094
+
1095
+ return $request;
1096
+ }
1097
+
1098
+ public function show_changelog() {
1099
+
1100
+ global $edd_plugin_data;
1101
+
1102
+ if( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action'] ) {
1103
+ return;
1104
+ }
1105
+
1106
+ if( empty( $_REQUEST['plugin'] ) ) {
1107
+ return;
1108
+ }
1109
+
1110
+ if( empty( $_REQUEST['slug'] ) ) {
1111
+ return;
1112
+ }
1113
+
1114
+ if( ! current_user_can( 'update_plugins' ) ) {
1115
+ wp_die( __( 'You do not have permission to install plugin updates', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
1116
+ }
1117
+
1118
+ $data = $edd_plugin_data[ $_REQUEST['slug'] ];
1119
+ $beta = ! empty( $data['beta'] ) ? true : false;
1120
+ $cache_key = md5( 'edd_plugin_' . sanitize_key( $_REQUEST['plugin'] ) . '_' . $beta . '_version_info' );
1121
+ $version_info = $this->get_cached_version_info( $cache_key );
1122
+
1123
+ if( false === $version_info ) {
1124
+
1125
+ $api_params = array(
1126
+ 'edd_action' => 'get_version',
1127
+ 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
1128
+ 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
1129
+ 'slug' => $_REQUEST['slug'],
1130
+ 'author' => $data['author'],
1131
+ 'url' => home_url(),
1132
+ 'beta' => ! empty( $data['beta'] )
1133
+ );
1134
+
1135
+ $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
1136
+
1137
+ if ( ! is_wp_error( $request ) ) {
1138
+ $version_info = json_decode( wp_remote_retrieve_body( $request ) );
1139
+ }
1140
+
1141
+
1142
+ if ( ! empty( $version_info ) && isset( $version_info->sections ) ) {
1143
+ $version_info->sections = maybe_unserialize( $version_info->sections );
1144
+ } else {
1145
+ $version_info = false;
1146
+ }
1147
+
1148
+ if( ! empty( $version_info ) ) {
1149
+ foreach( $version_info->sections as $key => $section ) {
1150
+ $version_info->$key = (array) $section;
1151
+ }
1152
+ }
1153
+
1154
+ $this->set_version_info_cache( $version_info, $cache_key );
1155
+
1156
+ }
1157
+
1158
+ if( ! empty( $version_info ) && isset( $version_info->sections['changelog'] ) ) {
1159
+ echo '<div style="background:#fff;padding:10px;">' . $version_info->sections['changelog'] . '</div>';
1160
+ }
1161
+
1162
+ exit;
1163
+ }
1164
+
1165
+ public function get_cached_version_info( $cache_key = '' ) {
1166
+
1167
+ if( empty( $cache_key ) ) {
1168
+ $cache_key = $this->cache_key;
1169
+ }
1170
+
1171
+ $cache = get_option( $cache_key );
1172
+
1173
+ if( empty( $cache['timeout'] ) || current_time( 'timestamp' ) > $cache['timeout'] ) {
1174
+ return false; // Cache is expired
1175
+ }
1176
+
1177
+ return json_decode( $cache['value'] );
1178
+
1179
+ }
1180
+
1181
+ public function set_version_info_cache( $value = '', $cache_key = '' ) {
1182
+
1183
+ if( empty( $cache_key ) ) {
1184
+ $cache_key = $this->cache_key;
1185
+ }
1186
+
1187
+ $data = array(
1188
+ 'timeout' => strtotime( '+3 hours', current_time( 'timestamp' ) ),
1189
+ 'value' => json_encode( $value )
1190
+ );
1191
+
1192
+ update_option( $cache_key, $data );
1193
+
1194
+ }
1195
+
1196
+ }
1197
+
1198
  endif;
includes/functions.php CHANGED
@@ -1,308 +1,303 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Return the team members in their correct order.
7
- *
8
- * @param bool $limit The limit for the number of members to return.
9
- * @param string|bool $group The category that the team members should belong to.
10
- * @return \WP_Query The team member's query.
11
- * @since 4.0.0
12
- */
13
- function get_members_in_order( $limit = null, $group = false ) {
14
-
15
- if ( is_null( $limit ) ) {
16
- $limit = get_option( Options::DISPLAY_LIMIT );
17
- }
18
-
19
- $args = array(
20
- 'post_type' => 'team_member',
21
- 'posts_per_page' => empty( $limit ) || strtolower( $limit == 'all' ) ? -1 : $limit,
22
- 'meta_key' => 'sc_member_order',
23
- 'orderby' => 'meta_value_num',
24
- 'order' => 'ASC',
25
- );
26
-
27
- if( !empty( $group ) ) {
28
-
29
- $args['tax_query'] = array(
30
- 'relation' => 'OR',
31
- array(
32
- 'taxonomy' => 'team_member_position',
33
- 'field' => 'name',
34
- 'terms' => $group
35
- ),
36
- array(
37
- 'taxonomy' => 'team_member_position',
38
- 'field' => 'slug',
39
- 'terms' => $group
40
- ),
41
- array(
42
- 'taxonomy' => 'team_member_position',
43
- 'field' => 'term_id',
44
- 'terms' => array_map(function ($g) { return absint($g); }, $group)
45
- )
46
- );
47
-
48
- }
49
-
50
- return new \WP_Query( $args );
51
-
52
- }
53
-
54
-
55
- /**
56
- * Returns the link to a member's avatar or a generic default if one is not set.
57
- *
58
- * @param int|\WP_Post|null $member The team member.
59
- * @param string $size The size of the thumbnail.
60
- * @return string The URL of the avatar image.
61
- * @since 4.0.0
62
- */
63
- function get_member_avatar( $member = null, $size = 'post-thumbnail' ) {
64
-
65
- $url = get_the_post_thumbnail_url( $member, $size );
66
-
67
- if( !$url ) {
68
- $url = asset( 'images/default-avatar.png' );
69
- }
70
-
71
- return apply_filters( 'ots_member_avatar', $url, $member );
72
-
73
- }
74
-
75
-
76
- /**
77
- * Outputs a member's avatar as a post thumbnail
78
- *
79
- * @param int|\WP_Post|null $member The team member.
80
- * @param string|array $size The size of the thumbnail, can be array( width, height ).
81
- * @since 4.0.0
82
- */
83
- function member_avatar( $member = null, $size = 'large' ) {
84
-
85
- if( has_post_thumbnail( $member ) ) {
86
- the_post_thumbnail( $size );
87
- } else {
88
-
89
- $img = '<img src="%s" class="attachment-medium wp-post-image" width="%s" height="%s" />';
90
-
91
- printf( $img, asset( 'images/default-avatar.png' ),
92
- is_array( $size ) ? $size[0] : '',
93
- is_array( $size ) ? $size[1] : ''
94
- );
95
-
96
- }
97
-
98
- }
99
-
100
-
101
- /**
102
- * Sanitizes the display limit setting.
103
- *
104
- * @private
105
- * @param $value
106
- * @return int
107
- * @since 4.0.0
108
- */
109
- function sanitize_display_limit( $value ) {
110
-
111
- if( $value === 'all' || is_null( $value ) ) {
112
- return $value;
113
- } else if( intval( $value ) < 1 ) {
114
- return get_option( Options::DISPLAY_LIMIT );
115
- }
116
-
117
- return $value;
118
- }
119
-
120
-
121
- /**
122
- * Sanitize a checkbox to either be on or off.
123
- *
124
- * @param $value
125
- * @return bool
126
- * @since 4.0.0
127
- */
128
- function sanitize_checkbox( $value ) {
129
-
130
- if( !empty( $value ) && ( $value !== 'on' && $value !== 'off' ) ) {
131
- return false;
132
- }
133
-
134
- return $value;
135
-
136
- }
137
-
138
-
139
- /**
140
- * Sanitizes the single template setting.
141
- *
142
- * @private
143
- * @param $template
144
- * @return string
145
- * @since 4.0.0
146
- */
147
- function sanitize_template( $template ) {
148
-
149
- if( !array_key_exists( $template, get_templates() ) ) {
150
- $template = get_option( Options::TEMPLATE );
151
- }
152
-
153
- return $template;
154
-
155
- }
156
-
157
-
158
- /**
159
- * Sanitizes the single template setting.
160
- *
161
- * @private
162
- * @param $template
163
- * @return string
164
- * @since 4.0.0
165
- */
166
- function sanitize_single_template( $template ) {
167
-
168
- if( !array_key_exists( $template, get_single_templates() ) ) {
169
- $template = get_option( Options::SINGLE_TEMPLATE );
170
- }
171
-
172
- return $template;
173
-
174
- }
175
-
176
-
177
- /**
178
- * Returns a list of registered template slugs.
179
- *
180
- * @return array The template options.
181
- * @since 4.0.0
182
- */
183
- function get_templates() {
184
-
185
- $templates = array(
186
- 'grid' => __( 'Grid - Boxes', 'ots' ),
187
- 'grid_circles' => __( 'Grid - Circles', 'ots' ),
188
- 'grid_circles2' => __( 'Grid - Circles 2', 'ots' )
189
- );
190
-
191
- return apply_filters( 'ots_templates', $templates );
192
-
193
- }
194
-
195
-
196
- /**
197
- * Returns a list of registered single template slugs.
198
- *
199
- * @return array The template options.
200
- * @since 4.0.0
201
- */
202
- function get_single_templates() {
203
-
204
- $templates = array(
205
- 'standard' => __( 'Theme Default', 'ots' ),
206
- 'disable' => __( 'Disabled', 'ots' )
207
- );
208
-
209
- return apply_filters( 'ots_single_templates', $templates );
210
-
211
- }
212
-
213
- /**
214
- * Get all articles for a member.
215
- *
216
- * @param null|int|\WP_Post $member The team member.
217
- * @return array The article IDs.
218
- * @since 4.0.0
219
- */
220
- function get_member_articles( $member = null ) {
221
-
222
- $member = get_post( $member );
223
- $articles = array();
224
-
225
- for( $ctr = 1; $ctr < 4; $ctr++ ) {
226
-
227
- $article = get_post_meta( $member->ID, "team_member_article$ctr", true );
228
-
229
- if( !empty( $article ) ) {
230
-
231
- $post = get_post( $article );
232
-
233
- if ( !empty( $post ) ) {
234
- $articles[] = $post;
235
- }
236
-
237
- }
238
-
239
- }
240
-
241
- return $articles;
242
-
243
- }
244
-
245
- /**
246
- * Helper factory for instantiating team members.
247
- *
248
- * @param null|int|\WP_Post $member
249
- * @return bool|TeamMember
250
- * @since 4.0.0
251
- */
252
- function team_member( $member = null ) {
253
-
254
- $member = get_post( $member );
255
-
256
- if( $member && $member->post_type == 'team_member' ) {
257
- return new TeamMember( $member );
258
- }
259
-
260
- return false;
261
-
262
- }
263
-
264
- /**
265
- * Map an old template slug to its renamed template file.
266
- *
267
- * @param string $slug The slug of the template.
268
- * @return string The mapped name if found, else the value of $slug.
269
- * @since 4.0.0
270
- */
271
- function map_template( $slug ) {
272
-
273
- $templates = array(
274
- 'grid_circles' => 'grid-circles.php',
275
- 'grid_circles2' => 'grid-circles-2.php'
276
- );
277
-
278
- if( array_key_exists( $slug, $templates ) ) {
279
- $slug = $templates[ $slug ];
280
- }
281
-
282
- return $slug;
283
-
284
- }
285
-
286
-
287
- /**
288
- * Get an associative array of team member groups.
289
- *
290
- * @param string $key_field
291
- *
292
- * @since 4.0.0
293
- * @return array
294
- */
295
- function get_groups( $key_field = 'term_id' ) {
296
- $args = array(
297
- 'taxonomy' => 'team_member_position',
298
- 'hide_empty' => false
299
- );
300
-
301
- $groups = array();
302
-
303
- foreach( get_terms( $args ) as $term ) {
304
- $groups[ $term->{ $key_field } ] = $term->name;
305
- }
306
-
307
- return $groups;
308
- }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Return the team members in their correct order.
7
+ *
8
+ * @param bool $limit The limit for the number of members to return.
9
+ * @param string|bool $group The category that the team members should belong to.
10
+ * @return \WP_Query The team member's query.
11
+ * @since 4.0.0
12
+ */
13
+ function get_members_in_order( $limit = null, $group = false ) {
14
+
15
+ if ( is_null( $limit ) ) {
16
+ $limit = get_option( Options::DISPLAY_LIMIT );
17
+ }
18
+
19
+ $args = array(
20
+ 'post_type' => 'team_member',
21
+ 'posts_per_page' => empty( $limit ) || strtolower( $limit == 'all' ) ? -1 : $limit,
22
+ 'meta_key' => 'sc_member_order',
23
+ 'orderby' => 'meta_value_num',
24
+ 'order' => 'ASC',
25
+ );
26
+
27
+ if( !empty( $group ) ) {
28
+ $group = (array) $group;
29
+
30
+ if ( is_int( $group[0] ) ) {
31
+ $args['tax_query'][] = array(
32
+ 'taxonomy' => 'team_member_position',
33
+ 'field' => 'term_id',
34
+ 'terms' => array_map(function ($g) { return absint($g); }, $group)
35
+ );
36
+
37
+ } else {
38
+ $args['tax_query'][] = array(
39
+ 'taxonomy' => 'team_member_position',
40
+ 'field' => 'slug',
41
+ 'terms' => $group
42
+ );
43
+ }
44
+ }
45
+
46
+ return new \WP_Query( $args );
47
+ }
48
+
49
+
50
+ /**
51
+ * Returns the link to a member's avatar or a generic default if one is not set.
52
+ *
53
+ * @param int|\WP_Post|null $member The team member.
54
+ * @param string $size The size of the thumbnail.
55
+ * @return string The URL of the avatar image.
56
+ * @since 4.0.0
57
+ */
58
+ function get_member_avatar( $member = null, $size = 'post-thumbnail' ) {
59
+
60
+ $url = get_the_post_thumbnail_url( $member, $size );
61
+
62
+ if( !$url ) {
63
+ $url = asset( 'images/default-avatar.png' );
64
+ }
65
+
66
+ return apply_filters( 'ots_member_avatar', $url, $member );
67
+
68
+ }
69
+
70
+
71
+ /**
72
+ * Outputs a member's avatar as a post thumbnail
73
+ *
74
+ * @param int|\WP_Post|null $member The team member.
75
+ * @param string|array $size The size of the thumbnail, can be array( width, height ).
76
+ * @since 4.0.0
77
+ */
78
+ function member_avatar( $member = null, $size = 'large' ) {
79
+
80
+ if( has_post_thumbnail( $member ) ) {
81
+ the_post_thumbnail( $size );
82
+ } else {
83
+
84
+ $img = '<img src="%s" class="attachment-medium wp-post-image" width="%s" height="%s" />';
85
+
86
+ printf( $img, asset( 'images/default-avatar.png' ),
87
+ is_array( $size ) ? $size[0] : '',
88
+ is_array( $size ) ? $size[1] : ''
89
+ );
90
+
91
+ }
92
+
93
+ }
94
+
95
+
96
+ /**
97
+ * Sanitizes the display limit setting.
98
+ *
99
+ * @private
100
+ * @param $value
101
+ * @return int
102
+ * @since 4.0.0
103
+ */
104
+ function sanitize_display_limit( $value ) {
105
+
106
+ if( $value === 'all' || is_null( $value ) ) {
107
+ return $value;
108
+ } else if( intval( $value ) < 1 ) {
109
+ return get_option( Options::DISPLAY_LIMIT );
110
+ }
111
+
112
+ return $value;
113
+ }
114
+
115
+
116
+ /**
117
+ * Sanitize a checkbox to either be on or off.
118
+ *
119
+ * @param $value
120
+ * @return bool
121
+ * @since 4.0.0
122
+ */
123
+ function sanitize_checkbox( $value ) {
124
+
125
+ if( !empty( $value ) && ( $value !== 'on' && $value !== 'off' ) ) {
126
+ return false;
127
+ }
128
+
129
+ return $value;
130
+
131
+ }
132
+
133
+
134
+ /**
135
+ * Sanitizes the single template setting.
136
+ *
137
+ * @private
138
+ * @param $template
139
+ * @return string
140
+ * @since 4.0.0
141
+ */
142
+ function sanitize_template( $template ) {
143
+
144
+ if( !array_key_exists( $template, get_templates() ) ) {
145
+ $template = get_option( Options::TEMPLATE );
146
+ }
147
+
148
+ return $template;
149
+
150
+ }
151
+
152
+
153
+ /**
154
+ * Sanitizes the single template setting.
155
+ *
156
+ * @private
157
+ * @param $template
158
+ * @return string
159
+ * @since 4.0.0
160
+ */
161
+ function sanitize_single_template( $template ) {
162
+
163
+ if( !array_key_exists( $template, get_single_templates() ) ) {
164
+ $template = get_option( Options::SINGLE_TEMPLATE );
165
+ }
166
+
167
+ return $template;
168
+
169
+ }
170
+
171
+
172
+ /**
173
+ * Returns a list of registered template slugs.
174
+ *
175
+ * @return array The template options.
176
+ * @since 4.0.0
177
+ */
178
+ function get_templates() {
179
+
180
+ $templates = array(
181
+ 'grid' => __( 'Grid - Boxes', 'ots' ),
182
+ 'grid_circles' => __( 'Grid - Circles', 'ots' ),
183
+ 'grid_circles2' => __( 'Grid - Circles 2', 'ots' )
184
+ );
185
+
186
+ return apply_filters( 'ots_templates', $templates );
187
+
188
+ }
189
+
190
+
191
+ /**
192
+ * Returns a list of registered single template slugs.
193
+ *
194
+ * @return array The template options.
195
+ * @since 4.0.0
196
+ */
197
+ function get_single_templates() {
198
+
199
+ $templates = array(
200
+ 'standard' => __( 'Theme Default', 'ots' ),
201
+ 'disable' => __( 'Disabled', 'ots' )
202
+ );
203
+
204
+ return apply_filters( 'ots_single_templates', $templates );
205
+
206
+ }
207
+
208
+ /**
209
+ * Get all articles for a member.
210
+ *
211
+ * @param null|int|\WP_Post $member The team member.
212
+ * @return array The article IDs.
213
+ * @since 4.0.0
214
+ */
215
+ function get_member_articles( $member = null ) {
216
+
217
+ $member = get_post( $member );
218
+ $articles = array();
219
+
220
+ for( $ctr = 1; $ctr < 4; $ctr++ ) {
221
+
222
+ $article = get_post_meta( $member->ID, "team_member_article$ctr", true );
223
+
224
+ if( !empty( $article ) ) {
225
+
226
+ $post = get_post( $article );
227
+
228
+ if ( !empty( $post ) ) {
229
+ $articles[] = $post;
230
+ }
231
+
232
+ }
233
+
234
+ }
235
+
236
+ return $articles;
237
+
238
+ }
239
+
240
+ /**
241
+ * Helper factory for instantiating team members.
242
+ *
243
+ * @param null|int|\WP_Post $member
244
+ * @return bool|TeamMember
245
+ * @since 4.0.0
246
+ */
247
+ function team_member( $member = null ) {
248
+
249
+ $member = get_post( $member );
250
+
251
+ if( $member && $member->post_type == 'team_member' ) {
252
+ return new TeamMember( $member );
253
+ }
254
+
255
+ return false;
256
+
257
+ }
258
+
259
+ /**
260
+ * Map an old template slug to its renamed template file.
261
+ *
262
+ * @param string $slug The slug of the template.
263
+ * @return string The mapped name if found, else the value of $slug.
264
+ * @since 4.0.0
265
+ */
266
+ function map_template( $slug ) {
267
+
268
+ $templates = array(
269
+ 'grid_circles' => 'grid-circles.php',
270
+ 'grid_circles2' => 'grid-circles-2.php'
271
+ );
272
+
273
+ if( array_key_exists( $slug, $templates ) ) {
274
+ $slug = $templates[ $slug ];
275
+ }
276
+
277
+ return $slug;
278
+
279
+ }
280
+
281
+
282
+ /**
283
+ * Get an associative array of team member groups.
284
+ *
285
+ * @param string $key_field
286
+ *
287
+ * @since 4.0.0
288
+ * @return array
289
+ */
290
+ function get_groups( $key_field = 'term_id' ) {
291
+ $args = array(
292
+ 'taxonomy' => 'team_member_position',
293
+ 'hide_empty' => false
294
+ );
295
+
296
+ $groups = array();
297
+
298
+ foreach( get_terms( $args ) as $term ) {
299
+ $groups[ $term->{ $key_field } ] = $term->name;
300
+ }
301
+
302
+ return $groups;
303
+ }
 
 
 
 
 
includes/helpers.php CHANGED
@@ -1,175 +1,175 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Convenience method to generate a dropdown of posts.
7
- *
8
- * @param $name
9
- * @param string $id
10
- * @param string $selected
11
- * @param string|array $post_type
12
- * @since 4.0.0
13
- */
14
- function posts_dropdown( $name, $id = '', $selected = '', $post_type = 'post' ) {
15
-
16
- $posts = get_posts( array(
17
- 'post_type' => $post_type,
18
- 'posts_per_page' => -1
19
- ) );
20
-
21
- echo '<select id="' . esc_attr( $id ) . '" name="' . esc_attr( $name ) . '" class="regular-text">';
22
-
23
- echo '<option value="">' . __( 'Select an article', 'ots' ). '</option>';
24
-
25
- foreach( $posts as $post ) {
26
- echo '<option value="' . esc_attr( $post->ID ) . '" ' . selected( $post->ID, $selected, false ) . '>' . esc_html( $post->post_title ) . '</option>';
27
- }
28
-
29
- echo '</select>';
30
-
31
- }
32
-
33
-
34
- /**
35
- * Prints an array as attributes where key = " attributes ".
36
- *
37
- * @param array $attrs A mixed array off arrays and strings.
38
- * @param boolean $echo Whether to echo the rendered output.
39
- * @return string The rendered output.
40
- * @since 4.0.0
41
- */
42
- function print_attrs( array $attrs, $echo = true ) {
43
-
44
- $html = '';
45
-
46
- foreach( $attrs as $attr => $values ) {
47
- $html .= ' ' . $attr . '="' . ( is_array( $values ) ? implode( ' ', $values ) : $values ) . '" ';
48
- }
49
-
50
- if( $echo ) {
51
- echo $html;
52
- }
53
-
54
- return $html;
55
-
56
- }
57
-
58
-
59
- /**
60
- * Builds a single social link icon.
61
- *
62
- * @param string $link URL for the link's href.
63
- * @param string $icon URL of the icon to use for the links.
64
- * @param array $attrs An array of attributes.
65
- * @param string $before Html to print before each <img> tag.
66
- * @param string $after Html to print after each <img> tag.
67
- * @return string The HTML for the link.
68
- * @since 4.0.0
69
- */
70
- function social_link( $link, $icon = '', $attrs = array(), $before = '', $after = '' ) {
71
-
72
- // See if we're opening links in a new tab
73
- $target = get_option( Options::SOCIAL_LINK_ACTION ) == 'on' ? '_blank' : false;
74
-
75
- $html = '<a ' . print_attrs( $attrs, false ) . ' ' . ( $target ? 'target="' . $target .'"' : '' ) . ' href="' . $link . '">' . $before;
76
-
77
- if( $icon ) {
78
- $html .= '<img src="' . esc_url( $icon ) . '"/>';
79
- }
80
-
81
- $html .= $after . '</a>';
82
-
83
- return $html;
84
-
85
- }
86
-
87
-
88
- /**
89
- * Loops through a team member's social links and outputs them if they are not empty.
90
- *
91
- * @param \WP_Post|null $member
92
- * @param string $before HTML to display before the link.
93
- * @param string $after HTML to display after the link.
94
- * @since 4.0.0
95
- */
96
- function do_member_social_links( \WP_Post $member = null, $before ='', $after = '' ) {
97
-
98
- $member = get_post( $member );
99
- $other = get_post_meta( $member->ID, 'team_member_other_icon', true );
100
-
101
- $links = array(
102
- 'facebook' => array( '', asset( 'images/social/facebook.png' ) ),
103
- 'twitter' => array( '', asset( 'images/social/twitter.png' ) ),
104
- 'linkedin' => array( '', asset( 'images/social/linkedin.png' ) ),
105
- 'gplus' => array( '', asset( 'images/social/gplus.png' ) ),
106
- 'email' => array( 'mailto:', asset( 'images/social/email.png' ) ),
107
- 'phone' => array( 'tel:', asset( 'images/social/phone.png' ) ),
108
- 'pinterest' => array( '', asset( 'images/social/pinterest.png' ) ),
109
- 'instagram' => array( '', asset( 'images/social/instagram.png' ) ),
110
- 'website' => array( '', asset( 'images/social/website.png' ) ),
111
- );
112
-
113
- if ( !empty( $other ) ) {
114
- $links['other'] = array( '', asset( 'images/social/' . $other . '.png' ) );
115
- }
116
-
117
- $rendered = '';
118
-
119
- foreach( $links as $meta_key => $data ) {
120
-
121
- $link = get_post_meta( $member->ID, "team_member_$meta_key", true );
122
-
123
- if( !empty( $link ) ) {
124
- $rendered .= $before . social_link( $data[0] . $link, $data[1], array( 'class' => 'sc_social' ) ) . $after;
125
- }
126
-
127
- }
128
-
129
- echo apply_filters( 'ots_parse_social_links', $rendered, $member );
130
-
131
- }
132
-
133
-
134
- function member_groups( $member = null, $separator = ' - ', $echo = true ) {
135
-
136
- $member = team_member( $member );
137
- $str = '';
138
-
139
- if ( $member ) {
140
-
141
- $groups = $member->get_groups();
142
-
143
- if ( !empty( $groups ) ) {
144
-
145
- foreach ( $groups as $group ) {
146
- $str .= $group->name . $separator;
147
- }
148
-
149
- $str = rtrim( $str, $separator );
150
-
151
- if ( $echo ) {
152
- esc_html_e( $str );
153
- }
154
-
155
- }
156
-
157
- }
158
-
159
- return $str;
160
-
161
- }
162
-
163
- /**
164
- *
165
- * Returns overide file from theme
166
- *
167
- * @since 4.3.3
168
- * @param String $file
169
- * @return String
170
- */
171
- function get_theme_override( $file ) {
172
-
173
- return( get_stylesheet_directory() . '/team-template-' . $file );
174
-
175
  }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Convenience method to generate a dropdown of posts.
7
+ *
8
+ * @param $name
9
+ * @param string $id
10
+ * @param string $selected
11
+ * @param string|array $post_type
12
+ * @since 4.0.0
13
+ */
14
+ function posts_dropdown( $name, $id = '', $selected = '', $post_type = 'post' ) {
15
+
16
+ $posts = get_posts( array(
17
+ 'post_type' => $post_type,
18
+ 'posts_per_page' => -1
19
+ ) );
20
+
21
+ echo '<select id="' . esc_attr( $id ) . '" name="' . esc_attr( $name ) . '" class="regular-text">';
22
+
23
+ echo '<option value="">' . __( 'Select an article', 'ots' ). '</option>';
24
+
25
+ foreach( $posts as $post ) {
26
+ echo '<option value="' . esc_attr( $post->ID ) . '" ' . selected( $post->ID, $selected, false ) . '>' . esc_html( $post->post_title ) . '</option>';
27
+ }
28
+
29
+ echo '</select>';
30
+
31
+ }
32
+
33
+
34
+ /**
35
+ * Prints an array as attributes where key = " attributes ".
36
+ *
37
+ * @param array $attrs A mixed array off arrays and strings.
38
+ * @param boolean $echo Whether to echo the rendered output.
39
+ * @return string The rendered output.
40
+ * @since 4.0.0
41
+ */
42
+ function print_attrs( array $attrs, $echo = true ) {
43
+
44
+ $html = '';
45
+
46
+ foreach( $attrs as $attr => $values ) {
47
+ $html .= ' ' . $attr . '="' . ( is_array( $values ) ? implode( ' ', $values ) : $values ) . '" ';
48
+ }
49
+
50
+ if( $echo ) {
51
+ echo $html;
52
+ }
53
+
54
+ return $html;
55
+
56
+ }
57
+
58
+
59
+ /**
60
+ * Builds a single social link icon.
61
+ *
62
+ * @param string $link URL for the link's href.
63
+ * @param string $icon URL of the icon to use for the links.
64
+ * @param array $attrs An array of attributes.
65
+ * @param string $before Html to print before each <img> tag.
66
+ * @param string $after Html to print after each <img> tag.
67
+ * @return string The HTML for the link.
68
+ * @since 4.0.0
69
+ */
70
+ function social_link( $link, $icon = '', $attrs = array(), $before = '', $after = '' ) {
71
+
72
+ // See if we're opening links in a new tab
73
+ $target = get_option( Options::SOCIAL_LINK_ACTION ) == 'on' ? '_blank' : false;
74
+
75
+ $html = '<a ' . print_attrs( $attrs, false ) . ' ' . ( $target ? 'target="' . $target .'"' : '' ) . ' href="' . $link . '">' . $before;
76
+
77
+ if( $icon ) {
78
+ $html .= '<img src="' . esc_url( $icon ) . '"/>';
79
+ }
80
+
81
+ $html .= $after . '</a>';
82
+
83
+ return $html;
84
+
85
+ }
86
+
87
+
88
+ /**
89
+ * Loops through a team member's social links and outputs them if they are not empty.
90
+ *
91
+ * @param \WP_Post|null $member
92
+ * @param string $before HTML to display before the link.
93
+ * @param string $after HTML to display after the link.
94
+ * @since 4.0.0
95
+ */
96
+ function do_member_social_links( \WP_Post $member = null, $before ='', $after = '' ) {
97
+
98
+ $member = get_post( $member );
99
+ $other = get_post_meta( $member->ID, 'team_member_other_icon', true );
100
+
101
+ $links = array(
102
+ 'facebook' => array( '', asset( 'images/social/facebook.png' ) ),
103
+ 'twitter' => array( '', asset( 'images/social/twitter.png' ) ),
104
+ 'linkedin' => array( '', asset( 'images/social/linkedin.png' ) ),
105
+ 'gplus' => array( '', asset( 'images/social/gplus.png' ) ),
106
+ 'email' => array( 'mailto:', asset( 'images/social/email.png' ) ),
107
+ 'phone' => array( 'tel:', asset( 'images/social/phone.png' ) ),
108
+ 'pinterest' => array( '', asset( 'images/social/pinterest.png' ) ),
109
+ 'instagram' => array( '', asset( 'images/social/instagram.png' ) ),
110
+ 'website' => array( '', asset( 'images/social/website.png' ) ),
111
+ );
112
+
113
+ if ( !empty( $other ) ) {
114
+ $links['other'] = array( '', asset( 'images/social/' . $other . '.png' ) );
115
+ }
116
+
117
+ $rendered = '';
118
+
119
+ foreach( $links as $meta_key => $data ) {
120
+
121
+ $link = get_post_meta( $member->ID, "team_member_$meta_key", true );
122
+
123
+ if( !empty( $link ) ) {
124
+ $rendered .= $before . social_link( $data[0] . $link, $data[1], array( 'class' => 'sc_social' ) ) . $after;
125
+ }
126
+
127
+ }
128
+
129
+ echo apply_filters( 'ots_parse_social_links', $rendered, $member );
130
+
131
+ }
132
+
133
+
134
+ function member_groups( $member = null, $separator = ' - ', $echo = true ) {
135
+
136
+ $member = team_member( $member );
137
+ $str = '';
138
+
139
+ if ( $member ) {
140
+
141
+ $groups = $member->get_groups();
142
+
143
+ if ( !empty( $groups ) ) {
144
+
145
+ foreach ( $groups as $group ) {
146
+ $str .= $group->name . $separator;
147
+ }
148
+
149
+ $str = rtrim( $str, $separator );
150
+
151
+ if ( $echo ) {
152
+ esc_html_e( $str );
153
+ }
154
+
155
+ }
156
+
157
+ }
158
+
159
+ return $str;
160
+
161
+ }
162
+
163
+ /**
164
+ *
165
+ * Returns overide file from theme
166
+ *
167
+ * @since 4.3.3
168
+ * @param String $file
169
+ * @return String
170
+ */
171
+ function get_theme_override( $file ) {
172
+
173
+ return( get_stylesheet_directory() . '/team-template-' . $file );
174
+
175
  }
includes/libraries/theme-showcase.php ADDED
@@ -0,0 +1,664 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Name: Smartcat Theme Showcase
4
+ * Author: Smartcat
5
+ * Version: 1.0.0
6
+ *
7
+ * @since 1.0.0
8
+ * @package scts
9
+ */
10
+ namespace {
11
+
12
+ /**
13
+ * Initialize the themes showcase
14
+ *
15
+ * @since 1.0.0
16
+ * @return void
17
+ */
18
+ function scts_init() {
19
+ if ( in_array( __FILE__, wp_get_active_and_valid_plugins() ) ) {
20
+ /**
21
+ *
22
+ * Use Home URL if running in plugin mode
23
+ */
24
+ define( 'SCTS_SOURCE_URL', home_url(), true );
25
+
26
+ /**
27
+ * Define plugin mode as active
28
+ */
29
+ define( 'SCTS_PLUGIN_MODE', true, true );
30
+
31
+ /**
32
+ *
33
+ * Load plugin functionality
34
+ */
35
+ add_action( 'plugins_loaded', 'scts\plugin_mode_init' );
36
+
37
+ } else {
38
+ /**
39
+ *
40
+ * Use remote data source in embedded mode
41
+ */
42
+ define( 'SCTS_SOURCE_URL', 'https://smartcatdesign.net', true );
43
+ }
44
+
45
+ if ( !defined( 'SCTS_MENU_POSITION' ) ) {
46
+ define( 'SCTS_MENU_POSITION', 51, true );
47
+ }
48
+
49
+ add_action( 'admin_menu', 'scts\add_admin_menu_page' );
50
+ }
51
+
52
+ if ( defined( 'ABSPATH' ) ) {
53
+ scts_init(); // Check environment early
54
+ }
55
+
56
+ }
57
+
58
+ namespace scts {
59
+
60
+ /**
61
+ * Initialize plugin mode
62
+ *
63
+ * @action plugins_loaded
64
+ *
65
+ * @since 1.0.0
66
+ * @return void
67
+ */
68
+ function plugin_mode_init() {
69
+ add_action( 'init', 'scts\register_theme_post_type' );
70
+ add_action( 'rest_api_init', 'scts\register_rest_fields' );
71
+ add_action( 'save_post_theme', 'scts\save_theme_meta_box' );
72
+ add_action( 'admin_post_scts_refresh', 'scts\handle_refresh' );
73
+ }
74
+
75
+ /**
76
+ * Register the themes post type.
77
+ *
78
+ * @action init
79
+ *
80
+ * @since 1.0.0
81
+ * @return void
82
+ */
83
+ function register_theme_post_type() {
84
+ $labels = array(
85
+ 'name' => _x( 'Themes', 'Post Type General Name' ),
86
+ 'singular_name' => _x( 'Themes', 'Post Type Singular Name' ),
87
+ 'menu_name' => __( 'Theme Showcase' ),
88
+ 'name_admin_bar' => __( 'Theme' ),
89
+ 'archives' => __( 'Theme Archives' ),
90
+ 'parent_item_colon' => __( 'Parent Theme:' ),
91
+ 'all_items' => __( 'All Themes' ),
92
+ 'add_new_item' => __( 'Add New Theme' ),
93
+ 'add_new' => __( 'Add New' ),
94
+ 'new_item' => __( 'New Theme' ),
95
+ 'edit_item' => __( 'Edit Theme' ),
96
+ 'update_item' => __( 'Update Theme' ),
97
+ 'view_item' => __( 'View Theme' ),
98
+ 'search_items' => __( 'Search Themes' ),
99
+ 'not_found' => __( 'Theme Not found' ),
100
+ 'not_found_in_trash' => __( 'Theme Not found in Trash' ),
101
+ 'featured_image' => __( 'Featured Image' ),
102
+ 'set_featured_image' => __( 'Set featured image' ),
103
+ 'remove_featured_image' => __( 'Remove featured image' ),
104
+ 'use_featured_image' => __( 'Use as featured image' ),
105
+ 'insert_into_item' => __( 'Insert into theme' ),
106
+ 'uploaded_to_this_item' => __( 'Uploaded to this theme' ),
107
+ 'items_list' => __( 'Themes list' ),
108
+ 'items_list_navigation' => __( 'Themes list navigation' ),
109
+ 'filter_items_list' => __( 'Filter themes list' )
110
+ );
111
+ $args = array(
112
+ 'labels' => $labels,
113
+ 'description' => __( 'Remotely managed theme showcase' ),
114
+ 'supports' => array( 'editor', 'title', 'thumbnail' ),
115
+ 'hierarchical' => false,
116
+ 'public' => false,
117
+ 'show_ui' => true,
118
+ 'show_in_menu' => true,
119
+ 'menu_icon' => 'dashicons-art',
120
+ 'show_in_admin_bar' => false,
121
+ 'show_in_nav_menus' => false,
122
+ 'can_export' => true,
123
+ 'has_archive' => false,
124
+ 'exclude_from_search' => true,
125
+ 'publicly_queryable' => false,
126
+ 'capability_type' => 'post',
127
+ 'feeds' => null,
128
+ 'show_in_rest' => true,
129
+ 'rest_base' => 'themes',
130
+ 'register_meta_box_cb' => 'scts\add_theme_meta_box'
131
+ );
132
+ register_post_type( 'theme', $args );
133
+ }
134
+
135
+ /**
136
+ * Register custom rest API fields
137
+ *
138
+ * @action rest_api_init
139
+ *
140
+ * @since 1.0.0
141
+ * @return void
142
+ */
143
+ function register_rest_fields() {
144
+ register_rest_field( 'theme', 'shop_url', array(
145
+ 'get_callback' => function( $post ) {
146
+ return (string) get_post_meta( $post['id'], 'scts_shop_url', true );
147
+ },
148
+ 'schema' => array( 'type' => 'string' ),
149
+ ) );
150
+ register_rest_field( 'theme', 'preview_url', array(
151
+ 'get_callback' => function( $post ) {
152
+ return (string) get_post_meta( $post['id'], 'scts_preview_url', true );
153
+ },
154
+ 'schema' => array( 'type' => 'string' ),
155
+ ) );
156
+ register_rest_field( 'theme', 'is_wp_org', array(
157
+ 'get_callback' => function( $post ) {
158
+ return (bool) get_post_meta( $post['id'], 'scts_wp_org', true );
159
+ },
160
+ 'schema' => array( 'type' => 'boolean' ),
161
+ ) );
162
+ register_rest_field( 'theme', 'theme_author', array(
163
+ 'get_callback' => function( $post ) {
164
+ return (string) get_post_meta( $post['id'], 'scts_theme_author', true );
165
+ },
166
+ 'schema' => array( 'type' => 'string' ),
167
+ ) );
168
+ register_rest_field( 'theme', 'screenshot_url', array(
169
+ 'get_callback' => function( $post ) {
170
+ return (string) esc_url( get_the_post_thumbnail_url( $post['id'] ) );
171
+ },
172
+ 'schema' => array( 'type' => 'string' ),
173
+ ) );
174
+ }
175
+
176
+ /**
177
+ * Add theme info metabox
178
+ *
179
+ * @since 1.0.0
180
+ * @return void
181
+ */
182
+ function add_theme_meta_box() {
183
+ add_meta_box( 'scts-theme', __( 'Theme Details' ), 'scts\theme_meta_box' );
184
+ }
185
+
186
+ /**
187
+ * Fetch theme info from the REST API
188
+ *
189
+ * @since 1.0.0
190
+ * @return array
191
+ */
192
+ function fetch_theme_info() {
193
+ $response = wp_remote_get( SCTS_SOURCE_URL . '/wp-json/wp/v2/themes' );
194
+
195
+ if ( wp_remote_retrieve_response_code( $response ) !== 200 ) {
196
+ return array();
197
+ }
198
+ $themes = json_decode( wp_remote_retrieve_body( $response ), true );
199
+
200
+ if ( !empty( $themes ) ) {
201
+ set_transient( 'scts_cache', $themes, 3600 * 24 );
202
+ }
203
+ return $themes;
204
+ }
205
+
206
+ /**
207
+ * Get all available themes
208
+ *
209
+ * @since 1.0.0
210
+ * @return array
211
+ */
212
+ function get_themes() {
213
+ $cached = get_transient( 'scts_cache' );
214
+
215
+ if ( empty( $cached ) ) {
216
+ return fetch_theme_info();
217
+ }
218
+ return $cached;
219
+ }
220
+
221
+ /**
222
+ * Prepare theme selection
223
+ *
224
+ * @since 1.0.0
225
+ * @return array
226
+ */
227
+ function get_prepared_themes() {
228
+ $current = wp_get_theme(); // Get the active theme
229
+ $templates = get_themes();
230
+
231
+ foreach ( $templates as &$theme ) {
232
+ $template = wp_get_theme( $theme['slug'] ); // Get installed template
233
+
234
+ $theme['installed'] = $template->exists();
235
+ $theme['is_active'] = $template->get_template() === $current->get_template();
236
+
237
+ $actions = array(
238
+ 'activate' => null,
239
+ 'install' => null,
240
+ 'customize' => null,
241
+ 'more_info' => null
242
+ );
243
+
244
+ $can_customize = current_user_can( 'customize' ) && current_user_can( 'edit_theme_options' );
245
+ $can_activate = current_user_can( 'switch_themes' );
246
+
247
+ if ( $theme['installed'] && $can_customize ) {
248
+ $args = array(
249
+ 'return' => urlencode( esc_url_raw( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) )
250
+ );
251
+ $actions['customize'] = add_query_arg( $args, wp_customize_url( $theme['slug'] ) );
252
+
253
+ } else if ( current_user_can( 'install_themes' ) && !empty( $theme['is_wp_org'] ) ) {
254
+ $actions['install'] = admin_url( 'theme-install.php?theme=' . $theme['slug'] );
255
+
256
+ }
257
+
258
+ if ( isset( $theme['shop_url'] ) ) {
259
+ $actions['more_info'] = $theme['shop_url'];
260
+ }
261
+
262
+ if ( $theme['installed'] && !$theme['is_active'] && $can_customize && $can_activate ) {
263
+ $actions['activate'] = wp_nonce_url( admin_url( 'themes.php?action=activate&stylesheet=' . urlencode( $theme['slug'] ) ), 'switch-theme_' . $theme['slug'] );
264
+ }
265
+ $theme['actions'] = $actions;
266
+ }
267
+
268
+ return $templates;
269
+ }
270
+
271
+ /**
272
+ * Check to see if running in plugin mode
273
+ *
274
+ * @since 1.0.0
275
+ * @return bool
276
+ */
277
+ function is_plugin() {
278
+ return defined( 'SCTS_PLUGIN_MODE' ) && SCTS_PLUGIN_MODE;
279
+ }
280
+
281
+ /**
282
+ * Add themes menu page
283
+ *
284
+ * @global $menu
285
+ *
286
+ * @action admin_menu
287
+ *
288
+ * @since 1.0.0
289
+ * @return void
290
+ */
291
+ function add_admin_menu_page() {
292
+ global $menu;
293
+
294
+ if ( is_plugin() ) {
295
+ $hook = add_submenu_page(
296
+ 'edit.php?post_type=theme',
297
+ __( 'Preview' ),
298
+ __( 'Preview' ),
299
+ 'edit_posts',
300
+ 'showcase-preview',
301
+ 'scts\themes_page'
302
+ );
303
+ } else {
304
+ $menu[ SCTS_MENU_POSITION ] = array(
305
+ 0 => '',
306
+ 1 => 'read',
307
+ 2 => 'separator' . SCTS_MENU_POSITION,
308
+ 3 => '',
309
+ 4 => 'wp-menu-separator'
310
+ );
311
+ $hook = add_menu_page(
312
+ __( 'Featured Themes' ),
313
+ __( 'Featured Themes' ),
314
+ 'install_themes',
315
+ 'featured-themes',
316
+ 'scts\themes_page',
317
+ 'dashicons-art',
318
+ SCTS_MENU_POSITION
319
+ );
320
+ }
321
+
322
+ add_action("load-$hook", function () {
323
+ wp_enqueue_script( 'wp-util' );
324
+ add_action( 'admin_footer', 'scts\theme_page_js_templates' );
325
+ add_action( 'admin_footer', 'scts\theme_page_inline_styles' );
326
+ add_action( 'admin_footer', 'scts\theme_page_inline_scripts' );
327
+ });
328
+ }
329
+
330
+ /**
331
+ * Handle refresh button
332
+ *
333
+ * @action admin_post_scts_refresh
334
+ *
335
+ * @since 1.0.0
336
+ * @return void
337
+ */
338
+ function handle_refresh() {
339
+ if ( is_plugin() ) {
340
+ delete_transient( 'scts_cache' );
341
+ }
342
+
343
+ wp_safe_redirect( wp_get_referer() );
344
+ }
345
+
346
+ /**
347
+ * Save the theme details meta box
348
+ *
349
+ * @action save_post_theme
350
+ *
351
+ * @param int $post_id
352
+ *
353
+ * @since 1.0.0
354
+ * @return void
355
+ */
356
+ function save_theme_meta_box( $post_id ) {
357
+ if ( !isset( $_POST['scts_nonce'] ) || !wp_verify_nonce( $_POST['scts_nonce'], 'scts_save_meta_box' ) ) {
358
+ return;
359
+ }
360
+
361
+ update_post_meta( $post_id, 'scts_wp_org', !empty( $_POST['scts_wp_org'] ) );
362
+ update_post_meta( $post_id, 'scts_preview_url', esc_url_raw( $_POST['scts_preview_url'] ) );
363
+ update_post_meta( $post_id, 'scts_shop_url', esc_url_raw( $_POST['scts_shop_url'] ) );
364
+ update_post_meta( $post_id, 'scts_theme_author', sanitize_text_field( $_POST['scts_theme_author'] ) );
365
+ }
366
+
367
+ /**
368
+ * Output the theme meta box
369
+ *
370
+ * @param \WP_Post $post
371
+ *
372
+ * @since 1.0.0
373
+ * @return void
374
+ */
375
+ function theme_meta_box( $post ) { ?>
376
+ <table class="form-table">
377
+ <tr class="widefat">
378
+ <td>
379
+ <label for="scts-preview-url"><?php _e( 'Preview URL' ); ?></label>
380
+ </td>
381
+ <td>
382
+ <input type="url"
383
+ name="scts_preview_url"
384
+ id="scts-preview-url"
385
+ class="regular-text"
386
+ value="<?php echo esc_url( get_post_meta( $post->ID, 'scts_preview_url', true ) ); ?>"/>
387
+ </td>
388
+ </tr>
389
+ <tr class="widefat">
390
+ <td>
391
+ <label for="scts-shop-url"><?php _e( 'Shop URL' ); ?></label>
392
+ </td>
393
+ <td>
394
+ <input type="url"
395
+ name="scts_shop_url"
396
+ id="scts-shop-url"
397
+ class="regular-text"
398
+ value="<?php echo esc_url( get_post_meta( $post->ID, 'scts_shop_url', true ) ); ?>"/>
399
+ </td>
400
+ </tr>
401
+ <tr class="widefat">
402
+ <td>
403
+ <label for="scts-theme-author"><?php _e( 'Author' ); ?></label>
404
+ </td>
405
+ <td>
406
+ <input type="text"
407
+ name="scts_theme_author"
408
+ id="scts-theme-author"
409
+ class="regular-text"
410
+ value="<?php esc_html_e( get_post_meta( $post->ID, 'scts_theme_author', true ) ); ?>"/>
411
+ </td>
412
+ </tr>
413
+ <tr class="widefat">
414
+ <td>
415
+ <label for="scts-is-wp-org"><?php _e( 'WordPress.org' ); ?></label>
416
+ </td>
417
+ <td>
418
+ <label>
419
+ <input type="checkbox"
420
+ name="scts_wp_org"
421
+ id="scts-wp-org"
422
+ class="regular-text"
423
+ <?php checked( true, !!get_post_meta( $post->ID, 'scts_wp_org', true ) ); ?> />
424
+ <?php _e( 'Is this theme on WordPress.org?' ); ?>
425
+ </label>
426
+ </td>
427
+ </tr>
428
+ </table>
429
+ <?php wp_nonce_field( 'scts_save_meta_box', 'scts_nonce' ); ?>
430
+ <?php }
431
+
432
+ /**
433
+ * Output themes page
434
+ *
435
+ * @since 1.0.0
436
+ * @return void
437
+ */
438
+ function themes_page() { $themes = get_prepared_themes(); ?>
439
+ <div class="wrap themes-php">
440
+ <h1 class="wp-heading-inline">
441
+ <?php _e( 'Featured Themes' ); ?> <span class="title-count theme-count"><?php esc_html_e( count( $themes ) ); ?></span>
442
+ </h1>
443
+ <div id="scts-search-wrap">
444
+ <form class="search-form" action="<?php echo esc_url( admin_url( 'themes.php' ) ); ?>">
445
+ <input placeholder="<?php _e( 'Search themes...' ); ?>"
446
+ type="search"
447
+ name="search"
448
+ id="wp-filter-search-input"
449
+ class="wp-filter-search">
450
+ </form>
451
+ <?php if ( is_plugin() ) : ?>
452
+ <a id="refresh" class="button" href="<?php echo wp_nonce_url( admin_url( 'admin-post.php?action=scts_refresh' ), 'scts_refresh', 'nonce' ); ?>">
453
+ <span class="dashicons dashicons-image-rotate"></span>
454
+ </a>
455
+ <?php endif; ?>
456
+ </div>
457
+ <div class="theme-browser rendered">
458
+ <div class="themes wp-clearfix">
459
+
460
+ <?php foreach ( $themes as $theme ) : ?>
461
+
462
+ <div class="theme <?php esc_html_e( $theme['is_active'] ? 'active' : '' ); ?>"
463
+ data-theme="<?php echo htmlspecialchars( json_encode( $theme ) ); ?>">
464
+
465
+ <div class="theme-screenshot">
466
+ <img src="<?php echo esc_url( $theme['screenshot_url'] ); ?>" alt="" />
467
+ </div>
468
+ <span class="more-details">
469
+ <?php _e( 'Details & Preview' ); ?>
470
+ </span>
471
+ <div class="theme-id-container">
472
+ <h2 class="theme-name" id="<?php esc_attr_e( $theme['slug'] ); ?>-name">
473
+ <?php if ( $theme['is_active'] ) : ?>
474
+ <span><?php _e( 'Active:' ); ?></span>
475
+ <?php endif; ?>
476
+ <?php esc_html_e( $theme['title']['rendered'] ); ?>
477
+ </h2>
478
+ <div class="theme-actions">
479
+
480
+ <?php if ( $theme['is_active'] && !empty( $theme['actions']['customize'] ) ) : ?>
481
+
482
+ <a class="button button-primary customize load-customize hide-if-no-customize"
483
+ href="<?php echo esc_url( $theme['actions']['customize'] ); ?>">
484
+ <?php _e( 'Customize' ); ?>
485
+ </a>
486
+
487
+ <?php elseif ( $theme['installed'] && !empty( $theme['actions']['activate'] ) ) : ?>
488
+
489
+ <a class="button button-primary activate"
490
+ href="<?php echo esc_url( $theme['actions']['activate'] ); ?>">
491
+ <?php _e( 'Activate' ); ?>
492
+ </a>
493
+
494
+ <?php if ( !empty( $theme['actions']['customize'] ) ) : ?>
495
+
496
+ <a class="button load-customize hide-if-no-customize"
497
+ href="<?php echo esc_url( $theme['actions']['customize'] ); ?>">
498
+ <?php _e( 'Live Preview' ); ?>
499
+ </a>
500
+
501
+ <?php endif; ?>
502
+
503
+ <?php elseif ( !empty( $theme['actions']['install'] ) ) : ?>
504
+
505
+ <a class="button button-primary install" href="<?php echo esc_url( $theme['actions']['install'] ); ?>">
506
+ <?php _e( 'Install' ); ?>
507
+ </a>
508
+ <a class="button load-preview hide-if-no-customize" href="#">
509
+ <?php _e( 'Preview' ); ?>
510
+ </a>
511
+
512
+ <?php elseif ( !empty( $theme['actions']['more_info'] ) ) : ?>
513
+
514
+ <a class="button button-primary install" target="_blank" href="<?php echo esc_url( $theme['actions']['more_info'] ); ?>">
515
+ <?php _e( 'More Info' ); ?>
516
+ </a>
517
+ <a class="button load-preview hide-if-no-customize" href="#">
518
+ <?php _e( 'Preview' ); ?>
519
+ </a>
520
+
521
+ <?php endif; ?>
522
+
523
+ </div>
524
+ </div>
525
+ </div>
526
+
527
+ <?php endforeach; ?>
528
+
529
+ <div class="clear"></div>
530
+ </div>
531
+ </div>
532
+ </div>
533
+ <?php }
534
+
535
+ /**
536
+ * Output Underscore templates
537
+ *
538
+ * @action admin_footer
539
+ *
540
+ * @since 1.0.0
541
+ * @return void
542
+ */
543
+ function theme_page_js_templates() { ?>
544
+ <script id="tmpl-theme-preview" type="text/template">
545
+ <div class="theme-install-overlay wp-full-overlay no-navigation expanded">
546
+ <div class="wp-full-overlay-sidebar">
547
+ <div class="wp-full-overlay-header">
548
+ <button class="close-full-overlay"><span class="screen-reader-text"><?php _e( 'Close' ); ?></span></button>
549
+ <# if ( data.actions.more_info ) { #>
550
+ <a class="button button-primary" href="{{ data.actions.more_info }}"><?php _e( 'Theme Homepage' ); ?></a>
551
+ <# } #>
552
+ <# if ( data.is_active && data.actions.customize ) { #>
553
+ <a class="button button customize" href="{{ data.actions.customize }}"><?php _e( 'Customize' ); ?></a>
554
+ <# } else if ( data.installed && data.actions.activate ) { #>
555
+ <a href="{{ data.actions.activate }}" class="button button activate"><?php _e( 'Activate' ); ?></a>
556
+ <# } else if ( data.actions.install ) { #>
557
+ <a href="{{ data.actions.install }}" class="button button install"><?php _e( 'Install' ); ?></a>
558
+ <# } #>
559
+ </div>
560
+ <div class="wp-full-overlay-sidebar-content">
561
+ <div class="install-theme-info">
562
+ <h3 class="theme-name">{{ data.title.rendered }}</h3>
563
+ <span class="theme-by"><?php printf( __( 'By %s' ), '{{ data.theme_author }}' ); ?></span>
564
+ <img class="theme-screenshot" src="{{ data.screenshot_url }}" alt="" />
565
+ <div class="theme-details">
566
+ <div class="theme-description">{{{ data.content.rendered }}}</div>
567
+ </div>
568
+ </div>
569
+ </div>
570
+ <div class="wp-full-overlay-footer">
571
+ <button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
572
+ <span class="collapse-sidebar-arrow"></span>
573
+ <span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
574
+ </button>
575
+ </div>
576
+ </div>
577
+ <div class="wp-full-overlay-main">
578
+ <iframe src="{{ data.preview_url }}" title="<?php esc_attr_e( 'Preview' ); ?>"></iframe>
579
+ </div>
580
+ </div>
581
+ </script>
582
+ <?php }
583
+
584
+ /**
585
+ * Output inline scripts
586
+ *
587
+ * @action admin_footer
588
+ *
589
+ * @since 1.0.0
590
+ * @return void
591
+ */
592
+ function theme_page_inline_scripts() { ?>
593
+ <script>
594
+ jQuery(document).ready(function ($) {
595
+ $('#wp-filter-search-input').on('change keyup paste', _.debounce(function () {
596
+ $('.search-form').submit();
597
+ }, 300));
598
+
599
+ const preview = wp.template('theme-preview');
600
+
601
+ $('body').on('click', '.theme', function (e) {
602
+ if ($(e.target).is('.button') && !$(e.target).is('.load-preview')) {
603
+ return true; // Ignore action links
604
+ }
605
+
606
+ const $preview = $(preview($(this).data('theme')));
607
+
608
+ $preview.find('.close-full-overlay').on('click', function () {
609
+ $preview.fadeOut('fast', function () {
610
+ $preview.remove();
611
+ });
612
+ });
613
+
614
+ $preview.find('.collapse-sidebar').click(function () {
615
+ $preview.toggleClass('expanded');
616
+ $preview.toggleClass('collapsed');
617
+ });
618
+
619
+ $preview.find('iframe').on('load', function () {
620
+ $preview.addClass('iframe-ready')
621
+ });
622
+
623
+ $('body').append($preview.fadeIn('fast'));
624
+ });
625
+ });
626
+ </script>
627
+ <?php }
628
+
629
+ /**
630
+ * Output inline styles
631
+ *
632
+ * @action admin_footer
633
+ *
634
+ * @since 1.0.0
635
+ * @return void
636
+ */
637
+ function theme_page_inline_styles() { ?>
638
+ <style>
639
+ h1.wp-heading-inline {
640
+ margin-bottom: 15px;
641
+ }
642
+
643
+ #scts-search-wrap {
644
+ display: inline-flex;
645
+ justify-content: space-between;
646
+ }
647
+
648
+ #scts-search-wrap #wp-filter-search-input {
649
+ top: 0;
650
+ left: 0;
651
+ }
652
+
653
+ #scts-search-wrap #refresh {
654
+ display: flex;
655
+ justify-content: center;
656
+ align-items: center;
657
+ height: 31px;
658
+ width: 40px;
659
+ margin-left: 5px;
660
+ }
661
+ </style>
662
+ <?php }
663
+
664
+ }
includes/reorder-members.php CHANGED
@@ -1,99 +1,99 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
-
6
- /**
7
- * Receives the orders array of team member IDs and loops through them to update their position meta.
8
- *
9
- * @since 4.0.0
10
- */
11
- function save_team_members_order() {
12
-
13
- if( isset( $_POST['member_order_nonce'] ) &&
14
- wp_verify_nonce( $_POST['member_order_nonce'], 'save_members_order' ) ) {
15
-
16
- $ids = array();
17
-
18
- // Extract the URL encoded IDs
19
- parse_str( $_POST['members_order'], $ids );
20
-
21
-
22
- for( $ctr = 1; $ctr < count( $ids['member'] ) + 1; $ctr++ ) {
23
- update_post_meta( $ids['member'][ $ctr - 1 ], 'sc_member_order', $ctr );
24
- }
25
-
26
-
27
- add_settings_error( 'ots-reorder', 'save-order', __( 'Order Successfully updated', 'ots' ), 'updated' );
28
-
29
- }
30
-
31
- }
32
-
33
- add_action( 'admin_init', 'ots\save_team_members_order' );
34
-
35
-
36
- /**
37
- * Output the admin page for reordering team members.
38
- *
39
- * @since 4.0.0
40
- */
41
- function do_member_reorder_page() { ?>
42
-
43
- <?php $members = get_members_in_order( false ); ?>
44
-
45
- <div class="wrap">
46
-
47
- <?php settings_errors( 'ots-reorder' ); ?>
48
-
49
- <h2><?php _e( 'Drag & Drop to Re-Order Team Members', 'ots' ); ?></h2>
50
-
51
- <?php if( $members->have_posts() ) : ?>
52
-
53
- <form method="post">
54
-
55
- <ul id="ots-team-member-order">
56
-
57
- <?php foreach( $members->posts as $member ) : ?>
58
-
59
- <li id="member_<?php esc_attr_e( $member->ID ); ?>" class="ots-member">
60
-
61
- <a class="edit" href="<?php echo esc_url( get_edit_post_link( $member->ID ) ); ?>">
62
- <span class="dashicons dashicons-edit"></span>
63
- </a>
64
-
65
- <div class="inner">
66
-
67
- <div class="thumbnail" style="background-image: url('<?php echo esc_url( get_member_avatar( $member ) ); ?>');"></div>
68
-
69
- <div class="member-info">
70
- <h2 class="name"><?php echo esc_html_e( $member->post_title ); ?></h2>
71
- <p class="description job-title"><?php esc_html_e( get_post_meta( $member->ID, 'team_member_title', true ) ); ?></p>
72
- </div>
73
-
74
- </div>
75
-
76
- </li>
77
-
78
- <?php endforeach; ?>
79
-
80
- </ul>
81
-
82
- <input type="hidden" name="members_order" />
83
- <input type="hidden" name="action" value="ots_save_members_order" />
84
-
85
- <?php wp_nonce_field( 'save_members_order', 'member_order_nonce' ); ?>
86
-
87
- <?php submit_button( __( 'Save Order', 'ots' ) ); ?>
88
-
89
- </form>
90
-
91
- <?php else : ?>
92
-
93
- <h3><?php _e( 'You haven\'t added any team members yet. <a href="edit.php?post_type=team_member">Add a new member</a>', 'ots' ); ?></h3>
94
-
95
- <?php endif; ?>
96
-
97
- </div>
98
-
99
  <?php }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+
6
+ /**
7
+ * Receives the orders array of team member IDs and loops through them to update their position meta.
8
+ *
9
+ * @since 4.0.0
10
+ */
11
+ function save_team_members_order() {
12
+
13
+ if( isset( $_POST['member_order_nonce'] ) &&
14
+ wp_verify_nonce( $_POST['member_order_nonce'], 'save_members_order' ) ) {
15
+
16
+ $ids = array();
17
+
18
+ // Extract the URL encoded IDs
19
+ parse_str( $_POST['members_order'], $ids );
20
+
21
+
22
+ for( $ctr = 1; $ctr < count( $ids['member'] ) + 1; $ctr++ ) {
23
+ update_post_meta( $ids['member'][ $ctr - 1 ], 'sc_member_order', $ctr );
24
+ }
25
+
26
+
27
+ add_settings_error( 'ots-reorder', 'save-order', __( 'Order Successfully updated', 'ots' ), 'updated' );
28
+
29
+ }
30
+
31
+ }
32
+
33
+ add_action( 'admin_init', 'ots\save_team_members_order' );
34
+
35
+
36
+ /**
37
+ * Output the admin page for reordering team members.
38
+ *
39
+ * @since 4.0.0
40
+ */
41
+ function do_member_reorder_page() { ?>
42
+
43
+ <?php $members = get_members_in_order( false ); ?>
44
+
45
+ <div class="wrap">
46
+
47
+ <?php settings_errors( 'ots-reorder' ); ?>
48
+
49
+ <h2><?php _e( 'Drag & Drop to Re-Order Team Members', 'ots' ); ?></h2>
50
+
51
+ <?php if( $members->have_posts() ) : ?>
52
+
53
+ <form method="post">
54
+
55
+ <ul id="ots-team-member-order">
56
+
57
+ <?php foreach( $members->posts as $member ) : ?>
58
+
59
+ <li id="member_<?php esc_attr_e( $member->ID ); ?>" class="ots-member">
60
+
61
+ <a class="edit" href="<?php echo esc_url( get_edit_post_link( $member->ID ) ); ?>">
62
+ <span class="dashicons dashicons-edit"></span>
63
+ </a>
64
+
65
+ <div class="inner">
66
+
67
+ <div class="thumbnail" style="background-image: url('<?php echo esc_url( get_member_avatar( $member ) ); ?>');"></div>
68
+
69
+ <div class="member-info">
70
+ <h2 class="name"><?php echo esc_html_e( $member->post_title ); ?></h2>
71
+ <p class="description job-title"><?php esc_html_e( get_post_meta( $member->ID, 'team_member_title', true ) ); ?></p>
72
+ </div>
73
+
74
+ </div>
75
+
76
+ </li>
77
+
78
+ <?php endforeach; ?>
79
+
80
+ </ul>
81
+
82
+ <input type="hidden" name="members_order" />
83
+ <input type="hidden" name="action" value="ots_save_members_order" />
84
+
85
+ <?php wp_nonce_field( 'save_members_order', 'member_order_nonce' ); ?>
86
+
87
+ <?php submit_button( __( 'Save Order', 'ots' ) ); ?>
88
+
89
+ </form>
90
+
91
+ <?php else : ?>
92
+
93
+ <h3><?php _e( 'You haven\'t added any team members yet. <a href="edit.php?post_type=team_member">Add a new member</a>', 'ots' ); ?></h3>
94
+
95
+ <?php endif; ?>
96
+
97
+ </div>
98
+
99
  <?php }
includes/team-member.php CHANGED
@@ -1,846 +1,846 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
-
6
- /**
7
- * Enqueue scripts for single.php.
8
- *
9
- * @since 4.0.0
10
- */
11
- function enqueue_single_scripts() {
12
-
13
- if( get_post_type() == 'team_member' ) {
14
- wp_enqueue_style( 'ots-single' );
15
- }
16
-
17
- }
18
-
19
- add_action( 'wp_enqueue_scripts', 'ots\enqueue_single_scripts' );
20
-
21
-
22
- /**
23
- * Manually override the theme's template.
24
- *
25
- * @param $template
26
- * @return string
27
- * @since 4.0.0
28
- */
29
- function include_single_template( $template ) {
30
-
31
- if ( is_single() && get_post_type() == 'team_member' ) {
32
-
33
- // Pull in the template
34
- if( override_theme_template() ) {
35
- $template = locate_template( 'single.php' );
36
- }
37
-
38
- }
39
-
40
- return $template;
41
-
42
- }
43
-
44
- add_filter( 'template_include', 'ots\include_single_template' );
45
-
46
-
47
- /**
48
- * Override the default single-team_member template used by themes to avoid breakage.
49
- *
50
- * @return bool
51
- * @since 4.0.0
52
- */
53
- function override_theme_template() {
54
-
55
- $template = get_option( Options::SINGLE_TEMPLATE );
56
-
57
- return ( $template === 'standard' || !template_path( $template ) ) &&
58
- file_exists( get_template_directory() . '/single-team_member.php' );
59
-
60
- }
61
-
62
-
63
- /**
64
- * Register the team member custom post type.
65
- *
66
- * @since 4.0.0
67
- */
68
- function register_team_member_post_type() {
69
-
70
- $labels = array(
71
- 'name' => _x( 'Team Members', 'post type general name', 'ots' ),
72
- 'singular_name' => _x( 'Team Member', 'post type singular name', 'ots' ),
73
- 'menu_name' => _x( 'Team', 'admin menu', 'ots' ),
74
- 'name_admin_bar' => _x( 'Team Member', 'add new on admin bar', 'ots' ),
75
- 'add_new' => _x( 'Add New', 'team_member', 'ots' ),
76
- 'add_new_item' => __( 'Add New Member', 'ots' ),
77
- 'new_item' => __( 'New Member', 'ots' ),
78
- 'edit_item' => __( 'Edit Member', 'ots' ),
79
- 'view_item' => __( 'View Member', 'ots' ),
80
- 'all_items' => __( 'All Members', 'ots' ),
81
- 'search_items' => __( 'Search Members', 'ots' ),
82
- 'parent_item_colon' => __( 'Parent Members:', 'ots' ),
83
- 'not_found' => __( 'No members found.', 'ots' ),
84
- 'not_found_in_trash' => __( 'No members found in Trash.', 'ots' ),
85
- 'archives' => __( 'Member Archives', 'ots' ),
86
- 'attributes' => __( 'Member Attributes', 'ots' ),
87
-
88
- );
89
-
90
- $args = array(
91
- 'menu_icon' => 'dashicons-admin-users',
92
- 'labels' => $labels,
93
- 'capability_type' => 'post',
94
- 'register_meta_box_cb' => 'ots\team_member_meta_boxes',
95
- 'supports' => array( 'title', 'editor', 'thumbnail' ),
96
- 'public' => true,
97
- 'rewrite' => array(
98
- 'slug' => get_option( Options::REWRITE_SLUG )
99
- )
100
- );
101
-
102
- register_post_type( 'team_member', $args );
103
-
104
- }
105
-
106
- add_action( 'init', 'ots\register_team_member_post_type' );
107
-
108
-
109
- /**
110
- * Register the member grouping taxonomy.
111
- *
112
- * @since 4.0.0
113
- */
114
- function register_team_member_position_taxonomy() {
115
-
116
- $labels = array(
117
- 'name' => _x( 'Groups', 'taxonomy general name', 'ots' ),
118
- 'singular_name' => _x( 'Group', 'taxonomy singular name', 'ots' ),
119
- 'search_items' => __( 'Search Groups', 'ots' ),
120
- 'all_items' => __( 'All Groups', 'ots' ),
121
- 'parent_item' => __( 'Parent Group', 'ots' ),
122
- 'parent_item_colon' => __( 'Parent Group:', 'ots' ),
123
- 'edit_item' => __( 'Edit Group', 'ots' ),
124
- 'update_item' => __( 'Update Group', 'ots' ),
125
- 'add_new_item' => __( 'Add New Group', 'ots' ),
126
- 'new_item_name' => __( 'New Group', 'ots' ),
127
- 'menu_name' => __( 'Groups', 'ots' ),
128
- );
129
-
130
- $args = array(
131
- 'labels' => $labels,
132
- 'hierarchical' => true,
133
- );
134
-
135
- register_taxonomy( 'team_member_position', 'team_member', $args );
136
- }
137
-
138
- add_action( 'init', 'ots\register_team_member_position_taxonomy' );
139
-
140
-
141
- /**
142
- * Add custom columns to the team member posts table.
143
- *
144
- * @param $columns
145
- * @return mixed
146
- * @since 4.0.0
147
- */
148
- function add_team_member_custom_columns( $columns ) {
149
-
150
- unset( $columns['date'] );
151
-
152
- $columns['title'] = __( 'Name', 'ots' );
153
- $columns['team_member_title'] = __( 'Job Title', 'ots' );
154
- $columns['team_member_group'] = __( 'Groups', 'ots' );
155
- $columns['team_member_image'] = __( 'Image', 'ots' );
156
-
157
- return $columns;
158
-
159
- }
160
-
161
- add_filter( 'manage_edit-team_member_columns', 'ots\add_team_member_custom_columns' );
162
-
163
-
164
- /**
165
- * Output custom columns in the team member posts table.
166
- *
167
- * @param $column
168
- * @param $post_id
169
- * @since 4.0.0
170
- */
171
- function do_team_member_custom_columns( $column, $post_id ) {
172
-
173
- switch( $column ) {
174
-
175
- case 'team_member_title' :
176
- echo get_post_meta( $post_id, 'team_member_title', true ) ?: '-';
177
- break;
178
-
179
- case 'team_member_image' :
180
- echo member_avatar( $post_id, array( 50, 50 ) );
181
- break;
182
-
183
- case 'team_member_group':
184
-
185
- $groups = get_the_terms( get_post( $post_id ), 'team_member_position' );
186
-
187
- if ( !empty( $groups ) ) {
188
-
189
- $str = '';
190
-
191
- foreach ( $groups as $group ) {
192
- $str .= "$group->name - ";
193
- }
194
-
195
- echo rtrim( $str, ' - ' );
196
-
197
- }
198
-
199
- break;
200
-
201
- }
202
-
203
- }
204
-
205
- add_action( 'manage_team_member_posts_custom_column', 'ots\do_team_member_custom_columns', 10, 2 );
206
-
207
-
208
- /**
209
- * Append articles and social links when using single.php.
210
- *
211
- * @param $content
212
- * @return string
213
- * @since 4.0.0
214
- */
215
- function single_member_content( $content ) {
216
-
217
- // Use {} to prevent whitespace leaks after headers have been sent
218
- if ( is_single() && get_post_type() == 'team_member' &&
219
- get_option( Options::SINGLE_TEMPLATE ) == 'standard' ) { ob_start(); ?>
220
-
221
- <div id="sc_our_team">
222
-
223
- <div class="sc_team_member">
224
-
225
- <?php echo $content; ?>
226
-
227
- <?php if ( get_option( Options::SHOW_SINGLE_SOCIAL ) == 'on' ) : ?>
228
-
229
- <div class="icons"><?php do_member_social_links(); ?></div>
230
-
231
- <?php endif; ?>
232
-
233
- <hr>
234
-
235
- <?php if ( get_post_meta( get_the_ID(), 'team_member_article_bool', true ) === 'on' ) : ?>
236
-
237
- <div class="sc_team_posts sc_team_post">
238
-
239
- <h3 class="skills-title"><?php esc_attr_e( get_post_meta( get_the_ID(), 'team_member_article_title', true ) ); ?></h3>
240
-
241
- <div class="sc-team-member-posts">
242
-
243
- <?php foreach ( get_member_articles() as $article ) : ?>
244
-
245
- <div class="sc-team-member-post">
246
-
247
- <div class="width25 sc-left">
248
-
249
- <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_post_thumbnail( $article, 'medium' ); ?></a>
250
-
251
- </div>
252
-
253
- <div class="width75 sc-left">
254
-
255
- <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_title( $article ); ?></a>
256
-
257
- </div>
258
-
259
- <div class="clear"></div>
260
-
261
- </div>
262
-
263
- <?php endforeach; ?>
264
-
265
- </div>
266
-
267
- <div class="clear"></div>
268
-
269
- </div>
270
-
271
- <?php endif; ?>
272
-
273
- </div>
274
-
275
- </div>
276
-
277
- <?php $content = ob_get_clean();
278
-
279
- }
280
-
281
- return $content;
282
-
283
- }
284
-
285
- add_filter( 'the_content', 'ots\single_member_content' );
286
-
287
-
288
- /**
289
- * Renders the member custom post type metabox fields.
290
- *
291
- * @since 4.0.0
292
- */
293
- function team_member_meta_boxes() {
294
-
295
- if( is_admin() ) {
296
-
297
- $preview = apply_filters( 'ots_enable_pro_preview', true );
298
-
299
- add_meta_box( 'team-member-contact', __( 'Contact Information', 'ots' ), 'ots\do_contact_meta_box' );
300
- add_meta_box( 'team-member-articles', __( 'Authored / Favorite Articles', 'ots' ), 'ots\do_articles_meta_box' );
301
-
302
- add_meta_box( 'team-member-skills', __( 'Attributes / Skills / Ratings' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_skills_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
303
- add_meta_box( 'team-member-tags', __( 'Interests / Tags / Additional Skills' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_tags_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
304
-
305
- }
306
-
307
- }
308
-
309
- /**
310
- * Add default meta keys when creating a new team member.
311
- *
312
- * @param $post_id
313
- * @param $post
314
- * @param $update
315
- * @since 4.0.0
316
- */
317
- function set_default_post_meta( $post_id, $post, $update ) {
318
-
319
- if( !$update ) {
320
- update_post_meta( $post_id, 'sc_member_order', PHP_INT_MAX );
321
- }
322
-
323
- }
324
-
325
- add_action( 'save_post_team_member', 'ots\set_default_post_meta', 10, 3 );
326
-
327
-
328
- /**
329
- * Sanitize and save the contact meta box fields.
330
- *
331
- * @param $post_id
332
- * @since 4.0.0
333
- */
334
- function save_contact_meta_box( $post_id ) {
335
-
336
- if( isset( $_POST['articles_mata_box_nonce'] ) &&
337
- wp_verify_nonce( $_POST['contact_mata_box_nonce'], 'contact_meta_box' ) ) {
338
-
339
- update_post_meta( $post_id, 'team_member_title', sanitize_text_field( $_POST['team_member_title'] ) );
340
- update_post_meta( $post_id, 'team_member_phone', sanitize_text_field( $_POST['team_member_phone'] ) );
341
- update_post_meta( $post_id, 'team_member_other', sanitize_text_field( $_POST['team_member_other'] ) );
342
- update_post_meta( $post_id, 'team_member_other_icon', sanitize_key( $_POST['team_member_other_icon'] ) );
343
- update_post_meta( $post_id, 'team_member_email', sanitize_email( $_POST['team_member_email'] ) );
344
-
345
- foreach( $_POST['team_member_links'] as $network => $link ) {
346
- update_post_meta( $post_id, 'team_member_' . sanitize_key( $network ), esc_url_raw( $link ) );
347
- }
348
-
349
- }
350
-
351
- }
352
-
353
- add_action( 'save_post_team_member', 'ots\save_contact_meta_box' );
354
-
355
-
356
- /**
357
- * Sanitize and save the articles meta box fields.
358
- *
359
- * @param $post_id
360
- * @since 4.0.0
361
- */
362
- function save_articles_meta_box( $post_id ) {
363
-
364
- if( isset( $_POST['articles_mata_box_nonce'] ) &&
365
- wp_verify_nonce( $_POST['articles_mata_box_nonce'], 'articles_meta_box' ) ) {
366
-
367
- update_post_meta( $post_id, 'team_member_article_bool', isset( $_POST['team_member_article_bool'] ) ? 'on' : '' );
368
- update_post_meta( $post_id, 'team_member_article_title', sanitize_text_field( $_POST['team_member_article_title'] ) );
369
-
370
- foreach( $_POST['team_member_articles'] as $index => $article ) {
371
- update_post_meta( $post_id, 'team_member_article' . $index, intval( $article ) );
372
- }
373
-
374
- }
375
-
376
- }
377
-
378
- add_action( 'save_post_team_member', 'ots\save_articles_meta_box' );
379
-
380
-
381
- /**
382
- * Output the contact info meta box.
383
- *
384
- * @param \WP_Post $post
385
- * @since 4.0.0
386
- */
387
- function do_contact_meta_box( \WP_Post $post ) { ?>
388
-
389
- <?php wp_nonce_field( 'contact_meta_box', 'contact_mata_box_nonce' ); ?>
390
-
391
- <?php $member = team_member( $post ); ?>
392
-
393
- <table id="ots-contact-meta-box" class="ots-meta-box widefat">
394
- <tr>
395
- <th>
396
- <label for="ots-member-job-title"><?php _e( 'Job Title', 'ots' ); ?></label>
397
- </th>
398
- <td>
399
- <input id="ots-member-job-title"
400
- name="team_member_title"
401
- class="regular-text"
402
- value="<?php esc_attr_e( $member->title ); ?>" />
403
- </td>
404
- </tr>
405
- <tr>
406
- <th>
407
- <label for="ots-member-email"><?php _e( 'Email Address', 'ots' ); ?></label>
408
- </th>
409
- <td>
410
- <input id="ots-member-email"
411
- name="team_member_email"
412
- class="regular-text"
413
- value="<?php esc_attr_e( $member->email ); ?>" />
414
- </td>
415
- </tr>
416
- <tr>
417
- <th>
418
- <label for="ots-member-phone"><?php _e( 'Phone Number', 'ots' ); ?></label>
419
- </th>
420
- <td>
421
- <input id="ots-member-phone"
422
- name="team_member_phone"
423
- class="regular-text"
424
- placeholder="(123) 456-7890"
425
- value="<?php esc_attr_e( $member->phone ); ?>" />
426
- </td>
427
- </tr>
428
- <tr>
429
- <th>
430
- <label for="ots-member-facebook"><?php _e( 'Facebook', 'ots' ); ?></label>
431
- </th>
432
- <td>
433
- <input id="ots-member-facebook"
434
- name="team_member_links[facebook]"
435
- class="regular-text"
436
- placeholder="http://"
437
- value="<?php esc_attr_e( $member->facebook ); ?>" />
438
- </td>
439
- </tr>
440
- <tr>
441
- <th>
442
- <label for="ots-member-twitter"><?php _e( 'Twitter', 'ots' ); ?></label>
443
- </th>
444
- <td>
445
- <input id="ots-member-twitter"
446
- name="team_member_links[twitter]"
447
- class="regular-text"
448
- placeholder="http://"
449
- value="<?php esc_attr_e( $member->twitter ); ?>" />
450
- </td>
451
- </tr>
452
- <tr>
453
- <th>
454
- <label for="ots-member-linkedin"><?php _e( 'Linkedin', 'ots' ); ?></label>
455
- </th>
456
- <td>
457
- <input id="ots-member-linkedin"
458
- name="team_member_links[linkedin]"
459
- class="regular-text"
460
- placeholder="http://"
461
- value="<?php esc_attr_e( $member->linkedin ); ?>" />
462
- </td>
463
- </tr>
464
- <tr>
465
- <th>
466
- <label for="ots-member-gplus"><?php _e( 'Google Plus', 'ots' ); ?></label>
467
- </th>
468
- <td>
469
- <input id="ots-member-gplus"
470
- name="team_member_links[gplus]"
471
- class="regular-text"
472
- placeholder="http://"
473
- value="<?php esc_attr_e( $member->gplus ); ?>" />
474
- </td>
475
- </tr>
476
- <tr>
477
- <th>
478
- <label for="ots-member-instagram"><?php _e( 'Instagram', 'ots' ); ?></label>
479
- </th>
480
- <td>
481
- <input id="ots-member-instagram"
482
- name="team_member_links[instagram]"
483
- class="regular-text"
484
- placeholder="http://"
485
- value="<?php esc_attr_e( $member->instagram ); ?>" />
486
- </td>
487
- </tr>
488
- <tr>
489
- <th>
490
- <label for="ots-member-pinterest"><?php _e( 'Pinterest', 'ots' ); ?></label>
491
- </th>
492
- <td>
493
- <input id="ots-member-pinterest"
494
- name="team_member_links[pinterest]"
495
- class="regular-text"
496
- placeholder="http://"
497
- value="<?php esc_attr_e( $member->pinterest ); ?>" />
498
- </td>
499
- </tr>
500
- <tr>
501
- <th>
502
- <label for="ots-member-website"><?php _e( 'Website', 'ots' ); ?></label>
503
- </th>
504
- <td>
505
- <input id="ots-member-website"
506
- name="team_member_links[website]"
507
- class="regular-text"
508
- placeholder="http://"
509
- value="<?php esc_attr_e( $member->website ); ?>" />
510
- </td>
511
- </tr>
512
- <tr>
513
- <th>
514
- <label for="ots-member-other"><?php _e( 'Other', 'ots' ); ?></label>
515
- </th>
516
- <td>
517
-
518
- <?php $other_icon = $member->other_icon; ?>
519
-
520
- <select id="ots-member-other-icon" name="team_member_other_icon">
521
- <option value=""><?php _e( 'Select an Icon', 'ots' ); ?></option>
522
- <option value="etsy" <?php selected( $other_icon, 'etsy' ); ?>><?php _e( 'Etsy', 'ots' ); ?></option>
523
- <option value="whatsapp" <?php selected( $other_icon, 'whatsapp' ); ?>><?php _e( 'Whatsapp', 'ots' ); ?></option>
524
- <option value="skype" <?php selected( $other_icon, 'skype' ); ?>><?php _e( 'Skype', 'ots' ); ?></option>
525
- <option value="vimeo" <?php selected( $other_icon, 'vimeo' ); ?>><?php _e( 'Vimeo', 'ots' ); ?></option>
526
- <option value="soundcloud" <?php selected( $other_icon, 'soundcloud' ); ?>><?php _e( 'Soundcloud', 'ots' ); ?></option>
527
- </select>
528
- <input id="ots-member-other"
529
- name="team_member_other"
530
- placeholder="http://"
531
- value="<?php esc_attr_e( $member->other ); ?>" />
532
- </td>
533
- </tr>
534
- </table>
535
-
536
- <?php }
537
-
538
-
539
- /**
540
- * Output the articles metabox.
541
- *
542
- * @param \WP_Post $post
543
- * @since 4.0.0
544
- */
545
- function do_articles_meta_box( \WP_Post $post ) { ?>
546
-
547
- <?php wp_nonce_field( 'articles_meta_box', 'articles_mata_box_nonce' ); ?>
548
-
549
- <?php $member = team_member( $post ); ?>
550
-
551
- <table id="ots-articles-meta-box" class="ots-meta-box widefat">
552
- <tr>
553
- <th>
554
- <label for="ots-display-member-articles"><?php _e( 'Display Articles', 'ots' ); ?></label>
555
- </th>
556
- <td>
557
- <label>
558
- <input id="ots-display-member-articles"
559
- name="team_member_article_bool"
560
- type="checkbox" <?php checked( $member->article_bool, 'on' ); ?> />
561
- </label>
562
- </td>
563
- </tr>
564
- <tr>
565
- <th>
566
- <label for="ots-member-articles-title"><?php _e( 'Articles Title', 'ots' ); ?></label>
567
- </th>
568
- <td>
569
- <input id="ots-member-articles-title"
570
- name="team_member_article_title"
571
- class="regular-text"
572
- value="<?php esc_attr_e( $member->article_title ); ?>" />
573
- </td>
574
- </tr>
575
- <tr>
576
- <th>
577
- <label for="ots-member-article-1"><?php _e( 'Article 1', 'ots' ); ?></label>
578
- </th>
579
- <td>
580
- <?php posts_dropdown( 'team_member_articles[1]', 'ots-member-articles-1', $member->article1 ); ?>
581
- </td>
582
- </tr>
583
- <tr>
584
- <th>
585
- <label for="ots-member-article-2"><?php _e( 'Article 2', 'ots' ); ?></label>
586
- </th>
587
- <td>
588
- <?php posts_dropdown( 'team_member_articles[2]', 'ots-member-articles-2', $member->article2 ); ?>
589
- </td>
590
- </tr>
591
- <tr>
592
- <th>
593
- <label for="ots-member-article-3"><?php _e( 'Article 3', 'ots' ); ?></label>
594
- </th>
595
- <td>
596
- <?php posts_dropdown( 'team_member_articles[3]', 'ots-member-articles-3', $member->article3 ); ?>
597
- </td>
598
- </tr>
599
- </table>
600
-
601
- <?php }
602
-
603
-
604
- /**
605
- * Output the skills meta box. Note all fields are disabled by default and this meta box has no save handler.
606
- *
607
- * @param \WP_Post $post
608
- * @param array $meta_box
609
- * @since 4.0.0
610
- */
611
- function do_skills_meta_box( \WP_Post $post, array $meta_box ) { ?>
612
-
613
- <?php wp_nonce_field( 'skills_meta_box', 'skills_meta_box_nonce' ); ?>
614
-
615
- <?php $member = team_member( $post ); ?>
616
-
617
- <table id="ots-skills-meta-box" class="ots-meta-box widefat">
618
- <tr>
619
- <th>
620
- <label for="ots-display-member-skills"><?php _e( 'Display Skills', 'ots' ); ?></label>
621
- </th>
622
- <td>
623
- <label>
624
- <input id="ots-display-member-skills"
625
- name="team_member_skill_bool"
626
- type="checkbox" <?php checked( $member->skill_bool, 'on' ); ?>
627
-
628
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
629
- </label>
630
- </td>
631
- </tr>
632
- <tr>
633
- <th>
634
- <label for="ots-member-skills-title"><?php _e( 'Skills Title', 'ots' ); ?></label>
635
- </th>
636
- <td>
637
- <input id="ots-member-skills-title"
638
- name="team_member_skill_title"
639
- class="regular-text"
640
- value="<?php esc_attr_e( $member->skill_title ); ?>"
641
-
642
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
643
- </td>
644
- </tr>
645
- <tr>
646
- <th>
647
- <label for="ots-member-skill-1"><?php _e( 'Attribute / Skill 1', 'ots' ); ?></label>
648
- </th>
649
- <td>
650
- <input id="ots-member-skill-1"
651
- name="team_member_skill_titles[]"
652
- class="ots-member-skill-title"
653
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
654
- value="<?php esc_attr_e( $member->skill1 ); ?>"
655
-
656
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
657
-
658
- <input id="ots-member-skill-1"
659
- name="team_member_skill_ratings[]"
660
- type="number"
661
- min="1"
662
- max="10"
663
- class="ots-member-skill-rating"
664
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
665
- value="<?php esc_attr_e( $member->skill_value1 ); ?>"
666
-
667
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
668
- </td>
669
- </tr>
670
- <tr>
671
- <th>
672
- <label for="ots-member-skill-2"><?php _e( 'Attribute / Skill 2', 'ots' ); ?></label>
673
- </th>
674
- <td>
675
- <input id="ots-member-skill-2"
676
- name="team_member_skill_titles[]"
677
- class="ots-member-skill-title"
678
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
679
- value="<?php esc_attr_e( $member->skill2 ); ?>"
680
-
681
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
682
-
683
- <input id="ots-member-skill-2"
684
- name="team_member_skill_ratings[]"
685
- class="ots-member-skill-rating"
686
- type="number"
687
- min="1"
688
- max="10"
689
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
690
- value="<?php esc_attr_e( $member->skill_value2 ); ?>"
691
-
692
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
693
- </td>
694
- </tr>
695
- <tr>
696
- <th>
697
- <label for="ots-member-skill-3"><?php _e( 'Attribute / Skill 3', 'ots' ); ?></label>
698
- </th>
699
- <td>
700
- <input id="ots-member-skill-3"
701
- name="team_member_skill_titles[]"
702
- class="ots-member-skill-title""
703
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
704
- value="<?php esc_attr_e( $member->skill3 ); ?>"
705
-
706
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
707
-
708
- <input id="ots-member-skill-3"
709
- name="team_member_skill_ratings[]"
710
- class="ots-member-skill-rating"
711
- type="number"
712
- min="1"
713
- max="10"
714
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
715
- value="<?php esc_attr_e( $member->skill_value3 ); ?>"
716
-
717
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
718
- </td>
719
- </tr>
720
- <tr>
721
- <th>
722
- <label for="ots-member-skill-4"><?php _e( 'Attribute / Skill 4', 'ots' ); ?></label>
723
- </th>
724
- <td>
725
- <input id="ots-member-skill-4"
726
- name="team_member_skill_titles[]"
727
- class="ots-member-skill-title"
728
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
729
- value="<?php esc_attr_e( $member->skill4 ); ?>"
730
-
731
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
732
-
733
- <input id="ots-member-skill-4"
734
- name="team_member_skill_ratings[]"
735
- class="ots-member-skill-rating"
736
- type="number"
737
- min="1"
738
- max="10"
739
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
740
- value="<?php esc_attr_e( $member->skill_value4 ); ?>"
741
-
742
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
743
- </td>
744
- </tr>
745
- <tr>
746
- <th>
747
- <label for="ots-member-skill-5"><?php _e( 'Attribute / Skill 5', 'ots' ); ?></label>
748
- </th>
749
- <td>
750
- <input id="ots-member-skill-5"
751
- name="team_member_skill_titles[]"
752
- class="ots-member-skill-title"
753
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
754
- value="<?php esc_attr_e( $member->skill5 ); ?>"
755
-
756
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
757
-
758
- <input id="ots-member-skill-5"
759
- name="team_member_skill_ratings[]"
760
- class="ots-member-skill-rating"
761
- type="number"
762
- min="1"
763
- max="10"
764
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
765
- value="<?php esc_attr_e( $member->skill_value5 ); ?>"
766
-
767
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
768
- </td>
769
- </tr>
770
- </table>
771
-
772
- <?php }
773
-
774
-
775
- /**
776
- * Output the tags metabox. Note all fields are disabled by default and this metabox has no save handler.
777
- *
778
- * @param \WP_Post $post
779
- * @param array $meta_box
780
- * @since 4.0.0
781
- */
782
- function do_tags_meta_box( \WP_Post $post, array $meta_box ) { ?>
783
-
784
- <?php wp_nonce_field( 'tags_meta_box', 'tags_meta_box_nonce' ); ?>
785
-
786
- <?php $member = team_member( $post ); ?>
787
-
788
- <table id="ots-tags-meta-box" class="ots-meta-box widefat">
789
- <tr>
790
- <th>
791
- <label for="ots-display-member-tags"><?php _e( 'Display Tags', 'ots' ); ?></label>
792
- </th>
793
- <td>
794
- <label>
795
- <input id="ots-display-member-tags"
796
- name="team_member_tags_bool"
797
- type="checkbox" <?php checked( $member->tags_bool, 'on' ); ?>
798
-
799
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
800
- </label>
801
- </td>
802
- </tr>
803
- <tr>
804
- <th>
805
- <label for="ots-member-tags-title"><?php _e( 'Tags Title', 'ots' ); ?></label>
806
- </th>
807
- <td>
808
- <input id="ots-member-tags-title"
809
- name="team_member_tags_title"
810
- class="regular-text"
811
- value="<?php esc_attr_e( $member->tags_title ); ?>"
812
-
813
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
814
- </td>
815
- </tr>
816
- <tr>
817
- <th>
818
- <label for="ots-member-tags"><?php _e( 'Attributes', 'ots' ); ?></label>
819
- </th>
820
- <td>
821
- <textarea id="ots-member-tags"
822
- name="team_member_tags"
823
- class="regular-text"
824
- placeholder="<?php _e( 'Enter attributes, comma separated', 'ots' ); ?>"
825
-
826
- <?php disabled( true, $meta_box['args']['preview'] ); ?>
827
-
828
- ><?php esc_html_e( $member->tags ); ?></textarea>
829
- </td>
830
- </tr>
831
- <tr>
832
- <th>
833
- <label for="ots-member-personal-quote"><?php _e( 'Personal Quote', 'ots' ); ?></label>
834
- </th>
835
- <td>
836
- <input id="ots-member-personal-quote"
837
- name="team_member_quote"
838
- class="regular-text"
839
- value="<?php esc_attr_e( $member->quote ); ?>"
840
-
841
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
842
- </td>
843
- </tr>
844
- </table>
845
-
846
- <?php }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+
6
+ /**
7
+ * Enqueue scripts for single.php.
8
+ *
9
+ * @since 4.0.0
10
+ */
11
+ function enqueue_single_scripts() {
12
+
13
+ if( get_post_type() == 'team_member' ) {
14
+ wp_enqueue_style( 'ots-single' );
15
+ }
16
+
17
+ }
18
+
19
+ add_action( 'wp_enqueue_scripts', 'ots\enqueue_single_scripts' );
20
+
21
+
22
+ /**
23
+ * Manually override the theme's template.
24
+ *
25
+ * @param $template
26
+ * @return string
27
+ * @since 4.0.0
28
+ */
29
+ function include_single_template( $template ) {
30
+
31
+ if ( is_single() && get_post_type() == 'team_member' ) {
32
+
33
+ // Pull in the template
34
+ if( override_theme_template() ) {
35
+ $template = locate_template( 'single.php' );
36
+ }
37
+
38
+ }
39
+
40
+ return $template;
41
+
42
+ }
43
+
44
+ add_filter( 'template_include', 'ots\include_single_template' );
45
+
46
+
47
+ /**
48
+ * Override the default single-team_member template used by themes to avoid breakage.
49
+ *
50
+ * @return bool
51
+ * @since 4.0.0
52
+ */
53
+ function override_theme_template() {
54
+
55
+ $template = get_option( Options::SINGLE_TEMPLATE );
56
+
57
+ return ( $template === 'standard' || !template_path( $template ) ) &&
58
+ file_exists( get_template_directory() . '/single-team_member.php' );
59
+
60
+ }
61
+
62
+
63
+ /**
64
+ * Register the team member custom post type.
65
+ *
66
+ * @since 4.0.0
67
+ */
68
+ function register_team_member_post_type() {
69
+
70
+ $labels = array(
71
+ 'name' => _x( 'Team Members', 'post type general name', 'ots' ),
72
+ 'singular_name' => _x( 'Team Member', 'post type singular name', 'ots' ),
73
+ 'menu_name' => _x( 'Team', 'admin menu', 'ots' ),
74
+ 'name_admin_bar' => _x( 'Team Member', 'add new on admin bar', 'ots' ),
75
+ 'add_new' => _x( 'Add New', 'team_member', 'ots' ),
76
+ 'add_new_item' => __( 'Add New Member', 'ots' ),
77
+ 'new_item' => __( 'New Member', 'ots' ),
78
+ 'edit_item' => __( 'Edit Member', 'ots' ),
79
+ 'view_item' => __( 'View Member', 'ots' ),
80
+ 'all_items' => __( 'All Members', 'ots' ),
81
+ 'search_items' => __( 'Search Members', 'ots' ),
82
+ 'parent_item_colon' => __( 'Parent Members:', 'ots' ),
83
+ 'not_found' => __( 'No members found.', 'ots' ),
84
+ 'not_found_in_trash' => __( 'No members found in Trash.', 'ots' ),
85
+ 'archives' => __( 'Member Archives', 'ots' ),
86
+ 'attributes' => __( 'Member Attributes', 'ots' ),
87
+
88
+ );
89
+
90
+ $args = array(
91
+ 'menu_icon' => 'dashicons-admin-users',
92
+ 'labels' => $labels,
93
+ 'capability_type' => 'post',
94
+ 'register_meta_box_cb' => 'ots\team_member_meta_boxes',
95
+ 'supports' => array( 'title', 'editor', 'thumbnail' ),
96
+ 'public' => true,
97
+ 'rewrite' => array(
98
+ 'slug' => get_option( Options::REWRITE_SLUG )
99
+ )
100
+ );
101
+
102
+ register_post_type( 'team_member', $args );
103
+
104
+ }
105
+
106
+ add_action( 'init', 'ots\register_team_member_post_type' );
107
+
108
+
109
+ /**
110
+ * Register the member grouping taxonomy.
111
+ *
112
+ * @since 4.0.0
113
+ */
114
+ function register_team_member_position_taxonomy() {
115
+
116
+ $labels = array(
117
+ 'name' => _x( 'Groups', 'taxonomy general name', 'ots' ),
118
+ 'singular_name' => _x( 'Group', 'taxonomy singular name', 'ots' ),
119
+ 'search_items' => __( 'Search Groups', 'ots' ),
120
+ 'all_items' => __( 'All Groups', 'ots' ),
121
+ 'parent_item' => __( 'Parent Group', 'ots' ),
122
+ 'parent_item_colon' => __( 'Parent Group:', 'ots' ),
123
+ 'edit_item' => __( 'Edit Group', 'ots' ),
124
+ 'update_item' => __( 'Update Group', 'ots' ),
125
+ 'add_new_item' => __( 'Add New Group', 'ots' ),
126
+ 'new_item_name' => __( 'New Group', 'ots' ),
127
+ 'menu_name' => __( 'Groups', 'ots' ),
128
+ );
129
+
130
+ $args = array(
131
+ 'labels' => $labels,
132
+ 'hierarchical' => true,
133
+ );
134
+
135
+ register_taxonomy( 'team_member_position', 'team_member', $args );
136
+ }
137
+
138
+ add_action( 'init', 'ots\register_team_member_position_taxonomy' );
139
+
140
+
141
+ /**
142
+ * Add custom columns to the team member posts table.
143
+ *
144
+ * @param $columns
145
+ * @return mixed
146
+ * @since 4.0.0
147
+ */
148
+ function add_team_member_custom_columns( $columns ) {
149
+
150
+ unset( $columns['date'] );
151
+
152
+ $columns['title'] = __( 'Name', 'ots' );
153
+ $columns['team_member_title'] = __( 'Job Title', 'ots' );
154
+ $columns['team_member_group'] = __( 'Groups', 'ots' );
155
+ $columns['team_member_image'] = __( 'Image', 'ots' );
156
+
157
+ return $columns;
158
+
159
+ }
160
+
161
+ add_filter( 'manage_edit-team_member_columns', 'ots\add_team_member_custom_columns' );
162
+
163
+
164
+ /**
165
+ * Output custom columns in the team member posts table.
166
+ *
167
+ * @param $column
168
+ * @param $post_id
169
+ * @since 4.0.0
170
+ */
171
+ function do_team_member_custom_columns( $column, $post_id ) {
172
+
173
+ switch( $column ) {
174
+
175
+ case 'team_member_title' :
176
+ echo get_post_meta( $post_id, 'team_member_title', true ) ?: '-';
177
+ break;
178
+
179
+ case 'team_member_image' :
180
+ echo member_avatar( $post_id, array( 50, 50 ) );
181
+ break;
182
+
183
+ case 'team_member_group':
184
+
185
+ $groups = get_the_terms( get_post( $post_id ), 'team_member_position' );
186
+
187
+ if ( !empty( $groups ) ) {
188
+
189
+ $str = '';
190
+
191
+ foreach ( $groups as $group ) {
192
+ $str .= "$group->name - ";
193
+ }
194
+
195
+ echo rtrim( $str, ' - ' );
196
+
197
+ }
198
+
199
+ break;
200
+
201
+ }
202
+
203
+ }
204
+
205
+ add_action( 'manage_team_member_posts_custom_column', 'ots\do_team_member_custom_columns', 10, 2 );
206
+
207
+
208
+ /**
209
+ * Append articles and social links when using single.php.
210
+ *
211
+ * @param $content
212
+ * @return string
213
+ * @since 4.0.0
214
+ */
215
+ function single_member_content( $content ) {
216
+
217
+ // Use {} to prevent whitespace leaks after headers have been sent
218
+ if ( is_single() && get_post_type() == 'team_member' &&
219
+ get_option( Options::SINGLE_TEMPLATE ) == 'standard' ) { ob_start(); ?>
220
+
221
+ <div id="sc_our_team">
222
+
223
+ <div class="sc_team_member">
224
+
225
+ <?php echo $content; ?>
226
+
227
+ <?php if ( get_option( Options::SHOW_SINGLE_SOCIAL ) == 'on' ) : ?>
228
+
229
+ <div class="icons"><?php do_member_social_links(); ?></div>
230
+
231
+ <?php endif; ?>
232
+
233
+ <hr>
234
+
235
+ <?php if ( get_post_meta( get_the_ID(), 'team_member_article_bool', true ) === 'on' ) : ?>
236
+
237
+ <div class="sc_team_posts sc_team_post">
238
+
239
+ <h3 class="skills-title"><?php esc_attr_e( get_post_meta( get_the_ID(), 'team_member_article_title', true ) ); ?></h3>
240
+
241
+ <div class="sc-team-member-posts">
242
+
243
+ <?php foreach ( get_member_articles() as $article ) : ?>
244
+
245
+ <div class="sc-team-member-post">
246
+
247
+ <div class="width25 sc-left">
248
+
249
+ <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_post_thumbnail( $article, 'medium' ); ?></a>
250
+
251
+ </div>
252
+
253
+ <div class="width75 sc-left">
254
+
255
+ <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_title( $article ); ?></a>
256
+
257
+ </div>
258
+
259
+ <div class="clear"></div>
260
+
261
+ </div>
262
+
263
+ <?php endforeach; ?>
264
+
265
+ </div>
266
+
267
+ <div class="clear"></div>
268
+
269
+ </div>
270
+
271
+ <?php endif; ?>
272
+
273
+ </div>
274
+
275
+ </div>
276
+
277
+ <?php $content = ob_get_clean();
278
+
279
+ }
280
+
281
+ return $content;
282
+
283
+ }
284
+
285
+ add_filter( 'the_content', 'ots\single_member_content' );
286
+
287
+
288
+ /**
289
+ * Renders the member custom post type metabox fields.
290
+ *
291
+ * @since 4.0.0
292
+ */
293
+ function team_member_meta_boxes() {
294
+
295
+ if( is_admin() ) {
296
+
297
+ $preview = apply_filters( 'ots_enable_pro_preview', true );
298
+
299
+ add_meta_box( 'team-member-contact', __( 'Contact Information', 'ots' ), 'ots\do_contact_meta_box' );
300
+ add_meta_box( 'team-member-articles', __( 'Authored / Favorite Articles', 'ots' ), 'ots\do_articles_meta_box' );
301
+
302
+ add_meta_box( 'team-member-skills', __( 'Attributes / Skills / Ratings' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_skills_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
303
+ add_meta_box( 'team-member-tags', __( 'Interests / Tags / Additional Skills' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_tags_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
304
+
305
+ }
306
+
307
+ }
308
+
309
+ /**
310
+ * Add default meta keys when creating a new team member.
311
+ *
312
+ * @param $post_id
313
+ * @param $post
314
+ * @param $update
315
+ * @since 4.0.0
316
+ */
317
+ function set_default_post_meta( $post_id, $post, $update ) {
318
+
319
+ if( !$update ) {
320
+ update_post_meta( $post_id, 'sc_member_order', PHP_INT_MAX );
321
+ }
322
+
323
+ }
324
+
325
+ add_action( 'save_post_team_member', 'ots\set_default_post_meta', 10, 3 );
326
+
327
+
328
+ /**
329
+ * Sanitize and save the contact meta box fields.
330
+ *
331
+ * @param $post_id
332
+ * @since 4.0.0
333
+ */
334
+ function save_contact_meta_box( $post_id ) {
335
+
336
+ if( isset( $_POST['articles_mata_box_nonce'] ) &&
337
+ wp_verify_nonce( $_POST['contact_mata_box_nonce'], 'contact_meta_box' ) ) {
338
+
339
+ update_post_meta( $post_id, 'team_member_title', sanitize_text_field( $_POST['team_member_title'] ) );
340
+ update_post_meta( $post_id, 'team_member_phone', sanitize_text_field( $_POST['team_member_phone'] ) );
341
+ update_post_meta( $post_id, 'team_member_other', sanitize_text_field( $_POST['team_member_other'] ) );
342
+ update_post_meta( $post_id, 'team_member_other_icon', sanitize_key( $_POST['team_member_other_icon'] ) );
343
+ update_post_meta( $post_id, 'team_member_email', sanitize_email( $_POST['team_member_email'] ) );
344
+
345
+ foreach( $_POST['team_member_links'] as $network => $link ) {
346
+ update_post_meta( $post_id, 'team_member_' . sanitize_key( $network ), esc_url_raw( $link ) );
347
+ }
348
+
349
+ }
350
+
351
+ }
352
+
353
+ add_action( 'save_post_team_member', 'ots\save_contact_meta_box' );
354
+
355
+
356
+ /**
357
+ * Sanitize and save the articles meta box fields.
358
+ *
359
+ * @param $post_id
360
+ * @since 4.0.0
361
+ */
362
+ function save_articles_meta_box( $post_id ) {
363
+
364
+ if( isset( $_POST['articles_mata_box_nonce'] ) &&
365
+ wp_verify_nonce( $_POST['articles_mata_box_nonce'], 'articles_meta_box' ) ) {
366
+
367
+ update_post_meta( $post_id, 'team_member_article_bool', isset( $_POST['team_member_article_bool'] ) ? 'on' : '' );
368
+ update_post_meta( $post_id, 'team_member_article_title', sanitize_text_field( $_POST['team_member_article_title'] ) );
369
+
370
+ foreach( $_POST['team_member_articles'] as $index => $article ) {
371
+ update_post_meta( $post_id, 'team_member_article' . $index, intval( $article ) );
372
+ }
373
+
374
+ }
375
+
376
+ }
377
+
378
+ add_action( 'save_post_team_member', 'ots\save_articles_meta_box' );
379
+
380
+
381
+ /**
382
+ * Output the contact info meta box.
383
+ *
384
+ * @param \WP_Post $post
385
+ * @since 4.0.0
386
+ */
387
+ function do_contact_meta_box( \WP_Post $post ) { ?>
388
+
389
+ <?php wp_nonce_field( 'contact_meta_box', 'contact_mata_box_nonce' ); ?>
390
+
391
+ <?php $member = team_member( $post ); ?>
392
+
393
+ <table id="ots-contact-meta-box" class="ots-meta-box widefat">
394
+ <tr>
395
+ <th>
396
+ <label for="ots-member-job-title"><?php _e( 'Job Title', 'ots' ); ?></label>
397
+ </th>
398
+ <td>
399
+ <input id="ots-member-job-title"
400
+ name="team_member_title"
401
+ class="regular-text"
402
+ value="<?php esc_attr_e( $member->title ); ?>" />
403
+ </td>
404
+ </tr>
405
+ <tr>
406
+ <th>
407
+ <label for="ots-member-email"><?php _e( 'Email Address', 'ots' ); ?></label>
408
+ </th>
409
+ <td>
410
+ <input id="ots-member-email"
411
+ name="team_member_email"
412
+ class="regular-text"
413
+ value="<?php esc_attr_e( $member->email ); ?>" />
414
+ </td>
415
+ </tr>
416
+ <tr>
417
+ <th>
418
+ <label for="ots-member-phone"><?php _e( 'Phone Number', 'ots' ); ?></label>
419
+ </th>
420
+ <td>
421
+ <input id="ots-member-phone"
422
+ name="team_member_phone"
423
+ class="regular-text"
424
+ placeholder="(123) 456-7890"
425
+ value="<?php esc_attr_e( $member->phone ); ?>" />
426
+ </td>
427
+ </tr>
428
+ <tr>
429
+ <th>
430
+ <label for="ots-member-facebook"><?php _e( 'Facebook', 'ots' ); ?></label>
431
+ </th>
432
+ <td>
433
+ <input id="ots-member-facebook"
434
+ name="team_member_links[facebook]"
435
+ class="regular-text"
436
+ placeholder="http://"
437
+ value="<?php esc_attr_e( $member->facebook ); ?>" />
438
+ </td>
439
+ </tr>
440
+ <tr>
441
+ <th>
442
+ <label for="ots-member-twitter"><?php _e( 'Twitter', 'ots' ); ?></label>
443
+ </th>
444
+ <td>
445
+ <input id="ots-member-twitter"
446
+ name="team_member_links[twitter]"
447
+ class="regular-text"
448
+ placeholder="http://"
449
+ value="<?php esc_attr_e( $member->twitter ); ?>" />
450
+ </td>
451
+ </tr>
452
+ <tr>
453
+ <th>
454
+ <label for="ots-member-linkedin"><?php _e( 'Linkedin', 'ots' ); ?></label>
455
+ </th>
456
+ <td>
457
+ <input id="ots-member-linkedin"
458
+ name="team_member_links[linkedin]"
459
+ class="regular-text"
460
+ placeholder="http://"
461
+ value="<?php esc_attr_e( $member->linkedin ); ?>" />
462
+ </td>
463
+ </tr>
464
+ <tr>
465
+ <th>
466
+ <label for="ots-member-gplus"><?php _e( 'Google Plus', 'ots' ); ?></label>
467
+ </th>
468
+ <td>
469
+ <input id="ots-member-gplus"
470
+ name="team_member_links[gplus]"
471
+ class="regular-text"
472
+ placeholder="http://"
473
+ value="<?php esc_attr_e( $member->gplus ); ?>" />
474
+ </td>
475
+ </tr>
476
+ <tr>
477
+ <th>
478
+ <label for="ots-member-instagram"><?php _e( 'Instagram', 'ots' ); ?></label>
479
+ </th>
480
+ <td>
481
+ <input id="ots-member-instagram"
482
+ name="team_member_links[instagram]"
483
+ class="regular-text"
484
+ placeholder="http://"
485
+ value="<?php esc_attr_e( $member->instagram ); ?>" />
486
+ </td>
487
+ </tr>
488
+ <tr>
489
+ <th>
490
+ <label for="ots-member-pinterest"><?php _e( 'Pinterest', 'ots' ); ?></label>
491
+ </th>
492
+ <td>
493
+ <input id="ots-member-pinterest"
494
+ name="team_member_links[pinterest]"
495
+ class="regular-text"
496
+ placeholder="http://"
497
+ value="<?php esc_attr_e( $member->pinterest ); ?>" />
498
+ </td>
499
+ </tr>
500
+ <tr>
501
+ <th>
502
+ <label for="ots-member-website"><?php _e( 'Website', 'ots' ); ?></label>
503
+ </th>
504
+ <td>
505
+ <input id="ots-member-website"
506
+ name="team_member_links[website]"
507
+ class="regular-text"
508
+ placeholder="http://"
509
+ value="<?php esc_attr_e( $member->website ); ?>" />
510
+ </td>
511
+ </tr>
512
+ <tr>
513
+ <th>
514
+ <label for="ots-member-other"><?php _e( 'Other', 'ots' ); ?></label>
515
+ </th>
516
+ <td>
517
+
518
+ <?php $other_icon = $member->other_icon; ?>
519
+
520
+ <select id="ots-member-other-icon" name="team_member_other_icon">
521
+ <option value=""><?php _e( 'Select an Icon', 'ots' ); ?></option>
522
+ <option value="etsy" <?php selected( $other_icon, 'etsy' ); ?>><?php _e( 'Etsy', 'ots' ); ?></option>
523
+ <option value="whatsapp" <?php selected( $other_icon, 'whatsapp' ); ?>><?php _e( 'Whatsapp', 'ots' ); ?></option>
524
+ <option value="skype" <?php selected( $other_icon, 'skype' ); ?>><?php _e( 'Skype', 'ots' ); ?></option>
525
+ <option value="vimeo" <?php selected( $other_icon, 'vimeo' ); ?>><?php _e( 'Vimeo', 'ots' ); ?></option>
526
+ <option value="soundcloud" <?php selected( $other_icon, 'soundcloud' ); ?>><?php _e( 'Soundcloud', 'ots' ); ?></option>
527
+ </select>
528
+ <input id="ots-member-other"
529
+ name="team_member_other"
530
+ placeholder="http://"
531
+ value="<?php esc_attr_e( $member->other ); ?>" />
532
+ </td>
533
+ </tr>
534
+ </table>
535
+
536
+ <?php }
537
+
538
+
539
+ /**
540
+ * Output the articles metabox.
541
+ *
542
+ * @param \WP_Post $post
543
+ * @since 4.0.0
544
+ */
545
+ function do_articles_meta_box( \WP_Post $post ) { ?>
546
+
547
+ <?php wp_nonce_field( 'articles_meta_box', 'articles_mata_box_nonce' ); ?>
548
+
549
+ <?php $member = team_member( $post ); ?>
550
+
551
+ <table id="ots-articles-meta-box" class="ots-meta-box widefat">
552
+ <tr>
553
+ <th>
554
+ <label for="ots-display-member-articles"><?php _e( 'Display Articles', 'ots' ); ?></label>
555
+ </th>
556
+ <td>
557
+ <label>
558
+ <input id="ots-display-member-articles"
559
+ name="team_member_article_bool"
560
+ type="checkbox" <?php checked( $member->article_bool, 'on' ); ?> />
561
+ </label>
562
+ </td>
563
+ </tr>
564
+ <tr>
565
+ <th>
566
+ <label for="ots-member-articles-title"><?php _e( 'Articles Title', 'ots' ); ?></label>
567
+ </th>
568
+ <td>
569
+ <input id="ots-member-articles-title"
570
+ name="team_member_article_title"
571
+ class="regular-text"
572
+ value="<?php esc_attr_e( $member->article_title ); ?>" />
573
+ </td>
574
+ </tr>
575
+ <tr>
576
+ <th>
577
+ <label for="ots-member-article-1"><?php _e( 'Article 1', 'ots' ); ?></label>
578
+ </th>
579
+ <td>
580
+ <?php posts_dropdown( 'team_member_articles[1]', 'ots-member-articles-1', $member->article1 ); ?>
581
+ </td>
582
+ </tr>
583
+ <tr>
584
+ <th>
585
+ <label for="ots-member-article-2"><?php _e( 'Article 2', 'ots' ); ?></label>
586
+ </th>
587
+ <td>
588
+ <?php posts_dropdown( 'team_member_articles[2]', 'ots-member-articles-2', $member->article2 ); ?>
589
+ </td>
590
+ </tr>
591
+ <tr>
592
+ <th>
593
+ <label for="ots-member-article-3"><?php _e( 'Article 3', 'ots' ); ?></label>
594
+ </th>
595
+ <td>
596
+ <?php posts_dropdown( 'team_member_articles[3]', 'ots-member-articles-3', $member->article3 ); ?>
597
+ </td>
598
+ </tr>
599
+ </table>
600
+
601
+ <?php }
602
+
603
+
604
+ /**
605
+ * Output the skills meta box. Note all fields are disabled by default and this meta box has no save handler.
606
+ *
607
+ * @param \WP_Post $post
608
+ * @param array $meta_box
609
+ * @since 4.0.0
610
+ */
611
+ function do_skills_meta_box( \WP_Post $post, array $meta_box ) { ?>
612
+
613
+ <?php wp_nonce_field( 'skills_meta_box', 'skills_meta_box_nonce' ); ?>
614
+
615
+ <?php $member = team_member( $post ); ?>
616
+
617
+ <table id="ots-skills-meta-box" class="ots-meta-box widefat">
618
+ <tr>
619
+ <th>
620
+ <label for="ots-display-member-skills"><?php _e( 'Display Skills', 'ots' ); ?></label>
621
+ </th>
622
+ <td>
623
+ <label>
624
+ <input id="ots-display-member-skills"
625
+ name="team_member_skill_bool"
626
+ type="checkbox" <?php checked( $member->skill_bool, 'on' ); ?>
627
+
628
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
629
+ </label>
630
+ </td>
631
+ </tr>
632
+ <tr>
633
+ <th>
634
+ <label for="ots-member-skills-title"><?php _e( 'Skills Title', 'ots' ); ?></label>
635
+ </th>
636
+ <td>
637
+ <input id="ots-member-skills-title"
638
+ name="team_member_skill_title"
639
+ class="regular-text"
640
+ value="<?php esc_attr_e( $member->skill_title ); ?>"
641
+
642
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
643
+ </td>
644
+ </tr>
645
+ <tr>
646
+ <th>
647
+ <label for="ots-member-skill-1"><?php _e( 'Attribute / Skill 1', 'ots' ); ?></label>
648
+ </th>
649
+ <td>
650
+ <input id="ots-member-skill-1"
651
+ name="team_member_skill_titles[]"
652
+ class="ots-member-skill-title"
653
+ placeholder="<?php _e( 'Title', 'ots' ); ?>"
654
+ value="<?php esc_attr_e( $member->skill1 ); ?>"
655
+
656
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
657
+
658
+ <input id="ots-member-skill-1"
659
+ name="team_member_skill_ratings[]"
660
+ type="number"
661
+ min="1"
662
+ max="10"
663
+ class="ots-member-skill-rating"
664
+ placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
665
+ value="<?php esc_attr_e( $member->skill_value1 ); ?>"
666
+
667
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
668
+ </td>
669
+ </tr>
670
+ <tr>
671
+ <th>
672
+ <label for="ots-member-skill-2"><?php _e( 'Attribute / Skill 2', 'ots' ); ?></label>
673
+ </th>
674
+ <td>
675
+ <input id="ots-member-skill-2"
676
+ name="team_member_skill_titles[]"
677
+ class="ots-member-skill-title"
678
+ placeholder="<?php _e( 'Title', 'ots' ); ?>"
679
+ value="<?php esc_attr_e( $member->skill2 ); ?>"
680
+
681
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
682
+
683
+ <input id="ots-member-skill-2"
684
+ name="team_member_skill_ratings[]"
685
+ class="ots-member-skill-rating"
686
+ type="number"
687
+ min="1"
688
+ max="10"
689
+ placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
690
+ value="<?php esc_attr_e( $member->skill_value2 ); ?>"
691
+
692
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
693
+ </td>
694
+ </tr>
695
+ <tr>
696
+ <th>
697
+ <label for="ots-member-skill-3"><?php _e( 'Attribute / Skill 3', 'ots' ); ?></label>
698
+ </th>
699
+ <td>
700
+ <input id="ots-member-skill-3"
701
+ name="team_member_skill_titles[]"
702
+ class="ots-member-skill-title""
703
+ placeholder="<?php _e( 'Title', 'ots' ); ?>"
704
+ value="<?php esc_attr_e( $member->skill3 ); ?>"
705
+
706
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
707
+
708
+ <input id="ots-member-skill-3"
709
+ name="team_member_skill_ratings[]"
710
+ class="ots-member-skill-rating"
711
+ type="number"
712
+ min="1"
713
+ max="10"
714
+ placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
715
+ value="<?php esc_attr_e( $member->skill_value3 ); ?>"
716
+
717
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
718
+ </td>
719
+ </tr>
720
+ <tr>
721
+ <th>
722
+ <label for="ots-member-skill-4"><?php _e( 'Attribute / Skill 4', 'ots' ); ?></label>
723
+ </th>
724
+ <td>
725
+ <input id="ots-member-skill-4"
726
+ name="team_member_skill_titles[]"
727
+ class="ots-member-skill-title"
728
+ placeholder="<?php _e( 'Title', 'ots' ); ?>"
729
+ value="<?php esc_attr_e( $member->skill4 ); ?>"
730
+
731
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
732
+
733
+ <input id="ots-member-skill-4"
734
+ name="team_member_skill_ratings[]"
735
+ class="ots-member-skill-rating"
736
+ type="number"
737
+ min="1"
738
+ max="10"
739
+ placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
740
+ value="<?php esc_attr_e( $member->skill_value4 ); ?>"
741
+
742
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
743
+ </td>
744
+ </tr>
745
+ <tr>
746
+ <th>
747
+ <label for="ots-member-skill-5"><?php _e( 'Attribute / Skill 5', 'ots' ); ?></label>
748
+ </th>
749
+ <td>
750
+ <input id="ots-member-skill-5"
751
+ name="team_member_skill_titles[]"
752
+ class="ots-member-skill-title"
753
+ placeholder="<?php _e( 'Title', 'ots' ); ?>"
754
+ value="<?php esc_attr_e( $member->skill5 ); ?>"
755
+
756
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
757
+
758
+ <input id="ots-member-skill-5"
759
+ name="team_member_skill_ratings[]"
760
+ class="ots-member-skill-rating"
761
+ type="number"
762
+ min="1"
763
+ max="10"
764
+ placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
765
+ value="<?php esc_attr_e( $member->skill_value5 ); ?>"
766
+
767
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
768
+ </td>
769
+ </tr>
770
+ </table>
771
+
772
+ <?php }
773
+
774
+
775
+ /**
776
+ * Output the tags metabox. Note all fields are disabled by default and this metabox has no save handler.
777
+ *
778
+ * @param \WP_Post $post
779
+ * @param array $meta_box
780
+ * @since 4.0.0
781
+ */
782
+ function do_tags_meta_box( \WP_Post $post, array $meta_box ) { ?>
783
+
784
+ <?php wp_nonce_field( 'tags_meta_box', 'tags_meta_box_nonce' ); ?>
785
+
786
+ <?php $member = team_member( $post ); ?>
787
+
788
+ <table id="ots-tags-meta-box" class="ots-meta-box widefat">
789
+ <tr>
790
+ <th>
791
+ <label for="ots-display-member-tags"><?php _e( 'Display Tags', 'ots' ); ?></label>
792
+ </th>
793
+ <td>
794
+ <label>
795
+ <input id="ots-display-member-tags"
796
+ name="team_member_tags_bool"
797
+ type="checkbox" <?php checked( $member->tags_bool, 'on' ); ?>
798
+
799
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
800
+ </label>
801
+ </td>
802
+ </tr>
803
+ <tr>
804
+ <th>
805
+ <label for="ots-member-tags-title"><?php _e( 'Tags Title', 'ots' ); ?></label>
806
+ </th>
807
+ <td>
808
+ <input id="ots-member-tags-title"
809
+ name="team_member_tags_title"
810
+ class="regular-text"
811
+ value="<?php esc_attr_e( $member->tags_title ); ?>"
812
+
813
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
814
+ </td>
815
+ </tr>
816
+ <tr>
817
+ <th>
818
+ <label for="ots-member-tags"><?php _e( 'Attributes', 'ots' ); ?></label>
819
+ </th>
820
+ <td>
821
+ <textarea id="ots-member-tags"
822
+ name="team_member_tags"
823
+ class="regular-text"
824
+ placeholder="<?php _e( 'Enter attributes, comma separated', 'ots' ); ?>"
825
+
826
+ <?php disabled( true, $meta_box['args']['preview'] ); ?>
827
+
828
+ ><?php esc_html_e( $member->tags ); ?></textarea>
829
+ </td>
830
+ </tr>
831
+ <tr>
832
+ <th>
833
+ <label for="ots-member-personal-quote"><?php _e( 'Personal Quote', 'ots' ); ?></label>
834
+ </th>
835
+ <td>
836
+ <input id="ots-member-personal-quote"
837
+ name="team_member_quote"
838
+ class="regular-text"
839
+ value="<?php esc_attr_e( $member->quote ); ?>"
840
+
841
+ <?php disabled( true, $meta_box['args']['preview'] ); ?> />
842
+ </td>
843
+ </tr>
844
+ </table>
845
+
846
+ <?php }
includes/team-view.php CHANGED
@@ -1,198 +1,198 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Enqueue short-code scripts.
7
- *
8
- * @since 4.0.0
9
- */
10
- function enqueue_team_view_scripts() {
11
-
12
- wp_enqueue_style( 'ots-team-view' );
13
- wp_enqueue_script( 'ots' );
14
-
15
- // Plugins can hook on here to have their scripts loaded only on shortcode or widget pages
16
- do_action( 'ots_enqueue_scripts' );
17
-
18
- }
19
-
20
-
21
- /**
22
- * Render the short-code content and supply default attributes.
23
- *
24
- * @param array $attributes
25
- * @return string
26
- * @since 4.0.0
27
- */
28
- function do_shortcode_output( $attributes = array() ) {
29
-
30
- $defaults = apply_filters( 'ots_default_shortcode_atts', array(
31
- 'id' => '',
32
- 'group' => '',
33
- 'columns' => get_option( Options::GRID_COLUMNS ),
34
- 'limit' => get_option( Options::DISPLAY_LIMIT ),
35
- 'template' => get_option( Options::TEMPLATE ),
36
- 'single_template' => get_option( Options::SINGLE_TEMPLATE ),
37
- ) );
38
-
39
- return do_team_view_output( shortcode_atts( $defaults, $attributes, 'our-team' ) );
40
-
41
- }
42
-
43
- add_shortcode( 'our-team', 'ots\do_shortcode_output' );
44
-
45
-
46
- function do_team_view_output( array $args = array() ) {
47
-
48
- $defaults = array(
49
- 'id' => '',
50
- 'group' => '',
51
- 'limit' => -1,
52
- 'columns' => Defaults::GRID_COLUMNS,
53
- 'template' => Defaults::TEMPLATE,
54
- 'single_template' => Defaults::SINGLE_TEMPLATE
55
- );
56
-
57
- $args = wp_parse_args( $args, $defaults );
58
-
59
- // Allow for passing multiple groups
60
- if ( !empty( $args['group'] ) && !is_array( $args['group'] ) ) {
61
- $args['group'] = explode( ',', $args['group'] );
62
- }
63
-
64
- // Cache the post query
65
- $args['members'] = get_members_in_order( $args['limit'], $args['group'] );
66
- $args['guid'] = uniqid( 'ots-' );
67
-
68
- // See if the template belongs to this plugin
69
- $file = template_path( map_template( $args['template'] ) );
70
-
71
-
72
- // Start the buffer
73
- ob_start();
74
- extract( $args );
75
-
76
- echo '<div class="ots-team-view" id="' . esc_attr( $args['id'] ) . '" data-id="' . esc_attr( $args['guid'] ) . '">';
77
-
78
- $template = apply_filters( 'ots_template_include', $file ? $file : $args['template'] );
79
-
80
- do_action( 'ots_before_team_members', $args );
81
-
82
-
83
- // If the template file doesn't exist, fallback to the default
84
- if( file_exists( $template ) ) {
85
-
86
- include $template;
87
-
88
- } else {
89
-
90
- include template_path( map_template( Defaults::TEMPLATE ) );
91
-
92
- }
93
-
94
-
95
- // Hook onto for output inside shortcode after the template as rendered
96
- do_action( 'ots_after_team_members', $args );
97
-
98
- echo '</div>';
99
-
100
-
101
- return apply_filters( 'ots_team_view_output', ob_get_clean(), $args );
102
-
103
- }
104
-
105
-
106
- /**
107
- * Sets up a hook to be called when the current page or post is using the short-code.
108
- *
109
- * @since 4.0.0
110
- */
111
- function page_redirect() {
112
-
113
- if( is_team_view_page() ) {
114
-
115
- enqueue_team_view_scripts();
116
-
117
- }
118
-
119
- }
120
-
121
- add_action( 'template_redirect', 'ots\page_redirect' );
122
-
123
-
124
- /**
125
- * Checks if the current page uses the short-code.
126
- *
127
- * @return bool Whether or not the current page uses the short-code.
128
- * @since 4.0.0
129
- */
130
- function is_team_view_page() {
131
-
132
- global $post;
133
-
134
- return is_a( $post, '\WP_Post' ) && has_shortcode( $post->post_content, 'our-team' );
135
-
136
- }
137
-
138
-
139
- /**
140
- * Print user configurable styles.
141
- *
142
- * @since 4.0.0
143
- */
144
- function print_dynamic_styles() { ?>
145
-
146
- <!-- Global -->
147
-
148
- <style>
149
-
150
- .sc_team_single_member .sc_single_side .social span {
151
- background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ); ?>;
152
- }
153
-
154
- </style>
155
-
156
- <!-- Grid -->
157
-
158
- <style>
159
-
160
- .grid#sc_our_team .sc_team_member .sc_team_member_name,
161
- .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle {
162
- background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ) ?>;
163
- }
164
-
165
- .grid#sc_our_team .sc_team_member {
166
- padding: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px !important;
167
- }
168
-
169
- </style>
170
-
171
- <!-- Grid Circles -->
172
-
173
- <style>
174
-
175
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle,
176
- .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
177
- background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ) ?>;
178
- }
179
-
180
- .grid_circles#sc_our_team .sc_team_member {
181
- margin: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px;
182
- }
183
-
184
- </style>
185
-
186
- <!-- Grid Circles 2 -->
187
-
188
- <style>
189
-
190
- .grid_circles2#sc_our_team .sc_team_member {
191
- margin: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px;
192
- }
193
-
194
- </style>
195
-
196
- <?php }
197
-
198
  add_action( 'wp_print_styles', 'ots\print_dynamic_styles' );
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Enqueue short-code scripts.
7
+ *
8
+ * @since 4.0.0
9
+ */
10
+ function enqueue_team_view_scripts() {
11
+
12
+ wp_enqueue_style( 'ots-team-view' );
13
+ wp_enqueue_script( 'ots' );
14
+
15
+ // Plugins can hook on here to have their scripts loaded only on shortcode or widget pages
16
+ do_action( 'ots_enqueue_scripts' );
17
+
18
+ }
19
+
20
+
21
+ /**
22
+ * Render the short-code content and supply default attributes.
23
+ *
24
+ * @param array $attributes
25
+ * @return string
26
+ * @since 4.0.0
27
+ */
28
+ function do_shortcode_output( $attributes = array() ) {
29
+
30
+ $defaults = apply_filters( 'ots_default_shortcode_atts', array(
31
+ 'id' => '',
32
+ 'group' => '',
33
+ 'columns' => get_option( Options::GRID_COLUMNS ),
34
+ 'limit' => get_option( Options::DISPLAY_LIMIT ),
35
+ 'template' => get_option( Options::TEMPLATE ),
36
+ 'single_template' => get_option( Options::SINGLE_TEMPLATE ),
37
+ ) );
38
+
39
+ return do_team_view_output( shortcode_atts( $defaults, $attributes, 'our-team' ) );
40
+
41
+ }
42
+
43
+ add_shortcode( 'our-team', 'ots\do_shortcode_output' );
44
+
45
+
46
+ function do_team_view_output( array $args = array() ) {
47
+
48
+ $defaults = array(
49
+ 'id' => '',
50
+ 'group' => '',
51
+ 'limit' => -1,
52
+ 'columns' => Defaults::GRID_COLUMNS,
53
+ 'template' => Defaults::TEMPLATE,
54
+ 'single_template' => Defaults::SINGLE_TEMPLATE
55
+ );
56
+
57
+ $args = wp_parse_args( $args, $defaults );
58
+
59
+ // Allow for passing multiple groups
60
+ if ( !empty( $args['group'] ) && !is_array( $args['group'] ) ) {
61
+ $args['group'] = explode( ',', $args['group'] );
62
+ }
63
+
64
+ // Cache the post query
65
+ $args['members'] = get_members_in_order( $args['limit'], $args['group'] );
66
+ $args['guid'] = uniqid( 'ots-' );
67
+
68
+ // See if the template belongs to this plugin
69
+ $file = template_path( map_template( $args['template'] ) );
70
+
71
+
72
+ // Start the buffer
73
+ ob_start();
74
+ extract( $args );
75
+
76
+ echo '<div class="ots-team-view" id="' . esc_attr( $args['id'] ) . '" data-id="' . esc_attr( $args['guid'] ) . '">';
77
+
78
+ $template = apply_filters( 'ots_template_include', $file ? $file : $args['template'] );
79
+
80
+ do_action( 'ots_before_team_members', $args );
81
+
82
+
83
+ // If the template file doesn't exist, fallback to the default
84
+ if( file_exists( $template ) ) {
85
+
86
+ include $template;
87
+
88
+ } else {
89
+
90
+ include template_path( map_template( Defaults::TEMPLATE ) );
91
+
92
+ }
93
+
94
+
95
+ // Hook onto for output inside shortcode after the template as rendered
96
+ do_action( 'ots_after_team_members', $args );
97
+
98
+ echo '</div>';
99
+
100
+
101
+ return apply_filters( 'ots_team_view_output', ob_get_clean(), $args );
102
+
103
+ }
104
+
105
+
106
+ /**
107
+ * Sets up a hook to be called when the current page or post is using the short-code.
108
+ *
109
+ * @since 4.0.0
110
+ */
111
+ function page_redirect() {
112
+
113
+ if( is_team_view_page() ) {
114
+
115
+ enqueue_team_view_scripts();
116
+
117
+ }
118
+
119
+ }
120
+
121
+ add_action( 'template_redirect', 'ots\page_redirect' );
122
+
123
+
124
+ /**
125
+ * Checks if the current page uses the short-code.
126
+ *
127
+ * @return bool Whether or not the current page uses the short-code.
128
+ * @since 4.0.0
129
+ */
130
+ function is_team_view_page() {
131
+
132
+ global $post;
133
+
134
+ return is_a( $post, '\WP_Post' ) && has_shortcode( $post->post_content, 'our-team' );
135
+
136
+ }
137
+
138
+
139
+ /**
140
+ * Print user configurable styles.
141
+ *
142
+ * @since 4.0.0
143
+ */
144
+ function print_dynamic_styles() { ?>
145
+
146
+ <!-- Global -->
147
+
148
+ <style>
149
+
150
+ .sc_team_single_member .sc_single_side .social span {
151
+ background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ); ?>;
152
+ }
153
+
154
+ </style>
155
+
156
+ <!-- Grid -->
157
+
158
+ <style>
159
+
160
+ .grid#sc_our_team .sc_team_member .sc_team_member_name,
161
+ .grid#sc_our_team .sc_team_member .sc_team_member_jobtitle {
162
+ background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ) ?>;
163
+ }
164
+
165
+ .grid#sc_our_team .sc_team_member {
166
+ padding: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px !important;
167
+ }
168
+
169
+ </style>
170
+
171
+ <!-- Grid Circles -->
172
+
173
+ <style>
174
+
175
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_jobtitle,
176
+ .grid_circles#sc_our_team .sc_team_member .sc_team_member_name {
177
+ background: <?php esc_html_e( get_option( Options::MAIN_COLOR ) ) ?>;
178
+ }
179
+
180
+ .grid_circles#sc_our_team .sc_team_member {
181
+ margin: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px;
182
+ }
183
+
184
+ </style>
185
+
186
+ <!-- Grid Circles 2 -->
187
+
188
+ <style>
189
+
190
+ .grid_circles2#sc_our_team .sc_team_member {
191
+ margin: <?php esc_html_e( get_option( Options::MARGIN ) ); ?>px;
192
+ }
193
+
194
+ </style>
195
+
196
+ <?php }
197
+
198
  add_action( 'wp_print_styles', 'ots\print_dynamic_styles' );
includes/team_member-post-type.php DELETED
@@ -1,830 +0,0 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
-
6
- /**
7
- * Enqueue scripts for single.php.
8
- *
9
- * @since 4.0.0
10
- */
11
- function enqueue_single_scripts() {
12
-
13
- if( get_post_type() == 'team_member' ) {
14
- wp_enqueue_style( 'ots-single' );
15
- }
16
-
17
- }
18
-
19
- add_action( 'wp_enqueue_scripts', 'ots\enqueue_single_scripts' );
20
-
21
-
22
- /**
23
- * Manually override the theme's template.
24
- *
25
- * @param $template
26
- * @return string
27
- * @since 4.0.0
28
- */
29
- function include_single_template( $template ) {
30
-
31
- if ( is_single() && get_post_type() == 'team_member' ) {
32
-
33
- // Pull in the template
34
- if( override_theme_template() ) {
35
- $template = locate_template( 'single.php' );
36
- }
37
-
38
- }
39
-
40
- return $template;
41
-
42
- }
43
-
44
- add_filter( 'template_include', 'ots\include_single_template' );
45
-
46
-
47
- /**
48
- * Override the default single-team_member template used by themes to avoid breakage.
49
- *
50
- * @return bool
51
- * @since 4.0.0
52
- */
53
- function override_theme_template() {
54
-
55
- $template = get_option( Options::SINGLE_TEMPLATE );
56
-
57
- return ( $template === 'standard' || !template_path( $template ) ) &&
58
- file_exists( get_template_directory() . '/single-team_member.php' );
59
-
60
- }
61
-
62
-
63
- /**
64
- * Register the team member custom post type.
65
- *
66
- * @since 4.0.0
67
- */
68
- function register_team_member_post_type() {
69
-
70
- $labels = array(
71
- 'name' => _x( 'Team Members', 'post type general name', 'ots' ),
72
- 'singular_name' => _x( 'Team Member', 'post type singular name', 'ots' ),
73
- 'menu_name' => _x( 'Team', 'admin menu', 'ots' ),
74
- 'name_admin_bar' => _x( 'Team Member', 'add new on admin bar', 'ots' ),
75
- 'add_new' => _x( 'Add New', 'team_member', 'ots' ),
76
- 'add_new_item' => __( 'Add New Member', 'ots' ),
77
- 'new_item' => __( 'New Member', 'ots' ),
78
- 'edit_item' => __( 'Edit Member', 'ots' ),
79
- 'view_item' => __( 'View Member', 'ots' ),
80
- 'all_items' => __( 'All Members', 'ots' ),
81
- 'search_items' => __( 'Search Members', 'ots' ),
82
- 'parent_item_colon' => __( 'Parent Members:', 'ots' ),
83
- 'not_found' => __( 'No members found.', 'ots' ),
84
- 'not_found_in_trash' => __( 'No members found in Trash.', 'ots' ),
85
- 'archives' => __( 'Member Archives', 'ots' ),
86
- 'attributes' => __( 'Member Attributes', 'ots' ),
87
-
88
- );
89
-
90
- $args = array(
91
- 'menu_icon' => 'dashicons-admin-users',
92
- 'labels' => $labels,
93
- 'capability_type' => 'post',
94
- 'register_meta_box_cb' => 'ots\team_member_meta_boxes',
95
- 'supports' => array( 'title', 'editor', 'thumbnail' ),
96
- 'public' => true,
97
- 'rewrite' => array(
98
- 'slug' => get_option( Options::REWRITE_SLUG )
99
- )
100
- );
101
-
102
- register_post_type( 'team_member', $args );
103
-
104
- }
105
-
106
- add_action( 'init', 'ots\register_team_member_post_type' );
107
-
108
-
109
- /**
110
- * Register the member grouping taxonomy.
111
- *
112
- * @since 4.0.0
113
- */
114
- function register_team_member_position_taxonomy() {
115
-
116
- $labels = array(
117
- 'name' => _x( 'Groups', 'taxonomy general name', 'ots' ),
118
- 'singular_name' => _x( 'Group', 'taxonomy singular name', 'ots' ),
119
- 'search_items' => __( 'Search Groups', 'ots' ),
120
- 'all_items' => __( 'All Groups', 'ots' ),
121
- 'parent_item' => __( 'Parent Group', 'ots' ),
122
- 'parent_item_colon' => __( 'Parent Group:', 'ots' ),
123
- 'edit_item' => __( 'Edit Group', 'ots' ),
124
- 'update_item' => __( 'Update Group', 'ots' ),
125
- 'add_new_item' => __( 'Add New Group', 'ots' ),
126
- 'new_item_name' => __( 'New Group', 'ots' ),
127
- 'menu_name' => __( 'Groups', 'ots' ),
128
- );
129
-
130
- $args = array(
131
- 'labels' => $labels,
132
- 'hierarchical' => true,
133
- );
134
-
135
- register_taxonomy( 'team_member_position', 'team_member', $args );
136
- }
137
-
138
- add_action( 'init', 'ots\register_team_member_position_taxonomy' );
139
-
140
-
141
- /**
142
- * Add custom columns to the team member posts table.
143
- *
144
- * @param $columns
145
- * @return mixed
146
- * @since 4.0.0
147
- */
148
- function add_team_member_custom_columns( $columns ) {
149
-
150
- unset( $columns['date'] );
151
-
152
- $columns['title'] = __( 'Name', 'ots' );
153
- $columns['team_member_title'] = __( 'Job Title', 'ots' );
154
- $columns['team_member_group'] = __( 'Group', 'ots' );
155
- $columns['team_member_image'] = __( 'Image', 'ots' );
156
-
157
- return $columns;
158
-
159
- }
160
-
161
- add_filter( 'manage_edit-team_member_columns', 'ots\add_team_member_custom_columns' );
162
-
163
-
164
- /**
165
- * Output custom columns in the team member posts table.
166
- *
167
- * @param $column
168
- * @param $post_id
169
- * @since 4.0.0
170
- */
171
- function do_team_member_custom_columns( $column, $post_id ) {
172
-
173
- switch( $column ) {
174
-
175
- case 'team_member_title' :
176
- echo get_post_meta( $post_id, 'team_member_title', true );
177
- break;
178
-
179
- case 'team_member_image' :
180
- echo member_avatar( $post_id, array( 50, 50 ) );
181
- break;
182
-
183
- case 'team_member_group':
184
-
185
- $terms = get_the_terms( get_post( $post_id ), 'team_member_position' );
186
-
187
- if ( !empty( $terms ) ) {
188
- echo $terms[0]->name;
189
- }
190
-
191
- break;
192
-
193
-
194
- }
195
-
196
- }
197
-
198
- add_action( 'manage_team_member_posts_custom_column', 'ots\do_team_member_custom_columns', 10, 2 );
199
-
200
-
201
- /**
202
- * Append articles and social links when using single.php.
203
- *
204
- * @param $content
205
- * @return string
206
- * @since 4.0.0
207
- */
208
- function single_member_content( $content ) {
209
-
210
- // Use {} to prevent whitespace leaks after headers have been sent
211
- if ( is_single() && get_post_type() == 'team_member' &&
212
- get_option( Options::SINGLE_TEMPLATE ) == 'standard' ) { ob_start(); ?>
213
-
214
- <div id="sc_our_team">
215
-
216
- <div class="sc_team_member">
217
-
218
- <?php echo $content; ?>
219
-
220
- <?php if ( get_option( Options::SHOW_SINGLE_SOCIAL ) == 'on' ) : ?>
221
-
222
- <div class="icons"><?php do_member_social_links(); ?></div>
223
-
224
- <?php endif; ?>
225
-
226
- <hr>
227
-
228
- <?php if ( get_post_meta( get_the_ID(), 'team_member_article_bool', true ) === 'on' ) : ?>
229
-
230
- <div class="sc_team_posts sc_team_post">
231
-
232
- <h3 class="skills-title"><?php esc_attr_e( get_post_meta( get_the_ID(), 'team_member_article_title', true ) ); ?></h3>
233
-
234
- <div class="sc-team-member-posts">
235
-
236
- <?php foreach ( get_member_articles() as $article ) : ?>
237
-
238
- <div class="sc-team-member-post">
239
-
240
- <div class="width25 left">
241
-
242
- <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_post_thumbnail( $article, 'medium' ); ?></a>
243
-
244
- </div>
245
-
246
- <div class="width75 left">
247
-
248
- <a href="<?php the_permalink( $article ); ?>"><?php echo get_the_title( $article ); ?></a>
249
-
250
- </div>
251
-
252
- <div class="clear"></div>
253
-
254
- </div>
255
-
256
- <?php endforeach; ?>
257
-
258
- </div>
259
-
260
- <div class="clear"></div>
261
-
262
- </div>
263
-
264
- <?php endif; ?>
265
-
266
- </div>
267
-
268
- </div>
269
-
270
- <?php $content = ob_get_clean();
271
-
272
- }
273
-
274
- return $content;
275
-
276
- }
277
-
278
- add_filter( 'the_content', 'ots\single_member_content' );
279
-
280
-
281
- /**
282
- * Renders the member custom post type metabox fields.
283
- *
284
- * @since 4.0.0
285
- */
286
- function team_member_meta_boxes() {
287
-
288
- if( is_admin() ) {
289
-
290
- $preview = apply_filters( 'ots_enable_pro_preview', true );
291
-
292
- add_meta_box( 'team-member-contact', __( 'Contact Information', 'ots' ), 'ots\do_contact_meta_box' );
293
- add_meta_box( 'team-member-articles', __( 'Authored / Favorite Articles', 'ots' ), 'ots\do_articles_meta_box' );
294
-
295
- add_meta_box( 'team-member-skills', __( 'Attributes / Skills / Ratings' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_skills_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
296
- add_meta_box( 'team-member-tags', __( 'Interests / Tags / Additional Skills' . ( $preview ? ' - <i class="ots-pro">Pro version only</i>' : '' ), 'ots' ), 'ots\do_tags_meta_box', null, 'advanced', 'default', array( 'preview' => $preview ) );
297
-
298
- }
299
-
300
- }
301
-
302
- /**
303
- * Add default meta keys when creating a new team member.
304
- *
305
- * @param $post_id
306
- * @param $post
307
- * @param $update
308
- * @since 4.0.0
309
- */
310
- function set_default_post_meta( $post_id, $post, $update ) {
311
-
312
- if( !$update ) {
313
- update_post_meta( $post_id, 'sc_member_order', PHP_INT_MAX );
314
- }
315
-
316
- }
317
-
318
- add_action( 'save_post_team_member', 'ots\set_default_post_meta', 10, 3 );
319
-
320
-
321
- /**
322
- * Sanitize and save the contact meta box fields.
323
- *
324
- * @param $post_id
325
- * @since 4.0.0
326
- */
327
- function save_contact_meta_box( $post_id ) {
328
-
329
- if( isset( $_POST['articles_mata_box_nonce'] ) &&
330
- wp_verify_nonce( $_POST['contact_mata_box_nonce'], 'contact_meta_box' ) ) {
331
-
332
- update_post_meta( $post_id, 'team_member_title', sanitize_text_field( $_POST['team_member_title'] ) );
333
- update_post_meta( $post_id, 'team_member_phone', sanitize_text_field( $_POST['team_member_phone'] ) );
334
- update_post_meta( $post_id, 'team_member_other', sanitize_text_field( $_POST['team_member_other'] ) );
335
- update_post_meta( $post_id, 'team_member_other_icon', sanitize_key( $_POST['team_member_other_icon'] ) );
336
- update_post_meta( $post_id, 'team_member_email', sanitize_email( $_POST['team_member_email'] ) );
337
-
338
- foreach( $_POST['team_member_links'] as $network => $link ) {
339
- update_post_meta( $post_id, 'team_member_' . sanitize_key( $network ), esc_url_raw( $link ) );
340
- }
341
-
342
- }
343
-
344
- }
345
-
346
- add_action( 'save_post_team_member', 'ots\save_contact_meta_box' );
347
-
348
-
349
- /**
350
- * Sanitize and save the articles meta box fields.
351
- *
352
- * @param $post_id
353
- * @since 4.0.0
354
- */
355
- function save_articles_meta_box( $post_id ) {
356
-
357
- if( isset( $_POST['articles_mata_box_nonce'] ) &&
358
- wp_verify_nonce( $_POST['articles_mata_box_nonce'], 'articles_meta_box' ) ) {
359
-
360
- update_post_meta( $post_id, 'team_member_article_bool', isset( $_POST['team_member_article_bool'] ) ? 'on' : '' );
361
- update_post_meta( $post_id, 'team_member_article_title', sanitize_text_field( $_POST['team_member_article_title'] ) );
362
-
363
- foreach( $_POST['team_member_articles'] as $index => $article ) {
364
- update_post_meta( $post_id, 'team_member_article' . $index, intval( $article ) );
365
- }
366
-
367
- }
368
-
369
- }
370
-
371
- add_action( 'save_post_team_member', 'ots\save_articles_meta_box' );
372
-
373
-
374
- /**
375
- * Output the contact info meta box.
376
- *
377
- * @param \WP_Post $post
378
- * @since 4.0.0
379
- */
380
- function do_contact_meta_box( \WP_Post $post ) { ?>
381
-
382
- <?php wp_nonce_field( 'contact_meta_box', 'contact_mata_box_nonce' ); ?>
383
-
384
- <?php $member = team_member( $post ); ?>
385
-
386
- <table id="ots-contact-meta-box" class="ots-meta-box widefat">
387
- <tr>
388
- <th>
389
- <label for="ots-member-job-title"><?php _e( 'Job Title', 'ots' ); ?></label>
390
- </th>
391
- <td>
392
- <input id="ots-member-job-title"
393
- name="team_member_title"
394
- class="regular-text"
395
- value="<?php esc_attr_e( $member->title ); ?>" />
396
- </td>
397
- </tr>
398
- <tr>
399
- <th>
400
- <label for="ots-member-email"><?php _e( 'Email Address', 'ots' ); ?></label>
401
- </th>
402
- <td>
403
- <input id="ots-member-email"
404
- name="team_member_email"
405
- class="regular-text"
406
- value="<?php esc_attr_e( $member->email ); ?>" />
407
- </td>
408
- </tr>
409
- <tr>
410
- <th>
411
- <label for="ots-member-phone"><?php _e( 'Phone Number', 'ots' ); ?></label>
412
- </th>
413
- <td>
414
- <input id="ots-member-phone"
415
- name="team_member_phone"
416
- class="regular-text"
417
- value="<?php esc_attr_e( $member->phone ); ?>" />
418
- </td>
419
- </tr>
420
- <tr>
421
- <th>
422
- <label for="ots-member-facebook"><?php _e( 'Facebook', 'ots' ); ?></label>
423
- </th>
424
- <td>
425
- <input id="ots-member-facebook"
426
- name="team_member_links[facebook]"
427
- class="regular-text"
428
- value="<?php esc_attr_e( $member->facebook ); ?>" />
429
- </td>
430
- </tr>
431
- <tr>
432
- <th>
433
- <label for="ots-member-twitter"><?php _e( 'Twitter', 'ots' ); ?></label>
434
- </th>
435
- <td>
436
- <input id="ots-member-twitter"
437
- name="team_member_links[twitter]"
438
- class="regular-text"
439
- value="<?php esc_attr_e( $member->twitter ); ?>" />
440
- </td>
441
- </tr>
442
- <tr>
443
- <th>
444
- <label for="ots-member-linkedin"><?php _e( 'Linkedin', 'ots' ); ?></label>
445
- </th>
446
- <td>
447
- <input id="ots-member-linkedin"
448
- name="team_member_links[linkedin]"
449
- class="regular-text"
450
- value="<?php esc_attr_e( $member->linkedin ); ?>" />
451
- </td>
452
- </tr>
453
- <tr>
454
- <th>
455
- <label for="ots-member-gplus"><?php _e( 'Google Plus', 'ots' ); ?></label>
456
- </th>
457
- <td>
458
- <input id="ots-member-gplus"
459
- name="team_member_links[gplus]"
460
- class="regular-text"
461
- value="<?php esc_attr_e( $member->gplus ); ?>" />
462
- </td>
463
- </tr>
464
- <tr>
465
- <th>
466
- <label for="ots-member-instagram"><?php _e( 'Instagram', 'ots' ); ?></label>
467
- </th>
468
- <td>
469
- <input id="ots-member-instagram"
470
- name="team_member_links[instagram]"
471
- class="regular-text"
472
- value="<?php esc_attr_e( $member->instagram ); ?>" />
473
- </td>
474
- </tr>
475
- <tr>
476
- <th>
477
- <label for="ots-member-pinterest"><?php _e( 'Pinterest', 'ots' ); ?></label>
478
- </th>
479
- <td>
480
- <input id="ots-member-pinterest"
481
- name="team_member_links[pinterest]"
482
- class="regular-text"
483
- value="<?php esc_attr_e( $member->pinterest ); ?>" />
484
- </td>
485
- </tr>
486
- <tr>
487
- <th>
488
- <label for="ots-member-website"><?php _e( 'Website', 'ots' ); ?></label>
489
- </th>
490
- <td>
491
- <input id="ots-member-website"
492
- name="team_member_links[website]"
493
- class="regular-text"
494
- value="<?php esc_attr_e( $member->website ); ?>" />
495
- </td>
496
- </tr>
497
- <tr>
498
- <th>
499
- <label for="ots-member-other"><?php _e( 'Other', 'ots' ); ?></label>
500
- </th>
501
- <td>
502
-
503
- <?php $other_icon = $member->other_icon; ?>
504
-
505
- <select id="ots-member-other-icon" name="team_member_other_icon">
506
- <option value=""><?php _e( 'Select an Icon', 'ots' ); ?></option>
507
- <option value="etsy" <?php selected( $other_icon, 'etsy' ); ?>><?php _e( 'Etsy', 'ots' ); ?></option>
508
- <option value="whatsapp" <?php selected( $other_icon, 'whatsapp' ); ?>><?php _e( 'Whatsapp', 'ots' ); ?></option>
509
- <option value="skype" <?php selected( $other_icon, 'skype' ); ?>><?php _e( 'Skype', 'ots' ); ?></option>
510
- <option value="vimeo" <?php selected( $other_icon, 'vimeo' ); ?>><?php _e( 'Vimeo', 'ots' ); ?></option>
511
- <option value="soundcloud" <?php selected( $other_icon, 'soundcloud' ); ?>><?php _e( 'Soundcloud', 'ots' ); ?></option>
512
- </select>
513
- <input id="ots-member-other"
514
- name="team_member_other"
515
- value="<?php esc_attr_e( $member->other ); ?>" />
516
- </td>
517
- </tr>
518
- </table>
519
-
520
- <?php }
521
-
522
-
523
- /**
524
- * Output the articles metabox.
525
- *
526
- * @param \WP_Post $post
527
- * @since 4.0.0
528
- */
529
- function do_articles_meta_box( \WP_Post $post ) { ?>
530
-
531
- <?php wp_nonce_field( 'articles_meta_box', 'articles_mata_box_nonce' ); ?>
532
-
533
- <?php $member = team_member( $post ); ?>
534
-
535
- <table id="ots-articles-meta-box" class="ots-meta-box widefat">
536
- <tr>
537
- <th>
538
- <label for="ots-display-member-articles"><?php _e( 'Display Articles', 'ots' ); ?></label>
539
- </th>
540
- <td>
541
- <label>
542
- <input id="ots-display-member-articles"
543
- name="team_member_article_bool"
544
- type="checkbox" <?php checked( $member->article_bool, 'on' ); ?> />
545
- </label>
546
- </td>
547
- </tr>
548
- <tr>
549
- <th>
550
- <label for="ots-member-articles-title"><?php _e( 'Articles Title', 'ots' ); ?></label>
551
- </th>
552
- <td>
553
- <input id="ots-member-articles-title"
554
- name="team_member_article_title"
555
- class="regular-text"
556
- value="<?php esc_attr_e( $member->article_title ); ?>" />
557
- </td>
558
- </tr>
559
- <tr>
560
- <th>
561
- <label for="ots-member-article-1"><?php _e( 'Article 1', 'ots' ); ?></label>
562
- </th>
563
- <td>
564
- <?php posts_dropdown( 'team_member_articles[1]', 'ots-member-articles-1', $member->article1 ); ?>
565
- </td>
566
- </tr>
567
- <tr>
568
- <th>
569
- <label for="ots-member-article-2"><?php _e( 'Article 2', 'ots' ); ?></label>
570
- </th>
571
- <td>
572
- <?php posts_dropdown( 'team_member_articles[2]', 'ots-member-articles-2', $member->article2 ); ?>
573
- </td>
574
- </tr>
575
- <tr>
576
- <th>
577
- <label for="ots-member-article-3"><?php _e( 'Article 3', 'ots' ); ?></label>
578
- </th>
579
- <td>
580
- <?php posts_dropdown( 'team_member_articles[3]', 'ots-member-articles-3', $member->article3 ); ?>
581
- </td>
582
- </tr>
583
- </table>
584
-
585
- <?php }
586
-
587
-
588
- /**
589
- * Output the skills meta box. Note all fields are disabled by default and this meta box has no save handler.
590
- *
591
- * @param \WP_Post $post
592
- * @param array $meta_box
593
- * @since 4.0.0
594
- */
595
- function do_skills_meta_box( \WP_Post $post, array $meta_box ) { ?>
596
-
597
- <?php wp_nonce_field( 'skills_meta_box', 'skills_meta_box_nonce' ); ?>
598
-
599
- <?php $member = team_member( $post ); ?>
600
-
601
- <table id="ots-skills-meta-box" class="ots-meta-box widefat">
602
- <tr>
603
- <th>
604
- <label for="ots-display-member-skills"><?php _e( 'Display Skills', 'ots' ); ?></label>
605
- </th>
606
- <td>
607
- <label>
608
- <input id="ots-display-member-skills"
609
- name="team_member_skill_bool"
610
- type="checkbox" <?php checked( $member->skill_bool, 'on' ); ?>
611
-
612
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
613
- </label>
614
- </td>
615
- </tr>
616
- <tr>
617
- <th>
618
- <label for="ots-member-skills-title"><?php _e( 'Skills Title', 'ots' ); ?></label>
619
- </th>
620
- <td>
621
- <input id="ots-member-skills-title"
622
- name="team_member_skill_title"
623
- class="regular-text"
624
- value="<?php esc_attr_e( $member->skill_title ); ?>"
625
-
626
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
627
- </td>
628
- </tr>
629
- <tr>
630
- <th>
631
- <label for="ots-member-skill-1"><?php _e( 'Attribute / Skill 1', 'ots' ); ?></label>
632
- </th>
633
- <td>
634
- <input id="ots-member-skill-1"
635
- name="team_member_skill_titles[]"
636
- class="ots-member-skill-title"
637
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
638
- value="<?php esc_attr_e( $member->skill1 ); ?>"
639
-
640
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
641
-
642
- <input id="ots-member-skill-1"
643
- name="team_member_skill_ratings[]"
644
- type="number"
645
- min="1"
646
- max="10"
647
- class="ots-member-skill-rating"
648
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
649
- value="<?php esc_attr_e( $member->skill_value1 ); ?>"
650
-
651
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
652
- </td>
653
- </tr>
654
- <tr>
655
- <th>
656
- <label for="ots-member-skill-2"><?php _e( 'Attribute / Skill 2', 'ots' ); ?></label>
657
- </th>
658
- <td>
659
- <input id="ots-member-skill-2"
660
- name="team_member_skill_titles[]"
661
- class="ots-member-skill-title"
662
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
663
- value="<?php esc_attr_e( $member->skill2 ); ?>"
664
-
665
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
666
-
667
- <input id="ots-member-skill-2"
668
- name="team_member_skill_ratings[]"
669
- class="ots-member-skill-rating"
670
- type="number"
671
- min="1"
672
- max="10"
673
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
674
- value="<?php esc_attr_e( $member->skill_value2 ); ?>"
675
-
676
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
677
- </td>
678
- </tr>
679
- <tr>
680
- <th>
681
- <label for="ots-member-skill-3"><?php _e( 'Attribute / Skill 3', 'ots' ); ?></label>
682
- </th>
683
- <td>
684
- <input id="ots-member-skill-3"
685
- name="team_member_skill_titles[]"
686
- class="ots-member-skill-title""
687
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
688
- value="<?php esc_attr_e( $member->skill3 ); ?>"
689
-
690
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
691
-
692
- <input id="ots-member-skill-3"
693
- name="team_member_skill_ratings[]"
694
- class="ots-member-skill-rating"
695
- type="number"
696
- min="1"
697
- max="10"
698
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
699
- value="<?php esc_attr_e( $member->skill_value3 ); ?>"
700
-
701
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
702
- </td>
703
- </tr>
704
- <tr>
705
- <th>
706
- <label for="ots-member-skill-4"><?php _e( 'Attribute / Skill 4', 'ots' ); ?></label>
707
- </th>
708
- <td>
709
- <input id="ots-member-skill-4"
710
- name="team_member_skill_titles[]"
711
- class="ots-member-skill-title"
712
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
713
- value="<?php esc_attr_e( $member->skill4 ); ?>"
714
-
715
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
716
-
717
- <input id="ots-member-skill-4"
718
- name="team_member_skill_ratings[]"
719
- class="ots-member-skill-rating"
720
- type="number"
721
- min="1"
722
- max="10"
723
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
724
- value="<?php esc_attr_e( $member->skill_value4 ); ?>"
725
-
726
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
727
- </td>
728
- </tr>
729
- <tr>
730
- <th>
731
- <label for="ots-member-skill-5"><?php _e( 'Attribute / Skill 5', 'ots' ); ?></label>
732
- </th>
733
- <td>
734
- <input id="ots-member-skill-5"
735
- name="team_member_skill_titles[]"
736
- class="ots-member-skill-title"
737
- placeholder="<?php _e( 'Title', 'ots' ); ?>"
738
- value="<?php esc_attr_e( $member->skill5 ); ?>"
739
-
740
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
741
-
742
- <input id="ots-member-skill-5"
743
- name="team_member_skill_ratings[]"
744
- class="ots-member-skill-rating"
745
- type="number"
746
- min="1"
747
- max="10"
748
- placeholder="<?php _e( 'Rating 1 - 10', 'ots' ); ?>"
749
- value="<?php esc_attr_e( $member->skill_value5 ); ?>"
750
-
751
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
752
- </td>
753
- </tr>
754
- </table>
755
-
756
- <?php }
757
-
758
-
759
- /**
760
- * Output the tags metabox. Note all fields are disabled by default and this metabox has no save handler.
761
- *
762
- * @param \WP_Post $post
763
- * @param array $meta_box
764
- * @since 4.0.0
765
- */
766
- function do_tags_meta_box( \WP_Post $post, array $meta_box ) { ?>
767
-
768
- <?php wp_nonce_field( 'tags_meta_box', 'tags_meta_box_nonce' ); ?>
769
-
770
- <?php $member = team_member( $post ); ?>
771
-
772
- <table id="ots-tags-meta-box" class="ots-meta-box widefat">
773
- <tr>
774
- <th>
775
- <label for="ots-display-member-tags"><?php _e( 'Display Tags', 'ots' ); ?></label>
776
- </th>
777
- <td>
778
- <label>
779
- <input id="ots-display-member-tags"
780
- name="team_member_tags_bool"
781
- type="checkbox" <?php checked( $member->tags_bool, 'on' ); ?>
782
-
783
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
784
- </label>
785
- </td>
786
- </tr>
787
- <tr>
788
- <th>
789
- <label for="ots-member-tags-title"><?php _e( 'Tags Title', 'ots' ); ?></label>
790
- </th>
791
- <td>
792
- <input id="ots-member-tags-title"
793
- name="team_member_tags_title"
794
- class="regular-text"
795
- value="<?php esc_attr_e( $member->tags_title ); ?>"
796
-
797
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
798
- </td>
799
- </tr>
800
- <tr>
801
- <th>
802
- <label for="ots-member-tags"><?php _e( 'Attributes', 'ots' ); ?></label>
803
- </th>
804
- <td>
805
- <textarea id="ots-member-tags"
806
- name="team_member_tags"
807
- class="regular-text"
808
- placeholder="<?php _e( 'Enter attributes, comma separated', 'ots' ); ?>"
809
-
810
- <?php disabled( true, $meta_box['args']['preview'] ); ?>
811
-
812
- ><?php esc_html_e( $member->tags ); ?></textarea>
813
- </td>
814
- </tr>
815
- <tr>
816
- <th>
817
- <label for="ots-member-personal-quote"><?php _e( 'Personal Quote', 'ots' ); ?></label>
818
- </th>
819
- <td>
820
- <input id="ots-member-personal-quote"
821
- name="team_member_quote"
822
- class="regular-text"
823
- value="<?php esc_attr_e( $member->quote ); ?>"
824
-
825
- <?php disabled( true, $meta_box['args']['preview'] ); ?> />
826
- </td>
827
- </tr>
828
- </table>
829
-
830
- <?php }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/tools.php CHANGED
@@ -1,433 +1,433 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- function get_csv_fields() {
6
- $sanitize_bool = function ( $val ) {
7
- return $val === 'on' || empty( $val ) ? $val : '';
8
- };
9
- $fields = array(
10
- 'name' => 'sanitize_text_field',
11
- 'title' => 'sanitize_text_field',
12
- 'bio' => 'wp_kses_post',
13
- 'photo_url' => 'esc_url_raw',
14
- 'email' => 'sanitize_email',
15
- 'phone' => 'sanitize_text_field',
16
- 'facebook' => 'esc_url_raw',
17
- 'twitter' => 'esc_url_raw',
18
- 'linkedin' => 'esc_url_raw',
19
- 'instagram' => 'esc_url_raw',
20
- 'pinterest' => 'esc_url_raw',
21
- 'gplus' => 'esc_url_raw',
22
- 'website' => 'esc_url_raw',
23
- 'other_icon' => 'sanitize_text_field',
24
- 'other' => 'sanitize_text_field',
25
- 'article_bool' => $sanitize_bool,
26
- 'article_title' => 'sanitize_text_field',
27
- 'article1' => 'intval',
28
- 'article2' => 'intval',
29
- 'article3' => 'intval',
30
- 'skill_bool' => $sanitize_bool,
31
- 'skill_title' => 'sanitize_text_field',
32
- 'skill1' => 'sanitize_text_field',
33
- 'skill_value1' => 'intval',
34
- 'skill2' => 'sanitize_text_field',
35
- 'skill_value2' => 'intval',
36
- 'skill3' => 'sanitize_text_field',
37
- 'skill_value3' => 'intval',
38
- 'skill4' => 'sanitize_text_field',
39
- 'skill_value4' => 'intval',
40
- 'skill5' => 'sanitize_text_field',
41
- 'skill_value5' => 'intval',
42
- 'tags_bool' => $sanitize_bool,
43
- 'tags_title' => 'sanitize_text_field',
44
- 'tags' => 'sanitize_text_field',
45
- 'quote' => 'sanitize_text_field'
46
- );
47
- return $fields;
48
- }
49
-
50
- add_action( 'admin_post_ots_export_team', function() {
51
- $message = array();
52
- $team = new \WP_Query( array(
53
- 'post_type' => 'team_member',
54
- 'post_status' => 'publish',
55
- 'posts_per_page' => -1
56
- ) );
57
-
58
- if ( $team->post_count <= 0 ) {
59
- $message['export_response'] = 'Failed';
60
- $message['export_output'] = urlencode( 'There are no team members to export' );
61
- } else {
62
- $members = array();
63
-
64
- foreach( $team->posts as $member ) {
65
- $member = team_member( $member->ID );
66
- $export = array(
67
- 'name' => sanitize_text_field( $member->get_name() ),
68
- 'title' => sanitize_text_field( $member->title ),
69
- 'bio' => wp_kses_post( $member->get_bio() ),
70
- 'photo_url' => esc_url_raw( get_the_post_thumbnail_url( $member->get_id() ) ),
71
- );
72
-
73
- $fields = get_csv_fields();
74
-
75
- unset( $fields['name'] );
76
- unset( $fields['title'] );
77
- unset( $fields['bio'] );
78
- unset( $fields['photo_url'] );
79
-
80
- foreach ( $fields as $field => $sanitize_callback ) {
81
- $export[$field] = call_user_func( $sanitize_callback, $member->{$field} );
82
- }
83
-
84
- $members[ $member->get_id() ] = $export;
85
- }
86
-
87
- $csv = put_csv( $members );
88
- $dir = wp_upload_dir();
89
- $file_path = $dir['path'] . '/export.csv';
90
-
91
- if ( create_file( $file_path, $csv ) ) {
92
- $message['export_response'] = 'Success!';
93
- $message['export_output'] = $dir['url'] . '/export.csv';
94
- } else {
95
- $message['export_response'] = 'Failed';
96
- $message['export_output'] = urlencode( 'Cannot create file, check your server permissions' );
97
- $message['csv'] = $csv;
98
- }
99
- }
100
-
101
- wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
102
- });
103
-
104
-
105
- add_action( 'admin_post_ots_import_team', function() {
106
- $message = array();
107
- $total_imported = 0;
108
-
109
- maybe_delete_members();
110
-
111
- // $accepted_mime_types = array(
112
- // 'text/csv',
113
- // 'text/comma-separated-values',
114
- // 'text/plain',
115
- // 'text/anytext',
116
- // 'text/*',
117
- // 'text/plain',
118
- // 'text/anytext',
119
- // 'text/*',
120
- // 'application/csv',
121
- // 'application/excel',
122
- // );
123
-
124
- // Ensure user has selected an import file
125
- if ( empty( $_FILES['ots_file_import'] ) ) {
126
- $message['import_response'] = 'Failed';
127
- $message['import_output'] = urlencode( 'Missing import file.' );
128
- wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
129
- return;
130
- }
131
-
132
- // Ensure the file is of the right type
133
- // if ( empty( $_FILES['ots_file_import']['type'] ) || !in_array( strtolower( $_FILES['ots_file_import']['type'] ), $accepted_mime_types ) ) {
134
- // $message['import_response'] = 'Failed';
135
- // $message['import_output'] = urlencode( 'The file you have uploaded cannot be processed. Please upload a CSV file.' );
136
- // wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
137
- // return;
138
- // }
139
-
140
- $upload = wp_upload_bits( $_FILES['ots_file_import']['name'], null, file_get_contents( $_FILES['ots_file_import']['tmp_name'] ) );
141
- $data = read_csv( $upload['file'] );
142
-
143
- foreach ( $data as $row ) {
144
- $id = wp_insert_post( array(
145
- 'post_type' => 'team_member',
146
- 'post_status' => 'publish'
147
- ) );
148
-
149
- if ( is_wp_error( $id ) ) {
150
- continue;
151
- }
152
-
153
- $member = team_member( $id );
154
- $fields = get_csv_fields();
155
- $total_imported++;
156
-
157
- foreach ( $row as $key => $val ) {
158
- $val = call_user_func( $fields[$key], $val );
159
-
160
- switch( $key ) {
161
- case 'name' :
162
- $member->set_name( $val );
163
- break;
164
-
165
- case 'photo_url' :
166
- import_photo( $member, $val );
167
- break;
168
-
169
- case 'bio' :
170
- $member->set_bio( $val );
171
- break;
172
-
173
- default :
174
- $member->$key = $val;
175
- break;
176
- }
177
- }
178
- }
179
-
180
- $message['import_response'] = 'Success';
181
- $message['import_output'] = urlencode( 'Import successful! ' . $total_imported . ' member(s) imported' );
182
-
183
- wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
184
- });
185
-
186
-
187
- function import_photo( TeamMember $member, $photo_url ) {
188
- if ( !$photo_url ) {
189
- return;
190
- }
191
-
192
- $attach_id = media_sideload_image( $photo_url, $member->get_id(), null, 'id' );
193
-
194
- if ( !is_wp_error( $attach_id ) ) {
195
- update_post_meta( $member->get_id(), '_thumbnail_id', $attach_id );
196
- }
197
- }
198
-
199
- function get_mime_type( $extension ) {
200
- $mime = null;
201
-
202
- switch ( $extension ) {
203
- case 'jpg' || 'jpeg' :
204
- $mime = 'image/jpeg';
205
- break;
206
-
207
- case 'png' :
208
- $mime = 'image/png';
209
- break;
210
-
211
- default :
212
- $mime = 'image/jpeg';
213
- break;
214
- }
215
-
216
- return $mime;
217
- }
218
-
219
- /**
220
- *
221
- * Creates a file at the specified location
222
- *
223
- * @param String $file_path
224
- * @param String $contents
225
- * @param String $mode
226
- *
227
- * @return boolean
228
- */
229
- function create_file( $file_path, $contents, $mode = 'w' ) {
230
- $file = fopen( $file_path, $mode );
231
-
232
- if ( !$file ) {
233
- return false;
234
- }
235
- return fwrite( $file, $contents ) && fclose( $file );
236
- }
237
-
238
- function maybe_delete_members() {
239
- if ( !empty( $_POST['ots_delete_existing'] ) ) {
240
- $team = new \WP_Query( array(
241
- 'post_type' => 'team_member',
242
- 'post_status' => 'publish',
243
- 'posts_per_page' => -1
244
- ) );
245
-
246
- foreach( $team->posts as $member ) {
247
- wp_delete_post( $member->ID );
248
- }
249
- }
250
- }
251
-
252
- function read_csv( $file_path, $mode = 'r' ) {
253
- $array = array();
254
- $fields = array();
255
- $i = 0;
256
-
257
- $handle = fopen( $file_path, $mode );
258
-
259
- while ( ( $row = fgetcsv( $handle, 4096 ) ) !== false ) {
260
- if ( empty( $fields ) ) {
261
- $fields = $row;
262
- continue;
263
- }
264
-
265
- foreach ( $row as $k => $value ) {
266
- $array[$i][$fields[$k]] = $value;
267
- }
268
-
269
- $i++;
270
- }
271
-
272
- if ( !feof( $handle ) ) {
273
- echo "Error: unexpected fgets() fail\n";
274
- }
275
-
276
- fclose( $handle );
277
-
278
- return $array;
279
- }
280
-
281
- /**
282
- *
283
- * Takes associative array and returns a comma separated string
284
- *
285
- * @param type Array
286
- * @return String
287
- */
288
- function put_csv( $data ) {
289
- $fh = fopen( 'php://temp', 'rw' );
290
-
291
- fputcsv( $fh, array_keys( current( $data ) ) );
292
-
293
- foreach ( $data as $row ) {
294
- fputcsv( $fh, $row );
295
- }
296
-
297
- rewind( $fh );
298
- $csv = stream_get_contents( $fh );
299
- fclose( $fh );
300
-
301
- return $csv;
302
- }
303
-
304
- function do_import_export_page() { ?>
305
-
306
- <div class="wrap ots-admin-page">
307
-
308
- <div class="ots-admin-header">
309
-
310
- <div class="title-bar">
311
-
312
- <div class="inner">
313
-
314
- <div class="branding">
315
- <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
316
- </div>
317
-
318
- <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
319
-
320
- </div>
321
-
322
- <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
323
-
324
- <div class="inner">
325
-
326
- <a href="http://wordpressteamplugin.com/templates/"
327
- class="cta cta-secondary"
328
- target="_blank">
329
- <?php _e( 'View Demo', 'ots' ); ?>
330
- </a>
331
-
332
- <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
333
- class="cta cta-primary"
334
- target="_blank">
335
- <?php _e( 'Go Pro', 'ots' ); ?>
336
- </a>
337
-
338
- </div>
339
-
340
- <?php endif; ?>
341
-
342
- </div>
343
-
344
- <div class="clear"></div>
345
-
346
- </div>
347
-
348
- <h2 style="display: none"></h2>
349
-
350
- <div class="inner">
351
-
352
- <div class="tabs-content" style="width: 75%">
353
-
354
- <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php?action=ots_export_team' ) ) ?>">
355
-
356
- <h2><?php _e( 'Export', 'ots' ); ?></h2>
357
- <table class="form-table">
358
- <tbody>
359
- <tr>
360
- <th scope="row"><?php _e( 'Export Team Members', 'ots' ) ?></th>
361
- <td>
362
- <?php submit_button( __( 'Export', 'ots' ), 'secondary', 'ots-export-button', false, false ); ?>
363
- </td>
364
- </tr>
365
-
366
- <?php $response = isset( $_GET['export_response'] ) ? $_GET['export_response'] : false; ?>
367
- <?php if( $response ) : ?>
368
- <tr class="tool-status-<?php echo esc_attr( strtolower( $response ) ); ?>">
369
- <th><?php echo esc_attr( $response ); ?></th>
370
- <td>
371
- <?php if( $response == 'Failed' ) : ?>
372
- <?php echo $_GET['export_output']; ?>
373
- <?php else : ?>
374
- <a href="<?php echo esc_url( $_GET['export_output'] ) ?>" class="button button-primary"><?php _e( 'Download', 'ots' ); ?></a>
375
- <?php endif; ?>
376
-
377
-
378
- </td>
379
- </tr>
380
- <?php endif; ?>
381
-
382
-
383
- </tbody>
384
- </table>
385
- </form>
386
-
387
- <form method="post" id="ots-import-form" action="<?php echo esc_url( admin_url( 'admin-post.php?action=ots_import_team' ) ) ?>" enctype="multipart/form-data">
388
-
389
- <h2><?php _e( 'Import', 'ots' ); ?></h2>
390
- <table class="form-table">
391
- <tbody>
392
- <tr>
393
- <th scope="row"><?php _e( 'Import Team Members', 'ots' ) ?></th>
394
- <td>
395
- <input type="file" name="ots_file_import"/><br><br>
396
- <label>
397
- <input type="checkbox" name="ots_delete_existing" id="ots-import-replace-existing"/>
398
- <?php _e( 'Delete existing ?', 'ots' ); ?></label><br><br>
399
- <?php submit_button( __( 'Import', 'ots' ), 'primary', 'ots-import--button', false, false ); ?>
400
- </td>
401
- </tr>
402
-
403
- <?php $response = isset( $_GET['import_response'] ) ? $_GET['import_response'] : false; ?>
404
- <?php if( $response ) : ?>
405
-
406
- <tr class="tool-status-<?php echo esc_attr( strtolower( $response ) ); ?>">
407
- <th><?php echo $response; ?></th>
408
- <td><?php echo $_GET[ 'import_output' ] ?: ''; ?></td>
409
- </tr>
410
-
411
- <?php endif; ?>
412
-
413
-
414
- <tr>
415
- <td colspan="2">
416
- <a href="<?php echo admin_url( 'edit.php?post_type=team_member&page=ots-docs&tab=ots-import-export' ); ?>"><?php _e( 'Click here', 'ots' ); ?></a> <?php _e( 'to learn more about uploading members and CSV file structure', 'ots' ) ?>
417
- </td>
418
- </tr>
419
-
420
- </tbody>
421
- </table>
422
- </form>
423
-
424
- </div>
425
-
426
-
427
- <div class="clear"></div>
428
-
429
- </div>
430
-
431
- </div>
432
-
433
- <?php }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ function get_csv_fields() {
6
+ $sanitize_bool = function ( $val ) {
7
+ return $val === 'on' || empty( $val ) ? $val : '';
8
+ };
9
+ $fields = array(
10
+ 'name' => 'sanitize_text_field',
11
+ 'title' => 'sanitize_text_field',
12
+ 'bio' => 'wp_kses_post',
13
+ 'photo_url' => 'esc_url_raw',
14
+ 'email' => 'sanitize_email',
15
+ 'phone' => 'sanitize_text_field',
16
+ 'facebook' => 'esc_url_raw',
17
+ 'twitter' => 'esc_url_raw',
18
+ 'linkedin' => 'esc_url_raw',
19
+ 'instagram' => 'esc_url_raw',
20
+ 'pinterest' => 'esc_url_raw',
21
+ 'gplus' => 'esc_url_raw',
22
+ 'website' => 'esc_url_raw',
23
+ 'other_icon' => 'sanitize_text_field',
24
+ 'other' => 'sanitize_text_field',
25
+ 'article_bool' => $sanitize_bool,
26
+ 'article_title' => 'sanitize_text_field',
27
+ 'article1' => 'intval',
28
+ 'article2' => 'intval',
29
+ 'article3' => 'intval',
30
+ 'skill_bool' => $sanitize_bool,
31
+ 'skill_title' => 'sanitize_text_field',
32
+ 'skill1' => 'sanitize_text_field',
33
+ 'skill_value1' => 'intval',
34
+ 'skill2' => 'sanitize_text_field',
35
+ 'skill_value2' => 'intval',
36
+ 'skill3' => 'sanitize_text_field',
37
+ 'skill_value3' => 'intval',
38
+ 'skill4' => 'sanitize_text_field',
39
+ 'skill_value4' => 'intval',
40
+ 'skill5' => 'sanitize_text_field',
41
+ 'skill_value5' => 'intval',
42
+ 'tags_bool' => $sanitize_bool,
43
+ 'tags_title' => 'sanitize_text_field',
44
+ 'tags' => 'sanitize_text_field',
45
+ 'quote' => 'sanitize_text_field'
46
+ );
47
+ return $fields;
48
+ }
49
+
50
+ add_action( 'admin_post_ots_export_team', function() {
51
+ $message = array();
52
+ $team = new \WP_Query( array(
53
+ 'post_type' => 'team_member',
54
+ 'post_status' => 'publish',
55
+ 'posts_per_page' => -1
56
+ ) );
57
+
58
+ if ( $team->post_count <= 0 ) {
59
+ $message['export_response'] = 'Failed';
60
+ $message['export_output'] = urlencode( 'There are no team members to export' );
61
+ } else {
62
+ $members = array();
63
+
64
+ foreach( $team->posts as $member ) {
65
+ $member = team_member( $member->ID );
66
+ $export = array(
67
+ 'name' => sanitize_text_field( $member->get_name() ),
68
+ 'title' => sanitize_text_field( $member->title ),
69
+ 'bio' => wp_kses_post( $member->get_bio() ),
70
+ 'photo_url' => esc_url_raw( get_the_post_thumbnail_url( $member->get_id() ) ),
71
+ );
72
+
73
+ $fields = get_csv_fields();
74
+
75
+ unset( $fields['name'] );
76
+ unset( $fields['title'] );
77
+ unset( $fields['bio'] );
78
+ unset( $fields['photo_url'] );
79
+
80
+ foreach ( $fields as $field => $sanitize_callback ) {
81
+ $export[$field] = call_user_func( $sanitize_callback, $member->{$field} );
82
+ }
83
+
84
+ $members[ $member->get_id() ] = $export;
85
+ }
86
+
87
+ $csv = put_csv( $members );
88
+ $dir = wp_upload_dir();
89
+ $file_path = $dir['path'] . '/export.csv';
90
+
91
+ if ( create_file( $file_path, $csv ) ) {
92
+ $message['export_response'] = 'Success!';
93
+ $message['export_output'] = $dir['url'] . '/export.csv';
94
+ } else {
95
+ $message['export_response'] = 'Failed';
96
+ $message['export_output'] = urlencode( 'Cannot create file, check your server permissions' );
97
+ $message['csv'] = $csv;
98
+ }
99
+ }
100
+
101
+ wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
102
+ });
103
+
104
+
105
+ add_action( 'admin_post_ots_import_team', function() {
106
+ $message = array();
107
+ $total_imported = 0;
108
+
109
+ maybe_delete_members();
110
+
111
+ // $accepted_mime_types = array(
112
+ // 'text/csv',
113
+ // 'text/comma-separated-values',
114
+ // 'text/plain',
115
+ // 'text/anytext',
116
+ // 'text/*',
117
+ // 'text/plain',
118
+ // 'text/anytext',
119
+ // 'text/*',
120
+ // 'application/csv',
121
+ // 'application/excel',
122
+ // );
123
+
124
+ // Ensure user has selected an import file
125
+ if ( empty( $_FILES['ots_file_import'] ) ) {
126
+ $message['import_response'] = 'Failed';
127
+ $message['import_output'] = urlencode( 'Missing import file.' );
128
+ wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
129
+ return;
130
+ }
131
+
132
+ // Ensure the file is of the right type
133
+ // if ( empty( $_FILES['ots_file_import']['type'] ) || !in_array( strtolower( $_FILES['ots_file_import']['type'] ), $accepted_mime_types ) ) {
134
+ // $message['import_response'] = 'Failed';
135
+ // $message['import_output'] = urlencode( 'The file you have uploaded cannot be processed. Please upload a CSV file.' );
136
+ // wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
137
+ // return;
138
+ // }
139
+
140
+ $upload = wp_upload_bits( $_FILES['ots_file_import']['name'], null, file_get_contents( $_FILES['ots_file_import']['tmp_name'] ) );
141
+ $data = read_csv( $upload['file'] );
142
+
143
+ foreach ( $data as $row ) {
144
+ $id = wp_insert_post( array(
145
+ 'post_type' => 'team_member',
146
+ 'post_status' => 'publish'
147
+ ) );
148
+
149
+ if ( is_wp_error( $id ) ) {
150
+ continue;
151
+ }
152
+
153
+ $member = team_member( $id );
154
+ $fields = get_csv_fields();
155
+ $total_imported++;
156
+
157
+ foreach ( $row as $key => $val ) {
158
+ $val = call_user_func( $fields[$key], $val );
159
+
160
+ switch( $key ) {
161
+ case 'name' :
162
+ $member->set_name( $val );
163
+ break;
164
+
165
+ case 'photo_url' :
166
+ import_photo( $member, $val );
167
+ break;
168
+
169
+ case 'bio' :
170
+ $member->set_bio( $val );
171
+ break;
172
+
173
+ default :
174
+ $member->$key = $val;
175
+ break;
176
+ }
177
+ }
178
+ }
179
+
180
+ $message['import_response'] = 'Success';
181
+ $message['import_output'] = urlencode( 'Import successful! ' . $total_imported . ' member(s) imported' );
182
+
183
+ wp_safe_redirect( add_query_arg( $message, wp_get_referer() ) );
184
+ });
185
+
186
+
187
+ function import_photo( TeamMember $member, $photo_url ) {
188
+ if ( !$photo_url ) {
189
+ return;
190
+ }
191
+
192
+ $attach_id = media_sideload_image( $photo_url, $member->get_id(), null, 'id' );
193
+
194
+ if ( !is_wp_error( $attach_id ) ) {
195
+ update_post_meta( $member->get_id(), '_thumbnail_id', $attach_id );
196
+ }
197
+ }
198
+
199
+ function get_mime_type( $extension ) {
200
+ $mime = null;
201
+
202
+ switch ( $extension ) {
203
+ case 'jpg' || 'jpeg' :
204
+ $mime = 'image/jpeg';
205
+ break;
206
+
207
+ case 'png' :
208
+ $mime = 'image/png';
209
+ break;
210
+
211
+ default :
212
+ $mime = 'image/jpeg';
213
+ break;
214
+ }
215
+
216
+ return $mime;
217
+ }
218
+
219
+ /**
220
+ *
221
+ * Creates a file at the specified location
222
+ *
223
+ * @param String $file_path
224
+ * @param String $contents
225
+ * @param String $mode
226
+ *
227
+ * @return boolean
228
+ */
229
+ function create_file( $file_path, $contents, $mode = 'w' ) {
230
+ $file = fopen( $file_path, $mode );
231
+
232
+ if ( !$file ) {
233
+ return false;
234
+ }
235
+ return fwrite( $file, $contents ) && fclose( $file );
236
+ }
237
+
238
+ function maybe_delete_members() {
239
+ if ( !empty( $_POST['ots_delete_existing'] ) ) {
240
+ $team = new \WP_Query( array(
241
+ 'post_type' => 'team_member',
242
+ 'post_status' => 'publish',
243
+ 'posts_per_page' => -1
244
+ ) );
245
+
246
+ foreach( $team->posts as $member ) {
247
+ wp_delete_post( $member->ID );
248
+ }
249
+ }
250
+ }
251
+
252
+ function read_csv( $file_path, $mode = 'r' ) {
253
+ $array = array();
254
+ $fields = array();
255
+ $i = 0;
256
+
257
+ $handle = fopen( $file_path, $mode );
258
+
259
+ while ( ( $row = fgetcsv( $handle, 4096 ) ) !== false ) {
260
+ if ( empty( $fields ) ) {
261
+ $fields = $row;
262
+ continue;
263
+ }
264
+
265
+ foreach ( $row as $k => $value ) {
266
+ $array[$i][$fields[$k]] = $value;
267
+ }
268
+
269
+ $i++;
270
+ }
271
+
272
+ if ( !feof( $handle ) ) {
273
+ echo "Error: unexpected fgets() fail\n";
274
+ }
275
+
276
+ fclose( $handle );
277
+
278
+ return $array;
279
+ }
280
+
281
+ /**
282
+ *
283
+ * Takes associative array and returns a comma separated string
284
+ *
285
+ * @param type Array
286
+ * @return String
287
+ */
288
+ function put_csv( $data ) {
289
+ $fh = fopen( 'php://temp', 'rw' );
290
+
291
+ fputcsv( $fh, array_keys( current( $data ) ) );
292
+
293
+ foreach ( $data as $row ) {
294
+ fputcsv( $fh, $row );
295
+ }
296
+
297
+ rewind( $fh );
298
+ $csv = stream_get_contents( $fh );
299
+ fclose( $fh );
300
+
301
+ return $csv;
302
+ }
303
+
304
+ function do_import_export_page() { ?>
305
+
306
+ <div class="wrap ots-admin-page">
307
+
308
+ <div class="ots-admin-header">
309
+
310
+ <div class="title-bar">
311
+
312
+ <div class="inner">
313
+
314
+ <div class="branding">
315
+ <img src="<?php echo esc_url( asset( 'images/branding/smartcat-medium.png' ) ); ?>" />
316
+ </div>
317
+
318
+ <p class="page-title"><?php _e( 'Our Team Showcase', 'ots' ); ?></p>
319
+
320
+ </div>
321
+
322
+ <?php if( apply_filters( 'ots_enable_pro_preview', true ) ) : ?>
323
+
324
+ <div class="inner">
325
+
326
+ <a href="http://wordpressteamplugin.com/templates/"
327
+ class="cta cta-secondary"
328
+ target="_blank">
329
+ <?php _e( 'View Demo', 'ots' ); ?>
330
+ </a>
331
+
332
+ <a href="https://smartcatdesign.net/downloads/our-team-showcase/"
333
+ class="cta cta-primary"
334
+ target="_blank">
335
+ <?php _e( 'Go Pro', 'ots' ); ?>
336
+ </a>
337
+
338
+ </div>
339
+
340
+ <?php endif; ?>
341
+
342
+ </div>
343
+
344
+ <div class="clear"></div>
345
+
346
+ </div>
347
+
348
+ <h2 style="display: none"></h2>
349
+
350
+ <div class="inner">
351
+
352
+ <div class="tabs-content" style="width: 75%">
353
+
354
+ <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php?action=ots_export_team' ) ) ?>">
355
+
356
+ <h2><?php _e( 'Export', 'ots' ); ?></h2>
357
+ <table class="form-table">
358
+ <tbody>
359
+ <tr>
360
+ <th scope="row"><?php _e( 'Export Team Members', 'ots' ) ?></th>
361
+ <td>
362
+ <?php submit_button( __( 'Export', 'ots' ), 'secondary', 'ots-export-button', false, false ); ?>
363
+ </td>
364
+ </tr>
365
+
366
+ <?php $response = isset( $_GET['export_response'] ) ? $_GET['export_response'] : false; ?>
367
+ <?php if( $response ) : ?>
368
+ <tr class="tool-status-<?php echo esc_attr( strtolower( $response ) ); ?>">
369
+ <th><?php echo esc_attr( $response ); ?></th>
370
+ <td>
371
+ <?php if( $response == 'Failed' ) : ?>
372
+ <?php echo $_GET['export_output']; ?>
373
+ <?php else : ?>
374
+ <a href="<?php echo esc_url( $_GET['export_output'] ) ?>" class="button button-primary"><?php _e( 'Download', 'ots' ); ?></a>
375
+ <?php endif; ?>
376
+
377
+
378
+ </td>
379
+ </tr>
380
+ <?php endif; ?>
381
+
382
+
383
+ </tbody>
384
+ </table>
385
+ </form>
386
+
387
+ <form method="post" id="ots-import-form" action="<?php echo esc_url( admin_url( 'admin-post.php?action=ots_import_team' ) ) ?>" enctype="multipart/form-data">
388
+
389
+ <h2><?php _e( 'Import', 'ots' ); ?></h2>
390
+ <table class="form-table">
391
+ <tbody>
392
+ <tr>
393
+ <th scope="row"><?php _e( 'Import Team Members', 'ots' ) ?></th>
394
+ <td>
395
+ <input type="file" name="ots_file_import"/><br><br>
396
+ <label>
397
+ <input type="checkbox" name="ots_delete_existing" id="ots-import-replace-existing"/>
398
+ <?php _e( 'Delete existing ?', 'ots' ); ?></label><br><br>
399
+ <?php submit_button( __( 'Import', 'ots' ), 'primary', 'ots-import--button', false, false ); ?>
400
+ </td>
401
+ </tr>
402
+
403
+ <?php $response = isset( $_GET['import_response'] ) ? $_GET['import_response'] : false; ?>
404
+ <?php if( $response ) : ?>
405
+
406
+ <tr class="tool-status-<?php echo esc_attr( strtolower( $response ) ); ?>">
407
+ <th><?php echo $response; ?></th>
408
+ <td><?php echo $_GET[ 'import_output' ] ?: ''; ?></td>
409
+ </tr>
410
+
411
+ <?php endif; ?>
412
+
413
+
414
+ <tr>
415
+ <td colspan="2">
416
+ <a href="<?php echo admin_url( 'edit.php?post_type=team_member&page=ots-docs&tab=ots-import-export' ); ?>"><?php _e( 'Click here', 'ots' ); ?></a> <?php _e( 'to learn more about uploading members and CSV file structure', 'ots' ) ?>
417
+ </td>
418
+ </tr>
419
+
420
+ </tbody>
421
+ </table>
422
+ </form>
423
+
424
+ </div>
425
+
426
+
427
+ <div class="clear"></div>
428
+
429
+ </div>
430
+
431
+ </div>
432
+
433
+ <?php }
includes/widgets.php CHANGED
@@ -1,31 +1,31 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Register the plugin's widgets.
7
- *
8
- * @since 4.0.0
9
- */
10
- function register_widgets() {
11
-
12
- register_widget( '\ots\TeamSidebarWidget' );
13
- register_widget( '\ots\TeamMainWidget' );
14
-
15
- }
16
-
17
- add_action( 'widgets_init', 'ots\register_widgets' );
18
-
19
-
20
- /**
21
- * Enqueue scripts for the sidebar widget.
22
- *
23
- * @since 4.0.0
24
- */
25
- function enqueue_widget_scripts() {
26
-
27
- wp_enqueue_style( 'ots-widget' );
28
-
29
- }
30
-
31
- add_action( 'wp_enqueue_scripts', 'ots\enqueue_widget_scripts' );
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Register the plugin's widgets.
7
+ *
8
+ * @since 4.0.0
9
+ */
10
+ function register_widgets() {
11
+
12
+ register_widget( '\ots\TeamSidebarWidget' );
13
+ register_widget( '\ots\TeamMainWidget' );
14
+
15
+ }
16
+
17
+ add_action( 'widgets_init', 'ots\register_widgets' );
18
+
19
+
20
+ /**
21
+ * Enqueue scripts for the sidebar widget.
22
+ *
23
+ * @since 4.0.0
24
+ */
25
+ function enqueue_widget_scripts() {
26
+
27
+ wp_enqueue_style( 'ots-widget' );
28
+
29
+ }
30
+
31
+ add_action( 'wp_enqueue_scripts', 'ots\enqueue_widget_scripts' );
our-team-showcase.php CHANGED
@@ -1,214 +1,219 @@
1
- <?php
2
- /*
3
- * Plugin Name: Our Team Showcase
4
- * Plugin URI: https://smartcatdesign.net/downloads/our-team-showcase/
5
- * Description: Display your team members in a very attractive way as a widget or page with a shortcode [our-team] or a widget
6
- * Version: 4.4.1
7
- * Author: Smartcat
8
- * Author URI: https://smartcatdesign.net
9
- * License: GPL2
10
- */
11
-
12
- namespace ots;
13
-
14
- /**
15
- * Include constants and Options definitions
16
- */
17
- include_once dirname( __FILE__ ) . '/constants.php';
18
-
19
-
20
- /**
21
- * Load the plugin's text domain.
22
- *
23
- * @since 4.0.0
24
- */
25
- function load_text_domain() {
26
-
27
- load_plugin_textdomain( 'ots', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
28
-
29
- }
30
-
31
- add_action( 'plugins_loaded', 'ots\load_text_domain' );
32
-
33
-
34
- /**
35
- * Includes required files and initializes the plugin.
36
- *
37
- * @since 4.0.0
38
- */
39
- function init() {
40
-
41
- include_once dirname( __FILE__ ) . '/upgrade.php';
42
- include_once dirname( __FILE__ ) . '/includes/functions.php';
43
- include_once dirname( __FILE__ ) . '/includes/helpers.php';
44
- include_once dirname( __FILE__ ) . '/includes/team-member.php';
45
- include_once dirname( __FILE__ ) . '/includes/tools.php';
46
- include_once dirname( __FILE__ ) . '/includes/admin-settings.php';
47
- include_once dirname( __FILE__ ) . '/includes/documentation.php';
48
- include_once dirname( __FILE__ ) . '/includes/add-ons.php';
49
- include_once dirname( __FILE__ ) . '/includes/reorder-members.php';
50
- include_once dirname( __FILE__ ) . '/includes/team-view.php';
51
- include_once dirname( __FILE__ ) . '/includes/TeamMainWidget.php';
52
- include_once dirname( __FILE__ ) . '/includes/TeamSidebarWidget.php';
53
- include_once dirname( __FILE__ ) . '/includes/TeamMember.php';
54
- include_once dirname( __FILE__ ) . '/includes/widgets.php';
55
- include_once dirname( __FILE__ ) . '/includes/extension-licensing.php';
56
-
57
- $license_page_args = array(
58
- 'parent_slug' => 'edit.php?post_type=team_member',
59
- 'page_title' => __( 'Our Team Showcase Licenses', 'ots' ),
60
- 'menu_title' => __( 'Licenses', 'ots' ),
61
- 'capability' => 'manage_options',
62
- 'menu_slug' => 'ots-licenses'
63
- );
64
-
65
- $registration = new \SC_License_Manager( 'ots', 'submenu', $license_page_args );
66
-
67
-
68
- // All done
69
- do_action( 'ots_loaded' );
70
-
71
- }
72
-
73
- add_action( 'plugins_loaded', 'ots\init' );
74
-
75
-
76
- function register_scripts() {
77
-
78
- // We need this on all pages
79
- wp_enqueue_style( 'ots-common', asset( 'css/common.css' ), null, VERSION );
80
-
81
- wp_register_style( 'ots-team-view', asset( 'css/team-view.css' ), null, VERSION );
82
- wp_register_style( 'ots-widget', asset( 'css/widgets.css' ), null, VERSION );
83
- wp_register_style( 'ots-single', asset( 'css/single.css' ), null, VERSION );
84
-
85
- wp_register_script( 'ots', asset( 'js/script.js' ), array( 'jquery' ), VERSION );
86
-
87
- }
88
-
89
- add_action( 'init', 'ots\register_scripts' );
90
-
91
-
92
- function enqueue_customizer_scripts() {
93
-
94
-
95
- wp_enqueue_script( 'ots-customizer', asset( 'admin/js/customizer.js' ), array( 'jquery', 'customize-controls' ), false );
96
-
97
- }
98
-
99
- add_action( 'customize_controls_enqueue_scripts', 'ots\enqueue_customizer_scripts' );
100
-
101
-
102
- /**
103
- * Runs on plugin activation.
104
- *
105
- * @since 4.0.0
106
- */
107
- function activate() {
108
-
109
- init();
110
-
111
- register_team_member_post_type();
112
- register_team_member_position_taxonomy();
113
-
114
- flush_rewrite_rules();
115
-
116
- }
117
-
118
- register_activation_hook( __FILE__, 'ots\activate' );
119
-
120
-
121
- /**
122
- * Runs on plugin deactivation.
123
- *
124
- * @since 4.0.0
125
- */
126
- function deactivate() {
127
-
128
- init();
129
-
130
- unregister_post_type( 'team_member' );
131
- unregister_taxonomy( 'team_member_position' );
132
-
133
- }
134
-
135
- register_deactivation_hook( __FILE__, 'ots\deactivate' );
136
-
137
-
138
- /**
139
- * Get the URL of an asset from the assets folder.
140
- *
141
- * @param string $path
142
- * @return string
143
- * @since 4.0.0
144
- */
145
- function asset( $path = '', $url = true ) {
146
-
147
- if( $url ) {
148
- $file = trailingslashit( plugin_dir_url( __FILE__ ) );
149
- } else {
150
- $file = trailingslashit( plugin_dir_path( __FILE__ ) );
151
- }
152
-
153
- return $file . 'assets/' . ltrim( $path, '/' );
154
-
155
- }
156
-
157
-
158
- /**
159
- * Get the path of a template file.
160
- *
161
- * @param string $template The file name in the format of file.php.
162
- * @return bool|string False if the file does not exist, the path if it does.
163
- */
164
- function template_path( $template ) {
165
-
166
- $template = trim( $template, '/' );
167
- $template = rtrim( $template, '.php' );
168
-
169
- $base = trailingslashit( dirname( __FILE__ ) . '/templates' );
170
-
171
- $file = $base . $template . '.php';
172
-
173
- // Check if override exists in the theme first
174
- if( file_exists( get_theme_override( $template . '.php' ) ) ) {
175
- return get_theme_override( $template . '.php' );
176
- }
177
-
178
- // then check if selected template exists in the plugin
179
- if( file_exists( $file ) ) {
180
- return $file;
181
- }
182
-
183
- return false;
184
-
185
- }
186
-
187
- /**
188
- * Add action links to plugins page.
189
- *
190
- * @param $links
191
- * @return array
192
- * @since 4.0.0
193
- */
194
- function plugin_action_links( $links ) {
195
-
196
- $upgrade = array(
197
- 'upgrade' => '<a target="_blank" href="https://smartcatdesign.net/downloads/our-team-showcase/">' . __( 'Go Pro', 'ots' ) . '</a>'
198
- );
199
-
200
- $settings = array(
201
- 'settings' => '<a href="' . admin_url( 'edit.php?post_type=team_member&page=ots-settings' ) . '">' . __( 'Settings', 'ots' ) . '</a>'
202
- );
203
-
204
- $links = array_merge( $settings, $links );
205
-
206
- if( apply_filters( 'ots_enable_pro_preview', true ) ) {
207
- $links = array_merge( $upgrade, $links );
208
- }
209
-
210
- return $links;
211
-
212
- }
213
-
214
- add_action( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'ots\plugin_action_links' );
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Plugin Name: Our Team Showcase
4
+ * Plugin URI: https://smartcatdesign.net/downloads/our-team-showcase/
5
+ * Description: Display your team members in a very attractive way as a widget or page with a shortcode [our-team] or a widget
6
+ * Version: 4.4.2
7
+ * Author: Smartcat
8
+ * Author URI: https://smartcatdesign.net
9
+ * License: GPL2
10
+ */
11
+
12
+ namespace ots;
13
+
14
+ /**
15
+ * Include constants and Options definitions
16
+ */
17
+ include_once dirname( __FILE__ ) . '/constants.php';
18
+
19
+
20
+ if ( !function_exists( 'scts_init' ) ) {
21
+ include_once dirname( __FILE__ ) . '/includes/libraries/theme-showcase.php';
22
+ }
23
+
24
+
25
+ /**
26
+ * Load the plugin's text domain.
27
+ *
28
+ * @since 4.0.0
29
+ */
30
+ function load_text_domain() {
31
+
32
+ load_plugin_textdomain( 'ots', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
33
+
34
+ }
35
+
36
+ add_action( 'plugins_loaded', 'ots\load_text_domain' );
37
+
38
+
39
+ /**
40
+ * Includes required files and initializes the plugin.
41
+ *
42
+ * @since 4.0.0
43
+ */
44
+ function init() {
45
+
46
+ include_once dirname( __FILE__ ) . '/upgrade.php';
47
+ include_once dirname( __FILE__ ) . '/includes/functions.php';
48
+ include_once dirname( __FILE__ ) . '/includes/helpers.php';
49
+ include_once dirname( __FILE__ ) . '/includes/team-member.php';
50
+ include_once dirname( __FILE__ ) . '/includes/tools.php';
51
+ include_once dirname( __FILE__ ) . '/includes/admin-settings.php';
52
+ include_once dirname( __FILE__ ) . '/includes/documentation.php';
53
+ include_once dirname( __FILE__ ) . '/includes/add-ons.php';
54
+ include_once dirname( __FILE__ ) . '/includes/reorder-members.php';
55
+ include_once dirname( __FILE__ ) . '/includes/team-view.php';
56
+ include_once dirname( __FILE__ ) . '/includes/TeamMainWidget.php';
57
+ include_once dirname( __FILE__ ) . '/includes/TeamSidebarWidget.php';
58
+ include_once dirname( __FILE__ ) . '/includes/TeamMember.php';
59
+ include_once dirname( __FILE__ ) . '/includes/widgets.php';
60
+ include_once dirname( __FILE__ ) . '/includes/extension-licensing.php';
61
+
62
+ $license_page_args = array(
63
+ 'parent_slug' => 'edit.php?post_type=team_member',
64
+ 'page_title' => __( 'Our Team Showcase Licenses', 'ots' ),
65
+ 'menu_title' => __( 'Licenses', 'ots' ),
66
+ 'capability' => 'manage_options',
67
+ 'menu_slug' => 'ots-licenses'
68
+ );
69
+
70
+ $registration = new \SC_License_Manager( 'ots', 'submenu', $license_page_args );
71
+
72
+
73
+ // All done
74
+ do_action( 'ots_loaded' );
75
+
76
+ }
77
+
78
+ add_action( 'plugins_loaded', 'ots\init' );
79
+
80
+
81
+ function register_scripts() {
82
+
83
+ // We need this on all pages
84
+ wp_enqueue_style( 'ots-common', asset( 'css/common.css' ), null, VERSION );
85
+
86
+ wp_register_style( 'ots-team-view', asset( 'css/team-view.css' ), null, VERSION );
87
+ wp_register_style( 'ots-widget', asset( 'css/widgets.css' ), null, VERSION );
88
+ wp_register_style( 'ots-single', asset( 'css/single.css' ), null, VERSION );
89
+
90
+ wp_register_script( 'ots', asset( 'js/script.js' ), array( 'jquery' ), VERSION );
91
+
92
+ }
93
+
94
+ add_action( 'init', 'ots\register_scripts' );
95
+
96
+
97
+ function enqueue_customizer_scripts() {
98
+
99
+
100
+ wp_enqueue_script( 'ots-customizer', asset( 'admin/js/customizer.js' ), array( 'jquery', 'customize-controls' ), false );
101
+
102
+ }
103
+
104
+ add_action( 'customize_controls_enqueue_scripts', 'ots\enqueue_customizer_scripts' );
105
+
106
+
107
+ /**
108
+ * Runs on plugin activation.
109
+ *
110
+ * @since 4.0.0
111
+ */
112
+ function activate() {
113
+
114
+ init();
115
+
116
+ register_team_member_post_type();
117
+ register_team_member_position_taxonomy();
118
+
119
+ flush_rewrite_rules();
120
+
121
+ }
122
+
123
+ register_activation_hook( __FILE__, 'ots\activate' );
124
+
125
+
126
+ /**
127
+ * Runs on plugin deactivation.
128
+ *
129
+ * @since 4.0.0
130
+ */
131
+ function deactivate() {
132
+
133
+ init();
134
+
135
+ unregister_post_type( 'team_member' );
136
+ unregister_taxonomy( 'team_member_position' );
137
+
138
+ }
139
+
140
+ register_deactivation_hook( __FILE__, 'ots\deactivate' );
141
+
142
+
143
+ /**
144
+ * Get the URL of an asset from the assets folder.
145
+ *
146
+ * @param string $path
147
+ * @return string
148
+ * @since 4.0.0
149
+ */
150
+ function asset( $path = '', $url = true ) {
151
+
152
+ if( $url ) {
153
+ $file = trailingslashit( plugin_dir_url( __FILE__ ) );
154
+ } else {
155
+ $file = trailingslashit( plugin_dir_path( __FILE__ ) );
156
+ }
157
+
158
+ return $file . 'assets/' . ltrim( $path, '/' );
159
+
160
+ }
161
+
162
+
163
+ /**
164
+ * Get the path of a template file.
165
+ *
166
+ * @param string $template The file name in the format of file.php.
167
+ * @return bool|string False if the file does not exist, the path if it does.
168
+ */
169
+ function template_path( $template ) {
170
+
171
+ $template = trim( $template, '/' );
172
+ $template = rtrim( $template, '.php' );
173
+
174
+ $base = trailingslashit( dirname( __FILE__ ) . '/templates' );
175
+
176
+ $file = $base . $template . '.php';
177
+
178
+ // Check if override exists in the theme first
179
+ if( file_exists( get_theme_override( $template . '.php' ) ) ) {
180
+ return get_theme_override( $template . '.php' );
181
+ }
182
+
183
+ // then check if selected template exists in the plugin
184
+ if( file_exists( $file ) ) {
185
+ return $file;
186
+ }
187
+
188
+ return false;
189
+
190
+ }
191
+
192
+ /**
193
+ * Add action links to plugins page.
194
+ *
195
+ * @param $links
196
+ * @return array
197
+ * @since 4.0.0
198
+ */
199
+ function plugin_action_links( $links ) {
200
+
201
+ $upgrade = array(
202
+ 'upgrade' => '<a target="_blank" href="https://smartcatdesign.net/downloads/our-team-showcase/">' . __( 'Go Pro', 'ots' ) . '</a>'
203
+ );
204
+
205
+ $settings = array(
206
+ 'settings' => '<a href="' . admin_url( 'edit.php?post_type=team_member&page=ots-settings' ) . '">' . __( 'Settings', 'ots' ) . '</a>'
207
+ );
208
+
209
+ $links = array_merge( $settings, $links );
210
+
211
+ if( apply_filters( 'ots_enable_pro_preview', true ) ) {
212
+ $links = array_merge( $upgrade, $links );
213
+ }
214
+
215
+ return $links;
216
+
217
+ }
218
+
219
+ add_action( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'ots\plugin_action_links' );
readme.txt CHANGED
@@ -1,201 +1,204 @@
1
- === Our Team Showcase ===
2
- Contributors: smartcat
3
- Donate link: https://smartcatdesign.net/downloads/our-team-showcase/
4
- Tags: team, staff, directory, employees, widget, shortcode, members, carousel, honeycomb, stack, grid, custom, template, social, profile, custom post type, portfolio, profile,meet team, skills, cv,v-card, portal
5
- Requires at least: 4.6
6
- Tested up to: 4.9.4
7
- Stable tag: 4.4.0
8
- License: GPLv2 or later
9
-
10
- The best way to display your employees, team members, or any type of list. Multiple appealing templates,SEO friendly, re-order, import/export functionality
11
-
12
- == Description ==
13
-
14
- [View Demo](http://wordpressteamplugin.com/templates/)
15
-
16
- Our Team Showcase allows you to easily create and display your team members & staff and show them on your site with ease. Your visitors will see a beautiful & animated
17
- list of your team, with their pictures, links to social icons, and link to each member page.
18
-
19
- Each member can be edited. When you create or edit a team member, you will be able to add links to contact email, phone number, links to social media( facebook, linkedin, twitter, google plus, instagram & linkedin ), as well as a personal website.
20
- You can also link in your posts to a user. This way, you can keep the viewer on your site, and recommend content to them.
21
-
22
- First, install and activate the plugin. You will be automatically re-directed to the plugin settongs page. Select your preferred settings and colors, Add your staff, upload pictures and finally
23
- add the shortcode [our-team] to the page, post or widget where you want to display them. You can also set the order that the members appear in with a user-friendly drag & drop interface.
24
-
25
- If your theme has a sidebar, you can use the extra custom sidebar widget to display the team members in the sidebar.
26
-
27
- The pro version provides you with 4 additional and very unique Team templates and 3 Single Member templates. Impress your site visitors by using the pro version which includes a Honeycomb layout, Scrolling Carousel, Stacked
28
- list and an additional circular template.
29
-
30
- Pro version available here: [Pro Version](https://smartcatdesign.net/downloads/our-team-showcase/)
31
-
32
- Available Customizations:
33
-
34
- * 3 Grid templates: Circles & Boxes
35
- * Custom sidebar widget
36
- * Re-order team members with a simple drag & drop.
37
- * Select the number of columns
38
- * Customize the margin
39
- * Display Social Icons & email icon
40
- * Unlimited Colors
41
- * Single member page social icons
42
- * Add/Edit/Search/Display your staff or team members
43
- * Display members by group/deparment (category)
44
- * Boosts SEO with schema.org markup
45
- * Output your team members anywhere with the shortcode [our-team]
46
- * Team Member contact info & links to social sites
47
- * Favorite/Recommended content for each Team Member
48
- * Ability to export and import team member data
49
- * Easy to setup
50
-
51
- Pro Version Features:
52
-
53
- * 4 Additional team templates: Carousel, Honeycomb, Stacked & Company Directory
54
- * 3 Single member display templates
55
- * Team Member **Search bar**. Search by name, group, bio
56
- * Team Member Filter. **Filter members** by one or multiple groups
57
- * Animated sliding Panel & Card
58
- * Click-to-call team member phone number
59
- * Team member personal quote
60
- * Search & Sort employee directory
61
- * Looks great on desktop & mobile
62
- * Team Member Skills, Hobbies, Tags
63
- * **Community Hub** (New - October 2017) creates a private member login page on your site so you can share
64
- posts and pages only with your team
65
-
66
- Team Member Details & Icons:
67
-
68
- * Name
69
- * Group/Department
70
- * Job Title
71
- * Email Address
72
- * Facebook
73
- * Twitter
74
- * Google Plus
75
- * Telephone Number
76
- * Instagram
77
- * Pinterest
78
- * Website/URL
79
- * Whatsapp
80
- * Skype
81
- * Vimeo
82
- * Soundcloud
83
- * Links to up to 3 Articles
84
-
85
-
86
- == Screenshots ==
87
- 1. Plugin includes Grid boxes, Grid Circular and sidebar templates
88
- 2. Sidebar widget
89
- 3. Drag & Drop re-order of memebers
90
- 4. PRO VERSION - Honeycomb Demo
91
- 5. PRO VERSION - stacked list Demo
92
- 6. PRO VERSION - Carousel Demo
93
- 7. Community Hub - Dashboard
94
- 8. Community Hub - Team Member Profile
95
- 9. Community Hub - Single Post
96
-
97
-
98
- == Installation ==
99
- 1. Download the plugin, then upload the zipped file to your site from the WordPress dashboard plugin uploader menu
100
- 2. OR - Upload the unpacked folder folder via FTP into /wp-content/plugins
101
-
102
- == Changelog ==
103
-
104
- = 4.4.1 =
105
- 1. Improved Import/Export functionality
106
- 2. Updated docs
107
-
108
-
109
- = 4.4.0 =
110
- 1. Added the ability to override Team templates from the theme (see documentation)
111
-
112
- = 4.3.2 =
113
- 1. Updates to the Import & Export tool
114
- 2. Bug fix with group filtering
115
- 3. Added new search & filtering tools to the Pro version
116
-
117
- = 4.3.1 =
118
- 1. Bug fix impacting group filtering since WP4.9
119
-
120
- = 4.3.0 =
121
- 1. Added Import & Export tools
122
- 2. Fixes and cleanup
123
-
124
- = 4.2.0 =
125
- 1. Added the ability to set the number of columns from the shortcode
126
- 2. Updated documentation
127
- 3. Bug fixes
128
- 4. Updated Pro version - Now it includes a the Community Hub for the team
129
-
130
- = 4.1.1 =
131
- 1. fix bug with error when saving posts
132
- 2. fix php error for un-install
133
-
134
- = 4.1.0 =
135
- 1. Added a new field for additional social network
136
- 2. Shortcode now supports multiple groups
137
-
138
- = 4.0.2 =
139
- 1. Bug fixes
140
- 2. Full compatibility with PHP5.4
141
-
142
- = 4.0.1 =
143
- 1. Patch plugin code to be backwards compatible with older PHP versions
144
- 2. Added the ability to display multiple groups in one shortcode
145
- 3. New members now are added last
146
-
147
- = 4.0.0 =
148
- Plugin re-write. Settings and team member data will be maintained
149
-
150
- = 3.0.0
151
- 1. Added new social icons ( pinterest, instagram )
152
- 2. Added Recommended Articles section in Single Member. You can now toggle a section for each member that outputs up to 3 articles from your blog.
153
- 3. Updated Documentation
154
- 4. Fixed issue causing the PHP notice regarding the team_member slug
155
-
156
-
157
- = 2.41 =
158
- 1. minor change
159
-
160
- = 2.4 =
161
- 1. Bug fixes to icon appearance on some themes
162
- 2. Responsive fixes
163
- 3. Added staff directory
164
- 4. Added ability to change slug for single post view
165
-
166
- = 2.3 =
167
- 1. Added team member phone number
168
- 2. Added social icons link opening in a new page
169
- 3. Added a new template ( Grid Circles 2 )
170
- 4. Enhancements to responsive
171
-
172
- = 2.2 =
173
- 1. Fixed plugin update bug. The plugin no longer loses settings on update
174
- 2. Added additional templates to the pro version
175
-
176
- = 2.1 =
177
- 1. sidebar widget bug fix
178
- 2. removed archive
179
- 3. fixed columns bug
180
- 4. fixed drag & drop bug
181
-
182
- = 2.0 =
183
- 1. Major appearance and functionality changes
184
- 2. updated pro version
185
-
186
- = 1.3 =
187
- 1. sanitization fixes
188
-
189
- = 1.2 =
190
- 1. Fix bug with team showing above all content
191
- 2. Added option to control how many members to output
192
- 3. Added pro version with additional templates
193
- 4. Fixed re-order bug
194
-
195
- = 1.1 =
196
- 1. add circular grid style template
197
- 2. add sidebar widget template
198
- 3. add instructional video
199
-
200
-
201
- = 1.0 = initial release
 
 
 
1
+ === Our Team Showcase ===
2
+ Contributors: smartcat
3
+ Donate link: https://smartcatdesign.net/downloads/our-team-showcase/
4
+ Tags: team, staff, directory, employees, widget, shortcode, members, carousel, honeycomb, stack, grid, custom, template, social, profile, custom post type, portfolio, profile,meet team, skills, cv,v-card, portal
5
+ Requires at least: 4.6
6
+ Tested up to: 4.9.4
7
+ Stable tag: 4.4.1
8
+ License: GPLv2 or later
9
+
10
+ The best way to display your employees, team members, or any type of list. Multiple appealing templates,SEO friendly, re-order, import/export functionality
11
+
12
+ == Description ==
13
+
14
+ [View Demo](http://wordpressteamplugin.com/templates/)
15
+
16
+ Our Team Showcase allows you to easily create and display your team members & staff and show them on your site with ease. Your visitors will see a beautiful & animated
17
+ list of your team, with their pictures, links to social icons, and link to each member page.
18
+
19
+ Each member can be edited. When you create or edit a team member, you will be able to add links to contact email, phone number, links to social media( facebook, linkedin, twitter, google plus, instagram & linkedin ), as well as a personal website.
20
+ You can also link in your posts to a user. This way, you can keep the viewer on your site, and recommend content to them.
21
+
22
+ First, install and activate the plugin. You will be automatically re-directed to the plugin settongs page. Select your preferred settings and colors, Add your staff, upload pictures and finally
23
+ add the shortcode [our-team] to the page, post or widget where you want to display them. You can also set the order that the members appear in with a user-friendly drag & drop interface.
24
+
25
+ If your theme has a sidebar, you can use the extra custom sidebar widget to display the team members in the sidebar.
26
+
27
+ The pro version provides you with 4 additional and very unique Team templates and 3 Single Member templates. Impress your site visitors by using the pro version which includes a Honeycomb layout, Scrolling Carousel, Stacked
28
+ list and an additional circular template.
29
+
30
+ Pro version available here: [Pro Version](https://smartcatdesign.net/downloads/our-team-showcase/)
31
+
32
+ Available Customizations:
33
+
34
+ * 3 Grid templates: Circles & Boxes
35
+ * Custom sidebar widget
36
+ * Re-order team members with a simple drag & drop.
37
+ * Select the number of columns
38
+ * Customize the margin
39
+ * Display Social Icons & email icon
40
+ * Unlimited Colors
41
+ * Single member page social icons
42
+ * Add/Edit/Search/Display your staff or team members
43
+ * Display members by group/deparment (category)
44
+ * Boosts SEO with schema.org markup
45
+ * Output your team members anywhere with the shortcode [our-team]
46
+ * Team Member contact info & links to social sites
47
+ * Favorite/Recommended content for each Team Member
48
+ * Ability to export and import team member data
49
+ * Easy to setup
50
+
51
+ Pro Version Features:
52
+
53
+ * 4 Additional team templates: Carousel, Honeycomb, Stacked & Company Directory
54
+ * 3 Single member display templates
55
+ * Team Member **Search bar**. Search by name, group, bio
56
+ * Team Member Filter. **Filter members** by one or multiple groups
57
+ * Animated sliding Panel & Card
58
+ * Click-to-call team member phone number
59
+ * Team member personal quote
60
+ * Search & Sort employee directory
61
+ * Looks great on desktop & mobile
62
+ * Team Member Skills, Hobbies, Tags
63
+ * **Community Hub** (New - October 2017) creates a private member login page on your site so you can share
64
+ posts and pages only with your team
65
+
66
+ Team Member Details & Icons:
67
+
68
+ * Name
69
+ * Group/Department
70
+ * Job Title
71
+ * Email Address
72
+ * Facebook
73
+ * Twitter
74
+ * Google Plus
75
+ * Telephone Number
76
+ * Instagram
77
+ * Pinterest
78
+ * Website/URL
79
+ * Whatsapp
80
+ * Skype
81
+ * Vimeo
82
+ * Soundcloud
83
+ * Links to up to 3 Articles
84
+
85
+
86
+ == Screenshots ==
87
+ 1. Plugin includes Grid boxes, Grid Circular and sidebar templates
88
+ 2. Sidebar widget
89
+ 3. Drag & Drop re-order of memebers
90
+ 4. PRO VERSION - Honeycomb Demo
91
+ 5. PRO VERSION - stacked list Demo
92
+ 6. PRO VERSION - Carousel Demo
93
+ 7. Community Hub - Dashboard
94
+ 8. Community Hub - Team Member Profile
95
+ 9. Community Hub - Single Post
96
+
97
+
98
+ == Installation ==
99
+ 1. Download the plugin, then upload the zipped file to your site from the WordPress dashboard plugin uploader menu
100
+ 2. OR - Upload the unpacked folder folder via FTP into /wp-content/plugins
101
+
102
+ == Changelog ==
103
+
104
+ = 4.4.2 =
105
+ 1. Improved query that pulls team members
106
+
107
+ = 4.4.1 =
108
+ 1. Improved Import/Export functionality
109
+ 2. Updated docs
110
+
111
+
112
+ = 4.4.0 =
113
+ 1. Added the ability to override Team templates from the theme (see documentation)
114
+
115
+ = 4.3.2 =
116
+ 1. Updates to the Import & Export tool
117
+ 2. Bug fix with group filtering
118
+ 3. Added new search & filtering tools to the Pro version
119
+
120
+ = 4.3.1 =
121
+ 1. Bug fix impacting group filtering since WP4.9
122
+
123
+ = 4.3.0 =
124
+ 1. Added Import & Export tools
125
+ 2. Fixes and cleanup
126
+
127
+ = 4.2.0 =
128
+ 1. Added the ability to set the number of columns from the shortcode
129
+ 2. Updated documentation
130
+ 3. Bug fixes
131
+ 4. Updated Pro version - Now it includes a the Community Hub for the team
132
+
133
+ = 4.1.1 =
134
+ 1. fix bug with error when saving posts
135
+ 2. fix php error for un-install
136
+
137
+ = 4.1.0 =
138
+ 1. Added a new field for additional social network
139
+ 2. Shortcode now supports multiple groups
140
+
141
+ = 4.0.2 =
142
+ 1. Bug fixes
143
+ 2. Full compatibility with PHP5.4
144
+
145
+ = 4.0.1 =
146
+ 1. Patch plugin code to be backwards compatible with older PHP versions
147
+ 2. Added the ability to display multiple groups in one shortcode
148
+ 3. New members now are added last
149
+
150
+ = 4.0.0 =
151
+ Plugin re-write. Settings and team member data will be maintained
152
+
153
+ = 3.0.0
154
+ 1. Added new social icons ( pinterest, instagram )
155
+ 2. Added Recommended Articles section in Single Member. You can now toggle a section for each member that outputs up to 3 articles from your blog.
156
+ 3. Updated Documentation
157
+ 4. Fixed issue causing the PHP notice regarding the team_member slug
158
+
159
+
160
+ = 2.41 =
161
+ 1. minor change
162
+
163
+ = 2.4 =
164
+ 1. Bug fixes to icon appearance on some themes
165
+ 2. Responsive fixes
166
+ 3. Added staff directory
167
+ 4. Added ability to change slug for single post view
168
+
169
+ = 2.3 =
170
+ 1. Added team member phone number
171
+ 2. Added social icons link opening in a new page
172
+ 3. Added a new template ( Grid Circles 2 )
173
+ 4. Enhancements to responsive
174
+
175
+ = 2.2 =
176
+ 1. Fixed plugin update bug. The plugin no longer loses settings on update
177
+ 2. Added additional templates to the pro version
178
+
179
+ = 2.1 =
180
+ 1. sidebar widget bug fix
181
+ 2. removed archive
182
+ 3. fixed columns bug
183
+ 4. fixed drag & drop bug
184
+
185
+ = 2.0 =
186
+ 1. Major appearance and functionality changes
187
+ 2. updated pro version
188
+
189
+ = 1.3 =
190
+ 1. sanitization fixes
191
+
192
+ = 1.2 =
193
+ 1. Fix bug with team showing above all content
194
+ 2. Added option to control how many members to output
195
+ 3. Added pro version with additional templates
196
+ 4. Fixed re-order bug
197
+
198
+ = 1.1 =
199
+ 1. add circular grid style template
200
+ 2. add sidebar widget template
201
+ 3. add instructional video
202
+
203
+
204
+ = 1.0 = initial release
templates/grid-circles-2.php CHANGED
@@ -1,78 +1,78 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- ?>
6
-
7
- <div id="sc_our_team" class="grid_circles2 sc-col<?php esc_attr_e( $columns ); ?>">
8
-
9
- <div class="clear"></div>
10
-
11
- <?php if ( $members->have_posts() ) : ?>
12
-
13
- <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
-
15
- <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
-
17
- <div itemscope itemtype="http://schema.org/Person"
18
- class="sc_team_member"
19
- data-id="<?php the_ID(); ?>"
20
- data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
-
22
- <div class="sc_team_member_inner">
23
-
24
- <?php member_avatar(); ?>
25
-
26
- <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
-
28
- <div itemprop="name" class="sc_team_member_name">
29
-
30
- <?php if( $single_template !== 'disable' ) : ?>
31
-
32
- <a href="<?php the_permalink(); ?>" rel="bookmark" class="team_member_link">
33
-
34
- <?php the_title() ?>
35
-
36
- </a>
37
-
38
- <?php else : ?>
39
-
40
- <?php the_title(); ?>
41
-
42
- <?php endif; ?>
43
-
44
- </div>
45
-
46
- <?php endif; ?>
47
-
48
- <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
49
-
50
- <div itemprop="jobtitle" class="sc_team_member_jobtitle">
51
- <span><?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?></span>
52
- </div>
53
-
54
- <?php endif; ?>
55
-
56
- <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
57
- <?php do_member_social_links(); ?>
58
- </div>
59
-
60
- <div class="sc_team_member_overlay"></div>
61
-
62
- </div>
63
-
64
- </div>
65
-
66
- <?php wp_reset_postdata(); ?>
67
-
68
- <?php endwhile; ?>
69
-
70
- <?php else : ?>
71
-
72
- <?php _e( 'There are no team members to display.', 'ots' ); ?>
73
-
74
- <?php endif; ?>
75
-
76
- <div class="clear"></div>
77
-
78
- </div>
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ ?>
6
+
7
+ <div id="sc_our_team" class="grid_circles2 sc-col<?php esc_attr_e( $columns ); ?>">
8
+
9
+ <div class="clear"></div>
10
+
11
+ <?php if ( $members->have_posts() ) : ?>
12
+
13
+ <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
+
15
+ <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
+
17
+ <div itemscope itemtype="http://schema.org/Person"
18
+ class="sc_team_member"
19
+ data-id="<?php the_ID(); ?>"
20
+ data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
+
22
+ <div class="sc_team_member_inner">
23
+
24
+ <?php member_avatar(); ?>
25
+
26
+ <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
+
28
+ <div itemprop="name" class="sc_team_member_name">
29
+
30
+ <?php if( $single_template !== 'disable' ) : ?>
31
+
32
+ <a href="<?php the_permalink(); ?>" rel="bookmark" class="team_member_link">
33
+
34
+ <?php the_title() ?>
35
+
36
+ </a>
37
+
38
+ <?php else : ?>
39
+
40
+ <?php the_title(); ?>
41
+
42
+ <?php endif; ?>
43
+
44
+ </div>
45
+
46
+ <?php endif; ?>
47
+
48
+ <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
49
+
50
+ <div itemprop="jobtitle" class="sc_team_member_jobtitle">
51
+ <span><?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?></span>
52
+ </div>
53
+
54
+ <?php endif; ?>
55
+
56
+ <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
57
+ <?php do_member_social_links(); ?>
58
+ </div>
59
+
60
+ <div class="sc_team_member_overlay"></div>
61
+
62
+ </div>
63
+
64
+ </div>
65
+
66
+ <?php wp_reset_postdata(); ?>
67
+
68
+ <?php endwhile; ?>
69
+
70
+ <?php else : ?>
71
+
72
+ <?php _e( 'There are no team members to display.', 'ots' ); ?>
73
+
74
+ <?php endif; ?>
75
+
76
+ <div class="clear"></div>
77
+
78
+ </div>
templates/grid-circles.php CHANGED
@@ -1,76 +1,76 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- ?>
6
-
7
- <div id="sc_our_team" class="grid_circles sc-col<?php esc_attr_e( $columns ); ?>">
8
-
9
- <div class="clear"></div>
10
-
11
- <?php if ( $members->have_posts() ) : ?>
12
-
13
- <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
-
15
- <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
-
17
- <div itemscope itemtype="http://schema.org/Person"
18
- class="sc_team_member"
19
- data-id="<?php the_ID(); ?>"
20
- data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
-
22
- <div class="sc_team_member_inner">
23
-
24
- <?php member_avatar(); ?>
25
-
26
- <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
-
28
- <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
29
-
30
- <?php endif; ?>
31
-
32
- <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
33
-
34
- <div itemprop="jobtitle" class="sc_team_member_jobtitle">
35
- <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
36
- </div>
37
-
38
- <?php endif; ?>
39
-
40
- <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
41
- <?php do_member_social_links(); ?>
42
- </div>
43
-
44
- <div class="sc_team_member_overlay"></div>
45
-
46
- <?php if( $single_template !== 'disable' ) : ?>
47
-
48
- <div class="sc_team_more">
49
- <a href="<?php the_permalink(); ?>"
50
- class="team_member_link"
51
- rel="bookmark">
52
-
53
- <img src="<?php echo esc_url( asset( 'images/more.png' ) ); ?>"/>
54
-
55
- </a>
56
- </div>
57
-
58
- <?php endif; ?>
59
-
60
- </div>
61
-
62
- </div>
63
-
64
- <?php wp_reset_postdata(); ?>
65
-
66
- <?php endwhile; ?>
67
-
68
- <?php else : ?>
69
-
70
- <?php _e( 'There are no team members to display.', 'ots' ); ?>
71
-
72
- <?php endif; ?>
73
-
74
- <div class="clear"></div>
75
-
76
- </div>
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ ?>
6
+
7
+ <div id="sc_our_team" class="grid_circles sc-col<?php esc_attr_e( $columns ); ?>">
8
+
9
+ <div class="clear"></div>
10
+
11
+ <?php if ( $members->have_posts() ) : ?>
12
+
13
+ <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
+
15
+ <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
+
17
+ <div itemscope itemtype="http://schema.org/Person"
18
+ class="sc_team_member"
19
+ data-id="<?php the_ID(); ?>"
20
+ data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
+
22
+ <div class="sc_team_member_inner">
23
+
24
+ <?php member_avatar(); ?>
25
+
26
+ <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
+
28
+ <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
29
+
30
+ <?php endif; ?>
31
+
32
+ <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
33
+
34
+ <div itemprop="jobtitle" class="sc_team_member_jobtitle">
35
+ <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
36
+ </div>
37
+
38
+ <?php endif; ?>
39
+
40
+ <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
41
+ <?php do_member_social_links(); ?>
42
+ </div>
43
+
44
+ <div class="sc_team_member_overlay"></div>
45
+
46
+ <?php if( $single_template !== 'disable' ) : ?>
47
+
48
+ <div class="sc_team_more">
49
+ <a href="<?php the_permalink(); ?>"
50
+ class="team_member_link"
51
+ rel="bookmark">
52
+
53
+ <img src="<?php echo esc_url( asset( 'images/more.png' ) ); ?>"/>
54
+
55
+ </a>
56
+ </div>
57
+
58
+ <?php endif; ?>
59
+
60
+ </div>
61
+
62
+ </div>
63
+
64
+ <?php wp_reset_postdata(); ?>
65
+
66
+ <?php endwhile; ?>
67
+
68
+ <?php else : ?>
69
+
70
+ <?php _e( 'There are no team members to display.', 'ots' ); ?>
71
+
72
+ <?php endif; ?>
73
+
74
+ <div class="clear"></div>
75
+
76
+ </div>
templates/grid.php CHANGED
@@ -1,76 +1,76 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- ?>
6
-
7
- <div id="sc_our_team" class="grid sc-col<?php esc_attr_e( $columns ); ?>">
8
-
9
- <div class="clear"></div>
10
-
11
- <?php if ( $members->have_posts() ) : ?>
12
-
13
- <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
-
15
- <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
-
17
- <div itemscope itemtype="http://schema.org/Person"
18
- class="sc_team_member"
19
- data-id="<?php the_ID(); ?>"
20
- data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
-
22
- <div class="sc_team_member_inner">
23
-
24
- <?php member_avatar(); ?>
25
-
26
- <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
-
28
- <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
29
-
30
- <?php endif; ?>
31
-
32
- <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
33
-
34
- <div itemprop="jobtitle" class="sc_team_member_jobtitle">
35
- <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
36
- </div>
37
-
38
- <?php endif; ?>
39
-
40
- <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
41
- <?php do_member_social_links(); ?>
42
- </div>
43
-
44
- <div class="sc_team_member_overlay"></div>
45
-
46
- <?php if( $single_template !== 'disable' ) : ?>
47
-
48
- <div class="sc_team_more">
49
- <a href="<?php the_permalink(); ?>"
50
- class="team_member_link"
51
- rel="bookmark">
52
-
53
- <img src="<?php echo esc_url( asset( 'images/more.png' ) ); ?>"/>
54
-
55
- </a>
56
- </div>
57
-
58
- <?php endif; ?>
59
-
60
- </div>
61
-
62
- </div>
63
-
64
- <?php wp_reset_postdata(); ?>
65
-
66
- <?php endwhile; ?>
67
-
68
- <?php else : ?>
69
-
70
- <?php _e( 'There are no team members to display.', 'ots' ); ?>
71
-
72
- <?php endif; ?>
73
-
74
- <div class="clear"></div>
75
-
76
- </div>
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ ?>
6
+
7
+ <div id="sc_our_team" class="grid sc-col<?php esc_attr_e( $columns ); ?>">
8
+
9
+ <div class="clear"></div>
10
+
11
+ <?php if ( $members->have_posts() ) : ?>
12
+
13
+ <?php while ( $members->have_posts() ) : $members->the_post(); ?>
14
+
15
+ <?php $groups = \ots\member_groups( null, ';', false ); ?>
16
+
17
+ <div itemscope itemtype="http://schema.org/Person"
18
+ class="sc_team_member"
19
+ data-id="<?php the_ID(); ?>"
20
+ data-group="<?php echo !empty( $groups ) ? $groups : 'groupless'; ?>">
21
+
22
+ <div class="sc_team_member_inner">
23
+
24
+ <?php member_avatar(); ?>
25
+
26
+ <?php if ( get_option( Options::DISPLAY_NAME ) == 'on' ) : ?>
27
+
28
+ <div itemprop="name" class="sc_team_member_name"><?php the_title() ?></div>
29
+
30
+ <?php endif; ?>
31
+
32
+ <?php if ( get_option( Options::DISPLAY_TITLE ) == 'on' ) : ?>
33
+
34
+ <div itemprop="jobtitle" class="sc_team_member_jobtitle">
35
+ <?php esc_html_e( get_post_meta( get_the_ID(), 'team_member_title', true ) ); ?>
36
+ </div>
37
+
38
+ <?php endif; ?>
39
+
40
+ <div class="icons <?php echo get_option( Options::SHOW_SOCIAL ) ? '' : 'hidden'; ?>">
41
+ <?php do_member_social_links(); ?>
42
+ </div>
43
+
44
+ <div class="sc_team_member_overlay"></div>
45
+
46
+ <?php if( $single_template !== 'disable' ) : ?>
47
+
48
+ <div class="sc_team_more">
49
+ <a href="<?php the_permalink(); ?>"
50
+ class="team_member_link"
51
+ rel="bookmark">
52
+
53
+ <img src="<?php echo esc_url( asset( 'images/more.png' ) ); ?>"/>
54
+
55
+ </a>
56
+ </div>
57
+
58
+ <?php endif; ?>
59
+
60
+ </div>
61
+
62
+ </div>
63
+
64
+ <?php wp_reset_postdata(); ?>
65
+
66
+ <?php endwhile; ?>
67
+
68
+ <?php else : ?>
69
+
70
+ <?php _e( 'There are no team members to display.', 'ots' ); ?>
71
+
72
+ <?php endif; ?>
73
+
74
+ <div class="clear"></div>
75
+
76
+ </div>
uninstall.php CHANGED
@@ -1,53 +1,53 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- if( !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
6
- die;
7
- }
8
-
9
- /**
10
- * Uninstall script. Deletes all options, terms and trashes posts.
11
- *
12
- * @since 4.0.0
13
- */
14
-
15
- include_once dirname( __FILE__ ) . '/constants.php';
16
- include_once dirname( __FILE__ ) . '/includes/team-member.php';
17
-
18
-
19
-
20
- if ( get_option( Options::NUKE ) == 'on' ) {
21
-
22
- // Trash all team member posts
23
- $posts = get_posts( array(
24
- 'post_type' => 'team_member',
25
- 'posts_per_page' => -1
26
- ) );
27
-
28
- foreach( $posts as $post ) {
29
- wp_trash_post( $post->ID );
30
- }
31
-
32
-
33
- // Delete all terms from the taxonomy
34
- register_team_member_position_taxonomy();
35
-
36
- $terms = get_terms( array(
37
- 'taxonomy' => 'team_member_position',
38
- 'hide_empty' => false,
39
- ) );
40
-
41
- foreach( $terms as $term ) {
42
- wp_delete_term( $term->term_id, 'team_member_position' );
43
- }
44
-
45
-
46
- // Delete all plugin settings
47
- $options = new \ReflectionClass( '\ots\Options' );
48
-
49
- foreach( $options->getConstants() as $option ) {
50
- delete_option( $option );
51
- }
52
-
53
- }
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ if( !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
6
+ die;
7
+ }
8
+
9
+ /**
10
+ * Uninstall script. Deletes all options, terms and trashes posts.
11
+ *
12
+ * @since 4.0.0
13
+ */
14
+
15
+ include_once dirname( __FILE__ ) . '/constants.php';
16
+ include_once dirname( __FILE__ ) . '/includes/team-member.php';
17
+
18
+
19
+
20
+ if ( get_option( Options::NUKE ) == 'on' ) {
21
+
22
+ // Trash all team member posts
23
+ $posts = get_posts( array(
24
+ 'post_type' => 'team_member',
25
+ 'posts_per_page' => -1
26
+ ) );
27
+
28
+ foreach( $posts as $post ) {
29
+ wp_trash_post( $post->ID );
30
+ }
31
+
32
+
33
+ // Delete all terms from the taxonomy
34
+ register_team_member_position_taxonomy();
35
+
36
+ $terms = get_terms( array(
37
+ 'taxonomy' => 'team_member_position',
38
+ 'hide_empty' => false,
39
+ ) );
40
+
41
+ foreach( $terms as $term ) {
42
+ wp_delete_term( $term->term_id, 'team_member_position' );
43
+ }
44
+
45
+
46
+ // Delete all plugin settings
47
+ $options = new \ReflectionClass( '\ots\Options' );
48
+
49
+ foreach( $options->getConstants() as $option ) {
50
+ delete_option( $option );
51
+ }
52
+
53
+ }
upgrade.php CHANGED
@@ -1,59 +1,59 @@
1
- <?php
2
-
3
- namespace ots;
4
-
5
- /**
6
- * Upgrades and migrates the plugin's settings.
7
- *
8
- * @since 4.0.0
9
- */
10
- function do_migration() {
11
-
12
- $options = get_option( 'smartcat_team_options', false );
13
-
14
- if ( $options && get_option( Options::PLUGIN_VERSION, 0 ) < '4.0.0' ) {
15
-
16
- // Map out all non-boolean values
17
- $map = array(
18
- 'margin' => Options::MARGIN,
19
- 'slug' => Options::REWRITE_SLUG,
20
- 'template' => Options::TEMPLATE,
21
- 'single_template' => Options::SINGLE_TEMPLATE
22
- );
23
-
24
- foreach( $map as $old => $new ) {
25
- update_option( $new, $options[ $old ] );
26
- }
27
-
28
-
29
- // Map out all boolean values
30
- $checkboxes = array(
31
- 'social' => Options::SHOW_SOCIAL,
32
- 'single_social' => Options::SHOW_SINGLE_SOCIAL,
33
- 'name' => Options::DISPLAY_NAME,
34
- 'title' => Options::DISPLAY_TITLE,
35
- );
36
-
37
- foreach ( $checkboxes as $old => $new ) {
38
- update_option( $new, $options[ $old ] == 'yes' ? 'on' : '' );
39
- }
40
-
41
-
42
- // Add hash to main color
43
- update_option( Options::MAIN_COLOR, '#' . $options['text_color'] );
44
-
45
- // If the value was -1 set it to 'on' to display all
46
- update_option( Options::GRID_COLUMNS, $options['columns'] < 0 ? 'on' : $options['columns'] );
47
- update_option( Options::DISPLAY_LIMIT, $options['member_count'] < 0 ? 'all' : $options['member_count'] );
48
-
49
- // If show social icons was set to open a new tab, change it to a boolean
50
- update_option( Options::SOCIAL_LINK_ACTION, $options['social_link'] === 'new' ? 'on' : '' );
51
-
52
- // Update the plugin version
53
- update_option( Options::PLUGIN_VERSION, VERSION );
54
-
55
- }
56
-
57
- }
58
-
59
- add_action( 'admin_init', 'ots\do_migration' );
1
+ <?php
2
+
3
+ namespace ots;
4
+
5
+ /**
6
+ * Upgrades and migrates the plugin's settings.
7
+ *
8
+ * @since 4.0.0
9
+ */
10
+ function do_migration() {
11
+
12
+ $options = get_option( 'smartcat_team_options', false );
13
+
14
+ if ( $options && get_option( Options::PLUGIN_VERSION, 0 ) < '4.0.0' ) {
15
+
16
+ // Map out all non-boolean values
17
+ $map = array(
18
+ 'margin' => Options::MARGIN,
19
+ 'slug' => Options::REWRITE_SLUG,
20
+ 'template' => Options::TEMPLATE,
21
+ 'single_template' => Options::SINGLE_TEMPLATE
22
+ );
23
+
24
+ foreach( $map as $old => $new ) {
25
+ update_option( $new, $options[ $old ] );
26
+ }
27
+
28
+
29
+ // Map out all boolean values
30
+ $checkboxes = array(
31
+ 'social' => Options::SHOW_SOCIAL,
32
+ 'single_social' => Options::SHOW_SINGLE_SOCIAL,
33
+ 'name' => Options::DISPLAY_NAME,
34
+ 'title' => Options::DISPLAY_TITLE,
35
+ );
36
+
37
+ foreach ( $checkboxes as $old => $new ) {
38
+ update_option( $new, $options[ $old ] == 'yes' ? 'on' : '' );
39
+ }
40
+
41
+
42
+ // Add hash to main color
43
+ update_option( Options::MAIN_COLOR, '#' . $options['text_color'] );
44
+
45
+ // If the value was -1 set it to 'on' to display all
46
+ update_option( Options::GRID_COLUMNS, $options['columns'] < 0 ? 'on' : $options['columns'] );
47
+ update_option( Options::DISPLAY_LIMIT, $options['member_count'] < 0 ? 'all' : $options['member_count'] );
48
+
49
+ // If show social icons was set to open a new tab, change it to a boolean
50
+ update_option( Options::SOCIAL_LINK_ACTION, $options['social_link'] === 'new' ? 'on' : '' );
51
+
52
+ // Update the plugin version
53
+ update_option( Options::PLUGIN_VERSION, VERSION );
54
+
55
+ }
56
+
57
+ }
58
+
59
+ add_action( 'admin_init', 'ots\do_migration' );