FooGallery – Image Gallery WordPress Plugin - Version 2.1.34

Version Description

  • Date Updated : 2022-02-01
  • Fix : Fixed bug where WebP images could not be uploaded when using the GD image editor
  • Fix : Security Fix in wp-admin
  • Update : Update to Freemius SDK
Download this release

Release Info

Developer bradvin
Plugin Icon 128x128 FooGallery – Image Gallery WordPress Plugin
Version 2.1.34
Comparing to
See all releases

Code changes from version 2.1.33 to 2.1.34

Files changed (45) hide show
  1. LICENSE.txt +338 -338
  2. README.txt +1015 -1009
  3. changelog.txt +3 -3
  4. css/admin-foogallery-gallery-piles.css +92 -92
  5. css/admin-foogallery.css +679 -679
  6. css/admin-page-foogallery-extensions.css +269 -269
  7. css/admin-page-foogallery-help.css +564 -564
  8. css/admin-page-foogallery-settings.css +44 -44
  9. css/admin-tinymce.css +114 -114
  10. css/foogallery-foovideo-overrides.css +95 -95
  11. css/foogallery.admin.datasources.css +122 -122
  12. extensions/albums/admin/class-columns.php +73 -73
  13. extensions/albums/admin/class-metaboxes.php +577 -577
  14. extensions/albums/album-default.php +84 -84
  15. extensions/albums/album-stack.php +86 -86
  16. extensions/albums/class-albums-extension.php +175 -175
  17. extensions/albums/class-foogallery-album.php +256 -256
  18. extensions/albums/class-posttypes.php +108 -108
  19. extensions/albums/css/admin-foogallery-album.css +272 -272
  20. extensions/albums/css/album-default.css +102 -102
  21. extensions/albums/css/album-stack.css +289 -289
  22. extensions/albums/functions.php +390 -390
  23. extensions/albums/js/admin-foogallery-album.js +148 -148
  24. extensions/albums/js/album-stack.js +869 -869
  25. extensions/albums/public/class-foogallery-album-template-loader.php +184 -184
  26. extensions/albums/public/class-rewrite-rules.php +46 -46
  27. extensions/albums/public/class-shortcodes.php +44 -44
  28. extensions/default-templates/class-default-templates-extension.php +13 -13
  29. extensions/default-templates/class-default-templates.php +53 -53
  30. extensions/default-templates/default/class-default-gallery-template.php +239 -239
  31. extensions/default-templates/default/gallery-default.php +19 -19
  32. extensions/default-templates/default/js/admin-gallery-default.js +88 -88
  33. extensions/default-templates/functions.php +49 -49
  34. extensions/default-templates/image-viewer/class-image-viewer-gallery-template.php +311 -311
  35. extensions/default-templates/image-viewer/gallery-image-viewer.php +38 -38
  36. extensions/default-templates/image-viewer/js/admin-gallery-image-viewer.js +122 -122
  37. extensions/default-templates/justified/class-justified-gallery-template.php +352 -352
  38. extensions/default-templates/justified/gallery-justified.php +15 -15
  39. extensions/default-templates/masonry/class-masonry-gallery-template.php +406 -406
  40. extensions/default-templates/masonry/gallery-masonry.php +25 -25
  41. extensions/default-templates/masonry/js/admin-gallery-masonry.js +29 -29
  42. extensions/default-templates/shared/css/admin-foogallery.css +86 -86
  43. extensions/default-templates/shared/css/foogallery.css +3478 -3478
  44. extensions/default-templates/shared/img/icons.svg +183 -183
  45. extensions/default-templates/shared/js/foogallery.js +0 -3304
LICENSE.txt CHANGED
@@ -1,339 +1,339 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 2, June 1991
3
-
4
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
- Everyone is permitted to copy and distribute verbatim copies
7
- of this license document, but changing it is not allowed.
8
-
9
- Preamble
10
-
11
- The licenses for most software are designed to take away your
12
- freedom to share and change it. By contrast, the GNU General Public
13
- License is intended to guarantee your freedom to share and change free
14
- software--to make sure the software is free for all its users. This
15
- General Public License applies to most of the Free Software
16
- Foundation's software and to any other program whose authors commit to
17
- using it. (Some other Free Software Foundation software is covered by
18
- the GNU Lesser General Public License instead.) You can apply it to
19
- your programs, too.
20
-
21
- When we speak of free software, we are referring to freedom, not
22
- price. Our General Public Licenses are designed to make sure that you
23
- have the freedom to distribute copies of free software (and charge for
24
- this service if you wish), that you receive source code or can get it
25
- if you want it, that you can change the software or use pieces of it
26
- in new free programs; and that you know you can do these things.
27
-
28
- To protect your rights, we need to make restrictions that forbid
29
- anyone to deny you these rights or to ask you to surrender the rights.
30
- These restrictions translate to certain responsibilities for you if you
31
- distribute copies of the software, or if you modify it.
32
-
33
- For example, if you distribute copies of such a program, whether
34
- gratis or for a fee, you must give the recipients all the rights that
35
- you have. You must make sure that they, too, receive or can get the
36
- source code. And you must show them these terms so they know their
37
- rights.
38
-
39
- We protect your rights with two steps: (1) copyright the software, and
40
- (2) offer you this license which gives you legal permission to copy,
41
- distribute and/or modify the software.
42
-
43
- Also, for each author's protection and ours, we want to make certain
44
- that everyone understands that there is no warranty for this free
45
- software. If the software is modified by someone else and passed on, we
46
- want its recipients to know that what they have is not the original, so
47
- that any problems introduced by others will not reflect on the original
48
- authors' reputations.
49
-
50
- Finally, any free program is threatened constantly by software
51
- patents. We wish to avoid the danger that redistributors of a free
52
- program will individually obtain patent licenses, in effect making the
53
- program proprietary. To prevent this, we have made it clear that any
54
- patent must be licensed for everyone's free use or not licensed at all.
55
-
56
- The precise terms and conditions for copying, distribution and
57
- modification follow.
58
-
59
- GNU GENERAL PUBLIC LICENSE
60
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
-
62
- 0. This License applies to any program or other work which contains
63
- a notice placed by the copyright holder saying it may be distributed
64
- under the terms of this General Public License. The "Program", below,
65
- refers to any such program or work, and a "work based on the Program"
66
- means either the Program or any derivative work under copyright law:
67
- that is to say, a work containing the Program or a portion of it,
68
- either verbatim or with modifications and/or translated into another
69
- language. (Hereinafter, translation is included without limitation in
70
- the term "modification".) Each licensee is addressed as "you".
71
-
72
- Activities other than copying, distribution and modification are not
73
- covered by this License; they are outside its scope. The act of
74
- running the Program is not restricted, and the output from the Program
75
- is covered only if its contents constitute a work based on the
76
- Program (independent of having been made by running the Program).
77
- Whether that is true depends on what the Program does.
78
-
79
- 1. You may copy and distribute verbatim copies of the Program's
80
- source code as you receive it, in any medium, provided that you
81
- conspicuously and appropriately publish on each copy an appropriate
82
- copyright notice and disclaimer of warranty; keep intact all the
83
- notices that refer to this License and to the absence of any warranty;
84
- and give any other recipients of the Program a copy of this License
85
- along with the Program.
86
-
87
- You may charge a fee for the physical act of transferring a copy, and
88
- you may at your option offer warranty protection in exchange for a fee.
89
-
90
- 2. You may modify your copy or copies of the Program or any portion
91
- of it, thus forming a work based on the Program, and copy and
92
- distribute such modifications or work under the terms of Section 1
93
- above, provided that you also meet all of these conditions:
94
-
95
- a) You must cause the modified files to carry prominent notices
96
- stating that you changed the files and the date of any change.
97
-
98
- b) You must cause any work that you distribute or publish, that in
99
- whole or in part contains or is derived from the Program or any
100
- part thereof, to be licensed as a whole at no charge to all third
101
- parties under the terms of this License.
102
-
103
- c) If the modified program normally reads commands interactively
104
- when run, you must cause it, when started running for such
105
- interactive use in the most ordinary way, to print or display an
106
- announcement including an appropriate copyright notice and a
107
- notice that there is no warranty (or else, saying that you provide
108
- a warranty) and that users may redistribute the program under
109
- these conditions, and telling the user how to view a copy of this
110
- License. (Exception: if the Program itself is interactive but
111
- does not normally print such an announcement, your work based on
112
- the Program is not required to print an announcement.)
113
-
114
- These requirements apply to the modified work as a whole. If
115
- identifiable sections of that work are not derived from the Program,
116
- and can be reasonably considered independent and separate works in
117
- themselves, then this License, and its terms, do not apply to those
118
- sections when you distribute them as separate works. But when you
119
- distribute the same sections as part of a whole which is a work based
120
- on the Program, the distribution of the whole must be on the terms of
121
- this License, whose permissions for other licensees extend to the
122
- entire whole, and thus to each and every part regardless of who wrote it.
123
-
124
- Thus, it is not the intent of this section to claim rights or contest
125
- your rights to work written entirely by you; rather, the intent is to
126
- exercise the right to control the distribution of derivative or
127
- collective works based on the Program.
128
-
129
- In addition, mere aggregation of another work not based on the Program
130
- with the Program (or with a work based on the Program) on a volume of
131
- a storage or distribution medium does not bring the other work under
132
- the scope of this License.
133
-
134
- 3. You may copy and distribute the Program (or a work based on it,
135
- under Section 2) in object code or executable form under the terms of
136
- Sections 1 and 2 above provided that you also do one of the following:
137
-
138
- a) Accompany it with the complete corresponding machine-readable
139
- source code, which must be distributed under the terms of Sections
140
- 1 and 2 above on a medium customarily used for software interchange; or,
141
-
142
- b) Accompany it with a written offer, valid for at least three
143
- years, to give any third party, for a charge no more than your
144
- cost of physically performing source distribution, a complete
145
- machine-readable copy of the corresponding source code, to be
146
- distributed under the terms of Sections 1 and 2 above on a medium
147
- customarily used for software interchange; or,
148
-
149
- c) Accompany it with the information you received as to the offer
150
- to distribute corresponding source code. (This alternative is
151
- allowed only for noncommercial distribution and only if you
152
- received the program in object code or executable form with such
153
- an offer, in accord with Subsection b above.)
154
-
155
- The source code for a work means the preferred form of the work for
156
- making modifications to it. For an executable work, complete source
157
- code means all the source code for all modules it contains, plus any
158
- associated interface definition files, plus the scripts used to
159
- control compilation and installation of the executable. However, as a
160
- special exception, the source code distributed need not include
161
- anything that is normally distributed (in either source or binary
162
- form) with the major components (compiler, kernel, and so on) of the
163
- operating system on which the executable runs, unless that component
164
- itself accompanies the executable.
165
-
166
- If distribution of executable or object code is made by offering
167
- access to copy from a designated place, then offering equivalent
168
- access to copy the source code from the same place counts as
169
- distribution of the source code, even though third parties are not
170
- compelled to copy the source along with the object code.
171
-
172
- 4. You may not copy, modify, sublicense, or distribute the Program
173
- except as expressly provided under this License. Any attempt
174
- otherwise to copy, modify, sublicense or distribute the Program is
175
- void, and will automatically terminate your rights under this License.
176
- However, parties who have received copies, or rights, from you under
177
- this License will not have their licenses terminated so long as such
178
- parties remain in full compliance.
179
-
180
- 5. You are not required to accept this License, since you have not
181
- signed it. However, nothing else grants you permission to modify or
182
- distribute the Program or its derivative works. These actions are
183
- prohibited by law if you do not accept this License. Therefore, by
184
- modifying or distributing the Program (or any work based on the
185
- Program), you indicate your acceptance of this License to do so, and
186
- all its terms and conditions for copying, distributing or modifying
187
- the Program or works based on it.
188
-
189
- 6. Each time you redistribute the Program (or any work based on the
190
- Program), the recipient automatically receives a license from the
191
- original licensor to copy, distribute or modify the Program subject to
192
- these terms and conditions. You may not impose any further
193
- restrictions on the recipients' exercise of the rights granted herein.
194
- You are not responsible for enforcing compliance by third parties to
195
- this License.
196
-
197
- 7. If, as a consequence of a court judgment or allegation of patent
198
- infringement or for any other reason (not limited to patent issues),
199
- conditions are imposed on you (whether by court order, agreement or
200
- otherwise) that contradict the conditions of this License, they do not
201
- excuse you from the conditions of this License. If you cannot
202
- distribute so as to satisfy simultaneously your obligations under this
203
- License and any other pertinent obligations, then as a consequence you
204
- may not distribute the Program at all. For example, if a patent
205
- license would not permit royalty-free redistribution of the Program by
206
- all those who receive copies directly or indirectly through you, then
207
- the only way you could satisfy both it and this License would be to
208
- refrain entirely from distribution of the Program.
209
-
210
- If any portion of this section is held invalid or unenforceable under
211
- any particular circumstance, the balance of the section is intended to
212
- apply and the section as a whole is intended to apply in other
213
- circumstances.
214
-
215
- It is not the purpose of this section to induce you to infringe any
216
- patents or other property right claims or to contest validity of any
217
- such claims; this section has the sole purpose of protecting the
218
- integrity of the free software distribution system, which is
219
- implemented by public license practices. Many people have made
220
- generous contributions to the wide range of software distributed
221
- through that system in reliance on consistent application of that
222
- system; it is up to the author/donor to decide if he or she is willing
223
- to distribute software through any other system and a licensee cannot
224
- impose that choice.
225
-
226
- This section is intended to make thoroughly clear what is believed to
227
- be a consequence of the rest of this License.
228
-
229
- 8. If the distribution and/or use of the Program is restricted in
230
- certain countries either by patents or by copyrighted interfaces, the
231
- original copyright holder who places the Program under this License
232
- may add an explicit geographical distribution limitation excluding
233
- those countries, so that distribution is permitted only in or among
234
- countries not thus excluded. In such case, this License incorporates
235
- the limitation as if written in the body of this License.
236
-
237
- 9. The Free Software Foundation may publish revised and/or new versions
238
- of the General Public License from time to time. Such new versions will
239
- be similar in spirit to the present version, but may differ in detail to
240
- address new problems or concerns.
241
-
242
- Each version is given a distinguishing version number. If the Program
243
- specifies a version number of this License which applies to it and "any
244
- later version", you have the option of following the terms and conditions
245
- either of that version or of any later version published by the Free
246
- Software Foundation. If the Program does not specify a version number of
247
- this License, you may choose any version ever published by the Free Software
248
- Foundation.
249
-
250
- 10. If you wish to incorporate parts of the Program into other free
251
- programs whose distribution conditions are different, write to the author
252
- to ask for permission. For software which is copyrighted by the Free
253
- Software Foundation, write to the Free Software Foundation; we sometimes
254
- make exceptions for this. Our decision will be guided by the two goals
255
- of preserving the free status of all derivatives of our free software and
256
- of promoting the sharing and reuse of software generally.
257
-
258
- NO WARRANTY
259
-
260
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
- REPAIR OR CORRECTION.
269
-
270
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
- OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
- TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
- YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
- POSSIBILITY OF SUCH DAMAGES.
279
-
280
- END OF TERMS AND CONDITIONS
281
-
282
- How to Apply These Terms to Your New Programs
283
-
284
- If you develop a new program, and you want it to be of the greatest
285
- possible use to the public, the best way to achieve this is to make it
286
- free software which everyone can redistribute and change under these terms.
287
-
288
- To do so, attach the following notices to the program. It is safest
289
- to attach them to the start of each source file to most effectively
290
- convey the exclusion of warranty; and each file should have at least
291
- the "copyright" line and a pointer to where the full notice is found.
292
-
293
- <one line to give the program's name and a brief idea of what it does.>
294
- Copyright (C) <year> <name of author>
295
-
296
- This program is free software; you can redistribute it and/or modify
297
- it under the terms of the GNU General Public License as published by
298
- the Free Software Foundation; either version 2 of the License, or
299
- (at your option) any later version.
300
-
301
- This program is distributed in the hope that it will be useful,
302
- but WITHOUT ANY WARRANTY; without even the implied warranty of
303
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
- GNU General Public License for more details.
305
-
306
- You should have received a copy of the GNU General Public License along
307
- with this program; if not, write to the Free Software Foundation, Inc.,
308
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
-
310
- Also add information on how to contact you by electronic and paper mail.
311
-
312
- If the program is interactive, make it output a short notice like this
313
- when it starts in an interactive mode:
314
-
315
- Gnomovision version 69, Copyright (C) year name of author
316
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
- This is free software, and you are welcome to redistribute it
318
- under certain conditions; type `show c' for details.
319
-
320
- The hypothetical commands `show w' and `show c' should show the appropriate
321
- parts of the General Public License. Of course, the commands you use may
322
- be called something other than `show w' and `show c'; they could even be
323
- mouse-clicks or menu items--whatever suits your program.
324
-
325
- You should also get your employer (if you work as a programmer) or your
326
- school, if any, to sign a "copyright disclaimer" for the program, if
327
- necessary. Here is a sample; alter the names:
328
-
329
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
-
332
- <signature of Ty Coon>, 1 April 1989
333
- Ty Coon, President of Vice
334
-
335
- This General Public License does not permit incorporating your program into
336
- proprietary programs. If your program is a subroutine library, you may
337
- consider it more useful to permit linking proprietary applications with the
338
- library. If this is what you want to do, use the GNU Lesser General
339
  Public License instead of this License.
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
  Public License instead of this License.
README.txt CHANGED
@@ -1,1010 +1,1016 @@
1
- === Best WordPress Gallery Plugin - FooGallery ===
2
- Contributors: bradvin, steveush, fooplugins
3
- Donate link: https://fooplugins.com
4
- Tags: gallery, image gallery, photo gallery, responsive gallery, wordpress gallery plugin, best gallery plugin, albums, media gallery, video gallery, lightbox
5
- Requires at least: 4.6
6
- Tested up to: 5.9
7
- Stable tag: 2.1.33
8
- License: GPLv2 or later
9
- License URI: https://www.gnu.org/licenses/gpl-2.0.html
10
-
11
- The best WordPress gallery plugin. Create stunning galleries in minutes, with advanced settings for complete customization and control.
12
-
13
- == Description ==
14
-
15
- = WordPress Gallery Plugin =
16
-
17
- Make galleries in WordPress great again with FooGallery! Add a stunning gallery to your website in under 1 minute using our beautiful pre-built templates, or if you want more control, then take advantage of all our advanced settings to customsize your galleries to look exactly the way you want.
18
-
19
- FooGallery is an easy-to-use image gallery plugin, with stunning pre-built gallery layouts and a focus on performance and SEO.
20
- It is also responsive, retina-ready and supports lazy loading for lightning fast photo galleries.
21
-
22
- Live previews are available while creating an image gallery, and also within the Gutenberg block editor with our FooGallery Block.
23
-
24
- FooGallery was built to be highly configurable and extendable for developers or freelancers.
25
-
26
- That is why we think FooGallery is the best WordPress gallery plugin. After using it, we hope you will agree.
27
-
28
- [Visit the FooGallery Homepage](https://fooplugins.com/foogallery-wordpress-gallery-plugin/)
29
-
30
- = Performance Updates for Google's Core Web Vitals =
31
-
32
- A faster gallery now means a more favourable ranking in Google!
33
- FooGallery has been specifically optimized to score better for Google's Core Web Vitals update in 2021.
34
- We have focused on the speed of our javascript code, and also improved the visual stability of all gallery layouts.
35
- This has led to dramatically better scores for the 3 key lighthouse factors including:
36
-
37
- * Largest Contentful Paint - galleries load and appear quicker for your visitors
38
- * First Input Delay - you can interact with the gallery sooner
39
- * Cumulative Layout Shift - gallery images shift around a lot less than before!
40
-
41
- = WordPress Gallery Plugin Features =
42
-
43
- The following free features make FooGallery the **best gallery plugin** on the market!
44
-
45
- * 6 Beautiful Image Gallery templates
46
- * Responsive Image Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/responsive-image-gallery/)
47
- * Image Viewer Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/image-viewer-gallery/)
48
- * Masonry Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/masonry-gallery/)
49
- * Simple Portfolio - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-portfolio-gallery/)
50
- * Justified Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/justified-gallery/)
51
- * Single Thumbnail Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/single-thumbnail-gallery/)
52
- * Easy to customize!
53
- * Adjust thumbnail size, spacing & alignment
54
- * Adjust border size, rounded corners, drop shadows, inner shadows
55
- * Choose from a selection of loading icons
56
- * Animated loaded effects - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/animated-loaded-effects/)
57
- * Awesome hover effects - adjust colors, scaling and icons
58
- * Complete control over captions
59
- * Focus on Performance
60
- * Lazy Loading options
61
- * Simple pagination [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/gallery-pagination/)
62
- * Optimized code
63
- * Reduced content layout shift
64
- * Focus on SEO
65
- * ALT and title attributes on all images
66
- * Yoast SEO sitemap integration
67
- * Rank Math SEO sitemap integration
68
- * AIOSEO sitemap integration
69
- * Albums built-in! (just activate the albums extension)
70
- * Responsive album layout - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-album-gallery/)
71
- * All-in-one Stack album - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-album-gallery/#all-in-one)
72
- * Gutenberg ready (Gallery previews inside the new editor!)
73
- * Live previews as you make changes!
74
- * Retina thumbnail support
75
- * Gallery Widget
76
- * Use built-in media library to manage images
77
- * Drag n Drop reordering of images and galleries
78
- * Custom CSS for both galleries and albums
79
- * Copy to clipboard shortcodes
80
- * One-click gallery page creation
81
- * NextGen importer tool (albums and galleries and shortcodes)
82
- * Multisite Support
83
-
84
- = PRO Gallery Features =
85
-
86
- There are 3 PRO plans available, that will work with any budget:
87
-
88
- [PRO Starter](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-starter-features) | [PRO Expert](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-expert-features) | [PRO Commerce](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-commerce-features)
89
-
90
- **PRO Starter Features**
91
-
92
- * 3 more beautiful PRO responsive gallery templates:
93
- * Polaroid gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/polaroid-gallery/)
94
- * Grid gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/grid-gallery/)
95
- * Slider gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/slider-gallery/)
96
- * PRO image and media lightbox built in! [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pro-lightbox/)
97
- * 11 beautiful hover effect presets - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/hover-presets/)
98
- * 12 CSS thumbnail filters (Instagram) - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filter-effects/)
99
-
100
- **PRO Expert Features**
101
-
102
- * Video Support - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/video-gallery/)
103
- * Import video from Youtube, Vimeo and others
104
- * Self-hosted videos
105
- * Filtering
106
- * Add filters using Media Tags or Categories - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filtering/)
107
- * Multi-level filtering for galleries [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filtering/#multi-level)
108
- * Bulk media tags and category management for attachments
109
- * Dynamic Galleries (load images from other sources):
110
- * Load from a folder on the server
111
- * Load from a collection from Adobe Lightroom (using WP/LR Sync)
112
- * Load all attachments with Media Tags
113
- * Load all attachments with Media Categories
114
- * Load from a folder in Real Media Library
115
- * Load featured images from a post/page/custom post type - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/post-query-gallery/)
116
- * Advanced Pagination
117
- * Numbered pagination - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#numbered)
118
- * "Load More" pagination - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#load-more)
119
- * Infinite scroll image gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#infinite-scroll)
120
- * Advanced Custom Captions - [demo](hhttps://fooplugins.com/foogallery-wordpress-gallery-plugin/custom-captions/)
121
- * EXIF metadata gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/exif-data/)
122
- * Bulk Copy Gallery Settings - [more info](https://fooplugins.com/bulk-copy-foogallery-pro/)
123
- * Deeplinking support for pages and filters
124
-
125
- **PRO Commerce Features**
126
-
127
- * Image Protection
128
- * Photo watermarking - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/photo-watermark/)
129
- * No right-click protection - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/photo-watermark/)
130
- * Deep WooCommerce integration - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/woocommerce-integration/#product-gallery)
131
- * Create a dynamic gallery from your WooCommerce products in seconds!
132
- * Filter using WooCommerce product categories
133
- * Show sales ribbons for products on sale
134
- * Add-to-cart buttons on thumbnails
135
- * Support for product variations
136
- * Show product details (including variations) in Lightbox
137
- * Sell your images online - [demo](https://footest.tastewp.com/)
138
- * Link all your gallery items to a single master product
139
- * Supports variations
140
-
141
- [See More Demos](https://fooplugins.com/foogallery-wordpress-gallery-plugin/demos/)
142
-
143
- **Test Drive**
144
-
145
- Take FooGallery for a test drive! Spin up your very own WP instance with FooGallery pre-installed:
146
-
147
- [Start FooGallery Test Drive!](https://tastewp.com/new/?pre-installed-plugin-slug=foogallery)
148
-
149
- **Documentation**
150
-
151
- * [FooGallery Documentation](https://fooplugins.com/documentation/foogallery/)
152
-
153
- **Gutenberg**
154
-
155
- FooGallery includes a really simple-to-use Gutenberg block to add your existing FooGallery image galleries in seconds. And it includes live previews of the image gallery too!
156
-
157
- **GDPR**
158
-
159
- When you install FooGallery for the first time, the plugin asks you (the website admin) to opt-in so that we can track your usage of the plugin and provide a better service (send you update emails for new version releases and security updates etc). *This is optional and not required in order to use the plugin.*
160
-
161
- From your website point of view, FooGallery never collects or stores any visitor information at all, when someone visits your website.
162
-
163
- **PHP 8 Compatible**
164
-
165
- FooGallery has been tried and tested on servers running up to PHP 8
166
-
167
- **Retina Support**
168
-
169
- FooGallery is a responsive gallery with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails so that your image galleries look amazing on all devices.
170
-
171
- **Video Gallery**
172
-
173
- FooGallery PRO Expert allows you to create a video gallery in seconds! Import from YouTube, Vimeo, Facebook, TED and Dailymotion, or import a self-hosted video from any online source (eg. S3 bucket).
174
- You can also easily create mixed galleries with both images and videos!
175
-
176
- **WooCommerce**
177
-
178
- Sell your photographs online with our full WooCommerce integration, available in PRO Commerce. You can either create a dyanmic gallery from your existing products, or you can sell images in a gallery by linking them to a single master product. With full support for variations. Highlight products for sale with ribbons. Add call-to-action buttons to your items, for example AJAX Add to Cart buttons.
179
-
180
- **Albums Built In**
181
-
182
- Albums are built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
183
-
184
- **Built For Developers**
185
-
186
- FooGallery was designed to be the most developer-friendly image gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
187
-
188
- **Special Thanks**
189
-
190
- Thanks to Fortinet FortiGuard Labs for the security testing conducted on the plugin. FooGallery is a safer plugin thanks to them.
191
-
192
- == Best Wordpress Gallery Plugin ==
193
-
194
- We did the research. FooGallery has the best performance and has the most features out of any free WordPress gallery plugin. Read our blog post about it:
195
-
196
- [What is the Best WordPress Gallery Plugin?](https://fooplugins.com/best-wordpress-gallery-plugin/)
197
-
198
- == Installation ==
199
-
200
- 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
201
- 2. Activate the plugin through the 'Plugins' menu in WordPress
202
- 3. You will be redirected to the FooGallery Help page to get started with the best gallery plugin
203
-
204
- == Frequently Asked Questions ==
205
-
206
- = My galleries are not working. Thumbnails are greyed out and not loading when I scroll down the page. =
207
-
208
- Lazy loading is not working on your gallery. This could be due to a conflict between our plugin and your theme.
209
- You can test this theory by testing a different theme (if possible).
210
- We can help you get it working, by contacting our support.
211
-
212
- = I have created a gallery in the backend, but when I look at it on the frontend, it does not show correctly. =
213
-
214
- Sometimes, there are issues when the theme does not follow WordPress best practices.
215
- In order for FooGallery to function properly, the theme needs to have:
216
- * A call to wp_head(); in the header.php file.
217
- * A call to wp_footer(); in the footer.php file.
218
-
219
- One way to check if the theme is the problem, is by switching to one of the built-in WordPress themes, and then see if the gallery loads.
220
-
221
- = After updating, my galleries no longer work! What should I do? =
222
-
223
- Do you have any WordPress caching or optimization plugins? If so, then clear/purge your caches.
224
- Do you have any caching setup at your website host? If so, clear/purge those caches.
225
-
226
- = After installing the plugin, my site is broken! Help! =
227
-
228
- First thing to do is restore your site to it's previous working state.
229
- 1. Get access to your site via FTP, or SFTP.
230
- 2. Navigate to the wp-content/plugins folder.
231
- 3. Rename the foogallery folder to foogallery1 in order to deactivate the plugin.
232
- 4. At this point, your site should be working again.
233
- 5. Please contact our support and provide the following info:
234
- * What version of WordPress you are running.
235
- * What version of PHP you are using.
236
- * What version of FooGallery you installed.
237
- * What error was shown when your site was broken?
238
- * What plugins and theme are you using?
239
-
240
- = I purchased a PRO license, but the Free version is still running. =
241
-
242
- Make sure you are running the PRO version. You can check this by visiting the FooGallery -> Account page within the WordPress admin.
243
- If you do not have the PRO version, you can download it by visiting your account page at https://fooplugins.com/account
244
- If you have the PRO version, then clear any caches on your site or for your host. Also clear CSS Optimiztion Cache from FooGallery Settings.
245
- If it still does not work, then please contact our support to help further.
246
-
247
- = Why are my thumbnails so blurry? =
248
-
249
- Have you enabled retina support for your galleries? To enable retina support, edit the gallery and locate the Retina Support metabox.
250
-
251
- = Can I add videos to my galleries? =
252
-
253
- Yes, video is supported in [FooGallery PRO Expert](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-expert-features)!
254
-
255
- = Can I sell photographs from a gallery? =
256
-
257
- Yes, that is why we built [FooGallery PRO Commerce](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-commerce-features)!
258
- You can choose to create a gallery based of your products, or you can link all images in a gallery to a master product. This allows you complete control over how you want to run your image store and how they are sold on your website.
259
-
260
- = Do I need to install a separate plugin to show a lightbox? =
261
-
262
- For the Free version of FooGallery - Yes, you will need to install FooBox Image Lightbox.
263
- For the PRO version of FooGallery - No, we have built in a uniquely beautiful lightbox!
264
-
265
- = How do I get albums working? =
266
-
267
- Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
268
-
269
- = Can I add a watermark to my images? =
270
-
271
- Yes, our PRO Commerce plan includes image watermarking.
272
-
273
- = Can I add external links to items in the gallery? =
274
-
275
- Yes, you can link to any external website by choosing "Custom URL" for the Thumbnail Link setting. You also then need to set a custom URL for the items in your gallery, which is done by editing the attachment.
276
-
277
- = How do I turn off all the PRO Promotions in the admin? =
278
-
279
- Goto FooGallery Settings -> Advanced Tab and check "Disable PRO Promotions" and then save your settings.
280
-
281
- = How can you claim that FooGallery is the best WordPress gallery plugin? =
282
-
283
- We did the research and comparison. See our findings : [What is the Best WordPress Gallery Plugin?](https://fooplugins.com/best-wordpress-gallery-plugin/)
284
-
285
- == Screenshots ==
286
-
287
- 1. Gallery Edit Page
288
- 2. Visual Shortcodes
289
- 3. Gallery Picker
290
- 4. Frontend example with default template
291
- 5. Album Edit Page
292
-
293
- == Upgrade Notice ==
294
-
295
- Please update in order to for FooGallery to work in WP 5.5+!
296
-
297
- == Changelog ==
298
-
299
- = 2.1.33 =
300
- * Date Updated : 2022-01-15
301
- * Update : FooGallery client side 2.0.24
302
- * Fix : Ensure gallery layout is triggered in certain scenarios.
303
- * Fix : Updated the hover effects and presets to trigger on focus for better accessibility.
304
- * Fix : il8n bug where il8n script was not being included in page in some scenarios.
305
- * Fix : Removed Gutenberg editor warnings when using the FooGallery block.
306
-
307
-
308
- = 2.1.28 =
309
- * Date Updated : 2021-10-27
310
- * Fix : Fixed issue when no attachments being saved when updating gallery, in some scenarios.
311
- * Update : Updated features on help page. Updated links to correct URL's.
312
-
313
-
314
- = 2.1.24 =
315
- * Date Updated : 2021-10-16
316
-
317
-
318
- = 2.1.18 =
319
- * Date Updated : 2021-09-01
320
- * Update : FooGallery client side 2.0.20
321
- * Update : Updated FooGallery Help page in admin to match new branding
322
- * Update : Updated internal promotions to match plans
323
- * Fix : fixed bug in WP 5.8 when not all attachments showing in media modal
324
- * Fix : Added custom CSS for 3 gallery templates, to avoid incorrect thumb widths with certain themes and SVG thumbnails.
325
- * Fix : Added logic to generate unique ID's for the gallery container if the gallery is included more than once on a page.
326
- * New : Added custom pagination theme
327
-
328
-
329
- = 2.0.39 =
330
- * Date Updated : 2021-06-12
331
- * Fix : Changed how attachment full size image details are determined, when there are issues in certain setups
332
- * Fix : jQuery backwards compatibility
333
- * Fix : Fixed issues with thumb widths for certain theme css
334
- * Fix : Updated lazyload placeholder SVG to include width and height attributes
335
- * Fix : Updated help page demo's to use correct placeholders
336
- * Update : FooGallery client side 2.0.16
337
-
338
-
339
- = 2.0.35 =
340
- * Date Updated : 2021-05-20
341
- * New : Added lazyload compatibility for Imagify (replace img tags with picture tags)
342
- * Fix : updated how gallery usage is determined
343
- * Fix : sanitised gallery custom CSS and global custom CSS & JS admin settings
344
- * Fix : only show rating admin message after 5 galleries have been created (was showing always!)
345
- * Update : FooGallery client side 2.0.13
346
-
347
- = 2.0.30 =
348
- * Date Updated : 2021-05-03
349
- * New : Added lazyload compatibility for Jetpack, Jetpack Boost, WPMU Smush, EWWW Image Optimizer, W3 Total Cache, WP Optimize
350
- * New : Added "Enable Gallery Descriptions" setting for Albums
351
- * New : Galleries used in albums will now show a link to the album in the Usage column on the gallery listing page
352
- * New : output gallery debug info when debugging setting is enable
353
- * Update : FooGallery client side 2.0.12
354
- * Update : Updated the thumbnail generation test image to use a local image within the plugin
355
- * Update : Added "Last Row" gallery setting back for Justified Galleries
356
- * Fix : Fixed bug with custom URL's not working for Single Thumbnail galleries
357
-
358
-
359
- = 2.0.24 =
360
- * Date Updated : 2021-18-04
361
- * Update : FooGallery client side 2.0.11
362
- * Fix : Fixed compatibility with WPRocket and rendering inline script of gallery items json
363
-
364
-
365
- = 2.0.20 =
366
- * Date Updated : 2021-11-04
367
- * New : Major performance improvements for all gallery templates (improving scores for Core Web Vitals)
368
- * New : Added "Mobile Columns" gallery setting for Responsive Galleries
369
- * New : Added 6 Columns option for Masonry gallery layout
370
- * New : Added "Horizontal Layout" gallery setting for Masonry galleries, to try maintain left-to-right order of images
371
- * New : Made all image loaded effects in PRO now available in free!!
372
- * New : Added first-class support for ShortPixel Adaptive Images as a thumbnail engine. (can be changed from settings)
373
- * New : Added "Alignment" gallery setting under "Captions" tab for changing horizontal alignment of thumbnail captions
374
- * New : Added "Image Title Attribute" gallery setting under "Advanced" tab for disabling the title attribute added to thumbnail img tags
375
- * New : Added gallery settings to change the lightbox captions when FooBox is the selected lightbox
376
- * New : Added ability to refresh gallery preview when editing by clicking preview button again
377
- * New : Added lazyload support to stack album, giving a major performance boost to very large albums!
378
- * New : Overhauled Help page when plugin is activated, including the ability create demo gallery content and view inline demos
379
- * New : Added ability to override captions for FooBox
380
- * Update : FooGallery client side 2.0.9
381
- * Update : Simplified extensions admin page and removed all build-your-own logic
382
- * Update : Updated the Justified gallery template. Removed "Max Row Height" and "Last Row" settings.
383
- * Update : Updated the Thumbnail gallery template. Removed "Thumbnail Crop" setting.
384
- * Fix : Updated styling for FooGallery Block to look correct in latest version of Gutenberg
385
- * Fix : JSON objects get built using all attributes needed
386
- * Fix : Could not add images to the gallery for some installs, due to no thumbnail sizes being returned. Made the logic more resilient.
387
- * Fix : Compatible with WP Rocket Lazy loading
388
- * Fix : Javascript error with Masonry related to script dependencies when using script minifiers
389
-
390
-
391
- = 1.10.4 =
392
- * Date Updated : 2021-02-03
393
- * Fix : fix for fatal error running pre WP5 : Fatal error: Uncaught ArgumentCountError: Too few arguments to function FooGallery_Thumb_Engine_Default::delete_cache_folder_for_attachment()
394
-
395
- = 1.10.3 =
396
- * Date Updated : 2021-20-02
397
- * Fix : fixed a fatal PHP error on some installs
398
-
399
- = 1.10.1 =
400
- * Date Updated : 2021-18-02
401
- * Fix : fixed a fatal PHP error with PHP 5.6
402
-
403
- = 1.10.0 =
404
- * Date Updated : 2021-18-02
405
- * Update : Removed WPThumb library completely
406
- * Update : Updated to Freemius SDK 2.4.2
407
- * Fix : updated FooGallery block category to 'media'
408
-
409
-
410
- = 1.9.53 =
411
- * Date Updated : 2021-23-01
412
- * Update : FooGallery client side 1.4.26
413
-
414
- = 1.9.52 =
415
- * Date Updated : 2021-22-01
416
-
417
-
418
- = 1.9.50 =
419
- * Date Updated : 2021-21-01
420
-
421
- * Fix : fixed incorrect settings showing for certain gallery templates
422
-
423
- = 1.9.49 =
424
- * Date Updated : 2021-13-01
425
- * Fix : Advanced settings for a gallery to properly override settings rather than merge
426
-
427
-
428
- = 1.9.48 =
429
- * Date Updated : 2021-11-01
430
- * New : Added global Custom JS & CSS settings which are included for all galleries
431
- * New : Added global language settings which apply to all galleries
432
- * Update : Updated All-in-one SEO support to work with AIOSEO v4
433
- * Update : FooGallery client side 1.4.25
434
- * Update : updated WPML compatibility to account for new language settings
435
- * Fix : image URL's with spaces - always ensure image URL's are escaped
436
- * Fix : fixed PHP warning on activation
437
- * Test : tested PHP8 support!
438
-
439
-
440
- = 1.9.47 =
441
- * Date Updated : 2020-16-10
442
-
443
-
444
- = 1.9.46 =
445
- * Date Updated : 2020-15-10
446
-
447
-
448
- = 1.9.45 =
449
- * Date Updated : 2020-15-10
450
- * Fix : Updated albums to use FooGallery stylesheet enqueue function
451
-
452
-
453
- = 1.9.44 =
454
- * Date Updated : 2020-12-06
455
- * New : Allow thumb width and height to be overridden with shortcode arguments override_width and override_height
456
- * Fix : fixed caption bugs where FooBox was not picking up custom/override captions
457
- * Fix : removed use of deprecated functions in jQuery for WP 5.6
458
- * Fix : removed localStorage checks, so that browser does not say that cookies are in use
459
- * Update : FooGallery client side 1.4.24
460
- * Update : Frontend gallery initialization now uses custom ready event by default, to avoid jQuery errors
461
-
462
-
463
- = 1.9.40 =
464
- * Date Updated : 2020-11-29
465
- * Fix : rewrite of All-in-one Stack album fixing many bugs
466
- * Fix : fixed some styling issues with album edit page and gallery select modal
467
- * New : Added setting 'Force Hide Trial Notice' to never show the trail upsell message again
468
- * Update : FooGallery client side 1.4.22
469
-
470
- = 1.9.39 =
471
- * Date Updated : 2020-11-24
472
- * Fix : Allow gallery thumb order to be overridden when using foogallery_attachment_get_posts_args filter
473
-
474
- = 1.9.38 =
475
- * Date Updated : 2020-11-02
476
- * Fix : Fixed PHP warning within thumbnail generation code when deleting attachments
477
- * New : Added function to render an album : foogallery_render_album
478
-
479
- = 1.9.37 =
480
- * Date Updated : 2020-10-29
481
- * Update : Ensure Gallery Items and Settings metaboxes are always visible when editing a gallery
482
-
483
- = 1.9.36 =
484
- * Date Updated : 2020-10-27
485
- * Update : Freemius SDK 2.4.1
486
-
487
- = 1.9.35 =
488
- * Date Updated : 2020-10-12
489
- * Fix : Fix for thumbnail generation not working when upload folder is not HTTPS
490
-
491
-
492
- = 1.9.34 =
493
- * Date Updated : 2020-08-30
494
- * Fix : Fix for incorrect captions in some scenarios
495
- * Fix : Compatibility with Owl Carousel Extension and others
496
- * Update : FooGallery client side 1.4.18
497
-
498
- = 1.9.31 =
499
- * Date Updated : 2020-08-07
500
- * Fix : IMPORTANT fix for WP 5.5 compatibility when editing galleries (gallery preview button was not showing)
501
-
502
-
503
- = 1.9.30 =
504
- * Date Updated : 2020-08-03
505
- * Fix : IMPORTANT fix for WP 5.5 compatibility when editing galleries (gallery template selector was not showing)
506
- * New : Support for All in One SEO Pack sitemaps
507
- * Update : improved lightbox messages when no lightboxes are installed
508
- * Update : Freemius SDK 2.4.0.1
509
-
510
-
511
- = 1.9.28 =
512
- * Date Updated : 2020-07-18
513
- * Fix : Fix for some installs showing thumbnail generation error
514
- * Update : better mobile support for admin settings tabs
515
- * Update : FooGallery client side 1.4.16
516
-
517
-
518
- = 1.9.26 =
519
- * Date Updated : 2020-06-29
520
- * Fix : Fix for All-In-One album hidden items still clickable
521
- * Fix : Fix for fatal error on some versions of PHP
522
- * Update : FooGallery client side 1.4.15
523
-
524
-
525
- = 1.9.25 =
526
- * Date Updated : 2020-06-04
527
- * Fix : Fixed bug to prevent infinite loop with ResizeObserver in some themes
528
- * Fix : Fixed possible text-domain issue
529
- * Update : FooGallery client side 1.4.13
530
-
531
-
532
- = 1.9.24 =
533
- * Date Updated : 2020-05-04
534
- * Fix : Fixed bug where thumbs were not loading on mobile in Justified and Portfolio galleries
535
- * Update : FooGallery client side 1.4.12
536
-
537
- = 1.9.23 =
538
- * Date Updated : 2020-05-02
539
- * New : Reworked hover effect settings to allow none
540
- * New : Added new zoomed hover effect
541
- * New : Added new transparent theme hover effect
542
- * New : Added new advanced setting to add custom class to the gallery container
543
- * New : Added global settings for upscaling small images when using larger thumbnail dimensions
544
- * New : Added Pro feature promotions in gallery settings
545
- * New : Added setting to force GD Image editor as the default
546
- * New : Added info for active image editor to Settings -> Images tab
547
- * New : Improved caption sanitization
548
- * Fix : Fixed bug with Safari when editing a gallery, not loading thumbs
549
- * Fix : Fixed gallery previews in certain situations
550
- * Update : Freemius SDK 2.3.2
551
- * Update : FooGallery client side 1.4.11
552
-
553
-
554
- = 1.9.11 =
555
- * Date Updated : 2020-03-29
556
- * Fix : Fix for Simple Portfolio template not saving "None" for captions.
557
- * Fix : Fixed albums when adding incorrect markup target="default"
558
- * Fix : Updated thumbnail generation test logic to be more resilient, and improved admin message.
559
- * Fix : Updated RankMath compatibility to work with pre PHP 5.4
560
- * New : Added filter "foogallery_build_dynamic_gallery" for dynamic gallery creation
561
- * New : Added WPML config file for better translations. (Also improves Polylang compatibility.)
562
-
563
- * Update : FooGallery client side 1.4.6 (including multiple bug fixes)
564
-
565
- = 1.9.8 =
566
- * Date Updated : 2020-03-08
567
- * New : Added RankMath compatibility - sitemap image indexing.
568
- * New : Added new setting under Hover Effects : Invert Color. Invert the caption icon colors from dark to light.
569
- * New : All hover and loading icons converted to SVG format.
570
- * New : Lazy load gallery images when editing a gallery (improved performance for large galleries in the admin).
571
-
572
- * Fix : Previews not updating in some cases.
573
- * Update : FooGallery client side 1.4.0 (MAJOR UPDATE).
574
-
575
- = 1.8.20 =
576
- * Date Updated : 2019-11-22
577
- * Fix : Fix for Masonry template layout issue in Firefox
578
-
579
- * Update : FooGallery client side 1.3.6
580
-
581
- = 1.8.18 =
582
- * Date Updated : 2019-10-23
583
- * New : Elementor compatibility - gallery previews in Elementor editor work, and added a FooGallery widget to the Elementor editor
584
-
585
- * Fix : Images in Yoast SEO sitemaps pull correctly for all types of gallery embedding
586
- * Fix : Lazy-load issues on certain browsers (reverted back to old logic)
587
- * Fix : Updated WPThumb so that images with querystrings in the URL will work
588
- * Fix : Minor security issue fixed on the FooGallery settings page (only exploitable by administrators)
589
-
590
- = 1.8.14 =
591
-
592
- * New : Added setting to move "Add Media" button to front of attachment listing (Advanced tab in FooGallery Settings)
593
-
594
- * Fix : Lazy-load issues with Gutenberg Editor
595
- * Fix : Simple portfolio layout issue with certain themes
596
- * Update : FooGallery client side 1.3.4
597
-
598
- = 1.8.12 =
599
- * Fix : Previews not working on new galleries
600
-
601
- = 1.8.11 =
602
- * New : Added advanced gallery settings for custom settings and custom attributes
603
- * Fix : Rewrite of Simple Portfolio to incorrect thumb heights
604
- * Fix : Lazy-load issues for certain themes
605
- * Update : FooGallery client side 1.3.3
606
-
607
- = 1.8.8 =
608
- * New : Implemented the Datasource architecture within the plugin
609
- * Fix : PHP Warnings when previewing galleries
610
- * Fix : Simple Portfolio thumbnails cut off in certain scenarios
611
- * Fix : Updated Gutenberg block to work in latest Gutengerg release
612
- * Update : FooGallery client side 1.2.10
613
-
614
- = 1.7.8 =
615
- * New : Added filter to override content when creating a gallery page 'foogallery_create_gallery_page_content'
616
- * Fix : Fixed bug for Justified gallery, when last row was set to hidden
617
- * Update : FooGallery client side 1.2.8
618
- * Update : Freemius SDK 2.3.0
619
-
620
- = 1.7.7 =
621
- * New : Added slider navigation buttons in Slider PRO template
622
- * Fix : Fixed gallery usage with custom post types
623
- * Fix : Captions being cut off in portfolio template
624
- * Fix : Multiple small bugs and tweaks
625
- * Update : Updated to handle Chrome's new allow attribute in videos
626
- * Update : FooGallery client side 1.2.7
627
-
628
- = 1.7.6 =
629
- * Fix : Fixed issues with paging introduced in 1.7.4
630
- * Fix : Fixed conflicts with other lazy loading plugins
631
- * Update : FooGallery client side 1.2.3
632
-
633
- = 1.7.4 =
634
- * New : Major performance enhancements for all galleries
635
- * New : Performance enhancements with FooBox
636
- * New : Force HTTPS setting for migrated sites
637
- * New : FooGallery Gutenberg block gallery search
638
- * Fix : fixed scroll blocking violation warnings in dev tools
639
- * Fix : fixed Wistia video import issues
640
- * Update : FooGallery client side 1.2.2
641
-
642
- = 1.6.17 =
643
- * IMPORTANT : Please update to address a security vulnerability.
644
- * Fix : Security vulnerability
645
- * Fix : Images caching in certain browsers, not loading
646
- * Update : Freemius SDK 2.2.4
647
- * Update : FooGallery client side 1.1.13
648
-
649
- = 1.6.15 =
650
- * Fix : fixed logo path in admin
651
- * Update : changed the paging default output to HTML
652
-
653
- = 1.6.14 =
654
- * New : Added free trial tab to landing page
655
- * New : Added demo tab to landing page
656
- * New : Added support tab to landing page
657
- * New : Added help with FooBox lightbox in gallery templates
658
- * New : New setting to override thumb generation test URL
659
- * New : New setting to output gallery JSON to script block
660
- * New : Added rating admin notice after 5 galleries has been created
661
- * Fix : Fixed issues with video support in All-In-One stack album
662
- * Fix : Support for galleries loading in FooBox
663
- * Update : updated plugin generator
664
- * Update : FooGallery client side 1.1.10
665
- * Update : Freemius SDK 2.2.3
666
-
667
- = 1.6.13 =
668
- * New : Added setting to render JSON data to script block (fix for some caching plugins)
669
- * Fix : Compatibility with WPML Media
670
-
671
- = 1.6.11 =
672
- * Fix : Random thumbnails not loading in FireFox
673
- * Update : FooGallery client side 1.1.8
674
-
675
- = 1.6.10 =
676
- * Fix : Safari bug with lazy loading
677
- * Fix : Thumbs not loading with paging
678
- * Fix : duplicate caption title in some scenarios
679
- * Fix : clicking html in caption was not loading lightbox
680
- * Update : FooGallery client side 1.1.7
681
-
682
- = 1.6.7 =
683
- * New : added new filter for allowed post types that foogallery can be attached to
684
- * New : added loop setting for image viewer gallery template
685
- * New : override sorting in shortcode by providing "sort" attribute
686
- * Fix : Beaver Builder javascript error while editing a page
687
- * Fix : album shortcodes not working in some page builders
688
- * Fix : attach gallery to post when gutenberg block is included
689
- * Fix : filtering + paging bugs corrected in some scenarios
690
- * Fix : multiple small bugs and tweaks
691
- * Fix : Thumbnail generation tries to use first image in media library
692
- * Update : FooGallery client side 1.1.5
693
- * Update : Freemius SDK 2.2.2
694
-
695
- = 1.6.1 =
696
- * New : Gutenberg FooGallery block (including live gallery previews!)
697
- * Fix : foogallery shortcode not rendering in certain cases
698
- * Fix : disabling lazy loading via settings was being ignored
699
- * Update : Freemius SDK 2.1.3 (which fixes fatal Multisite bug)
700
-
701
- = 1.5.9 =
702
- * Fix : Theme customizer not loading for some theme/plugin combinations
703
-
704
- = 1.5.8 =
705
- * Major version bump to correspond with FooGallery PRO which includes video support
706
- * New : Upgrade offer to FooGallery PRO for FooVideo customers
707
- * New : Language setting for load more pagination
708
- * Update : FooGallery client side 1.1.2
709
- * Update : Freemius SDK 2.1.1
710
- * Fix : Pagination + Filtering bugs
711
- * Fix : PHP 7.1 compatibility tests failing for clone
712
- * Fix : better paging + filtering support
713
- * Fix : better RTL support in media modal
714
- * Multiple bug fixes and improvements
715
-
716
- = 1.4.31 =
717
-
718
- * New : GDPR notice in readme
719
- * New : Update to Freemius SDK 2.0.1
720
- * Fix : Default captions bug introduced in 1.4.30
721
-
722
- = 1.4.30 =
723
-
724
- * Fix : Album 404 issues when used on homepage
725
- * Fix : Dimension attributes missing for upscaling small images
726
- * Fix : Issue when galleries cannot be added to an album
727
- * Fix : Lightbox caption mismatch
728
- * New : Setting for legacy thumb cropping in Simple Portfolio gallery
729
- * Update : FooGallery client side 1.0.26
730
-
731
- = 1.4.29 =
732
-
733
- * New : Added an album setting to set the gallery title size (h2,h3,h4,h5,h6)
734
- * Fix : media modal issues with Elementor
735
- * Fix : media modal issues with Thrive Architect
736
- * Fix : caption override fix for single thumbnail galleries
737
- * Update : media modal improvements
738
-
739
- = 1.4.27 =
740
-
741
- * Fix : Justified gallery issues in certain browsers / devices
742
- * Fix : Portfolio gallery issues in certain browsers / devices
743
- * Fix : Use of correct rel attribute for better lightbox compatibility and W3 validation
744
- * Fix : Removed local translations that were incomplete and outdated
745
- * Update : FooGallery client side 1.0.24
746
- * Update : language files
747
-
748
- = 1.4.26 =
749
-
750
- * Fix : Filtering introduced an array initialization construct not working for older versions of php
751
-
752
- = 1.4.25 =
753
-
754
- * New : Retina support for albums!
755
- * New : Default crop position setting for attachments
756
- * New : Speed up gallery previews in wp-admin
757
- * New : Caption support for Responsive Lightbox by dFactory
758
- * Fix : Extension loading issues on certain installs
759
- * Fix : Shortcode copy-to-clipboard metabox works again
760
- * Fix : Bugs fixes for paging, filtering, FooBox and more
761
- * Fix : Ensure jquery-ui-sortable is loaded on edit page for some installs
762
- * Fix : All-In-One Stack Album layout bugs
763
- * Fix : Reworked extensions listing page logic
764
- * Update : FooGallery client side 1.0.23
765
- * Update : Freemius SDK 1.2.4
766
-
767
- = 1.4.15 =
768
-
769
- * Fix : All-In-One stack album fatal error when 2 albums on same page
770
-
771
- = 1.4.14 =
772
-
773
- * Fix : All-In-One stack album now uses the gallery featured image
774
- * Added more position options for Single Thumbnail Gallery
775
- * Added paging output setting
776
- * Update to latest client side JS 1.0.20
777
-
778
- = 1.4.12 =
779
-
780
- * New : NextGen importer now includes shortcode replacement
781
- * New : Masonry gallery supports captions below thumbnails
782
- * New : Performance improvements for very large galleries (1000+ images)
783
- * Fix : Bugs fixes for paging, FooBox and more
784
- * Update to latest client side JS 1.0.18
785
-
786
- = 1.4.8 =
787
-
788
- * New : added custom ready event setting for overcoming 3rd party jQuery exceptions
789
- * New : added crop thumbnail option to 'Single Thumbnail' and 'Image Viewer' templates
790
- * Update to latest client side JS
791
-
792
- = 1.4.7 =
793
-
794
- * Fix : conflicts with WP Rocket CDN features
795
- * Fix : conflicts with themes or plugins deferring script loading
796
- * New : Auto-loading of default templates
797
- * Update to latest client side JS
798
-
799
- = 1.4.6 =
800
-
801
- * Fix : conflicts with other scripts or plugins using data-src attributes
802
- * Fix : script moved back to use jQuery ready event, to avoid some conflicts
803
- * New : Global setting to disable lazy loading for all galleries
804
- * New : FooGallery Widget!
805
- * New : Admin notice for Autoptomize users to delete cache on updates
806
- * Update to latest client side JS
807
-
808
- = 1.4.5 =
809
-
810
- * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
811
- * Fix : Galleries that were hidden on page load were not displaying correctly when shown
812
- * Fix : Default gallery settings were not being applied to new galleries
813
- * New : shortcode arguments applied to gallery for common fields
814
- * New : HTML caching is disabled by default now!
815
- * Updated to latest client side JS and CSS
816
-
817
- = 1.4.4 =
818
-
819
- * Fix : upgrade was calling underfined function
820
-
821
- = 1.4.3 =
822
-
823
- * Fix : Justify gallery template issues
824
- * Fix : Masonry gallery template issues
825
- * Fix : Caption description not hidden when supposed to
826
- * Fix : Complete rework of thumbnail dimension logic!
827
- * Fix : Redirection bug on activation
828
- * Fix : Added checks for galleries causing PHP warnings
829
- * Fix : Multisite warnings on activation
830
- * New : Last Row setting in Justify gallery template
831
- * New : Alignment setting in Simple Portfolio gallery template
832
- * New : Added more checks after load to ensure gallery layout is correct
833
- * New : Added lazy loading advanced setting
834
- * Updated to Freemius SDK 1.2.2.10
835
- * Updated to latest client side JS and CSS
836
-
837
- = 1.3.28 =
838
-
839
- * Complete rewrite of the built-in gallery templates
840
- * New : lazy loading
841
- * New : simple pagination
842
- * New : Live Previews when editing a gallery
843
- * 260+ updates, changes and bug fixes
844
-
845
- = 1.3.8 =
846
-
847
- * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
848
- * Fix : More reliable extension active status on extensions listing
849
- * Fix : More obvious wording for 3rd party plugins when they are not installed
850
-
851
- = 1.3.7 =
852
-
853
- * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
854
-
855
- = 1.3.6 =
856
-
857
- * New : Freemius integration!
858
- * New : Added support for the Responsive Lightbox by dFactory
859
- * New : New custom class field for an attachment
860
- * New : Added more system info for better debugging when there are server issues
861
- * Fix : Visual editor FooGallery edit button
862
- * Fix : Image Viewer hover effect none now works as expected
863
- * Fix : Disable HTML caching for randomly ordered galleries
864
-
865
- = 1.2.20 =
866
-
867
- * New : Force Use Original thumb setting on gallery edit page
868
- * Fix : PHP warning from thumbnail class since 1.2.19
869
-
870
- = 1.2.19 =
871
-
872
- * New : Gallery output caching! Saves database requests improving load time
873
- * New : Gallery usage column in admin gallery listing
874
- * New : Better support for animated gifs
875
- * New : Hover icons retina support
876
- * New : Uninstall button on settings
877
- * New : Save thumb dimensions per attachment. (needed in future versions)
878
- * Fix : Extensions refactor and many issues resolved
879
- * Fix : Better retina support for all templates
880
- * Fix : Colorize / Greyscale CSS filters
881
- * Fix : Even better wpthumb compatibility
882
-
883
- = 1.2.18 =
884
-
885
- * Fix : Handle no settings in retina metabox
886
-
887
- = 1.2.17 =
888
-
889
- * New : Retina support - metabox per gallery and default settings
890
- * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
891
- * New : Caption color settings in Simple portfolio gallery template
892
- * New : Updated to latest Justified Gallery
893
- * Fix : Better wpthumb compatibility
894
-
895
- = 1.2.16 =
896
-
897
- * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
898
- * Fix : Updating pages with deleted galleries throws php warnings
899
-
900
- = 1.2.15 =
901
-
902
- * Fix : Album admin CSS issues in WP 4.6
903
- * Fix : Masonry layout issues in WP 4.6
904
- * Fix : Media attachment fields not updating
905
- * Fix : Better support for IE10
906
- * New : Thumbnail generation test admin notice and settings
907
-
908
- = 1.2.13 =
909
-
910
- * Fix : Shortcode replacing content in visual editor
911
- * Fix : Gallery hover effect of None being ignored
912
- * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
913
- * New : Setting to use original thumbnails if available
914
-
915
- = 1.2.12 =
916
-
917
- * Fix : Simple Portfolio missing captions fix
918
-
919
- = 1.2.11 =
920
-
921
- * Fix : Simple Portfolio undefined function fix
922
-
923
- = 1.2.10 =
924
-
925
- * New : support for multiple admin JS and CSS assets for gallery templates
926
- * New : Added setting to choose Caption Description source
927
- * New : Crop position can be chosen for attachments
928
- * New : Albums gallery details modal for setting a gallery URL
929
- * New : Better shortcode preview in editor
930
- * New : Editor button now supported if multiple editors exist
931
- * Fix : Better No-Link support for gallery templates
932
- * Fix : Compatible with Unyson plugin
933
- * Fix : Compatible with Advanced Custom Fields
934
- * Fix : Simple Portfolio fixes and tweaks
935
- * Fix : ImageViewer fixes and better browser compatibility
936
- * Fix : Changed assets enqueue version to rather use extension version
937
- * Fix : Album URL fix for permalinks with no trailing slashes
938
-
939
- = 1.2.9 =
940
- * New : Added Image Viewer gallery template
941
- * New : Caption support for default template
942
- * New : Yoast SEO gallery image support!
943
- * New : Responsive options for Masonry gallery
944
- * New : change gallery URL slug for albums
945
- * New : setting to turn off loading animation in default gallery
946
- * New : French translation
947
- * Fix : Support for WP 4.4
948
- * Fix : All templates - moved all jQuery ready events to vanilla JS
949
- * Fix : Many gallery template tweaks
950
- * Fix : allow no default to be chosen in settings
951
-
952
- = 1.2.8 =
953
- * Works now with Polylang translation plugin
954
- * CSS Updates & enhancements to all gallery templates
955
- * Password protected galleries now work as expected
956
- * Ability to hide WYSIWYG editor button
957
- * Updated WPThumb
958
- * Multiple bug fixes and improvements
959
-
960
- = 1.2.7 =
961
- * Bug fixes for 1.2.6 release
962
- * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
963
-
964
- = 1.2.6 =
965
- * CSS load optimizations
966
- * Updates and tweaks on all built-in gallery templates
967
- * More robust extension loading
968
- * More robust upgrades to FooBox PRO
969
- * Improved copy-to-clipboard
970
- * Added more hover effects
971
- * Support for FooVideo
972
-
973
- = 1.2.5 =
974
- * Fix for extensions being empty
975
- * Added support for Multi-site
976
- * Added esc_url to all places where url is rendered
977
- * Updated to latest Justified Gallery v3.5.4
978
-
979
- = 1.2.4 =
980
- * Many album template updates, enhancements and fixes
981
- * Many gallery template tweaks and fixes
982
- * Sort order settings for galleries and albums
983
- * Added new Single Thumbnail Gallery template
984
-
985
- = 1.2.1 =
986
- * Added setting to choose default gallery to copy settings from
987
- * Fixed bug #45 - gallery fields not showing onload
988
- * replaced minicolors with spectrum colorpicker
989
- * Allow gallery fields to have a suffix
990
- * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
991
-
992
- = 1.2.0 =
993
- * Added albums extension
994
- * Added custom CSS metaboxes
995
- * Updated Nextgen importer
996
- * Fixed many bugs
997
-
998
- = 1.1.8.2 =
999
- * Fixed "edit gallery" CSS with WP 4.0
1000
-
1001
- = 1.1.8.1 =
1002
- * Fixed "insert gallery" CSS with WP 4.0
1003
-
1004
- = 1.1.8 =
1005
- * Added 2 new gallery templates
1006
- * Added 10+ actions and filters for more customization
1007
- * Countless bug fixes and enhancements
1008
-
1009
- = 1.1.7 =
 
 
 
 
 
 
1010
  * first version!
1
+ === Best WordPress Gallery Plugin - FooGallery ===
2
+ Contributors: bradvin, steveush, fooplugins
3
+ Donate link: https://fooplugins.com
4
+ Tags: gallery, image gallery, photo gallery, responsive gallery, wordpress gallery plugin, best gallery plugin, albums, media gallery, video gallery, lightbox
5
+ Requires at least: 4.6
6
+ Tested up to: 5.9
7
+ Stable tag: 2.1.34
8
+ License: GPLv2 or later
9
+ License URI: https://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ The best WordPress gallery plugin. Create stunning galleries in minutes, with advanced settings for complete customization and control.
12
+
13
+ == Description ==
14
+
15
+ = WordPress Gallery Plugin =
16
+
17
+ Make galleries in WordPress great again with FooGallery! Add a stunning gallery to your website in under 1 minute using our beautiful pre-built templates, or if you want more control, then take advantage of all our advanced settings to customsize your galleries to look exactly the way you want.
18
+
19
+ FooGallery is an easy-to-use image gallery plugin, with stunning pre-built gallery layouts and a focus on performance and SEO.
20
+ It is also responsive, retina-ready and supports lazy loading for lightning fast photo galleries.
21
+
22
+ Live previews are available while creating an image gallery, and also within the Gutenberg block editor with our FooGallery Block.
23
+
24
+ FooGallery was built to be highly configurable and extendable for developers or freelancers.
25
+
26
+ That is why we think FooGallery is the best WordPress gallery plugin. After using it, we hope you will agree.
27
+
28
+ [Visit the FooGallery Homepage](https://fooplugins.com/foogallery-wordpress-gallery-plugin/)
29
+
30
+ = Performance Updates for Google's Core Web Vitals =
31
+
32
+ A faster gallery now means a more favourable ranking in Google!
33
+ FooGallery has been specifically optimized to score better for Google's Core Web Vitals update in 2021.
34
+ We have focused on the speed of our javascript code, and also improved the visual stability of all gallery layouts.
35
+ This has led to dramatically better scores for the 3 key lighthouse factors including:
36
+
37
+ * Largest Contentful Paint - galleries load and appear quicker for your visitors
38
+ * First Input Delay - you can interact with the gallery sooner
39
+ * Cumulative Layout Shift - gallery images shift around a lot less than before!
40
+
41
+ = WordPress Gallery Plugin Features =
42
+
43
+ The following free features make FooGallery the **best gallery plugin** on the market!
44
+
45
+ * 6 Beautiful Image Gallery templates
46
+ * Responsive Image Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/responsive-image-gallery/)
47
+ * Image Viewer Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/image-viewer-gallery/)
48
+ * Masonry Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/masonry-gallery/)
49
+ * Simple Portfolio - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-portfolio-gallery/)
50
+ * Justified Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/justified-gallery/)
51
+ * Single Thumbnail Gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/single-thumbnail-gallery/)
52
+ * Easy to customize!
53
+ * Adjust thumbnail size, spacing & alignment
54
+ * Adjust border size, rounded corners, drop shadows, inner shadows
55
+ * Choose from a selection of loading icons
56
+ * Animated loaded effects - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/animated-loaded-effects/)
57
+ * Awesome hover effects - adjust colors, scaling and icons
58
+ * Complete control over captions
59
+ * Focus on Performance
60
+ * Lazy Loading options
61
+ * Simple pagination [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/gallery-pagination/)
62
+ * Optimized code
63
+ * Reduced content layout shift
64
+ * Focus on SEO
65
+ * ALT and title attributes on all images
66
+ * Yoast SEO sitemap integration
67
+ * Rank Math SEO sitemap integration
68
+ * AIOSEO sitemap integration
69
+ * Albums built-in! (just activate the albums extension)
70
+ * Responsive album layout - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-album-gallery/)
71
+ * All-in-one Stack album - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/wordpress-album-gallery/#all-in-one)
72
+ * Gutenberg ready (Gallery previews inside the new editor!)
73
+ * Live previews as you make changes!
74
+ * Retina thumbnail support
75
+ * Gallery Widget
76
+ * Use built-in media library to manage images
77
+ * Drag n Drop reordering of images and galleries
78
+ * Custom CSS for both galleries and albums
79
+ * Copy to clipboard shortcodes
80
+ * One-click gallery page creation
81
+ * NextGen importer tool (albums and galleries and shortcodes)
82
+ * Multisite Support
83
+
84
+ = PRO Gallery Features =
85
+
86
+ There are 3 PRO plans available, that will work with any budget:
87
+
88
+ [PRO Starter](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-starter-features) | [PRO Expert](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-expert-features) | [PRO Commerce](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-commerce-features)
89
+
90
+ **PRO Starter Features**
91
+
92
+ * 3 more beautiful PRO responsive gallery templates:
93
+ * Polaroid gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/polaroid-gallery/)
94
+ * Grid gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/grid-gallery/)
95
+ * Slider gallery template - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/slider-gallery/)
96
+ * PRO image and media lightbox built in! [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pro-lightbox/)
97
+ * 11 beautiful hover effect presets - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/hover-presets/)
98
+ * 12 CSS thumbnail filters (Instagram) - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filter-effects/)
99
+
100
+ **PRO Expert Features**
101
+
102
+ * Video Support - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/video-gallery/)
103
+ * Import video from Youtube, Vimeo and others
104
+ * Self-hosted videos
105
+ * Filtering
106
+ * Add filters using Media Tags or Categories - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filtering/)
107
+ * Multi-level filtering for galleries [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/filtering/#multi-level)
108
+ * Bulk media tags and category management for attachments
109
+ * Dynamic Galleries (load images from other sources):
110
+ * Load from a folder on the server
111
+ * Load from a collection from Adobe Lightroom (using WP/LR Sync)
112
+ * Load all attachments with Media Tags
113
+ * Load all attachments with Media Categories
114
+ * Load from a folder in Real Media Library
115
+ * Load featured images from a post/page/custom post type - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/post-query-gallery/)
116
+ * Advanced Pagination
117
+ * Numbered pagination - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#numbered)
118
+ * "Load More" pagination - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#load-more)
119
+ * Infinite scroll image gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/pagination/#infinite-scroll)
120
+ * Advanced Custom Captions - [demo](hhttps://fooplugins.com/foogallery-wordpress-gallery-plugin/custom-captions/)
121
+ * EXIF metadata gallery - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/exif-data/)
122
+ * Bulk Copy Gallery Settings - [more info](https://fooplugins.com/bulk-copy-foogallery-pro/)
123
+ * Deeplinking support for pages and filters
124
+
125
+ **PRO Commerce Features**
126
+
127
+ * Image Protection
128
+ * Photo watermarking - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/photo-watermark/)
129
+ * No right-click protection - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/photo-watermark/)
130
+ * Deep WooCommerce integration - [demo](https://fooplugins.com/foogallery-wordpress-gallery-plugin/woocommerce-integration/#product-gallery)
131
+ * Create a dynamic gallery from your WooCommerce products in seconds!
132
+ * Filter using WooCommerce product categories
133
+ * Show sales ribbons for products on sale
134
+ * Add-to-cart buttons on thumbnails
135
+ * Support for product variations
136
+ * Show product details (including variations) in Lightbox
137
+ * Sell your images online - [demo](https://footest.tastewp.com/)
138
+ * Link all your gallery items to a single master product
139
+ * Supports variations
140
+
141
+ [See More Demos](https://fooplugins.com/foogallery-wordpress-gallery-plugin/demos/)
142
+
143
+ **Test Drive**
144
+
145
+ Take FooGallery for a test drive! Spin up your very own WP instance with FooGallery pre-installed:
146
+
147
+ [Start FooGallery Test Drive!](https://tastewp.com/new/?pre-installed-plugin-slug=foogallery)
148
+
149
+ **Documentation**
150
+
151
+ * [FooGallery Documentation](https://fooplugins.com/documentation/foogallery/)
152
+
153
+ **Gutenberg**
154
+
155
+ FooGallery includes a really simple-to-use Gutenberg block to add your existing FooGallery image galleries in seconds. And it includes live previews of the image gallery too!
156
+
157
+ **GDPR**
158
+
159
+ When you install FooGallery for the first time, the plugin asks you (the website admin) to opt-in so that we can track your usage of the plugin and provide a better service (send you update emails for new version releases and security updates etc). *This is optional and not required in order to use the plugin.*
160
+
161
+ From your website point of view, FooGallery never collects or stores any visitor information at all, when someone visits your website.
162
+
163
+ **PHP 8 Compatible**
164
+
165
+ FooGallery has been tried and tested on servers running up to PHP 8
166
+
167
+ **Retina Support**
168
+
169
+ FooGallery is a responsive gallery with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails so that your image galleries look amazing on all devices.
170
+
171
+ **Video Gallery**
172
+
173
+ FooGallery PRO Expert allows you to create a video gallery in seconds! Import from YouTube, Vimeo, Facebook, TED and Dailymotion, or import a self-hosted video from any online source (eg. S3 bucket).
174
+ You can also easily create mixed galleries with both images and videos!
175
+
176
+ **WooCommerce**
177
+
178
+ Sell your photographs online with our full WooCommerce integration, available in PRO Commerce. You can either create a dyanmic gallery from your existing products, or you can sell images in a gallery by linking them to a single master product. With full support for variations. Highlight products for sale with ribbons. Add call-to-action buttons to your items, for example AJAX Add to Cart buttons.
179
+
180
+ **Albums Built In**
181
+
182
+ Albums are built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
183
+
184
+ **Built For Developers**
185
+
186
+ FooGallery was designed to be the most developer-friendly image gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
187
+
188
+ **Special Thanks**
189
+
190
+ Thanks to Fortinet FortiGuard Labs for the security testing conducted on the plugin. FooGallery is a safer plugin thanks to them.
191
+
192
+ == Best Wordpress Gallery Plugin ==
193
+
194
+ We did the research. FooGallery has the best performance and has the most features out of any free WordPress gallery plugin. Read our blog post about it:
195
+
196
+ [What is the Best WordPress Gallery Plugin?](https://fooplugins.com/best-wordpress-gallery-plugin/)
197
+
198
+ == Installation ==
199
+
200
+ 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
201
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
202
+ 3. You will be redirected to the FooGallery Help page to get started with the best gallery plugin
203
+
204
+ == Frequently Asked Questions ==
205
+
206
+ = My galleries are not working. Thumbnails are greyed out and not loading when I scroll down the page. =
207
+
208
+ Lazy loading is not working on your gallery. This could be due to a conflict between our plugin and your theme.
209
+ You can test this theory by testing a different theme (if possible).
210
+ We can help you get it working, by contacting our support.
211
+
212
+ = I have created a gallery in the backend, but when I look at it on the frontend, it does not show correctly. =
213
+
214
+ Sometimes, there are issues when the theme does not follow WordPress best practices.
215
+ In order for FooGallery to function properly, the theme needs to have:
216
+ * A call to wp_head(); in the header.php file.
217
+ * A call to wp_footer(); in the footer.php file.
218
+
219
+ One way to check if the theme is the problem, is by switching to one of the built-in WordPress themes, and then see if the gallery loads.
220
+
221
+ = After updating, my galleries no longer work! What should I do? =
222
+
223
+ Do you have any WordPress caching or optimization plugins? If so, then clear/purge your caches.
224
+ Do you have any caching setup at your website host? If so, clear/purge those caches.
225
+
226
+ = After installing the plugin, my site is broken! Help! =
227
+
228
+ First thing to do is restore your site to it's previous working state.
229
+ 1. Get access to your site via FTP, or SFTP.
230
+ 2. Navigate to the wp-content/plugins folder.
231
+ 3. Rename the foogallery folder to foogallery1 in order to deactivate the plugin.
232
+ 4. At this point, your site should be working again.
233
+ 5. Please contact our support and provide the following info:
234
+ * What version of WordPress you are running.
235
+ * What version of PHP you are using.
236
+ * What version of FooGallery you installed.
237
+ * What error was shown when your site was broken?
238
+ * What plugins and theme are you using?
239
+
240
+ = I purchased a PRO license, but the Free version is still running. =
241
+
242
+ Make sure you are running the PRO version. You can check this by visiting the FooGallery -> Account page within the WordPress admin.
243
+ If you do not have the PRO version, you can download it by visiting your account page at https://fooplugins.com/account
244
+ If you have the PRO version, then clear any caches on your site or for your host. Also clear CSS Optimiztion Cache from FooGallery Settings.
245
+ If it still does not work, then please contact our support to help further.
246
+
247
+ = Why are my thumbnails so blurry? =
248
+
249
+ Have you enabled retina support for your galleries? To enable retina support, edit the gallery and locate the Retina Support metabox.
250
+
251
+ = Can I add videos to my galleries? =
252
+
253
+ Yes, video is supported in [FooGallery PRO Expert](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-expert-features)!
254
+
255
+ = Can I sell photographs from a gallery? =
256
+
257
+ Yes, that is why we built [FooGallery PRO Commerce](https://fooplugins.com/foogallery-wordpress-gallery-plugin/#pro-commerce-features)!
258
+ You can choose to create a gallery based of your products, or you can link all images in a gallery to a master product. This allows you complete control over how you want to run your image store and how they are sold on your website.
259
+
260
+ = Do I need to install a separate plugin to show a lightbox? =
261
+
262
+ For the Free version of FooGallery - Yes, you will need to install FooBox Image Lightbox.
263
+ For the PRO version of FooGallery - No, we have built in a uniquely beautiful lightbox!
264
+
265
+ = How do I get albums working? =
266
+
267
+ Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
268
+
269
+ = Can I add a watermark to my images? =
270
+
271
+ Yes, our PRO Commerce plan includes image watermarking.
272
+
273
+ = Can I add external links to items in the gallery? =
274
+
275
+ Yes, you can link to any external website by choosing "Custom URL" for the Thumbnail Link setting. You also then need to set a custom URL for the items in your gallery, which is done by editing the attachment.
276
+
277
+ = How do I turn off all the PRO Promotions in the admin? =
278
+
279
+ Goto FooGallery Settings -> Advanced Tab and check "Disable PRO Promotions" and then save your settings.
280
+
281
+ = How can you claim that FooGallery is the best WordPress gallery plugin? =
282
+
283
+ We did the research and comparison. See our findings : [What is the Best WordPress Gallery Plugin?](https://fooplugins.com/best-wordpress-gallery-plugin/)
284
+
285
+ == Screenshots ==
286
+
287
+ 1. Gallery Edit Page
288
+ 2. Visual Shortcodes
289
+ 3. Gallery Picker
290
+ 4. Frontend example with default template
291
+ 5. Album Edit Page
292
+
293
+ == Upgrade Notice ==
294
+
295
+ Please update in order to for FooGallery to work in WP 5.5+!
296
+
297
+ == Changelog ==
298
+
299
+ = 2.1.34 =
300
+ * Date Updated : 2022-02-01
301
+ * Fix : Fixed bug where WebP images could not be uploaded when using the GD image editor
302
+ * Fix : Security Fix in wp-admin
303
+ * Update : Update to Freemius SDK
304
+
305
+ = 2.1.33 =
306
+ * Date Updated : 2022-01-15
307
+ * Update : FooGallery client side 2.0.24
308
+ * Fix : Ensure gallery layout is triggered in certain scenarios.
309
+ * Fix : Updated the hover effects and presets to trigger on focus for better accessibility.
310
+ * Fix : il8n bug where il8n script was not being included in page in some scenarios.
311
+ * Fix : Removed Gutenberg editor warnings when using the FooGallery block.
312
+
313
+
314
+ = 2.1.28 =
315
+ * Date Updated : 2021-10-27
316
+ * Fix : Fixed issue when no attachments being saved when updating gallery, in some scenarios.
317
+ * Update : Updated features on help page. Updated links to correct URL's.
318
+
319
+
320
+ = 2.1.24 =
321
+ * Date Updated : 2021-10-16
322
+
323
+
324
+ = 2.1.18 =
325
+ * Date Updated : 2021-09-01
326
+ * Update : FooGallery client side 2.0.20
327
+ * Update : Updated FooGallery Help page in admin to match new branding
328
+ * Update : Updated internal promotions to match plans
329
+ * Fix : fixed bug in WP 5.8 when not all attachments showing in media modal
330
+ * Fix : Added custom CSS for 3 gallery templates, to avoid incorrect thumb widths with certain themes and SVG thumbnails.
331
+ * Fix : Added logic to generate unique ID's for the gallery container if the gallery is included more than once on a page.
332
+ * New : Added custom pagination theme
333
+
334
+
335
+ = 2.0.39 =
336
+ * Date Updated : 2021-06-12
337
+ * Fix : Changed how attachment full size image details are determined, when there are issues in certain setups
338
+ * Fix : jQuery backwards compatibility
339
+ * Fix : Fixed issues with thumb widths for certain theme css
340
+ * Fix : Updated lazyload placeholder SVG to include width and height attributes
341
+ * Fix : Updated help page demo's to use correct placeholders
342
+ * Update : FooGallery client side 2.0.16
343
+
344
+
345
+ = 2.0.35 =
346
+ * Date Updated : 2021-05-20
347
+ * New : Added lazyload compatibility for Imagify (replace img tags with picture tags)
348
+ * Fix : updated how gallery usage is determined
349
+ * Fix : sanitised gallery custom CSS and global custom CSS & JS admin settings
350
+ * Fix : only show rating admin message after 5 galleries have been created (was showing always!)
351
+ * Update : FooGallery client side 2.0.13
352
+
353
+ = 2.0.30 =
354
+ * Date Updated : 2021-05-03
355
+ * New : Added lazyload compatibility for Jetpack, Jetpack Boost, WPMU Smush, EWWW Image Optimizer, W3 Total Cache, WP Optimize
356
+ * New : Added "Enable Gallery Descriptions" setting for Albums
357
+ * New : Galleries used in albums will now show a link to the album in the Usage column on the gallery listing page
358
+ * New : output gallery debug info when debugging setting is enable
359
+ * Update : FooGallery client side 2.0.12
360
+ * Update : Updated the thumbnail generation test image to use a local image within the plugin
361
+ * Update : Added "Last Row" gallery setting back for Justified Galleries
362
+ * Fix : Fixed bug with custom URL's not working for Single Thumbnail galleries
363
+
364
+
365
+ = 2.0.24 =
366
+ * Date Updated : 2021-18-04
367
+ * Update : FooGallery client side 2.0.11
368
+ * Fix : Fixed compatibility with WPRocket and rendering inline script of gallery items json
369
+
370
+
371
+ = 2.0.20 =
372
+ * Date Updated : 2021-11-04
373
+ * New : Major performance improvements for all gallery templates (improving scores for Core Web Vitals)
374
+ * New : Added "Mobile Columns" gallery setting for Responsive Galleries
375
+ * New : Added 6 Columns option for Masonry gallery layout
376
+ * New : Added "Horizontal Layout" gallery setting for Masonry galleries, to try maintain left-to-right order of images
377
+ * New : Made all image loaded effects in PRO now available in free!!
378
+ * New : Added first-class support for ShortPixel Adaptive Images as a thumbnail engine. (can be changed from settings)
379
+ * New : Added "Alignment" gallery setting under "Captions" tab for changing horizontal alignment of thumbnail captions
380
+ * New : Added "Image Title Attribute" gallery setting under "Advanced" tab for disabling the title attribute added to thumbnail img tags
381
+ * New : Added gallery settings to change the lightbox captions when FooBox is the selected lightbox
382
+ * New : Added ability to refresh gallery preview when editing by clicking preview button again
383
+ * New : Added lazyload support to stack album, giving a major performance boost to very large albums!
384
+ * New : Overhauled Help page when plugin is activated, including the ability create demo gallery content and view inline demos
385
+ * New : Added ability to override captions for FooBox
386
+ * Update : FooGallery client side 2.0.9
387
+ * Update : Simplified extensions admin page and removed all build-your-own logic
388
+ * Update : Updated the Justified gallery template. Removed "Max Row Height" and "Last Row" settings.
389
+ * Update : Updated the Thumbnail gallery template. Removed "Thumbnail Crop" setting.
390
+ * Fix : Updated styling for FooGallery Block to look correct in latest version of Gutenberg
391
+ * Fix : JSON objects get built using all attributes needed
392
+ * Fix : Could not add images to the gallery for some installs, due to no thumbnail sizes being returned. Made the logic more resilient.
393
+ * Fix : Compatible with WP Rocket Lazy loading
394
+ * Fix : Javascript error with Masonry related to script dependencies when using script minifiers
395
+
396
+
397
+ = 1.10.4 =
398
+ * Date Updated : 2021-02-03
399
+ * Fix : fix for fatal error running pre WP5 : Fatal error: Uncaught ArgumentCountError: Too few arguments to function FooGallery_Thumb_Engine_Default::delete_cache_folder_for_attachment()
400
+
401
+ = 1.10.3 =
402
+ * Date Updated : 2021-20-02
403
+ * Fix : fixed a fatal PHP error on some installs
404
+
405
+ = 1.10.1 =
406
+ * Date Updated : 2021-18-02
407
+ * Fix : fixed a fatal PHP error with PHP 5.6
408
+
409
+ = 1.10.0 =
410
+ * Date Updated : 2021-18-02
411
+ * Update : Removed WPThumb library completely
412
+ * Update : Updated to Freemius SDK 2.4.2
413
+ * Fix : updated FooGallery block category to 'media'
414
+
415
+
416
+ = 1.9.53 =
417
+ * Date Updated : 2021-23-01
418
+ * Update : FooGallery client side 1.4.26
419
+
420
+ = 1.9.52 =
421
+ * Date Updated : 2021-22-01
422
+
423
+
424
+ = 1.9.50 =
425
+ * Date Updated : 2021-21-01
426
+
427
+ * Fix : fixed incorrect settings showing for certain gallery templates
428
+
429
+ = 1.9.49 =
430
+ * Date Updated : 2021-13-01
431
+ * Fix : Advanced settings for a gallery to properly override settings rather than merge
432
+
433
+
434
+ = 1.9.48 =
435
+ * Date Updated : 2021-11-01
436
+ * New : Added global Custom JS & CSS settings which are included for all galleries
437
+ * New : Added global language settings which apply to all galleries
438
+ * Update : Updated All-in-one SEO support to work with AIOSEO v4
439
+ * Update : FooGallery client side 1.4.25
440
+ * Update : updated WPML compatibility to account for new language settings
441
+ * Fix : image URL's with spaces - always ensure image URL's are escaped
442
+ * Fix : fixed PHP warning on activation
443
+ * Test : tested PHP8 support!
444
+
445
+
446
+ = 1.9.47 =
447
+ * Date Updated : 2020-16-10
448
+
449
+
450
+ = 1.9.46 =
451
+ * Date Updated : 2020-15-10
452
+
453
+
454
+ = 1.9.45 =
455
+ * Date Updated : 2020-15-10
456
+ * Fix : Updated albums to use FooGallery stylesheet enqueue function
457
+
458
+
459
+ = 1.9.44 =
460
+ * Date Updated : 2020-12-06
461
+ * New : Allow thumb width and height to be overridden with shortcode arguments override_width and override_height
462
+ * Fix : fixed caption bugs where FooBox was not picking up custom/override captions
463
+ * Fix : removed use of deprecated functions in jQuery for WP 5.6
464
+ * Fix : removed localStorage checks, so that browser does not say that cookies are in use
465
+ * Update : FooGallery client side 1.4.24
466
+ * Update : Frontend gallery initialization now uses custom ready event by default, to avoid jQuery errors
467
+
468
+
469
+ = 1.9.40 =
470
+ * Date Updated : 2020-11-29
471
+ * Fix : rewrite of All-in-one Stack album fixing many bugs
472
+ * Fix : fixed some styling issues with album edit page and gallery select modal
473
+ * New : Added setting 'Force Hide Trial Notice' to never show the trail upsell message again
474
+ * Update : FooGallery client side 1.4.22
475
+
476
+ = 1.9.39 =
477
+ * Date Updated : 2020-11-24
478
+ * Fix : Allow gallery thumb order to be overridden when using foogallery_attachment_get_posts_args filter
479
+
480
+ = 1.9.38 =
481
+ * Date Updated : 2020-11-02
482
+ * Fix : Fixed PHP warning within thumbnail generation code when deleting attachments
483
+ * New : Added function to render an album : foogallery_render_album
484
+
485
+ = 1.9.37 =
486
+ * Date Updated : 2020-10-29
487
+ * Update : Ensure Gallery Items and Settings metaboxes are always visible when editing a gallery
488
+
489
+ = 1.9.36 =
490
+ * Date Updated : 2020-10-27
491
+ * Update : Freemius SDK 2.4.1
492
+
493
+ = 1.9.35 =
494
+ * Date Updated : 2020-10-12
495
+ * Fix : Fix for thumbnail generation not working when upload folder is not HTTPS
496
+
497
+
498
+ = 1.9.34 =
499
+ * Date Updated : 2020-08-30
500
+ * Fix : Fix for incorrect captions in some scenarios
501
+ * Fix : Compatibility with Owl Carousel Extension and others
502
+ * Update : FooGallery client side 1.4.18
503
+
504
+ = 1.9.31 =
505
+ * Date Updated : 2020-08-07
506
+ * Fix : IMPORTANT fix for WP 5.5 compatibility when editing galleries (gallery preview button was not showing)
507
+
508
+
509
+ = 1.9.30 =
510
+ * Date Updated : 2020-08-03
511
+ * Fix : IMPORTANT fix for WP 5.5 compatibility when editing galleries (gallery template selector was not showing)
512
+ * New : Support for All in One SEO Pack sitemaps
513
+ * Update : improved lightbox messages when no lightboxes are installed
514
+ * Update : Freemius SDK 2.4.0.1
515
+
516
+
517
+ = 1.9.28 =
518
+ * Date Updated : 2020-07-18
519
+ * Fix : Fix for some installs showing thumbnail generation error
520
+ * Update : better mobile support for admin settings tabs
521
+ * Update : FooGallery client side 1.4.16
522
+
523
+
524
+ = 1.9.26 =
525
+ * Date Updated : 2020-06-29
526
+ * Fix : Fix for All-In-One album hidden items still clickable
527
+ * Fix : Fix for fatal error on some versions of PHP
528
+ * Update : FooGallery client side 1.4.15
529
+
530
+
531
+ = 1.9.25 =
532
+ * Date Updated : 2020-06-04
533
+ * Fix : Fixed bug to prevent infinite loop with ResizeObserver in some themes
534
+ * Fix : Fixed possible text-domain issue
535
+ * Update : FooGallery client side 1.4.13
536
+
537
+
538
+ = 1.9.24 =
539
+ * Date Updated : 2020-05-04
540
+ * Fix : Fixed bug where thumbs were not loading on mobile in Justified and Portfolio galleries
541
+ * Update : FooGallery client side 1.4.12
542
+
543
+ = 1.9.23 =
544
+ * Date Updated : 2020-05-02
545
+ * New : Reworked hover effect settings to allow none
546
+ * New : Added new zoomed hover effect
547
+ * New : Added new transparent theme hover effect
548
+ * New : Added new advanced setting to add custom class to the gallery container
549
+ * New : Added global settings for upscaling small images when using larger thumbnail dimensions
550
+ * New : Added Pro feature promotions in gallery settings
551
+ * New : Added setting to force GD Image editor as the default
552
+ * New : Added info for active image editor to Settings -> Images tab
553
+ * New : Improved caption sanitization
554
+ * Fix : Fixed bug with Safari when editing a gallery, not loading thumbs
555
+ * Fix : Fixed gallery previews in certain situations
556
+ * Update : Freemius SDK 2.3.2
557
+ * Update : FooGallery client side 1.4.11
558
+
559
+
560
+ = 1.9.11 =
561
+ * Date Updated : 2020-03-29
562
+ * Fix : Fix for Simple Portfolio template not saving "None" for captions.
563
+ * Fix : Fixed albums when adding incorrect markup target="default"
564
+ * Fix : Updated thumbnail generation test logic to be more resilient, and improved admin message.
565
+ * Fix : Updated RankMath compatibility to work with pre PHP 5.4
566
+ * New : Added filter "foogallery_build_dynamic_gallery" for dynamic gallery creation
567
+ * New : Added WPML config file for better translations. (Also improves Polylang compatibility.)
568
+
569
+ * Update : FooGallery client side 1.4.6 (including multiple bug fixes)
570
+
571
+ = 1.9.8 =
572
+ * Date Updated : 2020-03-08
573
+ * New : Added RankMath compatibility - sitemap image indexing.
574
+ * New : Added new setting under Hover Effects : Invert Color. Invert the caption icon colors from dark to light.
575
+ * New : All hover and loading icons converted to SVG format.
576
+ * New : Lazy load gallery images when editing a gallery (improved performance for large galleries in the admin).
577
+
578
+ * Fix : Previews not updating in some cases.
579
+ * Update : FooGallery client side 1.4.0 (MAJOR UPDATE).
580
+
581
+ = 1.8.20 =
582
+ * Date Updated : 2019-11-22
583
+ * Fix : Fix for Masonry template layout issue in Firefox
584
+
585
+ * Update : FooGallery client side 1.3.6
586
+
587
+ = 1.8.18 =
588
+ * Date Updated : 2019-10-23
589
+ * New : Elementor compatibility - gallery previews in Elementor editor work, and added a FooGallery widget to the Elementor editor
590
+
591
+ * Fix : Images in Yoast SEO sitemaps pull correctly for all types of gallery embedding
592
+ * Fix : Lazy-load issues on certain browsers (reverted back to old logic)
593
+ * Fix : Updated WPThumb so that images with querystrings in the URL will work
594
+ * Fix : Minor security issue fixed on the FooGallery settings page (only exploitable by administrators)
595
+
596
+ = 1.8.14 =
597
+
598
+ * New : Added setting to move "Add Media" button to front of attachment listing (Advanced tab in FooGallery Settings)
599
+
600
+ * Fix : Lazy-load issues with Gutenberg Editor
601
+ * Fix : Simple portfolio layout issue with certain themes
602
+ * Update : FooGallery client side 1.3.4
603
+
604
+ = 1.8.12 =
605
+ * Fix : Previews not working on new galleries
606
+
607
+ = 1.8.11 =
608
+ * New : Added advanced gallery settings for custom settings and custom attributes
609
+ * Fix : Rewrite of Simple Portfolio to incorrect thumb heights
610
+ * Fix : Lazy-load issues for certain themes
611
+ * Update : FooGallery client side 1.3.3
612
+
613
+ = 1.8.8 =
614
+ * New : Implemented the Datasource architecture within the plugin
615
+ * Fix : PHP Warnings when previewing galleries
616
+ * Fix : Simple Portfolio thumbnails cut off in certain scenarios
617
+ * Fix : Updated Gutenberg block to work in latest Gutengerg release
618
+ * Update : FooGallery client side 1.2.10
619
+
620
+ = 1.7.8 =
621
+ * New : Added filter to override content when creating a gallery page 'foogallery_create_gallery_page_content'
622
+ * Fix : Fixed bug for Justified gallery, when last row was set to hidden
623
+ * Update : FooGallery client side 1.2.8
624
+ * Update : Freemius SDK 2.3.0
625
+
626
+ = 1.7.7 =
627
+ * New : Added slider navigation buttons in Slider PRO template
628
+ * Fix : Fixed gallery usage with custom post types
629
+ * Fix : Captions being cut off in portfolio template
630
+ * Fix : Multiple small bugs and tweaks
631
+ * Update : Updated to handle Chrome's new allow attribute in videos
632
+ * Update : FooGallery client side 1.2.7
633
+
634
+ = 1.7.6 =
635
+ * Fix : Fixed issues with paging introduced in 1.7.4
636
+ * Fix : Fixed conflicts with other lazy loading plugins
637
+ * Update : FooGallery client side 1.2.3
638
+
639
+ = 1.7.4 =
640
+ * New : Major performance enhancements for all galleries
641
+ * New : Performance enhancements with FooBox
642
+ * New : Force HTTPS setting for migrated sites
643
+ * New : FooGallery Gutenberg block gallery search
644
+ * Fix : fixed scroll blocking violation warnings in dev tools
645
+ * Fix : fixed Wistia video import issues
646
+ * Update : FooGallery client side 1.2.2
647
+
648
+ = 1.6.17 =
649
+ * IMPORTANT : Please update to address a security vulnerability.
650
+ * Fix : Security vulnerability
651
+ * Fix : Images caching in certain browsers, not loading
652
+ * Update : Freemius SDK 2.2.4
653
+ * Update : FooGallery client side 1.1.13
654
+
655
+ = 1.6.15 =
656
+ * Fix : fixed logo path in admin
657
+ * Update : changed the paging default output to HTML
658
+
659
+ = 1.6.14 =
660
+ * New : Added free trial tab to landing page
661
+ * New : Added demo tab to landing page
662
+ * New : Added support tab to landing page
663
+ * New : Added help with FooBox lightbox in gallery templates
664
+ * New : New setting to override thumb generation test URL
665
+ * New : New setting to output gallery JSON to script block
666
+ * New : Added rating admin notice after 5 galleries has been created
667
+ * Fix : Fixed issues with video support in All-In-One stack album
668
+ * Fix : Support for galleries loading in FooBox
669
+ * Update : updated plugin generator
670
+ * Update : FooGallery client side 1.1.10
671
+ * Update : Freemius SDK 2.2.3
672
+
673
+ = 1.6.13 =
674
+ * New : Added setting to render JSON data to script block (fix for some caching plugins)
675
+ * Fix : Compatibility with WPML Media
676
+
677
+ = 1.6.11 =
678
+ * Fix : Random thumbnails not loading in FireFox
679
+ * Update : FooGallery client side 1.1.8
680
+
681
+ = 1.6.10 =
682
+ * Fix : Safari bug with lazy loading
683
+ * Fix : Thumbs not loading with paging
684
+ * Fix : duplicate caption title in some scenarios
685
+ * Fix : clicking html in caption was not loading lightbox
686
+ * Update : FooGallery client side 1.1.7
687
+
688
+ = 1.6.7 =
689
+ * New : added new filter for allowed post types that foogallery can be attached to
690
+ * New : added loop setting for image viewer gallery template
691
+ * New : override sorting in shortcode by providing "sort" attribute
692
+ * Fix : Beaver Builder javascript error while editing a page
693
+ * Fix : album shortcodes not working in some page builders
694
+ * Fix : attach gallery to post when gutenberg block is included
695
+ * Fix : filtering + paging bugs corrected in some scenarios
696
+ * Fix : multiple small bugs and tweaks
697
+ * Fix : Thumbnail generation tries to use first image in media library
698
+ * Update : FooGallery client side 1.1.5
699
+ * Update : Freemius SDK 2.2.2
700
+
701
+ = 1.6.1 =
702
+ * New : Gutenberg FooGallery block (including live gallery previews!)
703
+ * Fix : foogallery shortcode not rendering in certain cases
704
+ * Fix : disabling lazy loading via settings was being ignored
705
+ * Update : Freemius SDK 2.1.3 (which fixes fatal Multisite bug)
706
+
707
+ = 1.5.9 =
708
+ * Fix : Theme customizer not loading for some theme/plugin combinations
709
+
710
+ = 1.5.8 =
711
+ * Major version bump to correspond with FooGallery PRO which includes video support
712
+ * New : Upgrade offer to FooGallery PRO for FooVideo customers
713
+ * New : Language setting for load more pagination
714
+ * Update : FooGallery client side 1.1.2
715
+ * Update : Freemius SDK 2.1.1
716
+ * Fix : Pagination + Filtering bugs
717
+ * Fix : PHP 7.1 compatibility tests failing for clone
718
+ * Fix : better paging + filtering support
719
+ * Fix : better RTL support in media modal
720
+ * Multiple bug fixes and improvements
721
+
722
+ = 1.4.31 =
723
+
724
+ * New : GDPR notice in readme
725
+ * New : Update to Freemius SDK 2.0.1
726
+ * Fix : Default captions bug introduced in 1.4.30
727
+
728
+ = 1.4.30 =
729
+
730
+ * Fix : Album 404 issues when used on homepage
731
+ * Fix : Dimension attributes missing for upscaling small images
732
+ * Fix : Issue when galleries cannot be added to an album
733
+ * Fix : Lightbox caption mismatch
734
+ * New : Setting for legacy thumb cropping in Simple Portfolio gallery
735
+ * Update : FooGallery client side 1.0.26
736
+
737
+ = 1.4.29 =
738
+
739
+ * New : Added an album setting to set the gallery title size (h2,h3,h4,h5,h6)
740
+ * Fix : media modal issues with Elementor
741
+ * Fix : media modal issues with Thrive Architect
742
+ * Fix : caption override fix for single thumbnail galleries
743
+ * Update : media modal improvements
744
+
745
+ = 1.4.27 =
746
+
747
+ * Fix : Justified gallery issues in certain browsers / devices
748
+ * Fix : Portfolio gallery issues in certain browsers / devices
749
+ * Fix : Use of correct rel attribute for better lightbox compatibility and W3 validation
750
+ * Fix : Removed local translations that were incomplete and outdated
751
+ * Update : FooGallery client side 1.0.24
752
+ * Update : language files
753
+
754
+ = 1.4.26 =
755
+
756
+ * Fix : Filtering introduced an array initialization construct not working for older versions of php
757
+
758
+ = 1.4.25 =
759
+
760
+ * New : Retina support for albums!
761
+ * New : Default crop position setting for attachments
762
+ * New : Speed up gallery previews in wp-admin
763
+ * New : Caption support for Responsive Lightbox by dFactory
764
+ * Fix : Extension loading issues on certain installs
765
+ * Fix : Shortcode copy-to-clipboard metabox works again
766
+ * Fix : Bugs fixes for paging, filtering, FooBox and more
767
+ * Fix : Ensure jquery-ui-sortable is loaded on edit page for some installs
768
+ * Fix : All-In-One Stack Album layout bugs
769
+ * Fix : Reworked extensions listing page logic
770
+ * Update : FooGallery client side 1.0.23
771
+ * Update : Freemius SDK 1.2.4
772
+
773
+ = 1.4.15 =
774
+
775
+ * Fix : All-In-One stack album fatal error when 2 albums on same page
776
+
777
+ = 1.4.14 =
778
+
779
+ * Fix : All-In-One stack album now uses the gallery featured image
780
+ * Added more position options for Single Thumbnail Gallery
781
+ * Added paging output setting
782
+ * Update to latest client side JS 1.0.20
783
+
784
+ = 1.4.12 =
785
+
786
+ * New : NextGen importer now includes shortcode replacement
787
+ * New : Masonry gallery supports captions below thumbnails
788
+ * New : Performance improvements for very large galleries (1000+ images)
789
+ * Fix : Bugs fixes for paging, FooBox and more
790
+ * Update to latest client side JS 1.0.18
791
+
792
+ = 1.4.8 =
793
+
794
+ * New : added custom ready event setting for overcoming 3rd party jQuery exceptions
795
+ * New : added crop thumbnail option to 'Single Thumbnail' and 'Image Viewer' templates
796
+ * Update to latest client side JS
797
+
798
+ = 1.4.7 =
799
+
800
+ * Fix : conflicts with WP Rocket CDN features
801
+ * Fix : conflicts with themes or plugins deferring script loading
802
+ * New : Auto-loading of default templates
803
+ * Update to latest client side JS
804
+
805
+ = 1.4.6 =
806
+
807
+ * Fix : conflicts with other scripts or plugins using data-src attributes
808
+ * Fix : script moved back to use jQuery ready event, to avoid some conflicts
809
+ * New : Global setting to disable lazy loading for all galleries
810
+ * New : FooGallery Widget!
811
+ * New : Admin notice for Autoptomize users to delete cache on updates
812
+ * Update to latest client side JS
813
+
814
+ = 1.4.5 =
815
+
816
+ * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
817
+ * Fix : Galleries that were hidden on page load were not displaying correctly when shown
818
+ * Fix : Default gallery settings were not being applied to new galleries
819
+ * New : shortcode arguments applied to gallery for common fields
820
+ * New : HTML caching is disabled by default now!
821
+ * Updated to latest client side JS and CSS
822
+
823
+ = 1.4.4 =
824
+
825
+ * Fix : upgrade was calling underfined function
826
+
827
+ = 1.4.3 =
828
+
829
+ * Fix : Justify gallery template issues
830
+ * Fix : Masonry gallery template issues
831
+ * Fix : Caption description not hidden when supposed to
832
+ * Fix : Complete rework of thumbnail dimension logic!
833
+ * Fix : Redirection bug on activation
834
+ * Fix : Added checks for galleries causing PHP warnings
835
+ * Fix : Multisite warnings on activation
836
+ * New : Last Row setting in Justify gallery template
837
+ * New : Alignment setting in Simple Portfolio gallery template
838
+ * New : Added more checks after load to ensure gallery layout is correct
839
+ * New : Added lazy loading advanced setting
840
+ * Updated to Freemius SDK 1.2.2.10
841
+ * Updated to latest client side JS and CSS
842
+
843
+ = 1.3.28 =
844
+
845
+ * Complete rewrite of the built-in gallery templates
846
+ * New : lazy loading
847
+ * New : simple pagination
848
+ * New : Live Previews when editing a gallery
849
+ * 260+ updates, changes and bug fixes
850
+
851
+ = 1.3.8 =
852
+
853
+ * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
854
+ * Fix : More reliable extension active status on extensions listing
855
+ * Fix : More obvious wording for 3rd party plugins when they are not installed
856
+
857
+ = 1.3.7 =
858
+
859
+ * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
860
+
861
+ = 1.3.6 =
862
+
863
+ * New : Freemius integration!
864
+ * New : Added support for the Responsive Lightbox by dFactory
865
+ * New : New custom class field for an attachment
866
+ * New : Added more system info for better debugging when there are server issues
867
+ * Fix : Visual editor FooGallery edit button
868
+ * Fix : Image Viewer hover effect none now works as expected
869
+ * Fix : Disable HTML caching for randomly ordered galleries
870
+
871
+ = 1.2.20 =
872
+
873
+ * New : Force Use Original thumb setting on gallery edit page
874
+ * Fix : PHP warning from thumbnail class since 1.2.19
875
+
876
+ = 1.2.19 =
877
+
878
+ * New : Gallery output caching! Saves database requests improving load time
879
+ * New : Gallery usage column in admin gallery listing
880
+ * New : Better support for animated gifs
881
+ * New : Hover icons retina support
882
+ * New : Uninstall button on settings
883
+ * New : Save thumb dimensions per attachment. (needed in future versions)
884
+ * Fix : Extensions refactor and many issues resolved
885
+ * Fix : Better retina support for all templates
886
+ * Fix : Colorize / Greyscale CSS filters
887
+ * Fix : Even better wpthumb compatibility
888
+
889
+ = 1.2.18 =
890
+
891
+ * Fix : Handle no settings in retina metabox
892
+
893
+ = 1.2.17 =
894
+
895
+ * New : Retina support - metabox per gallery and default settings
896
+ * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
897
+ * New : Caption color settings in Simple portfolio gallery template
898
+ * New : Updated to latest Justified Gallery
899
+ * Fix : Better wpthumb compatibility
900
+
901
+ = 1.2.16 =
902
+
903
+ * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
904
+ * Fix : Updating pages with deleted galleries throws php warnings
905
+
906
+ = 1.2.15 =
907
+
908
+ * Fix : Album admin CSS issues in WP 4.6
909
+ * Fix : Masonry layout issues in WP 4.6
910
+ * Fix : Media attachment fields not updating
911
+ * Fix : Better support for IE10
912
+ * New : Thumbnail generation test admin notice and settings
913
+
914
+ = 1.2.13 =
915
+
916
+ * Fix : Shortcode replacing content in visual editor
917
+ * Fix : Gallery hover effect of None being ignored
918
+ * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
919
+ * New : Setting to use original thumbnails if available
920
+
921
+ = 1.2.12 =
922
+
923
+ * Fix : Simple Portfolio missing captions fix
924
+
925
+ = 1.2.11 =
926
+
927
+ * Fix : Simple Portfolio undefined function fix
928
+
929
+ = 1.2.10 =
930
+
931
+ * New : support for multiple admin JS and CSS assets for gallery templates
932
+ * New : Added setting to choose Caption Description source
933
+ * New : Crop position can be chosen for attachments
934
+ * New : Albums gallery details modal for setting a gallery URL
935
+ * New : Better shortcode preview in editor
936
+ * New : Editor button now supported if multiple editors exist
937
+ * Fix : Better No-Link support for gallery templates
938
+ * Fix : Compatible with Unyson plugin
939
+ * Fix : Compatible with Advanced Custom Fields
940
+ * Fix : Simple Portfolio fixes and tweaks
941
+ * Fix : ImageViewer fixes and better browser compatibility
942
+ * Fix : Changed assets enqueue version to rather use extension version
943
+ * Fix : Album URL fix for permalinks with no trailing slashes
944
+
945
+ = 1.2.9 =
946
+ * New : Added Image Viewer gallery template
947
+ * New : Caption support for default template
948
+ * New : Yoast SEO gallery image support!
949
+ * New : Responsive options for Masonry gallery
950
+ * New : change gallery URL slug for albums
951
+ * New : setting to turn off loading animation in default gallery
952
+ * New : French translation
953
+ * Fix : Support for WP 4.4
954
+ * Fix : All templates - moved all jQuery ready events to vanilla JS
955
+ * Fix : Many gallery template tweaks
956
+ * Fix : allow no default to be chosen in settings
957
+
958
+ = 1.2.8 =
959
+ * Works now with Polylang translation plugin
960
+ * CSS Updates & enhancements to all gallery templates
961
+ * Password protected galleries now work as expected
962
+ * Ability to hide WYSIWYG editor button
963
+ * Updated WPThumb
964
+ * Multiple bug fixes and improvements
965
+
966
+ = 1.2.7 =
967
+ * Bug fixes for 1.2.6 release
968
+ * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
969
+
970
+ = 1.2.6 =
971
+ * CSS load optimizations
972
+ * Updates and tweaks on all built-in gallery templates
973
+ * More robust extension loading
974
+ * More robust upgrades to FooBox PRO
975
+ * Improved copy-to-clipboard
976
+ * Added more hover effects
977
+ * Support for FooVideo
978
+
979
+ = 1.2.5 =
980
+ * Fix for extensions being empty
981
+ * Added support for Multi-site
982
+ * Added esc_url to all places where url is rendered
983
+ * Updated to latest Justified Gallery v3.5.4
984
+
985
+ = 1.2.4 =
986
+ * Many album template updates, enhancements and fixes
987
+ * Many gallery template tweaks and fixes
988
+ * Sort order settings for galleries and albums
989
+ * Added new Single Thumbnail Gallery template
990
+
991
+ = 1.2.1 =
992
+ * Added setting to choose default gallery to copy settings from
993
+ * Fixed bug #45 - gallery fields not showing onload
994
+ * replaced minicolors with spectrum colorpicker
995
+ * Allow gallery fields to have a suffix
996
+ * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
997
+
998
+ = 1.2.0 =
999
+ * Added albums extension
1000
+ * Added custom CSS metaboxes
1001
+ * Updated Nextgen importer
1002
+ * Fixed many bugs
1003
+
1004
+ = 1.1.8.2 =
1005
+ * Fixed "edit gallery" CSS with WP 4.0
1006
+
1007
+ = 1.1.8.1 =
1008
+ * Fixed "insert gallery" CSS with WP 4.0
1009
+
1010
+ = 1.1.8 =
1011
+ * Added 2 new gallery templates
1012
+ * Added 10+ actions and filters for more customization
1013
+ * Countless bug fixes and enhancements
1014
+
1015
+ = 1.1.7 =
1016
  * first version!
changelog.txt CHANGED
@@ -1,4 +1,4 @@
1
- FooGallery Changelog
2
- ====================
3
-
4
  See changelog in readme.txt
1
+ FooGallery Changelog
2
+ ====================
3
+
4
  See changelog in readme.txt
css/admin-foogallery-gallery-piles.css CHANGED
@@ -1,93 +1,93 @@
1
- .foogallery-pile {
2
- position: relative;
3
- z-index: 10;
4
- float: left;
5
- margin: 10px 15px 15px 10px !important;
6
- }
7
-
8
- /* Image styles */
9
- .foogallery-pile .foogallery-gallery-select {
10
- width: 150px;
11
- height: 150px;
12
- position: relative;
13
- box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
14
- background: #eee;
15
- vertical-align: bottom;
16
- border: 8px solid #fff;
17
- overflow: hidden;
18
- cursor: pointer;
19
- }
20
-
21
- /* Stacks creted by the use of generated content */
22
- .foogallery-pile:before, .foogallery-pile:after {
23
- content: "";
24
- width: 100%;
25
- height: 100%;
26
- position: absolute;
27
- border: 8px solid #fff;
28
- left: 0;
29
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
30
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
31
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
32
- -webkit-box-sizing: border-box;
33
- -moz-box-sizing: border-box;
34
- box-sizing: border-box;
35
- }
36
- /* 1st element in stack (behind image) */
37
- .foogallery-pile:before {
38
- top: -3px; z-index: -10;
39
- -webkit-transform: rotate(2deg);
40
- -moz-transform: rotate(2deg);
41
- transform: rotate(2deg);
42
- }
43
- /* 2nd element in stack (behind image) */
44
- .foogallery-pile:after {
45
- top: -2px; z-index: -20;
46
- -webkit-transform: rotate(-2deg);
47
- -moz-transform: rotate(-2deg);
48
- transform: rotate(-2deg);
49
- }
50
-
51
- .foogallery-pile img {
52
- width: 150px;
53
- }
54
-
55
- .foogallery-pile h3 {
56
- background: #fff;
57
- position: absolute;
58
- display: block;
59
- bottom: 0px;
60
- padding: 5px;
61
- width: 100%;
62
- box-sizing: border-box;
63
- margin: 0;
64
- opacity: 0.8;
65
- }
66
-
67
- .foogallery-pile h3 span {
68
- display: block;
69
- font-size: 0.6em;
70
- }
71
-
72
- .foogallery-gallery-select.selected {
73
- border-color: #1E8CBE;
74
- }
75
-
76
- .foogallery-gallery-select.selected::before {
77
- content: "\f147" !important;
78
- display: inline-block !important;
79
- font: normal 60px/70px 'dashicons';
80
- position: absolute;
81
- color: #FFF;
82
- top: 40%;
83
- left: 50%;
84
- margin-left: -30px;
85
- margin-top: -30px;
86
- -webkit-font-smoothing: antialiased;
87
- background: #1E8CBE;
88
- border-radius: 50%;
89
- width: 60px;
90
- height: 60px;
91
- z-index: 4;
92
- padding-top:0 !important;
93
  }
1
+ .foogallery-pile {
2
+ position: relative;
3
+ z-index: 10;
4
+ float: left;
5
+ margin: 10px 15px 15px 10px !important;
6
+ }
7
+
8
+ /* Image styles */
9
+ .foogallery-pile .foogallery-gallery-select {
10
+ width: 150px;
11
+ height: 150px;
12
+ position: relative;
13
+ box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
14
+ background: #eee;
15
+ vertical-align: bottom;
16
+ border: 8px solid #fff;
17
+ overflow: hidden;
18
+ cursor: pointer;
19
+ }
20
+
21
+ /* Stacks creted by the use of generated content */
22
+ .foogallery-pile:before, .foogallery-pile:after {
23
+ content: "";
24
+ width: 100%;
25
+ height: 100%;
26
+ position: absolute;
27
+ border: 8px solid #fff;
28
+ left: 0;
29
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
30
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
31
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
32
+ -webkit-box-sizing: border-box;
33
+ -moz-box-sizing: border-box;
34
+ box-sizing: border-box;
35
+ }
36
+ /* 1st element in stack (behind image) */
37
+ .foogallery-pile:before {
38
+ top: -3px; z-index: -10;
39
+ -webkit-transform: rotate(2deg);
40
+ -moz-transform: rotate(2deg);
41
+ transform: rotate(2deg);
42
+ }
43
+ /* 2nd element in stack (behind image) */
44
+ .foogallery-pile:after {
45
+ top: -2px; z-index: -20;
46
+ -webkit-transform: rotate(-2deg);
47
+ -moz-transform: rotate(-2deg);
48
+ transform: rotate(-2deg);
49
+ }
50
+
51
+ .foogallery-pile img {
52
+ width: 150px;
53
+ }
54
+
55
+ .foogallery-pile h3 {
56
+ background: #fff;
57
+ position: absolute;
58
+ display: block;
59
+ bottom: 0px;
60
+ padding: 5px;
61
+ width: 100%;
62
+ box-sizing: border-box;
63
+ margin: 0;
64
+ opacity: 0.8;
65
+ }
66
+
67
+ .foogallery-pile h3 span {
68
+ display: block;
69
+ font-size: 0.6em;
70
+ }
71
+
72
+ .foogallery-gallery-select.selected {
73
+ border-color: #1E8CBE;
74
+ }
75
+
76
+ .foogallery-gallery-select.selected::before {
77
+ content: "\f147" !important;
78
+ display: inline-block !important;
79
+ font: normal 60px/70px 'dashicons';
80
+ position: absolute;
81
+ color: #FFF;
82
+ top: 40%;
83
+ left: 50%;
84
+ margin-left: -30px;
85
+ margin-top: -30px;
86
+ -webkit-font-smoothing: antialiased;
87
+ background: #1E8CBE;
88
+ border-radius: 50%;
89
+ width: 60px;
90
+ height: 60px;
91
+ z-index: 4;
92
+ padding-top:0 !important;
93
  }
css/admin-foogallery.css CHANGED
@@ -1,680 +1,680 @@
1
- .foogallery-attachments-list .add-attachment {
2
- background: #ddd;
3
- border: #888 1px dashed;
4
- position: relative;
5
- float: left;
6
- padding: 0;
7
- color: #464646;
8
- list-style: none;
9
- text-align: center;
10
- -webkit-user-select: none;
11
- -moz-user-select: none;
12
- -ms-user-select: none;
13
- -o-user-select: none;
14
- user-select: none;
15
- }
16
-
17
- .foogallery-attachments-list .add-attachment a {
18
- display: table-cell;
19
- vertical-align: middle;
20
- height: 150px;
21
- text-align: center;
22
- width: 150px;
23
- color:#666;
24
- font-weight: bold;
25
- text-decoration: none;
26
- }
27
-
28
- .foogallery-attachments-list .add-attachment a:hover {
29
- color:#444;
30
- }
31
-
32
- .foogallery-attachments-list .add-attachment a div.dashicons {
33
- font-size:50px;
34
- width: 50px;
35
- height: 50px;
36
- }
37
-
38
- .foogallery-attachments-list .add-attachment a span {
39
- display: block;
40
- }
41
-
42
-
43
- .foogallery-attachments-list .attachment-preview,
44
- .foogallery-attachments-list .attachment-preview .thumbnail {
45
- width: 150px;
46
- height: 150px;
47
- cursor:move;
48
- }
49
-
50
- .foogallery-attachments-list .attachment {
51
- border: transparent 1px solid;
52
- box-shadow: none !important;
53
- width: auto !important;
54
- padding: 0 !important;
55
- }
56
-
57
- .foogallery-attachments-list .attachment.placeholder {
58
- width: 150px !important;
59
- height: 150px;
60
- border: #1e8cbe 1px dashed;
61
- background: #eee;
62
- }
63
-
64
- .foogallery-attachments-list li {
65
- margin: 0px 10px 10px 0px !important;
66
- }
67
-
68
- .foogallery-attachments-list .attachment.ui-sortable-helper {
69
- opacity: 0.5;
70
- }
71
-
72
- .foogallery-attachments-list .attachment.ui-sortable-helper:hover .close {
73
- display: none;
74
- }
75
-
76
- .foogallery-attachments-list input.describe {
77
- margin:0;
78
- width: 150px;
79
- font-size: 12px;
80
- }
81
-
82
- .foogallery-attachments-list .attachment .attachment-preview a {
83
- display: none;
84
- position: absolute;
85
- padding: 0;
86
- font-size: 20px;
87
- line-height: 20px;
88
- text-align: center;
89
- text-decoration: none;
90
- background-color: #444;
91
- border-top-right-radius: 50%;
92
- border-top-left-radius: 50%;
93
- border-bottom-right-radius: 50%;
94
- border-bottom-left-radius: 50%;
95
- }
96
-
97
- .foogallery-attachments-list .attachment .attachment-preview:hover a {
98
- display: block;
99
- }
100
-
101
- .foogallery-attachments-list .attachment .attachment-preview a span {
102
- color:#fff;
103
- }
104
-
105
- .foogallery-attachments-list .attachment .attachment-preview a:hover span {
106
- color:#ddd;
107
- }
108
-
109
- .foogallery-attachments-list .attachment .attachment-preview a.remove {
110
- top: 5px;
111
- right: 5px;
112
- }
113
-
114
- .foogallery-attachments-list .attachment .attachment-preview a.info {
115
- top: 5px;
116
- left: 5px;
117
- }
118
-
119
- .spacer {
120
- display: inline-block;
121
- width:30px;
122
- }
123
-
124
- .foogallery_template_field td {
125
- padding-bottom: 20px;
126
- }
127
-
128
- .foogallery_template_field th {
129
- vertical-align: top;
130
- text-align: left;
131
- padding-top: 0.3em;
132
- padding-right: 10px;
133
- }
134
-
135
- .foogallery_template_field textarea {
136
- min-width: 500px;
137
- min-height: 100px;
138
- }
139
-
140
- .foogallery_template_field.foogallery_template_field_type-help {
141
- border-bottom: none;
142
- }
143
-
144
- .foogallery_template_field.foogallery_template_field_type-help td {
145
- padding-bottom: 0;
146
- }
147
-
148
- .foogallery_template_field.foogallery_template_field_type-icon td {
149
- padding-bottom: 0;
150
- }
151
-
152
- .foogallery_metabox_field-icon label {
153
- display:inline-block;
154
- margin-right:10px;
155
- border:solid 3px transparent;
156
- background:#aaa;
157
- border-radius: 3px;
158
- -moz-border-radius: 3px;
159
- -webkit-border-radius: 3px;
160
- padding:5px;
161
- line-height: 0;
162
- margin-bottom: 10px;
163
- }
164
-
165
- .foogallery_metabox_field-icon input:checked + label {
166
- border:solid 3px #444;
167
- background: #888;
168
- }
169
-
170
- .foogallery_metabox_field-icon label:hover {
171
- border:solid 3px #444;
172
- }
173
-
174
- .foogallery_template_field.foogallery_template_field_type-htmlicon td {
175
- padding-bottom: 0;
176
- }
177
-
178
- .foogallery_metabox_field-htmlicon label {
179
- display:inline-block;
180
- margin-right:10px;
181
- border:solid 3px transparent;
182
- background:#aaa;
183
- border-radius: 3px;
184
- -moz-border-radius: 3px;
185
- -webkit-border-radius: 3px;
186
- padding:5px;
187
- line-height: 0;
188
- margin-bottom: 10px;
189
- }
190
-
191
- .foogallery_template_field_id-lightbox_custom_button_theme .foogallery_metabox_field-htmlicon label,
192
- .foogallery_template_field_id-lightbox_custom_button_highlight .foogallery_metabox_field-htmlicon label
193
- {
194
- padding:0px;
195
- }
196
-
197
- .foogallery_metabox_field-htmlicon input:checked + label {
198
- border:solid 3px #444;
199
- background: #888;
200
- }
201
-
202
- .foogallery_metabox_field-htmlicon label:hover {
203
- border:solid 3px #444;
204
- }
205
-
206
- .foogallery_metabox_field-thumb_size label {
207
- vertical-align: baseline;
208
- }
209
-
210
- .foogallery_metabox_field-thumb_size input[type="number"] {
211
- margin-right: 10px;
212
- margin-left: 10px;
213
- }
214
-
215
- .foogallery_template_field_type-text input.small-text {
216
- width: 65px;
217
- height: 28px;
218
- line-height: 1;
219
- }
220
-
221
- #foogallery_pages ul li:hover .row-actions { visibility: visible; }
222
-
223
- .foogallery-shortcode {
224
- text-align: center;
225
- }
226
-
227
- .foogallery-shortcode input {
228
- cursor: pointer;
229
- text-align: center;
230
- padding: 10px;
231
- font-family: "courier new", courier;
232
- border: none;
233
- box-shadow: none;
234
- background: #efefef;
235
- }
236
-
237
- .wp-list-table .foogallery-shortcode {
238
- cursor: pointer;
239
- font-size: 1em;
240
- border: none;
241
- box-shadow: none;
242
- background: #efefef;
243
- font-family: "courier new", courier;
244
- }
245
-
246
- .foogallery-shortcode-message {
247
- font-style: italic;
248
- color: #2EA2CC !important;
249
- }
250
-
251
- .foogallery-help {
252
- position: relative;
253
- display: block;
254
- line-height: 19px;
255
- padding: 11px 10px 11px 40px;
256
- font-size: 14px;
257
- text-align: left;
258
- margin: 5px 0 0 2px;
259
- background-color: #F4F4FF;
260
- border-left: 4px solid #1e8cbe;
261
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
262
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
263
- }
264
-
265
- .foogallery-help:before {
266
- content: "\f223";
267
- font: 400 30px/1 dashicons !important;
268
- speak: none;
269
- color: #1e8cbe;
270
- display: inline-block;
271
- -webkit-font-smoothing: antialiased;
272
- -moz-osx-font-smoothing: grayscale;
273
- vertical-align: bottom;
274
- position: absolute;
275
- left: 5px;
276
- margin-top: -15px;
277
- top: 50%;
278
- height: 1em;
279
- }
280
-
281
- #post-body.columns-2 #postbox-container-1 .foogallery-help {
282
- padding-left: 11px;
283
- margin-left: 5px;
284
- }
285
-
286
- #post-body.columns-2 #postbox-container-1 .foogallery-help:before {
287
- content: '';
288
- }
289
-
290
- tr.foogallery_template_field[data-foogallery-hidden] {
291
- display: none;
292
- }
293
-
294
- tr.foogallery_template_field[data-foogallery-invisible] {
295
- display: none;
296
- }
297
-
298
- .foogallery_template_field_type-promo .foogallery-promo {
299
- position: relative;
300
- display: block;
301
- line-height: 19px;
302
- padding: 11px 10px 11px 40px;
303
- font-size: 14px;
304
- text-align: left;
305
- margin: 5px 0 0 2px;
306
- background-color: #f7fff6;
307
- border-left: 4px solid #31be4d;
308
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
309
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
310
- }
311
-
312
- .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo {
313
- border-color: #3397C1;
314
- background-color: #f6fffe;
315
- }
316
-
317
- .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo {
318
- border-color: #B0459D;
319
- background-color: #fdf6ff;
320
- }
321
-
322
- .foogallery_template_field_type-promo .foogallery-promo:before {
323
- /* content: "\f313"; award */
324
- content: "\f155"; /* star */
325
- font: 400 30px/1 dashicons !important;
326
- speak: none;
327
- color: #31be4d;
328
- display: inline-block;
329
- -webkit-font-smoothing: antialiased;
330
- -moz-osx-font-smoothing: grayscale;
331
- position: absolute;
332
- left: 5px;
333
- margin-top: -5px;
334
- height: 1em;
335
- }
336
-
337
- .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo:before {
338
- color: #3397C1;
339
- }
340
-
341
- .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo:before {
342
- color: #B0459D;
343
- }
344
-
345
- #post-body.columns-2 #postbox-container-1 .foogallery-promo {
346
- padding-left: 11px;
347
- margin-left: 5px;
348
- }
349
-
350
- #post-body.columns-2 #postbox-container-1 .foogallery-promo:before {
351
- content: '';
352
- }
353
-
354
- .foogallery_template_field_type-promo .foogallery-promo .button-primary {
355
- background: #1d7b30;
356
- border-color: #1d7b30;
357
- margin-right: 10px;
358
- }
359
-
360
- .foogallery_template_field_type-promo .foogallery-promo .button-secondary {
361
- border-color: #1d7b30;
362
- color: #1d7b30;
363
- }
364
-
365
- .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo .button-primary {
366
- background: #3397C1;
367
- border-color: #3397C1;
368
- }
369
-
370
- .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo .button-secondary {
371
- border-color: #3397C1;
372
- color: #3397C1;
373
- }
374
-
375
- .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo .button-primary {
376
- background: #B0459D;
377
- border-color: #B0459D;
378
- }
379
-
380
- .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo .button-secondary {
381
- border-color: #B0459D;
382
- color: #B0459D;
383
- }
384
-
385
- .foogallery_template_field_promo th .dashicons {
386
- color: #31be4d;
387
- }
388
-
389
- .foogallery_metabox_field-radio label.foogallery-promo i {
390
- font: 400 15px/1 dashicons !important;
391
- speak: none;
392
- color: #31be4d;
393
- vertical-align: inherit;
394
- padding-left: 2px;
395
- }
396
-
397
- .foogallery_metabox_field-radio label.foogallery-promo-prostarter i {
398
- font: 400 15px/1 dashicons !important;
399
- speak: none;
400
- color: #3397C1;
401
- vertical-align: inherit;
402
- padding-left: 2px;
403
- }
404
-
405
- .foogallery_metabox_field-radio label.foogallery_promo_commerce i {
406
- font: 400 15px/1 dashicons !important;
407
- speak: none;
408
- color: #B0459D;
409
- vertical-align: inherit;
410
- padding-left: 2px;
411
- }
412
-
413
- /** <gallery settings styling overrides> **/
414
-
415
- .foogallery-metabox-settings {
416
- width: 100%;
417
- border-collapse: collapse;
418
- }
419
-
420
- .foogallery-metabox-settings th {
421
- font-weight: normal;
422
- padding: 10px;
423
- width: 200px;
424
- }
425
-
426
- .foogallery-metabox-settings tr {
427
- border-bottom: solid 1px #EEE;
428
- }
429
-
430
- .foogallery-metabox-settings td {
431
- padding: 10px;
432
- }
433
-
434
- .foogallery_metabox_field-radio > input,
435
- .foogallery_metabox_field-radio > label {
436
- margin-bottom: 10px;
437
- display: inline-block;
438
- }
439
-
440
- .foogallery_metabox_field-radio input[type="checkbox"],
441
- .foogallery_metabox_field-radio input[type="radio"] {
442
- margin: 0 0 10px 0;
443
- }
444
-
445
- .foogallery_metabox_field-select select {
446
- min-width: 250px;
447
- }
448
-
449
- .foogallery-thumbsize-crop {
450
- margin-top: 10px;
451
- }
452
-
453
- .foogallery_metabox_field-checkboxlist > input,
454
- .foogallery_metabox_field-checkboxlist > label {
455
- margin-bottom: 10px;
456
- display: inline-block;
457
- }
458
-
459
- .foogallery_metabox_field-checkboxlist input[type="checkbox"] {
460
- margin: 0 0 10px 0;
461
- }
462
-
463
- /** </gallery settings styling overrides> **/
464
-
465
- .foogallery_metabox_custom_css {
466
- width: 100%;
467
- height: 10em;
468
- }
469
-
470
- .foo-nav-tabs a:focus {
471
- box-shadow: none;
472
- outline: 0;
473
- }
474
-
475
- .foogallery-thumbnail-preview {
476
- display: inline-block;
477
- }
478
-
479
- #foogallery_apply_retina_support_container {
480
- margin-top: 5px;
481
- }
482
-
483
- .widefat th.column-icon {
484
- width: 60px;
485
- }
486
-
487
- #foogallery_settings .inside {
488
- margin: 0;
489
- padding: 0;
490
- }
491
- /** Balloon.css **/
492
- button[data-balloon]{overflow:visible}[data-balloon]{position:relative}[data-balloon]:after,[data-balloon]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-khtml-opacity:0;-moz-opacity:0;opacity:0;pointer-events:none;-webkit-transition:all .18s ease-out .18s;transition:all .18s ease-out .18s;bottom:100%;left:50%;position:absolute;z-index:10;-webkit-transform:translate(-50%,10px);-ms-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;-ms-transform-origin:top;transform-origin:top}[data-balloon]:after{background:rgba(17,17,17,.9);border-radius:4px;color:#fff;content:attr(data-balloon);font-size:12px;padding:.5em 1em;white-space:nowrap;margin-bottom:11px}[data-balloon]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%280%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;content:"";margin-bottom:5px}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;pointer-events:auto;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon-pos=down]:after,[data-balloon-pos=down]:before{bottom:auto;left:50%;top:100%;-webkit-transform:translate(-50%,-10px);-ms-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon-pos=down]:after{margin-top:11px}[data-balloon-pos=down]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28180%2018%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;margin-top:5px;margin-bottom:0}[data-balloon-pos=down]:hover:after,[data-balloon-pos=down]:hover:before,[data-balloon-pos=down][data-balloon-visible]:after,[data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon-pos=left]:after,[data-balloon-pos=left]:before{bottom:auto;left:auto;right:100%;top:50%;-webkit-transform:translate(10px,-50%);-ms-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon-pos=left]:after{margin-right:11px}[data-balloon-pos=left]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28-90%2018%2018%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-right:5px;margin-bottom:0}[data-balloon-pos=left]:hover:after,[data-balloon-pos=left]:hover:before,[data-balloon-pos=left][data-balloon-visible]:after,[data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-pos=right]:after,[data-balloon-pos=right]:before{bottom:auto;left:100%;top:50%;-webkit-transform:translate(-10px,-50%);-ms-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon-pos=right]:after{margin-left:11px}[data-balloon-pos=right]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%2890%206%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-bottom:0;margin-left:5px}[data-balloon-pos=right]:hover:after,[data-balloon-pos=right]:hover:before,[data-balloon-pos=right][data-balloon-visible]:after,[data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-length]:after{white-space:normal}[data-balloon-length=small]:after{width:80px}[data-balloon-length=medium]:after{width:150px}[data-balloon-length=large]:after{width:260px}[data-balloon-length=xlarge]:after{width:90vw}@media screen and (min-width:768px){[data-balloon-length=xlarge]:after{width:380px}}[data-balloon-length=fit]:after{width:100%}
493
-
494
- /** Balloon.css overrides **/
495
- [data-balloon]:after,
496
- [data-balloon]:before {
497
- text-align: center;
498
- line-height: 1.2em;
499
- }
500
-
501
- .foogallery-items-view-switch-container.hidden {
502
- display: none;
503
- }
504
-
505
- .foogallery-items-view-switch-container {
506
- display: inline-block;
507
- margin-left: 10px;
508
- }
509
-
510
- .foogallery-items-view-switch-container .spinner {
511
- margin: 2px 10px 0;
512
- }
513
-
514
- .foogallery-items-view-switch {
515
- vertical-align: middle;
516
- display: inline-block;
517
- }
518
-
519
- .foogallery-items-view-switch a {
520
- font-size: 11px;
521
- padding: 4px 10px;
522
- line-height: 12px;
523
- border: 1px solid #2271b1;
524
- float: left;
525
- display: inline-block;
526
- text-decoration: none;
527
- margin: 0;
528
- border-radius: 3px;
529
- text-align: center;
530
- white-space: nowrap;
531
- vertical-align: middle;
532
- -ms-touch-action: manipulation;
533
- touch-action: manipulation;
534
- cursor: pointer;
535
- -webkit-user-select: none;
536
- -moz-user-select: none;
537
- -ms-user-select: none;
538
- user-select: none;
539
- /*background: #f7f7f7;*/
540
- /*color: #555;*/
541
-
542
- color: #2271b1;
543
- background: #f6f7f7;
544
- }
545
- .foogallery-items-view-switch a:hover {
546
- background: #f0f0f1;
547
- border-color: #0a4b78;
548
- color: #0a4b78;
549
- }
550
- .foogallery-items-view-switch a:focus {
551
- box-shadow: none;
552
- outline: none;
553
- }
554
-
555
- .foogallery-items-view-switch a:first-child:not(:last-child) {
556
- border-top-right-radius: 0;
557
- border-bottom-right-radius: 0;
558
- border-right: none;
559
- }
560
-
561
- .foogallery-items-view-switch a:last-child:not(:first-child) {
562
- border-top-left-radius: 0;
563
- border-bottom-left-radius: 0;
564
- border-left: none;
565
- }
566
-
567
- .foogallery-items-view-switch a:first-child {
568
- margin-right: 0;
569
- }
570
-
571
- .foogallery-items-view-switch a.current {
572
- background: #2271b1;
573
- border-color: #2271b1;
574
- color: #fff;
575
- }
576
-
577
- .foogallery-items-view-switch a.current:hover {
578
- background: #135e96;
579
- border-color: #135e96;
580
- color: #fff;
581
- }
582
-
583
- .foogallery-items-view-switch a+a {
584
- margin-left: -1px;
585
- }
586
-
587
- .foogallery-gallery-items-metabox-title {
588
- float:none;
589
- }
590
-
591
- .foogallery_preview_container {
592
- position: relative;
593
- padding: 10px;
594
- }
595
-
596
- .foogallery-items-add {
597
- padding:20px;
598
- text-align: center
599
- }
600
- .foogallery-items-view-preview {
601
- overflow: hidden;
602
- }
603
-
604
- .foogallery-items-view .button-hero .dashicons {
605
- vertical-align: middle;
606
- padding-right: 10px;
607
- width: 24px;
608
- height: 24px;
609
- font-size: 24px;
610
- font-weight: normal;
611
- }
612
-
613
- .foogallery_preview_container.loading:after {
614
- content: '';
615
- position: absolute;
616
- top: 0;
617
- left: 0;
618
- right: 0;
619
- bottom: 0;
620
- background: #fff;
621
- opacity: 0.8;
622
- z-index: 159900;
623
- }
624
-
625
- .fs-submenu-item.foogallery {
626
- font-size: 13px;
627
- line-height: 1.2;
628
- }
629
-
630
- .foogallery_template_field_type-thumb_size_no_crop input.small-text+label {
631
- margin-left: 10px;
632
- }
633
-
634
- .foogallery_template_field_type-thumb_size_no_crop label+input {
635
- margin-left: 5px;
636
- }
637
-
638
- /* changes to the media modal */
639
- .compat-item .compat-attachment-fields th.label label span {
640
- text-align: left;
641
- }
642
-
643
- .compat-item .compat-attachment-fields td.field {
644
- width: 100%;
645
- margin: 0;
646
- }
647
-
648
- .foogallery-attachments-list {
649
- max-height: 486px;
650
- /*max-height: 324px;*/
651
- /*max-height: 162px;*/
652
- overflow: scroll;
653
- overflow-x: hidden;
654
- list-style: none;
655
- border: 1px solid #ccd0d4;
656
- padding: 10px;
657
- }
658
- .foogallery-attachments-list:after,
659
- .foogallery-attachments-list-bar:after {
660
- content: '';
661
- display: block;
662
- clear: both;
663
- }
664
-
665
- .foogallery-attachments-list-bar button.alignright {
666
- margin-left: 5px;
667
- }
668
-
669
- .foogallery-custom-metabox-header {
670
- justify-content: flex-start !important;
671
- }
672
-
673
- .foogallery-custom-metabox-header .foogallery-template-selector {
674
- margin-left: 10px;
675
- }
676
-
677
- .foogallery-custom-metabox-header .foogallery-template-selector select {
678
- font-size: 13px;
679
- margin-left: 6px;
680
  }
1
+ .foogallery-attachments-list .add-attachment {
2
+ background: #ddd;
3
+ border: #888 1px dashed;
4
+ position: relative;
5
+ float: left;
6
+ padding: 0;
7
+ color: #464646;
8
+ list-style: none;
9
+ text-align: center;
10
+ -webkit-user-select: none;
11
+ -moz-user-select: none;
12
+ -ms-user-select: none;
13
+ -o-user-select: none;
14
+ user-select: none;
15
+ }
16
+
17
+ .foogallery-attachments-list .add-attachment a {
18
+ display: table-cell;
19
+ vertical-align: middle;
20
+ height: 150px;
21
+ text-align: center;
22
+ width: 150px;
23
+ color:#666;
24
+ font-weight: bold;
25
+ text-decoration: none;
26
+ }
27
+
28
+ .foogallery-attachments-list .add-attachment a:hover {
29
+ color:#444;
30
+ }
31
+
32
+ .foogallery-attachments-list .add-attachment a div.dashicons {
33
+ font-size:50px;
34
+ width: 50px;
35
+ height: 50px;
36
+ }
37
+
38
+ .foogallery-attachments-list .add-attachment a span {
39
+ display: block;
40
+ }
41
+
42
+
43
+ .foogallery-attachments-list .attachment-preview,
44
+ .foogallery-attachments-list .attachment-preview .thumbnail {
45
+ width: 150px;
46
+ height: 150px;
47
+ cursor:move;
48
+ }
49
+
50
+ .foogallery-attachments-list .attachment {
51
+ border: transparent 1px solid;
52
+ box-shadow: none !important;
53
+ width: auto !important;
54
+ padding: 0 !important;
55
+ }
56
+
57
+ .foogallery-attachments-list .attachment.placeholder {
58
+ width: 150px !important;
59
+ height: 150px;
60
+ border: #1e8cbe 1px dashed;
61
+ background: #eee;
62
+ }
63
+
64
+ .foogallery-attachments-list li {
65
+ margin: 0px 10px 10px 0px !important;
66
+ }
67
+
68
+ .foogallery-attachments-list .attachment.ui-sortable-helper {
69
+ opacity: 0.5;
70
+ }
71
+
72
+ .foogallery-attachments-list .attachment.ui-sortable-helper:hover .close {
73
+ display: none;
74
+ }
75
+
76
+ .foogallery-attachments-list input.describe {
77
+ margin:0;
78
+ width: 150px;
79
+ font-size: 12px;
80
+ }
81
+
82
+ .foogallery-attachments-list .attachment .attachment-preview a {
83
+ display: none;
84
+ position: absolute;
85
+ padding: 0;
86
+ font-size: 20px;
87
+ line-height: 20px;
88
+ text-align: center;
89
+ text-decoration: none;
90
+ background-color: #444;
91
+ border-top-right-radius: 50%;
92
+ border-top-left-radius: 50%;
93
+ border-bottom-right-radius: 50%;
94
+ border-bottom-left-radius: 50%;
95
+ }
96
+
97
+ .foogallery-attachments-list .attachment .attachment-preview:hover a {
98
+ display: block;
99
+ }
100
+
101
+ .foogallery-attachments-list .attachment .attachment-preview a span {
102
+ color:#fff;
103
+ }
104
+
105
+ .foogallery-attachments-list .attachment .attachment-preview a:hover span {
106
+ color:#ddd;
107
+ }
108
+
109
+ .foogallery-attachments-list .attachment .attachment-preview a.remove {
110
+ top: 5px;
111
+ right: 5px;
112
+ }
113
+
114
+ .foogallery-attachments-list .attachment .attachment-preview a.info {
115
+ top: 5px;
116
+ left: 5px;
117
+ }
118
+
119
+ .spacer {
120
+ display: inline-block;
121
+ width:30px;
122
+ }
123
+
124
+ .foogallery_template_field td {
125
+ padding-bottom: 20px;
126
+ }
127
+
128
+ .foogallery_template_field th {
129
+ vertical-align: top;
130
+ text-align: left;
131
+ padding-top: 0.3em;
132
+ padding-right: 10px;
133
+ }
134
+
135
+ .foogallery_template_field textarea {
136
+ min-width: 500px;
137
+ min-height: 100px;
138
+ }
139
+
140
+ .foogallery_template_field.foogallery_template_field_type-help {
141
+ border-bottom: none;
142
+ }
143
+
144
+ .foogallery_template_field.foogallery_template_field_type-help td {
145
+ padding-bottom: 0;
146
+ }
147
+
148
+ .foogallery_template_field.foogallery_template_field_type-icon td {
149
+ padding-bottom: 0;
150
+ }
151
+
152
+ .foogallery_metabox_field-icon label {
153
+ display:inline-block;
154
+ margin-right:10px;
155
+ border:solid 3px transparent;
156
+ background:#aaa;
157
+ border-radius: 3px;
158
+ -moz-border-radius: 3px;
159
+ -webkit-border-radius: 3px;
160
+ padding:5px;
161
+ line-height: 0;
162
+ margin-bottom: 10px;
163
+ }
164
+
165
+ .foogallery_metabox_field-icon input:checked + label {
166
+ border:solid 3px #444;
167
+ background: #888;
168
+ }
169
+
170
+ .foogallery_metabox_field-icon label:hover {
171
+ border:solid 3px #444;
172
+ }
173
+
174
+ .foogallery_template_field.foogallery_template_field_type-htmlicon td {
175
+ padding-bottom: 0;
176
+ }
177
+
178
+ .foogallery_metabox_field-htmlicon label {
179
+ display:inline-block;
180
+ margin-right:10px;
181
+ border:solid 3px transparent;
182
+ background:#aaa;
183
+ border-radius: 3px;
184
+ -moz-border-radius: 3px;
185
+ -webkit-border-radius: 3px;
186
+ padding:5px;
187
+ line-height: 0;
188
+ margin-bottom: 10px;
189
+ }
190
+
191
+ .foogallery_template_field_id-lightbox_custom_button_theme .foogallery_metabox_field-htmlicon label,
192
+ .foogallery_template_field_id-lightbox_custom_button_highlight .foogallery_metabox_field-htmlicon label
193
+ {
194
+ padding:0px;
195
+ }
196
+
197
+ .foogallery_metabox_field-htmlicon input:checked + label {
198
+ border:solid 3px #444;
199
+ background: #888;
200
+ }
201
+
202
+ .foogallery_metabox_field-htmlicon label:hover {
203
+ border:solid 3px #444;
204
+ }
205
+
206
+ .foogallery_metabox_field-thumb_size label {
207
+ vertical-align: baseline;
208
+ }
209
+
210
+ .foogallery_metabox_field-thumb_size input[type="number"] {
211
+ margin-right: 10px;
212
+ margin-left: 10px;
213
+ }
214
+
215
+ .foogallery_template_field_type-text input.small-text {
216
+ width: 65px;
217
+ height: 28px;
218
+ line-height: 1;
219
+ }
220
+
221
+ #foogallery_pages ul li:hover .row-actions { visibility: visible; }
222
+
223
+ .foogallery-shortcode {
224
+ text-align: center;
225
+ }
226
+
227
+ .foogallery-shortcode input {
228
+ cursor: pointer;
229
+ text-align: center;
230
+ padding: 10px;
231
+ font-family: "courier new", courier;
232
+ border: none;
233
+ box-shadow: none;
234
+ background: #efefef;
235
+ }
236
+
237
+ .wp-list-table .foogallery-shortcode {
238
+ cursor: pointer;
239
+ font-size: 1em;
240
+ border: none;
241
+ box-shadow: none;
242
+ background: #efefef;
243
+ font-family: "courier new", courier;
244
+ }
245
+
246
+ .foogallery-shortcode-message {
247
+ font-style: italic;
248
+ color: #2EA2CC !important;
249
+ }
250
+
251
+ .foogallery-help {
252
+ position: relative;
253
+ display: block;
254
+ line-height: 19px;
255
+ padding: 11px 10px 11px 40px;
256
+ font-size: 14px;
257
+ text-align: left;
258
+ margin: 5px 0 0 2px;
259
+ background-color: #F4F4FF;
260
+ border-left: 4px solid #1e8cbe;
261
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
262
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
263
+ }
264
+
265
+ .foogallery-help:before {
266
+ content: "\f223";
267
+ font: 400 30px/1 dashicons !important;
268
+ speak: none;
269
+ color: #1e8cbe;
270
+ display: inline-block;
271
+ -webkit-font-smoothing: antialiased;
272
+ -moz-osx-font-smoothing: grayscale;
273
+ vertical-align: bottom;
274
+ position: absolute;
275
+ left: 5px;
276
+ margin-top: -15px;
277
+ top: 50%;
278
+ height: 1em;
279
+ }
280
+
281
+ #post-body.columns-2 #postbox-container-1 .foogallery-help {
282
+ padding-left: 11px;
283
+ margin-left: 5px;
284
+ }
285
+
286
+ #post-body.columns-2 #postbox-container-1 .foogallery-help:before {
287
+ content: '';
288
+ }
289
+
290
+ tr.foogallery_template_field[data-foogallery-hidden] {
291
+ display: none;
292
+ }
293
+
294
+ tr.foogallery_template_field[data-foogallery-invisible] {
295
+ display: none;
296
+ }
297
+
298
+ .foogallery_template_field_type-promo .foogallery-promo {
299
+ position: relative;
300
+ display: block;
301
+ line-height: 19px;
302
+ padding: 11px 10px 11px 40px;
303
+ font-size: 14px;
304
+ text-align: left;
305
+ margin: 5px 0 0 2px;
306
+ background-color: #f7fff6;
307
+ border-left: 4px solid #31be4d;
308
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
309
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
310
+ }
311
+
312
+ .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo {
313
+ border-color: #3397C1;
314
+ background-color: #f6fffe;
315
+ }
316
+
317
+ .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo {
318
+ border-color: #B0459D;
319
+ background-color: #fdf6ff;
320
+ }
321
+
322
+ .foogallery_template_field_type-promo .foogallery-promo:before {
323
+ /* content: "\f313"; award */
324
+ content: "\f155"; /* star */
325
+ font: 400 30px/1 dashicons !important;
326
+ speak: none;
327
+ color: #31be4d;
328
+ display: inline-block;
329
+ -webkit-font-smoothing: antialiased;
330
+ -moz-osx-font-smoothing: grayscale;
331
+ position: absolute;
332
+ left: 5px;
333
+ margin-top: -5px;
334
+ height: 1em;
335
+ }
336
+
337
+ .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo:before {
338
+ color: #3397C1;
339
+ }
340
+
341
+ .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo:before {
342
+ color: #B0459D;
343
+ }
344
+
345
+ #post-body.columns-2 #postbox-container-1 .foogallery-promo {
346
+ padding-left: 11px;
347
+ margin-left: 5px;
348
+ }
349
+
350
+ #post-body.columns-2 #postbox-container-1 .foogallery-promo:before {
351
+ content: '';
352
+ }
353
+
354
+ .foogallery_template_field_type-promo .foogallery-promo .button-primary {
355
+ background: #1d7b30;
356
+ border-color: #1d7b30;
357
+ margin-right: 10px;
358
+ }
359
+
360
+ .foogallery_template_field_type-promo .foogallery-promo .button-secondary {
361
+ border-color: #1d7b30;
362
+ color: #1d7b30;
363
+ }
364
+
365
+ .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo .button-primary {
366
+ background: #3397C1;
367
+ border-color: #3397C1;
368
+ }
369
+
370
+ .foogallery_template_field_type-promo.foogallery_promo_prostarter .foogallery-promo .button-secondary {
371
+ border-color: #3397C1;
372
+ color: #3397C1;
373
+ }
374
+
375
+ .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo .button-primary {
376
+ background: #B0459D;
377
+ border-color: #B0459D;
378
+ }
379
+
380
+ .foogallery_template_field_type-promo.foogallery_promo_commerce .foogallery-promo .button-secondary {
381
+ border-color: #B0459D;
382
+ color: #B0459D;
383
+ }
384
+
385
+ .foogallery_template_field_promo th .dashicons {
386
+ color: #31be4d;
387
+ }
388
+
389
+ .foogallery_metabox_field-radio label.foogallery-promo i {
390
+ font: 400 15px/1 dashicons !important;
391
+ speak: none;
392
+ color: #31be4d;
393
+ vertical-align: inherit;
394
+ padding-left: 2px;
395
+ }
396
+
397
+ .foogallery_metabox_field-radio label.foogallery-promo-prostarter i {
398
+ font: 400 15px/1 dashicons !important;
399
+ speak: none;
400
+ color: #3397C1;
401
+ vertical-align: inherit;
402
+ padding-left: 2px;
403
+ }
404
+
405
+ .foogallery_metabox_field-radio label.foogallery_promo_commerce i {
406
+ font: 400 15px/1 dashicons !important;
407
+ speak: none;
408
+ color: #B0459D;
409
+ vertical-align: inherit;
410
+ padding-left: 2px;
411
+ }
412
+
413
+ /** <gallery settings styling overrides> **/
414
+
415
+ .foogallery-metabox-settings {
416
+ width: 100%;
417
+ border-collapse: collapse;
418
+ }
419
+
420
+ .foogallery-metabox-settings th {
421
+ font-weight: normal;
422
+ padding: 10px;
423
+ width: 200px;
424
+ }
425
+
426
+ .foogallery-metabox-settings tr {
427
+ border-bottom: solid 1px #EEE;
428
+ }
429
+
430
+ .foogallery-metabox-settings td {
431
+ padding: 10px;
432
+ }
433
+
434
+ .foogallery_metabox_field-radio > input,
435
+ .foogallery_metabox_field-radio > label {
436
+ margin-bottom: 10px;
437
+ display: inline-block;
438
+ }
439
+
440
+ .foogallery_metabox_field-radio input[type="checkbox"],
441
+ .foogallery_metabox_field-radio input[type="radio"] {
442
+ margin: 0 0 10px 0;
443
+ }
444
+
445
+ .foogallery_metabox_field-select select {
446
+ min-width: 250px;
447
+ }
448
+
449
+ .foogallery-thumbsize-crop {
450
+ margin-top: 10px;
451
+ }
452
+
453
+ .foogallery_metabox_field-checkboxlist > input,
454
+ .foogallery_metabox_field-checkboxlist > label {
455
+ margin-bottom: 10px;
456
+ display: inline-block;
457
+ }
458
+
459
+ .foogallery_metabox_field-checkboxlist input[type="checkbox"] {
460
+ margin: 0 0 10px 0;
461
+ }
462
+
463
+ /** </gallery settings styling overrides> **/
464
+
465
+ .foogallery_metabox_custom_css {
466
+ width: 100%;
467
+ height: 10em;
468
+ }
469
+
470
+ .foo-nav-tabs a:focus {
471
+ box-shadow: none;
472
+ outline: 0;
473
+ }
474
+
475
+ .foogallery-thumbnail-preview {
476
+ display: inline-block;
477
+ }
478
+
479
+ #foogallery_apply_retina_support_container {
480
+ margin-top: 5px;
481
+ }
482
+
483
+ .widefat th.column-icon {
484
+ width: 60px;
485
+ }
486
+
487
+ #foogallery_settings .inside {
488
+ margin: 0;
489
+ padding: 0;
490
+ }
491
+ /** Balloon.css **/
492
+ button[data-balloon]{overflow:visible}[data-balloon]{position:relative}[data-balloon]:after,[data-balloon]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-khtml-opacity:0;-moz-opacity:0;opacity:0;pointer-events:none;-webkit-transition:all .18s ease-out .18s;transition:all .18s ease-out .18s;bottom:100%;left:50%;position:absolute;z-index:10;-webkit-transform:translate(-50%,10px);-ms-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;-ms-transform-origin:top;transform-origin:top}[data-balloon]:after{background:rgba(17,17,17,.9);border-radius:4px;color:#fff;content:attr(data-balloon);font-size:12px;padding:.5em 1em;white-space:nowrap;margin-bottom:11px}[data-balloon]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%280%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;content:"";margin-bottom:5px}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;pointer-events:auto;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon-pos=down]:after,[data-balloon-pos=down]:before{bottom:auto;left:50%;top:100%;-webkit-transform:translate(-50%,-10px);-ms-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon-pos=down]:after{margin-top:11px}[data-balloon-pos=down]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28180%2018%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;margin-top:5px;margin-bottom:0}[data-balloon-pos=down]:hover:after,[data-balloon-pos=down]:hover:before,[data-balloon-pos=down][data-balloon-visible]:after,[data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon-pos=left]:after,[data-balloon-pos=left]:before{bottom:auto;left:auto;right:100%;top:50%;-webkit-transform:translate(10px,-50%);-ms-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon-pos=left]:after{margin-right:11px}[data-balloon-pos=left]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28-90%2018%2018%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-right:5px;margin-bottom:0}[data-balloon-pos=left]:hover:after,[data-balloon-pos=left]:hover:before,[data-balloon-pos=left][data-balloon-visible]:after,[data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-pos=right]:after,[data-balloon-pos=right]:before{bottom:auto;left:100%;top:50%;-webkit-transform:translate(-10px,-50%);-ms-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon-pos=right]:after{margin-left:11px}[data-balloon-pos=right]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%2890%206%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-bottom:0;margin-left:5px}[data-balloon-pos=right]:hover:after,[data-balloon-pos=right]:hover:before,[data-balloon-pos=right][data-balloon-visible]:after,[data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-length]:after{white-space:normal}[data-balloon-length=small]:after{width:80px}[data-balloon-length=medium]:after{width:150px}[data-balloon-length=large]:after{width:260px}[data-balloon-length=xlarge]:after{width:90vw}@media screen and (min-width:768px){[data-balloon-length=xlarge]:after{width:380px}}[data-balloon-length=fit]:after{width:100%}
493
+
494
+ /** Balloon.css overrides **/
495
+ [data-balloon]:after,
496
+ [data-balloon]:before {
497
+ text-align: center;
498
+ line-height: 1.2em;
499
+ }
500
+
501
+ .foogallery-items-view-switch-container.hidden {
502
+ display: none;
503
+ }
504
+
505
+ .foogallery-items-view-switch-container {
506
+ display: inline-block;
507
+ margin-left: 10px;
508
+ }
509
+
510
+ .foogallery-items-view-switch-container .spinner {
511
+ margin: 2px 10px 0;
512
+ }
513
+
514
+ .foogallery-items-view-switch {
515
+ vertical-align: middle;
516
+ display: inline-block;
517
+ }
518
+
519
+ .foogallery-items-view-switch a {
520
+ font-size: 11px;
521
+ padding: 4px 10px;
522
+ line-height: 12px;
523
+ border: 1px solid #2271b1;
524
+ float: left;
525
+ display: inline-block;
526
+ text-decoration: none;
527
+ margin: 0;
528
+ border-radius: 3px;
529
+ text-align: center;
530
+ white-space: nowrap;
531
+ vertical-align: middle;
532
+ -ms-touch-action: manipulation;
533
+ touch-action: manipulation;
534
+ cursor: pointer;
535
+ -webkit-user-select: none;
536
+ -moz-user-select: none;
537
+ -ms-user-select: none;
538
+ user-select: none;
539
+ /*background: #f7f7f7;*/
540
+ /*color: #555;*/
541
+
542
+ color: #2271b1;
543
+ background: #f6f7f7;
544
+ }
545
+ .foogallery-items-view-switch a:hover {
546
+ background: #f0f0f1;
547
+ border-color: #0a4b78;
548
+ color: #0a4b78;
549
+ }
550
+ .foogallery-items-view-switch a:focus {
551
+ box-shadow: none;
552
+ outline: none;
553
+ }
554
+
555
+ .foogallery-items-view-switch a:first-child:not(:last-child) {
556
+ border-top-right-radius: 0;
557
+ border-bottom-right-radius: 0;
558
+ border-right: none;
559
+ }
560
+
561
+ .foogallery-items-view-switch a:last-child:not(:first-child) {
562
+ border-top-left-radius: 0;
563
+ border-bottom-left-radius: 0;
564
+ border-left: none;
565
+ }
566
+
567
+ .foogallery-items-view-switch a:first-child {
568
+ margin-right: 0;
569
+ }
570
+
571
+ .foogallery-items-view-switch a.current {
572
+ background: #2271b1;
573
+ border-color: #2271b1;
574
+ color: #fff;
575
+ }
576
+
577
+ .foogallery-items-view-switch a.current:hover {
578
+ background: #135e96;
579
+ border-color: #135e96;
580
+ color: #fff;
581
+ }
582
+
583
+ .foogallery-items-view-switch a+a {
584
+ margin-left: -1px;
585
+ }
586
+
587
+ .foogallery-gallery-items-metabox-title {
588
+ float:none;
589
+ }
590
+
591
+ .foogallery_preview_container {
592
+ position: relative;
593
+ padding: 10px;
594
+ }
595
+
596
+ .foogallery-items-add {
597
+ padding:20px;
598
+ text-align: center
599
+ }
600
+ .foogallery-items-view-preview {
601
+ overflow: hidden;
602
+ }
603
+
604
+ .foogallery-items-view .button-hero .dashicons {
605
+ vertical-align: middle;
606
+ padding-right: 10px;
607
+ width: 24px;
608
+ height: 24px;
609
+ font-size: 24px;
610
+ font-weight: normal;
611
+ }
612
+
613
+ .foogallery_preview_container.loading:after {
614
+ content: '';
615
+ position: absolute;
616
+ top: 0;
617
+ left: 0;
618
+ right: 0;
619
+ bottom: 0;
620
+ background: #fff;
621
+ opacity: 0.8;
622
+ z-index: 159900;
623
+ }
624
+
625
+ .fs-submenu-item.foogallery {
626
+ font-size: 13px;
627
+ line-height: 1.2;
628
+ }
629
+
630
+ .foogallery_template_field_type-thumb_size_no_crop input.small-text+label {
631
+ margin-left: 10px;
632
+ }
633
+
634
+ .foogallery_template_field_type-thumb_size_no_crop label+input {
635
+ margin-left: 5px;
636
+ }
637
+
638
+ /* changes to the media modal */
639
+ .compat-item .compat-attachment-fields th.label label span {
640
+ text-align: left;
641
+ }
642
+
643
+ .compat-item .compat-attachment-fields td.field {
644
+ width: 100%;
645
+ margin: 0;
646
+ }
647
+
648
+ .foogallery-attachments-list {
649
+ max-height: 486px;
650
+ /*max-height: 324px;*/
651
+ /*max-height: 162px;*/
652
+ overflow: scroll;
653
+ overflow-x: hidden;
654
+ list-style: none;
655
+ border: 1px solid #ccd0d4;
656
+ padding: 10px;
657
+ }
658
+ .foogallery-attachments-list:after,
659
+ .foogallery-attachments-list-bar:after {
660
+ content: '';
661
+ display: block;
662
+ clear: both;
663
+ }
664
+
665
+ .foogallery-attachments-list-bar button.alignright {
666
+ margin-left: 5px;
667
+ }
668
+
669
+ .foogallery-custom-metabox-header {
670
+ justify-content: flex-start !important;
671
+ }
672
+
673
+ .foogallery-custom-metabox-header .foogallery-template-selector {
674
+ margin-left: 10px;
675
+ }
676
+
677
+ .foogallery-custom-metabox-header .foogallery-template-selector select {
678
+ font-size: 13px;
679
+ margin-left: 6px;
680
  }
css/admin-page-foogallery-extensions.css CHANGED
@@ -1,270 +1,270 @@
1
-
2
- .foogallery-extension-browser .extension-controls {
3
- margin-bottom: 10px;
4
- }
5
-
6
- .foogallery-extension-browser .extension-controls .subsubsub {
7
- margin:0;
8
- }
9
-
10
- .extension-reload {
11
- display: inline-block;
12
- vertical-align: middle;
13
- }
14
-
15
- .extension-reload .button {
16
- padding: 3px 5px 0 5px;
17
- line-height: 0;
18
- }
19
-
20
- .extension-reload .button.disabled span.dashicons {
21
- -webkit-animation: rotation 2s infinite linear;
22
- animation: rotation 2s infinite linear;
23
- }
24
-
25
- div.foogallery-message-success {
26
- border-left: 4px solid #7ad03a;
27
- padding: 1px 12px;
28
- background-color: #fff;
29
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
30
- box-shadow: 0 1px 1px 0 rgba(0,0,0,.1)
31
- }
32
-
33
- div.foogallery-message-error {
34
- border-left: 4px solid #dd3d36;
35
- background: #fff;
36
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
37
- box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
38
- padding: 1px 12px
39
- }
40
-
41
- .spinner {
42
- position: absolute;
43
- margin-top: 15px;
44
- }
45
-
46
- .foogallery-extension-browser {
47
- margin-top: 10px;
48
- width: 100%;
49
- position: relative;
50
- }
51
-
52
- .foogallery-extension-browser * {
53
- box-sizing: border-box;
54
- }
55
-
56
- .foogallery-extension-browser .extensions .extension {
57
- float: left;
58
- margin: 0 20px 20px 0;
59
- position: relative;
60
- width: 400px;
61
- height: 300px;
62
- border: 1px solid #DEDEDE;
63
- -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
64
- box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
65
- -webkit-box-sizing: border-box;
66
- -moz-box-sizing: border-box;
67
- box-sizing: border-box;
68
- background: #fff;
69
- }
70
-
71
- .foogallery-extension-browser .extensions .extension h3 {
72
- position: absolute;
73
- bottom: 0;
74
- width: 100%;
75
- font-size: 15px;
76
- font-weight: bold;
77
- height: 50px;
78
- line-height: 50px;
79
- margin: 0;
80
- padding-left: 15px;
81
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
82
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
83
- overflow: hidden;
84
- white-space: nowrap;
85
- text-overflow: ellipsis;
86
- background: #000;
87
- opacity: 0.9;
88
- color:#fff;
89
- }
90
-
91
- .foogallery-extension-browser .extensions .extension h3 .new {
92
- background: #D54E21;
93
- background: rgba(213, 78, 33, 0.95);
94
- -webkit-border-radius: 3px;
95
- border-radius: 3px;
96
- padding:2px 5px;
97
- color:#fff;
98
- font-size: 10px;
99
- margin-left: 5px;
100
- margin-bottom: 3px;
101
- }
102
-
103
- .foogallery-extension-browser .extensions .extension h3 .tag {
104
- background: #888;
105
- -webkit-border-radius: 3px;
106
- border-radius: 3px;
107
- padding:2px 5px;
108
- color:#000;
109
- font-size: 9px;
110
- margin-left: 5px;
111
- vertical-align:top;
112
- }
113
-
114
- .foogallery-extension-browser .extensions .extension h3 .tag.functionality {
115
- background: #8a5cc9;
116
- }
117
-
118
- .foogallery-extension-browser .extensions .extension h3 .tag.premium {
119
- background: #080;
120
- }
121
-
122
- .foogallery-extension-browser .extensions .extension h3 .tag.lightbox {
123
- background: #ff7f00;
124
- }
125
-
126
- .foogallery-extension-browser .extensions .extension h3 .tag.template {
127
- background: #369;
128
- }
129
-
130
- .foogallery-extension-browser .extensions .extension h3 .tag.new {
131
- background: #F00;
132
- }
133
-
134
- .foogallery-extension-browser .extensions .extension .screenshot {
135
- height: 100%;
136
- position: absolute;
137
- left: 0;
138
- top: 0;
139
- width: 100%;
140
- -webkit-transform: translateZ(0);
141
- -webkit-transition: opacity .2s ease-in-out;
142
- transition: opacity .2s ease-in-out;
143
- }
144
-
145
- .foogallery-extension-browser .extensions .extension:hover .screenshot {
146
- opacity: .4;
147
- }
148
-
149
- .foogallery-extension-browser .extensions .extension .extension-actions {
150
- -webkit-transition: opacity .1s ease-in-out;
151
- transition: opacity .1s ease-in-out;
152
- position: absolute;
153
- bottom: 0;
154
- right: 0;
155
- height: 50px;
156
- padding: 9px 10px 0;
157
- }
158
-
159
- .foogallery-extension-browser .extensions .extension .extension-details {
160
- -ms-filter: "alpha(Opacity=0)";
161
- opacity: 0;
162
- position: absolute;
163
- top: 25%;
164
- right: 20%;
165
- left: 20%;
166
- background: #222;
167
- background: rgba(0, 0, 0, 0.7);
168
- color: #FFF;
169
- font-size: 15px;
170
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
171
- -webkit-font-smoothing: antialiased;
172
- font-weight: 600;
173
- padding: 15px 12px;
174
- text-align: center;
175
- -webkit-border-radius: 3px;
176
- border-radius: 3px;
177
- -webkit-transition: opacity .1s ease-in-out;
178
- transition: opacity .1s ease-in-out;
179
- }
180
-
181
- .foogallery-extension-browser .extensions .extension:hover .extension-details {
182
- -ms-filter: "alpha(Opacity=1)";
183
- opacity: 1;
184
- }
185
-
186
- .foogallery-extension-browser .extensions .extension .banner {
187
- background: #888;
188
- color: #FFF;
189
- display: block;
190
- font-size: 13px;
191
- font-weight: 400;
192
- height: 48px;
193
- line-height: 48px;
194
- padding: 0 10px 0 40px;
195
- position: absolute;
196
- top: 0;
197
- right: 0;
198
- left: 0;
199
- border-bottom: 1px solid rgba(0, 0, 0, 0.25);
200
- overflow: hidden;
201
- }
202
-
203
- .foogallery-extension-browser .extensions .extension .banner:empty {
204
- display: none;
205
- }
206
-
207
- .foogallery-extension-browser .extensions .extension .banner:before {
208
- display: inline-block;
209
- font: 400 30px/1 dashicons;
210
- top: 10px;
211
- left: 10px;
212
- position: absolute;
213
- speak: none;
214
- -webkit-font-smoothing: antialiased;
215
- }
216
-
217
- .foogallery-extension-browser .extensions .extension.activated .banner {
218
- background: #080;
219
- }
220
-
221
- .foogallery-extension-browser .extensions .extension.activated .banner:before {
222
- content: "\f147";
223
- }
224
-
225
- .foogallery-extension-browser .extensions .extension.has_error .banner {
226
- background: #800;
227
- }
228
-
229
- .foogallery-extension-browser .extensions .extension.has_error .banner:before {
230
- content: "\f158";
231
- }
232
-
233
- .foogallery-extension-browser .extensions .extension.updating .banner {
234
- background: #888;
235
- }
236
-
237
- .foogallery-extension-browser .extensions .extension.updating .banner:before {
238
- content: "\f463";
239
- -webkit-animation: rotation 2s infinite linear;
240
- animation: rotation 2s infinite linear;
241
- }
242
-
243
- .foogallery-extension-browser .extensions .extension .activate,
244
- .foogallery-extension-browser .extensions .extension .deactivate {
245
- display: none;
246
- }
247
-
248
- .foogallery-extension-browser .extensions .extension.downloaded .activate {
249
- display: block;
250
- }
251
-
252
- .foogallery-extension-browser .extensions .extension.downloaded .download {
253
- display: none;
254
- }
255
-
256
- .foogallery-extension-browser .extensions .extension.activated .activate {
257
- display: none;
258
- }
259
-
260
- .foogallery-extension-browser .extensions .extension.activated .deactivate {
261
- display: block;
262
- }
263
-
264
- .foogallery-extension-browser .extensions .extension.activated .updating {
265
- display: block;
266
- }
267
-
268
- .foogallery-extension-browser .extension-page {
269
- display: none;
270
  }
1
+
2
+ .foogallery-extension-browser .extension-controls {
3
+ margin-bottom: 10px;
4
+ }
5
+
6
+ .foogallery-extension-browser .extension-controls .subsubsub {
7
+ margin:0;
8
+ }
9
+
10
+ .extension-reload {
11
+ display: inline-block;
12
+ vertical-align: middle;
13
+ }
14
+
15
+ .extension-reload .button {
16
+ padding: 3px 5px 0 5px;
17
+ line-height: 0;
18
+ }
19
+
20
+ .extension-reload .button.disabled span.dashicons {
21
+ -webkit-animation: rotation 2s infinite linear;
22
+ animation: rotation 2s infinite linear;
23
+ }
24
+
25
+ div.foogallery-message-success {
26
+ border-left: 4px solid #7ad03a;
27
+ padding: 1px 12px;
28
+ background-color: #fff;
29
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
30
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1)
31
+ }
32
+
33
+ div.foogallery-message-error {
34
+ border-left: 4px solid #dd3d36;
35
+ background: #fff;
36
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
37
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
38
+ padding: 1px 12px
39
+ }
40
+
41
+ .spinner {
42
+ position: absolute;
43
+ margin-top: 15px;
44
+ }
45
+
46
+ .foogallery-extension-browser {
47
+ margin-top: 10px;
48
+ width: 100%;
49
+ position: relative;
50
+ }
51
+
52
+ .foogallery-extension-browser * {
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ .foogallery-extension-browser .extensions .extension {
57
+ float: left;
58
+ margin: 0 20px 20px 0;
59
+ position: relative;
60
+ width: 400px;
61
+ height: 300px;
62
+ border: 1px solid #DEDEDE;
63
+ -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
64
+ box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
65
+ -webkit-box-sizing: border-box;
66
+ -moz-box-sizing: border-box;
67
+ box-sizing: border-box;
68
+ background: #fff;
69
+ }
70
+
71
+ .foogallery-extension-browser .extensions .extension h3 {
72
+ position: absolute;
73
+ bottom: 0;
74
+ width: 100%;
75
+ font-size: 15px;
76
+ font-weight: bold;
77
+ height: 50px;
78
+ line-height: 50px;
79
+ margin: 0;
80
+ padding-left: 15px;
81
+ -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
82
+ box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
83
+ overflow: hidden;
84
+ white-space: nowrap;
85
+ text-overflow: ellipsis;
86
+ background: #000;
87
+ opacity: 0.9;
88
+ color:#fff;
89
+ }
90
+
91
+ .foogallery-extension-browser .extensions .extension h3 .new {
92
+ background: #D54E21;
93
+ background: rgba(213, 78, 33, 0.95);
94
+ -webkit-border-radius: 3px;
95
+ border-radius: 3px;
96
+ padding:2px 5px;
97
+ color:#fff;
98
+ font-size: 10px;
99
+ margin-left: 5px;
100
+ margin-bottom: 3px;
101
+ }
102
+
103
+ .foogallery-extension-browser .extensions .extension h3 .tag {
104
+ background: #888;
105
+ -webkit-border-radius: 3px;
106
+ border-radius: 3px;
107
+ padding:2px 5px;
108
+ color:#000;
109
+ font-size: 9px;
110
+ margin-left: 5px;
111
+ vertical-align:top;
112
+ }
113
+
114
+ .foogallery-extension-browser .extensions .extension h3 .tag.functionality {
115
+ background: #8a5cc9;
116
+ }
117
+
118
+ .foogallery-extension-browser .extensions .extension h3 .tag.premium {
119
+ background: #080;
120
+ }
121
+
122
+ .foogallery-extension-browser .extensions .extension h3 .tag.lightbox {
123
+ background: #ff7f00;
124
+ }
125
+
126
+ .foogallery-extension-browser .extensions .extension h3 .tag.template {
127
+ background: #369;
128
+ }
129
+
130
+ .foogallery-extension-browser .extensions .extension h3 .tag.new {
131
+ background: #F00;
132
+ }
133
+
134
+ .foogallery-extension-browser .extensions .extension .screenshot {
135
+ height: 100%;
136
+ position: absolute;
137
+ left: 0;
138
+ top: 0;
139
+ width: 100%;
140
+ -webkit-transform: translateZ(0);
141
+ -webkit-transition: opacity .2s ease-in-out;
142
+ transition: opacity .2s ease-in-out;
143
+ }
144
+
145
+ .foogallery-extension-browser .extensions .extension:hover .screenshot {
146
+ opacity: .4;
147
+ }
148
+
149
+ .foogallery-extension-browser .extensions .extension .extension-actions {
150
+ -webkit-transition: opacity .1s ease-in-out;
151
+ transition: opacity .1s ease-in-out;
152
+ position: absolute;
153
+ bottom: 0;
154
+ right: 0;
155
+ height: 50px;
156
+ padding: 9px 10px 0;
157
+ }
158
+
159
+ .foogallery-extension-browser .extensions .extension .extension-details {
160
+ -ms-filter: "alpha(Opacity=0)";
161
+ opacity: 0;
162
+ position: absolute;
163
+ top: 25%;
164
+ right: 20%;
165
+ left: 20%;
166
+ background: #222;
167
+ background: rgba(0, 0, 0, 0.7);
168
+ color: #FFF;
169
+ font-size: 15px;
170
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
171
+ -webkit-font-smoothing: antialiased;
172
+ font-weight: 600;
173
+ padding: 15px 12px;
174
+ text-align: center;
175
+ -webkit-border-radius: 3px;
176
+ border-radius: 3px;
177
+ -webkit-transition: opacity .1s ease-in-out;
178
+ transition: opacity .1s ease-in-out;
179
+ }
180
+
181
+ .foogallery-extension-browser .extensions .extension:hover .extension-details {
182
+ -ms-filter: "alpha(Opacity=1)";
183
+ opacity: 1;
184
+ }
185
+
186
+ .foogallery-extension-browser .extensions .extension .banner {
187
+ background: #888;
188
+ color: #FFF;
189
+ display: block;
190
+ font-size: 13px;
191
+ font-weight: 400;
192
+ height: 48px;
193
+ line-height: 48px;
194
+ padding: 0 10px 0 40px;
195
+ position: absolute;
196
+ top: 0;
197
+ right: 0;
198
+ left: 0;
199
+ border-bottom: 1px solid rgba(0, 0, 0, 0.25);
200
+ overflow: hidden;
201
+ }
202
+
203
+ .foogallery-extension-browser .extensions .extension .banner:empty {
204
+ display: none;
205
+ }
206
+
207
+ .foogallery-extension-browser .extensions .extension .banner:before {
208
+ display: inline-block;
209
+ font: 400 30px/1 dashicons;
210
+ top: 10px;
211
+ left: 10px;
212
+ position: absolute;
213
+ speak: none;
214
+ -webkit-font-smoothing: antialiased;
215
+ }
216
+
217
+ .foogallery-extension-browser .extensions .extension.activated .banner {
218
+ background: #080;
219
+ }
220
+
221
+ .foogallery-extension-browser .extensions .extension.activated .banner:before {
222
+ content: "\f147";
223
+ }
224
+
225
+ .foogallery-extension-browser .extensions .extension.has_error .banner {
226
+ background: #800;
227
+ }
228
+
229
+ .foogallery-extension-browser .extensions .extension.has_error .banner:before {
230
+ content: "\f158";
231
+ }
232
+
233
+ .foogallery-extension-browser .extensions .extension.updating .banner {
234
+ background: #888;
235
+ }
236
+
237
+ .foogallery-extension-browser .extensions .extension.updating .banner:before {
238
+ content: "\f463";
239
+ -webkit-animation: rotation 2s infinite linear;
240
+ animation: rotation 2s infinite linear;
241
+ }
242
+
243
+ .foogallery-extension-browser .extensions .extension .activate,
244
+ .foogallery-extension-browser .extensions .extension .deactivate {
245
+ display: none;
246
+ }
247
+
248
+ .foogallery-extension-browser .extensions .extension.downloaded .activate {
249
+ display: block;
250
+ }
251
+
252
+ .foogallery-extension-browser .extensions .extension.downloaded .download {
253
+ display: none;
254
+ }
255
+
256
+ .foogallery-extension-browser .extensions .extension.activated .activate {
257
+ display: none;
258
+ }
259
+
260
+ .foogallery-extension-browser .extensions .extension.activated .deactivate {
261
+ display: block;
262
+ }
263
+
264
+ .foogallery-extension-browser .extensions .extension.activated .updating {
265
+ display: block;
266
+ }
267
+
268
+ .foogallery-extension-browser .extension-page {
269
+ display: none;
270
  }
css/admin-page-foogallery-help.css CHANGED
@@ -1,565 +1,565 @@
1
- .foogallery_page_foogallery-help .fs-notice {
2
- margin-right: 200px !important;
3
- }
4
-
5
-
6
- body {
7
- background-color: #646970;/*#484c50;*/
8
- }
9
- #wpcontent {
10
- padding-right: 20px;
11
- box-sizing: border-box;
12
- }
13
- @media screen and (max-width: 782px){
14
- .auto-fold #wpcontent {
15
- padding-right: 10px;
16
- }
17
- }
18
-
19
- .foogallery-admin-help,
20
- .foogallery-admin-help * {
21
- box-sizing: border-box;
22
- }
23
-
24
- .foogallery-admin-help {
25
- max-width: 1000px;
26
- margin: 24px auto;
27
- clear: both;
28
- background-color: #101517;
29
- border-radius: 20px;
30
- color: #ffffff;
31
- font-size: 14px;
32
- line-height: 1.4;
33
- }
34
-
35
- .foogallery-admin-help img {
36
- display: block;
37
- max-width: 100%;
38
- height: auto;
39
- box-sizing: border-box;
40
- margin: 0 auto;
41
- }
42
- .foogallery-admin-help p {
43
- margin: 0.8em 0;
44
- font-size: 14px;
45
- line-height: 1.4;
46
- }
47
- .foogallery-admin-help h2,
48
- .foogallery-admin-help h3,
49
- .foogallery-admin-help h4 {
50
- color: inherit;
51
- }
52
-
53
- .foogallery-admin-help a {
54
- color: #3582c4;
55
- text-decoration: none;
56
- }
57
- .foogallery-admin-help a:focus {
58
- box-shadow: none;
59
- }
60
- .foogallery-admin-help a:hover {
61
- color: #4f94d4;
62
- }
63
-
64
- .foogallery-admin-help-header {
65
- margin: 0;
66
- color: #FFFFFF;
67
- position: relative;
68
- text-align: center;
69
- padding: 20px;
70
- }
71
- .foogallery-admin-help-header > img {
72
- margin: 3em auto;
73
- }
74
-
75
- .foogallery-admin-help-tagline {
76
- margin: 0;
77
- padding: 10px;
78
- font-size: 1.5em;
79
- }
80
-
81
- .foogallery-admin-help-ribbon {
82
- position: absolute;
83
- right: -5px;
84
- top: -5px;
85
- z-index: 1;
86
- overflow: hidden;
87
- width: 75px;
88
- height: 75px;
89
- text-align: right;
90
- }
91
- .foogallery-admin-help-ribbon span {
92
- font-size: 10px;
93
- font-weight: bold;
94
- color: #2b2400;
95
- text-transform: uppercase;
96
- text-align: center;
97
- line-height: 20px;
98
- transform: rotate(45deg);
99
- width: 100px;
100
- display: block;
101
- background: #b04cff;
102
- box-shadow: 0 3px 10px -5px rgba(0, 0, 0, 1);
103
- position: absolute;
104
- top: 19px; right: -21px;
105
- }
106
- .foogallery-admin-help-ribbon span::before {
107
- content: "";
108
- position: absolute;
109
- left: 0;
110
- top: 100%;
111
- z-index: -1;
112
- border-left: 3px solid #6a00b8;
113
- border-right: 3px solid transparent;
114
- border-bottom: 3px solid transparent;
115
- border-top: 3px solid #6a00b8;
116
- }
117
- .foogallery-admin-help-ribbon span::after {
118
- content: "";
119
- position: absolute;
120
- right: 0;
121
- top: 100%;
122
- z-index: -1;
123
- border-left: 3px solid transparent;
124
- border-right: 3px solid #6a00b8;
125
- border-bottom: 3px solid transparent;
126
- border-top: 3px solid #6a00b8;
127
- }
128
-
129
- .foogallery-admin-help nav {
130
- background: #101517;/*#1d2327*/;
131
- clear: both;
132
- padding-top: 0;
133
- color: #9ca2a7;
134
- display: flex;
135
- width: 100%;
136
- max-width: 100%;
137
- justify-content: stretch;
138
- align-items: stretch;
139
- flex-wrap: nowrap;
140
- padding-left: 10px;
141
- padding-right: 10px;
142
- border-bottom: 3px solid #fff;
143
- }
144
-
145
- .foogallery-admin-help nav a {
146
- display: block;
147
- flex-grow: 1;
148
- margin-left: 0;
149
- padding: 24px 32px 18px 32px;
150
- font-size: 1.3em;
151
- line-height: 1.4;
152
- border: 3px solid transparent;
153
- border-top-left-radius: .6rem;
154
- border-top-right-radius: .6rem;
155
- background: transparent;
156
- color: inherit;
157
- text-decoration: none;
158
- font-weight: 600;
159
- box-shadow: none;
160
- text-align: center;
161
- }
162
-
163
- .foogallery-admin-help nav a.foogallery-admin-help-tab-active {
164
- background-color: #2c3338;
165
- color: #ffffff;
166
- border-color: #ffffff;
167
- border-bottom: none;
168
- border-bottom-color: #2c3338;
169
- margin-bottom: -3px;
170
- }
171
-
172
- .fgah-feature {
173
- display: block;
174
- position: relative;
175
- max-width: 100%;
176
- margin: 0;
177
- padding: 16px;
178
- font-size: 14px;
179
- background-color: #1d2327;
180
- }
181
- .fgah-feature:nth-child(odd) {
182
- background-color: #2c3338;
183
- }
184
-
185
- .fgah-feature > * {
186
- margin: 16px;
187
- }
188
- .fgah-feature > header + * {
189
- margin-top: 32px;
190
- }
191
- .fgah-feature > * + footer {
192
- margin-top: 32px;
193
- }
194
-
195
- .fgah-feature > header {
196
- text-align: left;
197
- }
198
-
199
- .fgah-feature > header > h3 {
200
- font-size: 1.5em;
201
- margin: 0;
202
- padding: 0;
203
- font-weight: 600;
204
- }
205
- .fgah-feature > header > h3 + p {
206
- margin-top: 24px;
207
- }
208
-
209
- .fgah-feature > footer {
210
- text-align: center;
211
- padding: 0;
212
- }
213
-
214
- .fgah-feature > footer > small {
215
- display: block;
216
- margin: 16px 0;
217
- color: #c3c4c7;
218
- }
219
-
220
- .fgah-feature > footer > *:last-child {
221
- margin-bottom: 0;
222
- }
223
-
224
- .fgah-feature > div {
225
- display: flex;
226
- flex-direction: row;
227
- justify-content: center;
228
- align-items: flex-start;
229
- max-width: 100%;
230
- }
231
- .fgah-feature-right > div {
232
- flex-direction: row-reverse;
233
- }
234
- .fgah-feature > div > * {
235
- padding: 0;
236
- margin: 0;
237
- width: 33.33%;
238
- }
239
- .fgah-feature > div > figure {
240
- width: 66.66%;
241
- text-align: center;
242
- padding-right: 32px;
243
- }
244
- .fgah-feature-right > div > figure {
245
- padding-right: 0;
246
- padding-left: 32px;
247
- }
248
-
249
- .fgah-feature > div > ol {
250
-
251
- }
252
- .fgah-feature > div > ol > li {
253
- list-style-type: decimal;
254
- margin: 0 2em;
255
- padding: 0;
256
- }
257
-
258
- .fgah-feature > div > dl {
259
-
260
- }
261
- .fgah-feature > div > dl > dt {
262
- font-size: large;
263
- margin: 0 0 16px 0;
264
- font-weight: 600;
265
- }
266
- .fgah-feature > div > dl > dt > code {
267
- background-color: transparent;
268
- font-size: inherit;
269
- padding: 0;
270
- margin: 0;
271
- }
272
- .fgah-feature > div > dl > dd {
273
- font-size: inherit;
274
- margin: 16px 0;
275
- }
276
- .fgah-feature > div > dl > dd + dt {
277
- margin: 32px 0 16px 0;
278
- }
279
-
280
- .fgah-feature-pro {
281
- counter-increment: number-counter;
282
- }
283
-
284
- .fgah-feature-pro > div > dl > dd > p > a {
285
- text-decoration: underline;
286
- }
287
-
288
- .fgah-feature-pro > div > dl > dt::before {
289
- content: counters(number-counter, ".") " ";
290
- line-height: 30px;
291
- display: inline-block;
292
- min-width: 20px;
293
- margin: 0 8px 0 0;
294
- padding: 0 5px;
295
- text-align: center;
296
- vertical-align: 1px;
297
- color: #fff;
298
- border-radius: 3px;
299
- background: #4098D7;
300
- background: linear-gradient(45deg, #6638b8 0%, #4098D7 100%);
301
- }
302
-
303
- span.fgah-plan-prostarter {
304
- color: #4098D7;
305
- font-weight: bold;
306
- }
307
-
308
- .fgah-feature-pro.fgah-feature-plan-pro > div > dl > dt::before {
309
- background: #2CA03D;
310
- background: linear-gradient(45deg, #6638b8 0%, #2CA03D 100%);
311
- }
312
-
313
- span.fgah-plan-pro {
314
- color: #2CA03D;
315
- font-weight: bold;
316
- }
317
-
318
- .fgah-feature-pro.fgah-feature-plan-commerce > div > dl > dt::before {
319
- background: #B0459D;
320
- background: linear-gradient(45deg, #6638b8 0%, #B0459D 100%);
321
- }
322
-
323
- span.fgah-plan-commerce {
324
- color: #B0459D;
325
- font-weight: bold;
326
- }
327
-
328
- .fgah-feature-sub-title {
329
- margin-bottom: 16px;
330
- }
331
-
332
- .fgah-feature-sub-title h4 {
333
- margin: 0px 0px 5px 0;
334
- }
335
-
336
- .fgah-feature-sub-title span {
337
- background: #6d6d6d;
338
- color: #191a1f;
339
- padding: 1px 6px;
340
- border-radius: 3px;
341
- margin-right: 3px;
342
- font-weight: 500;
343
- }
344
-
345
- .fgah-feature-sub-title span.fgah-plan-prostarter {
346
- background: #3397C1;
347
- }
348
-
349
- .fgah-feature-sub-title span.fgah-plan-pro {
350
- background: #2CA03D;
351
- }
352
-
353
- .fgah-feature-sub-title span.fgah-plan-commerce {
354
- background: #B0459D;
355
- }
356
-
357
- .fgah-help-list {
358
- list-style-type: none;
359
- }
360
- .fgah-help-list li {
361
- list-style-type: none;
362
- margin: 0 0 16px 0;
363
- padding: 0;
364
- }
365
- .fgah-help-list li:last-child {
366
- margin-bottom: 0;
367
- }
368
- .fgah-help-list li::before {
369
- content: "\003F";
370
- display: inline-block;
371
- background-color: #1897ff;
372
- color: #FFFFFF;
373
- border-radius: 50%;
374
- line-height: 1;
375
- width: 1em;
376
- height: 1em;
377
- padding: 0.14em;
378
- text-align: center;
379
- margin-right: 0.4em;
380
- border: solid 2px #FFFFFF;
381
- float: left;
382
- }
383
-
384
- .fgah-demo {
385
- display: block;
386
- position: relative;
387
- max-width: 100%;
388
- margin: 0;
389
- padding: 16px;
390
- font-size: 14px;
391
- background-color: #2c3338;
392
- }
393
- .fgah-demo > header {
394
- text-align: left;
395
- margin: 16px;
396
- }
397
- .fgah-demo > header + * {
398
- margin-top: 32px;
399
- }
400
- .fgah-demo > header > h3 {
401
- font-size: 1.5em;
402
- margin: 0;
403
- padding: 0;
404
- font-weight: 600;
405
- }
406
- .fgah-demo > header > h3 + p {
407
- margin-top: 24px;
408
- }
409
- .fgah-demo > div.foogallery {
410
- margin-bottom: 15px;
411
- }
412
-
413
- .foogallery-admin-help-button {
414
- position: relative;
415
- background-color: #7d4fff;
416
- color: #ffffff !important;
417
- padding: 10px 20px;
418
- font-size: 1em;
419
- border-radius: 3px;
420
- text-decoration: none;
421
- font-weight: 400;
422
- display: inline-block;
423
- text-align: center;
424
- line-height: 1.2;
425
- border: none;
426
- box-shadow: none;
427
- outline: none;
428
- cursor: pointer;
429
- transition: background-color .1s ease-in-out;
430
- }
431
-
432
- .foogallery-admin-help-button-active {
433
- background-color: #1897ff;
434
- }
435
-
436
- .foogallery-admin-help-button-cta {
437
- position: relative;
438
- background-color: #7d4fff;
439
- color: #ffffff !important;
440
- padding: 12px 36px;
441
- font-size: 1.3em;
442
- border-radius: 5px;
443
- text-decoration: none;
444
- font-weight: 600;
445
- display: inline-block;
446
- min-width: 250px;
447
- text-align: center;
448
- line-height: 1.4;
449
- border: none;
450
- box-shadow: none;
451
- outline: none;
452
- cursor: pointer;
453
- transition: background-color .1s ease-in-out;
454
- }
455
-
456
- .foogallery-admin-help-button-cta:hover,
457
- .foogallery-admin-help-button-cta:focus {
458
- background-color: #5234a7;
459
- }
460
-
461
- .foogallery-admin-help-button-cta.foogallery-admin-help-loading {
462
- position: relative;
463
- cursor: wait;
464
- }
465
-
466
- .foogallery-admin-help-button-cta .progress {
467
- border-radius: 5px;
468
- width: 0;
469
- background: #1897ff;
470
- opacity: 0;
471
- transition: all 0.3s ease;
472
- position: absolute;
473
- left: 0;
474
- top: 0;
475
- right: 0;
476
- bottom: 0;
477
- }
478
- .foogallery-admin-help-button-cta.foogallery-admin-help-loading .progress {
479
- opacity: 1;
480
- animation: progress-anim 5s ease 0s;
481
- animation-fill-mode: both;
482
- }
483
-
484
- @keyframes progress-anim {
485
- 0% {
486
- width: 0%;
487
- }
488
- 5% {
489
- width: 0%;
490
- }
491
- 10% {
492
- width: 15%;
493
- }
494
- 30% {
495
- width: 40%;
496
- }
497
- 50% {
498
- width: 55%;
499
- }
500
- 80% {
501
- width: 70%;
502
- }
503
- 90% {
504
- width: 80%;
505
- }
506
- 100% {
507
- width: 95%;
508
- }
509
- }
510
-
511
- .foogallery-admin-help-footer {
512
- margin: 0;
513
- color: #ffffff;
514
- text-align: center;
515
- padding: 20px;
516
- font-size: 1.3em;
517
- }
518
-
519
- .foogallery-admin-help-column .foogallery-admin-help-button-cta {
520
- min-width: auto;
521
- padding: 12px 24px;
522
- }
523
-
524
-
525
- @media screen and (max-width: 782px){
526
- .foogallery-admin-help nav {
527
- flex-wrap: wrap;
528
- }
529
- .foogallery-admin-help nav a {
530
- padding: 24px 24px 18px 24px;
531
- width: 50%;
532
- }
533
- }
534
-
535
- @media screen and (max-width: 600px){
536
- .fgah-feature > div,
537
- .fgah-feature-right > div {
538
- flex-direction: column;
539
- }
540
- .fgah-feature > div > *,
541
- .fgah-feature > div > figure {
542
- width: 100%;
543
- }
544
- .fgah-feature > div > figure + * {
545
- margin-top: 32px;
546
- }
547
- .fgah-feature > div > figure,
548
- .fgah-feature-right > div > figure {
549
- padding-right: 0;
550
- padding-left: 0;
551
- }
552
- }
553
-
554
- @media screen and (max-width: 400px){
555
- .foogallery-admin-help-button-cta {
556
- min-width: 150px;
557
- }
558
- }
559
-
560
-
561
- @media (hover: hover){
562
- .foogallery-admin-help a:hover {
563
- color: #0097de;
564
- }
565
  }
1
+ .foogallery_page_foogallery-help .fs-notice {
2
+ margin-right: 200px !important;
3
+ }
4
+
5
+
6
+ body {
7
+ background-color: #646970;/*#484c50;*/
8
+ }
9
+ #wpcontent {
10
+ padding-right: 20px;
11
+ box-sizing: border-box;
12
+ }
13
+ @media screen and (max-width: 782px){
14
+ .auto-fold #wpcontent {
15
+ padding-right: 10px;
16
+ }
17
+ }
18
+
19
+ .foogallery-admin-help,
20
+ .foogallery-admin-help * {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ .foogallery-admin-help {
25
+ max-width: 1000px;
26
+ margin: 24px auto;
27
+ clear: both;
28
+ background-color: #101517;
29
+ border-radius: 20px;
30
+ color: #ffffff;
31
+ font-size: 14px;
32
+ line-height: 1.4;
33
+ }
34
+
35
+ .foogallery-admin-help img {
36
+ display: block;
37
+ max-width: 100%;
38
+ height: auto;
39
+ box-sizing: border-box;
40
+ margin: 0 auto;
41
+ }
42
+ .foogallery-admin-help p {
43
+ margin: 0.8em 0;
44
+ font-size: 14px;
45
+ line-height: 1.4;
46
+ }
47
+ .foogallery-admin-help h2,
48
+ .foogallery-admin-help h3,
49
+ .foogallery-admin-help h4 {
50
+ color: inherit;
51
+ }
52
+
53
+ .foogallery-admin-help a {
54
+ color: #3582c4;
55
+ text-decoration: none;
56
+ }
57
+ .foogallery-admin-help a:focus {
58
+ box-shadow: none;
59
+ }
60
+ .foogallery-admin-help a:hover {
61
+ color: #4f94d4;
62
+ }
63
+
64
+ .foogallery-admin-help-header {
65
+ margin: 0;
66
+ color: #FFFFFF;
67
+ position: relative;
68
+ text-align: center;
69
+ padding: 20px;
70
+ }
71
+ .foogallery-admin-help-header > img {
72
+ margin: 3em auto;
73
+ }
74
+
75
+ .foogallery-admin-help-tagline {
76
+ margin: 0;
77
+ padding: 10px;
78
+ font-size: 1.5em;
79
+ }
80
+
81
+ .foogallery-admin-help-ribbon {
82
+ position: absolute;
83
+ right: -5px;
84
+ top: -5px;
85
+ z-index: 1;
86
+ overflow: hidden;
87
+ width: 75px;
88
+ height: 75px;
89
+ text-align: right;
90
+ }
91
+ .foogallery-admin-help-ribbon span {
92
+ font-size: 10px;
93
+ font-weight: bold;
94
+ color: #2b2400;
95
+ text-transform: uppercase;
96
+ text-align: center;
97
+ line-height: 20px;
98
+ transform: rotate(45deg);
99
+ width: 100px;
100
+ display: block;
101
+ background: #b04cff;
102
+ box-shadow: 0 3px 10px -5px rgba(0, 0, 0, 1);
103
+ position: absolute;
104
+ top: 19px; right: -21px;
105
+ }
106
+ .foogallery-admin-help-ribbon span::before {
107
+ content: "";
108
+ position: absolute;
109
+ left: 0;
110
+ top: 100%;
111
+ z-index: -1;
112
+ border-left: 3px solid #6a00b8;
113
+ border-right: 3px solid transparent;
114
+ border-bottom: 3px solid transparent;
115
+ border-top: 3px solid #6a00b8;
116
+ }
117
+ .foogallery-admin-help-ribbon span::after {
118
+ content: "";
119
+ position: absolute;
120
+ right: 0;
121
+ top: 100%;
122
+ z-index: -1;
123
+ border-left: 3px solid transparent;
124
+ border-right: 3px solid #6a00b8;
125
+ border-bottom: 3px solid transparent;
126
+ border-top: 3px solid #6a00b8;
127
+ }
128
+
129
+ .foogallery-admin-help nav {
130
+ background: #101517;/*#1d2327*/;
131
+ clear: both;
132
+ padding-top: 0;
133
+ color: #9ca2a7;
134
+ display: flex;
135
+ width: 100%;
136
+ max-width: 100%;
137
+ justify-content: stretch;
138
+ align-items: stretch;
139
+ flex-wrap: nowrap;
140
+ padding-left: 10px;
141
+ padding-right: 10px;
142
+ border-bottom: 3px solid #fff;
143
+ }
144
+
145
+ .foogallery-admin-help nav a {
146
+ display: block;
147
+ flex-grow: 1;
148
+ margin-left: 0;
149
+ padding: 24px 32px 18px 32px;
150
+ font-size: 1.3em;
151
+ line-height: 1.4;
152
+ border: 3px solid transparent;
153
+ border-top-left-radius: .6rem;
154
+ border-top-right-radius: .6rem;
155
+ background: transparent;
156
+ color: inherit;
157
+ text-decoration: none;
158
+ font-weight: 600;
159
+ box-shadow: none;
160
+ text-align: center;
161
+ }
162
+
163
+ .foogallery-admin-help nav a.foogallery-admin-help-tab-active {
164
+ background-color: #2c3338;
165
+ color: #ffffff;
166
+ border-color: #ffffff;
167
+ border-bottom: none;
168
+ border-bottom-color: #2c3338;
169
+ margin-bottom: -3px;
170
+ }
171
+
172
+ .fgah-feature {
173
+ display: block;
174
+ position: relative;
175
+ max-width: 100%;
176
+ margin: 0;
177
+ padding: 16px;
178
+ font-size: 14px;
179
+ background-color: #1d2327;
180
+ }
181
+ .fgah-feature:nth-child(odd) {
182
+ background-color: #2c3338;
183
+ }
184
+
185
+ .fgah-feature > * {
186
+ margin: 16px;
187
+ }
188
+ .fgah-feature > header + * {
189
+ margin-top: 32px;
190
+ }
191
+ .fgah-feature > * + footer {
192
+ margin-top: 32px;
193
+ }
194
+
195
+ .fgah-feature > header {
196
+ text-align: left;
197
+ }
198
+
199
+ .fgah-feature > header > h3 {
200
+ font-size: 1.5em;
201
+ margin: 0;
202
+ padding: 0;
203
+ font-weight: 600;
204
+ }
205
+ .fgah-feature > header > h3 + p {
206
+ margin-top: 24px;
207
+ }
208
+
209
+ .fgah-feature > footer {
210
+ text-align: center;
211
+ padding: 0;
212
+ }
213
+
214
+ .fgah-feature > footer > small {
215
+ display: block;
216
+ margin: 16px 0;
217
+ color: #c3c4c7;
218
+ }
219
+
220
+ .fgah-feature > footer > *:last-child {
221
+ margin-bottom: 0;
222
+ }
223
+
224
+ .fgah-feature > div {
225
+ display: flex;
226
+ flex-direction: row;
227
+ justify-content: center;
228
+ align-items: flex-start;
229
+ max-width: 100%;
230
+ }
231
+ .fgah-feature-right > div {
232
+ flex-direction: row-reverse;
233
+ }
234
+ .fgah-feature > div > * {
235
+ padding: 0;
236
+ margin: 0;
237
+ width: 33.33%;
238
+ }
239
+ .fgah-feature > div > figure {
240
+ width: 66.66%;
241
+ text-align: center;
242
+ padding-right: 32px;
243
+ }
244
+ .fgah-feature-right > div > figure {
245
+ padding-right: 0;
246
+ padding-left: 32px;
247
+ }
248
+
249
+ .fgah-feature > div > ol {
250
+
251
+ }
252
+ .fgah-feature > div > ol > li {
253
+ list-style-type: decimal;
254
+ margin: 0 2em;
255
+ padding: 0;
256
+ }
257
+
258
+ .fgah-feature > div > dl {
259
+
260
+ }
261
+ .fgah-feature > div > dl > dt {
262
+ font-size: large;
263
+ margin: 0 0 16px 0;
264
+ font-weight: 600;
265
+ }
266
+ .fgah-feature > div > dl > dt > code {
267
+ background-color: transparent;
268
+ font-size: inherit;
269
+ padding: 0;
270
+ margin: 0;
271
+ }
272
+ .fgah-feature > div > dl > dd {
273
+ font-size: inherit;
274
+ margin: 16px 0;
275
+ }
276
+ .fgah-feature > div > dl > dd + dt {
277
+ margin: 32px 0 16px 0;
278
+ }
279
+
280
+ .fgah-feature-pro {
281
+ counter-increment: number-counter;
282
+ }
283
+
284
+ .fgah-feature-pro > div > dl > dd > p > a {
285
+ text-decoration: underline;
286
+ }
287
+
288
+ .fgah-feature-pro > div > dl > dt::before {
289
+ content: counters(number-counter, ".") " ";
290
+ line-height: 30px;
291
+ display: inline-block;
292
+ min-width: 20px;
293
+ margin: 0 8px 0 0;
294
+ padding: 0 5px;
295
+ text-align: center;
296
+ vertical-align: 1px;
297
+ color: #fff;
298
+ border-radius: 3px;
299
+ background: #4098D7;
300
+ background: linear-gradient(45deg, #6638b8 0%, #4098D7 100%);
301
+ }
302
+
303
+ span.fgah-plan-prostarter {
304
+ color: #4098D7;
305
+ font-weight: bold;
306
+ }
307
+
308
+ .fgah-feature-pro.fgah-feature-plan-pro > div > dl > dt::before {
309
+ background: #2CA03D;
310
+ background: linear-gradient(45deg, #6638b8 0%, #2CA03D 100%);
311
+ }
312
+
313
+ span.fgah-plan-pro {
314
+ color: #2CA03D;
315
+ font-weight: bold;
316
+ }
317
+
318
+ .fgah-feature-pro.fgah-feature-plan-commerce > div > dl > dt::before {
319
+ background: #B0459D;
320
+ background: linear-gradient(45deg, #6638b8 0%, #B0459D 100%);
321
+ }
322
+
323
+ span.fgah-plan-commerce {
324
+ color: #B0459D;
325
+ font-weight: bold;
326
+ }
327
+
328
+ .fgah-feature-sub-title {
329
+ margin-bottom: 16px;
330
+ }
331
+
332
+ .fgah-feature-sub-title h4 {
333
+ margin: 0px 0px 5px 0;
334
+ }
335
+
336
+ .fgah-feature-sub-title span {
337
+ background: #6d6d6d;
338
+ color: #191a1f;
339
+ padding: 1px 6px;
340
+ border-radius: 3px;
341
+ margin-right: 3px;
342
+ font-weight: 500;
343
+ }
344
+
345
+ .fgah-feature-sub-title span.fgah-plan-prostarter {
346
+ background: #3397C1;
347
+ }
348
+
349
+ .fgah-feature-sub-title span.fgah-plan-pro {
350
+ background: #2CA03D;
351
+ }
352
+
353
+ .fgah-feature-sub-title span.fgah-plan-commerce {
354
+ background: #B0459D;
355
+ }
356
+
357
+ .fgah-help-list {
358
+ list-style-type: none;
359
+ }
360
+ .fgah-help-list li {
361
+ list-style-type: none;
362
+ margin: 0 0 16px 0;
363
+ padding: 0;
364
+ }
365
+ .fgah-help-list li:last-child {
366
+ margin-bottom: 0;
367
+ }
368
+ .fgah-help-list li::before {
369
+ content: "\003F";
370
+ display: inline-block;
371
+ background-color: #1897ff;
372
+ color: #FFFFFF;
373
+ border-radius: 50%;
374
+ line-height: 1;
375
+ width: 1em;
376
+ height: 1em;
377
+ padding: 0.14em;
378
+ text-align: center;
379
+ margin-right: 0.4em;
380
+ border: solid 2px #FFFFFF;
381
+ float: left;
382
+ }
383
+
384
+ .fgah-demo {
385
+ display: block;
386
+ position: relative;
387
+ max-width: 100%;
388
+ margin: 0;
389
+ padding: 16px;
390
+ font-size: 14px;
391
+ background-color: #2c3338;
392
+ }
393
+ .fgah-demo > header {
394
+ text-align: left;
395
+ margin: 16px;
396
+ }
397
+ .fgah-demo > header + * {
398
+ margin-top: 32px;
399
+ }
400
+ .fgah-demo > header > h3 {
401
+ font-size: 1.5em;
402
+ margin: 0;
403
+ padding: 0;
404
+ font-weight: 600;
405
+ }
406
+ .fgah-demo > header > h3 + p {
407
+ margin-top: 24px;
408
+ }
409
+ .fgah-demo > div.foogallery {
410
+ margin-bottom: 15px;
411
+ }
412
+
413
+ .foogallery-admin-help-button {
414
+ position: relative;
415
+ background-color: #7d4fff;
416
+ color: #ffffff !important;
417
+ padding: 10px 20px;
418
+ font-size: 1em;
419
+ border-radius: 3px;
420
+ text-decoration: none;
421
+ font-weight: 400;
422
+ display: inline-block;
423
+ text-align: center;
424
+ line-height: 1.2;
425
+ border: none;
426
+ box-shadow: none;
427
+ outline: none;
428
+ cursor: pointer;
429
+ transition: background-color .1s ease-in-out;
430
+ }
431
+
432
+ .foogallery-admin-help-button-active {
433
+ background-color: #1897ff;
434
+ }
435
+
436
+ .foogallery-admin-help-button-cta {
437
+ position: relative;
438
+ background-color: #7d4fff;
439
+ color: #ffffff !important;
440
+ padding: 12px 36px;
441
+ font-size: 1.3em;
442
+ border-radius: 5px;
443
+ text-decoration: none;
444
+ font-weight: 600;
445
+ display: inline-block;
446
+ min-width: 250px;
447
+ text-align: center;
448
+ line-height: 1.4;
449
+ border: none;
450
+ box-shadow: none;
451
+ outline: none;
452
+ cursor: pointer;
453
+ transition: background-color .1s ease-in-out;
454
+ }
455
+
456
+ .foogallery-admin-help-button-cta:hover,
457
+ .foogallery-admin-help-button-cta:focus {
458
+ background-color: #5234a7;
459
+ }
460
+
461
+ .foogallery-admin-help-button-cta.foogallery-admin-help-loading {
462
+ position: relative;
463
+ cursor: wait;
464
+ }
465
+
466
+ .foogallery-admin-help-button-cta .progress {
467
+ border-radius: 5px;
468
+ width: 0;
469
+ background: #1897ff;
470
+ opacity: 0;
471
+ transition: all 0.3s ease;
472
+ position: absolute;
473
+ left: 0;
474
+ top: 0;
475
+ right: 0;
476
+ bottom: 0;
477
+ }
478
+ .foogallery-admin-help-button-cta.foogallery-admin-help-loading .progress {
479
+ opacity: 1;
480
+ animation: progress-anim 5s ease 0s;
481
+ animation-fill-mode: both;
482
+ }
483
+
484
+ @keyframes progress-anim {
485
+ 0% {
486
+ width: 0%;
487
+ }
488
+ 5% {
489
+ width: 0%;
490
+ }
491
+ 10% {
492
+ width: 15%;
493
+ }
494
+ 30% {
495
+ width: 40%;
496
+ }
497
+ 50% {
498
+ width: 55%;
499
+ }
500
+ 80% {
501
+ width: 70%;
502
+ }
503
+ 90% {
504
+ width: 80%;
505
+ }
506
+ 100% {
507
+ width: 95%;
508
+ }
509
+ }
510
+
511
+ .foogallery-admin-help-footer {
512
+ margin: 0;
513
+ color: #ffffff;
514
+ text-align: center;
515
+ padding: 20px;
516
+ font-size: 1.3em;
517
+ }
518
+
519
+ .foogallery-admin-help-column .foogallery-admin-help-button-cta {
520
+ min-width: auto;
521
+ padding: 12px 24px;
522
+ }
523
+
524
+
525
+ @media screen and (max-width: 782px){
526
+ .foogallery-admin-help nav {
527
+ flex-wrap: wrap;
528
+ }
529
+ .foogallery-admin-help nav a {
530
+ padding: 24px 24px 18px 24px;
531
+ width: 50%;
532
+ }
533
+ }
534
+
535
+ @media screen and (max-width: 600px){
536
+ .fgah-feature > div,
537
+ .fgah-feature-right > div {
538
+ flex-direction: column;
539
+ }
540
+ .fgah-feature > div > *,
541
+ .fgah-feature > div > figure {
542
+ width: 100%;
543
+ }
544
+ .fgah-feature > div > figure + * {
545
+ margin-top: 32px;
546
+ }
547
+ .fgah-feature > div > figure,
548
+ .fgah-feature-right > div > figure {
549
+ padding-right: 0;
550
+ padding-left: 0;
551
+ }
552
+ }
553
+
554
+ @media screen and (max-width: 400px){
555
+ .foogallery-admin-help-button-cta {
556
+ min-width: 150px;
557
+ }
558
+ }
559
+
560
+
561
+ @media (hover: hover){
562
+ .foogallery-admin-help a:hover {
563
+ color: #0097de;
564
+ }
565
  }
css/admin-page-foogallery-settings.css CHANGED
@@ -1,45 +1,45 @@
1
- #foogallery-settings-main div+br {
2
- display: none;
3
- }
4
-
5
- #custom_assets_tab textarea {
6
- width: 500px;
7
- height: 300px;
8
- }
9
-
10
- .foogallery_settings_radioicon label {
11
- display:inline-block;
12
- margin-right:10px;
13
- border:solid 3px transparent;
14
- background:#aaa;
15
- border-radius: 3px;
16
- -moz-border-radius: 3px;
17
- -webkit-border-radius: 3px;
18
- padding:5px;
19
- line-height: 0;
20
- margin-bottom: 10px;
21
- }
22
-
23
- .foogallery_settings_radioicon input:checked + label {
24
- border:solid 3px #444;
25
- background: #888;
26
- }
27
-
28
- .foogallery_settings_radioicon label:hover {
29
- border:solid 3px #444;
30
- }
31
-
32
- .foogallery_settings_short_text {
33
- width: 5em;
34
- }
35
-
36
- .foogallery_settings_long_text {
37
- width: 50em;
38
- }
39
-
40
- tr.foogallery_settings_radio td input[type="radio"] {
41
- margin: 0.25rem 0.25rem 0.5rem 0;
42
- }
43
- tr.foogallery_settings_radio td input[type="radio"] + label {
44
- vertical-align: text-top;
45
  }
1
+ #foogallery-settings-main div+br {
2
+ display: none;
3
+ }
4
+
5
+ #custom_assets_tab textarea {
6
+ width: 500px;
7
+ height: 300px;
8
+ }
9
+
10
+ .foogallery_settings_radioicon label {
11
+ display:inline-block;
12
+ margin-right:10px;
13
+ border:solid 3px transparent;
14
+ background:#aaa;
15
+ border-radius: 3px;
16
+ -moz-border-radius: 3px;
17
+ -webkit-border-radius: 3px;
18
+ padding:5px;
19
+ line-height: 0;
20
+ margin-bottom: 10px;
21
+ }
22
+
23
+ .foogallery_settings_radioicon input:checked + label {
24
+ border:solid 3px #444;
25
+ background: #888;
26
+ }
27
+
28
+ .foogallery_settings_radioicon label:hover {
29
+ border:solid 3px #444;
30
+ }
31
+
32
+ .foogallery_settings_short_text {
33
+ width: 5em;
34
+ }
35
+
36
+ .foogallery_settings_long_text {
37
+ width: 50em;
38
+ }
39
+
40
+ tr.foogallery_settings_radio td input[type="radio"] {
41
+ margin: 0.25rem 0.25rem 0.5rem 0;
42
+ }
43
+ tr.foogallery_settings_radio td input[type="radio"] + label {
44
+ vertical-align: text-top;
45
  }
css/admin-tinymce.css CHANGED
@@ -1,115 +1,115 @@
1
- .mce-content-body div.foogallery-tinymce-view {
2
- background-color: rgba(0, 0, 0, 0.1);
3
- position: relative;
4
- margin-bottom: 16px;
5
- border: 1px solid rgba(0, 0, 0, 0);
6
- width: 99.99%;
7
- clear: both;
8
- height: 250px;
9
- text-align: center;
10
- }
11
-
12
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar {
13
- display: none;
14
- position: absolute;
15
- top: 0;
16
- left: 0;
17
- z-index: 100;
18
- }
19
-
20
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons {
21
- margin-top: 7px;
22
- margin-left: 7px;
23
- padding: 2px;
24
- width: 30px;
25
- height: 30px;
26
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
27
- background-color: #000;
28
- background-color: rgba(0, 0, 0, 0.9);
29
- cursor: pointer;
30
- color: #FFF;
31
- font-size: 30px;
32
- }
33
-
34
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons:hover {
35
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
36
- background-color: #000;
37
- color: #2EA2CC;
38
- }
39
-
40
- .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected {
41
- border-color: rgba(0, 0, 0, 0.3);
42
- }
43
-
44
- .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected .foogallery-tinymce-toolbar {
45
- display: block;
46
- }
47
-
48
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile {
49
- position: absolute;
50
- z-index: 10;
51
- left: 50%;
52
- top: 50%;
53
- margin-left: -83px;
54
- margin-top: -95px;
55
- }
56
-
57
- /* Image styles */
58
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile .foogallery-pile-inner { max-width: 100%; height: auto; vertical-align: bottom; border: 8px solid #fff;
59
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
60
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
61
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
62
- overflow: hidden;
63
- background: #CCC;
64
- font-size: 0;
65
- }
66
-
67
- /* Stacks creted by the use of generated content */
68
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before, .foogallery-pile:after { content: ""; width: 100%; height: 100%; position: absolute; border: 8px solid #fff; left: 0;
69
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
70
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
71
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
72
- -webkit-box-sizing: border-box;
73
- -moz-box-sizing: border-box;
74
- box-sizing: border-box;
75
- }
76
- /* 1st element in stack (behind image) */
77
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before {
78
- top: 0;
79
- z-index: -10;
80
- -webkit-transform: rotate(-3deg);
81
- -moz-transform: rotate(-3deg);
82
- transform: rotate(-3deg);
83
- }
84
- /* 2nd element in stack (behind image) */
85
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:after {
86
- top: 1px;
87
- z-index: -20;
88
- -webkit-transform: rotate(4deg);
89
- -moz-transform: rotate(4deg);
90
- transform: rotate(4deg);
91
- }
92
-
93
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile-inner img {
94
- max-width: 150px;
95
- }
96
-
97
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-title {
98
- font-family: "Open Sans", sans-serif;
99
- font-size: 1.2em;
100
- color: #666;
101
- position: absolute;
102
- bottom: 1em;
103
- width: 100%;
104
- left: 0;
105
- }
106
-
107
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-count {
108
- font-family: "Open Sans", sans-serif;
109
- font-size: 0.7em;
110
- color: #888;
111
- position: absolute;
112
- bottom: 0.5em;
113
- width: 100%;
114
- left: 0;
115
  }
1
+ .mce-content-body div.foogallery-tinymce-view {
2
+ background-color: rgba(0, 0, 0, 0.1);
3
+ position: relative;
4
+ margin-bottom: 16px;
5
+ border: 1px solid rgba(0, 0, 0, 0);
6
+ width: 99.99%;
7
+ clear: both;
8
+ height: 250px;
9
+ text-align: center;
10
+ }
11
+
12
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar {
13
+ display: none;
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ z-index: 100;
18
+ }
19
+
20
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons {
21
+ margin-top: 7px;
22
+ margin-left: 7px;
23
+ padding: 2px;
24
+ width: 30px;
25
+ height: 30px;
26
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
27
+ background-color: #000;
28
+ background-color: rgba(0, 0, 0, 0.9);
29
+ cursor: pointer;
30
+ color: #FFF;
31
+ font-size: 30px;
32
+ }
33
+
34
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons:hover {
35
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
36
+ background-color: #000;
37
+ color: #2EA2CC;
38
+ }
39
+
40
+ .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected {
41
+ border-color: rgba(0, 0, 0, 0.3);
42
+ }
43
+
44
+ .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected .foogallery-tinymce-toolbar {
45
+ display: block;
46
+ }
47
+
48
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile {
49
+ position: absolute;
50
+ z-index: 10;
51
+ left: 50%;
52
+ top: 50%;
53
+ margin-left: -83px;
54
+ margin-top: -95px;
55
+ }
56
+
57
+ /* Image styles */
58
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile .foogallery-pile-inner { max-width: 100%; height: auto; vertical-align: bottom; border: 8px solid #fff;
59
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
60
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
61
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
62
+ overflow: hidden;
63
+ background: #CCC;
64
+ font-size: 0;
65
+ }
66
+
67
+ /* Stacks creted by the use of generated content */
68
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before, .foogallery-pile:after { content: ""; width: 100%; height: 100%; position: absolute; border: 8px solid #fff; left: 0;
69
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
70
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
71
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
72
+ -webkit-box-sizing: border-box;
73
+ -moz-box-sizing: border-box;
74
+ box-sizing: border-box;
75
+ }
76
+ /* 1st element in stack (behind image) */
77
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before {
78
+ top: 0;
79
+ z-index: -10;
80
+ -webkit-transform: rotate(-3deg);
81
+ -moz-transform: rotate(-3deg);
82
+ transform: rotate(-3deg);
83
+ }
84
+ /* 2nd element in stack (behind image) */
85
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:after {
86
+ top: 1px;
87
+ z-index: -20;
88
+ -webkit-transform: rotate(4deg);
89
+ -moz-transform: rotate(4deg);
90
+ transform: rotate(4deg);
91
+ }
92
+
93
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile-inner img {
94
+ max-width: 150px;
95
+ }
96
+
97
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-title {
98
+ font-family: "Open Sans", sans-serif;
99
+ font-size: 1.2em;
100
+ color: #666;
101
+ position: absolute;
102
+ bottom: 1em;
103
+ width: 100%;
104
+ left: 0;
105
+ }
106
+
107
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-count {
108
+ font-family: "Open Sans", sans-serif;
109
+ font-size: 0.7em;
110
+ color: #888;
111
+ position: absolute;
112
+ bottom: 0.5em;
113
+ width: 100%;
114
+ left: 0;
115
  }
css/foogallery-foovideo-overrides.css CHANGED
@@ -1,96 +1,96 @@
1
- /* sticky video icon states */
2
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb,
3
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb,
4
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb,
5
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb,
6
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb {
7
- transform: translateY(0) translateX(0) translateZ(0);
8
- }
9
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb,
10
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb,
11
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb,
12
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb,
13
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb {
14
- transform: translateY(0) translateX(0) translateZ(0);
15
- }
16
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb:before,
17
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
18
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
19
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
20
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb:before {
21
- content: '';
22
- display: block;
23
- top: 0;
24
- left: 0;
25
- bottom: 0;
26
- right: 0;
27
- visibility: visible;
28
- opacity: 1;
29
- background-color: rgba(0,0,0,0);
30
- transition-timing-function: ease;
31
- transition-duration: 300ms;
32
- transition-property: opacity,visibility,background-color;
33
- transform: translateY(0) translateX(0) translateZ(0);
34
- z-index: 8;
35
- }
36
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb:before,
37
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb:before,
38
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb:before,
39
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb:before,
40
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb:before {
41
- background-color: rgba(0,0,0,0.5);
42
- }
43
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
44
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
45
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
46
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
47
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
48
- display: none;
49
- }
50
-
51
- /* The icons */
52
- .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
53
- .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
54
- .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
55
- .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
56
- .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
57
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
58
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
59
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
60
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
61
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
62
- background-size: 60px 60px;
63
- }
64
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
65
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
66
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
67
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
68
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
69
- width: 60px;
70
- height: 60px;
71
- }
72
-
73
- .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
74
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before {
75
- background-image: url('data:image/png;base64,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')!important;
76
- }
77
-
78
- .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
79
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before {
80
- background-image: url('data:image/png;base64,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')!important;
81
- }
82
-
83
- .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
84
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before {
85
- background-image: url('data:image/png;base64,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')!important;
86
- }
87
-
88
- .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
89
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before {
90
- background-image: url('data:image/png;base64,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')!important;
91
- }
92
-
93
- .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
94
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
95
- background-image: url(data:image/png;base64,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)!important;
96
  }
1
+ /* sticky video icon states */
2
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb,
3
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb,
4
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb,
5
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb,
6
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb {
7
+ transform: translateY(0) translateX(0) translateZ(0);
8
+ }
9
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb,
10
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb,
11
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb,
12
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb,
13
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb {
14
+ transform: translateY(0) translateX(0) translateZ(0);
15
+ }
16
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb:before,
17
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
18
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
19
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
20
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb:before {
21
+ content: '';
22
+ display: block;
23
+ top: 0;
24
+ left: 0;
25
+ bottom: 0;
26
+ right: 0;
27
+ visibility: visible;
28
+ opacity: 1;
29
+ background-color: rgba(0,0,0,0);
30
+ transition-timing-function: ease;
31
+ transition-duration: 300ms;
32
+ transition-property: opacity,visibility,background-color;
33
+ transform: translateY(0) translateX(0) translateZ(0);
34
+ z-index: 8;
35
+ }
36
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb:before,
37
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb:before,
38
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb:before,
39
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb:before,
40
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb:before {
41
+ background-color: rgba(0,0,0,0.5);
42
+ }
43
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
44
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
45
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
46
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
47
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
48
+ display: none;
49
+ }
50
+
51
+ /* The icons */
52
+ .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
53
+ .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
54
+ .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
55
+ .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
56
+ .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
57
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
58
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
59
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
60
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
61
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
62
+ background-size: 60px 60px;
63
+ }
64
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
65
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
66
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
67
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
68
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
69
+ width: 60px;
70
+ height: 60px;
71
+ }
72
+
73
+ .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
74
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before {
75
+ background-image: url('data:image/png;base64,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')!important;
76
+ }
77
+
78
+ .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
79
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before {
80
+ background-image: url('data:image/png;base64,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')!important;
81
+ }
82
+
83
+ .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
84
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before {
85
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACAtJREFUeNrcW1uMHEcVrZ6ZnUlEEITwkvgBgvAHCuGDh5CjdE933Xurqnfej15iyzaPALIXJ5gkBDs4xnYU5BiUjyWKhIjyESELFCHCwwFkEQkElqJABAIpHybJB0osCxMwjsHZpPjo7pmanp7d2d2eWe+21OpR393uuvfcuqcepxnnDuPcyXPuWJw7uei0OHcKI2zxvZXY8iNs1ipsuYStsIQtvvbaF98sRNdi9A+l6A9mojMX3TNthRG2fMIWP7OYYistY8ul2KyErRCdZtstwxb7lePcKTAjIqUUZwsjnF0qEGsJUrLRSduoIMW2qxK2IRBZAoVko/NjOrQa9LJANi0r05CNbT2HrSg6k0RvLchay6C3HLK9FGdrTNW1IpuGgmkbF1nL6IJpz4xtFjP66ZWAbHENyBaWQjYOIIvK9rgFKllxZ6bQZ0cVKBPZcbKlaCK8FmStJZC1Vohsfg3IlpZANr43kpaWQ29SyI5DPSvpsyNpadx+uQoutaNG24bNTtqMhtnL9cvcCvpssu0DtDRGGtuGzS5y7jDu2dHwzWYcyuE1rAvRPY9xbjMAYBxcxnmZAXDGudO7cuA9W3i1+9f4Of3fUXttK2qPtVSfTQZpDFqyC/2XulEDXQZIDKB8tZD+mwHxOiRxvV9p3cA5OhxrEkVlG4raF1C2bkdRuVf4wWEU9W+hbD1IsrWAov4wqc4Citp3SHWOk6x/U6jWQRT1O1HU9qBsbucgGh5UbiYhP06i+gFAfLfn4Vs97pUAeCEMphMGajA4o2oRMwfdSWfDBwg1A+TfiKTaJNtfQaotoGz9mFT3tyRbfxb+3BlSnXOkggvkB4ukAp1+dlN+d1Nsw38v/OANUsGrpDrnUXZfRNn6K6nOaZKtkyRb30VRO4Cish1E5ROIeB2EWVVISf+CSUuGs2G0kKpdUsEzpILXRzeouw7nqCAFmlTwPIrafgB+dZT+A3SbRksMoMxI1vetn0NrDwjK5gmPl61EQev14V4EPM9myq9+WMzO/W9jOtt3GqiyE8A261SeJZwtKYWsWp+7G2VHb3SHOTZO246dA+hlcM5cYShy7uQBbEay9tjGTef+ibJz1vXK7wwpLByMJGjJzgMgI9V9aqM7Gzl8aetNN78vKsIDtBQPF/Ouq0oou89tBodJBa8D0scih9NoyWYcvPeQ6v4j65fvP3BUHz76wPQLF/pO5GPJRDjs1OCwar39QeEHmVbonZ+e14uLi1prrX/91G/0th1fnB49UWUuQtiKq7RlDjiQ6KasC9aeL31Vm8dLL53V++74+nQcFpW9BsL5xGzJZiQqftYO756/SyePy5cv6++feFzL2bmJOi1U8xBAuTeENmmpxLnDUFQ/NQ2H4+OZPzyrd31mfoIIVxfMVZ0kLTEkf36aDmut9fl/vqKPHV+YFDU9wrnX26Fg5kyCg8tItvZl/dLlHI6PJ544qSv1bRkj3Hjc2G6ZGaIlQP/QtBE2jzN/e0Hvve3uDN/f+QkAsGjBwhqkJV5mIBpH1tNhrbW+ePGifiCTFA80ysavIlBTaAlchqJx/3o7rLXW58+/ov3qLRk43DoVLQj0FvF680XgDhOqed96O3zp0n/1Qw8/ks37ZfsX4fpYuHY3SEvgMlLNA+tVtLTW+vkXXtR7b/9alkXrZ+GaV7itygbXf20GNHvXeiH885OndLOzSws/y4B3ToSro/bMEC0BuEz67VunjfC/L1zQ993/4GTWvmTt0WgsPUBLBc6dIoDDSKht00T4j8/+Se+ev1MLP5jQwKP57agPl5K0ZHFuMxQ1nJbDP/jhjybmaH9dq3bvkrMlQPpk1i8eni29rA/cc3QqU8RKrbmHyB09W0JSW0gFl7J86a7Pzvec/f3pp/Ut2z8/tUUA6bcaiG6PjcydhyLnDgPEt4c7Cdm++NDhY/rY8YUJp/BwSrue50UpXTCXeGJaynGAN5Hq/mWTrGm9gaRujBwuDs+WuDPDgTOUrVObYZmWVPAfQLreoKXCAC1FBYyRbH5vczjcPsu5+zZz+JyYLTmlcF+p+uXN4XD3l8bUMGdW6Zy5GO+B2CL8uX9t9K0WFLWaMTVMo6W4eJWZbbs1EJ1Xp1tVM3X2SF+J0JNkDNFSTzdh21sZB+EK1XmSVOfv4Yb0qI3rK2Jf+DWSnXPCnzutZhuf41C2omI1oCxK0FJfLQMQ7xW7jIN4C5DaguR7KBs7UNQOgmw9hKL+U1Ld35FqP0cqeJlU9wKp7mujVQCrOhdJBRdJBedQts+Q6j5NsvkkyeajKNtHkPzdKBoEKD/Cgb8DSVoAsfRhQIhTTO4tjRCC2PlBUYkTilcifQUgMg7uNUDyWgB4v+vhhwDFVpIVjjTbRPJ3kKzfijS7D2XzDqTZgygaB4WsHUFR/QaK+j1Is/tRNm9Dmt2DoroTRaUDKBSK6lZA/CiQei+SeJfHy9cAkhXrTELNiW1oPGxmCF3SpFKptDSmUNOO0j+cZw4GJlV9YzQsRe0zLExJOR3Wf19fA70S6WOafHjVoq8xbDMJW3GKotYhWlqpULO0hLNXgtg81cZS0BtbqJkh6tMStVpJycNKhJrrjexqRK0DtDSJPrtSZCcpah2YLa2lz06jX+YyEJun0lJuJULNMaT4kwzSqmlpPRs9Topn8enPVUn5cG4Vn8hkUbyy7LO5Jb5z6mWsmdKWkSKWUe0KRlAKic/fVmOzEp/NFYwtW8voRsvZZlKeOcrW+xzw/wMAILDvruEbvv8AAAAASUVORK5CYII=')!important;
86
+ }
87
+
88
+ .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
89
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before {
90
+ background-image: url('data:image/png;base64,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')!important;
91
+ }
92
+
93
+ .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
94
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
95
+ background-image: url(data:image/png;base64,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)!important;
96
  }
css/foogallery.admin.datasources.css CHANGED
@@ -1,123 +1,123 @@
1
- .foogallery-datasource-modal-title {
2
- position: absolute;
3
- top: 0;
4
- left: 0;
5
- right: 0;
6
- height: 50px;
7
- z-index: 200;
8
- padding-left: 16px;
9
- border-bottom: 1px solid #ddd;
10
- }
11
-
12
- .foogallery-datasource-modal-sidebar {
13
- position: absolute;
14
- top: 51px;
15
- left: 0;
16
- bottom: 0;
17
- width: 200px;
18
- z-index: 75;
19
- background: #f3f3f3;
20
- overflow: auto;
21
- -webkit-overflow-scrolling: touch;
22
- }
23
-
24
- .foogallery-datasource-modal-sidebar-menu {
25
- position: absolute;
26
- top: 0;
27
- left: 0;
28
- right: 0;
29
- bottom: 0;
30
- margin: 0;
31
- padding: 10px 0;
32
- background: #f3f3f3;
33
- border-right-width: 1px;
34
- border-right-style: solid;
35
- border-right-color: #ccc;
36
- -webkit-user-select: none;
37
- -moz-user-select: none;
38
- -ms-user-select: none;
39
- user-select: none
40
- }
41
-
42
- .foogallery-datasource-modal-sidebar-menu>a {
43
- display: block;
44
- position: relative;
45
- padding: 8px 20px;
46
- margin: 0;
47
- line-height: 18px;
48
- font-size: 14px;
49
- color: #0073aa;
50
- text-decoration: none;
51
- }
52
-
53
- .foogallery-datasource-modal-sidebar-menu>a:hover {
54
- color: #0073aa;
55
- background: rgba(0,0,0,.04)
56
- }
57
-
58
- .foogallery-datasource-modal-sidebar-menu .active,
59
- .foogallery-datasource-modal-sidebar-menu .active:hover{
60
- color: #23282d;
61
- font-weight: 600;
62
- background: rgba(0,0,0,.04);
63
- }
64
-
65
- .foogallery-datasource-modal-sidebar-menu>a,
66
- .foogallery-datasource-modal-sidebar-menu>a:active,
67
- .foogallery-datasource-modal-sidebar-menu>a:hover,
68
- .foogallery-datasource-modal-sidebar-menu>a:focus {
69
- box-shadow: none;
70
- outline: 0
71
- }
72
-
73
- .media-menu .separator {
74
- height: 0;
75
- margin: 12px 20px;
76
- padding: 0;
77
- border-top: 1px solid #ddd
78
- }
79
-
80
- .foogallery-datasource-modal-container {
81
- position: absolute;
82
- top: 51px;
83
- padding: 16px;
84
- left: 200px;
85
- right: 0;
86
- bottom: 60px;
87
- overflow: auto;
88
- outline: 0;
89
- }
90
-
91
- .foogallery-datasource-modal-toolbar {
92
- position: absolute;
93
- left: 200px;
94
- right: 0;
95
- z-index: 100;
96
- bottom: 60px;
97
- height: auto;
98
- border-top: 1px solid #ddd;
99
- }
100
-
101
- .foogallery-datasource-modal-toolbar-inner {
102
- position: absolute;
103
- top: 0;
104
- left: 0;
105
- right: 0;
106
- bottom: -45px;
107
- height: 60px;
108
- padding: 0 16px;
109
- overflow: hidden;
110
- }
111
-
112
- .foogallery-datasource-modal-container-inner .spinner {
113
- float: left;
114
- }
115
-
116
- .foogallery-datasource-modal-insert {
117
- float: right;
118
- }
119
-
120
- .foogallery-datasource-item {
121
- padding: 20px;
122
- text-align: center;
123
  }
1
+ .foogallery-datasource-modal-title {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ right: 0;
6
+ height: 50px;
7
+ z-index: 200;
8
+ padding-left: 16px;
9
+ border-bottom: 1px solid #ddd;
10
+ }
11
+
12
+ .foogallery-datasource-modal-sidebar {
13
+ position: absolute;
14
+ top: 51px;
15
+ left: 0;
16
+ bottom: 0;
17
+ width: 200px;
18
+ z-index: 75;
19
+ background: #f3f3f3;
20
+ overflow: auto;
21
+ -webkit-overflow-scrolling: touch;
22
+ }
23
+
24
+ .foogallery-datasource-modal-sidebar-menu {
25
+ position: absolute;
26
+ top: 0;
27
+ left: 0;
28
+ right: 0;
29
+ bottom: 0;
30
+ margin: 0;
31
+ padding: 10px 0;
32
+ background: #f3f3f3;
33
+ border-right-width: 1px;
34
+ border-right-style: solid;
35
+ border-right-color: #ccc;
36
+ -webkit-user-select: none;
37
+ -moz-user-select: none;
38
+ -ms-user-select: none;
39
+ user-select: none
40
+ }
41
+
42
+ .foogallery-datasource-modal-sidebar-menu>a {
43
+ display: block;
44
+ position: relative;
45
+ padding: 8px 20px;
46
+ margin: 0;
47
+ line-height: 18px;
48
+ font-size: 14px;
49
+ color: #0073aa;
50
+ text-decoration: none;
51
+ }
52
+
53
+ .foogallery-datasource-modal-sidebar-menu>a:hover {
54
+ color: #0073aa;
55
+ background: rgba(0,0,0,.04)
56
+ }
57
+
58
+ .foogallery-datasource-modal-sidebar-menu .active,
59
+ .foogallery-datasource-modal-sidebar-menu .active:hover{
60
+ color: #23282d;
61
+ font-weight: 600;
62
+ background: rgba(0,0,0,.04);
63
+ }
64
+
65
+ .foogallery-datasource-modal-sidebar-menu>a,
66
+ .foogallery-datasource-modal-sidebar-menu>a:active,
67
+ .foogallery-datasource-modal-sidebar-menu>a:hover,
68
+ .foogallery-datasource-modal-sidebar-menu>a:focus {
69
+ box-shadow: none;
70
+ outline: 0
71
+ }
72
+
73
+ .media-menu .separator {
74
+ height: 0;
75
+ margin: 12px 20px;
76
+ padding: 0;
77
+ border-top: 1px solid #ddd
78
+ }
79
+
80
+ .foogallery-datasource-modal-container {
81
+ position: absolute;
82
+ top: 51px;
83
+ padding: 16px;
84
+ left: 200px;
85
+ right: 0;
86
+ bottom: 60px;
87
+ overflow: auto;
88
+ outline: 0;
89
+ }
90
+
91
+ .foogallery-datasource-modal-toolbar {
92
+ position: absolute;
93
+ left: 200px;
94
+ right: 0;
95
+ z-index: 100;
96
+ bottom: 60px;
97
+ height: auto;
98
+ border-top: 1px solid #ddd;
99
+ }
100
+
101
+ .foogallery-datasource-modal-toolbar-inner {
102
+ position: absolute;
103
+ top: 0;
104
+ left: 0;
105
+ right: 0;
106
+ bottom: -45px;
107
+ height: 60px;
108
+ padding: 0 16px;
109
+ overflow: hidden;
110
+ }
111
+
112
+ .foogallery-datasource-modal-container-inner .spinner {
113
+ float: left;
114
+ }
115
+
116
+ .foogallery-datasource-modal-insert {
117
+ float: right;
118
+ }
119
+
120
+ .foogallery-datasource-item {
121
+ padding: 20px;
122
+ text-align: center;
123
  }
extensions/albums/admin/class-columns.php CHANGED
@@ -1,73 +1,73 @@
1
- <?php
2
- /*
3
- * FooGallery Admin Columns class
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Albums_Admin_Columns' ) ) {
7
-
8
- class FooGallery_Albums_Admin_Columns {
9
-
10
- private $include_clipboard_script = false;
11
-
12
- function __construct() {
13
- add_filter( 'manage_edit-' . FOOGALLERY_CPT_ALBUM . '_columns', array( $this, 'album_custom_columns' ) );
14
- add_action( 'manage_posts_custom_column', array( $this, 'album_custom_column_content' ) );
15
- add_action( 'admin_footer', array( $this, 'include_clipboard_script' ) );
16
- }
17
-
18
- function album_custom_columns( $columns ) {
19
- $columns[FOOGALLERY_CPT_ALBUM . '_template'] = __( 'Template', 'foogallery' );
20
- $columns[FOOGALLERY_CPT_ALBUM . '_galleries'] = __( 'Galleries', 'foogallery' );
21
- $columns[FOOGALLERY_CPT_ALBUM . '_shortcode'] = __( 'Shortcode', 'foogallery' );
22
-
23
- return $columns;
24
- }
25
-
26
- function album_custom_column_content( $column ) {
27
- global $post;
28
-
29
- switch ( $column ) {
30
- case FOOGALLERY_CPT_ALBUM . '_template':
31
- $album = FooGalleryAlbum::get( $post );
32
- $template = $album->album_template_details();
33
- if ( false !== $template ) {
34
- echo $template['name'];
35
- }
36
- break;
37
- case FOOGALLERY_CPT_ALBUM . '_galleries':
38
- $album = FooGalleryAlbum::get( $post );
39
- echo $album->gallery_count();
40
- break;
41
- case FOOGALLERY_CPT_ALBUM . '_shortcode':
42
- $album = FooGalleryAlbum::get( $post );
43
- $shortcode = $album->shortcode();
44
- echo '<input type="text" readonly="readonly" size="' . strlen( $shortcode ) . '" value="' . esc_attr( $shortcode ) . '" class="foogallery-shortcode" />';
45
- $this->include_clipboard_script = true;
46
- break;
47
- }
48
- }
49
-
50
- function include_clipboard_script() {
51
- if ( $this->include_clipboard_script ) { ?>
52
- <script>
53
- jQuery(function($) {
54
- $('.foogallery-shortcode').on('click', function () {
55
- try {
56
- //select the contents
57
- this.select();
58
- //copy the selection
59
- document.execCommand('copy');
60
- //show the copied message
61
- $('.foogallery-shortcode-message').remove();
62
- $(this).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
63
- } catch(err) {
64
- console.log('Oops, unable to copy!');
65
- }
66
- });
67
- });
68
- </script>
69
- <?php
70
- }
71
- }
72
- }
73
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Admin Columns class
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Albums_Admin_Columns' ) ) {
7
+
8
+ class FooGallery_Albums_Admin_Columns {
9
+
10
+ private $include_clipboard_script = false;
11
+
12
+ function __construct() {
13
+ add_filter( 'manage_edit-' . FOOGALLERY_CPT_ALBUM . '_columns', array( $this, 'album_custom_columns' ) );
14
+ add_action( 'manage_posts_custom_column', array( $this, 'album_custom_column_content' ) );
15
+ add_action( 'admin_footer', array( $this, 'include_clipboard_script' ) );
16
+ }
17
+
18
+ function album_custom_columns( $columns ) {
19
+ $columns[FOOGALLERY_CPT_ALBUM . '_template'] = __( 'Template', 'foogallery' );
20
+ $columns[FOOGALLERY_CPT_ALBUM . '_galleries'] = __( 'Galleries', 'foogallery' );
21
+ $columns[FOOGALLERY_CPT_ALBUM . '_shortcode'] = __( 'Shortcode', 'foogallery' );
22
+
23
+ return $columns;
24
+ }
25
+
26
+ function album_custom_column_content( $column ) {
27
+ global $post;
28
+
29
+ switch ( $column ) {
30
+ case FOOGALLERY_CPT_ALBUM . '_template':
31
+ $album = FooGalleryAlbum::get( $post );
32
+ $template = $album->album_template_details();
33
+ if ( false !== $template ) {
34
+ echo $template['name'];
35
+ }
36
+ break;
37
+ case FOOGALLERY_CPT_ALBUM . '_galleries':
38
+ $album = FooGalleryAlbum::get( $post );
39
+ echo $album->gallery_count();
40
+ break;
41
+ case FOOGALLERY_CPT_ALBUM . '_shortcode':
42
+ $album = FooGalleryAlbum::get( $post );
43
+ $shortcode = $album->shortcode();
44
+ echo '<input type="text" readonly="readonly" size="' . strlen( $shortcode ) . '" value="' . esc_attr( $shortcode ) . '" class="foogallery-shortcode" />';
45
+ $this->include_clipboard_script = true;
46
+ break;
47
+ }
48
+ }
49
+
50
+ function include_clipboard_script() {
51
+ if ( $this->include_clipboard_script ) { ?>
52
+ <script>
53
+ jQuery(function($) {
54
+ $('.foogallery-shortcode').on('click', function () {
55
+ try {
56
+ //select the contents
57
+ this.select();
58
+ //copy the selection
59
+ document.execCommand('copy');
60
+ //show the copied message
61
+ $('.foogallery-shortcode-message').remove();
62
+ $(this).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
63
+ } catch(err) {
64
+ console.log('Oops, unable to copy!');
65
+ }
66
+ });
67
+ });
68
+ </script>
69
+ <?php
70
+ }
71
+ }
72
+ }
73
+ }
extensions/albums/admin/class-metaboxes.php CHANGED
@@ -1,577 +1,577 @@
1
- <?php
2
-
3
- /*
4
- * FooGallery Admin Album MetaBoxes class
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Admin_Album_MetaBoxes' ) ) {
8
-
9
- class FooGallery_Admin_Album_MetaBoxes {
10
-
11
- private $_album;
12
-
13
- public function __construct() {
14
- //add our foogallery metaboxes
15
- add_action( 'add_meta_boxes_' . FOOGALLERY_CPT_ALBUM, array( $this, 'add_meta_boxes' ) );
16
-
17
- //save extra post data for a gallery
18
- add_action( 'save_post', array( $this, 'save_album' ) );
19
-
20
- //add scripts used by metaboxes
21
- add_action( 'admin_enqueue_scripts', array( $this, 'include_required_scripts' ) );
22
-
23
- // Ajax call for getting gallery details
24
- add_action( 'wp_ajax_foogallery_get_gallery_details', array( $this, 'ajax_get_gallery_details' ) );
25
-
26
- // Ajax call for saving gallery details
27
- add_action( 'wp_ajax_foogallery_save_gallery_details', array( $this, 'ajax_save_gallery_details' ) );
28
-
29
- // Save details for the gallery
30
- add_action( 'foogallery_album_gallery_details_save', array( $this, 'gallery_details_save' ), 10, 3 );
31
- }
32
-
33
- public function add_meta_boxes( $post ) {
34
- add_meta_box(
35
- 'foogalleryalbum_galleries',
36
- __( 'Galleries - click a gallery to add it to your album.', 'foogallery' ),
37
- array( $this, 'render_gallery_metabox' ),
38
- FOOGALLERY_CPT_ALBUM,
39
- 'normal',
40
- 'high'
41
- );
42
-
43
- add_meta_box(
44
- 'foogalleryalbum_settings',
45
- __( 'Settings', 'foogallery' ),
46
- array( $this, 'render_settings_metabox' ),
47
- FOOGALLERY_CPT_ALBUM,
48
- 'normal',
49
- 'high'
50
- );
51
-
52
- add_meta_box(
53
- 'foogalleryalbum_customcss',
54
- __( 'Custom CSS', 'foogallery' ),
55
- array( $this, 'render_customcss_metabox' ),
56
- FOOGALLERY_CPT_ALBUM,
57
- 'normal',
58
- 'low'
59
- );
60
-
61
- add_meta_box(
62
- 'foogalleryalbum_shortcode',
63
- __( 'Album Shortcode', 'foogallery' ),
64
- array( $this, 'render_shortcode_metabox' ),
65
- FOOGALLERY_CPT_ALBUM,
66
- 'side',
67
- 'default'
68
- );
69
-
70
- add_meta_box(
71
- 'foogalleryalbum_sorting',
72
- __( 'Album Sorting', 'foogallery' ),
73
- array( $this, 'render_sorting_metabox' ),
74
- FOOGALLERY_CPT_ALBUM,
75
- 'side',
76
- 'default'
77
- );
78
- }
79
-
80
- public function get_album( $post ) {
81
- if ( ! isset( $this->_album ) ) {
82
- $this->_album = FooGalleryAlbum::get( $post );
83
- }
84
-
85
- return $this->_album;
86
- }
87
-
88
- public function save_album( $post_id ) {
89
- // check autosave
90
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
91
- return $post_id;
92
- }
93
-
94
- // verify nonce
95
- if ( array_key_exists( FOOGALLERY_CPT_ALBUM . '_nonce', $_POST ) &&
96
- wp_verify_nonce( $_POST[ FOOGALLERY_CPT_ALBUM . '_nonce' ], plugin_basename( FOOGALLERY_FILE ) )
97
- ) {
98
- //if we get here, we are dealing with the Album custom post type
99
-
100
- $galleries = apply_filters( 'foogallery_save_album_galleries', explode( ',', $_POST[ FOOGALLERY_ALBUM_META_GALLERIES ] ) );
101
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_GALLERIES, $galleries );
102
-
103
- if ( !empty( $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] ) ) {
104
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_TEMPLATE, $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] );
105
- }
106
-
107
- if ( isset( $_POST[FOOGALLERY_ALBUM_META_SORT] ) ) {
108
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_SORT, $_POST[FOOGALLERY_ALBUM_META_SORT] );
109
- }
110
-
111
- $settings = isset($_POST['_foogallery_settings']) ?
112
- $_POST['_foogallery_settings'] : array();
113
-
114
- $settings = apply_filters( 'foogallery_save_album_settings', $settings );
115
-
116
- if ( !empty( $settings ) ) {
117
- update_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD, $settings );
118
- } else {
119
- delete_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD );
120
- }
121
-
122
- $custom_css = foogallery_sanitize_html( isset( $_POST[FOOGALLERY_META_CUSTOM_CSS] ) ?
123
- $_POST[FOOGALLERY_META_CUSTOM_CSS] : '' );
124
-
125
- if ( empty( $custom_css ) ) {
126
- delete_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS );
127
- } else {
128
- update_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS, $custom_css );
129
- }
130
-
131
- // update usage for each of the galleries.
132
- foreach ( $galleries as $gallery_id ) {
133
- add_post_meta( $post_id, FOOGALLERY_META_POST_USAGE, $gallery_id, false );
134
- }
135
-
136
- do_action( 'foogallery_after_save_album', $post_id, $_POST );
137
- }
138
- }
139
-
140
- public function get_ordered_galleries( $album ) {
141
- //exclude the galleries already added to the album
142
- $excluded_galleries = $album->gallery_ids;
143
-
144
- //allow more galleries to be excluded
145
- $excluded_galleries = apply_filters( 'foogallery_album_exlcuded_galleries', $excluded_galleries, $album );
146
-
147
- //get all other galleries
148
- $galleries = foogallery_get_all_galleries( $excluded_galleries );
149
-
150
- $album_galleries = $album->galleries();
151
-
152
- return array_merge( $album_galleries, $galleries );
153
- }
154
-
155
- public function render_gallery_metabox( $post ) {
156
- $album = $this->get_album( $post );
157
-
158
- $galleries = $this->get_ordered_galleries( $album );
159
-
160
- wp_enqueue_style( 'media-views' );
161
-
162
- ?>
163
- <input type="hidden" name="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
164
- id="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
165
- value="<?php echo wp_create_nonce( plugin_basename( FOOGALLERY_FILE ) ); ?>"/>
166
- <input type="hidden" name='foogallery_album_galleries' id="foogallery_album_galleries"
167
- value="<?php echo $album->gallery_id_csv(); ?>"/>
168
- <div>
169
- <?php if ( !$album->has_galleries() ) { ?>
170
- <div class="foogallery-album-error">
171
- <?php _e( 'There are no galleries selected for your album yet! Click any gallery to add it to your album.', 'foogallery' ); ?>
172
- </div>
173
- <?php } ?>
174
-
175
- <div class="foogallery-album-info-modal media-modal">
176
- <div class="media-modal-content">
177
- <div class="media-frame mode-select">
178
- <div class="media-frame-title">
179
- <h1><?php _e('Edit Gallery Details', 'foogallery'); ?></h1>
180
- <span class="spinner is-active"></span>
181
- </div>
182
- <div class="modal-content">
183
- <?php wp_nonce_field( 'foogallery_album_gallery_details', 'foogallery_album_gallery_details_nonce', false ); ?>
184
- <div class="gallery-details" data-loading="<?php _e( 'Loading details for ', 'foogallery' ); ?>"></div>
185
- </div>
186
- </div>
187
- <div class="media-frame-toolbar">
188
- <div class="media-toolbar">
189
- <div class="media-toolbar-secondary"></div>
190
- <div class="media-toolbar-primary search-form">
191
- <button type="button" class="button media-button button-primary button-large media-button-select gallery-details-save"><?php _e('Save Gallery Details', 'foogallery'); ?></button>
192
- <span class="spinner"></span>
193
- </div>
194
- </div>
195
- </div>
196
- </div>
197
- <button type="button" class="button-link media-modal-close">
198
- <span class="media-modal-icon"><span class="screen-reader-text"><?php _e('Close media panel', 'foogallery'); ?></span></span>
199
- </button>
200
-
201
- </div>
202
- <div class="foogallery-album-info-modal-backdrop media-modal-backdrop"></div>
203
-
204
-
205
- <ul class="foogallery-album-gallery-list">
206
- <?php
207
- foreach ( $galleries as $gallery ) {
208
- $img_src = foogallery_find_featured_attachment_thumbnail_src( $gallery );
209
- $images = $gallery->image_count();
210
- $selected = $album->includes_gallery( $gallery->ID ) ? ' selected' : '';
211
- $title = $gallery->safe_name();
212
- ?>
213
- <li class="foogallery-pile">
214
- <div class="foogallery-gallery-select landscape<?php echo $selected; ?>" data-foogallery-id="<?php echo $gallery->ID; ?>">
215
- <div style="display: table;">
216
- <div style="display: table-cell; vertical-align: middle; text-align: center;">
217
- <img src="<?php echo $img_src; ?>"/>
218
- <h3>
219
- <?php echo esc_html( $title ); ?>
220
- <span><?php echo $images; ?></span>
221
- </h3>
222
- </div>
223
- </div>
224
- <a class="info foogallery-album-info" href="#"
225
- title="<?php _e( 'Edit Album Info', 'foogallery' ); ?>"
226
- data-gallery-title="<?php echo $title; ?>"
227
- data-gallery-id="<?php echo $gallery->ID; ?>"><span class="dashicons dashicons-info"></span>
228
- </a>
229
- </div>
230
- </li>
231
- <?php } ?>
232
- </ul>
233
- <div style="clear: both;"></div>
234
- </div>
235
- <?php
236
- }
237
-
238
- public function render_shortcode_metabox( $post ) {
239
- $album = $this->get_album( $post );
240
- $shortcode = $album->shortcode();
241
- ?>
242
- <p class="foogallery-shortcode">
243
- <input type="text" id="foogallery_copy_shortcode" size="<?php echo strlen( $shortcode ); ?>" value="<?php echo htmlspecialchars( $shortcode ); ?>" readonly="readonly" />
244
- </p>
245
- <p>
246
- <?php _e( 'Paste the above shortcode into a post or page to show the album.', 'foogallery' ); ?>
247
- </p>
248
- <script>
249
- jQuery(function($) {
250
- var shortcodeInput = document.querySelector('#foogallery_copy_shortcode');
251
- shortcodeInput.addEventListener('click', function () {
252
- try {
253
- // select the contents
254
- shortcodeInput.select();
255
- //copy the selection
256
- document.execCommand('copy');
257
- //show the copied message
258
- $('.foogallery-shortcode-message').remove();
259
- $(shortcodeInput).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
260
- } catch(err) {
261
- console.log('Oops, unable to copy!');
262
- }
263
- }, false);
264
- });
265
- </script>
266
- <?php
267
- }
268
-
269
- public function render_sorting_metabox( $post ) {
270
- $album = $this->get_album( $post );
271
- $sorting_options = foogallery_sorting_options(); ?>
272
- <p>
273
- <?php _e('Change the way galleries are sorted within your album. By default, they are sorted in the order you see them.', 'foogallery'); ?>
274
- </p>
275
- <?php
276
- foreach ( $sorting_options as $sorting_key => $sorting_label ) { ?>
277
- <p>
278
- <input type="radio" value="<?php echo $sorting_key; ?>" <?php checked( $sorting_key === $album->sorting ); ?> id="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>" name="<?php echo FOOGALLERY_ALBUM_META_SORT; ?>" />
279
- <label for="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>"><?php echo $sorting_label; ?></label>
280
- </p><?php
281
- }
282
- }
283
-
284
- public function render_settings_metabox( $post ) {
285
- $album = $this->get_album( $post );
286
- $available_templates = foogallery_album_templates();
287
- $album_template = foogallery_default_album_template();
288
- if ( ! empty($album->album_template) ) {
289
- $album_template = $album->album_template;
290
- }
291
- if ( false === $album_template ) {
292
- $album_template = $available_templates[0]['slug'];
293
- }
294
- $hide_help = 'on' == foogallery_get_setting( 'hide_gallery_template_help' );
295
- ?>
296
- <table class="foogallery-album-metabox-settings">
297
- <tbody>
298
- <tr class="foogallery_template_field foogallery_template_field_selector">
299
- <th>
300
- <label for="FooGallerySettings_AlbumTemplate"><?php _e( 'Album Template', 'foogallery' ); ?></label>
301
- </th>
302
- <td>
303
- <select id="FooGallerySettings_AlbumTemplate" name="<?php echo FOOGALLERY_ALBUM_META_TEMPLATE; ?>">
304
- <?php
305
- foreach ( $available_templates as $template ) {
306
- $selected = ($album_template === $template['slug']) ? 'selected' : '';
307
- echo "<option {$selected} value=\"{$template['slug']}\">{$template['name']}</option>";
308
- }
309
- ?>
310
- </select>
311
- <br />
312
- <small><?php _e( 'The album template that will be used when the album is output to the frontend.', 'foogallery' ); ?></small>
313
- </td>
314
- </tr>
315
- <?php
316
- foreach ( $available_templates as $template ) {
317
- $field_visibility = ($album_template !== $template['slug']) ? 'style="display:none"' : '';
318
- $section = '';
319
- $fields = isset( $template['fields'] ) ? $template['fields'] : array();
320
- foreach ( $fields as $field ) {
321
- //allow for the field to be altered by extensions.
322
- $field = apply_filters( 'foogallery_alter_gallery_template_field', $field, $album );
323
-
324
- $class ="foogallery_template_field foogallery_template_field-{$template['slug']} foogallery_template_field-{$template['slug']}-{$field['id']}";
325
-
326
- if ( isset($field['section']) && $field['section'] !== $section ) {
327
- $section = $field['section'];
328
- ?>
329
- <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
330
- <td colspan="2"><h4><?php echo $section; ?></h4></td>
331
- </tr>
332
- <?php }
333
- if (isset($field['type']) && 'help' == $field['type'] && $hide_help) {
334
- continue; //skip help if the 'hide help' setting is turned on
335
- }
336
- ?>
337
- <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
338
- <?php if ( isset($field['type']) && 'help' == $field['type'] ) { ?>
339
- <td colspan="2">
340
- <div class="foogallery-help">
341
- <?php echo $field['desc']; ?>
342
- </div>
343
- </td>
344
- <?php } else { ?>
345
- <th>
346
- <label for="FooGallerySettings_<?php echo $template['slug'] . '_' . $field['id']; ?>"><?php echo $field['title']; ?></label>
347
- </th>
348
- <td>
349
- <?php do_action( 'foogallery_render_gallery_template_field', $field, $album, $template ); ?>
350
- </td>
351
- <?php } ?>
352
- </tr>
353
- <?php
354
- }
355
- }
356
- ?>
357
- </tbody>
358
- </table>
359
- <?php
360
- }
361
-
362
- public function render_customcss_metabox( $post ) {
363
- $album = $this->get_album( $post );
364
- $custom_css = $album->custom_css;
365
- $example = '<code>#foogallery-album-' . $post->ID . ' { }</code>';
366
- ?>
367
- <p>
368
- <?php printf( __( 'Add any custom CSS to target this specific album. For example %s', 'foogallery' ), $example ); ?>
369
- </p>
370
- <table id="table_styling" class="form-table">
371
- <tbody>
372
- <tr>
373
- <td>
374
- <textarea class="foogallery_metabox_custom_css" name="<?php echo FOOGALLERY_META_CUSTOM_CSS; ?>" type="text"><?php echo $custom_css; ?></textarea>
375
- </td>
376
- </tr>
377
- </tbody>
378
- </table>
379
- <?php
380
- }
381
-
382
- public function include_required_scripts() {
383
- if ( FOOGALLERY_CPT_ALBUM === foo_current_screen_post_type() ) {
384
- //include album selection script
385
- $url = FOOGALLERY_ALBUM_URL . 'js/admin-foogallery-album.js';
386
- wp_enqueue_script( 'admin-foogallery-album', $url, array( 'jquery', 'jquery-ui-core','jquery-ui-sortable' ), FOOGALLERY_VERSION );
387
-
388
- //include album selection css
389
- $url = FOOGALLERY_ALBUM_URL . 'css/admin-foogallery-album.css';
390
- wp_enqueue_style( 'admin-foogallery-album', $url, array(), FOOGALLERY_VERSION );
391
- $url = FOOGALLERY_URL . 'css/admin-foogallery-gallery-piles.css';
392
- wp_enqueue_style( 'admin-foogallery-gallery-piles', $url, array(), FOOGALLERY_VERSION );
393
-
394
- //spectrum needed for the colorpicker field
395
- $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.js';
396
- wp_enqueue_script( 'foogallery-spectrum', $url, array('jquery'), FOOGALLERY_VERSION );
397
- $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.css';
398
- wp_enqueue_style( 'foogallery-spectrum', $url, array(), FOOGALLERY_VERSION );
399
- }
400
- }
401
-
402
- public function ajax_get_gallery_details() {
403
- if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
404
- $foogallery_id = $_POST['foogallery_id'];
405
- $gallery = FooGallery::get_by_id( $foogallery_id );
406
-
407
- if ( false !== $gallery ) {
408
- $fields = $this->get_gallery_detail_fields( $gallery ); ?>
409
- <form name="foogallery_gallery_details">
410
- <input type="hidden" name="foogallery_id" id="foogallery_id" value="<?php echo $foogallery_id; ?>" />
411
- <table class="gallery-detail-fields">
412
- <tbody>
413
- <?php foreach ( $fields as $field => $values ) {
414
- $value = get_post_meta( $gallery->ID, $field, true );
415
- $input_id = 'foogallery-gallery-detail-fields-' . $field;
416
- switch ( $values['input'] ) {
417
- case 'text':
418
- $values['html'] = '<input type="text" id="' . $input_id . '" name="' . $field . '" value="' . $value . '" />';
419
- break;
420
-
421
- case 'textarea':
422
- $values['html'] = '<textarea id="' . $input_id . '" name="' . $field . '">' . $value . '</textarea>';
423
- break;
424
-
425
- case 'select':
426
- $html = '<select id="' . $input_id . '" name="' . $field . '">';
427
-
428
- // If options array is passed
429
- if ( isset( $values['options'] ) ) {
430
- // Browse and add the options
431
- foreach ( $values['options'] as $k => $v ) {
432
- // Set the option selected or not
433
- if ( $value == $k )
434
- $selected = ' selected="selected"';
435
- else
436
- $selected = '';
437
-
438
- $html .= '<option' . $selected . ' value="' . $k . '">' . $v . '</option>';
439
- }
440
- }
441
-
442
- $html .= '</select>';
443
-
444
- // Set the html content
445
- $values['html'] = $html;
446
-
447
- break;
448
-
449
- case 'checkbox':
450
- // Set the checkbox checked or not
451
- if ( $value == 'on' )
452
- $checked = ' checked="checked"';
453
- else
454
- $checked = '';
455
-
456
- $html = '<input' . $checked . ' type="checkbox" name="' . $field . ']" id="' . $input_id . '" />';
457
-
458
- $values['html'] = $html;
459
-
460
- break;
461
-
462
- case 'radio':
463
- $html = '';
464
-
465
- if ( ! empty( $values['options'] ) ) {
466
- $i = 0;
467
-
468
- foreach ( $values['options'] as $k => $v ) {
469
- if ( $value == $k )
470
- $checked = ' checked="checked"';
471
- else
472
- $checked = '';
473
-
474
- $html .= '<input' . $checked . ' value="' . $k . '" type="radio" name="' . $field . ']" id="' . sanitize_key( $field . '_' . $i ) . '" /> <label for="' . sanitize_key( $field . '_' . $i ) . '">' . $v . '</label><br />';
475
- $i++;
476
- }
477
- }
478
-
479
- $values['html'] = $html;
480
-
481
- break;
482
- } ?>
483
- <tr class="foogallery-gallery-detail-fields-<?php echo $field; ?>">
484
- <th scope="row" class="label">
485
- <label for="foogallery-gallery-detail-fields-<?php echo $field; ?>"><?php echo $values['label']; ?></label>
486
- </th>
487
- <td>
488
- <?php echo $values['html']; ?>
489
- <?php if ( !empty( $values['help'] ) ) { ?><p class="help"><?php echo $values['help']; ?></p><?php } ?>
490
- </td>
491
- </tr>
492
- <?php } ?>
493
- </tbody>
494
- </table>
495
- </form><?php
496
- } else {
497
- echo '<h2>' . __( 'Invalid Gallery!', 'foogallery' ) . '</h2>';
498
- }
499
- }
500
- die();
501
- }
502
-
503
- public function ajax_save_gallery_details() {
504
- if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
505
- $foogallery_id = $_POST['foogallery_id'];
506
- $gallery = FooGallery::get_by_id( $foogallery_id );
507
- if ( false !== $gallery ) {
508
- $fields = $this->get_gallery_detail_fields( $gallery );
509
-
510
- foreach ( $fields as $field => $values ) {
511
- //for every field, save some info
512
- do_action( 'foogallery_album_gallery_details_save', $field, $values, $gallery );
513
- }
514
- }
515
- }
516
- }
517
-
518
- public function gallery_details_save($field, $field_args, $gallery) {
519
- if ( 'custom_url' === $field || 'custom_target' === $field ) {
520
- $value = $_POST[$field];
521
- update_post_meta( $gallery->ID, $field, $value );
522
- }
523
- }
524
-
525
- /**
526
- * Get the fields that we want to edit for a gallery from the album management page
527
- * @param $gallery FooGallery
528
- *
529
- * @return mixed|void
530
- */
531
- public function get_gallery_detail_fields($gallery) {
532
-
533
- $target_options = apply_filters( 'foogallery_gallery_detail_fields_custom_target_options', array(
534
- 'default' => __( 'Default', 'foogallery' ),
535
- '_blank' => __( 'New tab (_blank)', 'foogallery' ),
536
- '_self' => __( 'Same tab (_self)', 'foogallery' )
537
- ) );
538
-
539
- $edit_url = get_edit_post_link( $gallery->ID );
540
-
541
- $fields = array(
542
- 'gallery_title' => array(
543
- 'label' => __( 'Gallery Title', 'foogallery' ),
544
- 'input' => 'html',
545
- 'html' => '<strong>' . $gallery->safe_name() . ' <a href="' . $edit_url . '" target="_blank">' . __( 'Edit Gallery', 'foogallery' ) . '</a></strong>',
546
- ),
547
-
548
- 'gallery_template' => array(
549
- 'label' => __( 'Gallery Template', 'foogallery' ),
550
- 'input' => 'html',
551
- 'html' => '<strong>' . $gallery->gallery_template_name() . '</strong>',
552
- ),
553
-
554
- 'gallery_media' => array(
555
- 'label' => __( 'Media', 'foogallery' ),
556
- 'input' => 'html',
557
- 'html' => '<strong>' . $gallery->image_count() . '</strong>'
558
- ),
559
-
560
- 'custom_url' => array(
561
- 'label' => __( 'Custom URL', 'foogallery' ),
562
- 'input' => 'text',
563
- 'help' => __( 'Point your gallery to a custom URL', 'foogallery' )
564
- ),
565
-
566
- 'custom_target' => array(
567
- 'label' => __( 'Custom Target', 'foogallery' ),
568
- 'input' => 'select',
569
- 'help' => __( 'Set a custom target for your gallery', 'foogallery' ),
570
- 'options' => $target_options
571
- )
572
- );
573
-
574
- return apply_filters( 'foogallery_gallery_detail_fields', $fields );
575
- }
576
- }
577
- }
1
+ <?php
2
+
3
+ /*
4
+ * FooGallery Admin Album MetaBoxes class
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Admin_Album_MetaBoxes' ) ) {
8
+
9
+ class FooGallery_Admin_Album_MetaBoxes {
10
+
11
+ private $_album;
12
+
13
+ public function __construct() {
14
+ //add our foogallery metaboxes
15
+ add_action( 'add_meta_boxes_' . FOOGALLERY_CPT_ALBUM, array( $this, 'add_meta_boxes' ) );
16
+
17
+ //save extra post data for a gallery
18
+ add_action( 'save_post', array( $this, 'save_album' ) );
19
+
20
+ //add scripts used by metaboxes
21
+ add_action( 'admin_enqueue_scripts', array( $this, 'include_required_scripts' ) );
22
+
23
+ // Ajax call for getting gallery details
24
+ add_action( 'wp_ajax_foogallery_get_gallery_details', array( $this, 'ajax_get_gallery_details' ) );
25
+
26
+ // Ajax call for saving gallery details
27
+ add_action( 'wp_ajax_foogallery_save_gallery_details', array( $this, 'ajax_save_gallery_details' ) );
28
+
29
+ // Save details for the gallery
30
+ add_action( 'foogallery_album_gallery_details_save', array( $this, 'gallery_details_save' ), 10, 3 );
31
+ }
32
+
33
+ public function add_meta_boxes( $post ) {
34
+ add_meta_box(
35
+ 'foogalleryalbum_galleries',
36
+ __( 'Galleries - click a gallery to add it to your album.', 'foogallery' ),
37
+ array( $this, 'render_gallery_metabox' ),
38
+ FOOGALLERY_CPT_ALBUM,
39
+ 'normal',
40
+ 'high'
41
+ );
42
+
43
+ add_meta_box(
44
+ 'foogalleryalbum_settings',
45
+ __( 'Settings', 'foogallery' ),
46
+ array( $this, 'render_settings_metabox' ),
47
+ FOOGALLERY_CPT_ALBUM,
48
+ 'normal',
49
+ 'high'
50
+ );
51
+
52
+ add_meta_box(
53
+ 'foogalleryalbum_customcss',
54
+ __( 'Custom CSS', 'foogallery' ),
55
+ array( $this, 'render_customcss_metabox' ),
56
+ FOOGALLERY_CPT_ALBUM,
57
+ 'normal',
58
+ 'low'
59
+ );
60
+
61
+ add_meta_box(
62
+ 'foogalleryalbum_shortcode',
63
+ __( 'Album Shortcode', 'foogallery' ),
64
+ array( $this, 'render_shortcode_metabox' ),
65
+ FOOGALLERY_CPT_ALBUM,
66
+ 'side',
67
+ 'default'
68
+ );
69
+
70
+ add_meta_box(
71
+ 'foogalleryalbum_sorting',
72
+ __( 'Album Sorting', 'foogallery' ),
73
+ array( $this, 'render_sorting_metabox' ),
74
+ FOOGALLERY_CPT_ALBUM,
75
+ 'side',
76
+ 'default'
77
+ );
78
+ }
79
+
80
+ public function get_album( $post ) {
81
+ if ( ! isset( $this->_album ) ) {
82
+ $this->_album = FooGalleryAlbum::get( $post );
83
+ }
84
+
85
+ return $this->_album;
86
+ }
87
+
88
+ public function save_album( $post_id ) {
89
+ // check autosave
90
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
91
+ return $post_id;
92
+ }
93
+
94
+ // verify nonce
95
+ if ( array_key_exists( FOOGALLERY_CPT_ALBUM . '_nonce', $_POST ) &&
96
+ wp_verify_nonce( $_POST[ FOOGALLERY_CPT_ALBUM . '_nonce' ], plugin_basename( FOOGALLERY_FILE ) )
97
+ ) {
98
+ //if we get here, we are dealing with the Album custom post type
99
+
100
+ $galleries = apply_filters( 'foogallery_save_album_galleries', explode( ',', $_POST[ FOOGALLERY_ALBUM_META_GALLERIES ] ) );
101
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_GALLERIES, $galleries );
102
+
103
+ if ( !empty( $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] ) ) {
104
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_TEMPLATE, $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] );
105
+ }
106
+
107
+ if ( isset( $_POST[FOOGALLERY_ALBUM_META_SORT] ) ) {
108
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_SORT, $_POST[FOOGALLERY_ALBUM_META_SORT] );
109
+ }
110
+
111
+ $settings = isset($_POST['_foogallery_settings']) ?
112
+ $_POST['_foogallery_settings'] : array();
113
+
114
+ $settings = apply_filters( 'foogallery_save_album_settings', $settings );
115
+
116
+ if ( !empty( $settings ) ) {
117
+ update_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD, $settings );
118
+ } else {
119
+ delete_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD );
120
+ }
121
+
122
+ $custom_css = foogallery_sanitize_html( isset( $_POST[FOOGALLERY_META_CUSTOM_CSS] ) ?
123
+ $_POST[FOOGALLERY_META_CUSTOM_CSS] : '' );
124
+
125
+ if ( empty( $custom_css ) ) {
126
+ delete_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS );
127
+ } else {
128
+ update_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS, $custom_css );
129
+ }
130
+
131
+ // update usage for each of the galleries.
132
+ foreach ( $galleries as $gallery_id ) {
133
+ add_post_meta( $post_id, FOOGALLERY_META_POST_USAGE, $gallery_id, false );
134
+ }
135
+
136
+ do_action( 'foogallery_after_save_album', $post_id, $_POST );
137
+ }
138
+ }
139
+
140
+ public function get_ordered_galleries( $album ) {
141
+ //exclude the galleries already added to the album
142
+ $excluded_galleries = $album->gallery_ids;
143
+
144
+ //allow more galleries to be excluded
145
+ $excluded_galleries = apply_filters( 'foogallery_album_exlcuded_galleries', $excluded_galleries, $album );
146
+
147
+ //get all other galleries
148
+ $galleries = foogallery_get_all_galleries( $excluded_galleries );
149
+
150
+ $album_galleries = $album->galleries();
151
+
152
+ return array_merge( $album_galleries, $galleries );
153
+ }
154
+
155
+ public function render_gallery_metabox( $post ) {
156
+ $album = $this->get_album( $post );
157
+
158
+ $galleries = $this->get_ordered_galleries( $album );
159
+
160
+ wp_enqueue_style( 'media-views' );
161
+
162
+ ?>
163
+ <input type="hidden" name="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
164
+ id="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
165
+ value="<?php echo wp_create_nonce( plugin_basename( FOOGALLERY_FILE ) ); ?>"/>
166
+ <input type="hidden" name='foogallery_album_galleries' id="foogallery_album_galleries"
167
+ value="<?php echo $album->gallery_id_csv(); ?>"/>
168
+ <div>
169
+ <?php if ( !$album->has_galleries() ) { ?>
170
+ <div class="foogallery-album-error">
171
+ <?php _e( 'There are no galleries selected for your album yet! Click any gallery to add it to your album.', 'foogallery' ); ?>
172
+ </div>
173
+ <?php } ?>
174
+
175
+ <div class="foogallery-album-info-modal media-modal">
176
+ <div class="media-modal-content">
177
+ <div class="media-frame mode-select">
178
+ <div class="media-frame-title">
179
+ <h1><?php _e('Edit Gallery Details', 'foogallery'); ?></h1>
180
+ <span class="spinner is-active"></span>
181
+ </div>
182
+ <div class="modal-content">
183
+ <?php wp_nonce_field( 'foogallery_album_gallery_details', 'foogallery_album_gallery_details_nonce', false ); ?>
184
+ <div class="gallery-details" data-loading="<?php _e( 'Loading details for ', 'foogallery' ); ?>"></div>
185
+ </div>
186
+ </div>
187
+ <div class="media-frame-toolbar">
188
+ <div class="media-toolbar">
189
+ <div class="media-toolbar-secondary"></div>
190
+ <div class="media-toolbar-primary search-form">
191
+ <button type="button" class="button media-button button-primary button-large media-button-select gallery-details-save"><?php _e('Save Gallery Details', 'foogallery'); ?></button>
192
+ <span class="spinner"></span>
193
+ </div>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ <button type="button" class="button-link media-modal-close">
198
+ <span class="media-modal-icon"><span class="screen-reader-text"><?php _e('Close media panel', 'foogallery'); ?></span></span>
199
+ </button>
200
+
201
+ </div>
202
+ <div class="foogallery-album-info-modal-backdrop media-modal-backdrop"></div>
203
+
204
+
205
+ <ul class="foogallery-album-gallery-list">
206
+ <?php
207
+ foreach ( $galleries as $gallery ) {
208
+ $img_src = foogallery_find_featured_attachment_thumbnail_src( $gallery );
209
+ $images = $gallery->image_count();
210
+ $selected = $album->includes_gallery( $gallery->ID ) ? ' selected' : '';
211
+ $title = $gallery->safe_name();
212
+ ?>
213
+ <li class="foogallery-pile">
214
+ <div class="foogallery-gallery-select landscape<?php echo $selected; ?>" data-foogallery-id="<?php echo $gallery->ID; ?>">
215
+ <div style="display: table;">
216
+ <div style="display: table-cell; vertical-align: middle; text-align: center;">
217
+ <img src="<?php echo $img_src; ?>"/>
218
+ <h3>
219
+ <?php echo esc_html( $title ); ?>
220
+ <span><?php echo $images; ?></span>
221
+ </h3>
222
+ </div>
223
+ </div>
224
+ <a class="info foogallery-album-info" href="#"
225
+ title="<?php _e( 'Edit Album Info', 'foogallery' ); ?>"
226
+ data-gallery-title="<?php echo $title; ?>"
227
+ data-gallery-id="<?php echo $gallery->ID; ?>"><span class="dashicons dashicons-info"></span>
228
+ </a>
229
+ </div>
230
+ </li>
231
+ <?php } ?>
232
+ </ul>
233
+ <div style="clear: both;"></div>
234
+ </div>
235
+ <?php
236
+ }
237
+
238
+ public function render_shortcode_metabox( $post ) {
239
+ $album = $this->get_album( $post );
240
+ $shortcode = $album->shortcode();
241
+ ?>
242
+ <p class="foogallery-shortcode">
243
+ <input type="text" id="foogallery_copy_shortcode" size="<?php echo strlen( $shortcode ); ?>" value="<?php echo htmlspecialchars( $shortcode ); ?>" readonly="readonly" />
244
+ </p>
245
+ <p>
246
+ <?php _e( 'Paste the above shortcode into a post or page to show the album.', 'foogallery' ); ?>
247
+ </p>
248
+ <script>
249
+ jQuery(function($) {
250
+ var shortcodeInput = document.querySelector('#foogallery_copy_shortcode');
251
+ shortcodeInput.addEventListener('click', function () {
252
+ try {
253
+ // select the contents
254
+ shortcodeInput.select();
255
+ //copy the selection
256
+ document.execCommand('copy');
257
+ //show the copied message
258
+ $('.foogallery-shortcode-message').remove();
259
+ $(shortcodeInput).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
260
+ } catch(err) {
261
+ console.log('Oops, unable to copy!');
262
+ }
263
+ }, false);
264
+ });
265
+ </script>
266
+ <?php
267
+ }
268
+
269
+ public function render_sorting_metabox( $post ) {
270
+ $album = $this->get_album( $post );
271
+ $sorting_options = foogallery_sorting_options(); ?>
272
+ <p>
273
+ <?php _e('Change the way galleries are sorted within your album. By default, they are sorted in the order you see them.', 'foogallery'); ?>
274
+ </p>
275
+ <?php
276
+ foreach ( $sorting_options as $sorting_key => $sorting_label ) { ?>
277
+ <p>
278
+ <input type="radio" value="<?php echo $sorting_key; ?>" <?php checked( $sorting_key === $album->sorting ); ?> id="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>" name="<?php echo FOOGALLERY_ALBUM_META_SORT; ?>" />
279
+ <label for="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>"><?php echo $sorting_label; ?></label>
280
+ </p><?php
281
+ }
282
+ }
283
+
284
+ public function render_settings_metabox( $post ) {
285
+ $album = $this->get_album( $post );
286
+ $available_templates = foogallery_album_templates();
287
+ $album_template = foogallery_default_album_template();
288
+ if ( ! empty($album->album_template) ) {
289
+ $album_template = $album->album_template;
290
+ }
291
+ if ( false === $album_template ) {
292
+ $album_template = $available_templates[0]['slug'];
293
+ }
294
+ $hide_help = 'on' == foogallery_get_setting( 'hide_gallery_template_help' );
295
+ ?>
296
+ <table class="foogallery-album-metabox-settings">
297
+ <tbody>
298
+ <tr class="foogallery_template_field foogallery_template_field_selector">
299
+ <th>
300
+ <label for="FooGallerySettings_AlbumTemplate"><?php _e( 'Album Template', 'foogallery' ); ?></label>
301
+ </th>
302
+ <td>
303
+ <select id="FooGallerySettings_AlbumTemplate" name="<?php echo FOOGALLERY_ALBUM_META_TEMPLATE; ?>">
304
+ <?php
305
+ foreach ( $available_templates as $template ) {
306
+ $selected = ($album_template === $template['slug']) ? 'selected' : '';
307
+ echo "<option {$selected} value=\"{$template['slug']}\">{$template['name']}</option>";
308
+ }
309
+ ?>
310
+ </select>
311
+ <br />
312
+ <small><?php _e( 'The album template that will be used when the album is output to the frontend.', 'foogallery' ); ?></small>
313
+ </td>
314
+ </tr>
315
+ <?php
316
+ foreach ( $available_templates as $template ) {
317
+ $field_visibility = ($album_template !== $template['slug']) ? 'style="display:none"' : '';
318
+ $section = '';
319
+ $fields = isset( $template['fields'] ) ? $template['fields'] : array();
320
+ foreach ( $fields as $field ) {
321
+ //allow for the field to be altered by extensions.
322
+ $field = apply_filters( 'foogallery_alter_gallery_template_field', $field, $album );
323
+
324
+ $class ="foogallery_template_field foogallery_template_field-{$template['slug']} foogallery_template_field-{$template['slug']}-{$field['id']}";
325
+
326
+ if ( isset($field['section']) && $field['section'] !== $section ) {
327
+ $section = $field['section'];
328
+ ?>
329
+ <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
330
+ <td colspan="2"><h4><?php echo $section; ?></h4></td>
331
+ </tr>
332
+ <?php }
333
+ if (isset($field['type']) && 'help' == $field['type'] && $hide_help) {
334
+ continue; //skip help if the 'hide help' setting is turned on
335
+ }
336
+ ?>
337
+ <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
338
+ <?php if ( isset($field['type']) && 'help' == $field['type'] ) { ?>
339
+ <td colspan="2">
340
+ <div class="foogallery-help">
341
+ <?php echo $field['desc']; ?>
342
+ </div>
343
+ </td>
344
+ <?php } else { ?>
345
+ <th>
346
+ <label for="FooGallerySettings_<?php echo $template['slug'] . '_' . $field['id']; ?>"><?php echo $field['title']; ?></label>
347
+ </th>
348
+ <td>
349
+ <?php do_action( 'foogallery_render_gallery_template_field', $field, $album, $template ); ?>
350
+ </td>
351
+ <?php } ?>
352
+ </tr>
353
+ <?php
354
+ }
355
+ }
356
+ ?>
357
+ </tbody>
358
+ </table>
359
+ <?php
360
+ }
361
+
362
+ public function render_customcss_metabox( $post ) {
363
+ $album = $this->get_album( $post );
364
+ $custom_css = $album->custom_css;
365
+ $example = '<code>#foogallery-album-' . $post->ID . ' { }</code>';
366
+ ?>
367
+ <p>
368
+ <?php printf( __( 'Add any custom CSS to target this specific album. For example %s', 'foogallery' ), $example ); ?>
369
+ </p>
370
+ <table id="table_styling" class="form-table">
371
+ <tbody>
372
+ <tr>
373
+ <td>
374
+ <textarea class="foogallery_metabox_custom_css" name="<?php echo FOOGALLERY_META_CUSTOM_CSS; ?>" type="text"><?php echo $custom_css; ?></textarea>
375
+ </td>
376
+ </tr>
377
+ </tbody>
378
+ </table>
379
+ <?php
380
+ }
381
+
382
+ public function include_required_scripts() {
383
+ if ( FOOGALLERY_CPT_ALBUM === foo_current_screen_post_type() ) {
384
+ //include album selection script
385
+ $url = FOOGALLERY_ALBUM_URL . 'js/admin-foogallery-album.js';
386
+ wp_enqueue_script( 'admin-foogallery-album', $url, array( 'jquery', 'jquery-ui-core','jquery-ui-sortable' ), FOOGALLERY_VERSION );
387
+
388
+ //include album selection css
389
+ $url = FOOGALLERY_ALBUM_URL . 'css/admin-foogallery-album.css';
390
+ wp_enqueue_style( 'admin-foogallery-album', $url, array(), FOOGALLERY_VERSION );
391
+ $url = FOOGALLERY_URL . 'css/admin-foogallery-gallery-piles.css';
392
+ wp_enqueue_style( 'admin-foogallery-gallery-piles', $url, array(), FOOGALLERY_VERSION );
393
+
394
+ //spectrum needed for the colorpicker field
395
+ $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.js';
396
+ wp_enqueue_script( 'foogallery-spectrum', $url, array('jquery'), FOOGALLERY_VERSION );
397
+ $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.css';
398
+ wp_enqueue_style( 'foogallery-spectrum', $url, array(), FOOGALLERY_VERSION );
399
+ }
400
+ }
401
+
402
+ public function ajax_get_gallery_details() {
403
+ if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
404
+ $foogallery_id = $_POST['foogallery_id'];
405
+ $gallery = FooGallery::get_by_id( $foogallery_id );
406
+
407
+ if ( false !== $gallery ) {
408
+ $fields = $this->get_gallery_detail_fields( $gallery ); ?>
409
+ <form name="foogallery_gallery_details">
410
+ <input type="hidden" name="foogallery_id" id="foogallery_id" value="<?php echo $foogallery_id; ?>" />
411
+ <table class="gallery-detail-fields">
412
+ <tbody>
413
+ <?php foreach ( $fields as $field => $values ) {
414
+ $value = get_post_meta( $gallery->ID, $field, true );
415
+ $input_id = 'foogallery-gallery-detail-fields-' . $field;
416
+ switch ( $values['input'] ) {
417
+ case 'text':
418
+ $values['html'] = '<input type="text" id="' . $input_id . '" name="' . $field . '" value="' . $value . '" />';
419
+ break;
420
+
421
+ case 'textarea':
422
+ $values['html'] = '<textarea id="' . $input_id . '" name="' . $field . '">' . $value . '</textarea>';
423
+ break;
424
+
425
+ case 'select':
426
+ $html = '<select id="' . $input_id . '" name="' . $field . '">';
427
+
428
+ // If options array is passed
429
+ if ( isset( $values['options'] ) ) {
430
+ // Browse and add the options
431
+ foreach ( $values['options'] as $k => $v ) {
432
+ // Set the option selected or not
433
+ if ( $value == $k )
434
+ $selected = ' selected="selected"';
435
+ else
436
+ $selected = '';
437
+
438
+ $html .= '<option' . $selected . ' value="' . $k . '">' . $v . '</option>';
439
+ }
440
+ }
441
+
442
+ $html .= '</select>';
443
+
444
+ // Set the html content
445
+ $values['html'] = $html;
446
+
447
+ break;
448
+
449
+ case 'checkbox':
450
+ // Set the checkbox checked or not
451
+ if ( $value == 'on' )
452
+ $checked = ' checked="checked"';
453
+ else
454
+ $checked = '';
455
+
456
+ $html = '<input' . $checked . ' type="checkbox" name="' . $field . ']" id="' . $input_id . '" />';
457
+
458
+ $values['html'] = $html;
459
+
460
+ break;
461
+
462
+ case 'radio':
463
+ $html = '';
464
+
465
+ if ( ! empty( $values['options'] ) ) {
466
+ $i = 0;
467
+
468
+ foreach ( $values['options'] as $k => $v ) {
469
+ if ( $value == $k )
470
+ $checked = ' checked="checked"';
471
+ else
472
+ $checked = '';
473
+
474
+ $html .= '<input' . $checked . ' value="' . $k . '" type="radio" name="' . $field . ']" id="' . sanitize_key( $field . '_' . $i ) . '" /> <label for="' . sanitize_key( $field . '_' . $i ) . '">' . $v . '</label><br />';
475
+ $i++;
476
+ }
477
+ }
478
+
479
+ $values['html'] = $html;
480
+
481
+ break;
482
+ } ?>
483
+ <tr class="foogallery-gallery-detail-fields-<?php echo $field; ?>">
484
+ <th scope="row" class="label">
485
+ <label for="foogallery-gallery-detail-fields-<?php echo $field; ?>"><?php echo $values['label']; ?></label>
486
+ </th>
487
+ <td>
488
+ <?php echo $values['html']; ?>
489
+ <?php if ( !empty( $values['help'] ) ) { ?><p class="help"><?php echo $values['help']; ?></p><?php } ?>
490
+ </td>
491
+ </tr>
492
+ <?php } ?>
493
+ </tbody>
494
+ </table>
495
+ </form><?php
496
+ } else {
497
+ echo '<h2>' . __( 'Invalid Gallery!', 'foogallery' ) . '</h2>';
498
+ }
499
+ }
500
+ die();
501
+ }
502
+
503
+ public function ajax_save_gallery_details() {
504
+ if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
505
+ $foogallery_id = $_POST['foogallery_id'];
506
+ $gallery = FooGallery::get_by_id( $foogallery_id );
507
+ if ( false !== $gallery ) {
508
+ $fields = $this->get_gallery_detail_fields( $gallery );
509
+
510
+ foreach ( $fields as $field => $values ) {
511
+ //for every field, save some info
512
+ do_action( 'foogallery_album_gallery_details_save', $field, $values, $gallery );
513
+ }
514
+ }
515
+ }
516
+ }
517
+
518
+ public function gallery_details_save($field, $field_args, $gallery) {
519
+ if ( 'custom_url' === $field || 'custom_target' === $field ) {
520
+ $value = $_POST[$field];
521
+ update_post_meta( $gallery->ID, $field, $value );
522
+ }
523
+ }
524
+
525
+ /**
526
+ * Get the fields that we want to edit for a gallery from the album management page
527
+ * @param $gallery FooGallery
528
+ *
529
+ * @return mixed|void
530
+ */
531
+ public function get_gallery_detail_fields($gallery) {
532
+
533
+ $target_options = apply_filters( 'foogallery_gallery_detail_fields_custom_target_options', array(
534
+ 'default' => __( 'Default', 'foogallery' ),
535
+ '_blank' => __( 'New tab (_blank)', 'foogallery' ),
536
+ '_self' => __( 'Same tab (_self)', 'foogallery' )
537
+ ) );
538
+
539
+ $edit_url = get_edit_post_link( $gallery->ID );
540
+
541
+ $fields = array(
542
+ 'gallery_title' => array(
543
+ 'label' => __( 'Gallery Title', 'foogallery' ),
544
+ 'input' => 'html',
545
+ 'html' => '<strong>' . $gallery->safe_name() . ' <a href="' . $edit_url . '" target="_blank">' . __( 'Edit Gallery', 'foogallery' ) . '</a></strong>',
546
+ ),
547
+
548
+ 'gallery_template' => array(
549
+ 'label' => __( 'Gallery Template', 'foogallery' ),
550
+ 'input' => 'html',
551
+ 'html' => '<strong>' . $gallery->gallery_template_name() . '</strong>',
552
+ ),
553
+
554
+ 'gallery_media' => array(
555
+ 'label' => __( 'Media', 'foogallery' ),
556
+ 'input' => 'html',
557
+ 'html' => '<strong>' . $gallery->image_count() . '</strong>'
558
+ ),
559
+
560
+ 'custom_url' => array(
561
+ 'label' => __( 'Custom URL', 'foogallery' ),
562
+ 'input' => 'text',
563
+ 'help' => __( 'Point your gallery to a custom URL', 'foogallery' )
564
+ ),
565
+
566
+ 'custom_target' => array(
567
+ 'label' => __( 'Custom Target', 'foogallery' ),
568
+ 'input' => 'select',
569
+ 'help' => __( 'Set a custom target for your gallery', 'foogallery' ),
570
+ 'options' => $target_options
571
+ )
572
+ );
573
+
574
+ return apply_filters( 'foogallery_gallery_detail_fields', $fields );
575
+ }
576
+ }
577
+ }
extensions/albums/album-default.php CHANGED
@@ -1,84 +1,84 @@
1
- <?php
2
- /**
3
- * FooGallery default responsive album template
4
- */
5
- global $current_foogallery_album;
6
- global $current_foogallery_album_arguments;
7
- global $current_foogallery;
8
- $gallery = foogallery_album_get_current_gallery();
9
- $alignment = foogallery_album_template_setting( 'alignment', 'alignment-left' );
10
- $foogallery = false;
11
-
12
- if ( !empty( $gallery ) ) {
13
- $foogallery = FooGallery::get_by_slug( $gallery );
14
-
15
- //check to see if the gallery belongs to the album
16
- if ( !$current_foogallery_album->includes_gallery( $foogallery->ID ) ) {
17
- $foogallery = false;
18
- }
19
- }
20
-
21
- if ( false !== $foogallery ) {
22
- $album_url = trailingslashit( foogallery_album_remove_gallery_from_link() );
23
- $gallery_title_size = foogallery_album_template_setting('gallery_title_size', 'h2');
24
- echo '<div id="' . $current_foogallery_album->slug . '" class="foogallery-album-header">';
25
- echo '<p><a href="' . esc_url( $album_url ) . '">' . foogallery_get_setting( 'language_back_to_album_text', __( '&laquo; back to album', 'foogallery' ) ) . '</a></p>';
26
- echo '<' . $gallery_title_size . '>' . $foogallery->name . '</'. $gallery_title_size . '>';
27
- echo apply_filters('foogallery_album_default_gallery_content', '', $foogallery);
28
- echo '</div>';
29
- echo do_shortcode('[foogallery id="' . $foogallery->ID . '"]');
30
- } else {
31
- $title_bg = foogallery_album_template_setting( 'title_bg', '#ffffff' );
32
- $title_font_color = foogallery_album_template_setting( 'title_font_color', '#000000' );
33
- $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
34
- if ( !empty( $title_bg ) || !empty( $title_font_color ) ) {
35
- echo '<style type="text/css">';
36
- if ( !empty( $title_bg ) ) {
37
- echo '.foogallery-album-gallery-list .foogallery-pile h3 { background: ' . $title_bg . ' !important; }';
38
- }
39
- if ( !empty( $title_font_color ) ) {
40
- echo '.foogallery-album-gallery-list .foogallery-pile h3 { color: ' . $title_font_color . ' !important; }';
41
- }
42
- echo '</style>';
43
- }
44
- ?>
45
- <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>">
46
- <ul class="foogallery-album-gallery-list <?php echo $alignment; ?>">
47
- <?php
48
- foreach ( $current_foogallery_album->galleries() as $gallery ) {
49
- $current_foogallery = $gallery;
50
- if (!empty($gallery->has_items())) {
51
- $attachment = $gallery->featured_attachment();
52
-
53
- if ( false === $attachment ) continue;
54
-
55
- $img_html = $attachment->html_img( $args );
56
- $images = $gallery->image_count();
57
- $gallery_link = foogallery_album_build_gallery_link( $current_foogallery_album, $gallery );
58
- $gallery_link_target = foogallery_album_build_gallery_link_target( $current_foogallery_album, $gallery );
59
- ?>
60
- <li>
61
- <div class="foogallery-pile">
62
- <div class="foogallery-pile-inner">
63
- <a href="<?php echo esc_url( $gallery_link ); ?>" target="<?php echo $gallery_link_target; ?>">
64
- <?php echo $img_html; ?>
65
- <?php
66
-
67
- $title = empty( $gallery->name ) ?
68
- sprintf( __( '%s #%s', 'foogallery' ), foogallery_plugin_name(), $gallery->ID ) :
69
- $gallery->name;
70
-
71
- ?>
72
- <h3><?php echo $title; ?>
73
- <span><?php echo $images; ?></span>
74
- </h3>
75
- </a>
76
- </div>
77
- </div>
78
- </li>
79
- <?php } ?>
80
- <?php } ?>
81
- </ul>
82
- <div style="clear: both;"></div>
83
- </div>
84
- <?php }
1
+ <?php
2
+ /**
3
+ * FooGallery default responsive album template
4
+ */
5
+ global $current_foogallery_album;
6
+ global $current_foogallery_album_arguments;
7
+ global $current_foogallery;
8
+ $gallery = foogallery_album_get_current_gallery();
9
+ $alignment = foogallery_album_template_setting( 'alignment', 'alignment-left' );
10
+ $foogallery = false;
11
+
12
+ if ( !empty( $gallery ) ) {
13
+ $foogallery = FooGallery::get_by_slug( $gallery );
14
+
15
+ //check to see if the gallery belongs to the album
16
+ if ( !$current_foogallery_album->includes_gallery( $foogallery->ID ) ) {
17
+ $foogallery = false;
18
+ }
19
+ }
20
+
21
+ if ( false !== $foogallery ) {
22
+ $album_url = trailingslashit( foogallery_album_remove_gallery_from_link() );
23
+ $gallery_title_size = foogallery_album_template_setting('gallery_title_size', 'h2');
24
+ echo '<div id="' . $current_foogallery_album->slug . '" class="foogallery-album-header">';
25
+ echo '<p><a href="' . esc_url( $album_url ) . '">' . foogallery_get_setting( 'language_back_to_album_text', __( '&laquo; back to album', 'foogallery' ) ) . '</a></p>';
26
+ echo '<' . $gallery_title_size . '>' . $foogallery->name . '</'. $gallery_title_size . '>';
27
+ echo apply_filters('foogallery_album_default_gallery_content', '', $foogallery);
28
+ echo '</div>';
29
+ echo do_shortcode('[foogallery id="' . $foogallery->ID . '"]');
30
+ } else {
31
+ $title_bg = foogallery_album_template_setting( 'title_bg', '#ffffff' );
32
+ $title_font_color = foogallery_album_template_setting( 'title_font_color', '#000000' );
33
+ $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
34
+ if ( !empty( $title_bg ) || !empty( $title_font_color ) ) {
35
+ echo '<style type="text/css">';
36
+ if ( !empty( $title_bg ) ) {
37
+ echo '.foogallery-album-gallery-list .foogallery-pile h3 { background: ' . $title_bg . ' !important; }';
38
+ }
39
+ if ( !empty( $title_font_color ) ) {
40
+ echo '.foogallery-album-gallery-list .foogallery-pile h3 { color: ' . $title_font_color . ' !important; }';
41
+ }
42
+ echo '</style>';
43
+ }
44
+ ?>
45
+ <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>">
46
+ <ul class="foogallery-album-gallery-list <?php echo $alignment; ?>">
47
+ <?php
48
+ foreach ( $current_foogallery_album->galleries() as $gallery ) {
49
+ $current_foogallery = $gallery;
50
+ if (!empty($gallery->has_items())) {
51
+ $attachment = $gallery->featured_attachment();
52
+
53
+ if ( false === $attachment ) continue;
54
+
55
+ $img_html = $attachment->html_img( $args );
56
+ $images = $gallery->image_count();
57
+ $gallery_link = foogallery_album_build_gallery_link( $current_foogallery_album, $gallery );
58
+ $gallery_link_target = foogallery_album_build_gallery_link_target( $current_foogallery_album, $gallery );
59
+ ?>
60
+ <li>
61
+ <div class="foogallery-pile">
62
+ <div class="foogallery-pile-inner">
63
+ <a href="<?php echo esc_url( $gallery_link ); ?>" target="<?php echo $gallery_link_target; ?>">
64
+ <?php echo $img_html; ?>
65
+ <?php
66
+
67
+ $title = empty( $gallery->name ) ?
68
+ sprintf( __( '%s #%s', 'foogallery' ), foogallery_plugin_name(), $gallery->ID ) :
69
+ $gallery->name;
70
+
71
+ ?>
72
+ <h3><?php echo $title; ?>
73
+ <span><?php echo $images; ?></span>
74
+ </h3>
75
+ </a>
76
+ </div>
77
+ </div>
78
+ </li>
79
+ <?php } ?>
80
+ <?php } ?>
81
+ </ul>
82
+ <div style="clear: both;"></div>
83
+ </div>
84
+ <?php }
extensions/albums/album-stack.php CHANGED
@@ -1,86 +1,86 @@
1
- <?php
2
- /**
3
- * FooGallery All-In-One Stack Album template
4
- */
5
- global $current_foogallery_album;
6
- global $current_foogallery_album_arguments;
7
- global $current_foogallery;
8
-
9
-
10
- $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
11
- $args['crop'] = true;
12
- $lightbox = foogallery_album_template_setting( 'lightbox', 'unknown' );
13
- if ( $lightbox === 'foogallery' ) {
14
- $lightbox = 'unknown';
15
- }
16
- $random_angle = foogallery_album_template_setting( 'random_angle', 'false' );
17
- $gutter = foogallery_album_template_setting( 'gutter', '40' );
18
- $pile_angles = foogallery_album_template_setting( 'pile_angles', '2' );
19
-
20
- $data_options = array(
21
- 'itemWidth' => intval( $args['width'] ),
22
- 'itemHeight' => intval( $args['height'] ),
23
- 'gutter' => intval( $gutter ),
24
- 'angleStep' => intval( $pile_angles ),
25
- 'randomAngle' => 'true' === $random_angle
26
- );
27
-
28
- $data_options = foogallery_json_encode( $data_options );
29
-
30
- if ( !function_exists( 'foogallery_album_all_in_one_stack_render_gallery_attachment2' ) ) {
31
- function foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $attachment, $args ) {
32
- echo '<li class="fg-pile-item">';
33
- $args['link_attributes']['class'] = apply_filters( 'foogallery_album_stack_link_class_name', 'fg-pile-item-thumb' );
34
-
35
- $anchor_html = foogallery_attachment_html_anchor_opening( $attachment, $args );
36
- $anchor_html = str_replace( 'fg-thumb', '', $anchor_html );
37
- echo $anchor_html;
38
-
39
- $image_html = foogallery_attachment_html_image( $attachment, $args );
40
- $image_html = str_replace( 'fg-image', 'fg-pile-item-image', $image_html );
41
- echo $image_html;
42
-
43
- $captions = foogallery_build_attachment_html_caption( $attachment, $args );
44
- if ( $captions !== false ) {
45
- echo '<span class="fg-pile-item-caption">';
46
- if ( array_key_exists( 'title', $captions ) ) {
47
- echo '<span class="fg-pile-item-title">' . $captions['title'] . '</span>';
48
- }
49
- if ( array_key_exists( 'desc', $captions ) ) {
50
- echo '<span class="fg-pile-item-desc">' . $captions['desc'] . '</span>';
51
- }
52
- echo '</span>';
53
- }
54
-
55
- echo '</a>';
56
- echo '</li>';
57
- }
58
- }
59
- ?>
60
- <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>" class="foogallery-container foogallery-stack-album" data-foogallery="<?php echo esc_attr( $data_options ); ?>">
61
- <div class="fg-header">
62
- <h2 class="fg-header-title"><?php echo $current_foogallery_album->name; ?></h2>
63
- <span class="fg-header-back">&larr;</span>
64
- <h3 class="fg-header-active"></h3>
65
- </div>
66
- <div class="fg-piles">
67
- <?php
68
- foreach ( $current_foogallery_album->galleries() as $gallery ) {
69
- ?><ul class="fg-pile <?php echo $lightbox; ?>" data-title="<?php echo esc_attr( $gallery->name ); ?>"><?php
70
- $current_foogallery = $gallery;
71
- $featured_attachment = $gallery->featured_attachment();
72
- //render the featured attachment first
73
- foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $featured_attachment, $args, $lightbox );
74
-
75
- foreach ( $gallery->attachments() as $attachment ) {
76
- if ( $featured_attachment->ID !== $attachment->ID ) {
77
- //render all but the featured attachment
78
- foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $attachment, $args, $lightbox );
79
- }
80
- }
81
- ?></ul><?php
82
- }
83
- ?>
84
- </div>
85
- </div>
86
-
1
+ <?php
2
+ /**
3
+ * FooGallery All-In-One Stack Album template
4
+ */
5
+ global $current_foogallery_album;
6
+ global $current_foogallery_album_arguments;
7
+ global $current_foogallery;
8
+
9
+
10
+ $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
11
+ $args['crop'] = true;
12
+ $lightbox = foogallery_album_template_setting( 'lightbox', 'unknown' );
13
+ if ( $lightbox === 'foogallery' ) {
14
+ $lightbox = 'unknown';
15
+ }
16
+ $random_angle = foogallery_album_template_setting( 'random_angle', 'false' );
17
+ $gutter = foogallery_album_template_setting( 'gutter', '40' );
18
+ $pile_angles = foogallery_album_template_setting( 'pile_angles', '2' );
19
+
20
+ $data_options = array(
21
+ 'itemWidth' => intval( $args['width'] ),
22
+ 'itemHeight' => intval( $args['height'] ),
23
+ 'gutter' => intval( $gutter ),
24
+ 'angleStep' => intval( $pile_angles ),
25
+ 'randomAngle' => 'true' === $random_angle
26
+ );
27
+
28
+ $data_options = foogallery_json_encode( $data_options );
29
+
30
+ if ( !function_exists( 'foogallery_album_all_in_one_stack_render_gallery_attachment2' ) ) {
31
+ function foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $attachment, $args ) {
32
+ echo '<li class="fg-pile-item">';
33
+ $args['link_attributes']['class'] = apply_filters( 'foogallery_album_stack_link_class_name', 'fg-pile-item-thumb' );
34
+
35
+ $anchor_html = foogallery_attachment_html_anchor_opening( $attachment, $args );
36
+ $anchor_html = str_replace( 'fg-thumb', '', $anchor_html );
37
+ echo $anchor_html;
38
+
39
+ $image_html = foogallery_attachment_html_image( $attachment, $args );
40
+ $image_html = str_replace( 'fg-image', 'fg-pile-item-image', $image_html );
41
+ echo $image_html;
42
+
43
+ $captions = foogallery_build_attachment_html_caption( $attachment, $args );
44
+ if ( $captions !== false ) {
45
+ echo '<span class="fg-pile-item-caption">';
46
+ if ( array_key_exists( 'title', $captions ) ) {
47
+ echo '<span class="fg-pile-item-title">' . $captions['title'] . '</span>';
48
+ }
49
+ if ( array_key_exists( 'desc', $captions ) ) {
50
+ echo '<span class="fg-pile-item-desc">' . $captions['desc'] . '</span>';
51
+ }
52
+ echo '</span>';
53
+ }
54
+
55
+ echo '</a>';
56
+ echo '</li>';
57
+ }
58
+ }
59
+ ?>
60
+ <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>" class="foogallery-container foogallery-stack-album" data-foogallery="<?php echo esc_attr( $data_options ); ?>">
61
+ <div class="fg-header">
62
+ <h2 class="fg-header-title"><?php echo $current_foogallery_album->name; ?></h2>
63
+ <span class="fg-header-back">&larr;</span>
64
+ <h3 class="fg-header-active"></h3>
65
+ </div>
66
+ <div class="fg-piles">
67
+ <?php
68
+ foreach ( $current_foogallery_album->galleries() as $gallery ) {
69
+ ?><ul class="fg-pile <?php echo $lightbox; ?>" data-title="<?php echo esc_attr( $gallery->name ); ?>"><?php
70
+ $current_foogallery = $gallery;
71
+ $featured_attachment = $gallery->featured_attachment();
72
+ //render the featured attachment first
73
+ foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $featured_attachment, $args, $lightbox );
74
+
75
+ foreach ( $gallery->attachments() as $attachment ) {
76
+ if ( $featured_attachment->ID !== $attachment->ID ) {
77
+ //render all but the featured attachment
78
+ foogallery_album_all_in_one_stack_render_gallery_attachment2( $gallery, $attachment, $args, $lightbox );
79
+ }
80
+ }
81
+ ?></ul><?php
82
+ }
83
+ ?>
84
+ </div>
85
+ </div>
86
+
extensions/albums/class-albums-extension.php CHANGED
@@ -1,175 +1,175 @@
1
- <?php
2
- if ( ! class_exists( 'FooGallery_Albums_Extension' ) ) {
3
-
4
- define( 'FOOGALLERY_ALBUM_PATH', plugin_dir_path( __FILE__ ) );
5
- define( 'FOOGALLERY_ALBUM_URL', plugin_dir_url( __FILE__ ) );
6
- define( 'FOOGALLERY_CPT_ALBUM', 'foogallery-album' );
7
- define( 'FOOGALLERY_ALBUM_META_GALLERIES', 'foogallery_album_galleries' );
8
- define( 'FOOGALLERY_ALBUM_META_TEMPLATE', 'foogallery_album_template' );
9
- define( 'FOOGALLERY_ALBUM_META_SORT', 'foogallery_album_sort' );
10
-
11
- class FooGallery_Albums_Extension {
12
-
13
- function __construct() {
14
- $this->includes();
15
-
16
- new FooGallery_Album_Rewrite_Rules();
17
- new FooGallery_Albums_PostTypes();
18
- new FooGallery_Album_Shortcodes();
19
-
20
- if ( is_admin() ) {
21
- new FooGallery_Albums_Admin_Columns();
22
- new FooGallery_Admin_Album_MetaBoxes();
23
-
24
- //add some global settings for albums
25
- add_filter( 'foogallery_admin_settings_override', array($this, 'add_album_settings' ) );
26
-
27
- add_action( 'foogallery_uninstall', array($this, 'uninstall' ) );
28
- }
29
- add_filter( 'foogallery_album_templates_files', array( $this, 'register_myself' ) );
30
- add_filter( 'foogallery_defaults', array( $this, 'apply_album_defaults' ) );
31
- add_action( 'foogallery_extension_activated-albums', array( $this, 'flush_rewrite_rules' ) );
32
- add_filter( 'foogallery_albums_supports_video-stack', '__return_true' );
33
-
34
- add_filter( 'fooboxshare_use_permalink', array( $this, 'check_for_albums_for_fooboxshare' ) );
35
-
36
- add_action( 'foogallery_located_album_template-stack', array( $this, 'load_stack_assets' ) );
37
-
38
- add_filter( 'foogallery_album_default_gallery_content', array( $this, 'render_gallery_description' ), 10, 2 );
39
-
40
- add_filter( 'foogallery_gallery_posttype_register_args', array( $this, 'override_gallery_posttype_register_args' ) );
41
-
42
- add_filter( 'foogallery_allowed_post_types_for_attachment', array( $this, 'allow_albums' ) );
43
- }
44
-
45
- /**
46
- * Add the album post type to the allowed list of post types that galleries can be attached to.
47
- * This will then show albums in the Usage column for the galleries
48
- *
49
- * @param array $allowed The allowed list of post types.
50
- *
51
- * @return array
52
- */
53
- public function allow_albums( $allowed ) {
54
- $allowed[] = FOOGALLERY_CPT_ALBUM;
55
- return $allowed;
56
- }
57
-
58
- /**
59
- * Overrides the gallery posttype register args
60
- *
61
- * @param array $args The arguments.
62
- *
63
- * @return array
64
- */
65
- public function override_gallery_posttype_register_args( $args ) {
66
- if ( 'on' === foogallery_get_setting( 'enable_gallery_descriptions' ) ) {
67
- $args['supports'][] = 'editor';
68
- }
69
- return $args;
70
- }
71
-
72
- /**
73
- * Render the gallery description
74
- *
75
- * @param string $content The default content to be rendered.
76
- * @param FooGallery $foogallery The gallery we are showing.
77
- *
78
- * @return string
79
- */
80
- public function render_gallery_description( $content, $foogallery ) {
81
- if ( 'on' === foogallery_get_setting( 'enable_gallery_descriptions' ) ) {
82
- if ( isset( $foogallery->_post ) && ! empty( $foogallery->_post->post_content ) ) {
83
- $content = apply_filters( 'the_content', $foogallery->_post->post_content );
84
- }
85
- }
86
-
87
- return $content;
88
- }
89
-
90
- function load_stack_assets( $current_foogallery_album ) {
91
- foogallery_enqueue_core_gallery_template_script();
92
- foogallery_enqueue_core_gallery_template_style();
93
- }
94
-
95
- function check_for_albums_for_fooboxshare( $default ) {
96
-
97
- $album_gallery = foogallery_album_get_current_gallery();
98
-
99
- if ( !empty( $album_gallery) ) {
100
- return false;
101
- }
102
-
103
- return $default;
104
- }
105
-
106
- function includes() {
107
- require_once FOOGALLERY_ALBUM_PATH . 'functions.php';
108
- require_once FOOGALLERY_ALBUM_PATH . 'class-posttypes.php';
109
- require_once FOOGALLERY_ALBUM_PATH . 'class-foogallery-album.php';
110
- require_once FOOGALLERY_ALBUM_PATH . 'public/class-rewrite-rules.php';
111
- require_once FOOGALLERY_ALBUM_PATH . 'public/class-shortcodes.php';
112
- require_once FOOGALLERY_ALBUM_PATH . 'public/class-foogallery-album-template-loader.php';
113
-
114
- if ( is_admin() ) {
115
- // only admin.
116
- require_once FOOGALLERY_ALBUM_PATH . 'admin/class-metaboxes.php';
117
- require_once FOOGALLERY_ALBUM_PATH . 'admin/class-columns.php';
118
- }
119
- }
120
-
121
- function apply_album_defaults( $defaults ) {
122
- $defaults['album_template'] = 'default';
123
-
124
- return $defaults;
125
- }
126
-
127
- function register_myself( $extensions ) {
128
- $extensions[] = __FILE__;
129
- return $extensions;
130
- }
131
-
132
- function flush_rewrite_rules() {
133
- $rewrite = new FooGallery_Album_Rewrite_Rules();
134
- $rewrite->add_gallery_endpoint();
135
-
136
- flush_rewrite_rules();
137
- }
138
-
139
- function add_album_settings( $settings ) {
140
-
141
- $settings['tabs']['albums'] = __( 'Albums', 'foogallery' );
142
-
143
- $settings['settings'][] = array(
144
- 'id' => 'album_gallery_slug',
145
- 'title' => __( 'Gallery Slug', 'foogallery' ),
146
- 'type' => 'text',
147
- 'default' => 'gallery',
148
- 'desc' => __( 'The slug that is used when generating gallery URL\'s for albums. PLEASE NOTE : if you change this value, you might need to save your Permalinks again.', 'foogallery' ),
149
- 'tab' => 'albums',
150
- );
151
-
152
- $settings['settings'][] = array(
153
- 'id' => 'language_back_to_album_text',
154
- 'title' => __( 'Back To Album Text', 'foogallery' ),
155
- 'type' => 'text',
156
- 'default' => __( '&laquo; back to album', 'foogallery' ),
157
- 'tab' => 'albums',
158
- );
159
-
160
- $settings['settings'][] = array(
161
- 'id' => 'enable_gallery_descriptions',
162
- 'title' => __( 'Enable Gallery Descriptions', 'foogallery' ),
163
- 'desc' => __( 'Enable descriptions for galleries. These descriptions will be displayed under the gallery title within the Responsive Album Layout.', 'foogallery' ),
164
- 'type' => 'checkbox',
165
- 'tab' => 'albums',
166
- );
167
-
168
- return $settings;
169
- }
170
-
171
- function uninstall() {
172
- foogallery_album_uninstall();
173
- }
174
- }
175
- }
1
+ <?php
2
+ if ( ! class_exists( 'FooGallery_Albums_Extension' ) ) {
3
+
4
+ define( 'FOOGALLERY_ALBUM_PATH', plugin_dir_path( __FILE__ ) );
5
+ define( 'FOOGALLERY_ALBUM_URL', plugin_dir_url( __FILE__ ) );
6
+ define( 'FOOGALLERY_CPT_ALBUM', 'foogallery-album' );
7
+ define( 'FOOGALLERY_ALBUM_META_GALLERIES', 'foogallery_album_galleries' );
8
+ define( 'FOOGALLERY_ALBUM_META_TEMPLATE', 'foogallery_album_template' );
9
+ define( 'FOOGALLERY_ALBUM_META_SORT', 'foogallery_album_sort' );
10
+
11
+ class FooGallery_Albums_Extension {
12
+
13
+ function __construct() {
14
+ $this->includes();
15
+
16
+ new FooGallery_Album_Rewrite_Rules();
17
+ new FooGallery_Albums_PostTypes();
18
+ new FooGallery_Album_Shortcodes();
19
+
20
+ if ( is_admin() ) {
21
+ new FooGallery_Albums_Admin_Columns();
22
+ new FooGallery_Admin_Album_MetaBoxes();
23
+
24
+ //add some global settings for albums
25
+ add_filter( 'foogallery_admin_settings_override', array($this, 'add_album_settings' ) );
26
+
27
+ add_action( 'foogallery_uninstall', array($this, 'uninstall' ) );
28
+ }
29
+ add_filter( 'foogallery_album_templates_files', array( $this, 'register_myself' ) );
30
+ add_filter( 'foogallery_defaults', array( $this, 'apply_album_defaults' ) );
31
+ add_action( 'foogallery_extension_activated-albums', array( $this, 'flush_rewrite_rules' ) );
32
+ add_filter( 'foogallery_albums_supports_video-stack', '__return_true' );
33
+
34
+ add_filter( 'fooboxshare_use_permalink', array( $this, 'check_for_albums_for_fooboxshare' ) );
35
+
36
+ add_action( 'foogallery_located_album_template-stack', array( $this, 'load_stack_assets' ) );
37
+
38
+ add_filter( 'foogallery_album_default_gallery_content', array( $this, 'render_gallery_description' ), 10, 2 );
39
+
40
+ add_filter( 'foogallery_gallery_posttype_register_args', array( $this, 'override_gallery_posttype_register_args' ) );
41
+
42
+ add_filter( 'foogallery_allowed_post_types_for_attachment', array( $this, 'allow_albums' ) );
43
+ }
44
+
45
+ /**
46
+ * Add the album post type to the allowed list of post types that galleries can be attached to.
47
+ * This will then show albums in the Usage column for the galleries
48
+ *
49
+ * @param array $allowed The allowed list of post types.
50
+ *
51
+ * @return array
52
+ */
53
+ public function allow_albums( $allowed ) {
54
+ $allowed[] = FOOGALLERY_CPT_ALBUM;
55
+ return $allowed;
56
+ }
57
+
58
+ /**
59
+ * Overrides the gallery posttype register args
60
+ *
61
+ * @param array $args The arguments.
62
+ *
63
+ * @return array
64
+ */
65
+ public function override_gallery_posttype_register_args( $args ) {
66
+ if ( 'on' === foogallery_get_setting( 'enable_gallery_descriptions' ) ) {
67
+ $args['supports'][] = 'editor';
68
+ }
69
+ return $args;
70
+ }
71
+
72
+ /**
73
+ * Render the gallery description
74
+ *
75
+ * @param string $content The default content to be rendered.
76
+ * @param FooGallery $foogallery The gallery we are showing.
77
+ *
78
+ * @return string
79
+ */
80
+ public function render_gallery_description( $content, $foogallery ) {
81
+ if ( 'on' === foogallery_get_setting( 'enable_gallery_descriptions' ) ) {
82
+ if ( isset( $foogallery->_post ) && ! empty( $foogallery->_post->post_content ) ) {
83
+ $content = apply_filters( 'the_content', $foogallery->_post->post_content );
84
+ }
85
+ }
86
+
87
+ return $content;
88
+ }
89
+
90
+ function load_stack_assets( $current_foogallery_album ) {
91
+ foogallery_enqueue_core_gallery_template_script();
92
+ foogallery_enqueue_core_gallery_template_style();
93
+ }
94
+
95
+ function check_for_albums_for_fooboxshare( $default ) {
96
+
97
+ $album_gallery = foogallery_album_get_current_gallery();
98
+
99
+ if ( !empty( $album_gallery) ) {
100
+ return false;
101
+ }
102
+
103
+ return $default;
104
+ }
105
+
106
+ function includes() {
107
+ require_once FOOGALLERY_ALBUM_PATH . 'functions.php';
108
+ require_once FOOGALLERY_ALBUM_PATH . 'class-posttypes.php';
109
+ require_once FOOGALLERY_ALBUM_PATH . 'class-foogallery-album.php';
110
+ require_once FOOGALLERY_ALBUM_PATH . 'public/class-rewrite-rules.php';
111
+ require_once FOOGALLERY_ALBUM_PATH . 'public/class-shortcodes.php';
112
+ require_once FOOGALLERY_ALBUM_PATH . 'public/class-foogallery-album-template-loader.php';
113
+
114
+ if ( is_admin() ) {
115
+ // only admin.
116
+ require_once FOOGALLERY_ALBUM_PATH . 'admin/class-metaboxes.php';
117
+ require_once FOOGALLERY_ALBUM_PATH . 'admin/class-columns.php';
118
+ }
119
+ }
120
+
121
+ function apply_album_defaults( $defaults ) {
122
+ $defaults['album_template'] = 'default';
123
+
124
+ return $defaults;
125
+ }
126
+
127
+ function register_myself( $extensions ) {
128
+ $extensions[] = __FILE__;
129
+ return $extensions;
130
+ }
131
+
132
+ function flush_rewrite_rules() {
133
+ $rewrite = new FooGallery_Album_Rewrite_Rules();
134
+ $rewrite->add_gallery_endpoint();
135
+
136
+ flush_rewrite_rules();
137
+ }
138
+
139
+ function add_album_settings( $settings ) {
140
+
141
+ $settings['tabs']['albums'] = __( 'Albums', 'foogallery' );
142
+
143
+ $settings['settings'][] = array(
144
+ 'id' => 'album_gallery_slug',
145
+ 'title' => __( 'Gallery Slug', 'foogallery' ),
146
+ 'type' => 'text',
147
+ 'default' => 'gallery',
148
+ 'desc' => __( 'The slug that is used when generating gallery URL\'s for albums. PLEASE NOTE : if you change this value, you might need to save your Permalinks again.', 'foogallery' ),
149
+ 'tab' => 'albums',
150
+ );
151
+
152
+ $settings['settings'][] = array(
153
+ 'id' => 'language_back_to_album_text',
154
+ 'title' => __( 'Back To Album Text', 'foogallery' ),
155
+ 'type' => 'text',
156
+ 'default' => __( '&laquo; back to album', 'foogallery' ),
157
+ 'tab' => 'albums',
158
+ );
159
+
160
+ $settings['settings'][] = array(
161
+ 'id' => 'enable_gallery_descriptions',
162
+ 'title' => __( 'Enable Gallery Descriptions', 'foogallery' ),
163
+ 'desc' => __( 'Enable descriptions for galleries. These descriptions will be displayed under the gallery title within the Responsive Album Layout.', 'foogallery' ),
164
+ 'type' => 'checkbox',
165
+ 'tab' => 'albums',
166
+ );
167
+
168
+ return $settings;
169
+ }
170
+
171
+ function uninstall() {
172
+ foogallery_album_uninstall();
173
+ }
174
+ }
175
+ }
extensions/albums/class-foogallery-album.php CHANGED
@@ -1,256 +1,256 @@
1
- <?php
2
-
3
- /**
4
- * Class FooGalleryAlbum
5
- *
6
- * An easy to use wrapper class for a FooGallery Album post
7
- */
8
- class FooGalleryAlbum extends stdClass {
9
-
10
- /**
11
- * private constructor
12
- *
13
- * @param null $post
14
- */
15
- private function __construct( $post = null ) {
16
- $this->set_defaults();
17
-
18
- if ( $post !== null ) {
19
- $this->load( $post );
20
- }
21
- }
22
-
23
- /**
24
- * Sets the default when a new album is instantiated
25
- */
26
- private function set_defaults() {
27
- $this->_post = null;
28
- $this->ID = 0;
29
- $this->gallery_ids = array();
30
- $this->_galleries = false;
31
- }
32
-
33
- /**
34
- * private gallery load function
35
- * @param $post
36
- */
37
- private function load( $post ) {
38
- $this->_post = $post;
39
- $this->ID = $post->ID;
40
- $this->slug = $post->post_name;
41
- $this->name = $post->post_title;
42
- $this->author = $post->post_author;
43
- $this->post_status = $post->post_status;
44
- $album_meta = get_post_meta( $this->ID, FOOGALLERY_ALBUM_META_GALLERIES, true );
45
- $this->gallery_ids = is_array( $album_meta ) ? array_filter( $album_meta ) : array();
46
- $this->album_template = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_TEMPLATE, true );
47
- $this->settings = get_post_meta( $post->ID, FOOGALLERY_META_SETTINGS_OLD, true );
48
- $this->custom_css = get_post_meta( $post->ID, FOOGALLERY_META_CUSTOM_CSS, true );
49
- $this->sorting = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_SORT, true );
50
- do_action( 'foogallery_foogallery-album_instance_after_load', $this, $post );
51
- }
52
-
53
- /**
54
- * private function to load a album by an id
55
- * @param $post_id
56
- */
57
- private function load_by_id( $post_id ) {
58
- $post = get_post( $post_id );
59
- if ( $post ) {
60
- $this->load( $post );
61
- }
62
- }
63
-
64
- /**
65
- * private function to load a album by the slug.
66
- * Will be used when loading album shortcodes
67
- * @param $slug
68
- */
69
- private function load_by_slug( $slug ) {
70
- if ( ! empty( $slug ) ) {
71
- $args = array(
72
- 'name' => $slug,
73
- 'numberposts' => 1,
74
- 'post_type' => FOOGALLERY_CPT_ALBUM,
75
- );
76
-
77
- $albums = get_posts( $args );
78
-
79
- if ( $albums ) {
80
- $this->load( $albums[0] );
81
- }
82
- }
83
- }
84
-
85
- /**
86
- * Static function to load a Album instance by passing in a post object
87
- * @static
88
- *
89
- * @param $post
90
- *
91
- * @return FooGalleryAlbum
92
- */
93
- public static function get( $post ) {
94
- return new self( $post );
95
- }
96
-
97
- /**
98
- * Static function to load an Album instance by post id
99
- *
100
- * @param $post_id
101
- *
102
- * @return FooGalleryAlbum
103
- */
104
- public static function get_by_id( $post_id ) {
105
- $album = new self();
106
- $album->load_by_id( $post_id );
107
- if ( ! $album->does_exist() ) {
108
- return false;
109
- }
110
- return $album;
111
- }
112
-
113
- /**
114
- * Static function to load a album instance by passing in a album slug
115
- *
116
- * @param string $slug
117
- *
118
- * @return FooGalleryAlbum
119
- */
120
- public static function get_by_slug( $slug ) {
121
- $album = new self();
122
- $album->load_by_slug( $slug );
123
- if ( ! $album->does_exist() ) {
124
- return false;
125
- }
126
- return $album;
127
- }
128
-
129
- /**
130
- * Checks if the album has galleries
131
- * @return bool
132
- */
133
- public function has_galleries() {
134
- return sizeof( $this->gallery_ids ) > 0;
135
- }
136
-
137
- /**
138
- * Checks if the album exists
139
- * @return bool
140
- */
141
- public function does_exist() {
142
- return $this->ID > 0;
143
- }
144
-
145
- /**
146
- * Returns true if the album is published
147
- * @return bool
148
- */
149
- public function is_published() {
150
- return $this->post_status === 'publish';
151
- }
152
-
153
- /**
154
- * Get a comma separated list of gallery ids
155
- * @return string
156
- */
157
- public function gallery_id_csv() {
158
- if ( is_array( $this->gallery_ids ) ) {
159
- return implode( ',', $this->gallery_ids );
160
- }
161
-
162
- return '';
163
- }
164
-
165
- /**
166
- * Lazy load the attachments for the gallery
167
- *
168
- * @return array
169
- */
170
- public function galleries() {
171
- //lazy load the attachments for performance
172
- if ( $this->_galleries === false ) {
173
- $this->_galleries = array();
174
-
175
- if ( ! empty( $this->gallery_ids ) ) {
176
-
177
- $gallery_query_args = apply_filters( 'foogallery_album_gallery_get_posts_args', array(
178
- 'post_type' => FOOGALLERY_CPT_GALLERY,
179
- 'posts_per_page' => -1,
180
- 'post__in' => $this->gallery_ids,
181
- 'orderby' => foogallery_sorting_get_posts_orderby_arg( $this->sorting ),
182
- 'order' => foogallery_sorting_get_posts_order_arg( $this->sorting )
183
- ) );
184
-
185
- $galleries = get_posts( $gallery_query_args );
186
-
187
- $this->_galleries = array_map( array( 'FooGallery', 'get' ), $galleries );
188
- }
189
- }
190
-
191
- return $this->_galleries;
192
- }
193
-
194
- function includes_gallery( $gallery_id ) {
195
- if ( $this->has_galleries() ) {
196
- return in_array( $gallery_id, $this->gallery_ids );
197
- }
198
- return false;
199
- }
200
-
201
- public function gallery_count() {
202
- $count = sizeof( $this->gallery_ids );
203
- switch ( $count ) {
204
- case 0:
205
- return __( 'No galleries', 'foogallery' );
206
- case 1:
207
- return __( '1 gallery', 'foogallery' );
208
- default:
209
- return sprintf( __( '%s galleries', 'foogallery' ), $count );
210
- }
211
- }
212
-
213
- /**
214
- * Output the shortcode for the gallery
215
- *
216
- * @return string
217
- */
218
- public function shortcode() {
219
- return foogallery_build_album_shortcode( $this->ID );
220
- }
221
-
222
- function get_meta( $key, $default ) {
223
- if ( ! is_array( $this->settings ) ) {
224
- return $default;
225
- }
226
-
227
- $value = array_key_exists( $key, $this->settings ) ? $this->settings[ $key ] : null;
228
-
229
- if ( $value === null ) {
230
- return $default;
231
- }
232
-
233
- return $value;
234
- }
235
-
236
- function is_checked( $key, $default = false ) {
237
- if ( ! is_array( $this->settings ) ) {
238
- return $default;
239
- }
240
-
241
- return array_key_exists( $key, $this->settings );
242
- }
243
-
244
- public function album_template_details() {
245
- if ( ! empty( $this->album_template ) ) {
246
-
247
- foreach ( foogallery_album_templates() as $template ) {
248
- if ( $this->album_template == $template['slug'] ) {
249
- return $template;
250
- }
251
- }
252
- }
253
-
254
- return false;
255
- }
256
- }
1
+ <?php
2
+
3
+ /**
4
+ * Class FooGalleryAlbum
5
+ *
6
+ * An easy to use wrapper class for a FooGallery Album post
7
+ */
8
+ class FooGalleryAlbum extends stdClass {
9
+
10
+ /**
11
+ * private constructor
12
+ *
13
+ * @param null $post
14
+ */
15
+ private function __construct( $post = null ) {
16
+ $this->set_defaults();
17
+
18
+ if ( $post !== null ) {
19
+ $this->load( $post );
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Sets the default when a new album is instantiated
25
+ */
26
+ private function set_defaults() {
27
+ $this->_post = null;
28
+ $this->ID = 0;
29
+ $this->gallery_ids = array();
30
+ $this->_galleries = false;
31
+ }
32
+
33
+ /**
34
+ * private gallery load function
35
+ * @param $post
36
+ */
37
+ private function load( $post ) {
38
+ $this->_post = $post;
39
+ $this->ID = $post->ID;
40
+ $this->slug = $post->post_name;
41
+ $this->name = $post->post_title;
42
+ $this->author = $post->post_author;
43
+ $this->post_status = $post->post_status;
44
+ $album_meta = get_post_meta( $this->ID, FOOGALLERY_ALBUM_META_GALLERIES, true );
45
+ $this->gallery_ids = is_array( $album_meta ) ? array_filter( $album_meta ) : array();
46
+ $this->album_template = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_TEMPLATE, true );
47
+ $this->settings = get_post_meta( $post->ID, FOOGALLERY_META_SETTINGS_OLD, true );
48
+ $this->custom_css = get_post_meta( $post->ID, FOOGALLERY_META_CUSTOM_CSS, true );
49
+ $this->sorting = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_SORT, true );
50
+ do_action( 'foogallery_foogallery-album_instance_after_load', $this, $post );
51
+ }
52
+
53
+ /**
54
+ * private function to load a album by an id
55
+ * @param $post_id
56
+ */
57
+ private function load_by_id( $post_id ) {
58
+ $post = get_post( $post_id );
59
+ if ( $post ) {
60
+ $this->load( $post );
61
+ }
62
+ }
63
+
64
+ /**
65
+ * private function to load a album by the slug.
66
+ * Will be used when loading album shortcodes
67
+ * @param $slug
68
+ */
69
+ private function load_by_slug( $slug ) {
70
+ if ( ! empty( $slug ) ) {
71
+ $args = array(
72
+ 'name' => $slug,
73
+ 'numberposts' => 1,
74
+ 'post_type' => FOOGALLERY_CPT_ALBUM,
75
+ );
76
+
77
+ $albums = get_posts( $args );
78
+
79
+ if ( $albums ) {
80
+ $this->load( $albums[0] );
81
+ }
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Static function to load a Album instance by passing in a post object
87
+ * @static
88
+ *
89
+ * @param $post
90
+ *
91
+ * @return FooGalleryAlbum
92
+ */
93
+ public static function get( $post ) {
94
+ return new self( $post );
95
+ }
96
+
97
+ /**
98
+ * Static function to load an Album instance by post id
99
+ *
100
+ * @param $post_id
101
+ *
102
+ * @return FooGalleryAlbum
103
+ */
104
+ public static function get_by_id( $post_id ) {
105
+ $album = new self();
106
+ $album->load_by_id( $post_id );
107
+ if ( ! $album->does_exist() ) {
108
+ return false;
109
+ }
110
+ return $album;
111
+ }
112
+
113
+ /**
114
+ * Static function to load a album instance by passing in a album slug
115
+ *
116
+ * @param string $slug
117
+ *
118
+ * @return FooGalleryAlbum
119
+ */
120
+ public static function get_by_slug( $slug ) {
121
+ $album = new self();
122
+ $album->load_by_slug( $slug );
123
+ if ( ! $album->does_exist() ) {
124
+ return false;
125
+ }
126
+ return $album;
127
+ }
128
+
129
+ /**
130
+ * Checks if the album has galleries
131
+ * @return bool
132
+ */
133
+ public function has_galleries() {
134
+ return sizeof( $this->gallery_ids ) > 0;
135
+ }
136
+
137
+ /**
138
+ * Checks if the album exists
139
+ * @return bool
140
+ */
141
+ public function does_exist() {
142
+ return $this->ID > 0;
143
+ }
144
+
145
+ /**
146
+ * Returns true if the album is published
147
+ * @return bool
148
+ */
149
+ public function is_published() {
150
+ return $this->post_status === 'publish';
151
+ }
152
+
153
+ /**
154
+ * Get a comma separated list of gallery ids
155
+ * @return string
156
+ */
157
+ public function gallery_id_csv() {
158
+ if ( is_array( $this->gallery_ids ) ) {
159
+ return implode( ',', $this->gallery_ids );
160
+ }
161
+
162
+ return '';
163
+ }
164
+
165
+ /**
166
+ * Lazy load the attachments for the gallery
167
+ *
168
+ * @return array
169
+ */
170
+ public function galleries() {
171
+ //lazy load the attachments for performance
172
+ if ( $this->_galleries === false ) {
173
+ $this->_galleries = array();
174
+
175
+ if ( ! empty( $this->gallery_ids ) ) {
176
+
177
+ $gallery_query_args = apply_filters( 'foogallery_album_gallery_get_posts_args', array(
178
+ 'post_type' => FOOGALLERY_CPT_GALLERY,
179
+ 'posts_per_page' => -1,
180
+ 'post__in' => $this->gallery_ids,
181
+ 'orderby' => foogallery_sorting_get_posts_orderby_arg( $this->sorting ),
182
+ 'order' => foogallery_sorting_get_posts_order_arg( $this->sorting )
183
+ ) );
184
+
185
+ $galleries = get_posts( $gallery_query_args );
186
+
187
+ $this->_galleries = array_map( array( 'FooGallery', 'get' ), $galleries );
188
+ }
189
+ }
190
+
191
+ return $this->_galleries;
192
+ }
193
+
194
+ function includes_gallery( $gallery_id ) {
195
+ if ( $this->has_galleries() ) {
196
+ return in_array( $gallery_id, $this->gallery_ids );
197
+ }
198
+ return false;
199
+ }
200
+
201
+ public function gallery_count() {
202
+ $count = sizeof( $this->gallery_ids );
203
+ switch ( $count ) {
204
+ case 0:
205
+ return __( 'No galleries', 'foogallery' );
206
+ case 1:
207
+ return __( '1 gallery', 'foogallery' );
208
+ default:
209
+ return sprintf( __( '%s galleries', 'foogallery' ), $count );
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Output the shortcode for the gallery
215
+ *
216
+ * @return string
217
+ */
218
+ public function shortcode() {
219
+ return foogallery_build_album_shortcode( $this->ID );
220
+ }
221
+
222
+ function get_meta( $key, $default ) {
223
+ if ( ! is_array( $this->settings ) ) {
224
+ return $default;
225
+ }
226
+
227
+ $value = array_key_exists( $key, $this->settings ) ? $this->settings[ $key ] : null;
228
+
229
+ if ( $value === null ) {
230
+ return $default;
231
+ }
232
+
233
+ return $value;
234
+ }
235
+
236
+ function is_checked( $key, $default = false ) {
237
+ if ( ! is_array( $this->settings ) ) {
238
+ return $default;
239
+ }
240
+
241
+ return array_key_exists( $key, $this->settings );
242
+ }
243
+
244
+ public function album_template_details() {
245
+ if ( ! empty( $this->album_template ) ) {
246
+
247
+ foreach ( foogallery_album_templates() as $template ) {
248
+ if ( $this->album_template == $template['slug'] ) {
249
+ return $template;
250
+ }
251
+ }
252
+ }
253
+
254
+ return false;
255
+ }
256
+ }
extensions/albums/class-posttypes.php CHANGED
@@ -1,108 +1,108 @@
1
- <?php
2
- /*
3
- * FooGallery Album Custom Post Types
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Albums_PostTypes' ) ) {
7
-
8
- class FooGallery_Albums_PostTypes {
9
-
10
- function __construct() {
11
- //register the post types
12
- add_action( 'init', array( $this, 'register_posttype' ) );
13
-
14
- //update post type messages
15
- add_filter( 'post_updated_messages', array( $this, 'update_messages' ) );
16
-
17
- //update post bulk messages
18
- add_filter( 'bulk_post_updated_messages', array( $this, 'update_bulk_messages' ), 10, 2 );
19
- }
20
-
21
- function register_posttype() {
22
- //allow extensions to override the album post type
23
- $args = apply_filters( 'foogallery_album_posttype_register_args',
24
- array(
25
- 'labels' => array(
26
- 'name' => __( 'Albums', 'foogallery' ),
27
- 'singular_name' => __( 'Album', 'foogallery' ),
28
- 'add_new' => __( 'Add Album', 'foogallery' ),
29
- 'add_new_item' => __( 'Add New Album', 'foogallery' ),
30
- 'edit_item' => __( 'Edit Album', 'foogallery' ),
31
- 'new_item' => __( 'New Album', 'foogallery' ),
32
- 'view_item' => __( 'View Album', 'foogallery' ),
33
- 'search_items' => __( 'Search Albums', 'foogallery' ),
34
- 'not_found' => __( 'No Albums found', 'foogallery' ),
35
- 'not_found_in_trash' => __( 'No Albums found in Trash', 'foogallery' ),
36
- 'menu_name' => __( 'Albums', 'foogallery' ),
37
- 'all_items' => __( 'Albums', 'foogallery' )
38
- ),
39
- 'hierarchical' => false,
40
- 'public' => false,
41
- 'rewrite' => false,
42
- 'show_ui' => true,
43
- 'show_in_menu' => foogallery_admin_menu_parent_slug(),
44
- 'supports' => array( 'title' ),
45
- )
46
- );
47
-
48
- register_post_type( FOOGALLERY_CPT_ALBUM, $args );
49
- }
50
-
51
- /**
52
- * Customize the update messages for a album
53
- *
54
- * @global object $post The current post object.
55
- *
56
- * @param array $messages Array of default post updated messages.
57
- *
58
- * @return array $messages Amended array of post updated messages.
59
- */
60
- public function update_messages( $messages ) {
61
-
62
- global $post;
63
-
64
- // Add our album messages
65
- $messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_update_messages',
66
- array(
67
- 0 => '',
68
- 1 => __( 'Album updated.', 'foogallery' ),
69
- 2 => __( 'Album custom field updated.', 'foogallery' ),
70
- 3 => __( 'Album custom field deleted.', 'foogallery' ),
71
- 4 => __( 'Album updated.', 'foogallery' ),
72
- 5 => isset($_GET['revision']) ? sprintf( __( 'Album restored to revision from %s.', 'foogallery' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
- 6 => __( 'Album published.', 'foogallery' ),
74
- 7 => __( 'Album saved.', 'foogallery' ),
75
- 8 => __( 'Album submitted.', 'foogallery' ),
76
- 9 => sprintf( __( 'Album scheduled for: <strong>%1$s</strong>.', 'foogallery' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) ),
77
- 10 => __( 'Album draft updated.', 'foogallery' )
78
- )
79
- );
80
-
81
- return $messages;
82
-
83
- }
84
-
85
- /**
86
- * Customize the bulk update messages for a album
87
- *
88
- * @param array $bulk_messages Array of default bulk updated messages.
89
- * @param array $bulk_counts Array containing count of posts involved in the action.
90
- *
91
- * @return array mixed Amended array of bulk updated messages.
92
- */
93
- function update_bulk_messages( $bulk_messages, $bulk_counts ) {
94
-
95
- $bulk_messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_bulk_update_messages',
96
- array(
97
- 'updated' => _n( '%s Album updated.', '%s Albums updated.', $bulk_counts['updated'], 'foogallery' ),
98
- 'locked' => _n( '%s Album not updated, somebody is editing it.', '%s Albums not updated, somebody is editing them.', $bulk_counts['locked'], 'foogallery' ),
99
- 'deleted' => _n( '%s Album permanently deleted.', '%s Albums permanently deleted.', $bulk_counts['deleted'], 'foogallery' ),
100
- 'trashed' => _n( '%s Album moved to the Trash.', '%s Albums moved to the Trash.', $bulk_counts['trashed'], 'foogallery' ),
101
- 'untrashed' => _n( '%s Album restored from the Trash.', '%s Albums restored from the Trash.', $bulk_counts['untrashed'], 'foogallery' ),
102
- )
103
- );
104
-
105
- return $bulk_messages;
106
- }
107
- }
108
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Album Custom Post Types
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Albums_PostTypes' ) ) {
7
+
8
+ class FooGallery_Albums_PostTypes {
9
+
10
+ function __construct() {
11
+ //register the post types
12
+ add_action( 'init', array( $this, 'register_posttype' ) );
13
+
14
+ //update post type messages
15
+ add_filter( 'post_updated_messages', array( $this, 'update_messages' ) );
16
+
17
+ //update post bulk messages
18
+ add_filter( 'bulk_post_updated_messages', array( $this, 'update_bulk_messages' ), 10, 2 );
19
+ }
20
+
21
+ function register_posttype() {
22
+ //allow extensions to override the album post type
23
+ $args = apply_filters( 'foogallery_album_posttype_register_args',
24
+ array(
25
+ 'labels' => array(
26
+ 'name' => __( 'Albums', 'foogallery' ),
27
+ 'singular_name' => __( 'Album', 'foogallery' ),
28
+ 'add_new' => __( 'Add Album', 'foogallery' ),
29
+ 'add_new_item' => __( 'Add New Album', 'foogallery' ),
30
+ 'edit_item' => __( 'Edit Album', 'foogallery' ),
31
+ 'new_item' => __( 'New Album', 'foogallery' ),
32
+ 'view_item' => __( 'View Album', 'foogallery' ),
33
+ 'search_items' => __( 'Search Albums', 'foogallery' ),
34
+ 'not_found' => __( 'No Albums found', 'foogallery' ),
35
+ 'not_found_in_trash' => __( 'No Albums found in Trash', 'foogallery' ),
36
+ 'menu_name' => __( 'Albums', 'foogallery' ),
37
+ 'all_items' => __( 'Albums', 'foogallery' )
38
+ ),
39
+ 'hierarchical' => false,
40
+ 'public' => false,
41
+ 'rewrite' => false,
42
+ 'show_ui' => true,
43
+ 'show_in_menu' => foogallery_admin_menu_parent_slug(),
44
+ 'supports' => array( 'title' ),
45
+ )
46
+ );
47
+
48
+ register_post_type( FOOGALLERY_CPT_ALBUM, $args );
49
+ }
50
+
51
+ /**
52
+ * Customize the update messages for a album
53
+ *
54
+ * @global object $post The current post object.
55
+ *
56
+ * @param array $messages Array of default post updated messages.
57
+ *
58
+ * @return array $messages Amended array of post updated messages.
59
+ */
60
+ public function update_messages( $messages ) {
61
+
62
+ global $post;
63
+
64
+ // Add our album messages
65
+ $messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_update_messages',
66
+ array(
67
+ 0 => '',
68
+ 1 => __( 'Album updated.', 'foogallery' ),
69
+ 2 => __( 'Album custom field updated.', 'foogallery' ),
70
+ 3 => __( 'Album custom field deleted.', 'foogallery' ),
71
+ 4 => __( 'Album updated.', 'foogallery' ),
72
+ 5 => isset($_GET['revision']) ? sprintf( __( 'Album restored to revision from %s.', 'foogallery' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
+ 6 => __( 'Album published.', 'foogallery' ),
74
+ 7 => __( 'Album saved.', 'foogallery' ),
75
+ 8 => __( 'Album submitted.', 'foogallery' ),
76
+ 9 => sprintf( __( 'Album scheduled for: <strong>%1$s</strong>.', 'foogallery' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) ),
77
+ 10 => __( 'Album draft updated.', 'foogallery' )
78
+ )
79
+ );
80
+
81
+ return $messages;
82
+
83
+ }
84
+
85
+ /**
86
+ * Customize the bulk update messages for a album
87
+ *
88
+ * @param array $bulk_messages Array of default bulk updated messages.
89
+ * @param array $bulk_counts Array containing count of posts involved in the action.
90
+ *
91
+ * @return array mixed Amended array of bulk updated messages.
92
+ */
93
+ function update_bulk_messages( $bulk_messages, $bulk_counts ) {
94
+
95
+ $bulk_messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_bulk_update_messages',
96
+ array(
97
+ 'updated' => _n( '%s Album updated.', '%s Albums updated.', $bulk_counts['updated'], 'foogallery' ),
98
+ 'locked' => _n( '%s Album not updated, somebody is editing it.', '%s Albums not updated, somebody is editing them.', $bulk_counts['locked'], 'foogallery' ),
99
+ 'deleted' => _n( '%s Album permanently deleted.', '%s Albums permanently deleted.', $bulk_counts['deleted'], 'foogallery' ),
100
+ 'trashed' => _n( '%s Album moved to the Trash.', '%s Albums moved to the Trash.', $bulk_counts['trashed'], 'foogallery' ),
101
+ 'untrashed' => _n( '%s Album restored from the Trash.', '%s Albums restored from the Trash.', $bulk_counts['untrashed'], 'foogallery' ),
102
+ )
103
+ );
104
+
105
+ return $bulk_messages;
106
+ }
107
+ }
108
+ }
extensions/albums/css/admin-foogallery-album.css CHANGED
@@ -1,273 +1,273 @@
1
-
2
- .foogallery-shortcode {
3
- text-align: center;
4
- }
5
-
6
- .foogallery-shortcode input {
7
- cursor: pointer;
8
- text-align: center;
9
- padding: 10px;
10
- font-family: "courier new", courier;
11
- border: none;
12
- box-shadow: none;
13
- background: #efefef;
14
- }
15
-
16
- .wp-list-table .foogallery-shortcode {
17
- cursor: pointer;
18
- font-size: 1em;
19
- border: none;
20
- box-shadow: none;
21
- background: #efefef;
22
- font-family: "courier new", courier;
23
- }
24
-
25
- .foogallery-shortcode-message {
26
- font-style: italic;
27
- color: #2EA2CC !important;
28
- }
29
-
30
- .foogallery-album-gallery-list .attachment.placeholder {
31
- position: relative;
32
- z-index: 10;
33
- float: left;
34
- margin: 10px 15px 15px 10px !important;
35
- width: 164px;
36
- height: 164px;
37
- border: #1e8cbe 1px dashed;
38
- background: #eee;
39
- }
40
-
41
- .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper {
42
- opacity: 0.5;
43
- }
44
-
45
- .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper:hover .close {
46
- display: none;
47
- }
48
-
49
- .foogallery_template_field td {
50
- padding-bottom: 20px;
51
- }
52
-
53
- .foogallery_template_field th {
54
- vertical-align: top;
55
- text-align: left;
56
- padding-top: 0.3em;
57
- padding-right: 10px;
58
- }
59
-
60
- .foogallery_metabox_field-icon label {
61
- display:inline-block;
62
- margin-right:10px;
63
- border:solid 3px transparent;
64
- background:#aaa;
65
- border-radius: 3px;
66
- -moz-border-radius: 3px;
67
- -webkit-border-radius: 3px;
68
- padding:5px;
69
- line-height: 0;
70
- }
71
-
72
- .foogallery_metabox_field-icon input:checked + label {
73
- border:solid 3px #444;
74
- background: #888;
75
- }
76
-
77
- .foogallery_metabox_field-icon label:hover {
78
- border:solid 3px #444;
79
- }
80
-
81
- .foogallery_metabox_field-thumb_size label {
82
- vertical-align: baseline;
83
- }
84
-
85
- .foogallery_metabox_field-thumb_size input[type="number"] {
86
- margin-right: 10px;
87
- }
88
-
89
- .foogallery_template_field h4 {
90
- font-size: 1.2em;
91
- border-bottom: solid 1px #EEE;
92
- padding-bottom: 5px;
93
- margin: 0;
94
- }
95
-
96
- .foogallery_metabox_field-number input[type="number"] {
97
- width: 10em;
98
- }
99
-
100
- .foogallery_metabox_custom_css {
101
- width: 100%;
102
- height: 10em;
103
- }
104
-
105
- .foogallery_metabox_field-radio > input, .foogallery_metabox_field-radio > label {
106
- margin-bottom: 10px;
107
- display: inline-block;
108
- }
109
-
110
- .foogallery_template_field th {
111
- width: 180px;
112
- }
113
-
114
- .foogallery-help {
115
- position: relative;
116
- display: block;
117
- line-height: 19px;
118
- padding: 11px 15px 11px 40px;
119
- font-size: 14px;
120
- text-align: left;
121
- margin: 5px 0 20px 2px;
122
- background-color: #F4F4FF;
123
- border-left: 4px solid #1e8cbe;
124
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
125
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
126
- }
127
-
128
- .foogallery-help:before {
129
- content: "\f223";
130
- font: 400 30px/1 dashicons !important;
131
- speak: none;
132
- color: #1e8cbe;
133
- display: inline-block;
134
- -webkit-font-smoothing: antialiased;
135
- -moz-osx-font-smoothing: grayscale;
136
- vertical-align: bottom;
137
- position: absolute;
138
- left: 5px;
139
- height: 100%;
140
- margin-top: -15px;
141
- top: 50%;
142
- }
143
-
144
- .foogallery-album-error {
145
- padding: 11px 15px;
146
- font-size: 14px;
147
- text-align: left;
148
- border-left: 4px solid #dc3232;
149
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
150
- box-shadow: 1px 1px 1px 1px rgba(0,0,0,.1);
151
- }
152
-
153
- .foogallery-album-gallery-list a.info {
154
- display: none;
155
- position: absolute;
156
- padding: 0;
157
- font-size: 20px;
158
- line-height: 20px;
159
- text-align: center;
160
- text-decoration: none;
161
- background-color: #444;
162
- border-radius: 50%;
163
- color: #fff;
164
- top: 5px;
165
- left: 5px;
166
- }
167
-
168
- .foogallery-album-gallery-list .foogallery-gallery-select:hover a.info {
169
- display: block;
170
- }
171
-
172
- .foogallery-album-info-modal {
173
- display: none;
174
- top: 20%;
175
- bottom: 20%;
176
- left: 30%;
177
- right: 30%;
178
- }
179
-
180
- .foogallery-album-info-modal .media-frame-title {
181
- left:0;
182
- }
183
-
184
- .foogallery-album-info-modal .media-frame-title h1 {
185
- float: left;
186
- }
187
-
188
- .foogallery-album-info-modal .media-frame-title .spinner {
189
- float:left;
190
- margin: 15px 0;
191
- }
192
-
193
- .foogallery-album-info-modal .close {
194
- position: absolute;
195
- top: 20px;
196
- right: 20px;
197
- cursor: pointer;
198
- font-size: 20px;
199
- }
200
-
201
- .foogallery-album-info-modal .modal-content {
202
- position: absolute;
203
- top: 50px;
204
- left: 0;
205
- right: 0;
206
- bottom: 61px;
207
- height: auto;
208
- width: auto;
209
- margin: 0;
210
- overflow: auto;
211
- background: #fff;
212
- border-top: 1px solid #ddd;
213
- border-bottom: 1px solid #ddd;
214
- padding: 20px;
215
- min-width: 400px;
216
- }
217
-
218
- .foogallery-album-info-modal .gallery-details,
219
- .foogallery-album-info-modal .gallery-details table {
220
- width: 100%;
221
- }
222
-
223
- .foogallery-album-info-modal .gallery-details th {
224
- vertical-align: top;
225
- }
226
-
227
- .foogallery-album-info-modal .gallery-details th label {
228
- box-sizing: border-box;
229
- float: right;
230
- padding: 6px 0px;
231
- margin-right: 20px;
232
- font-weight: normal;
233
- }
234
-
235
- .foogallery-album-info-modal .gallery-details td input,
236
- .foogallery-album-info-modal .gallery-details td textarea,
237
- .foogallery-album-info-modal .gallery-details td select {
238
- width: 100%;
239
- }
240
-
241
- .foogallery-album-info-modal .gallery-details td select {
242
- line-height: inherit;
243
- padding: 6px 8px;
244
- height: inherit;
245
- }
246
-
247
- .foogallery-album-info-modal .gallery-details td .help {
248
- margin-top: 0;
249
- font-size: 0.8em;
250
- }
251
-
252
- .foogallery-album-info-modal .media-toolbar .spinner {
253
- margin-top: 20px;
254
- margin-right: 0;
255
- }
256
-
257
- .foogallery-album-info-modal .media-frame-toolbar {
258
- left: 0;
259
- }
260
-
261
- .foogallery-album-info-modal .media-frame-toolbar .media-toolbar-secondary {
262
- line-height: 60px;
263
- font-weight: bold;
264
- }
265
-
266
- .foogallery-album-info-modal-backdrop {
267
- display: none;
268
- }
269
-
270
- .spacer {
271
- display: inline-block;
272
- width:30px;
273
  }
1
+
2
+ .foogallery-shortcode {
3
+ text-align: center;
4
+ }
5
+
6
+ .foogallery-shortcode input {
7
+ cursor: pointer;
8
+ text-align: center;
9
+ padding: 10px;
10
+ font-family: "courier new", courier;
11
+ border: none;
12
+ box-shadow: none;
13
+ background: #efefef;
14
+ }
15
+
16
+ .wp-list-table .foogallery-shortcode {
17
+ cursor: pointer;
18
+ font-size: 1em;
19
+ border: none;
20
+ box-shadow: none;
21
+ background: #efefef;
22
+ font-family: "courier new", courier;
23
+ }
24
+
25
+ .foogallery-shortcode-message {
26
+ font-style: italic;
27
+ color: #2EA2CC !important;
28
+ }
29
+
30
+ .foogallery-album-gallery-list .attachment.placeholder {
31
+ position: relative;
32
+ z-index: 10;
33
+ float: left;
34
+ margin: 10px 15px 15px 10px !important;
35
+ width: 164px;
36
+ height: 164px;
37
+ border: #1e8cbe 1px dashed;
38
+ background: #eee;
39
+ }
40
+
41
+ .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper {
42
+ opacity: 0.5;
43
+ }
44
+
45
+ .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper:hover .close {
46
+ display: none;
47
+ }
48
+
49
+ .foogallery_template_field td {
50
+ padding-bottom: 20px;
51
+ }
52
+
53
+ .foogallery_template_field th {
54
+ vertical-align: top;
55
+ text-align: left;
56
+ padding-top: 0.3em;
57
+ padding-right: 10px;
58
+ }
59
+
60
+ .foogallery_metabox_field-icon label {
61
+ display:inline-block;
62
+ margin-right:10px;
63
+ border:solid 3px transparent;
64
+ background:#aaa;
65
+ border-radius: 3px;
66
+ -moz-border-radius: 3px;
67
+ -webkit-border-radius: 3px;
68
+ padding:5px;
69
+ line-height: 0;
70
+ }
71
+
72
+ .foogallery_metabox_field-icon input:checked + label {
73
+ border:solid 3px #444;
74
+ background: #888;
75
+ }
76
+
77
+ .foogallery_metabox_field-icon label:hover {
78
+ border:solid 3px #444;
79
+ }
80
+
81
+ .foogallery_metabox_field-thumb_size label {
82
+ vertical-align: baseline;
83
+ }
84
+
85
+ .foogallery_metabox_field-thumb_size input[type="number"] {
86
+ margin-right: 10px;
87
+ }
88
+
89
+ .foogallery_template_field h4 {
90
+ font-size: 1.2em;
91
+ border-bottom: solid 1px #EEE;
92
+ padding-bottom: 5px;
93
+ margin: 0;
94
+ }
95
+
96
+ .foogallery_metabox_field-number input[type="number"] {
97
+ width: 10em;
98
+ }
99
+
100
+ .foogallery_metabox_custom_css {
101
+ width: 100%;
102
+ height: 10em;
103
+ }
104
+
105
+ .foogallery_metabox_field-radio > input, .foogallery_metabox_field-radio > label {
106
+ margin-bottom: 10px;
107
+ display: inline-block;
108
+ }
109
+
110
+ .foogallery_template_field th {
111
+ width: 180px;
112
+ }
113
+
114
+ .foogallery-help {
115
+ position: relative;
116
+ display: block;
117
+ line-height: 19px;
118
+ padding: 11px 15px 11px 40px;
119
+ font-size: 14px;
120
+ text-align: left;
121
+ margin: 5px 0 20px 2px;
122
+ background-color: #F4F4FF;
123
+ border-left: 4px solid #1e8cbe;
124
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
125
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
126
+ }
127
+
128
+ .foogallery-help:before {
129
+ content: "\f223";
130
+ font: 400 30px/1 dashicons !important;
131
+ speak: none;
132
+ color: #1e8cbe;
133
+ display: inline-block;
134
+ -webkit-font-smoothing: antialiased;
135
+ -moz-osx-font-smoothing: grayscale;
136
+ vertical-align: bottom;
137
+ position: absolute;
138
+ left: 5px;
139
+ height: 100%;
140
+ margin-top: -15px;
141
+ top: 50%;
142
+ }
143
+
144
+ .foogallery-album-error {
145
+ padding: 11px 15px;
146
+ font-size: 14px;
147
+ text-align: left;
148
+ border-left: 4px solid #dc3232;
149
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
150
+ box-shadow: 1px 1px 1px 1px rgba(0,0,0,.1);
151
+ }
152
+
153
+ .foogallery-album-gallery-list a.info {
154
+ display: none;
155
+ position: absolute;
156
+ padding: 0;
157
+ font-size: 20px;
158
+ line-height: 20px;
159
+ text-align: center;
160
+ text-decoration: none;
161
+ background-color: #444;
162
+ border-radius: 50%;
163
+ color: #fff;
164
+ top: 5px;
165
+ left: 5px;
166
+ }
167
+
168
+ .foogallery-album-gallery-list .foogallery-gallery-select:hover a.info {
169
+ display: block;
170
+ }
171
+
172
+ .foogallery-album-info-modal {
173
+ display: none;
174
+ top: 20%;
175
+ bottom: 20%;
176
+ left: 30%;
177
+ right: 30%;
178
+ }
179
+
180
+ .foogallery-album-info-modal .media-frame-title {
181
+ left:0;
182
+ }
183
+
184
+ .foogallery-album-info-modal .media-frame-title h1 {
185
+ float: left;
186
+ }
187
+
188
+ .foogallery-album-info-modal .media-frame-title .spinner {
189
+ float:left;
190
+ margin: 15px 0;
191
+ }
192
+
193
+ .foogallery-album-info-modal .close {
194
+ position: absolute;
195
+ top: 20px;
196
+ right: 20px;
197
+ cursor: pointer;
198
+ font-size: 20px;
199
+ }
200
+
201
+ .foogallery-album-info-modal .modal-content {
202
+ position: absolute;
203
+ top: 50px;
204
+ left: 0;
205
+ right: 0;
206
+ bottom: 61px;
207
+ height: auto;
208
+ width: auto;
209
+ margin: 0;
210
+ overflow: auto;
211
+ background: #fff;
212
+ border-top: 1px solid #ddd;
213
+ border-bottom: 1px solid #ddd;
214
+ padding: 20px;
215
+ min-width: 400px;
216
+ }
217
+
218
+ .foogallery-album-info-modal .gallery-details,
219
+ .foogallery-album-info-modal .gallery-details table {
220
+ width: 100%;
221
+ }
222
+
223
+ .foogallery-album-info-modal .gallery-details th {
224
+ vertical-align: top;
225
+ }
226
+
227
+ .foogallery-album-info-modal .gallery-details th label {
228
+ box-sizing: border-box;
229
+ float: right;
230
+ padding: 6px 0px;
231
+ margin-right: 20px;
232
+ font-weight: normal;
233
+ }
234
+
235
+ .foogallery-album-info-modal .gallery-details td input,
236
+ .foogallery-album-info-modal .gallery-details td textarea,
237
+ .foogallery-album-info-modal .gallery-details td select {
238
+ width: 100%;
239
+ }
240
+
241
+ .foogallery-album-info-modal .gallery-details td select {
242
+ line-height: inherit;
243
+ padding: 6px 8px;
244
+ height: inherit;
245
+ }
246
+
247
+ .foogallery-album-info-modal .gallery-details td .help {
248
+ margin-top: 0;
249
+ font-size: 0.8em;
250
+ }
251
+
252
+ .foogallery-album-info-modal .media-toolbar .spinner {
253
+ margin-top: 20px;
254
+ margin-right: 0;
255
+ }
256
+
257
+ .foogallery-album-info-modal .media-frame-toolbar {
258
+ left: 0;
259
+ }
260
+
261
+ .foogallery-album-info-modal .media-frame-toolbar .media-toolbar-secondary {
262
+ line-height: 60px;
263
+ font-weight: bold;
264
+ }
265
+
266
+ .foogallery-album-info-modal-backdrop {
267
+ display: none;
268
+ }
269
+
270
+ .spacer {
271
+ display: inline-block;
272
+ width:30px;
273
  }
extensions/albums/css/album-default.css CHANGED
@@ -1,103 +1,103 @@
1
- .foogallery-album-gallery-list {
2
- list-style: none !important;
3
- padding: 0 !important;
4
- }
5
-
6
- .foogallery-album-gallery-list li {
7
- list-style-type: none !important;
8
- display: inline-block;
9
- }
10
-
11
- .foogallery-album-gallery-list .foogallery-pile {
12
- position: relative;
13
- z-index: 10;
14
- float: left;
15
- margin: 10px 15px 15px 10px !important;
16
- }
17
-
18
- /* Stacks created by the use of generated content */
19
- .foogallery-album-gallery-list .foogallery-pile:before,
20
- .foogallery-album-gallery-list .foogallery-pile:after {
21
- content: "";
22
- width: 100%;
23
- height: 100%;
24
- position: absolute;
25
- border: 8px solid #fff;
26
- left: 0;
27
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
30
- -webkit-box-sizing: border-box;
31
- -moz-box-sizing: border-box;
32
- box-sizing: border-box;
33
- }
34
- /* 1st element in stack (behind image) */
35
- .foogallery-album-gallery-list .foogallery-pile:before {
36
- top: -3px; z-index: -10;
37
- -webkit-transform: rotate(2deg);
38
- -moz-transform: rotate(2deg);
39
- transform: rotate(2deg);
40
- }
41
- /* 2nd element in stack (behind image) */
42
- .foogallery-album-gallery-list .foogallery-pile:after {
43
- top: -2px; z-index: -20;
44
- -webkit-transform: rotate(-2deg);
45
- -moz-transform: rotate(-2deg);
46
- transform: rotate(-2deg);
47
- }
48
-
49
- .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner {
50
- border: 8px solid #fff;
51
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
52
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
53
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
54
- overflow: hidden;
55
- line-height: 0;
56
- }
57
-
58
- .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner a {
59
- display: inline-block;
60
- }
61
-
62
- .foogallery-album-gallery-list .foogallery-pile img {
63
- }
64
-
65
- .foogallery-album-gallery-list .foogallery-pile h3 {
66
- background: #FFF;
67
- position: absolute;
68
- display: block;
69
- bottom: 0px;
70
- padding: 5px 5px 0 5px;
71
- width: 100%;
72
- box-sizing: border-box;
73
- margin: 0;
74
- opacity: 0.6;
75
- line-height: 1em;
76
- }
77
-
78
- .foogallery-album-gallery-list .foogallery-pile h3 span {
79
- display: block;
80
- font-size: 0.6em;
81
- }
82
-
83
- .foogallery-album-gallery-list .foogallery-pile a {
84
- position: relative;
85
- }
86
-
87
- .foogallery-album-gallery-list.alignment-left {
88
- text-align: left;
89
- }
90
-
91
- .foogallery-album-gallery-list.alignment-center {
92
- text-align: center;
93
- }
94
-
95
- .foogallery-album-gallery-list.alignment-right {
96
- text-align: right;
97
- }
98
-
99
- /* force no borders */
100
- .foogallery-album-gallery-list .foogallery-pile a,
101
- .foogallery-album-gallery-list .foogallery-pile a:hover {
102
- border: none !important;
103
  }
1
+ .foogallery-album-gallery-list {
2
+ list-style: none !important;
3
+ padding: 0 !important;
4
+ }
5
+
6
+ .foogallery-album-gallery-list li {
7
+ list-style-type: none !important;
8
+ display: inline-block;
9
+ }
10
+
11
+ .foogallery-album-gallery-list .foogallery-pile {
12
+ position: relative;
13
+ z-index: 10;
14
+ float: left;
15
+ margin: 10px 15px 15px 10px !important;
16
+ }
17
+
18
+ /* Stacks created by the use of generated content */
19
+ .foogallery-album-gallery-list .foogallery-pile:before,
20
+ .foogallery-album-gallery-list .foogallery-pile:after {
21
+ content: "";
22
+ width: 100%;
23
+ height: 100%;
24
+ position: absolute;
25
+ border: 8px solid #fff;
26
+ left: 0;
27
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
30
+ -webkit-box-sizing: border-box;
31
+ -moz-box-sizing: border-box;
32
+ box-sizing: border-box;
33
+ }
34
+ /* 1st element in stack (behind image) */
35
+ .foogallery-album-gallery-list .foogallery-pile:before {
36
+ top: -3px; z-index: -10;
37
+ -webkit-transform: rotate(2deg);
38
+ -moz-transform: rotate(2deg);
39
+ transform: rotate(2deg);
40
+ }
41
+ /* 2nd element in stack (behind image) */
42
+ .foogallery-album-gallery-list .foogallery-pile:after {
43
+ top: -2px; z-index: -20;
44
+ -webkit-transform: rotate(-2deg);
45
+ -moz-transform: rotate(-2deg);
46
+ transform: rotate(-2deg);
47
+ }
48
+
49
+ .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner {
50
+ border: 8px solid #fff;
51
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
52
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
53
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
54
+ overflow: hidden;
55
+ line-height: 0;
56
+ }
57
+
58
+ .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner a {
59
+ display: inline-block;
60
+ }
61
+
62
+ .foogallery-album-gallery-list .foogallery-pile img {
63
+ }
64
+
65
+ .foogallery-album-gallery-list .foogallery-pile h3 {
66
+ background: #FFF;
67
+ position: absolute;
68
+ display: block;
69
+ bottom: 0px;
70
+ padding: 5px 5px 0 5px;
71
+ width: 100%;
72
+ box-sizing: border-box;
73
+ margin: 0;
74
+ opacity: 0.6;
75
+ line-height: 1em;
76
+ }
77
+
78
+ .foogallery-album-gallery-list .foogallery-pile h3 span {
79
+ display: block;
80
+ font-size: 0.6em;
81
+ }
82
+
83
+ .foogallery-album-gallery-list .foogallery-pile a {
84
+ position: relative;
85
+ }
86
+
87
+ .foogallery-album-gallery-list.alignment-left {
88
+ text-align: left;
89
+ }
90
+
91
+ .foogallery-album-gallery-list.alignment-center {
92
+ text-align: center;
93
+ }
94
+
95
+ .foogallery-album-gallery-list.alignment-right {
96
+ text-align: right;
97
+ }
98
+
99
+ /* force no borders */
100
+ .foogallery-album-gallery-list .foogallery-pile a,
101
+ .foogallery-album-gallery-list .foogallery-pile a:hover {
102
+ border: none !important;
103
  }
extensions/albums/css/album-stack.css CHANGED
@@ -1,290 +1,290 @@
1
- .tp-grid {
2
- list-style-type: none;
3
- position: relative;
4
- display: block;
5
- }
6
-
7
- .tp-grid li {
8
- position: absolute;
9
- cursor: pointer;
10
- border: 10px solid #fff;
11
- box-shadow: 0 2px 3px rgba(0,0,0,0.2);
12
- display: none;
13
- overflow: hidden;
14
- -webkit-backface-visibility: hidden;
15
- -moz-backface-visibility: hidden;
16
- -o-backface-visibility: hidden;
17
- -ms-backface-visibility: hidden;
18
- backface-visibility: hidden;
19
- }
20
-
21
- .no-js .tp-grid li {
22
- position: relative;
23
- display: inline-block;
24
- }
25
-
26
- .tp-grid li a {
27
- display: block;
28
- outline: none;
29
- }
30
-
31
- .tp-grid li img {
32
- display: block;
33
- border: none;
34
- }
35
-
36
- .tp-info,
37
- .tp-title {
38
- position: absolute;
39
- background: #fff;
40
- line-height: 20px;
41
- color: #333;
42
- top: 40%;
43
- width: 75%;
44
- padding: 10px;
45
- font-weight: 700;
46
- text-align: right;
47
- left: -100%;
48
- box-shadow:
49
- 1px 1px 1px rgba(0,0,0,0.1),
50
- 5px 0 5px -3px rgba(0,0,0,0.4),
51
- inset 0 0 5px rgba(0,0,0,0.04);
52
- }
53
-
54
- .tp-title-cover {
55
- position: absolute;
56
- top: 0;
57
- bottom: 0;
58
- left: 0;
59
- right: 0;
60
- }
61
-
62
- .tp-open .tp-title-cover {
63
- display: none;
64
- }
65
-
66
- .touch .tp-info {
67
- left: 0px;
68
- }
69
-
70
- .no-touch .tp-info {
71
- -webkit-transition: all 0.3s ease-in-out;
72
- -moz-transition: all 0.3s ease-in-out;
73
- -o-transition: all 0.3s ease-in-out;
74
- -ms-transition: all 0.3s ease-in-out;
75
- transition: all 0.3s ease-in-out;
76
- }
77
-
78
- .no-touch .tp-grid li:hover .tp-info {
79
- -webkit-transition-delay: 150ms;
80
- -moz-transition-delay: 150ms;
81
- -o-transition-delay: 150ms;
82
- -ms-transition-delay: 150ms;
83
- transition-delay: 150ms;
84
- }
85
-
86
- .no-touch .tp-open li:hover .tp-info {
87
- left: 0px;
88
- }
89
-
90
- .tp-title {
91
- padding: 10px 35px 10px 10px;
92
- left: 0px;
93
- }
94
-
95
- .tp-title span:nth-child(2){
96
- color: #aaa;
97
- padding: 0 5px;
98
- background: #F7F7F7;
99
- right: 0px;
100
- height: 100%;
101
- line-height: 40px;
102
- top: 0px;
103
- position: absolute;
104
- display: block;
105
- }
106
-
107
- .foogallery-stack-album * {
108
- box-sizing: border-box;
109
- }
110
-
111
- .foogallery-stack-album .topbar {
112
- position: relative;
113
- padding: 10px 0;
114
- margin: 0 0 20px;
115
- box-shadow: 0 1px 0 #aaa, 0 -1px 0 #aaa;
116
- }
117
-
118
- .foogallery-stack-album .back {
119
- width: 40px;
120
- height: 40px;
121
- position: absolute;
122
- left: 50%;
123
- top: 50%;
124
- margin: -20px 0 0 -20px;
125
- border-radius: 50%;
126
- text-align: center;
127
- line-height: 38px;
128
- color: #999;
129
- background: #ddd;
130
- background: rgba(200,200,200,0.5);
131
- cursor: pointer;
132
- display: none;
133
- -webkit-touch-callout: none;
134
- -webkit-user-select: none;
135
- -khtml-user-select: none;
136
- -moz-user-select: none;
137
- -ms-user-select: none;
138
- user-select: none;
139
- }
140
-
141
- .no-touch .foogallery-stack-album .back:hover {
142
- background: #666;
143
- background: rgba(100,100,100,0.5);
144
- color: #fff;
145
- }
146
-
147
- .foogallery-stack-album .topbar h2,
148
- .foogallery-stack-album .topbar h3 {
149
- display: inline-block;
150
- width: 49%;
151
- margin: 0;
152
- }
153
-
154
- .foogallery-stack-album .topbar h2 {
155
- padding-right: 20px;
156
- }
157
-
158
- .foogallery-stack-album .topbar h3 {
159
- text-align: right;
160
- padding-left: 20px;
161
- }
162
-
163
- /* Loader */
164
-
165
- .foogallery-stack-album .loader {
166
- left: 50%;
167
- position: absolute;
168
- margin-left: -120px;
169
- }
170
-
171
- .foogallery-stack-album .loader i {
172
- display: inline-block;
173
- width: 40px;
174
- height: 40px;
175
- -webkit-animation: loading 1s linear infinite forwards;
176
- -moz-animation: loading 1s linear infinite forwards;
177
- -o-animation: loading 1s linear infinite forwards;
178
- -ms-animation: loading 1s linear infinite forwards;
179
- animation: loading 1s linear infinite forwards;
180
- }
181
-
182
- .foogallery-stack-album .loader i:nth-child(2){
183
- -webkit-animation-delay: 0.1s;
184
- -moz-animation-delay: 0.1s;
185
- -o-animation-delay: 0.1s;
186
- -ms-animation-delay: 0.1s;
187
- animation-delay: 0.1s;
188
- }
189
-
190
- .foogallery-stack-album .loader i:nth-child(3){
191
- -webkit-animation-delay: 0.2s;
192
- -moz-animation-delay: 0.2s;
193
- -o-animation-delay: 0.2s;
194
- -ms-animation-delay: 0.2s;
195
- animation-delay: 0.2s;
196
- }
197
-
198
- .foogallery-stack-album .loader i:nth-child(4){
199
- -webkit-animation-delay: 0.3s;
200
- -moz-animation-delay: 0.3s;
201
- -o-animation-delay: 0.3s;
202
- -ms-animation-delay: 0.3s;
203
- animation-delay: 0.3s;
204
- }
205
-
206
- .foogallery-stack-album .loader i:nth-child(5){
207
- -webkit-animation-delay: 0.4s;
208
- -moz-animation-delay: 0.4s;
209
- -o-animation-delay: 0.4s;
210
- -ms-animation-delay: 0.4s;
211
- animation-delay: 0.4s;
212
- }
213
-
214
- .foogallery-stack-album .loader i:nth-child(6){
215
- -webkit-animation-delay: 0.5s;
216
- -moz-animation-delay: 0.5s;
217
- -o-animation-delay: 0.5s;
218
- -ms-animation-delay: 0.5s;
219
- animation-delay: 0.5s;
220
- }
221
-
222
- @-webkit-keyframes loading{
223
- 0%{
224
- opacity: 0;
225
- background-color: rgba(255,255,255,0.9);
226
- }
227
-
228
- 100%{
229
- opacity: 1;
230
- -webkit-transform: scale(0.25) rotate(75deg);
231
- background-color: rgba(155,155,155,0.9);
232
- }
233
- }
234
-
235
- @-moz-keyframes loading{
236
- 0%{
237
- opacity: 0;
238
- background-color: rgba(255,255,255,0.9);
239
- }
240
-
241
- 100%{
242
- opacity: 1;
243
- -moz-transform: scale(0.25) rotate(75deg);
244
- background-color: rgba(155,155,155,0.9);
245
- }
246
- }
247
-
248
- @-o-keyframes loading{
249
- 0%{
250
- opacity: 0;
251
- background-color: rgba(255,255,255,0.9);
252
- }
253
-
254
- 100%{
255
- opacity: 1;
256
- -o-transform: scale(0.25) rotate(75deg);
257
- background-color: rgba(155,155,155,0.9);
258
- }
259
- }
260
-
261
- @-ms-keyframes loading{
262
- 0%{
263
- opacity: 0;
264
- background-color: rgba(255,255,255,0.9);
265
- }
266
-
267
- 100%{
268
- opacity: 1;
269
- -ms-transform: scale(0.25) rotate(75deg);
270
- background-color: rgba(155,155,155,0.9);
271
- }
272
- }
273
-
274
- @keyframes loading{
275
- 0%{
276
- opacity: 0;
277
- background-color: rgba(255,255,255,0.9);
278
- }
279
-
280
- 100%{
281
- opacity: 1;
282
- transform: scale(0.25) rotate(75deg);
283
- background-color: rgba(155,155,155,0.9);
284
- }
285
- }
286
-
287
- @media screen and (max-width: 680px){
288
- .foogallery-stack-album .topbar h2, .foogallery-stack-album .topbar h3 { text-align: left; padding: 0; display: block;}
289
- .foogallery-stack-album .back { left: auto; right: 0px; margin-left: 0px;}
290
  }
1
+ .tp-grid {
2
+ list-style-type: none;
3
+ position: relative;
4
+ display: block;
5
+ }
6
+
7
+ .tp-grid li {
8
+ position: absolute;
9
+ cursor: pointer;
10
+ border: 10px solid #fff;
11
+ box-shadow: 0 2px 3px rgba(0,0,0,0.2);
12
+ display: none;
13
+ overflow: hidden;
14
+ -webkit-backface-visibility: hidden;
15
+ -moz-backface-visibility: hidden;
16
+ -o-backface-visibility: hidden;
17
+ -ms-backface-visibility: hidden;
18
+ backface-visibility: hidden;
19
+ }
20
+
21
+ .no-js .tp-grid li {
22
+ position: relative;
23
+ display: inline-block;
24
+ }
25
+
26
+ .tp-grid li a {
27
+ display: block;
28
+ outline: none;
29
+ }
30
+
31
+ .tp-grid li img {
32
+ display: block;
33
+ border: none;
34
+ }
35
+
36
+ .tp-info,
37
+ .tp-title {
38
+ position: absolute;
39
+ background: #fff;
40
+ line-height: 20px;
41
+ color: #333;
42
+ top: 40%;
43
+ width: 75%;
44
+ padding: 10px;
45
+ font-weight: 700;
46
+ text-align: right;
47
+ left: -100%;
48
+ box-shadow:
49
+ 1px 1px 1px rgba(0,0,0,0.1),
50
+ 5px 0 5px -3px rgba(0,0,0,0.4),
51
+ inset 0 0 5px rgba(0,0,0,0.04);
52
+ }
53
+
54
+ .tp-title-cover {
55
+ position: absolute;
56
+ top: 0;
57
+ bottom: 0;
58
+ left: 0;
59
+ right: 0;
60
+ }
61
+
62
+ .tp-open .tp-title-cover {
63
+ display: none;
64
+ }
65
+
66
+ .touch .tp-info {
67
+ left: 0px;
68
+ }
69
+
70
+ .no-touch .tp-info {
71
+ -webkit-transition: all 0.3s ease-in-out;
72
+ -moz-transition: all 0.3s ease-in-out;
73
+ -o-transition: all 0.3s ease-in-out;
74
+ -ms-transition: all 0.3s ease-in-out;
75
+ transition: all 0.3s ease-in-out;
76
+ }
77
+
78
+ .no-touch .tp-grid li:hover .tp-info {
79
+ -webkit-transition-delay: 150ms;
80
+ -moz-transition-delay: 150ms;
81
+ -o-transition-delay: 150ms;
82
+ -ms-transition-delay: 150ms;
83
+ transition-delay: 150ms;
84
+ }
85
+
86
+ .no-touch .tp-open li:hover .tp-info {
87
+ left: 0px;
88
+ }
89
+
90
+ .tp-title {
91
+ padding: 10px 35px 10px 10px;
92
+ left: 0px;
93
+ }
94
+
95
+ .tp-title span:nth-child(2){
96
+ color: #aaa;
97
+ padding: 0 5px;
98
+ background: #F7F7F7;
99
+ right: 0px;
100
+ height: 100%;
101
+ line-height: 40px;
102
+ top: 0px;
103
+ position: absolute;
104
+ display: block;
105
+ }
106
+
107
+ .foogallery-stack-album * {
108
+ box-sizing: border-box;
109
+ }
110
+
111
+ .foogallery-stack-album .topbar {
112
+ position: relative;
113
+ padding: 10px 0;
114
+ margin: 0 0 20px;
115
+ box-shadow: 0 1px 0 #aaa, 0 -1px 0 #aaa;
116
+ }
117
+
118
+ .foogallery-stack-album .back {
119
+ width: 40px;
120
+ height: 40px;
121
+ position: absolute;
122
+ left: 50%;
123
+ top: 50%;
124
+ margin: -20px 0 0 -20px;
125
+ border-radius: 50%;
126
+ text-align: center;
127
+ line-height: 38px;
128
+ color: #999;
129
+ background: #ddd;
130
+ background: rgba(200,200,200,0.5);
131
+ cursor: pointer;
132
+ display: none;
133
+ -webkit-touch-callout: none;
134
+ -webkit-user-select: none;
135
+ -khtml-user-select: none;
136
+ -moz-user-select: none;
137
+ -ms-user-select: none;
138
+ user-select: none;
139
+ }
140
+
141
+ .no-touch .foogallery-stack-album .back:hover {
142
+ background: #666;
143
+ background: rgba(100,100,100,0.5);
144
+ color: #fff;
145
+ }
146
+
147
+ .foogallery-stack-album .topbar h2,
148
+ .foogallery-stack-album .topbar h3 {
149
+ display: inline-block;
150
+ width: 49%;
151
+ margin: 0;
152
+ }
153
+
154
+ .foogallery-stack-album .topbar h2 {
155
+ padding-right: 20px;
156
+ }
157
+
158
+ .foogallery-stack-album .topbar h3 {
159
+ text-align: right;
160
+ padding-left: 20px;
161
+ }
162
+
163
+ /* Loader */
164
+
165
+ .foogallery-stack-album .loader {
166
+ left: 50%;
167
+ position: absolute;
168
+ margin-left: -120px;
169
+ }
170
+
171
+ .foogallery-stack-album .loader i {
172
+ display: inline-block;
173
+ width: 40px;
174
+ height: 40px;
175
+ -webkit-animation: loading 1s linear infinite forwards;
176
+ -moz-animation: loading 1s linear infinite forwards;
177
+ -o-animation: loading 1s linear infinite forwards;
178
+ -ms-animation: loading 1s linear infinite forwards;
179
+ animation: loading 1s linear infinite forwards;
180
+ }
181
+
182
+ .foogallery-stack-album .loader i:nth-child(2){
183
+ -webkit-animation-delay: 0.1s;
184
+ -moz-animation-delay: 0.1s;
185
+ -o-animation-delay: 0.1s;
186
+ -ms-animation-delay: 0.1s;
187
+ animation-delay: 0.1s;
188
+ }
189
+
190
+ .foogallery-stack-album .loader i:nth-child(3){
191
+ -webkit-animation-delay: 0.2s;
192
+ -moz-animation-delay: 0.2s;
193
+ -o-animation-delay: 0.2s;
194
+ -ms-animation-delay: 0.2s;
195
+ animation-delay: 0.2s;
196
+ }
197
+
198
+ .foogallery-stack-album .loader i:nth-child(4){
199
+ -webkit-animation-delay: 0.3s;
200
+ -moz-animation-delay: 0.3s;
201
+ -o-animation-delay: 0.3s;
202
+ -ms-animation-delay: 0.3s;
203
+ animation-delay: 0.3s;
204
+ }
205
+
206
+ .foogallery-stack-album .loader i:nth-child(5){
207
+ -webkit-animation-delay: 0.4s;
208
+ -moz-animation-delay: 0.4s;
209
+ -o-animation-delay: 0.4s;
210
+ -ms-animation-delay: 0.4s;
211
+ animation-delay: 0.4s;
212
+ }
213
+
214
+ .foogallery-stack-album .loader i:nth-child(6){
215
+ -webkit-animation-delay: 0.5s;
216
+ -moz-animation-delay: 0.5s;
217
+ -o-animation-delay: 0.5s;
218
+ -ms-animation-delay: 0.5s;
219
+ animation-delay: 0.5s;
220
+ }
221
+
222
+ @-webkit-keyframes loading{
223
+ 0%{
224
+ opacity: 0;
225
+ background-color: rgba(255,255,255,0.9);
226
+ }
227
+
228
+ 100%{
229
+ opacity: 1;
230
+ -webkit-transform: scale(0.25) rotate(75deg);
231
+ background-color: rgba(155,155,155,0.9);
232
+ }
233
+ }
234
+
235
+ @-moz-keyframes loading{
236
+ 0%{
237
+ opacity: 0;
238
+ background-color: rgba(255,255,255,0.9);
239
+ }
240
+
241
+ 100%{
242
+ opacity: 1;
243
+ -moz-transform: scale(0.25) rotate(75deg);
244
+ background-color: rgba(155,155,155,0.9);
245
+ }
246
+ }
247
+
248
+ @-o-keyframes loading{
249
+ 0%{
250
+ opacity: 0;
251
+ background-color: rgba(255,255,255,0.9);
252
+ }
253
+
254
+ 100%{
255
+ opacity: 1;
256
+ -o-transform: scale(0.25) rotate(75deg);
257
+ background-color: rgba(155,155,155,0.9);
258
+ }
259
+ }
260
+
261
+ @-ms-keyframes loading{
262
+ 0%{
263
+ opacity: 0;
264
+ background-color: rgba(255,255,255,0.9);
265
+ }
266
+
267
+ 100%{
268
+ opacity: 1;
269
+ -ms-transform: scale(0.25) rotate(75deg);
270
+ background-color: rgba(155,155,155,0.9);
271
+ }
272
+ }
273
+
274
+ @keyframes loading{
275
+ 0%{
276
+ opacity: 0;
277
+ background-color: rgba(255,255,255,0.9);
278
+ }
279
+
280
+ 100%{
281
+ opacity: 1;
282
+ transform: scale(0.25) rotate(75deg);
283
+ background-color: rgba(155,155,155,0.9);
284
+ }
285
+ }
286
+
287
+ @media screen and (max-width: 680px){
288
+ .foogallery-stack-album .topbar h2, .foogallery-stack-album .topbar h3 { text-align: left; padding: 0; display: block;}
289
+ .foogallery-stack-album .back { left: auto; right: 0px; margin-left: 0px;}
290
  }
extensions/albums/functions.php CHANGED
@@ -1,391 +1,391 @@
1
- <?php
2
-
3
- /**
4
- * Builds up a FooGallery album shortcode
5
- *
6
- * @param $album_id
7
- *
8
- * @return string
9
- */
10
- function foogallery_build_album_shortcode( $album_id ) {
11
- return '[' . foogallery_album_shortcode_tag() . ' id="' . $album_id . '"]';
12
- }
13
-
14
- /**
15
- * Returns the album shortcode tag
16
- *
17
- * @return string
18
- */
19
- function foogallery_album_shortcode_tag() {
20
- return apply_filters( 'foogallery_album_shortcode_tag', FOOGALLERY_CPT_ALBUM );
21
- }
22
-
23
- /**
24
- * Return all the album templates used within FooGallery
25
- *
26
- * @return array
27
- */
28
- function foogallery_album_templates() {
29
- $album_templates[] = array(
30
- 'slug' => 'default',
31
- 'name' => __( 'Responsive Album Layout', 'foogallery' ),
32
- 'fields' => array(
33
- array(
34
- 'id' => 'thumbnail_dimensions',
35
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
36
- 'desc' => __( 'Choose the size of your gallery thumbnails.', 'foogallery' ),
37
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
38
- 'type' => 'thumb_size',
39
- 'default' => array(
40
- 'width' => get_option( 'thumbnail_size_w' ),
41
- 'height' => get_option( 'thumbnail_size_h' ),
42
- 'crop' => true,
43
- ),
44
- ),
45
- array(
46
- 'id' => 'title_bg',
47
- 'title' => __( 'Title Background Color', 'foogallery' ),
48
- 'desc' => __( 'The color of the title that overlays the album thumbnails', 'foogallery' ),
49
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
50
- 'type' => 'colorpicker',
51
- 'default' => '#fff'
52
- ),
53
- array(
54
- 'id' => 'title_font_color',
55
- 'title' => __( 'Title Text Color', 'foogallery' ),
56
- 'desc' => __( 'The color of the title text that overlays the album thumbnails', 'foogallery' ),
57
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
58
- 'type' => 'colorpicker',
59
- 'default' => '#000000'
60
- ),
61
- array(
62
- 'id' => 'alignment',
63
- 'title' => __( 'Alignment', 'foogallery' ),
64
- 'desc' => __( 'The horizontal alignment of the gallery thumbnails inside the album.', 'foogallery' ),
65
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
66
- 'default' => 'alignment-left',
67
- 'type' => 'select',
68
- 'choices' => array(
69
- 'alignment-left' => __( 'Left', 'foogallery' ),
70
- 'alignment-center' => __( 'Center', 'foogallery' ),
71
- 'alignment-right' => __( 'Right', 'foogallery' ),
72
- )
73
- ),
74
- array(
75
- 'id' => 'gallery_link',
76
- 'title' => __( 'Gallery Link', 'foogallery' ),
77
- 'section' => __( 'URL Settings', 'foogallery' ),
78
- 'default' => '',
79
- 'type' => 'radio',
80
- 'spacer' => '<span class="spacer"></span>',
81
- 'choices' => array(
82
- '' => __('Default', 'foogallery'),
83
- 'custom_url' => __('Custom URL', 'foogallery')
84
- ),
85
- 'desc' => __( 'You can choose to link each gallery to the default embedded gallery, or you can choose to link to the gallery custom URL (if set).', 'foogallery' ),
86
- ),
87
- array(
88
- 'id' => 'gallery_link_format',
89
- 'title' => __( 'Gallery Link Format', 'foogallery' ),
90
- 'desc' => __( 'The format of the URL for each individual gallery in the album.', 'foogallery' ),
91
- 'section' => __( 'URL Settings', 'foogallery' ),
92
- 'type' => 'radio',
93
- 'choices' => array(
94
- 'default' => __('Pretty, e.g. ', 'foogallery') . '<code>/page-with-album/' . foogallery_album_gallery_url_slug() . '/some-gallery</code>',
95
- 'querystring' => __('Querystring e.g. ', 'foogallery') . '<code>/page-with-album?' . foogallery_album_gallery_url_slug() . '=some-gallery</code>'
96
- ),
97
- 'default' => foogallery_determine_best_link_format_default()
98
- ),
99
- array(
100
- 'id' => 'url_help',
101
- 'title' => __( 'Please Note', 'foogallery' ),
102
- 'section' => __( 'URL Settings', 'foogallery' ),
103
- 'type' => 'help',
104
- 'help' => true,
105
- 'desc' => __( 'If you are getting 404\'s when clicking on the album galleries, then change to the querystring format. To force your rewrite rules to flush, simply deactivate and activate the albums extension again.', 'foogallery' ),
106
- ),
107
- array(
108
- 'id' => 'album_hash',
109
- 'title' => __( 'Remember Scroll Position', 'foogallery' ),
110
- 'desc' => __( 'When a gallery is loaded in your album, the page is refreshed which means the scroll position will be lost .', 'foogallery' ),
111
- 'section' => __( 'URL Settings', 'foogallery' ),
112
- 'type' => 'radio',
113
- 'choices' => array(
114
- 'none' => __('Don\'t Remember', 'foogallery'),
115
- 'remember' => __('Remember Scroll Position', 'foogallery')
116
- ),
117
- 'default' => 'none'
118
- ),
119
- array(
120
- 'id' => 'gallery_title_size',
121
- 'title' => __( 'Gallery Title Size', 'foogallery' ),
122
- 'desc' => __( 'The size of the title when displaying a gallery page.', 'foogallery' ),
123
- 'section' => __( 'Gallery Settings', 'foogallery' ),
124
- 'default' => 'h2',
125
- 'type' => 'select',
126
- 'choices' => array(
127
- 'h2' => __( 'H2', 'foogallery' ),
128
- 'h3' => __( 'H3', 'foogallery' ),
129
- 'h4' => __( 'H4', 'foogallery' ),
130
- 'h5' => __( 'H5', 'foogallery' ),
131
- 'h6' => __( 'H6', 'foogallery' ),
132
- )
133
- ),
134
- )
135
- );
136
-
137
- $album_templates[] = array(
138
- 'slug' => 'stack',
139
- 'name' => __( 'All-In-One Stack Album', 'foogallery' ),
140
- 'fields' => array(
141
- array(
142
- 'id' => 'lightbox',
143
- 'title' => __( 'Lightbox', 'foogallery' ),
144
- 'desc' => __( 'Choose which lightbox you want to use to display images.', 'foogallery' ),
145
- 'type' => 'lightbox',
146
- ),
147
-
148
- array(
149
- 'id' => 'thumbnail_dimensions',
150
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
151
- 'desc' => __( 'Choose the size of your image stack thumbnails.', 'foogallery' ),
152
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
153
- 'type' => 'thumb_size_no_crop',
154
- 'default' => array(
155
- 'width' => get_option( 'thumbnail_size_w' ),
156
- 'height' => get_option( 'thumbnail_size_h' ),
157
- 'crop' => true,
158
- ),
159
- ),
160
-
161
- array(
162
- 'id' => 'random_angle',
163
- 'title' => __( 'Thumbnail Rotation', 'foogallery' ),
164
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
165
- 'desc' => __( 'Choose how thumbnails in each gallery are shown when clicking an image stack.', 'foogallery' ),
166
- 'type' => 'radio',
167
- 'default' => 'false',
168
- 'choices' => array(
169
- 'false' => __( 'Normal', 'foogallery' ),
170
- 'true' => __( 'Random Angles', 'foogallery' )
171
- )
172
- ),
173
-
174
- array(
175
- 'id' => 'gutter',
176
- 'title' => __( 'Thumbnail Gutter', 'foogallery' ),
177
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
178
- 'desc' => __( 'The spacing between each image stack.', 'foogallery' ),
179
- 'type' => 'number',
180
- 'default' => 50
181
- ),
182
-
183
- array(
184
- 'id' => 'pile_angles',
185
- 'title' => __( 'Image Stack Angles', 'foogallery' ),
186
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
187
- 'desc' => __( 'The angle of the images behind the thumbnail in each image stack.', 'foogallery' ),
188
- 'type' => 'radio',
189
- 'default' => '1',
190
- 'choices' => array(
191
- '1' => __( 'Low', 'foogallery' ),
192
- '2' => __( 'Normal', 'foogallery' ),
193
- '3' => __( 'More Than Normal', 'foogallery' ),
194
- '5' => __( 'High', 'foogallery' ),
195
- )
196
- )
197
- )
198
- );
199
-
200
- return apply_filters( 'foogallery_album_templates', $album_templates );
201
- }
202
-
203
- function foogallery_determine_best_link_format_default() {
204
- global $wp_rewrite;
205
- if ( '' === $wp_rewrite->permalink_structure ) {
206
- //we are using ?page_id
207
- return 'querystring';
208
- }
209
-
210
- //we are using permalinks
211
- return 'default';
212
- }
213
-
214
- /**
215
- * Returns the default album template
216
- *
217
- * @return string
218
- */
219
- function foogallery_default_album_template() {
220
- return foogallery_get_setting( 'album_template' );
221
- }
222
-
223
- /**
224
- * Returns the gallery link url for an album
225
- *
226
- * @param $album FooGalleryAlbum
227
- * @param $gallery FooGallery
228
- *
229
- * @return string
230
- */
231
- function foogallery_album_build_gallery_link( $album, $gallery ) {
232
- //first check if we want to use custom URL's
233
- $gallery_link = $album->get_meta( 'default_gallery_link', '' );
234
-
235
- if ( 'custom_url' === $gallery_link ) {
236
- //check if the gallery has a custom url, and if so, then use it
237
- $url = get_post_meta( $gallery->ID, 'custom_url', true );
238
- }
239
-
240
- if ( empty( $url ) ) {
241
- $slug = foogallery_album_gallery_url_slug();
242
- $format = $album->get_meta( 'default_gallery_link_format', 'default' );
243
-
244
- if ( 'default' === $format && 'default' === foogallery_determine_best_link_format_default() ) {
245
- $url = untrailingslashit( trailingslashit( get_permalink() ) . $slug . '/' . $gallery->slug );
246
- } else {
247
- $url = add_query_arg( $slug, $gallery->slug );
248
- }
249
-
250
- $use_hash = $album->get_meta( 'default_album_hash', 'remember' );
251
-
252
- if ( 'remember' === $use_hash ) {
253
- //add the album hash if required
254
- $url .= '#' . $album->slug;
255
- }
256
- }
257
-
258
- return apply_filters( 'foogallery_album_build_gallery_link', $url );
259
- }
260
-
261
- /**
262
- * Returns the gallery slug used when generating gallery URL's
263
- *
264
- * @return string
265
- */
266
- function foogallery_album_gallery_url_slug() {
267
- $slug = foogallery_get_setting( 'album_gallery_slug', 'gallery' );
268
- return apply_filters( 'foogallery_album_gallery_url_slug', $slug );
269
- }
270
-
271
- /**
272
- * Returns the gallery link target for an album
273
- *
274
- * @param $album FooGalleryAlbum
275
- * @param $gallery FooGallery
276
- *
277
- * @return string
278
- */
279
- function foogallery_album_build_gallery_link_target( $album, $gallery ) {
280
- //first check if we want to use custom URL's
281
- $gallery_link = $album->get_meta( 'default_gallery_link', '' );
282
-
283
- if ( 'custom_url' === $gallery_link ) {
284
- //check if the gallery has a custom target, and if so, then use it
285
- $target = get_post_meta( $gallery->ID, 'custom_target', true );
286
-
287
- //check if the $target is 'default' and set to '_self'
288
- if ( 'default' === $target ) {
289
- $target = '_self';
290
- }
291
- }
292
-
293
- if ( empty( $target ) ) {
294
- $target = '_self';
295
- }
296
-
297
- return apply_filters( 'foogallery_album_build_gallery_link_target', $target );
298
- }
299
-
300
- function foogallery_album_get_current_gallery() {
301
- $slug = foogallery_album_gallery_url_slug();
302
-
303
- $gallery = get_query_var( $slug );
304
-
305
- if ( empty( $gallery ) ) {
306
- $gallery = safe_get_from_request( $slug );
307
- }
308
-
309
- return apply_filters( 'foogallery_album_get_current_gallery', $gallery );
310
- }
311
-
312
- function foogallery_album_remove_gallery_from_link() {
313
- $gallery = foogallery_album_get_current_gallery();
314
- $slug = foogallery_album_gallery_url_slug();
315
-
316
- $url = untrailingslashit( remove_query_arg( $slug ) );
317
-
318
- return str_replace( $slug . '/' . $gallery, '', $url);
319
- }
320
-
321
- /**
322
- * Get a foogallery album template setting for the current foogallery that is being output to the frontend
323
- * @param string $key
324
- * @param string $default
325
- *
326
- * @return bool
327
- */
328
- function foogallery_album_template_setting( $key, $default = '' ) {
329
- global $current_foogallery_album;
330
- global $current_foogallery_album_arguments;
331
- global $current_foogallery_album_template;
332
-
333
- $settings_key = "{$current_foogallery_album_template}_{$key}";
334
-
335
- if ( $current_foogallery_album_arguments && array_key_exists( $key, $current_foogallery_album_arguments ) ) {
336
- //try to get the value from the arguments
337
- $value = $current_foogallery_album_arguments[ $key ];
338
-
339
- } else if ( $current_foogallery_album->settings && array_key_exists( $settings_key, $current_foogallery_album->settings ) ) {
340
- //then get the value out of the saved gallery settings
341
- $value = $current_foogallery_album->settings[ $settings_key ];
342
- } else {
343
- //otherwise set it to the default
344
- $value = $default;
345
- }
346
-
347
- $value = apply_filters( 'foogallery_album_template_setting-' . $key, $value );
348
-
349
- return $value;
350
- }
351
-
352
- /**
353
- * uninstall all albums and setting for albums
354
- */
355
- function foogallery_album_uninstall() {
356
- if ( !current_user_can( 'install_plugins' ) ) exit;
357
-
358
- //delete all albums posts
359
- global $wpdb;
360
- $query = "SELECT p.ID FROM {$wpdb->posts} AS p WHERE p.post_type IN (%s)";
361
- $gallery_post_ids = $wpdb->get_col( $wpdb->prepare( $query, FOOGALLERY_CPT_ALBUM ) );
362
-
363
- if ( !empty( $gallery_post_ids ) ) {
364
- $deleted = 0;
365
- foreach ( $gallery_post_ids as $post_id ) {
366
- $del = wp_delete_post( $post_id );
367
- if ( false !== $del ) {
368
- ++$deleted;
369
- }
370
- }
371
- }
372
- }
373
-
374
- /**
375
- * Render a foogallery album
376
- *
377
- * @param $album_id int The id of the foogallery album you want to render
378
- * @param array $args
379
- */
380
- if (! function_exists( 'foogallery_render_album') ) {
381
- function foogallery_render_album( $album_id, $args = array() ) {
382
- //create new instance of template engine
383
- $engine = new FooGallery_Album_Template_Loader();
384
-
385
- $shortcode_args = wp_parse_args( $args, array(
386
- 'id' => $album_id
387
- ) );
388
-
389
- $engine->render_template( $shortcode_args );
390
- }
391
  }
1
+ <?php
2
+
3
+ /**
4
+ * Builds up a FooGallery album shortcode
5
+ *
6
+ * @param $album_id
7
+ *
8
+ * @return string
9
+ */
10
+ function foogallery_build_album_shortcode( $album_id ) {
11
+ return '[' . foogallery_album_shortcode_tag() . ' id="' . $album_id . '"]';
12
+ }
13
+
14
+ /**
15
+ * Returns the album shortcode tag
16
+ *
17
+ * @return string
18
+ */
19
+ function foogallery_album_shortcode_tag() {
20
+ return apply_filters( 'foogallery_album_shortcode_tag', FOOGALLERY_CPT_ALBUM );
21
+ }
22
+
23
+ /**
24
+ * Return all the album templates used within FooGallery
25
+ *
26
+ * @return array
27
+ */
28
+ function foogallery_album_templates() {
29
+ $album_templates[] = array(
30
+ 'slug' => 'default',
31
+ 'name' => __( 'Responsive Album Layout', 'foogallery' ),
32
+ 'fields' => array(
33
+ array(
34
+ 'id' => 'thumbnail_dimensions',
35
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
36
+ 'desc' => __( 'Choose the size of your gallery thumbnails.', 'foogallery' ),
37
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
38
+ 'type' => 'thumb_size',
39
+ 'default' => array(
40
+ 'width' => get_option( 'thumbnail_size_w' ),
41
+ 'height' => get_option( 'thumbnail_size_h' ),
42
+ 'crop' => true,
43
+ ),
44
+ ),
45
+ array(
46
+ 'id' => 'title_bg',
47
+ 'title' => __( 'Title Background Color', 'foogallery' ),
48
+ 'desc' => __( 'The color of the title that overlays the album thumbnails', 'foogallery' ),
49
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
50
+ 'type' => 'colorpicker',
51
+ 'default' => '#fff'
52
+ ),
53
+ array(
54
+ 'id' => 'title_font_color',
55
+ 'title' => __( 'Title Text Color', 'foogallery' ),
56
+ 'desc' => __( 'The color of the title text that overlays the album thumbnails', 'foogallery' ),
57
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
58
+ 'type' => 'colorpicker',
59
+ 'default' => '#000000'
60
+ ),
61
+ array(
62
+ 'id' => 'alignment',
63
+ 'title' => __( 'Alignment', 'foogallery' ),
64
+ 'desc' => __( 'The horizontal alignment of the gallery thumbnails inside the album.', 'foogallery' ),
65
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
66
+ 'default' => 'alignment-left',
67
+ 'type' => 'select',
68
+ 'choices' => array(
69
+ 'alignment-left' => __( 'Left', 'foogallery' ),
70
+ 'alignment-center' => __( 'Center', 'foogallery' ),
71
+ 'alignment-right' => __( 'Right', 'foogallery' ),
72
+ )
73
+ ),
74
+ array(
75
+ 'id' => 'gallery_link',
76
+ 'title' => __( 'Gallery Link', 'foogallery' ),
77
+ 'section' => __( 'URL Settings', 'foogallery' ),
78
+ 'default' => '',
79
+ 'type' => 'radio',
80
+ 'spacer' => '<span class="spacer"></span>',
81
+ 'choices' => array(
82
+ '' => __('Default', 'foogallery'),
83
+ 'custom_url' => __('Custom URL', 'foogallery')
84
+ ),
85
+ 'desc' => __( 'You can choose to link each gallery to the default embedded gallery, or you can choose to link to the gallery custom URL (if set).', 'foogallery' ),
86
+ ),
87
+ array(
88
+ 'id' => 'gallery_link_format',
89
+ 'title' => __( 'Gallery Link Format', 'foogallery' ),
90
+ 'desc' => __( 'The format of the URL for each individual gallery in the album.', 'foogallery' ),
91
+ 'section' => __( 'URL Settings', 'foogallery' ),
92
+ 'type' => 'radio',
93
+ 'choices' => array(
94
+ 'default' => __('Pretty, e.g. ', 'foogallery') . '<code>/page-with-album/' . foogallery_album_gallery_url_slug() . '/some-gallery</code>',
95
+ 'querystring' => __('Querystring e.g. ', 'foogallery') . '<code>/page-with-album?' . foogallery_album_gallery_url_slug() . '=some-gallery</code>'
96
+ ),
97
+ 'default' => foogallery_determine_best_link_format_default()
98
+ ),
99
+ array(
100
+ 'id' => 'url_help',
101
+ 'title' => __( 'Please Note', 'foogallery' ),
102
+ 'section' => __( 'URL Settings', 'foogallery' ),
103
+ 'type' => 'help',
104
+ 'help' => true,
105
+ 'desc' => __( 'If you are getting 404\'s when clicking on the album galleries, then change to the querystring format. To force your rewrite rules to flush, simply deactivate and activate the albums extension again.', 'foogallery' ),
106
+ ),
107
+ array(
108
+ 'id' => 'album_hash',
109
+ 'title' => __( 'Remember Scroll Position', 'foogallery' ),
110
+ 'desc' => __( 'When a gallery is loaded in your album, the page is refreshed which means the scroll position will be lost .', 'foogallery' ),
111
+ 'section' => __( 'URL Settings', 'foogallery' ),
112
+ 'type' => 'radio',
113
+ 'choices' => array(
114
+ 'none' => __('Don\'t Remember', 'foogallery'),
115
+ 'remember' => __('Remember Scroll Position', 'foogallery')
116
+ ),
117
+ 'default' => 'none'
118
+ ),
119
+ array(
120
+ 'id' => 'gallery_title_size',
121
+ 'title' => __( 'Gallery Title Size', 'foogallery' ),
122
+ 'desc' => __( 'The size of the title when displaying a gallery page.', 'foogallery' ),
123
+ 'section' => __( 'Gallery Settings', 'foogallery' ),
124
+ 'default' => 'h2',
125
+ 'type' => 'select',
126
+ 'choices' => array(
127
+ 'h2' => __( 'H2', 'foogallery' ),
128
+ 'h3' => __( 'H3', 'foogallery' ),
129
+ 'h4' => __( 'H4', 'foogallery' ),
130
+ 'h5' => __( 'H5', 'foogallery' ),
131
+ 'h6' => __( 'H6', 'foogallery' ),
132
+ )
133
+ ),
134
+ )
135
+ );
136
+
137
+ $album_templates[] = array(
138
+ 'slug' => 'stack',
139
+ 'name' => __( 'All-In-One Stack Album', 'foogallery' ),
140
+ 'fields' => array(
141
+ array(
142
+ 'id' => 'lightbox',
143
+ 'title' => __( 'Lightbox', 'foogallery' ),
144
+ 'desc' => __( 'Choose which lightbox you want to use to display images.', 'foogallery' ),
145
+ 'type' => 'lightbox',
146
+ ),
147
+
148
+ array(
149
+ 'id' => 'thumbnail_dimensions',
150
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
151
+ 'desc' => __( 'Choose the size of your image stack thumbnails.', 'foogallery' ),
152
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
153
+ 'type' => 'thumb_size_no_crop',
154
+ 'default' => array(
155
+ 'width' => get_option( 'thumbnail_size_w' ),
156
+ 'height' => get_option( 'thumbnail_size_h' ),
157
+ 'crop' => true,
158
+ ),
159
+ ),
160
+
161
+ array(
162
+ 'id' => 'random_angle',
163
+ 'title' => __( 'Thumbnail Rotation', 'foogallery' ),
164
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
165
+ 'desc' => __( 'Choose how thumbnails in each gallery are shown when clicking an image stack.', 'foogallery' ),
166
+ 'type' => 'radio',
167
+ 'default' => 'false',
168
+ 'choices' => array(
169
+ 'false' => __( 'Normal', 'foogallery' ),
170
+ 'true' => __( 'Random Angles', 'foogallery' )
171
+ )
172
+ ),
173
+
174
+ array(
175
+ 'id' => 'gutter',
176
+ 'title' => __( 'Thumbnail Gutter', 'foogallery' ),
177
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
178
+ 'desc' => __( 'The spacing between each image stack.', 'foogallery' ),
179
+ 'type' => 'number',
180
+ 'default' => 50
181
+ ),
182
+
183
+ array(
184
+ 'id' => 'pile_angles',
185
+ 'title' => __( 'Image Stack Angles', 'foogallery' ),
186
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
187
+ 'desc' => __( 'The angle of the images behind the thumbnail in each image stack.', 'foogallery' ),
188
+ 'type' => 'radio',
189
+ 'default' => '1',
190
+ 'choices' => array(
191
+ '1' => __( 'Low', 'foogallery' ),
192
+ '2' => __( 'Normal', 'foogallery' ),
193
+ '3' => __( 'More Than Normal', 'foogallery' ),
194
+ '5' => __( 'High', 'foogallery' ),
195
+ )
196
+ )
197
+ )
198
+ );
199
+
200
+ return apply_filters( 'foogallery_album_templates', $album_templates );
201
+ }
202
+
203
+ function foogallery_determine_best_link_format_default() {
204
+ global $wp_rewrite;
205
+ if ( '' === $wp_rewrite->permalink_structure ) {
206
+ //we are using ?page_id
207
+ return 'querystring';
208
+ }
209
+
210
+ //we are using permalinks
211
+ return 'default';
212
+ }
213
+
214
+ /**
215
+ * Returns the default album template
216
+ *
217
+ * @return string
218
+ */
219
+ function foogallery_default_album_template() {
220
+ return foogallery_get_setting( 'album_template' );
221
+ }
222
+
223
+ /**
224
+ * Returns the gallery link url for an album
225
+ *
226
+ * @param $album FooGalleryAlbum
227
+ * @param $gallery FooGallery
228
+ *
229
+ * @return string
230
+ */
231
+ function foogallery_album_build_gallery_link( $album, $gallery ) {
232
+ //first check if we want to use custom URL's
233
+ $gallery_link = $album->get_meta( 'default_gallery_link', '' );
234
+
235
+ if ( 'custom_url' === $gallery_link ) {
236
+ //check if the gallery has a custom url, and if so, then use it
237
+ $url = get_post_meta( $gallery->ID, 'custom_url', true );
238
+ }
239
+
240
+ if ( empty( $url ) ) {
241
+ $slug = foogallery_album_gallery_url_slug();
242
+ $format = $album->get_meta( 'default_gallery_link_format', 'default' );
243
+
244
+ if ( 'default' === $format && 'default' === foogallery_determine_best_link_format_default() ) {
245
+ $url = untrailingslashit( trailingslashit( get_permalink() ) . $slug . '/' . $gallery->slug );
246
+ } else {
247
+ $url = add_query_arg( $slug, $gallery->slug );
248
+ }
249
+
250
+ $use_hash = $album->get_meta( 'default_album_hash', 'remember' );
251
+
252
+ if ( 'remember' === $use_hash ) {
253
+ //add the album hash if required
254
+ $url .= '#' . $album->slug;
255
+ }
256
+ }
257
+
258
+ return apply_filters( 'foogallery_album_build_gallery_link', $url );
259
+ }
260
+
261
+ /**
262
+ * Returns the gallery slug used when generating gallery URL's
263
+ *
264
+ * @return string
265
+ */
266
+ function foogallery_album_gallery_url_slug() {
267
+ $slug = foogallery_get_setting( 'album_gallery_slug', 'gallery' );
268
+ return apply_filters( 'foogallery_album_gallery_url_slug', $slug );
269
+ }
270
+
271
+ /**
272
+ * Returns the gallery link target for an album
273
+ *
274
+ * @param $album FooGalleryAlbum
275
+ * @param $gallery FooGallery
276
+ *
277
+ * @return string
278
+ */
279
+ function foogallery_album_build_gallery_link_target( $album, $gallery ) {
280
+ //first check if we want to use custom URL's
281
+ $gallery_link = $album->get_meta( 'default_gallery_link', '' );
282
+
283
+ if ( 'custom_url' === $gallery_link ) {
284
+ //check if the gallery has a custom target, and if so, then use it
285
+ $target = get_post_meta( $gallery->ID, 'custom_target', true );
286
+
287
+ //check if the $target is 'default' and set to '_self'
288
+ if ( 'default' === $target ) {
289
+ $target = '_self';
290
+ }
291
+ }
292
+
293
+ if ( empty( $target ) ) {
294
+ $target = '_self';
295
+ }
296
+
297
+ return apply_filters( 'foogallery_album_build_gallery_link_target', $target );
298
+ }
299
+
300
+ function foogallery_album_get_current_gallery() {
301
+ $slug = foogallery_album_gallery_url_slug();
302
+
303
+ $gallery = get_query_var( $slug );
304
+
305
+ if ( empty( $gallery ) ) {
306
+ $gallery = safe_get_from_request( $slug );
307
+ }
308
+
309
+ return apply_filters( 'foogallery_album_get_current_gallery', $gallery );
310
+ }
311
+
312
+ function foogallery_album_remove_gallery_from_link() {
313
+ $gallery = foogallery_album_get_current_gallery();
314
+ $slug = foogallery_album_gallery_url_slug();
315
+
316
+ $url = untrailingslashit( remove_query_arg( $slug ) );
317
+
318
+ return str_replace( $slug . '/' . $gallery, '', $url);
319
+ }
320
+
321
+ /**
322
+ * Get a foogallery album template setting for the current foogallery that is being output to the frontend
323
+ * @param string $key
324
+ * @param string $default
325
+ *
326
+ * @return bool
327
+ */
328
+ function foogallery_album_template_setting( $key, $default = '' ) {
329
+ global $current_foogallery_album;
330
+ global $current_foogallery_album_arguments;
331
+ global $current_foogallery_album_template;
332
+
333
+ $settings_key = "{$current_foogallery_album_template}_{$key}";
334
+
335
+ if ( $current_foogallery_album_arguments && array_key_exists( $key, $current_foogallery_album_arguments ) ) {
336
+ //try to get the value from the arguments
337
+ $value = $current_foogallery_album_arguments[ $key ];
338
+
339
+ } else if ( $current_foogallery_album->settings && array_key_exists( $settings_key, $current_foogallery_album->settings ) ) {
340
+ //then get the value out of the saved gallery settings
341
+ $value = $current_foogallery_album->settings[ $settings_key ];
342
+ } else {
343
+ //otherwise set it to the default
344
+ $value = $default;
345
+ }
346
+
347
+ $value = apply_filters( 'foogallery_album_template_setting-' . $key, $value );
348
+
349
+ return $value;
350
+ }
351
+
352
+ /**
353
+ * uninstall all albums and setting for albums
354
+ */
355
+ function foogallery_album_uninstall() {
356
+ if ( !current_user_can( 'install_plugins' ) ) exit;
357
+
358
+ //delete all albums posts
359
+ global $wpdb;
360
+ $query = "SELECT p.ID FROM {$wpdb->posts} AS p WHERE p.post_type IN (%s)";
361
+ $gallery_post_ids = $wpdb->get_col( $wpdb->prepare( $query, FOOGALLERY_CPT_ALBUM ) );
362
+
363
+ if ( !empty( $gallery_post_ids ) ) {
364
+ $deleted = 0;
365
+ foreach ( $gallery_post_ids as $post_id ) {
366
+ $del = wp_delete_post( $post_id );
367
+ if ( false !== $del ) {
368
+ ++$deleted;
369
+ }
370
+ }
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Render a foogallery album
376
+ *
377
+ * @param $album_id int The id of the foogallery album you want to render
378
+ * @param array $args
379
+ */
380
+ if (! function_exists( 'foogallery_render_album') ) {
381
+ function foogallery_render_album( $album_id, $args = array() ) {
382
+ //create new instance of template engine
383
+ $engine = new FooGallery_Album_Template_Loader();
384
+
385
+ $shortcode_args = wp_parse_args( $args, array(
386
+ 'id' => $album_id
387
+ ) );
388
+
389
+ $engine->render_template( $shortcode_args );
390
+ }
391
  }
extensions/albums/js/admin-foogallery-album.js CHANGED
@@ -1,149 +1,149 @@
1
- (function(FOOGALLERYALBUM, $, undefined) {
2
-
3
- FOOGALLERYALBUM.bindElements = function() {
4
- $('.foogallery-album-gallery-list')
5
- .on('click', '.foogallery-gallery-select', function(e) {
6
- e.stopPropagation();
7
- $(this).toggleClass('selected');
8
- FOOGALLERYALBUM.changeSelection();
9
- })
10
- .sortable({
11
- items: 'li',
12
- distance: 10,
13
- placeholder: 'attachment placeholder',
14
- stop : function() {
15
- FOOGALLERYALBUM.changeSelection();
16
- }
17
- });
18
-
19
- //init any colorpickers
20
- $('.colorpicker').spectrum({
21
- preferredFormat: "rgb",
22
- showInput: true,
23
- clickoutFiresChange: true
24
- });
25
-
26
- $('.foogallery-album-info-modal').prependTo('body');
27
- };
28
-
29
- FOOGALLERYALBUM.changeSelection = function() {
30
- var ids = '',
31
- none = true;
32
- $('.foogallery-gallery-select.selected').each(function() {
33
- ids += $(this).data('foogallery-id') + ',';
34
- none = false;
35
- });
36
-
37
- if (!none) {
38
- ids = ids.substring(0, ids.length - 1);
39
- }
40
- //build up the list of ids
41
- $('#foogallery_album_galleries').val(ids);
42
- };
43
-
44
- FOOGALLERYALBUM.initSettings = function() {
45
- $('#FooGallerySettings_AlbumTemplate').change(function() {
46
- var $this = $(this),
47
- selectedTemplate = $this.val();
48
-
49
- //hide all template fields
50
- $('.foogallery-album-metabox-settings .foogallery_template_field').not('.foogallery_template_field_selector').hide();
51
-
52
- //show all fields for the selected template only
53
- $('.foogallery-album-metabox-settings .foogallery_template_field-' + selectedTemplate).show();
54
-
55
- //trigger a change so custom template js can do something
56
- FOOGALLERYALBUM.triggerTemplateChangedEvent();
57
- });
58
-
59
- //trigger this onload too!
60
- FOOGALLERYALBUM.triggerTemplateChangedEvent();
61
- };
62
-
63
- FOOGALLERYALBUM.triggerTemplateChangedEvent = function() {
64
- var selectedTemplate = $('#FooGallerySettings_AlbumTemplate').val();
65
- $('body').trigger('foogallery-album-template-changed-' + selectedTemplate );
66
- };
67
-
68
- FOOGALLERYALBUM.initAlbumInfoButtons = function() {
69
- $('.foogallery-album-gallery-list').on('click', 'a.info', function(e) {
70
-
71
- e.preventDefault();
72
-
73
- e.stopPropagation();
74
-
75
- var $this = $(this),
76
- $modal = $('.foogallery-album-info-modal'),
77
- $spinner = $modal.find('.media-frame-title .spinner'),
78
- $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
79
- $details = $modal.find('.gallery-details'),
80
- data = 'action=foogallery_get_gallery_details' +
81
- '&foogallery_id=' + $this.data('gallery-id') +
82
- '&_wpnonce=' + $nonce.val() +
83
- '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val());
84
-
85
- $details.html( $details.data('loading') + $this.data('gallery-title') + '...' );
86
- $spinner.addClass('is-active');
87
-
88
- $.ajax({
89
- type: "POST",
90
- url: ajaxurl,
91
- data: data,
92
- success: function(data) {
93
- $details.html(data);
94
- },
95
- complete: function() {
96
- $spinner.removeClass('is-active');
97
- }
98
- });
99
-
100
- $modal.show();
101
- $('.media-modal-backdrop').show();
102
- });
103
-
104
- $('.foogallery-album-info-modal .gallery-details-save').on('click', function(e) {
105
- e.preventDefault();
106
-
107
- var $this = $(this),
108
- $modal = $('.foogallery-album-info-modal'),
109
- $spinner = $modal.find('.media-frame-toolbar .spinner'),
110
- $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
111
- $form = $modal.find('form[name="foogallery_gallery_details"]'),
112
- data = 'action=foogallery_save_gallery_details' +
113
- '&_wpnonce=' + $nonce.val() +
114
- '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val()) +
115
- '& ' + $form.serialize();
116
-
117
- $this.attr('disabled', 'disabled');
118
- $spinner.addClass('is-active');
119
-
120
- $.ajax({
121
- type: "POST",
122
- url: ajaxurl,
123
- data: data,
124
- success: function() {
125
- $('.foogallery-album-info-modal').hide();
126
- $('.media-modal-backdrop').hide();
127
- },
128
- complete: function() {
129
- $spinner.removeClass('is-active');
130
- $this.removeAttr('disabled');
131
- }
132
- });
133
- });
134
-
135
- $('.foogallery-album-info-modal .media-modal-close').on('click', function() {
136
- $('.foogallery-album-info-modal').hide();
137
- $('.media-modal-backdrop').hide();
138
- });
139
- };
140
-
141
- $(function() { //wait for ready
142
- FOOGALLERYALBUM.bindElements();
143
-
144
- FOOGALLERYALBUM.initSettings();
145
-
146
- FOOGALLERYALBUM.initAlbumInfoButtons();
147
- });
148
-
149
  }(window.FOOGALLERYALBUM = window.FOOGALLERYALBUM || {}, jQuery));
1
+ (function(FOOGALLERYALBUM, $, undefined) {
2
+
3
+ FOOGALLERYALBUM.bindElements = function() {
4
+ $('.foogallery-album-gallery-list')
5
+ .on('click', '.foogallery-gallery-select', function(e) {
6
+ e.stopPropagation();
7
+ $(this).toggleClass('selected');
8
+ FOOGALLERYALBUM.changeSelection();
9
+ })
10
+ .sortable({
11
+ items: 'li',
12
+ distance: 10,
13
+ placeholder: 'attachment placeholder',
14
+ stop : function() {
15
+ FOOGALLERYALBUM.changeSelection();
16
+ }
17
+ });
18
+
19
+ //init any colorpickers
20
+ $('.colorpicker').spectrum({
21
+ preferredFormat: "rgb",
22
+ showInput: true,
23
+ clickoutFiresChange: true
24
+ });
25
+
26
+ $('.foogallery-album-info-modal').prependTo('body');
27
+ };
28
+
29
+ FOOGALLERYALBUM.changeSelection = function() {
30
+ var ids = '',
31
+ none = true;
32
+ $('.foogallery-gallery-select.selected').each(function() {
33
+ ids += $(this).data('foogallery-id') + ',';
34
+ none = false;
35
+ });
36
+
37
+ if (!none) {
38
+ ids = ids.substring(0, ids.length - 1);
39
+ }
40
+ //build up the list of ids
41
+ $('#foogallery_album_galleries').val(ids);
42
+ };
43
+
44
+ FOOGALLERYALBUM.initSettings = function() {
45
+ $('#FooGallerySettings_AlbumTemplate').change(function() {
46
+ var $this = $(this),
47
+ selectedTemplate = $this.val();
48
+
49
+ //hide all template fields
50
+ $('.foogallery-album-metabox-settings .foogallery_template_field').not('.foogallery_template_field_selector').hide();
51
+
52
+ //show all fields for the selected template only
53
+ $('.foogallery-album-metabox-settings .foogallery_template_field-' + selectedTemplate).show();
54
+
55
+ //trigger a change so custom template js can do something
56
+ FOOGALLERYALBUM.triggerTemplateChangedEvent();
57
+ });
58
+
59
+ //trigger this onload too!
60
+ FOOGALLERYALBUM.triggerTemplateChangedEvent();
61
+ };
62
+
63
+ FOOGALLERYALBUM.triggerTemplateChangedEvent = function() {
64
+ var selectedTemplate = $('#FooGallerySettings_AlbumTemplate').val();
65
+ $('body').trigger('foogallery-album-template-changed-' + selectedTemplate );
66
+ };
67
+
68
+ FOOGALLERYALBUM.initAlbumInfoButtons = function() {
69
+ $('.foogallery-album-gallery-list').on('click', 'a.info', function(e) {
70
+
71
+ e.preventDefault();
72
+
73
+ e.stopPropagation();
74
+
75
+ var $this = $(this),
76
+ $modal = $('.foogallery-album-info-modal'),
77
+ $spinner = $modal.find('.media-frame-title .spinner'),
78
+ $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
79
+ $details = $modal.find('.gallery-details'),
80
+ data = 'action=foogallery_get_gallery_details' +
81
+ '&foogallery_id=' + $this.data('gallery-id') +
82
+ '&_wpnonce=' + $nonce.val() +
83
+ '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val());
84
+
85
+ $details.html( $details.data('loading') + $this.data('gallery-title') + '...' );
86
+ $spinner.addClass('is-active');
87
+
88
+ $.ajax({
89
+ type: "POST",
90
+ url: ajaxurl,
91
+ data: data,
92
+ success: function(data) {
93
+ $details.html(data);
94
+ },
95
+ complete: function() {
96
+ $spinner.removeClass('is-active');
97
+ }
98
+ });
99
+
100
+ $modal.show();
101
+ $('.media-modal-backdrop').show();
102
+ });
103
+
104
+ $('.foogallery-album-info-modal .gallery-details-save').on('click', function(e) {
105
+ e.preventDefault();
106
+
107
+ var $this = $(this),
108
+ $modal = $('.foogallery-album-info-modal'),
109
+ $spinner = $modal.find('.media-frame-toolbar .spinner'),
110
+ $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
111
+ $form = $modal.find('form[name="foogallery_gallery_details"]'),
112
+ data = 'action=foogallery_save_gallery_details' +
113
+ '&_wpnonce=' + $nonce.val() +
114
+ '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val()) +
115
+ '& ' + $form.serialize();
116
+
117
+ $this.attr('disabled', 'disabled');
118
+ $spinner.addClass('is-active');
119
+
120
+ $.ajax({
121
+ type: "POST",
122
+ url: ajaxurl,
123
+ data: data,
124
+ success: function() {
125
+ $('.foogallery-album-info-modal').hide();
126
+ $('.media-modal-backdrop').hide();
127
+ },
128
+ complete: function() {
129
+ $spinner.removeClass('is-active');
130
+ $this.removeAttr('disabled');
131
+ }
132
+ });
133
+ });
134
+
135
+ $('.foogallery-album-info-modal .media-modal-close').on('click', function() {
136
+ $('.foogallery-album-info-modal').hide();
137
+ $('.media-modal-backdrop').hide();
138
+ });
139
+ };
140
+
141
+ $(function() { //wait for ready
142
+ FOOGALLERYALBUM.bindElements();
143
+
144
+ FOOGALLERYALBUM.initSettings();
145
+
146
+ FOOGALLERYALBUM.initAlbumInfoButtons();
147
+ });
148
+
149
  }(window.FOOGALLERYALBUM = window.FOOGALLERYALBUM || {}, jQuery));
extensions/albums/js/album-stack.js CHANGED
@@ -1,870 +1,870 @@
1
- /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
2
- * Build: http://modernizr.com/download/#-csstransitions-prefixed-testprop-testallprops-domprefixes
3
- */
4
- if (!window.FooGalleryStackAlbumModernizr) {
5
- window.FooGalleryStackAlbumModernizr=function(a,b,c){function w(a){i.cssText=a}function x(a,b){return w(prefixes.join(a+";")+(b||""))}function y(a,b){return typeof a===b}function z(a,b){return!!~(""+a).indexOf(b)}function A(a,b){for(var d in a){var e=a[d];if(!z(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function B(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:y(f,"function")?f.bind(d||b):f}return!1}function C(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+m.join(d+" ")+d).split(" ");return y(b,"string")||y(b,"undefined")?A(e,b):(e=(a+" "+n.join(d+" ")+d).split(" "),B(e,b,c))}var d="2.8.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l="Webkit Moz O ms",m=l.split(" "),n=l.toLowerCase().split(" "),o={},p={},q={},r=[],s=r.slice,t,u={}.hasOwnProperty,v;!y(u,"undefined")&&!y(u.call,"undefined")?v=function(a,b){return u.call(a,b)}:v=function(a,b){return b in a&&y(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=s.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(s.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(s.call(arguments)))};return e}),o.csstransitions=function(){return C("transition")};for(var D in o)v(o,D)&&(t=D.toLowerCase(),e[t]=o[D](),r.push((e[t]?"":"no-")+t));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)v(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof enableClasses!="undefined"&&enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},w(""),h=j=null,e._version=d,e._domPrefixes=n,e._cssomPrefixes=m,e.testProp=function(a){return A([a])},e.testAllProps=C,e.prefixed=function(a,b,c){return b?C(a,b,c):C(a,"pfx")},e}(this,this.document);
6
- }
7
-
8
- /**
9
- * jquery.stapel.js v1.0.0
10
- * http://www.codrops.com
11
- *
12
- * Licensed under the MIT license.
13
- * http://www.opensource.org/licenses/mit-license.php
14
- *
15
- * Copyright 2012, Codrops
16
- * http://www.codrops.com
17
- */
18
- ;( function( $, window, undefined ) {
19
-
20
- 'use strict';
21
-
22
- /*
23
- * debouncedresize: special jQuery event that happens once after a window resize
24
- *
25
- * latest version and complete README available on Github:
26
- * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
27
- *
28
- * Copyright 2011 @louis_remi
29
- * Licensed under the MIT license.
30
- */
31
- var $event = $.event,
32
- $special,
33
- resizeTimeout;
34
-
35
- $special = $event.special.debouncedresize = {
36
- setup: function() {
37
- $( this ).on( "resize", $special.handler );
38
- },
39
- teardown: function() {
40
- $( this ).off( "resize", $special.handler );
41
- },
42
- handler: function( event, execAsap ) {
43
- // Save the context
44
- var context = this,
45
- args = arguments,
46
- dispatch = function() {
47
- // set correct event type
48
- event.type = "debouncedresize";
49
- $event.dispatch.apply( context, args );
50
- };
51
-
52
- if ( resizeTimeout ) {
53
- clearTimeout( resizeTimeout );
54
- }
55
-
56
- execAsap ?
57
- dispatch() :
58
- resizeTimeout = setTimeout( dispatch, $special.threshold );
59
- },
60
- threshold: 150
61
- };
62
-
63
- // ======================= imagesLoaded Plugin ===============================
64
- // https://github.com/desandro/imagesloaded
65
-
66
- // renamed from imagesLoaded to foogalleryImagesLoaded to avoid conflicts
67
-
68
- // $('#my-container').foogalleryImagesLoaded(myFunction)
69
- // execute a callback when all images have loaded.
70
- // needed because .load() doesn't work on cached images
71
-
72
- // callback function gets image collection as argument
73
- // this is the container
74
-
75
- // original: mit license. paul irish. 2010.
76
- // contributors: Oren Solomianik, David DeSandro, Yiannis Chatzikonstantinou
77
-
78
- // blank image data-uri bypasses webkit log warning (thx doug jones)
79
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
80
-
81
- $.fn.foogalleryImagesLoaded = function( callback ) {
82
- var $this = this,
83
- deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
84
- hasNotify = $.isFunction(deferred.notify),
85
- $images = $this.find('img').add( $this.filter('img') ),
86
- loaded = [],
87
- proper = [],
88
- broken = [];
89
-
90
- // Register deferred callbacks
91
- if ($.isPlainObject(callback)) {
92
- $.each(callback, function (key, value) {
93
- if (key === 'callback') {
94
- callback = value;
95
- } else if (deferred) {
96
- deferred[key](value);
97
- }
98
- });
99
- }
100
-
101
- function doneLoading() {
102
- var $proper = $(proper),
103
- $broken = $(broken);
104
-
105
- if ( deferred ) {
106
- if ( broken.length ) {
107
- deferred.reject( $images, $proper, $broken );
108
- } else {
109
- deferred.resolve( $images );
110
- }
111
- }
112
-
113
- if ( $.isFunction( callback ) ) {
114
- callback.call( $this, $images, $proper, $broken );
115
- }
116
- }
117
-
118
- function imgLoaded( img, isBroken ) {
119
- // don't proceed if BLANK image, or image is already loaded
120
- if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) {
121
- return;
122
- }
123
-
124
- // store element in loaded images array
125
- loaded.push( img );
126
-
127
- // keep track of broken and properly loaded images
128
- if ( isBroken ) {
129
- broken.push( img );
130
- } else {
131
- proper.push( img );
132
- }
133
-
134
- // cache image and its state for future calls
135
- $.data( img, 'foogalleryImagesLoaded', { isBroken: isBroken, src: img.src } );
136
-
137
- // trigger deferred progress method if present
138
- if ( hasNotify ) {
139
- deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] );
140
- }
141
-
142
- // call doneLoading and clean listeners if all images are loaded
143
- if ( $images.length === loaded.length ){
144
- setTimeout( doneLoading );
145
- $images.unbind( '.foogalleryImagesLoaded' );
146
- }
147
- }
148
-
149
- // if no images, trigger immediately
150
- if ( !$images.length ) {
151
- doneLoading();
152
- } else {
153
- $images.bind( 'load.foogalleryImagesLoaded error.foogalleryImagesLoaded', function( event ){
154
- // trigger imgLoaded
155
- imgLoaded( event.target, event.type === 'error' );
156
- }).each( function( i, el ) {
157
- var src = el.src;
158
-
159
- // find out if this image has been already checked for status
160
- // if it was, and src has not changed, call imgLoaded on it
161
- var cached = $.data( el, 'foogalleryImagesLoaded' );
162
- if ( cached && cached.src === src ) {
163
- imgLoaded( el, cached.isBroken );
164
- return;
165
- }
166
-
167
- // if complete is true and browser supports natural sizes, try
168
- // to check for image status manually
169
- if ( el.complete && el.naturalWidth !== undefined ) {
170
- imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 );
171
- return;
172
- }
173
-
174
- // cached images don't fire load sometimes, so we reset src, but only when
175
- // dealing with IE, or image is complete (loaded) and failed manual check
176
- // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
177
- if ( el.readyState || el.complete ) {
178
- el.src = BLANK;
179
- el.src = src;
180
- }
181
- });
182
- }
183
-
184
- return deferred ? deferred.promise( $this ) : $this;
185
- };
186
-
187
- // global
188
- var $window = $( window ),
189
- FooGalleryStackAlbumModernizr = window.FooGalleryStackAlbumModernizr;
190
-
191
- $.Stapel = function( options, element ) {
192
-
193
- this.el = $( element );
194
- this._init( options );
195
-
196
- };
197
-
198
- // the options
199
- $.Stapel.defaults = {
200
- // space between the items
201
- gutter : 40,
202
- // the rotations degree for the 2nd and 3rd item
203
- // (to give a more realistic pile effect)
204
- pileAngles : 2,
205
- // animation settings for the clicked pile's items
206
- pileAnimation : {
207
- openSpeed : 400,
208
- openEasing : 'ease-in-out', // try this :) 'cubic-bezier(.47,1.34,.9,1.03)',
209
- closeSpeed : 400,
210
- closeEasing : 'ease-in-out'
211
- },
212
- // animation settings for the other piles
213
- otherPileAnimation : {
214
- openSpeed : 400,
215
- openEasing : 'ease-in-out',
216
- closeSpeed : 350,
217
- closeEasing : 'ease-in-out'
218
- },
219
- // delay for each item of the pile
220
- delay : 0,
221
- // random rotation for the items once opened
222
- randomAngle : false,
223
- onLoad : function() { return false; },
224
- onBeforeOpen : function( pileName ) { return false; },
225
- onAfterOpen : function( pileName, totalItems ) { return false; },
226
- onBeforeClose : function( pileName ) { return false; },
227
- onAfterClose : function( pileName, totalItems ) { return false; }
228
- };
229
-
230
- $.Stapel.prototype = {
231
-
232
- _init : function( options ) {
233
-
234
- // options
235
- this.options = $.extend( true, {}, $.Stapel.defaults, options );
236
-
237
- // cache some elements
238
- this._config();
239
-
240
- // preload images
241
- var self = this;
242
- this.el.foogalleryImagesLoaded( function() {
243
- self.options.onLoad();
244
- self._layout();
245
- self._initEvents();
246
- if (typeof FOOBOX != 'undefined') {
247
- FOOBOX.init();
248
- }
249
- } );
250
-
251
- },
252
- _config : function() {
253
-
254
- // css transitions support
255
- this.support = FooGalleryStackAlbumModernizr.csstransitions;
256
-
257
- var transEndEventNames = {
258
- 'WebkitTransition' : 'webkitTransitionEnd',
259
- 'MozTransition' : 'transitionend',
260
- 'OTransition' : 'oTransitionEnd',
261
- 'msTransition' : 'MSTransitionEnd',
262
- 'transition' : 'transitionend'
263
- },
264
- transformNames = {
265
- 'WebkitTransform' : '-webkit-transform',
266
- 'MozTransform' : '-moz-transform',
267
- 'OTransform' : '-o-transform',
268
- 'msTransform' : '-ms-transform',
269
- 'transform' : 'transform'
270
- };
271
-
272
- if( this.support ) {
273
-
274
- this.transEndEventName = transEndEventNames[ FooGalleryStackAlbumModernizr.prefixed( 'transition' ) ] + '.cbpFWSlider';
275
- this.transformName = transformNames[ FooGalleryStackAlbumModernizr.prefixed( 'transform' ) ];
276
-
277
- }
278
-
279
- // true if one pile is opened
280
- this.spread = false;
281
-
282
- // the li's
283
- this.items = this.el.children( 'li' ).hide();
284
-
285
- // close pile
286
- this.close = $( '#tp-close' );
287
-
288
- },
289
- _getSize : function() {
290
-
291
- this.elWidth = this.el.outerWidth( true );
292
-
293
- },
294
- _initEvents : function() {
295
-
296
- var self = this;
297
- $window.on( 'debouncedresize.stapel', function() { self._resize(); } );
298
- this.items.on( 'click.stapel', function() {
299
-
300
- var $item = $( this );
301
-
302
- if( !self.spread && $item.data( 'isPile' ) ) {
303
-
304
- self.spread = true;
305
- self.pileName = $item.data( 'pileName' );
306
- self.options.onBeforeOpen( self.pileName );
307
- self._openPile();
308
-
309
- return false;
310
-
311
- }
312
-
313
- } );
314
-
315
- },
316
- _layout : function() {
317
-
318
- /*
319
- piles() : save the items info in a object with the following structure:
320
-
321
- this.piles = {
322
-
323
- pileName : {
324
-
325
- // elements of this pile (note that an element can be also in a different pile)
326
- // for each element, the finalPosition is the position of the element when the pile is opened
327
- elements : [
328
- { el : HTMLELEMENT, finalPosition : { left : LEFT, top : TOP } },
329
- {},
330
- {},
331
- ...
332
- ],
333
- // this is the position of the pile (all elements of the pile) when the pile is closed
334
- position : { left : LEFT, top : TOP },
335
- index : INDEX
336
- },
337
-
338
- // more piles
339
- ...
340
-
341
- }
342
- */
343
- this._piles();
344
-
345
- // items width & height
346
- // assuming here that all items have the same width and height
347
- this.itemSize = { width : this.items.outerWidth( true ) , height : this.items.outerHeight( true ) };
348
-
349
- // remove original elements
350
- this.items.remove();
351
-
352
- // applies some initial style for the items
353
- this._setInitialStyle();
354
-
355
- this.el.css( 'min-width', this.itemSize.width + this.options.gutter );
356
-
357
- // gets the current ul size (needed for the calculation of each item's position)
358
- this._getSize();
359
-
360
- // calculate and set each Pile's elements position based on the current ul width
361
- // this function will also be called on window resize
362
- this._setItemsPosition();
363
-
364
- // new items
365
- this.items = this.el.children( 'li' ).show();
366
- // total items
367
- this.itemsCount = this.items.length;
368
-
369
- },
370
- _piles : function() {
371
-
372
- var piles = {};
373
- this.pilesArr = [];
374
- var pile, self = this, idx = 0;
375
- this.items.each( function() {
376
-
377
- var $item = $( this ),
378
- itemPile = $item.attr( 'data-pile' ) || 'nopile-' + $item.index(),
379
- attr = itemPile.split( ',' );
380
-
381
- for( var i = 0, total = attr.length; i < total; ++i ) {
382
-
383
- var pileName = $.trim( attr[i] );
384
- pile = piles[ pileName ];
385
-
386
- if( !pile ) {
387
-
388
- pile = piles[ pileName ] = {
389
- name : pileName,
390
- elements : [],
391
- position : { left : 0, top : 0 },
392
- index : idx
393
- };
394
-
395
- self.pilesArr.push(pile);
396
-
397
- ++idx;
398
-
399
- }
400
-
401
- var clone = $item.clone().get(0);
402
- pile.elements.push( { el : clone, finalPosition : { left : 0, top : 0 } } );
403
- var $clone = $(clone);
404
- $clone.appendTo(self.el);
405
- }
406
-
407
- } );
408
-
409
- },
410
- _setInitialStyle : function() {
411
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
412
-
413
- var p = this.pilesArr[j], featured = false, $el, styleCSS;
414
- for (var k = 0, kl = p.elements.length; k < kl; k++){
415
- if ( $( p.elements[k].el ).data('featured') ){
416
- featured = true;
417
- break;
418
- }
419
- }
420
-
421
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
422
-
423
- $el = $( p.elements[i].el );
424
- styleCSS = { transform : 'rotate(0deg)' };
425
-
426
- this._applyInitialTransition( $el );
427
-
428
- if ( p.name.substr( 0, 6 ) !== 'nopile' && ( $el.data('featured') || ( !featured && i === 0 ) ) ){
429
- $el.css({ zIndex: 9999 }).data( 'front', true ).append( '<div class="tp-title-cover"><div class="tp-title"><span>' + p.name + '</span><span>' + len + '</span></div></div>' );
430
- }
431
- else if( i === len - 2 ) {
432
- styleCSS = { transform : 'rotate(' + this.options.pileAngles + 'deg)' };
433
- }
434
- else if( i === len - 3 ) {
435
- styleCSS = { transform : 'rotate(-' + this.options.pileAngles + 'deg)' };
436
- }
437
- else {
438
- var extraStyle = { visibility : 'hidden' };
439
- $el.css( extraStyle ).data( 'extraStyle', extraStyle );
440
- }
441
-
442
- $el.css( styleCSS ).data( {
443
- initialStyle : styleCSS,
444
- pileName : p.name,
445
- pileCount : len,
446
- shadow : $el.css( 'box-shadow' ),
447
- isPile : p.name.substr(0, 6) !== 'nopile'
448
- } );
449
-
450
- }
451
-
452
- }
453
-
454
- },
455
- _applyInitialTransition : function( $el ) {
456
-
457
- if( this.support ) {
458
- $el.css( 'transition', 'left 400ms ease-in-out, top 400ms ease-in-out' );
459
- }
460
-
461
- },
462
- _setItemsPosition : function() {
463
-
464
- var accumL = 0, accumT = 0,
465
- l, t, ml = 0,
466
- lastItemTop = 0;
467
-
468
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
469
-
470
- var p = this.pilesArr[j],
471
-
472
- //for( var pile in this.piles ) {
473
- //
474
- // var p = this.piles[pile],
475
- stepW = this.itemSize.width + this.options.gutter,
476
-
477
- accumIL = 0, accumIT = 0, il, it;
478
-
479
- if( accumL + stepW <= this.elWidth ) {
480
-
481
- l = accumL;
482
- t = accumT;
483
- accumL += stepW;
484
-
485
- }
486
- else {
487
-
488
- if( ml === 0 ) {
489
- ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
490
- }
491
-
492
- accumT += this.itemSize.height + this.options.gutter;
493
- l = 0;
494
- t = accumT;
495
- accumL = stepW;
496
-
497
- }
498
-
499
- p.position.left = l;
500
- p.position.top = t;
501
-
502
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
503
-
504
- var elem = p.elements[i],
505
- fp = elem.finalPosition;
506
-
507
- if( accumIL + stepW <= this.elWidth ) {
508
-
509
- il = accumIL;
510
- it = accumIT;
511
- accumIL += stepW;
512
-
513
- }
514
- else {
515
-
516
- accumIT += this.itemSize.height + this.options.gutter;
517
- il = 0;
518
- it = accumIT;
519
- accumIL = stepW;
520
-
521
- }
522
-
523
- fp.left = il;
524
- fp.top = it;
525
-
526
- var $el = $( elem.el );
527
-
528
- if(p.name !== this.pileName ) {
529
-
530
- $el.css( { left : p.position.left, top : p.position.top } );
531
-
532
- }
533
- else {
534
-
535
- lastItemTop = elem.finalPosition.top;
536
- $el.css( { left : elem.finalPosition.left, top : lastItemTop } );
537
-
538
- }
539
-
540
- }
541
-
542
- }
543
-
544
- if( ml === 0 ) {
545
- ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
546
- }
547
-
548
- // the position of the items will influence the final margin left value and height for the ul
549
- // center the ul
550
- lastItemTop = this.spread ? lastItemTop : accumT;
551
- this.marginLeft = ml;
552
- this.el.css( {
553
- marginLeft : this.marginLeft,
554
- height : lastItemTop + this.itemSize.height
555
- } );
556
-
557
- },
558
- _openPile : function() {
559
-
560
- if( !this.spread ) {
561
- return false;
562
- }
563
-
564
- // final style
565
- var fs, rowWidth = 0;
566
-
567
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
568
-
569
- var p = this.pilesArr[j],
570
- cnt = 0;
571
-
572
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
573
-
574
- var elem = p.elements[i],
575
- $item = $( elem.el ),
576
- styleCSS = p.name === this.pileName ? {
577
- zIndex : 9999,
578
- visibility : 'visible',
579
- transition : this.support ? 'left ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', top ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing : 'none'
580
- } : {
581
- zIndex : 1,
582
- transition : this.support ? 'opacity ' + this.options.otherPileAnimation.closeSpeed + 'ms ' + this.options.otherPileAnimation.closeEasing : 'none'
583
- };
584
-
585
- if( p.name === this.pileName ) {
586
-
587
- if (elem.finalPosition.top === 0){
588
- if (rowWidth > 0) rowWidth += this.options.gutter;
589
- rowWidth += this.itemSize.width;
590
- }
591
-
592
- if( $item.data( 'front' ) ) {
593
- $item.find( 'div.tp-title' ).hide();
594
- }
595
-
596
- fs = elem.finalPosition;
597
- fs.transform = this.options.randomAngle && i !== p.index ? 'rotate(' + Math.floor( Math.random() * ( 5 + 5 + 1 ) - 5 ) + 'deg)' : 'none';
598
-
599
- if( !this.support ) {
600
- $item.css( 'transform', 'none' );
601
- }
602
-
603
- // hack: remove box-shadow while animating to prevent the shadow stack effect
604
- if( i < len - 3 ) {
605
- $item.css( 'box-shadow', 'none' );
606
- }
607
-
608
- }
609
-
610
- $item.css( styleCSS );
611
-
612
- var self = this;
613
-
614
- p.name === this.pileName ?
615
- this._applyTransition( $item, fs, this.options.pileAnimation.openSpeed, function( evt ) {
616
-
617
- var target = this.target || this.nodeName;
618
- if( target !== 'LI' ) {
619
- return;
620
- }
621
-
622
- var $el = $( this );
623
-
624
- // hack: remove box-shadow while animating to prevent the shadow stack effect
625
- $el.css( 'box-shadow', $el.data( 'shadow' ) );
626
-
627
- if( self.support ) {
628
- $el.off( self.transEndEventName );
629
- }
630
-
631
- ++cnt;
632
-
633
- if( cnt === $el.data( 'pileCount' ) ) {
634
-
635
- $( document ).one( 'mousemove.stapel', function() {
636
- self.el.addClass( 'tp-open' );
637
- } );
638
- self.options.onAfterOpen( self.pileName, cnt );
639
-
640
- }
641
-
642
- } ) :
643
- this._applyTransition( $item, { visibility: 'hidden', opacity : 0 }, this.options.otherPileAnimation.closeSpeed );
644
-
645
- }
646
-
647
- }
648
-
649
- //this.el.css( 'height', fs.top + this.itemSize.height );
650
- this.el.css({
651
- marginLeft: Math.ceil((this.elWidth - rowWidth) / 2),
652
- height: fs.top + this.itemSize.height
653
- });
654
-
655
- },
656
- _closePile : function() {
657
-
658
- var self = this;
659
-
660
- // close..
661
- if( this.spread ) {
662
-
663
- this.spread = false;
664
-
665
- this.options.onBeforeClose( this.pileName );
666
-
667
- this.el.removeClass( 'tp-open' );
668
-
669
- // final style
670
- var fs;
671
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
672
-
673
- var p = this.pilesArr[j],
674
- cnt = 0;
675
-
676
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
677
-
678
- var $item = $( p.elements[i].el ),
679
- styleCSS = p.name === this.pileName ? {
680
- transition : this.support ? 'left ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', top ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing : 'none'
681
- } : {
682
- transition : this.support ? 'opacity ' + this.options.otherPileAnimation.openSpeed + 'ms ' + this.options.otherPileAnimation.openEasing : 'none'
683
- };
684
-
685
- $item.css( styleCSS );
686
-
687
- fs = p.position;
688
-
689
- if(p.name === this.pileName ) {
690
-
691
- $.extend( fs, $item.data( 'initialStyle' ) );
692
-
693
- // hack: remove box-shadow while animating to prevent the shadow stack effect
694
- if( i < len - 3 ) {
695
- $item.css( 'box-shadow', 'none' );
696
- }
697
-
698
- }
699
-
700
- p.name === this.pileName ? this._applyTransition( $item, fs, this.options.pileAnimation.closeSpeed, function( evt ) {
701
-
702
- var target = this.target || this.nodeName;
703
- if( target !== 'LI' ) {
704
- return;
705
- }
706
-
707
- var $el = $( this ), extraStyle = $el.data( 'extraStyle' ), initialStyle = $el.data( 'initialStyle' );
708
-
709
- // hack: remove box-shadow while animating to prevent the shadow stack effect
710
- $el.css( 'box-shadow', $el.data( 'shadow' ) );
711
-
712
- if( self.support ) {
713
- $el.off( self.transEndEventName );
714
- self._applyInitialTransition( $el );
715
- }
716
- else {
717
- $el.css( initialStyle );
718
- }
719
-
720
- if( extraStyle ) {
721
- $el.css( extraStyle );
722
- }
723
-
724
- ++cnt;
725
-
726
- if( $el.data( 'front' ) ) {
727
- $el.css({visibility: 'visible'}).find( 'div.tp-title' ).show();
728
- } else {
729
- $el.css({visibility: 'hidden', zIndex: 1});
730
- }
731
-
732
- if( cnt === $el.data( 'pileCount' ) ) {
733
- self.options.onAfterClose( $el.data( 'pileName' ), cnt );
734
- }
735
-
736
- } ) : this._applyTransition( $item, { opacity : 1 }, this.options.otherPileAnimation.openSpeed, function( evt ) {
737
-
738
- var target = this.target || this.nodeName;
739
- if( target !== 'LI' ) {
740
- return;
741
- }
742
-
743
- var $el = $( this );
744
- if( $el.data( 'front' ) ) {
745
- $el.css({visibility: 'visible'}).find( 'div.tp-title' ).show();
746
- } else {
747
- $el.css({visibility: 'hidden', zIndex: 1});
748
- }
749
-
750
- if( self.support ) {
751
- $el.off( self.transEndEventName );
752
- self._applyInitialTransition( $el );
753
- }
754
-
755
- } );
756
-
757
- }
758
-
759
- }
760
-
761
- // reset pile name
762
- this.pileName = '';
763
-
764
- // update ul height
765
- //this.el.css( 'height', fs.top + this.itemSize.height );
766
- this.el.css({
767
- marginLeft: this.marginLeft,
768
- height: fs.top + this.itemSize.height
769
- });
770
-
771
- }
772
-
773
- return false;
774
-
775
- },
776
- _resize : function() {
777
-
778
- // get ul size again
779
- this._getSize();
780
- // reset items positions
781
- this._setItemsPosition();
782
-
783
- },
784
- _applyTransition : function( el, styleCSS, speed, fncomplete ) {
785
-
786
- $.fn.applyStyle = this.support ? $.fn.css : $.fn.animate;
787
-
788
- if( fncomplete && this.support ) {
789
-
790
- el.on( this.transEndEventName, fncomplete );
791
-
792
- }
793
-
794
- fncomplete = fncomplete || function() { return false; };
795
-
796
- el.stop().applyStyle( styleCSS, $.extend( true, [], { duration : speed + 'ms', complete : fncomplete } ) );
797
-
798
- },
799
- closePile : function() {
800
-
801
- this._closePile();
802
-
803
- }
804
-
805
- };
806
-
807
- var logError = function( message ) {
808
-
809
- if ( window.console ) {
810
-
811
- window.console.error( message );
812
-
813
- }
814
-
815
- };
816
-
817
- $.fn.stapel = function( options ) {
818
-
819
- var instance = $.data( this, 'stapel' );
820
-
821
- if ( typeof options === 'string' ) {
822
-
823
- var args = Array.prototype.slice.call( arguments, 1 );
824
-
825
- this.each(function() {
826
-
827
- if ( !instance ) {
828
-
829
- logError( "cannot call methods on stapel prior to initialization; " +
830
- "attempted to call method '" + options + "'" );
831
- return;
832
-
833
- }
834
-
835
- if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
836
-
837
- logError( "no such method '" + options + "' for stapel instance" );
838
- return;
839
-
840
- }
841
-
842
- instance[ options ].apply( instance, args );
843
-
844
- });
845
-
846
- }
847
- else {
848
-
849
- this.each(function() {
850
-
851
- if ( instance ) {
852
-
853
- instance._init();
854
-
855
- }
856
- else {
857
-
858
- instance = $.data( this, 'stapel', new $.Stapel( options, this ) );
859
-
860
- }
861
-
862
- });
863
-
864
- }
865
-
866
- return instance;
867
-
868
- };
869
-
870
  } )( jQuery, window );
1
+ /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
2
+ * Build: http://modernizr.com/download/#-csstransitions-prefixed-testprop-testallprops-domprefixes
3
+ */
4
+ if (!window.FooGalleryStackAlbumModernizr) {
5
+ window.FooGalleryStackAlbumModernizr=function(a,b,c){function w(a){i.cssText=a}function x(a,b){return w(prefixes.join(a+";")+(b||""))}function y(a,b){return typeof a===b}function z(a,b){return!!~(""+a).indexOf(b)}function A(a,b){for(var d in a){var e=a[d];if(!z(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function B(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:y(f,"function")?f.bind(d||b):f}return!1}function C(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+m.join(d+" ")+d).split(" ");return y(b,"string")||y(b,"undefined")?A(e,b):(e=(a+" "+n.join(d+" ")+d).split(" "),B(e,b,c))}var d="2.8.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l="Webkit Moz O ms",m=l.split(" "),n=l.toLowerCase().split(" "),o={},p={},q={},r=[],s=r.slice,t,u={}.hasOwnProperty,v;!y(u,"undefined")&&!y(u.call,"undefined")?v=function(a,b){return u.call(a,b)}:v=function(a,b){return b in a&&y(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=s.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(s.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(s.call(arguments)))};return e}),o.csstransitions=function(){return C("transition")};for(var D in o)v(o,D)&&(t=D.toLowerCase(),e[t]=o[D](),r.push((e[t]?"":"no-")+t));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)v(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof enableClasses!="undefined"&&enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},w(""),h=j=null,e._version=d,e._domPrefixes=n,e._cssomPrefixes=m,e.testProp=function(a){return A([a])},e.testAllProps=C,e.prefixed=function(a,b,c){return b?C(a,b,c):C(a,"pfx")},e}(this,this.document);
6
+ }
7
+
8
+ /**
9
+ * jquery.stapel.js v1.0.0
10
+ * http://www.codrops.com
11
+ *
12
+ * Licensed under the MIT license.
13
+ * http://www.opensource.org/licenses/mit-license.php
14
+ *
15
+ * Copyright 2012, Codrops
16
+ * http://www.codrops.com
17
+ */
18
+ ;( function( $, window, undefined ) {
19
+
20
+ 'use strict';
21
+
22
+ /*
23
+ * debouncedresize: special jQuery event that happens once after a window resize
24
+ *
25
+ * latest version and complete README available on Github:
26
+ * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
27
+ *
28
+ * Copyright 2011 @louis_remi
29
+ * Licensed under the MIT license.
30
+ */
31
+ var $event = $.event,
32
+ $special,
33
+ resizeTimeout;
34
+
35
+ $special = $event.special.debouncedresize = {
36
+ setup: function() {
37
+ $( this ).on( "resize", $special.handler );
38
+ },
39
+ teardown: function() {
40
+ $( this ).off( "resize", $special.handler );
41
+ },
42
+ handler: function( event, execAsap ) {
43
+ // Save the context
44
+ var context = this,
45
+ args = arguments,
46
+ dispatch = function() {
47
+ // set correct event type
48
+ event.type = "debouncedresize";
49
+ $event.dispatch.apply( context, args );
50
+ };
51
+
52
+ if ( resizeTimeout ) {
53
+ clearTimeout( resizeTimeout );
54
+ }
55
+
56
+ execAsap ?
57
+ dispatch() :
58
+ resizeTimeout = setTimeout( dispatch, $special.threshold );
59
+ },
60
+ threshold: 150
61
+ };
62
+
63
+ // ======================= imagesLoaded Plugin ===============================
64
+ // https://github.com/desandro/imagesloaded
65
+
66
+ // renamed from imagesLoaded to foogalleryImagesLoaded to avoid conflicts
67
+
68
+ // $('#my-container').foogalleryImagesLoaded(myFunction)
69
+ // execute a callback when all images have loaded.
70
+ // needed because .load() doesn't work on cached images
71
+
72
+ // callback function gets image collection as argument
73
+ // this is the container
74
+
75
+ // original: mit license. paul irish. 2010.
76
+ // contributors: Oren Solomianik, David DeSandro, Yiannis Chatzikonstantinou
77
+
78
+ // blank image data-uri bypasses webkit log warning (thx doug jones)
79
+ var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
80
+
81
+ $.fn.foogalleryImagesLoaded = function( callback ) {
82
+ var $this = this,
83
+ deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
84
+ hasNotify = $.isFunction(deferred.notify),
85
+ $images = $this.find('img').add( $this.filter('img') ),
86
+ loaded = [],
87
+ proper = [],
88
+ broken = [];
89
+
90
+ // Register deferred callbacks
91
+ if ($.isPlainObject(callback)) {
92
+ $.each(callback, function (key, value) {
93
+ if (key === 'callback') {
94
+ callback = value;
95
+ } else if (deferred) {
96
+ deferred[key](value);
97
+ }
98
+ });
99
+ }
100
+
101
+ function doneLoading() {
102
+ var $proper = $(proper),
103
+ $broken = $(broken);
104
+
105
+ if ( deferred ) {
106
+ if ( broken.length ) {
107
+ deferred.reject( $images, $proper, $broken );
108
+ } else {
109
+ deferred.resolve( $images );
110
+ }
111
+ }
112
+
113
+ if ( $.isFunction( callback ) ) {
114
+ callback.call( $this, $images, $proper, $broken );
115
+ }
116
+ }
117
+
118
+ function imgLoaded( img, isBroken ) {
119
+ // don't proceed if BLANK image, or image is already loaded
120
+ if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) {
121
+ return;
122
+ }
123
+
124
+ // store element in loaded images array
125
+ loaded.push( img );
126
+
127
+ // keep track of broken and properly loaded images
128
+ if ( isBroken ) {
129
+ broken.push( img );
130
+ } else {
131
+ proper.push( img );
132
+ }
133
+
134
+ // cache image and its state for future calls
135
+ $.data( img, 'foogalleryImagesLoaded', { isBroken: isBroken, src: img.src } );
136
+
137
+ // trigger deferred progress method if present
138
+ if ( hasNotify ) {
139
+ deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] );
140
+ }
141
+
142
+ // call doneLoading and clean listeners if all images are loaded
143
+ if ( $images.length === loaded.length ){
144
+ setTimeout( doneLoading );
145
+ $images.unbind( '.foogalleryImagesLoaded' );
146
+ }
147
+ }
148
+
149
+ // if no images, trigger immediately
150
+ if ( !$images.length ) {
151
+ doneLoading();
152
+ } else {
153
+ $images.bind( 'load.foogalleryImagesLoaded error.foogalleryImagesLoaded', function( event ){
154
+ // trigger imgLoaded
155
+ imgLoaded( event.target, event.type === 'error' );
156
+ }).each( function( i, el ) {
157
+ var src = el.src;
158
+
159
+ // find out if this image has been already checked for status
160
+ // if it was, and src has not changed, call imgLoaded on it
161
+ var cached = $.data( el, 'foogalleryImagesLoaded' );
162
+ if ( cached && cached.src === src ) {
163
+ imgLoaded( el, cached.isBroken );
164
+ return;
165
+ }
166
+
167
+ // if complete is true and browser supports natural sizes, try
168
+ // to check for image status manually
169
+ if ( el.complete && el.naturalWidth !== undefined ) {
170
+ imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 );
171
+ return;
172
+ }
173
+
174
+ // cached images don't fire load sometimes, so we reset src, but only when
175
+ // dealing with IE, or image is complete (loaded) and failed manual check
176
+ // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
177
+ if ( el.readyState || el.complete ) {
178
+ el.src = BLANK;
179
+ el.src = src;
180
+ }
181
+ });
182
+ }
183
+
184
+ return deferred ? deferred.promise( $this ) : $this;
185
+ };
186
+
187
+ // global
188
+ var $window = $( window ),
189
+ FooGalleryStackAlbumModernizr = window.FooGalleryStackAlbumModernizr;
190
+
191
+ $.Stapel = function( options, element ) {
192
+
193
+ this.el = $( element );
194
+ this._init( options );
195
+
196
+ };
197
+
198
+ // the options
199
+ $.Stapel.defaults = {
200
+ // space between the items
201
+ gutter : 40,
202
+ // the rotations degree for the 2nd and 3rd item
203
+ // (to give a more realistic pile effect)
204
+ pileAngles : 2,
205
+ // animation settings for the clicked pile's items
206
+ pileAnimation : {
207
+ openSpeed : 400,
208
+ openEasing : 'ease-in-out', // try this :) 'cubic-bezier(.47,1.34,.9,1.03)',
209
+ closeSpeed : 400,
210
+ closeEasing : 'ease-in-out'
211
+ },
212
+ // animation settings for the other piles
213
+ otherPileAnimation : {
214
+ openSpeed : 400,
215
+ openEasing : 'ease-in-out',
216
+ closeSpeed : 350,
217
+ closeEasing : 'ease-in-out'
218
+ },
219
+ // delay for each item of the pile
220
+ delay : 0,
221
+ // random rotation for the items once opened
222
+ randomAngle : false,
223
+ onLoad : function() { return false; },
224
+ onBeforeOpen : function( pileName ) { return false; },
225
+ onAfterOpen : function( pileName, totalItems ) { return false; },
226
+ onBeforeClose : function( pileName ) { return false; },
227
+ onAfterClose : function( pileName, totalItems ) { return false; }
228
+ };
229
+
230
+ $.Stapel.prototype = {
231
+
232
+ _init : function( options ) {
233
+
234
+ // options
235
+ this.options = $.extend( true, {}, $.Stapel.defaults, options );
236
+
237
+ // cache some elements
238
+ this._config();
239
+
240
+ // preload images
241
+ var self = this;
242
+ this.el.foogalleryImagesLoaded( function() {
243
+ self.options.onLoad();
244
+ self._layout();
245
+ self._initEvents();
246
+ if (typeof FOOBOX != 'undefined') {
247
+ FOOBOX.init();
248
+ }
249
+ } );
250
+
251
+ },
252
+ _config : function() {
253
+
254
+ // css transitions support
255
+ this.support = FooGalleryStackAlbumModernizr.csstransitions;
256
+
257
+ var transEndEventNames = {
258
+ 'WebkitTransition' : 'webkitTransitionEnd',
259
+ 'MozTransition' : 'transitionend',
260
+ 'OTransition' : 'oTransitionEnd',
261
+ 'msTransition' : 'MSTransitionEnd',
262
+ 'transition' : 'transitionend'
263
+ },
264
+ transformNames = {
265
+ 'WebkitTransform' : '-webkit-transform',
266
+ 'MozTransform' : '-moz-transform',
267
+ 'OTransform' : '-o-transform',
268
+ 'msTransform' : '-ms-transform',
269
+ 'transform' : 'transform'
270
+ };
271
+
272
+ if( this.support ) {
273
+
274
+ this.transEndEventName = transEndEventNames[ FooGalleryStackAlbumModernizr.prefixed( 'transition' ) ] + '.cbpFWSlider';
275
+ this.transformName = transformNames[ FooGalleryStackAlbumModernizr.prefixed( 'transform' ) ];
276
+
277
+ }
278
+
279
+ // true if one pile is opened
280
+ this.spread = false;
281
+
282
+ // the li's
283
+ this.items = this.el.children( 'li' ).hide();
284
+
285
+ // close pile
286
+ this.close = $( '#tp-close' );
287
+
288
+ },
289
+ _getSize : function() {
290
+
291
+ this.elWidth = this.el.outerWidth( true );
292
+
293
+ },
294
+ _initEvents : function() {
295
+
296
+ var self = this;
297
+ $window.on( 'debouncedresize.stapel', function() { self._resize(); } );
298
+ this.items.on( 'click.stapel', function() {
299
+
300
+ var $item = $( this );
301
+
302
+ if( !self.spread && $item.data( 'isPile' ) ) {
303
+
304
+ self.spread = true;
305
+ self.pileName = $item.data( 'pileName' );
306
+ self.options.onBeforeOpen( self.pileName );
307
+ self._openPile();
308
+
309
+ return false;
310
+
311
+ }
312
+
313
+ } );
314
+
315
+ },
316
+ _layout : function() {
317
+
318
+ /*
319
+ piles() : save the items info in a object with the following structure:
320
+
321
+ this.piles = {
322
+
323
+ pileName : {
324
+
325
+ // elements of this pile (note that an element can be also in a different pile)
326
+ // for each element, the finalPosition is the position of the element when the pile is opened
327
+ elements : [
328
+ { el : HTMLELEMENT, finalPosition : { left : LEFT, top : TOP } },
329
+ {},
330
+ {},
331
+ ...
332
+ ],
333
+ // this is the position of the pile (all elements of the pile) when the pile is closed
334
+ position : { left : LEFT, top : TOP },
335
+ index : INDEX
336
+ },
337
+
338
+ // more piles
339
+ ...
340
+
341
+ }
342
+ */
343
+ this._piles();
344
+
345
+ // items width & height
346
+ // assuming here that all items have the same width and height
347
+ this.itemSize = { width : this.items.outerWidth( true ) , height : this.items.outerHeight( true ) };
348
+
349
+ // remove original elements
350
+ this.items.remove();
351
+
352
+ // applies some initial style for the items
353
+ this._setInitialStyle();
354
+
355
+ this.el.css( 'min-width', this.itemSize.width + this.options.gutter );
356
+
357
+ // gets the current ul size (needed for the calculation of each item's position)
358
+ this._getSize();
359
+
360
+ // calculate and set each Pile's elements position based on the current ul width
361
+ // this function will also be called on window resize
362
+ this._setItemsPosition();
363
+
364
+ // new items
365
+ this.items = this.el.children( 'li' ).show();
366
+ // total items
367
+ this.itemsCount = this.items.length;
368
+
369
+ },
370
+ _piles : function() {
371
+
372
+ var piles = {};
373
+ this.pilesArr = [];
374
+ var pile, self = this, idx = 0;
375
+ this.items.each( function() {
376
+
377
+ var $item = $( this ),
378
+ itemPile = $item.attr( 'data-pile' ) || 'nopile-' + $item.index(),
379
+ attr = itemPile.split( ',' );
380
+
381
+ for( var i = 0, total = attr.length; i < total; ++i ) {
382
+
383
+ var pileName = $.trim( attr[i] );
384
+ pile = piles[ pileName ];
385
+
386
+ if( !pile ) {
387
+
388
+ pile = piles[ pileName ] = {
389
+ name : pileName,
390
+ elements : [],
391
+ position : { left : 0, top : 0 },
392
+ index : idx
393
+ };
394
+
395
+ self.pilesArr.push(pile);
396
+
397
+ ++idx;
398
+
399
+ }
400
+
401
+ var clone = $item.clone().get(0);
402
+ pile.elements.push( { el : clone, finalPosition : { left : 0, top : 0 } } );
403
+ var $clone = $(clone);
404
+ $clone.appendTo(self.el);
405
+ }
406
+
407
+ } );
408
+
409
+ },
410
+ _setInitialStyle : function() {
411
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
412
+
413
+ var p = this.pilesArr[j], featured = false, $el, styleCSS;
414
+ for (var k = 0, kl = p.elements.length; k < kl; k++){
415
+ if ( $( p.elements[k].el ).data('featured') ){
416
+ featured = true;
417
+ break;
418
+ }
419
+ }
420
+
421
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
422
+
423
+ $el = $( p.elements[i].el );
424
+ styleCSS = { transform : 'rotate(0deg)' };
425
+
426
+ this._applyInitialTransition( $el );
427
+
428
+ if ( p.name.substr( 0, 6 ) !== 'nopile' && ( $el.data('featured') || ( !featured && i === 0 ) ) ){
429
+ $el.css({ zIndex: 9999 }).data( 'front', true ).append( '<div class="tp-title-cover"><div class="tp-title"><span>' + p.name + '</span><span>' + len + '</span></div></div>' );
430
+ }
431
+ else if( i === len - 2 ) {
432
+ styleCSS = { transform : 'rotate(' + this.options.pileAngles + 'deg)' };
433
+ }
434
+ else if( i === len - 3 ) {
435
+ styleCSS = { transform : 'rotate(-' + this.options.pileAngles + 'deg)' };
436
+ }
437
+ else {
438
+ var extraStyle = { visibility : 'hidden' };
439
+ $el.css( extraStyle ).data( 'extraStyle', extraStyle );
440
+ }
441
+
442
+ $el.css( styleCSS ).data( {
443
+ initialStyle : styleCSS,
444
+ pileName : p.name,
445
+ pileCount : len,
446
+ shadow : $el.css( 'box-shadow' ),
447
+ isPile : p.name.substr(0, 6) !== 'nopile'
448
+ } );
449
+
450
+ }
451
+
452
+ }
453
+
454
+ },
455
+ _applyInitialTransition : function( $el ) {
456
+
457
+ if( this.support ) {
458
+ $el.css( 'transition', 'left 400ms ease-in-out, top 400ms ease-in-out' );
459
+ }
460
+
461
+ },
462
+ _setItemsPosition : function() {
463
+
464
+ var accumL = 0, accumT = 0,
465
+ l, t, ml = 0,
466
+ lastItemTop = 0;
467
+
468
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
469
+
470
+ var p = this.pilesArr[j],
471
+
472
+ //for( var pile in this.piles ) {
473
+ //
474
+ // var p = this.piles[pile],
475
+ stepW = this.itemSize.width + this.options.gutter,
476
+
477
+ accumIL = 0, accumIT = 0, il, it;
478
+
479
+ if( accumL + stepW <= this.elWidth ) {
480
+
481
+ l = accumL;
482
+ t = accumT;
483
+ accumL += stepW;
484
+
485
+ }
486
+ else {
487
+
488
+ if( ml === 0 ) {
489
+ ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
490
+ }
491
+
492
+ accumT += this.itemSize.height + this.options.gutter;
493
+ l = 0;
494
+ t = accumT;
495
+ accumL = stepW;
496
+
497
+ }
498
+
499
+ p.position.left = l;
500
+ p.position.top = t;
501
+
502
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
503
+
504
+ var elem = p.elements[i],
505
+ fp = elem.finalPosition;
506
+
507
+ if( accumIL + stepW <= this.elWidth ) {
508
+
509
+ il = accumIL;
510
+ it = accumIT;
511
+ accumIL += stepW;
512
+
513
+ }
514
+ else {
515
+
516
+ accumIT += this.itemSize.height + this.options.gutter;
517
+ il = 0;
518
+ it = accumIT;
519
+ accumIL = stepW;
520
+
521
+ }
522
+
523
+ fp.left = il;
524
+ fp.top = it;
525
+
526
+ var $el = $( elem.el );
527
+
528
+ if(p.name !== this.pileName ) {
529
+
530
+ $el.css( { left : p.position.left, top : p.position.top } );
531
+
532
+ }
533
+ else {
534
+
535
+ lastItemTop = elem.finalPosition.top;
536
+ $el.css( { left : elem.finalPosition.left, top : lastItemTop } );
537
+
538
+ }
539
+
540
+ }
541
+
542
+ }
543
+
544
+ if( ml === 0 ) {
545
+ ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
546
+ }
547
+
548
+ // the position of the items will influence the final margin left value and height for the ul
549
+ // center the ul
550
+ lastItemTop = this.spread ? lastItemTop : accumT;
551
+ this.marginLeft = ml;
552
+ this.el.css( {
553
+ marginLeft : this.marginLeft,
554
+ height : lastItemTop + this.itemSize.height
555
+ } );
556
+
557
+ },
558
+ _openPile : function() {
559
+
560
+ if( !this.spread ) {
561
+ return false;
562
+ }
563
+
564
+ // final style
565
+ var fs, rowWidth = 0;
566
+
567
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
568
+
569
+ var p = this.pilesArr[j],
570
+ cnt = 0;
571
+
572
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
573
+
574
+ var elem = p.elements[i],
575
+ $item = $( elem.el ),
576
+ styleCSS = p.name === this.pileName ? {
577
+ zIndex : 9999,
578
+ visibility : 'visible',
579
+ transition : this.support ? 'left ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', top ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing : 'none'
580
+ } : {
581
+ zIndex : 1,
582
+ transition : this.support ? 'opacity ' + this.options.otherPileAnimation.closeSpeed + 'ms ' + this.options.otherPileAnimation.closeEasing : 'none'
583
+ };
584
+
585
+ if( p.name === this.pileName ) {
586
+
587
+ if (elem.finalPosition.top === 0){
588
+ if (rowWidth > 0) rowWidth += this.options.gutter;
589
+ rowWidth += this.itemSize.width;
590
+ }
591
+
592
+ if( $item.data( 'front' ) ) {
593
+ $item.find( 'div.tp-title' ).hide();
594
+ }
595
+
596
+ fs = elem.finalPosition;
597
+ fs.transform = this.options.randomAngle && i !== p.index ? 'rotate(' + Math.floor( Math.random() * ( 5 + 5 + 1 ) - 5 ) + 'deg)' : 'none';
598
+
599
+ if( !this.support ) {
600
+ $item.css( 'transform', 'none' );
601
+ }
602
+
603
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
604
+ if( i < len - 3 ) {
605
+ $item.css( 'box-shadow', 'none' );
606
+ }
607
+
608
+ }
609
+
610
+ $item.css( styleCSS );
611
+
612
+ var self = this;
613
+
614
+ p.name === this.pileName ?
615
+ this._applyTransition( $item, fs, this.options.pileAnimation.openSpeed, function( evt ) {
616
+
617
+ var target = this.target || this.nodeName;
618
+ if( target !== 'LI' ) {
619
+ return;
620
+ }
621
+
622
+ var $el = $( this );
623
+
624
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
625
+ $el.css( 'box-shadow', $el.data( 'shadow' ) );
626
+
627
+ if( self.support ) {
628
+ $el.off( self.transEndEventName );
629
+ }
630
+
631
+ ++cnt;
632
+
633
+ if( cnt === $el.data( 'pileCount' ) ) {
634
+
635
+ $( document ).one( 'mousemove.stapel', function() {
636
+ self.el.addClass( 'tp-open' );
637
+ } );
638
+ self.options.onAfterOpen( self.pileName, cnt );
639
+
640
+ }
641
+
642
+ } ) :
643
+ this._applyTransition( $item, { visibility: 'hidden', opacity : 0 }, this.options.otherPileAnimation.closeSpeed );
644
+
645
+ }
646
+
647
+ }
648
+
649
+ //this.el.css( 'height', fs.top + this.itemSize.height );
650
+ this.el.css({
651
+ marginLeft: Math.ceil((this.elWidth - rowWidth) / 2),
652
+ height: fs.top + this.itemSize.height
653
+ });
654
+
655
+ },
656
+ _closePile : function() {
657
+
658
+ var self = this;
659
+
660
+ // close..
661
+ if( this.spread ) {
662
+
663
+ this.spread = false;
664
+
665
+ this.options.onBeforeClose( this.pileName );
666
+
667
+ this.el.removeClass( 'tp-open' );
668
+
669
+ // final style
670
+ var fs;
671
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
672
+
673
+ var p = this.pilesArr[j],
674
+ cnt = 0;
675
+
676
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
677
+
678
+ var $item = $( p.elements[i].el ),
679
+ styleCSS = p.name === this.pileName ? {
680
+ transition : this.support ? 'left ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', top ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing : 'none'
681
+ } : {
682
+ transition : this.support ? 'opacity ' + this.options.otherPileAnimation.openSpeed + 'ms ' + this.options.otherPileAnimation.openEasing : 'none'
683
+ };
684
+
685
+ $item.css( styleCSS );
686
+
687
+ fs = p.position;
688
+
689
+ if(p.name === this.pileName ) {
690
+
691
+ $.extend( fs, $item.data( 'initialStyle' ) );
692
+
693
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
694
+ if( i < len - 3 ) {
695
+ $item.css( 'box-shadow', 'none' );
696
+ }
697
+
698
+ }
699
+
700
+ p.name === this.pileName ? this._applyTransition( $item, fs, this.options.pileAnimation.closeSpeed, function( evt ) {
701
+
702
+ var target = this.target || this.nodeName;
703
+ if( target !== 'LI' ) {
704
+ return;
705
+ }
706
+
707
+ var $el = $( this ), extraStyle = $el.data( 'extraStyle' ), initialStyle = $el.data( 'initialStyle' );
708
+
709
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
710
+ $el.css( 'box-shadow', $el.data( 'shadow' ) );
711
+
712
+ if( self.support ) {
713
+ $el.off( self.transEndEventName );
714
+ self._applyInitialTransition( $el );
715
+ }
716
+ else {
717
+ $el.css( initialStyle );
718
+ }
719
+
720
+ if( extraStyle ) {
721
+ $el.css( extraStyle );
722
+ }
723
+
724
+ ++cnt;
725
+
726
+ if( $el.data( 'front' ) ) {
727
+ $el.css({visibility: 'visible'}).find( 'div.tp-title' ).show();
728
+ } else {
729
+ $el.css({visibility: 'hidden', zIndex: 1});
730
+ }
731
+
732
+ if( cnt === $el.data( 'pileCount' ) ) {
733
+ self.options.onAfterClose( $el.data( 'pileName' ), cnt );
734
+ }
735
+
736
+ } ) : this._applyTransition( $item, { opacity : 1 }, this.options.otherPileAnimation.openSpeed, function( evt ) {
737
+
738
+ var target = this.target || this.nodeName;
739
+ if( target !== 'LI' ) {
740
+ return;
741
+ }
742
+
743
+ var $el = $( this );
744
+ if( $el.data( 'front' ) ) {
745
+ $el.css({visibility: 'visible'}).find( 'div.tp-title' ).show();
746
+ } else {
747
+ $el.css({visibility: 'hidden', zIndex: 1});
748
+ }
749
+
750
+ if( self.support ) {
751
+ $el.off( self.transEndEventName );
752
+ self._applyInitialTransition( $el );
753
+ }
754
+
755
+ } );
756
+
757
+ }
758
+
759
+ }
760
+
761
+ // reset pile name
762
+ this.pileName = '';
763
+
764
+ // update ul height
765
+ //this.el.css( 'height', fs.top + this.itemSize.height );
766
+ this.el.css({
767
+ marginLeft: this.marginLeft,
768
+ height: fs.top + this.itemSize.height
769
+ });
770
+
771
+ }
772
+
773
+ return false;
774
+
775
+ },
776
+ _resize : function() {
777
+
778
+ // get ul size again
779
+ this._getSize();
780
+ // reset items positions
781
+ this._setItemsPosition();
782
+
783
+ },
784
+ _applyTransition : function( el, styleCSS, speed, fncomplete ) {
785
+
786
+ $.fn.applyStyle = this.support ? $.fn.css : $.fn.animate;
787
+
788
+ if( fncomplete && this.support ) {
789
+
790
+ el.on( this.transEndEventName, fncomplete );
791
+
792
+ }
793
+
794
+ fncomplete = fncomplete || function() { return false; };
795
+
796
+ el.stop().applyStyle( styleCSS, $.extend( true, [], { duration : speed + 'ms', complete : fncomplete } ) );
797
+
798
+ },
799
+ closePile : function() {
800
+
801
+ this._closePile();
802
+
803
+ }
804
+
805
+ };
806
+
807
+ var logError = function( message ) {
808
+
809
+ if ( window.console ) {
810
+
811
+ window.console.error( message );
812
+
813
+ }
814
+
815
+ };
816
+
817
+ $.fn.stapel = function( options ) {
818
+
819
+ var instance = $.data( this, 'stapel' );
820
+
821
+ if ( typeof options === 'string' ) {
822
+
823
+ var args = Array.prototype.slice.call( arguments, 1 );
824
+
825
+ this.each(function() {
826
+
827
+ if ( !instance ) {
828
+
829
+ logError( "cannot call methods on stapel prior to initialization; " +
830
+ "attempted to call method '" + options + "'" );
831
+ return;
832
+
833
+ }
834
+
835
+ if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
836
+
837
+ logError( "no such method '" + options + "' for stapel instance" );
838
+ return;
839
+
840
+ }
841
+
842
+ instance[ options ].apply( instance, args );
843
+
844
+ });
845
+
846
+ }
847
+ else {
848
+
849
+ this.each(function() {
850
+
851
+ if ( instance ) {
852
+
853
+ instance._init();
854
+
855
+ }
856
+ else {
857
+
858
+ instance = $.data( this, 'stapel', new $.Stapel( options, this ) );
859
+
860
+ }
861
+
862
+ });
863
+
864
+ }
865
+
866
+ return instance;
867
+
868
+ };
869
+
870
  } )( jQuery, window );
extensions/albums/public/class-foogallery-album-template-loader.php CHANGED
@@ -1,184 +1,184 @@
1
- <?php
2
-
3
- /**
4
- * Template loader for FooGallery Albums
5
- *
6
- * @package FooGallery
7
- * @author Brad vincent
8
- */
9
- class FooGallery_Album_Template_Loader {
10
-
11
- /**
12
- * Locates and renders the album based on the template
13
- * Will look in the following locations
14
- * wp-content/themes/{child-theme}/foogallery/album-{template}.php
15
- * wp-content/themes/{theme}/foogallery/album-{template}.php
16
- * wp-content/plugins/foogallery/templates/album-{template}.php
17
- *
18
- * @param $args array Arguments passed in from the shortcode
19
- */
20
- public function render_template( $args ) {
21
- //do some work before we locate the template
22
- global $current_foogallery_album;
23
- global $current_foogallery_album_arguments;
24
- global $current_foogallery_album_template;
25
-
26
- //set the arguments
27
- $current_foogallery_album_arguments = $args;
28
-
29
- //load our album
30
- $current_foogallery_album = $this->find_album( $args );
31
-
32
- if ( false === $current_foogallery_album ) {
33
- _e( 'Could not load the album!', 'foogallery' );
34
- return;
35
- }
36
-
37
- //find the gallery template we will use to render the gallery
38
- $current_foogallery_album_template = $this->get_arg( $args, 'template', $current_foogallery_album->album_template );
39
-
40
- //set a default if we have no gallery template
41
- if ( empty($current_foogallery_album_template) ) {
42
- $current_foogallery_album_template = foogallery_get_default( 'album_template' );
43
- }
44
-
45
- //if we still have not default, then use the first one we can find
46
- if ( empty($current_foogallery_album_template) ) {
47
- $available_templates = foogallery_album_templates();
48
- $current_foogallery_album_template = $available_templates[0]['slug'];
49
- }
50
-
51
- //check if we have any galleries
52
- if ( ! $current_foogallery_album->has_galleries() ) {
53
- //no galleries!
54
- do_action( "foogallery_album_template_no_galleries-($current_foogallery_album_template)", $current_foogallery_album );
55
- } else {
56
-
57
- //create locator instance
58
- $instance_name = FOOGALLERY_SLUG . '_album_templates';
59
- $loader = new Foo_Plugin_File_Locator_v1( $instance_name, FOOGALLERY_FILE, 'templates', FOOGALLERY_SLUG );
60
-
61
- //allow extensions to very easily add pickup locations for their files
62
- $this->add_extension_pickup_locations( $loader, apply_filters( $instance_name . '_files', array() ) );
63
-
64
- if ( false !== ($template_location = $loader->locate_file( "album-{$current_foogallery_album_template}.php" )) ) {
65
-
66
- //we have found a template!
67
- do_action( 'foogallery_located_album_template', $current_foogallery_album );
68
- do_action( "foogallery_located_album_template-{$current_foogallery_album_template}", $current_foogallery_album );
69
-
70
- //try to include some JS
71
- if ( false !== ($js_location = $loader->locate_file( "album-{$current_foogallery_album_template}.js" )) ) {
72
- wp_enqueue_script( "foogallery-album-template-{$current_foogallery_album_template}", $js_location['url'] );
73
- }
74
-
75
- //try to include some CSS
76
- if ( false !== ($css_location = $loader->locate_file( "album-{$current_foogallery_album_template}.css" )) ) {
77
- foogallery_enqueue_style( "foogallery-album-template-{$current_foogallery_album_template}", $css_location['url'] );
78
- }
79
-
80
- //finally include the actual php template!
81
- if ( $template_location ) {
82
- load_template( $template_location['path'], false );
83
- }
84
-
85
- //we have loaded all files, now let extensions do some stuff
86
- do_action( "foogallery_loaded_album_template", $current_foogallery_album );
87
- do_action( "foogallery_loaded_album_template-($current_foogallery_album_template)", $current_foogallery_album );
88
-
89
- } else {
90
- //we could not find a template!
91
- _e( 'No album template found!', 'foogallery' );
92
- }
93
- }
94
- }
95
-
96
- /**
97
- * Add pickup locations to the loader to make it easier for extensions
98
- *
99
- * @param $loader Foo_Plugin_File_Locator_v1
100
- * @param $extension_files array
101
- */
102
- function add_extension_pickup_locations( $loader, $extension_files ) {
103
- if ( count( $extension_files ) > 0 ) {
104
- $position = 120;
105
- foreach ( $extension_files as $file ) {
106
-
107
- //add pickup location for php template
108
- $loader->add_location( $position, array(
109
- 'path' => trailingslashit( plugin_dir_path( $file ) ),
110
- 'url' => trailingslashit( plugin_dir_url( $file ) )
111
- ) );
112
-
113
- $position++;
114
-
115
- //add pickup location for extensions js folder
116
- $loader->add_location( $position, array(
117
- 'path' => trailingslashit( plugin_dir_path( $file ) . 'js' ),
118
- 'url' => trailingslashit( plugin_dir_url( $file ) . 'js' )
119
- ) );
120
-
121
- $position++;
122
-
123
- //add pickup location for extension css folder
124
- $loader->add_location( $position, array(
125
- 'path' => trailingslashit( plugin_dir_path( $file ) . 'css' ),
126
- 'url' => trailingslashit( plugin_dir_url( $file ) . 'css' )
127
- ) );
128
-
129
- $position++;
130
-
131
- }
132
- }
133
- }
134
-
135
- /**
136
- * load the gallery based on either the id or slug, passed in via arguments
137
- *
138
- * @param $args array Arguments passed in from the shortcode
139
- *
140
- * @return bool|FooGallery The gallery object we want to render
141
- */
142
- function find_album( $args ) {
143
-
144
- $id = intval( $this->get_arg( $args, 'id' ), 0 );
145
-
146
- if ( $id > 0 ) {
147
-
148
- //load album by ID
149
- return FooGalleryAlbum::get_by_id( $id );
150
-
151
- } else {
152
-
153
- //take into account the cases where id is passed in via the 'album' attribute
154
- $album = $this->get_arg( 'album', 0 );
155
-
156
- if ( intval( $album ) > 0 ) {
157
- //we have an id, so load
158
- return FooGalleryAlbum::get_by_id( intval( $album ) );
159
- }
160
-
161
- //we are dealing with a slug
162
- return FooGalleryAlbum::get_by_slug( $album );
163
- }
164
- }
165
-
166
- /**
167
- * Helper to get an argument value from an array arguments
168
- *
169
- * @param $args Array the array of arguments to search
170
- * @param $key string the key of the argument you are looking for
171
- * @param $default string a default value if the argument is not found
172
- *
173
- * @return string
174
- */
175
- function get_arg( $args, $key, $default = '' ) {
176
- if ( empty($args)
177
- || !is_array( $args )
178
- || !array_key_exists( $key, $args ) ) {
179
- return $default;
180
- }
181
-
182
- return $args[ $key ];
183
- }
184
- }
1
+ <?php
2
+
3
+ /**
4
+ * Template loader for FooGallery Albums
5
+ *
6
+ * @package FooGallery
7
+ * @author Brad vincent
8
+ */
9
+ class FooGallery_Album_Template_Loader {
10
+
11
+ /**
12
+ * Locates and renders the album based on the template
13
+ * Will look in the following locations
14
+ * wp-content/themes/{child-theme}/foogallery/album-{template}.php
15
+ * wp-content/themes/{theme}/foogallery/album-{template}.php
16
+ * wp-content/plugins/foogallery/templates/album-{template}.php
17
+ *
18
+ * @param $args array Arguments passed in from the shortcode
19
+ */
20
+ public function render_template( $args ) {
21
+ //do some work before we locate the template
22
+ global $current_foogallery_album;
23
+ global $current_foogallery_album_arguments;
24
+ global $current_foogallery_album_template;
25
+
26
+ //set the arguments
27
+ $current_foogallery_album_arguments = $args;
28
+
29
+ //load our album
30
+ $current_foogallery_album = $this->find_album( $args );
31
+
32
+ if ( false === $current_foogallery_album ) {
33
+ _e( 'Could not load the album!', 'foogallery' );
34
+ return;
35
+ }
36
+
37
+ //find the gallery template we will use to render the gallery
38
+ $current_foogallery_album_template = $this->get_arg( $args, 'template', $current_foogallery_album->album_template );
39
+
40
+ //set a default if we have no gallery template
41
+ if ( empty($current_foogallery_album_template) ) {
42
+ $current_foogallery_album_template = foogallery_get_default( 'album_template' );
43
+ }
44
+
45
+ //if we still have not default, then use the first one we can find
46
+ if ( empty($current_foogallery_album_template) ) {
47
+ $available_templates = foogallery_album_templates();
48
+ $current_foogallery_album_template = $available_templates[0]['slug'];
49
+ }
50
+
51
+ //check if we have any galleries
52
+ if ( ! $current_foogallery_album->has_galleries() ) {
53
+ //no galleries!
54
+ do_action( "foogallery_album_template_no_galleries-($current_foogallery_album_template)", $current_foogallery_album );
55
+ } else {
56
+
57
+ //create locator instance
58
+ $instance_name = FOOGALLERY_SLUG . '_album_templates';
59
+ $loader = new Foo_Plugin_File_Locator_v1( $instance_name, FOOGALLERY_FILE, 'templates', FOOGALLERY_SLUG );
60
+
61
+ //allow extensions to very easily add pickup locations for their files
62
+ $this->add_extension_pickup_locations( $loader, apply_filters( $instance_name . '_files', array() ) );
63
+
64
+ if ( false !== ($template_location = $loader->locate_file( "album-{$current_foogallery_album_template}.php" )) ) {
65
+
66
+ //we have found a template!
67
+ do_action( 'foogallery_located_album_template', $current_foogallery_album );
68
+ do_action( "foogallery_located_album_template-{$current_foogallery_album_template}", $current_foogallery_album );
69
+
70
+ //try to include some JS
71
+ if ( false !== ($js_location = $loader->locate_file( "album-{$current_foogallery_album_template}.js" )) ) {
72
+ wp_enqueue_script( "foogallery-album-template-{$current_foogallery_album_template}", $js_location['url'] );
73
+ }
74
+
75
+ //try to include some CSS
76
+ if ( false !== ($css_location = $loader->locate_file( "album-{$current_foogallery_album_template}.css" )) ) {
77
+ foogallery_enqueue_style( "foogallery-album-template-{$current_foogallery_album_template}", $css_location['url'] );
78
+ }
79
+
80
+ //finally include the actual php template!
81
+ if ( $template_location ) {
82
+ load_template( $template_location['path'], false );
83
+ }
84
+
85
+ //we have loaded all files, now let extensions do some stuff
86
+ do_action( "foogallery_loaded_album_template", $current_foogallery_album );
87
+ do_action( "foogallery_loaded_album_template-($current_foogallery_album_template)", $current_foogallery_album );
88
+
89
+ } else {
90
+ //we could not find a template!
91
+ _e( 'No album template found!', 'foogallery' );
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Add pickup locations to the loader to make it easier for extensions
98
+ *
99
+ * @param $loader Foo_Plugin_File_Locator_v1
100
+ * @param $extension_files array
101
+ */
102
+ function add_extension_pickup_locations( $loader, $extension_files ) {
103
+ if ( count( $extension_files ) > 0 ) {
104
+ $position = 120;
105
+ foreach ( $extension_files as $file ) {
106
+
107
+ //add pickup location for php template
108
+ $loader->add_location( $position, array(
109
+ 'path' => trailingslashit( plugin_dir_path( $file ) ),
110
+ 'url' => trailingslashit( plugin_dir_url( $file ) )
111
+ ) );
112
+
113
+ $position++;
114
+
115
+ //add pickup location for extensions js folder
116
+ $loader->add_location( $position, array(
117
+ 'path' => trailingslashit( plugin_dir_path( $file ) . 'js' ),
118
+ 'url' => trailingslashit( plugin_dir_url( $file ) . 'js' )
119
+ ) );
120
+
121
+ $position++;
122
+
123
+ //add pickup location for extension css folder
124
+ $loader->add_location( $position, array(
125
+ 'path' => trailingslashit( plugin_dir_path( $file ) . 'css' ),
126
+ 'url' => trailingslashit( plugin_dir_url( $file ) . 'css' )
127
+ ) );
128
+
129
+ $position++;
130
+
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * load the gallery based on either the id or slug, passed in via arguments
137
+ *
138
+ * @param $args array Arguments passed in from the shortcode
139
+ *
140
+ * @return bool|FooGallery The gallery object we want to render
141
+ */
142
+ function find_album( $args ) {
143
+
144
+ $id = intval( $this->get_arg( $args, 'id' ), 0 );
145
+
146
+ if ( $id > 0 ) {
147
+
148
+ //load album by ID
149
+ return FooGalleryAlbum::get_by_id( $id );
150
+
151
+ } else {
152
+
153
+ //take into account the cases where id is passed in via the 'album' attribute
154
+ $album = $this->get_arg( 'album', 0 );
155
+
156
+ if ( intval( $album ) > 0 ) {
157
+ //we have an id, so load
158
+ return FooGalleryAlbum::get_by_id( intval( $album ) );
159
+ }
160
+
161
+ //we are dealing with a slug
162
+ return FooGalleryAlbum::get_by_slug( $album );
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Helper to get an argument value from an array arguments
168
+ *
169
+ * @param $args Array the array of arguments to search
170
+ * @param $key string the key of the argument you are looking for
171
+ * @param $default string a default value if the argument is not found
172
+ *
173
+ * @return string
174
+ */
175
+ function get_arg( $args, $key, $default = '' ) {
176
+ if ( empty($args)
177
+ || !is_array( $args )
178
+ || !array_key_exists( $key, $args ) ) {
179
+ return $default;
180
+ }
181
+
182
+ return $args[ $key ];
183
+ }
184
+ }
extensions/albums/public/class-rewrite-rules.php CHANGED
@@ -1,47 +1,47 @@
1
- <?php
2
- /**
3
- * FooGallery Album Rewrite Rules
4
- */
5
- if (!class_exists('FooGallery_Album_Rewrite_Rules')) {
6
-
7
- class FooGallery_Album_Rewrite_Rules {
8
-
9
- function __construct() {
10
- add_action( 'init', array( $this, 'add_gallery_endpoint' ) );
11
- add_filter( 'redirect_canonical', array( $this, 'disable_canonical_redirect_for_front_page' ), 10, 2 );
12
- add_action( 'update_option_page_on_front', array( $this, 'flush_rules' ) );
13
- }
14
-
15
- function add_gallery_endpoint() {
16
- $gallery_slug = foogallery_album_gallery_url_slug();
17
-
18
- // Ensures the $query_vars['item'] is available
19
- add_rewrite_tag( "%{$gallery_slug}%", '([^&]+)' );
20
-
21
- // Requires flushing endpoints whenever the front page is switched to a different page
22
- $page_on_front = get_option( 'page_on_front' );
23
-
24
- // Match the front page and pass item value as a query var.
25
- add_rewrite_rule( "^{$gallery_slug}/([^/]*)/?", 'index.php?page_id='.$page_on_front.'&'.$gallery_slug.'=$matches[1]', 'top' );
26
- // Match non-front page pages.
27
- add_rewrite_rule( "^(.*)/{$gallery_slug}/([^/]*)/?", 'index.php?pagename=$matches[1]&static=true&'.$gallery_slug.'=$matches[2]', 'top' );
28
- }
29
-
30
- // http://wordpress.stackexchange.com/a/220484/52463
31
- // In order to keep WordPress from forcing a redirect to the canonical
32
- // home page, the redirect needs to be disabled.
33
- function disable_canonical_redirect_for_front_page( $redirect_url, $requested_url ) {
34
- if ( is_page() && $front_page = get_option( 'page_on_front' ) ) {
35
- if ( is_page( $front_page ) ) {
36
- $redirect_url = false;
37
- }
38
- }
39
-
40
- return $redirect_url;
41
- }
42
-
43
- function flush_rules() {
44
- flush_rewrite_rules();
45
- }
46
- }
47
  }
1
+ <?php
2
+ /**
3
+ * FooGallery Album Rewrite Rules
4
+ */
5
+ if (!class_exists('FooGallery_Album_Rewrite_Rules')) {
6
+
7
+ class FooGallery_Album_Rewrite_Rules {
8
+
9
+ function __construct() {
10
+ add_action( 'init', array( $this, 'add_gallery_endpoint' ) );
11
+ add_filter( 'redirect_canonical', array( $this, 'disable_canonical_redirect_for_front_page' ), 10, 2 );
12
+ add_action( 'update_option_page_on_front', array( $this, 'flush_rules' ) );
13
+ }
14
+
15
+ function add_gallery_endpoint() {
16
+ $gallery_slug = foogallery_album_gallery_url_slug();
17
+
18
+ // Ensures the $query_vars['item'] is available
19
+ add_rewrite_tag( "%{$gallery_slug}%", '([^&]+)' );
20
+
21
+ // Requires flushing endpoints whenever the front page is switched to a different page
22
+ $page_on_front = get_option( 'page_on_front' );
23
+
24
+ // Match the front page and pass item value as a query var.
25
+ add_rewrite_rule( "^{$gallery_slug}/([^/]*)/?", 'index.php?page_id='.$page_on_front.'&'.$gallery_slug.'=$matches[1]', 'top' );
26
+ // Match non-front page pages.
27
+ add_rewrite_rule( "^(.*)/{$gallery_slug}/([^/]*)/?", 'index.php?pagename=$matches[1]&static=true&'.$gallery_slug.'=$matches[2]', 'top' );
28
+ }
29
+
30
+ // http://wordpress.stackexchange.com/a/220484/52463
31
+ // In order to keep WordPress from forcing a redirect to the canonical
32
+ // home page, the redirect needs to be disabled.
33
+ function disable_canonical_redirect_for_front_page( $redirect_url, $requested_url ) {
34
+ if ( is_page() && $front_page = get_option( 'page_on_front' ) ) {
35
+ if ( is_page( $front_page ) ) {
36
+ $redirect_url = false;
37
+ }
38
+ }
39
+
40
+ return $redirect_url;
41
+ }
42
+
43
+ function flush_rules() {
44
+ flush_rewrite_rules();
45
+ }
46
+ }
47
  }
extensions/albums/public/class-shortcodes.php CHANGED
@@ -1,44 +1,44 @@
1
- <?php
2
- /*
3
- * FooGallery Album Shortcode
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Album_Shortcodes' ) ) {
7
-
8
- class FooGallery_Album_Shortcodes {
9
-
10
- function __construct() {
11
- add_action( 'foogallery_loaded_album_template', array( $this, 'render_custom_css' ) );
12
- add_shortcode( foogallery_album_shortcode_tag(), array( $this, 'render_foogallery_album_shortcode' ) );
13
- }
14
-
15
- function render_foogallery_album_shortcode( $atts ) {
16
-
17
- $args = wp_parse_args( $atts, array(
18
- 'id' => 0,
19
- 'album' => '',
20
- ) );
21
-
22
- $args = apply_filters( 'foogallery-album_shortcode_atts', $args );
23
-
24
- //create new instance of template engine
25
- $engine = new FooGallery_Album_Template_Loader();
26
-
27
- ob_start();
28
-
29
- $engine->render_template( $args );
30
-
31
- $output_string = ob_get_contents();
32
- ob_end_clean();
33
- return $output_string;
34
- }
35
-
36
- function render_custom_css( $foogallery_album ) {
37
- if ( !empty( $foogallery_album->custom_css ) ) {
38
- echo '<style type="text/css">';
39
- echo $foogallery_album->custom_css;
40
- echo '</style>';
41
- }
42
- }
43
- }
44
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Album Shortcode
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Album_Shortcodes' ) ) {
7
+
8
+ class FooGallery_Album_Shortcodes {
9
+
10
+ function __construct() {
11
+ add_action( 'foogallery_loaded_album_template', array( $this, 'render_custom_css' ) );
12
+ add_shortcode( foogallery_album_shortcode_tag(), array( $this, 'render_foogallery_album_shortcode' ) );
13
+ }
14
+
15
+ function render_foogallery_album_shortcode( $atts ) {
16
+
17
+ $args = wp_parse_args( $atts, array(
18
+ 'id' => 0,
19
+ 'album' => '',
20
+ ) );
21
+
22
+ $args = apply_filters( 'foogallery-album_shortcode_atts', $args );
23
+
24
+ //create new instance of template engine
25
+ $engine = new FooGallery_Album_Template_Loader();
26
+
27
+ ob_start();
28
+
29
+ $engine->render_template( $args );
30
+
31
+ $output_string = ob_get_contents();
32
+ ob_end_clean();
33
+ return $output_string;
34
+ }
35
+
36
+ function render_custom_css( $foogallery_album ) {
37
+ if ( !empty( $foogallery_album->custom_css ) ) {
38
+ echo '<style type="text/css">';
39
+ echo $foogallery_album->custom_css;
40
+ echo '</style>';
41
+ }
42
+ }
43
+ }
44
+ }
extensions/default-templates/class-default-templates-extension.php CHANGED
@@ -1,13 +1,13 @@
1
- <?php
2
- /**
3
- * Legacy Default Extensions Class for previous versions where the default templates were an extension.
4
- * The class is now empty and has no logic. It is purely here so that existing installs do not break
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Default_Templates_Extension' ) ) {
8
-
9
- class FooGallery_Default_Templates_Extension {
10
- function __construct() {
11
- }
12
- }
13
- }
1
+ <?php
2
+ /**
3
+ * Legacy Default Extensions Class for previous versions where the default templates were an extension.
4
+ * The class is now empty and has no logic. It is purely here so that existing installs do not break
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Default_Templates_Extension' ) ) {
8
+
9
+ class FooGallery_Default_Templates_Extension {
10
+ function __construct() {
11
+ }
12
+ }
13
+ }
extensions/default-templates/class-default-templates.php CHANGED
@@ -1,53 +1,53 @@
1
- <?php
2
- /**
3
- * Class to include and init default templates.
4
- * The templates are no longer an extension and are built in and included by default
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Default_Templates' ) ) {
8
-
9
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL', plugin_dir_url( __FILE__ ) );
10
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH', plugin_dir_path( __FILE__ ) );
11
-
12
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL . 'shared/' );
13
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_PATH', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'shared/' );
14
-
15
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'functions.php';
16
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'default/class-default-gallery-template.php';
17
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'image-viewer/class-image-viewer-gallery-template.php';
18
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'justified/class-justified-gallery-template.php';
19
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'masonry/class-masonry-gallery-template.php';
20
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'simple-portfolio/class-simple-portfolio-gallery-template.php';
21
- require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'thumbnail/class-thumbnail-gallery-template.php';
22
-
23
- class FooGallery_Default_Templates {
24
-
25
- function __construct() {
26
- new FooGallery_Default_Gallery_Template();
27
- new FooGallery_Image_Viewer_Gallery_Template();
28
- new FooGallery_Justified_Gallery_Template();
29
- //new FooGallery_Justified_CSS_Gallery_Template();
30
- new FooGallery_Masonry_Gallery_Template();
31
- new FooGallery_Simple_Portfolio_Gallery_Template();
32
- new FooGallery_Thumbnail_Gallery_Template();
33
-
34
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
35
- }
36
-
37
- /***
38
- * Enqueue the assets needed by the default templates
39
- * @param $hook_suffix
40
- */
41
- function enqueue_assets( $hook_suffix ){
42
- if( in_array( $hook_suffix, array( 'post.php', 'post-new.php' ) ) ) {
43
- $screen = get_current_screen();
44
-
45
- if ( is_object( $screen ) && FOOGALLERY_CPT_GALLERY == $screen->post_type ){
46
-
47
- // Register, enqueue scripts and styles here
48
- wp_enqueue_style( 'foogallery-core-admin-settings', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/admin-foogallery.css', array(), FOOGALLERY_VERSION );
49
- }
50
- }
51
- }
52
- }
53
- }
1
+ <?php
2
+ /**
3
+ * Class to include and init default templates.
4
+ * The templates are no longer an extension and are built in and included by default
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Default_Templates' ) ) {
8
+
9
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL', plugin_dir_url( __FILE__ ) );
10
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH', plugin_dir_path( __FILE__ ) );
11
+
12
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL . 'shared/' );
13
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_PATH', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'shared/' );
14
+
15
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'functions.php';
16
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'default/class-default-gallery-template.php';
17
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'image-viewer/class-image-viewer-gallery-template.php';
18
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'justified/class-justified-gallery-template.php';
19
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'masonry/class-masonry-gallery-template.php';
20
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'simple-portfolio/class-simple-portfolio-gallery-template.php';
21
+ require_once FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'thumbnail/class-thumbnail-gallery-template.php';
22
+
23
+ class FooGallery_Default_Templates {
24
+
25
+ function __construct() {
26
+ new FooGallery_Default_Gallery_Template();
27
+ new FooGallery_Image_Viewer_Gallery_Template();
28
+ new FooGallery_Justified_Gallery_Template();
29
+ //new FooGallery_Justified_CSS_Gallery_Template();
30
+ new FooGallery_Masonry_Gallery_Template();
31
+ new FooGallery_Simple_Portfolio_Gallery_Template();
32
+ new FooGallery_Thumbnail_Gallery_Template();
33
+
34
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
35
+ }
36
+
37
+ /***
38
+ * Enqueue the assets needed by the default templates
39
+ * @param $hook_suffix
40
+ */
41
+ function enqueue_assets( $hook_suffix ){
42
+ if( in_array( $hook_suffix, array( 'post.php', 'post-new.php' ) ) ) {
43
+ $screen = get_current_screen();
44
+
45
+ if ( is_object( $screen ) && FOOGALLERY_CPT_GALLERY == $screen->post_type ){
46
+
47
+ // Register, enqueue scripts and styles here
48
+ wp_enqueue_style( 'foogallery-core-admin-settings', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/admin-foogallery.css', array(), FOOGALLERY_VERSION );
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
extensions/default-templates/default/class-default-gallery-template.php CHANGED
@@ -1,240 +1,240 @@
1
- <?php
2
-
3
- if ( ! class_exists( 'FooGallery_Default_Gallery_Template' ) ) {
4
-
5
- define( 'FOOGALLERY_DEFAULT_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ) );
6
-
7
- class FooGallery_Default_Gallery_Template {
8
-
9
- const TEMPLATE_ID = 'default';
10
-
11
- /**
12
- * Wire up everything we need to run the extension
13
- */
14
- function __construct() {
15
- // @formatter:off
16
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
17
-
18
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
19
-
20
- //build up the thumb dimensions from some arguments
21
- add_filter( 'foogallery_calculate_thumbnail_dimensions-default', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
22
-
23
- //build up the thumb dimensions on save
24
- add_filter( 'foogallery_template_thumbnail_dimensions-default', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
25
-
26
- //build up the arguments needed for rendering this template
27
- add_filter( 'foogallery_gallery_template_arguments-default', array( $this, 'build_gallery_template_arguments' ) );
28
-
29
- // add a style block for the gallery based on the thumbnail width.
30
- add_action( 'foogallery_loaded_template_before', array( $this, 'add_width_style_block' ), 10, 1 );
31
- // @formatter:on
32
- }
33
-
34
- /**
35
- * Add a style block based on the width thumbnail size
36
- *
37
- * @param $gallery FooGallery
38
- */
39
- function add_width_style_block( $gallery ) {
40
- if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
41
- return;
42
- }
43
-
44
- $id = $gallery->container_id();
45
- $dimensions = foogallery_gallery_template_setting('thumbnail_dimensions');
46
- if ( is_array( $dimensions ) && array_key_exists( 'width', $dimensions ) && intval( $dimensions['width'] ) > 0 ) {
47
- $width = intval( $dimensions['width'] );
48
-
49
- // @formatter:off
50
- ?>
51
- <style type="text/css">
52
- <?php echo '#' . $id; ?> .fg-image {
53
- width: <?php echo $width; ?>px;
54
- }
55
- </style>
56
- <?php
57
- // @formatter:on
58
- }
59
- }
60
-
61
- /**
62
- * Register myself so that all associated JS and CSS files can be found and automatically included
63
- *
64
- * @param $extensions
65
- *
66
- * @return array
67
- */
68
- function register_myself( $extensions ) {
69
- $extensions[] = __FILE__;
70
-
71
- return $extensions;
72
- }
73
-
74
- /**
75
- * Add our gallery template to the list of templates available for every gallery
76
- *
77
- * @param $gallery_templates
78
- *
79
- * @return array
80
- */
81
- function add_template( $gallery_templates ) {
82
- $gallery_templates[] = array(
83
- 'slug' => self::TEMPLATE_ID,
84
- 'name' => __( 'Responsive Image Gallery', 'foogallery' ),
85
- 'preview_support' => true,
86
- 'common_fields_support' => true,
87
- 'paging_support' => true,
88
- 'lazyload_support' => true,
89
- 'mandatory_classes' => 'fg-default',
90
- 'thumbnail_dimensions' => true,
91
- 'filtering_support' => true,
92
- 'enqueue_core' => true,
93
- 'fields' => array(
94
- array(
95
- 'id' => 'thumbnail_dimensions',
96
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
97
- 'desc' => __( 'Choose the size of your thumbnails.', 'foogallery' ),
98
- 'section' => __( 'General', 'foogallery' ),
99
- 'type' => 'thumb_size_no_crop',
100
- 'default' => array(
101
- 'width' => get_option( 'thumbnail_size_w' ),
102
- 'height' => get_option( 'thumbnail_size_h' ),
103
- ),
104
- 'row_data' => array(
105
- 'data-foogallery-change-selector' => 'input',
106
- 'data-foogallery-preview' => 'shortcode'
107
- )
108
- ),
109
- array(
110
- 'id' => 'mobile_columns',
111
- 'title' => __( 'Mobile Layout', 'foogallery' ),
112
- 'desc' => __( 'Number of columns to show on mobile (screen widths less than 600px)', 'foogallery' ),
113
- 'section' => __( 'General', 'foogallery' ),
114
- 'default' => '',
115
- 'type' => 'radio',
116
- 'choices' => array(
117
- '' => __( 'Default', 'foogallery' ),
118
- 'fg-m-col1' => __( '1 Column', 'foogallery' ),
119
- 'fg-m-col2' => __( '2 Columns', 'foogallery' ),
120
- 'fg-m-col3' => __( '3 Columns', 'foogallery' ),
121
- ),
122
- 'row_data' => array(
123
- 'data-foogallery-change-selector' => 'input:radio',
124
- 'data-foogallery-preview' => 'shortcode'
125
- )
126
- ),
127
- array(
128
- 'id' => 'thumbnail_link',
129
- 'title' => __( 'Thumbnail Link', 'foogallery' ),
130
- 'section' => __( 'General', 'foogallery' ),
131
- 'default' => 'image',
132
- 'type' => 'thumb_link',
133
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, the image\'s attachment page, a custom URL, or you can choose to not link to anything.', 'foogallery' ),
134
- ),
135
- array(
136
- 'id' => 'lightbox',
137
- 'title' => __( 'Lightbox', 'foogallery' ),
138
- 'desc' => __( 'Choose which lightbox you want to use. The lightbox will generally only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
139
- 'section' => __( 'General', 'foogallery' ),
140
- 'type' => 'lightbox',
141
- 'default' => 'none'
142
- ),
143
- array(
144
- 'id' => 'spacing',
145
- 'title' => __( 'Spacing', 'foogallery' ),
146
- 'desc' => __( 'The spacing or gap between thumbnails in the gallery.', 'foogallery' ),
147
- 'section' => __( 'General', 'foogallery' ),
148
- 'type' => 'select',
149
- 'default' => 'fg-gutter-10',
150
- 'choices' => array(
151
- 'fg-gutter-0' => __( 'none', 'foogallery' ),
152
- 'fg-gutter-5' => __( '5 pixels', 'foogallery' ),
153
- 'fg-gutter-10' => __( '10 pixels', 'foogallery' ),
154
- 'fg-gutter-15' => __( '15 pixels', 'foogallery' ),
155
- 'fg-gutter-20' => __( '20 pixels', 'foogallery' ),
156
- 'fg-gutter-25' => __( '25 pixels', 'foogallery' ),
157
- ),
158
- 'row_data' => array(
159
- 'data-foogallery-change-selector' => 'select',
160
- 'data-foogallery-preview' => 'shortcode'
161
- )
162
- ),
163
- array(
164
- 'id' => 'alignment',
165
- 'title' => __( 'Alignment', 'foogallery' ),
166
- 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery.', 'foogallery' ),
167
- 'section' => __( 'General', 'foogallery' ),
168
- 'default' => 'fg-center',
169
- 'type' => 'radio',
170
- 'spacer' => '<span class="spacer"></span>',
171
- 'choices' => array(
172
- 'fg-left' => __( 'Left', 'foogallery' ),
173
- 'fg-center' => __( 'Center', 'foogallery' ),
174
- 'fg-right' => __( 'Right', 'foogallery' ),
175
- ),
176
- 'row_data' => array(
177
- 'data-foogallery-change-selector' => 'input:radio',
178
- 'data-foogallery-preview' => 'shortcode'
179
- )
180
- )
181
- )
182
- );
183
-
184
- return $gallery_templates;
185
- }
186
-
187
- /**
188
- * Builds thumb dimensions from arguments
189
- *
190
- * @param array $dimensions
191
- * @param array $arguments
192
- *
193
- * @return mixed
194
- */
195
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
196
- if ( array_key_exists( 'thumbnail_dimensions', $arguments ) ) {
197
- return array(
198
- 'height' => intval( $arguments['thumbnail_dimensions']['height'] ),
199
- 'width' => intval( $arguments['thumbnail_dimensions']['width'] ),
200
- 'crop' => '1'
201
- );
202
- }
203
-
204
- return null;
205
- }
206
-
207
- /**
208
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
209
- *
210
- * @param array $dimensions
211
- * @param FooGallery $foogallery
212
- *
213
- * @return mixed
214
- */
215
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
216
- $dimensions = $foogallery->get_meta( 'default_thumbnail_dimensions', array(
217
- 'width' => get_option( 'thumbnail_size_w' ),
218
- 'height' => get_option( 'thumbnail_size_h' )
219
- ) );
220
- $dimensions['crop'] = true;
221
-
222
- return $dimensions;
223
- }
224
-
225
- /**
226
- * Build up the arguments needed for rendering this gallery template
227
- *
228
- * @param $args
229
- *
230
- * @return array
231
- */
232
- function build_gallery_template_arguments( $args ) {
233
- $args = foogallery_gallery_template_setting( 'thumbnail_dimensions', array() );
234
- $args['crop'] = '1'; //we now force thumbs to be cropped
235
- $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
236
-
237
- return $args;
238
- }
239
- }
240
  }
1
+ <?php
2
+
3
+ if ( ! class_exists( 'FooGallery_Default_Gallery_Template' ) ) {
4
+
5
+ define( 'FOOGALLERY_DEFAULT_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ) );
6
+
7
+ class FooGallery_Default_Gallery_Template {
8
+
9
+ const TEMPLATE_ID = 'default';
10
+
11
+ /**
12
+ * Wire up everything we need to run the extension
13
+ */
14
+ function __construct() {
15
+ // @formatter:off
16
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
17
+
18
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
19
+
20
+ //build up the thumb dimensions from some arguments
21
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-default', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
22
+
23
+ //build up the thumb dimensions on save
24
+ add_filter( 'foogallery_template_thumbnail_dimensions-default', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
25
+
26
+ //build up the arguments needed for rendering this template
27
+ add_filter( 'foogallery_gallery_template_arguments-default', array( $this, 'build_gallery_template_arguments' ) );
28
+
29
+ // add a style block for the gallery based on the thumbnail width.
30
+ add_action( 'foogallery_loaded_template_before', array( $this, 'add_width_style_block' ), 10, 1 );
31
+ // @formatter:on
32
+ }
33
+
34
+ /**
35
+ * Add a style block based on the width thumbnail size
36
+ *
37
+ * @param $gallery FooGallery
38
+ */
39
+ function add_width_style_block( $gallery ) {
40
+ if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
41
+ return;
42
+ }
43
+
44
+ $id = $gallery->container_id();
45
+ $dimensions = foogallery_gallery_template_setting('thumbnail_dimensions');
46
+ if ( is_array( $dimensions ) && array_key_exists( 'width', $dimensions ) && intval( $dimensions['width'] ) > 0 ) {
47
+ $width = intval( $dimensions['width'] );
48
+
49
+ // @formatter:off
50
+ ?>
51
+ <style type="text/css">
52
+ <?php echo '#' . $id; ?> .fg-image {
53
+ width: <?php echo $width; ?>px;
54
+ }
55
+ </style>
56
+ <?php
57
+ // @formatter:on
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Register myself so that all associated JS and CSS files can be found and automatically included
63
+ *
64
+ * @param $extensions
65
+ *
66
+ * @return array
67
+ */
68
+ function register_myself( $extensions ) {
69
+ $extensions[] = __FILE__;
70
+
71
+ return $extensions;
72
+ }
73
+
74
+ /**
75
+ * Add our gallery template to the list of templates available for every gallery
76
+ *
77
+ * @param $gallery_templates
78
+ *
79
+ * @return array
80
+ */
81
+ function add_template( $gallery_templates ) {
82
+ $gallery_templates[] = array(
83
+ 'slug' => self::TEMPLATE_ID,
84
+ 'name' => __( 'Responsive Image Gallery', 'foogallery' ),
85
+ 'preview_support' => true,
86
+ 'common_fields_support' => true,
87
+ 'paging_support' => true,
88
+ 'lazyload_support' => true,
89
+ 'mandatory_classes' => 'fg-default',
90
+ 'thumbnail_dimensions' => true,
91
+ 'filtering_support' => true,
92
+ 'enqueue_core' => true,
93
+ 'fields' => array(
94
+ array(
95
+ 'id' => 'thumbnail_dimensions',
96
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
97
+ 'desc' => __( 'Choose the size of your thumbnails.', 'foogallery' ),
98
+ 'section' => __( 'General', 'foogallery' ),
99
+ 'type' => 'thumb_size_no_crop',
100
+ 'default' => array(
101
+ 'width' => get_option( 'thumbnail_size_w' ),
102
+ 'height' => get_option( 'thumbnail_size_h' ),
103
+ ),
104
+ 'row_data' => array(
105
+ 'data-foogallery-change-selector' => 'input',
106
+ 'data-foogallery-preview' => 'shortcode'
107
+ )
108
+ ),
109
+ array(
110
+ 'id' => 'mobile_columns',
111
+ 'title' => __( 'Mobile Layout', 'foogallery' ),
112
+ 'desc' => __( 'Number of columns to show on mobile (screen widths less than 600px)', 'foogallery' ),
113
+ 'section' => __( 'General', 'foogallery' ),
114
+ 'default' => '',
115
+ 'type' => 'radio',
116
+ 'choices' => array(
117
+ '' => __( 'Default', 'foogallery' ),
118
+ 'fg-m-col1' => __( '1 Column', 'foogallery' ),
119
+ 'fg-m-col2' => __( '2 Columns', 'foogallery' ),
120
+ 'fg-m-col3' => __( '3 Columns', 'foogallery' ),
121
+ ),
122
+ 'row_data' => array(
123
+ 'data-foogallery-change-selector' => 'input:radio',
124
+ 'data-foogallery-preview' => 'shortcode'
125
+ )
126
+ ),
127
+ array(
128
+ 'id' => 'thumbnail_link',
129
+ 'title' => __( 'Thumbnail Link', 'foogallery' ),
130
+ 'section' => __( 'General', 'foogallery' ),
131
+ 'default' => 'image',
132
+ 'type' => 'thumb_link',
133
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, the image\'s attachment page, a custom URL, or you can choose to not link to anything.', 'foogallery' ),
134
+ ),
135
+ array(
136
+ 'id' => 'lightbox',
137
+ 'title' => __( 'Lightbox', 'foogallery' ),
138
+ 'desc' => __( 'Choose which lightbox you want to use. The lightbox will generally only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
139
+ 'section' => __( 'General', 'foogallery' ),
140
+ 'type' => 'lightbox',
141
+ 'default' => 'none'
142
+ ),
143
+ array(
144
+ 'id' => 'spacing',
145
+ 'title' => __( 'Spacing', 'foogallery' ),
146
+ 'desc' => __( 'The spacing or gap between thumbnails in the gallery.', 'foogallery' ),
147
+ 'section' => __( 'General', 'foogallery' ),
148
+ 'type' => 'select',
149
+ 'default' => 'fg-gutter-10',
150
+ 'choices' => array(
151
+ 'fg-gutter-0' => __( 'none', 'foogallery' ),
152
+ 'fg-gutter-5' => __( '5 pixels', 'foogallery' ),
153
+ 'fg-gutter-10' => __( '10 pixels', 'foogallery' ),
154
+ 'fg-gutter-15' => __( '15 pixels', 'foogallery' ),
155
+ 'fg-gutter-20' => __( '20 pixels', 'foogallery' ),
156
+ 'fg-gutter-25' => __( '25 pixels', 'foogallery' ),
157
+ ),
158
+ 'row_data' => array(
159
+ 'data-foogallery-change-selector' => 'select',
160
+ 'data-foogallery-preview' => 'shortcode'
161
+ )
162
+ ),
163
+ array(
164
+ 'id' => 'alignment',
165
+ 'title' => __( 'Alignment', 'foogallery' ),
166
+ 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery.', 'foogallery' ),
167
+ 'section' => __( 'General', 'foogallery' ),
168
+ 'default' => 'fg-center',
169
+ 'type' => 'radio',
170
+ 'spacer' => '<span class="spacer"></span>',
171
+ 'choices' => array(
172
+ 'fg-left' => __( 'Left', 'foogallery' ),
173
+ 'fg-center' => __( 'Center', 'foogallery' ),
174
+ 'fg-right' => __( 'Right', 'foogallery' ),
175
+ ),
176
+ 'row_data' => array(
177
+ 'data-foogallery-change-selector' => 'input:radio',
178
+ 'data-foogallery-preview' => 'shortcode'
179
+ )
180
+ )
181
+ )
182
+ );
183
+
184
+ return $gallery_templates;
185
+ }
186
+
187
+ /**
188
+ * Builds thumb dimensions from arguments
189
+ *
190
+ * @param array $dimensions
191
+ * @param array $arguments
192
+ *
193
+ * @return mixed
194
+ */
195
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
196
+ if ( array_key_exists( 'thumbnail_dimensions', $arguments ) ) {
197
+ return array(
198
+ 'height' => intval( $arguments['thumbnail_dimensions']['height'] ),
199
+ 'width' => intval( $arguments['thumbnail_dimensions']['width'] ),
200
+ 'crop' => '1'
201
+ );
202
+ }
203
+
204
+ return null;
205
+ }
206
+
207
+ /**
208
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
209
+ *
210
+ * @param array $dimensions
211
+ * @param FooGallery $foogallery
212
+ *
213
+ * @return mixed
214
+ */
215
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
216
+ $dimensions = $foogallery->get_meta( 'default_thumbnail_dimensions', array(
217
+ 'width' => get_option( 'thumbnail_size_w' ),
218
+ 'height' => get_option( 'thumbnail_size_h' )
219
+ ) );
220
+ $dimensions['crop'] = true;
221
+
222
+ return $dimensions;
223
+ }
224
+
225
+ /**
226
+ * Build up the arguments needed for rendering this gallery template
227
+ *
228
+ * @param $args
229
+ *
230
+ * @return array
231
+ */
232
+ function build_gallery_template_arguments( $args ) {
233
+ $args = foogallery_gallery_template_setting( 'thumbnail_dimensions', array() );
234
+ $args['crop'] = '1'; //we now force thumbs to be cropped
235
+ $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
236
+
237
+ return $args;
238
+ }
239
+ }
240
  }
extensions/default-templates/default/gallery-default.php CHANGED
@@ -1,19 +1,19 @@
1
- <?php
2
- /**
3
- * FooGallery default responsive gallery template
4
- */
5
- global $current_foogallery;
6
-
7
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
- $spacing = foogallery_gallery_template_setting( 'spacing', 'spacing-width-10' );
9
- $mobile_columns = foogallery_gallery_template_setting( 'mobile_columns', '' );
10
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
11
-
12
- $foogallery_default_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $spacing, $alignment, $mobile_columns );
13
- $foogallery_default_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_default_classes ) );
14
-
15
- ?><div <?php echo $foogallery_default_attributes; ?>>
16
- <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
17
- echo foogallery_attachment_html( $attachment );
18
- } ?>
19
- </div>
1
+ <?php
2
+ /**
3
+ * FooGallery default responsive gallery template
4
+ */
5
+ global $current_foogallery;
6
+
7
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
+ $spacing = foogallery_gallery_template_setting( 'spacing', 'spacing-width-10' );
9
+ $mobile_columns = foogallery_gallery_template_setting( 'mobile_columns', '' );
10
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
11
+
12
+ $foogallery_default_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $spacing, $alignment, $mobile_columns );
13
+ $foogallery_default_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_default_classes ) );
14
+
15
+ ?><div <?php echo $foogallery_default_attributes; ?>>
16
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
17
+ echo foogallery_attachment_html( $attachment );
18
+ } ?>
19
+ </div>
extensions/default-templates/default/js/admin-gallery-default.js CHANGED
@@ -1,89 +1,89 @@
1
- (function (FOOGALLERY_DEF_TEMPLATE, $, undefined) {
2
-
3
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses = function() {
4
-
5
- var $previewImage = $('.foogallery-default-preview'),
6
- border_style = $('input[name="foogallery_settings[default_border-style]"]:checked').val(),
7
- hover_effect = $('input[name="foogallery_settings[default_hover-effect]"]:checked').val(),
8
- hover_effect_type = $('input[name="foogallery_settings[default_hover-effect-type]"]:checked').val(),
9
- caption_effect_type = $('input[name="foogallery_settings[default_caption-hover-effect]"]:checked').val(),
10
- classNames = 'foogallery-default-preview foogallery-container foogallery-default ' + border_style + ' ' + hover_effect_type;
11
-
12
- var $hoverEffectrow = $('.gallery_template_field-default-hover-effect'),
13
- $captionHoverRow = $('.gallery_template_field-default-caption-hover-effect'),
14
- $captionContentRow = $('.gallery_template_field-default-caption-content');
15
-
16
- if ( hover_effect_type === '' ) {
17
- //icon hover effect type
18
- $hoverEffectrow.show();
19
- $captionHoverRow.hide();
20
- $captionContentRow.hide();
21
- classNames += ' ' + hover_effect;
22
- } else if ( hover_effect_type === 'hover-effect-caption' ) {
23
- //caption hover effect type
24
- $hoverEffectrow.hide();
25
- $captionHoverRow.show();
26
- $captionContentRow.show();
27
- classNames += ' ' + caption_effect_type;
28
- } else {
29
- //no hover effect type
30
- $hoverEffectrow.hide();
31
- $captionHoverRow.hide();
32
- $captionContentRow.hide();
33
- }
34
-
35
- $previewImage.attr('class' , classNames);
36
- };
37
-
38
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent = function(){
39
- var $previewImage = $('.foogallery-default-preview'),
40
- $caption = $previewImage.find('.foogallery-caption'),
41
- $title = $previewImage.find('.foogallery-caption-title'),
42
- $desc = $previewImage.find('.foogallery-caption-desc'),
43
- caption_content = $('input[name="foogallery_settings[default_caption-content]"]:checked').val();
44
-
45
- $caption.add($title).add($desc).show();
46
- switch(caption_content){
47
- case 'title':
48
- $desc.hide();
49
- break;
50
- case 'desc':
51
- $title.hide();
52
- break;
53
- case 'none':
54
- $caption.hide();
55
- break;
56
- }
57
- };
58
-
59
- FOOGALLERY_DEF_TEMPLATE.adminReady = function () {
60
- $('body').on('foogallery-gallery-template-changed-default', function() {
61
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
62
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
63
- });
64
-
65
- $('input[name="foogallery_settings[default_border-style]"], ' +
66
- 'input[name="foogallery_settings[default_hover-effect]"], ' +
67
- 'input[name="foogallery_settings[default_hover-effect-type]"], ' +
68
- 'input[name="foogallery_settings[default_caption-hover-effect]"]').change(function() {
69
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
70
- });
71
-
72
- $('input[name="foogallery_settings[default_caption-content]"]').change(function() {
73
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
74
- });
75
-
76
- $('.foogallery-thumbnail-preview').on('click', function(e) {
77
- e.preventDefault();
78
- });
79
-
80
- //run when the page load for the first time too!
81
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
82
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
83
- };
84
-
85
- }(window.FOOGALLERY_DEF_TEMPLATE = window.FOOGALLERY_DEF_TEMPLATE || {}, jQuery));
86
-
87
- jQuery(function () {
88
- FOOGALLERY_DEF_TEMPLATE.adminReady();
89
  });
1
+ (function (FOOGALLERY_DEF_TEMPLATE, $, undefined) {
2
+
3
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses = function() {
4
+
5
+ var $previewImage = $('.foogallery-default-preview'),
6
+ border_style = $('input[name="foogallery_settings[default_border-style]"]:checked').val(),
7
+ hover_effect = $('input[name="foogallery_settings[default_hover-effect]"]:checked').val(),
8
+ hover_effect_type = $('input[name="foogallery_settings[default_hover-effect-type]"]:checked').val(),
9
+ caption_effect_type = $('input[name="foogallery_settings[default_caption-hover-effect]"]:checked').val(),
10
+ classNames = 'foogallery-default-preview foogallery-container foogallery-default ' + border_style + ' ' + hover_effect_type;
11
+
12
+ var $hoverEffectrow = $('.gallery_template_field-default-hover-effect'),
13
+ $captionHoverRow = $('.gallery_template_field-default-caption-hover-effect'),
14
+ $captionContentRow = $('.gallery_template_field-default-caption-content');
15
+
16
+ if ( hover_effect_type === '' ) {
17
+ //icon hover effect type
18
+ $hoverEffectrow.show();
19
+ $captionHoverRow.hide();
20
+ $captionContentRow.hide();
21
+ classNames += ' ' + hover_effect;
22
+ } else if ( hover_effect_type === 'hover-effect-caption' ) {
23
+ //caption hover effect type
24
+ $hoverEffectrow.hide();
25
+ $captionHoverRow.show();
26
+ $captionContentRow.show();
27
+ classNames += ' ' + caption_effect_type;
28
+ } else {
29
+ //no hover effect type
30
+ $hoverEffectrow.hide();
31
+ $captionHoverRow.hide();
32
+ $captionContentRow.hide();
33
+ }
34
+
35
+ $previewImage.attr('class' , classNames);
36
+ };
37
+
38
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent = function(){
39
+ var $previewImage = $('.foogallery-default-preview'),
40
+ $caption = $previewImage.find('.foogallery-caption'),
41
+ $title = $previewImage.find('.foogallery-caption-title'),
42
+ $desc = $previewImage.find('.foogallery-caption-desc'),
43
+ caption_content = $('input[name="foogallery_settings[default_caption-content]"]:checked').val();
44
+
45
+ $caption.add($title).add($desc).show();
46
+ switch(caption_content){
47
+ case 'title':
48
+ $desc.hide();
49
+ break;
50
+ case 'desc':
51
+ $title.hide();
52
+ break;
53
+ case 'none':
54
+ $caption.hide();
55
+ break;
56
+ }
57
+ };
58
+
59
+ FOOGALLERY_DEF_TEMPLATE.adminReady = function () {
60
+ $('body').on('foogallery-gallery-template-changed-default', function() {
61
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
62
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
63
+ });
64
+
65
+ $('input[name="foogallery_settings[default_border-style]"], ' +
66
+ 'input[name="foogallery_settings[default_hover-effect]"], ' +
67
+ 'input[name="foogallery_settings[default_hover-effect-type]"], ' +
68
+ 'input[name="foogallery_settings[default_caption-hover-effect]"]').change(function() {
69
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
70
+ });
71
+
72
+ $('input[name="foogallery_settings[default_caption-content]"]').change(function() {
73
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
74
+ });
75
+
76
+ $('.foogallery-thumbnail-preview').on('click', function(e) {
77
+ e.preventDefault();
78
+ });
79
+
80
+ //run when the page load for the first time too!
81
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
82
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
83
+ };
84
+
85
+ }(window.FOOGALLERY_DEF_TEMPLATE = window.FOOGALLERY_DEF_TEMPLATE || {}, jQuery));
86
+
87
+ jQuery(function () {
88
+ FOOGALLERY_DEF_TEMPLATE.adminReady();
89
  });
extensions/default-templates/functions.php CHANGED
@@ -1,49 +1,49 @@
1
- <?php
2
- /**
3
- * FooGallery default extensions common functions
4
- */
5
-
6
- /**
7
- * Enqueue the core FooGallery stylesheet used by all default templates
8
- */
9
- function foogallery_enqueue_core_gallery_template_style() {
10
- $filename = foogallery_is_debug() ? '' : '.min';
11
- $css = apply_filters( 'foogallery_core_gallery_style', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/foogallery' . $filename . '.css' );
12
- foogallery_enqueue_style( 'foogallery-core', $css, array(), FOOGALLERY_VERSION );
13
-
14
- if ( foogallery_get_setting( 'custom_css', '' ) !== '' ) {
15
- $custom_assets = get_option( FOOGALLERY_OPTION_CUSTOM_ASSETS );
16
- if ( is_array( $custom_assets ) && array_key_exists( 'style', $custom_assets ) ) {
17
- foogallery_enqueue_style( 'foogallery-custom', $custom_assets['style'], array('foogallery-core'), FOOGALLERY_VERSION );
18
- }
19
- }
20
- }
21
-
22
- /**
23
- * Enqueue the core FooGallery script used by all default templates
24
- *
25
- * @param string[] $deps
26
- */
27
- function foogallery_enqueue_core_gallery_template_script( $deps = null ) {
28
- if ( isset( $deps ) ) {
29
- //ensure we deregister the previous one
30
- wp_deregister_script( 'foogallery-core' );
31
- do_action( 'foogallery_dequeue_script-core' );
32
- } else {
33
- //set the default
34
- $deps = array( 'jquery' );
35
- }
36
-
37
- $filename = foogallery_is_debug() ? '' : '.min';
38
- $js = apply_filters( 'foogallery_core_gallery_script', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'js/foogallery' . $filename . '.js' );
39
- $deps = apply_filters( 'foogallery_core_gallery_script_deps', $deps );
40
- wp_enqueue_script( 'foogallery-core', $js, $deps, FOOGALLERY_VERSION );
41
- do_action( 'foogallery_enqueue_script-core', $js );
42
-
43
- if ( foogallery_get_setting( 'custom_js', '' ) !== '' ) {
44
- $custom_assets = get_option( FOOGALLERY_OPTION_CUSTOM_ASSETS );
45
- if ( is_array( $custom_assets ) && array_key_exists( 'script', $custom_assets ) ) {
46
- wp_enqueue_script( 'foogallery-custom', $custom_assets['script'], array('foogallery-core'), FOOGALLERY_VERSION );
47
- }
48
- }
49
- }
1
+ <?php
2
+ /**
3
+ * FooGallery default extensions common functions
4
+ */
5
+
6
+ /**
7
+ * Enqueue the core FooGallery stylesheet used by all default templates
8
+ */
9
+ function foogallery_enqueue_core_gallery_template_style() {
10
+ $filename = foogallery_is_debug() ? '' : '.min';
11
+ $css = apply_filters( 'foogallery_core_gallery_style', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/foogallery' . $filename . '.css' );
12
+ foogallery_enqueue_style( 'foogallery-core', $css, array(), FOOGALLERY_VERSION );
13
+
14
+ if ( foogallery_get_setting( 'custom_css', '' ) !== '' ) {
15
+ $custom_assets = get_option( FOOGALLERY_OPTION_CUSTOM_ASSETS );
16
+ if ( is_array( $custom_assets ) && array_key_exists( 'style', $custom_assets ) ) {
17
+ foogallery_enqueue_style( 'foogallery-custom', $custom_assets['style'], array('foogallery-core'), FOOGALLERY_VERSION );
18
+ }
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Enqueue the core FooGallery script used by all default templates
24
+ *
25
+ * @param string[] $deps
26
+ */
27
+ function foogallery_enqueue_core_gallery_template_script( $deps = null ) {
28
+ if ( isset( $deps ) ) {
29
+ //ensure we deregister the previous one
30
+ wp_deregister_script( 'foogallery-core' );
31
+ do_action( 'foogallery_dequeue_script-core' );
32
+ } else {
33
+ //set the default
34
+ $deps = array( 'jquery' );
35
+ }
36
+
37
+ $filename = foogallery_is_debug() ? '' : '.min';
38
+ $js = apply_filters( 'foogallery_core_gallery_script', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'js/foogallery' . $filename . '.js' );
39
+ $deps = apply_filters( 'foogallery_core_gallery_script_deps', $deps );
40
+ wp_enqueue_script( 'foogallery-core', $js, $deps, FOOGALLERY_VERSION );
41
+ do_action( 'foogallery_enqueue_script-core', $js );
42
+
43
+ if ( foogallery_get_setting( 'custom_js', '' ) !== '' ) {
44
+ $custom_assets = get_option( FOOGALLERY_OPTION_CUSTOM_ASSETS );
45
+ if ( is_array( $custom_assets ) && array_key_exists( 'script', $custom_assets ) ) {
46
+ wp_enqueue_script( 'foogallery-custom', $custom_assets['script'], array('foogallery-core'), FOOGALLERY_VERSION );
47
+ }
48
+ }
49
+ }
extensions/default-templates/image-viewer/class-image-viewer-gallery-template.php CHANGED
@@ -1,312 +1,312 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Image_Viewer_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_IMAGE_VIEWER_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Image_Viewer_Gallery_Template {
8
-
9
- const TEMPLATE_ID = 'image-viewer';
10
-
11
- /**
12
- * Wire up everything we need to run the extension
13
- */
14
- function __construct() {
15
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
16
-
17
- //add extra fields to the templates
18
- add_filter( 'foogallery_override_gallery_template_fields-image-viewer', array( $this, 'adjust_fields' ), 10, 2 );
19
-
20
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
21
-
22
- add_filter( 'foogallery_template_thumbnail_dimensions-image-viewer', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
23
-
24
- //override specific settings when saving the gallery
25
- add_filter( 'foogallery_save_gallery_settings-image-viewer', array( $this, 'override_settings'), 10, 3 );
26
-
27
- //build up the thumb dimensions from some arguments
28
- add_filter( 'foogallery_calculate_thumbnail_dimensions-image-viewer', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
-
30
- //alter the crop value if needed
31
- add_filter( 'foogallery_render_gallery_template_field_value', array( $this, 'alter_field_value'), 10, 4 );
32
-
33
- //build up the arguments needed for rendering this template
34
- add_filter( 'foogallery_gallery_template_arguments-image-viewer', array( $this, 'build_gallery_template_arguments' ) );
35
-
36
- //add the data options needed for image viewer
37
- add_filter( 'foogallery_build_container_data_options-image-viewer', array( $this, 'add_data_options' ), 10, 3 );
38
-
39
- // add a style block for the gallery based on the thumbnail width.
40
- add_action( 'foogallery_loaded_template_before', array( $this, 'add_width_style_block' ), 10, 1 );
41
- }
42
-
43
- /**
44
- * Add a style block based on the width thumbnail size
45
- *
46
- * @param $gallery FooGallery
47
- */
48
- function add_width_style_block( $gallery ) {
49
- if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
50
- return;
51
- }
52
-
53
- $id = $gallery->container_id();
54
- $dimensions = foogallery_gallery_template_setting('thumbnail_size');
55
- if ( is_array( $dimensions ) && array_key_exists( 'width', $dimensions ) && intval( $dimensions['width'] ) > 0 ) {
56
- $width = intval( $dimensions['width'] );
57
-
58
- // @formatter:off
59
- ?>
60
- <style type="text/css">
61
- <?php echo '#' . $id; ?> .fg-image {
62
- width: <?php echo $width; ?>px;
63
- }
64
- </style>
65
- <?php
66
- // @formatter:on
67
- }
68
- }
69
-
70
- function alter_field_value( $value, $field, $gallery, $template ) {
71
- //only do something if we are dealing with the thumbnail_dimensions field in this template
72
- if ( self::TEMPLATE_ID === $template['slug'] && 'thumbnail_size' === $field['id'] ) {
73
- if ( !array_key_exists( 'crop', $value ) ) {
74
- $value['crop'] = true;
75
- }
76
- }
77
-
78
- return $value;
79
- }
80
-
81
- /**
82
- * Register myself so that all associated JS and CSS files can be found and automatically included
83
- * @param $extensions
84
- *
85
- * @return array
86
- */
87
- function register_myself( $extensions ) {
88
- $extensions[] = __FILE__;
89
- return $extensions;
90
- }
91
-
92
- /**
93
- * Add our gallery template to the list of templates available for every gallery
94
- * @param $gallery_templates
95
- *
96
- * @return array
97
- */
98
- function add_template( $gallery_templates ) {
99
-
100
- $gallery_templates[] = array(
101
- 'slug' => self::TEMPLATE_ID,
102
- 'name' => __( 'Image Viewer', 'foogallery' ),
103
- 'preview_support' => true,
104
- 'common_fields_support' => true,
105
- 'lazyload_support' => true,
106
- 'mandatory_classes' => 'fg-image-viewer',
107
- 'thumbnail_dimensions' => true,
108
- 'enqueue_core' => true,
109
- 'fields' => array(
110
- array(
111
- 'id' => 'thumbnail-help',
112
- 'title' => __( 'Thumbnail Help', 'foogallery' ),
113
- 'desc' => __( 'It is recommended to crop your thumbnails, so that your gallery remains a constant size. If you do not crop, then the size of the gallery could potentially change for each thumbnail.', 'foogallery' ),
114
- 'section' => __( 'General', 'foogallery' ),
115
- 'type' => 'help'
116
- ),
117
- array(
118
- 'id' => 'thumbnail_size',
119
- 'title' => __( 'Thumb Size', 'foogallery' ),
120
- 'section' => __( 'General', 'foogallery' ),
121
- 'desc' => __( 'Choose the size of your thumbnails', 'foogallery' ),
122
- 'type' => 'thumb_size',
123
- 'default' => array(
124
- 'width' => 640,
125
- 'height' => 360,
126
- 'crop' => true
127
- ),
128
- 'row_data'=> array(
129
- 'data-foogallery-change-selector' => 'input',
130
- 'data-foogallery-preview' => 'shortcode'
131
- )
132
- ),
133
- array(
134
- 'id' => 'thumbnail_link',
135
- 'title' => __( 'Thumbnail Link', 'foogallery' ),
136
- 'section' => __( 'General', 'foogallery' ),
137
- 'default' => 'image' ,
138
- 'type' => 'thumb_link',
139
- 'desc' => __( 'You can choose to either link each thumbnail to the full size image or to the image\'s attachment page', 'foogallery'),
140
- ),
141
- array(
142
- 'id' => 'lightbox',
143
- 'title' => __( 'Lightbox', 'foogallery' ),
144
- 'section' => __( 'General', 'foogallery' ),
145
- 'desc' => __( 'Choose which lightbox you want to use in the gallery', 'foogallery' ),
146
- 'default' => 'none',
147
- 'type' => 'lightbox',
148
- ),
149
- array(
150
- 'id' => 'alignment',
151
- 'title' => __( 'Alignment', 'foogallery' ),
152
- 'section' => __( 'General', 'foogallery' ),
153
- 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery', 'foogallery' ),
154
- 'default' => 'fg-center',
155
- 'type' => 'radio',
156
- 'spacer' => '<span class="spacer"></span>',
157
- 'choices' => array(
158
- 'fg-left' => __( 'Left', 'foogallery' ),
159
- 'fg-center' => __( 'Center', 'foogallery' ),
160
- 'fg-right' => __( 'Right', 'foogallery' ),
161
- ),
162
- 'row_data'=> array(
163
- 'data-foogallery-change-selector' => 'input:radio',
164
- 'data-foogallery-preview' => 'shortcode'
165
- )
166
- ),
167
- array(
168
- 'id' => 'looping',
169
- 'title' => __( 'Loop Images', 'foogallery' ),
170
- 'section' => __( 'General', 'foogallery' ),
171
- 'desc' => __( 'When navigating through the images, do you want to loop image back to the first after you navigate past the last image?', 'foogallery' ),
172
- 'default' => 'enabled',
173
- 'type' => 'radio',
174
- 'spacer' => '<span class="spacer"></span>',
175
- 'choices' => array(
176
- 'disabled' => __( 'Disabled', 'foogallery' ),
177
- 'enabled' => __( 'Looping Enabled', 'foogallery' ),
178
- ),
179
- 'row_data'=> array(
180
- 'data-foogallery-change-selector' => 'input:radio',
181
- 'data-foogallery-preview' => 'shortcode'
182
- )
183
- ),
184
- array(
185
- 'id' => 'language-help',
186
- 'title' => __( 'Language Help', 'foogallery' ),
187
- 'desc' => __( 'You can change the "Prev", "Next" and "of" text used in the gallery from the settings page, under the Language tab.', 'foogallery' ),
188
- 'section' => __( 'General', 'foogallery' ),
189
- 'type' => 'help'
190
- )
191
- )
192
- );
193
-
194
- return $gallery_templates;
195
- }
196
-
197
- /**
198
- * Add thumbnail fields to the gallery template
199
- *
200
- * @uses "foogallery_override_gallery_template_fields"
201
- * @param $fields
202
- * @param $template
203
- *
204
- * @return array
205
- */
206
- function adjust_fields( $fields, $template ) {
207
-
208
- //update specific fields
209
- foreach ($fields as &$field) {
210
- if ( 'rounded_corners' === $field['id'] ) {
211
- unset( $field['choices']['fg-round-full'] );
212
- }
213
- }
214
-
215
- return $fields;
216
- }
217
-
218
- /**
219
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
220
- *
221
- * @param array $dimensions
222
- * @param FooGallery $foogallery
223
- *
224
- * @return mixed
225
- */
226
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
227
- $dimensions = $foogallery->get_meta( 'image-viewer_thumbnail_size', array(
228
- 'width' => 640,
229
- 'height' => 360,
230
- 'crop' => true
231
- ) );
232
- if ( !array_key_exists( 'crop', $dimensions ) ) {
233
- $dimensions['crop'] = true;
234
- }
235
- return $dimensions;
236
- }
237
-
238
- /**
239
- * Override specific settings so that the gallery template will always work
240
- *
241
- * @param $settings
242
- * @param $post_id
243
- * @param $form_data
244
- *
245
- * @return mixed
246
- */
247
- function override_settings($settings, $post_id, $form_data) {
248
- if ( 'fg-round-full' === $settings['image-viewer_rounded_corners'] ) {
249
- $settings['image-viewer_rounded_corners'] = 'fg-round-large';
250
- }
251
-
252
- return $settings;
253
- }
254
-
255
- /**
256
- * Builds thumb dimensions from arguments
257
- *
258
- * @param array $dimensions
259
- * @param array $arguments
260
- *
261
- * @return mixed
262
- */
263
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
264
- if ( array_key_exists( 'thumbnail_size', $arguments) ) {
265
- return array(
266
- 'height' => intval($arguments['thumbnail_size']['height']),
267
- 'width' => intval($arguments['thumbnail_size']['width']),
268
- 'crop' => $arguments['thumbnail_size']['crop']
269
- );
270
- }
271
- return null;
272
- }
273
-
274
- /**
275
- * Build up the arguments needed for rendering this gallery template
276
- *
277
- * @param $args
278
- * @return array
279
- */
280
- function build_gallery_template_arguments( $args ) {
281
- $args = foogallery_gallery_template_setting( 'thumbnail_size', array(
282
- 'width' => 640,
283
- 'height' => 360,
284
- 'crop' => true
285
- ) );
286
- if ( !array_key_exists( 'crop', $args ) ) {
287
- $args['crop'] = '1'; //we now force thumbs to be cropped by default
288
- }
289
- $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
290
-
291
- return $args;
292
- }
293
-
294
- /**
295
- * Add the required options
296
- *
297
- * @param $options
298
- * @param $gallery FooGallery
299
- *
300
- * @param $attributes array
301
- *
302
- * @return array
303
- */
304
- function add_data_options($options, $gallery, $attributes) {
305
-
306
- $looping = foogallery_gallery_template_setting( 'looping', 'enabled' ) === 'enabled';
307
- $options['template']['loop'] = $looping;
308
-
309
- return $options;
310
- }
311
- }
312
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Image_Viewer_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_IMAGE_VIEWER_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Image_Viewer_Gallery_Template {
8
+
9
+ const TEMPLATE_ID = 'image-viewer';
10
+
11
+ /**
12
+ * Wire up everything we need to run the extension
13
+ */
14
+ function __construct() {
15
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
16
+
17
+ //add extra fields to the templates
18
+ add_filter( 'foogallery_override_gallery_template_fields-image-viewer', array( $this, 'adjust_fields' ), 10, 2 );
19
+
20
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
21
+
22
+ add_filter( 'foogallery_template_thumbnail_dimensions-image-viewer', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
23
+
24
+ //override specific settings when saving the gallery
25
+ add_filter( 'foogallery_save_gallery_settings-image-viewer', array( $this, 'override_settings'), 10, 3 );
26
+
27
+ //build up the thumb dimensions from some arguments
28
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-image-viewer', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
+
30
+ //alter the crop value if needed
31
+ add_filter( 'foogallery_render_gallery_template_field_value', array( $this, 'alter_field_value'), 10, 4 );
32
+
33
+ //build up the arguments needed for rendering this template
34
+ add_filter( 'foogallery_gallery_template_arguments-image-viewer', array( $this, 'build_gallery_template_arguments' ) );
35
+
36
+ //add the data options needed for image viewer
37
+ add_filter( 'foogallery_build_container_data_options-image-viewer', array( $this, 'add_data_options' ), 10, 3 );
38
+
39
+ // add a style block for the gallery based on the thumbnail width.
40
+ add_action( 'foogallery_loaded_template_before', array( $this, 'add_width_style_block' ), 10, 1 );
41
+ }
42
+
43
+ /**
44
+ * Add a style block based on the width thumbnail size
45
+ *
46
+ * @param $gallery FooGallery
47
+ */
48
+ function add_width_style_block( $gallery ) {
49
+ if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
50
+ return;
51
+ }
52
+
53
+ $id = $gallery->container_id();
54
+ $dimensions = foogallery_gallery_template_setting('thumbnail_size');
55
+ if ( is_array( $dimensions ) && array_key_exists( 'width', $dimensions ) && intval( $dimensions['width'] ) > 0 ) {
56
+ $width = intval( $dimensions['width'] );
57
+
58
+ // @formatter:off
59
+ ?>
60
+ <style type="text/css">
61
+ <?php echo '#' . $id; ?> .fg-image {
62
+ width: <?php echo $width; ?>px;
63
+ }
64
+ </style>
65
+ <?php
66
+ // @formatter:on
67
+ }
68
+ }
69
+
70
+ function alter_field_value( $value, $field, $gallery, $template ) {
71
+ //only do something if we are dealing with the thumbnail_dimensions field in this template
72
+ if ( self::TEMPLATE_ID === $template['slug'] && 'thumbnail_size' === $field['id'] ) {
73
+ if ( !array_key_exists( 'crop', $value ) ) {
74
+ $value['crop'] = true;
75
+ }
76
+ }
77
+
78
+ return $value;
79
+ }
80
+
81
+ /**
82
+ * Register myself so that all associated JS and CSS files can be found and automatically included
83
+ * @param $extensions
84
+ *
85
+ * @return array
86
+ */
87
+ function register_myself( $extensions ) {
88
+ $extensions[] = __FILE__;
89
+ return $extensions;
90
+ }
91
+
92
+ /**
93
+ * Add our gallery template to the list of templates available for every gallery
94
+ * @param $gallery_templates
95
+ *
96
+ * @return array
97
+ */
98
+ function add_template( $gallery_templates ) {
99
+
100
+ $gallery_templates[] = array(
101
+ 'slug' => self::TEMPLATE_ID,
102
+ 'name' => __( 'Image Viewer', 'foogallery' ),
103
+ 'preview_support' => true,
104
+ 'common_fields_support' => true,
105
+ 'lazyload_support' => true,
106
+ 'mandatory_classes' => 'fg-image-viewer',
107
+ 'thumbnail_dimensions' => true,
108
+ 'enqueue_core' => true,
109
+ 'fields' => array(
110
+ array(
111
+ 'id' => 'thumbnail-help',
112
+ 'title' => __( 'Thumbnail Help', 'foogallery' ),
113
+ 'desc' => __( 'It is recommended to crop your thumbnails, so that your gallery remains a constant size. If you do not crop, then the size of the gallery could potentially change for each thumbnail.', 'foogallery' ),
114
+ 'section' => __( 'General', 'foogallery' ),
115
+ 'type' => 'help'
116
+ ),
117
+ array(
118
+ 'id' => 'thumbnail_size',
119
+ 'title' => __( 'Thumb Size', 'foogallery' ),
120
+ 'section' => __( 'General', 'foogallery' ),
121
+ 'desc' => __( 'Choose the size of your thumbnails', 'foogallery' ),
122
+ 'type' => 'thumb_size',
123
+ 'default' => array(
124
+ 'width' => 640,
125
+ 'height' => 360,
126
+ 'crop' => true
127
+ ),
128
+ 'row_data'=> array(
129
+ 'data-foogallery-change-selector' => 'input',
130
+ 'data-foogallery-preview' => 'shortcode'
131
+ )
132
+ ),
133
+ array(
134
+ 'id' => 'thumbnail_link',
135
+ 'title' => __( 'Thumbnail Link', 'foogallery' ),
136
+ 'section' => __( 'General', 'foogallery' ),
137
+ 'default' => 'image' ,
138
+ 'type' => 'thumb_link',
139
+ 'desc' => __( 'You can choose to either link each thumbnail to the full size image or to the image\'s attachment page', 'foogallery'),
140
+ ),
141
+ array(
142
+ 'id' => 'lightbox',
143
+ 'title' => __( 'Lightbox', 'foogallery' ),
144
+ 'section' => __( 'General', 'foogallery' ),
145
+ 'desc' => __( 'Choose which lightbox you want to use in the gallery', 'foogallery' ),
146
+ 'default' => 'none',
147
+ 'type' => 'lightbox',
148
+ ),
149
+ array(
150
+ 'id' => 'alignment',
151
+ 'title' => __( 'Alignment', 'foogallery' ),
152
+ 'section' => __( 'General', 'foogallery' ),
153
+ 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery', 'foogallery' ),
154
+ 'default' => 'fg-center',
155
+ 'type' => 'radio',
156
+ 'spacer' => '<span class="spacer"></span>',
157
+ 'choices' => array(
158
+ 'fg-left' => __( 'Left', 'foogallery' ),
159
+ 'fg-center' => __( 'Center', 'foogallery' ),
160
+ 'fg-right' => __( 'Right', 'foogallery' ),
161
+ ),
162
+ 'row_data'=> array(
163
+ 'data-foogallery-change-selector' => 'input:radio',
164
+ 'data-foogallery-preview' => 'shortcode'
165
+ )
166
+ ),
167
+ array(
168
+ 'id' => 'looping',
169
+ 'title' => __( 'Loop Images', 'foogallery' ),
170
+ 'section' => __( 'General', 'foogallery' ),
171
+ 'desc' => __( 'When navigating through the images, do you want to loop image back to the first after you navigate past the last image?', 'foogallery' ),
172
+ 'default' => 'enabled',
173
+ 'type' => 'radio',
174
+ 'spacer' => '<span class="spacer"></span>',
175
+ 'choices' => array(
176
+ 'disabled' => __( 'Disabled', 'foogallery' ),
177
+ 'enabled' => __( 'Looping Enabled', 'foogallery' ),
178
+ ),
179
+ 'row_data'=> array(
180
+ 'data-foogallery-change-selector' => 'input:radio',
181
+ 'data-foogallery-preview' => 'shortcode'
182
+ )
183
+ ),
184
+ array(
185
+ 'id' => 'language-help',
186
+ 'title' => __( 'Language Help', 'foogallery' ),
187
+ 'desc' => __( 'You can change the "Prev", "Next" and "of" text used in the gallery from the settings page, under the Language tab.', 'foogallery' ),
188
+ 'section' => __( 'General', 'foogallery' ),
189
+ 'type' => 'help'
190
+ )
191
+ )
192
+ );
193
+
194
+ return $gallery_templates;
195
+ }
196
+
197
+ /**
198
+ * Add thumbnail fields to the gallery template
199
+ *
200
+ * @uses "foogallery_override_gallery_template_fields"
201
+ * @param $fields
202
+ * @param $template
203
+ *
204
+ * @return array
205
+ */
206
+ function adjust_fields( $fields, $template ) {
207
+
208
+ //update specific fields
209
+ foreach ($fields as &$field) {
210
+ if ( 'rounded_corners' === $field['id'] ) {
211
+ unset( $field['choices']['fg-round-full'] );
212
+ }
213
+ }
214
+
215
+ return $fields;
216
+ }
217
+
218
+ /**
219
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
220
+ *
221
+ * @param array $dimensions
222
+ * @param FooGallery $foogallery
223
+ *
224
+ * @return mixed
225
+ */
226
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
227
+ $dimensions = $foogallery->get_meta( 'image-viewer_thumbnail_size', array(
228
+ 'width' => 640,
229
+ 'height' => 360,
230
+ 'crop' => true
231
+ ) );
232
+ if ( !array_key_exists( 'crop', $dimensions ) ) {
233
+ $dimensions['crop'] = true;
234
+ }
235
+ return $dimensions;
236
+ }
237
+
238
+ /**
239
+ * Override specific settings so that the gallery template will always work
240
+ *
241
+ * @param $settings
242
+ * @param $post_id
243
+ * @param $form_data
244
+ *
245
+ * @return mixed
246
+ */
247
+ function override_settings($settings, $post_id, $form_data) {
248
+ if ( 'fg-round-full' === $settings['image-viewer_rounded_corners'] ) {
249
+ $settings['image-viewer_rounded_corners'] = 'fg-round-large';
250
+ }
251
+
252
+ return $settings;
253
+ }
254
+
255
+ /**
256
+ * Builds thumb dimensions from arguments
257
+ *
258
+ * @param array $dimensions
259
+ * @param array $arguments
260
+ *
261
+ * @return mixed
262
+ */
263
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
264
+ if ( array_key_exists( 'thumbnail_size', $arguments) ) {
265
+ return array(
266
+ 'height' => intval($arguments['thumbnail_size']['height']),
267
+ 'width' => intval($arguments['thumbnail_size']['width']),
268
+ 'crop' => $arguments['thumbnail_size']['crop']
269
+ );
270
+ }
271
+ return null;
272
+ }
273
+
274
+ /**
275
+ * Build up the arguments needed for rendering this gallery template
276
+ *
277
+ * @param $args
278
+ * @return array
279
+ */
280
+ function build_gallery_template_arguments( $args ) {
281
+ $args = foogallery_gallery_template_setting( 'thumbnail_size', array(
282
+ 'width' => 640,
283
+ 'height' => 360,
284
+ 'crop' => true
285
+ ) );
286
+ if ( !array_key_exists( 'crop', $args ) ) {
287
+ $args['crop'] = '1'; //we now force thumbs to be cropped by default
288
+ }
289
+ $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
290
+
291
+ return $args;
292
+ }
293
+
294
+ /**
295
+ * Add the required options
296
+ *
297
+ * @param $options
298
+ * @param $gallery FooGallery
299
+ *
300
+ * @param $attributes array
301
+ *
302
+ * @return array
303
+ */
304
+ function add_data_options($options, $gallery, $attributes) {
305
+
306
+ $looping = foogallery_gallery_template_setting( 'looping', 'enabled' ) === 'enabled';
307
+ $options['template']['loop'] = $looping;
308
+
309
+ return $options;
310
+ }
311
+ }
312
  }
extensions/default-templates/image-viewer/gallery-image-viewer.php CHANGED
@@ -1,39 +1,39 @@
1
- <?php
2
- /**
3
- * FooGallery Image Viewer gallery template
4
- * This is the template that is run when a FooGallery shortcode is rendered to the frontend
5
- */
6
- //the current FooGallery that is currently being rendered to the frontend
7
- global $current_foogallery;
8
- //the current shortcode args
9
- global $current_foogallery_arguments;
10
-
11
- $text_prev_default = foogallery_get_setting( 'language_imageviewer_prev_text', __('Prev', 'foogallery') );
12
- $text_prev = foogallery_gallery_template_setting( 'text-prev', $text_prev_default );
13
-
14
- $text_of_default = foogallery_get_setting( 'language_imageviewer_of_text', __('of', 'foogallery') );
15
- $text_of = foogallery_gallery_template_setting( 'text-of', $text_of_default );
16
-
17
- $text_next_default = foogallery_get_setting( 'language_imageviewer_next_text', __('Next', 'foogallery') );
18
- $text_next = foogallery_gallery_template_setting( 'text-next', $text_next_default );
19
-
20
- //get which lightbox we want to use
21
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
22
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
23
- $link = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
24
- $foogallery_imageviewer_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-link-' . $link, 'foogallery-lightbox-' . $lightbox, $alignment );
25
- $foogallery_imageviewer_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_imageviewer_classes ) );
26
- ?><div <?php echo $foogallery_imageviewer_attributes; ?>>
27
- <div class="fiv-inner">
28
- <div class="fiv-inner-container">
29
- <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
30
- echo foogallery_attachment_html( $attachment );
31
- } ?>
32
- </div>
33
- <div class="fiv-ctrls">
34
- <div class="fiv-prev"><span><?php echo $text_prev; ?></span></div>
35
- <label class="fiv-count"><span class="fiv-count-current">1</span><?php echo $text_of; ?><span class="fiv-count-total"><?php echo $current_foogallery->attachment_count(); ?></span></label>
36
- <div class="fiv-next"><span><?php echo $text_next; ?></span></div>
37
- </div>
38
- </div>
39
  </div>
1
+ <?php
2
+ /**
3
+ * FooGallery Image Viewer gallery template
4
+ * This is the template that is run when a FooGallery shortcode is rendered to the frontend
5
+ */
6
+ //the current FooGallery that is currently being rendered to the frontend
7
+ global $current_foogallery;
8
+ //the current shortcode args
9
+ global $current_foogallery_arguments;
10
+
11
+ $text_prev_default = foogallery_get_setting( 'language_imageviewer_prev_text', __('Prev', 'foogallery') );
12
+ $text_prev = foogallery_gallery_template_setting( 'text-prev', $text_prev_default );
13
+
14
+ $text_of_default = foogallery_get_setting( 'language_imageviewer_of_text', __('of', 'foogallery') );
15
+ $text_of = foogallery_gallery_template_setting( 'text-of', $text_of_default );
16
+
17
+ $text_next_default = foogallery_get_setting( 'language_imageviewer_next_text', __('Next', 'foogallery') );
18
+ $text_next = foogallery_gallery_template_setting( 'text-next', $text_next_default );
19
+
20
+ //get which lightbox we want to use
21
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
22
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
23
+ $link = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
24
+ $foogallery_imageviewer_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-link-' . $link, 'foogallery-lightbox-' . $lightbox, $alignment );
25
+ $foogallery_imageviewer_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_imageviewer_classes ) );
26
+ ?><div <?php echo $foogallery_imageviewer_attributes; ?>>
27
+ <div class="fiv-inner">
28
+ <div class="fiv-inner-container">
29
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
30
+ echo foogallery_attachment_html( $attachment );
31
+ } ?>
32
+ </div>
33
+ <div class="fiv-ctrls">
34
+ <div class="fiv-prev"><span><?php echo $text_prev; ?></span></div>
35
+ <label class="fiv-count"><span class="fiv-count-current">1</span><?php echo $text_of; ?><span class="fiv-count-total"><?php echo $current_foogallery->attachment_count(); ?></span></label>
36
+ <div class="fiv-next"><span><?php echo $text_next; ?></span></div>
37
+ </div>
38
+ </div>
39
  </div>
extensions/default-templates/image-viewer/js/admin-gallery-image-viewer.js CHANGED
@@ -1,123 +1,123 @@
1
- //Use this file to inject custom javascript behaviour into the foogallery edit page
2
- //For an example usage, check out wp-content/foogallery/extensions/default-templates/js/admin-gallery-default.js
3
-
4
- (function (IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION, $, undefined) {
5
-
6
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses = function() {
7
- var $previewImage = $('.foogallery-image-viewer-preview'),
8
- theme = $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val(),
9
- hover_effect = $('input[name="foogallery_settings[image-viewer_hover-effect]"]:checked').val(),
10
- hover_effect_type = $('input[name="foogallery_settings[image-viewer_hover-effect-type]"]:checked').val();
11
-
12
- var $styles = $('#image-preview-custom-styles');
13
- if (theme === 'fiv-custom'){
14
- var bg_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"]').val(),
15
- text_color = $('input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"]').val(),
16
- border_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"]').val(),
17
- hover_color = $('input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]').val();
18
-
19
- var css = '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
20
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
21
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
22
- css += 'background-color: '+bg_color+';';
23
- css += 'color: '+text_color+';';
24
- css += '}';
25
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
26
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-inner-container,';
27
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
28
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
29
- css += 'border-color: '+border_color+';';
30
- css += '}';
31
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev:hover,';
32
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next:hover {';
33
- css += 'background-color: '+hover_color+';';
34
- css += '}';
35
- $styles.remove();
36
- $('head').append('<style id="image-preview-custom-styles">'+css+'</style>');
37
- } else {
38
- $styles.remove();
39
- }
40
-
41
- $previewImage.attr('class' ,'foogallery-image-viewer-preview foogallery-container foogallery-image-viewer ' + theme);
42
- if (hover_effect_type !== 'hover-effect-none'){
43
- $previewImage.addClass(hover_effect_type + ' ' + hover_effect);
44
- }
45
-
46
- var $hoverEffectrow = $('.gallery_template_field-image-viewer-hover-effect');
47
- if ( hover_effect_type === '' ) {
48
- $hoverEffectrow.show();
49
- } else {
50
- $hoverEffectrow.hide();
51
- }
52
- };
53
-
54
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows = function(){
55
- var $theme_rows = $('.gallery_template_field-image-viewer-theme_custom_bgcolor')
56
- .add('.gallery_template_field-image-viewer-theme_custom_textcolor')
57
- .add('.gallery_template_field-image-viewer-theme_custom_hovercolor')
58
- .add('.gallery_template_field-image-viewer-theme_custom_bordercolor');
59
-
60
- if ( $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val() === 'fiv-custom' ) {
61
- $theme_rows.show();
62
- } else {
63
- $theme_rows.hide();
64
- }
65
- };
66
-
67
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent = function(){
68
- var $previewImage = $('.foogallery-image-viewer-preview'),
69
- $caption = $previewImage.find('.foogallery-caption'),
70
- $title = $previewImage.find('.foogallery-caption-title'),
71
- $desc = $previewImage.find('.foogallery-caption-desc'),
72
- caption_content = $('input[name="foogallery_settings[image-viewer_caption-content]"]:checked').val();
73
-
74
- $caption.add($title).add($desc).show();
75
- switch(caption_content){
76
- case 'title':
77
- $desc.hide();
78
- break;
79
- case 'desc':
80
- $title.hide();
81
- break;
82
- case 'none':
83
- $caption.hide();
84
- break;
85
- }
86
- };
87
-
88
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady = function () {
89
- $('body').on('foogallery-gallery-template-changed-image-viewer', function() {
90
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
91
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
92
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
93
- });
94
-
95
- var ps = 'input[name="foogallery_settings[image-viewer_hover-effect]"], ' +
96
- 'input[name="foogallery_settings[image-viewer_hover-effect-type]"], ' +
97
- 'input[name="foogallery_settings[image-viewer_theme]"], ' +
98
- 'input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"], ' +
99
- 'input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"], ' +
100
- 'input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"], ' +
101
- 'input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]';
102
- $(ps).change(function() {
103
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
104
- });
105
-
106
- $('input[name="foogallery_settings[image-viewer_caption-content]"]').change(function() {
107
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
108
- });
109
-
110
- $('input[name="foogallery_settings[image-viewer_theme]"]').change(function() {
111
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
112
- });
113
-
114
- $('.foogallery-image-viewer-preview').on('click', function(e) {
115
- e.preventDefault();
116
- });
117
- };
118
-
119
- }(window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION = window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION || {}, jQuery));
120
-
121
- jQuery(function () {
122
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady();
123
  });
1
+ //Use this file to inject custom javascript behaviour into the foogallery edit page
2
+ //For an example usage, check out wp-content/foogallery/extensions/default-templates/js/admin-gallery-default.js
3
+
4
+ (function (IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION, $, undefined) {
5
+
6
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses = function() {
7
+ var $previewImage = $('.foogallery-image-viewer-preview'),
8
+ theme = $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val(),
9
+ hover_effect = $('input[name="foogallery_settings[image-viewer_hover-effect]"]:checked').val(),
10
+ hover_effect_type = $('input[name="foogallery_settings[image-viewer_hover-effect-type]"]:checked').val();
11
+
12
+ var $styles = $('#image-preview-custom-styles');
13
+ if (theme === 'fiv-custom'){
14
+ var bg_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"]').val(),
15
+ text_color = $('input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"]').val(),
16
+ border_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"]').val(),
17
+ hover_color = $('input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]').val();
18
+
19
+ var css = '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
20
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
21
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
22
+ css += 'background-color: '+bg_color+';';
23
+ css += 'color: '+text_color+';';
24
+ css += '}';
25
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
26
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-inner-container,';
27
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
28
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
29
+ css += 'border-color: '+border_color+';';
30
+ css += '}';
31
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev:hover,';
32
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next:hover {';
33
+ css += 'background-color: '+hover_color+';';
34
+ css += '}';
35
+ $styles.remove();
36
+ $('head').append('<style id="image-preview-custom-styles">'+css+'</style>');
37
+ } else {
38
+ $styles.remove();
39
+ }
40
+
41
+ $previewImage.attr('class' ,'foogallery-image-viewer-preview foogallery-container foogallery-image-viewer ' + theme);
42
+ if (hover_effect_type !== 'hover-effect-none'){
43
+ $previewImage.addClass(hover_effect_type + ' ' + hover_effect);
44
+ }
45
+
46
+ var $hoverEffectrow = $('.gallery_template_field-image-viewer-hover-effect');
47
+ if ( hover_effect_type === '' ) {
48
+ $hoverEffectrow.show();
49
+ } else {
50
+ $hoverEffectrow.hide();
51
+ }
52
+ };
53
+
54
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows = function(){
55
+ var $theme_rows = $('.gallery_template_field-image-viewer-theme_custom_bgcolor')
56
+ .add('.gallery_template_field-image-viewer-theme_custom_textcolor')
57
+ .add('.gallery_template_field-image-viewer-theme_custom_hovercolor')
58
+ .add('.gallery_template_field-image-viewer-theme_custom_bordercolor');
59
+
60
+ if ( $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val() === 'fiv-custom' ) {
61
+ $theme_rows.show();
62
+ } else {
63
+ $theme_rows.hide();
64
+ }
65
+ };
66
+
67
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent = function(){
68
+ var $previewImage = $('.foogallery-image-viewer-preview'),
69
+ $caption = $previewImage.find('.foogallery-caption'),
70
+ $title = $previewImage.find('.foogallery-caption-title'),
71
+ $desc = $previewImage.find('.foogallery-caption-desc'),
72
+ caption_content = $('input[name="foogallery_settings[image-viewer_caption-content]"]:checked').val();
73
+
74
+ $caption.add($title).add($desc).show();
75
+ switch(caption_content){
76
+ case 'title':
77
+ $desc.hide();
78
+ break;
79
+ case 'desc':
80
+ $title.hide();
81
+ break;
82
+ case 'none':
83
+ $caption.hide();
84
+ break;
85
+ }
86
+ };
87
+
88
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady = function () {
89
+ $('body').on('foogallery-gallery-template-changed-image-viewer', function() {
90
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
91
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
92
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
93
+ });
94
+
95
+ var ps = 'input[name="foogallery_settings[image-viewer_hover-effect]"], ' +
96
+ 'input[name="foogallery_settings[image-viewer_hover-effect-type]"], ' +
97
+ 'input[name="foogallery_settings[image-viewer_theme]"], ' +
98
+ 'input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"], ' +
99
+ 'input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"], ' +
100
+ 'input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"], ' +
101
+ 'input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]';
102
+ $(ps).change(function() {
103
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
104
+ });
105
+
106
+ $('input[name="foogallery_settings[image-viewer_caption-content]"]').change(function() {
107
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
108
+ });
109
+
110
+ $('input[name="foogallery_settings[image-viewer_theme]"]').change(function() {
111
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
112
+ });
113
+
114
+ $('.foogallery-image-viewer-preview').on('click', function(e) {
115
+ e.preventDefault();
116
+ });
117
+ };
118
+
119
+ }(window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION = window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION || {}, jQuery));
120
+
121
+ jQuery(function () {
122
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady();
123
  });
extensions/default-templates/justified/class-justified-gallery-template.php CHANGED
@@ -1,353 +1,353 @@
1
- <?php
2
-
3
- if ( ! class_exists( 'FooGallery_Justified_Gallery_Template' ) ) {
4
-
5
- define( 'FOOGALLERY_JUSTIFIED_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ) );
6
-
7
- class FooGallery_Justified_Gallery_Template {
8
-
9
- const TEMPLATE_ID = 'justified';
10
-
11
- /**
12
- * Wire up everything we need to run the extension
13
- */
14
- function __construct() {
15
- // @formatter:off
16
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
17
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
18
- add_filter( 'foogallery_template_thumbnail_dimensions-justified', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
19
-
20
- // add the data options needed for justified.
21
- add_filter( 'foogallery_build_container_data_options-justified', array( $this, 'add_justified_options' ), 10, 3 );
22
-
23
- // build up the thumb dimensions from some arguments.
24
- add_filter( 'foogallery_calculate_thumbnail_dimensions-justified', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
25
-
26
- // build up the arguments needed for rendering this template.
27
- add_filter( 'foogallery_gallery_template_arguments-justified', array( $this, 'build_gallery_template_arguments' ) );
28
-
29
- add_filter( 'foogallery_override_gallery_template_fields-justified', array( $this, 'adjust_default_field_values' ), 10, 2 );
30
-
31
- // add a style block for the gallery based on the field settings.
32
- add_action( 'foogallery_loaded_template_before', array( $this, 'add_style_block' ), 10, 1 );
33
- // @formatter:on
34
- }
35
-
36
- /**
37
- * Add a style block based on the field settings
38
- *
39
- * @param $gallery FooGallery
40
- */
41
- function add_style_block( $gallery ) {
42
- if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
43
- return;
44
- }
45
-
46
- $id = $gallery->container_id();
47
- $margins = intval( foogallery_gallery_template_setting( 'margins', 2 ) );
48
- $row_height = intval( foogallery_gallery_template_setting( 'row_height', 250 ) );
49
-
50
- // @formatter:off
51
- ?>
52
- <style>
53
- #<?php echo $id; ?>.fg-justified .fg-item {
54
- margin-right: <?php echo $margins; ?>px;
55
- margin-bottom: <?php echo $margins; ?>px;
56
- }
57
-
58
- #<?php echo $id; ?>.fg-justified .fg-image {
59
- height: <?php echo $row_height; ?>px;
60
- }
61
- </style>
62
- <?php
63
- // @formatter:on
64
- }
65
-
66
- /**
67
- * Register myself so that all associated JS and CSS files can be found and automatically included
68
- *
69
- * @param array $extensions
70
- *
71
- * @return array
72
- */
73
- public function register_myself( $extensions ) {
74
- $extensions[] = __FILE__;
75
-
76
- return $extensions;
77
- }
78
-
79
- /**
80
- * Add our gallery template to the list of templates available for every gallery
81
- *
82
- * @param array $gallery_templates The array of gallery templates.
83
- *
84
- * @return array
85
- */
86
- public function add_template( $gallery_templates ) {
87
- $gallery_templates[] = array(
88
- 'slug' => self::TEMPLATE_ID,
89
- 'name' => __( 'Justified Gallery', 'foogallery' ),
90
- 'preview_support' => true,
91
- 'common_fields_support' => true,
92
- 'lazyload_support' => true,
93
- 'paging_support' => true,
94
- 'mandatory_classes' => 'fg-justified',
95
- 'thumbnail_dimensions' => true,
96
- 'filtering_support' => true,
97
- 'enqueue_core' => true,
98
- 'fields' => array(
99
- array(
100
- 'id' => 'row_height',
101
- 'title' => __( 'Row Height', 'foogallery' ),
102
- 'desc' => __( 'The preferred height of your gallery rows. Depending on the aspect ratio of your images and the viewport, the row height might increase up to Max Row Height.', 'foogallery' ),
103
- 'section' => __( 'General', 'foogallery' ),
104
- 'type' => 'number',
105
- 'class' => 'small-text',
106
- 'default' => 200,
107
- 'step' => '10',
108
- 'min' => '0',
109
- 'row_data' => array(
110
- 'data-foogallery-change-selector' => 'input',
111
- 'data-foogallery-value-selector' => 'input',
112
- 'data-foogallery-preview' => 'shortcode',
113
- ),
114
- ),
115
- array(
116
- 'id' => 'thumb_height',
117
- 'title' => __( 'Max Row Height', 'foogallery' ),
118
- 'desc' => __( 'Choose the max height of your gallery rows. It should always be larger than Row Height by about 150%.', 'foogallery' ),
119
- 'section' => __( 'General', 'foogallery' ),
120
- 'type' => 'number',
121
- 'class' => 'small-text',
122
- 'default' => 300,
123
- 'step' => '10',
124
- 'min' => '0',
125
- 'row_data' => array(
126
- 'data-foogallery-preview' => 'shortcode',
127
- 'data-foogallery-change-selector' => 'input',
128
- ),
129
- ),
130
- array(
131
- 'id' => 'margins',
132
- 'title' => __( 'Margins', 'foogallery' ),
133
- 'desc' => __( 'The spacing between your thumbnails.', 'foogallery' ),
134
- 'section' => __( 'General', 'foogallery' ),
135
- 'type' => 'number',
136
- 'class' => 'small-text',
137
- 'default' => 2,
138
- 'step' => '1',
139
- 'min' => '0',
140
- 'row_data' => array(
141
- 'data-foogallery-change-selector' => 'input',
142
- 'data-foogallery-value-selector' => 'input',
143
- 'data-foogallery-preview' => 'shortcode',
144
- ),
145
- ),
146
- array(
147
- 'id' => 'thumbnail_link',
148
- 'title' => __( 'Thumbnail Link', 'foogallery' ),
149
- 'section' => __( 'General', 'foogallery' ),
150
- 'default' => 'image',
151
- 'type' => 'thumb_link',
152
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything.', 'foogallery' ),
153
- ),
154
- array(
155
- 'id' => 'lightbox',
156
- 'title' => __( 'Lightbox', 'foogallery' ),
157
- 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
158
- 'section' => __( 'General', 'foogallery' ),
159
- 'default' => 'none',
160
- 'type' => 'lightbox',
161
- ),
162
- array(
163
- 'id' => 'align',
164
- 'title' => __( 'Alignment', 'foogallery' ),
165
- 'desc' => __( 'For rows that cannot be justified, what alignment should be used?', 'foogallery' ),
166
- 'section' => __( 'General', 'foogallery' ),
167
- 'type' => 'radio',
168
- 'spacer' => '<span class="spacer"></span>',
169
- 'default' => 'center',
170
- 'choices' => array(
171
- 'left' => __( 'Left', 'foogallery' ),
172
- 'center' => __( 'Center', 'foogallery' ),
173
- 'right' => __( 'Right', 'foogallery' ),
174
- ),
175
- 'row_data' => array(
176
- 'data-foogallery-change-selector' => 'input:radio',
177
- 'data-foogallery-value-selector' => 'input:checked',
178
- 'data-foogallery-preview' => 'shortcode',
179
- ),
180
- ),
181
- array(
182
- 'id' => 'last-row',
183
- 'title' => __( 'Last Row', 'foogallery' ),
184
- 'desc' => __( 'Decide what happens to the last row, when there are not enough images to full it completely.', 'foogallery' ),
185
- 'section' => __( 'General', 'foogallery' ),
186
- 'type' => 'radio',
187
- 'default' => 'smart',
188
- 'choices' => array(
189
- 'smart' => __( 'Default - the last row is justified and aligned, but adheres to the max row height and also compares itself to the average height of all rows.', 'foogallery' ),
190
- 'justify' => __( 'Justify - the last row is forced to be justified, ignoring the max row height. This can enlarge images to very large sizes in some scenarios.', 'foogallery' ),
191
- 'hide' => __( 'Hide - the last row is hidden if it does not fill the entire row.', 'foogallery' ),
192
- ),
193
- 'row_data' => array(
194
- 'data-foogallery-change-selector' => 'input:radio',
195
- 'data-foogallery-value-selector' => 'input:checked',
196
- 'data-foogallery-preview' => 'shortcode',
197
- ),
198
- ),
199
- ),
200
- );
201
-
202
- return $gallery_templates;
203
- }
204
-
205
- /**
206
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
207
- *
208
- * @param array $dimensions
209
- * @param FooGallery $foogallery
210
- *
211
- * @return mixed
212
- */
213
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
214
- return array(
215
- 'height' => $this->max_row_height_from_current_gallery(),
216
- 'width' => 0,
217
- 'crop' => false,
218
- );
219
- }
220
-
221
- /**
222
- * Add the required justified options if needed
223
- *
224
- * @param $options
225
- * @param $gallery FooGallery
226
- *
227
- * @param $attributes array
228
- *
229
- * @return array
230
- */
231
- function add_justified_options( $options, $gallery, $attributes ) {
232
- $this->calculate_row_heights_for_current_gallery();
233
-
234
- $values = foogallery_current_gallery_get_cached_value( 'justified_row_height' );
235
-
236
- $margins = foogallery_gallery_template_setting( 'margins', '1' );
237
- $align = foogallery_gallery_template_setting( 'align', 'center' );
238
- $last_row = foogallery_gallery_template_setting( 'last-row', 'smart' );
239
-
240
- $options['template']['rowHeight'] = intval( $values['row_height'] );
241
- $options['template']['maxRowHeight'] = intval( $values['max_row_height'] );
242
- $options['template']['margins'] = intval( $margins );
243
- $options['template']['align'] = $align;
244
- $options['template']['lastRow'] = $last_row;
245
-
246
- return $options;
247
- }
248
-
249
- /**
250
- * Calculates the row heights for the current gallery, also taking into account legacy settings
251
- */
252
- function calculate_row_heights_for_current_gallery() {
253
- if ( ! foogallery_current_gallery_has_cached_value( 'justified_row_height' ) ) {
254
- $row_height = foogallery_gallery_template_setting( 'row_height', '200' );
255
-
256
- //check to see if there is a legacy max_row_height
257
- $max_row_height = foogallery_gallery_template_setting( 'max_row_height', false );
258
-
259
- if ( false === $max_row_height ) {
260
- //we do not have a legacy max_row_height, so use the thumb_height
261
- $max_row_height = intval( foogallery_gallery_template_setting( 'thumb_height', '300' ) );
262
- } else {
263
- if ( strpos( $max_row_height, '%' ) === false ) {
264
- $max_row_height = intval( $max_row_height );
265
- } else {
266
- $max_row_height = intval( $row_height * intval( $max_row_height ) / 100 );
267
- }
268
- }
269
-
270
- //check for a negative max_row_height
271
- if ( $max_row_height < 0 ) {
272
- $max_row_height = $row_height * 2;
273
- }
274
-
275
- foogallery_current_gallery_set_cached_value( 'justified_row_height', array(
276
- 'row_height' => intval( $row_height ),
277
- 'max_row_height' => $max_row_height,
278
- ) );
279
- }
280
- }
281
-
282
- /**
283
- * Builds thumb dimensions from arguments
284
- *
285
- * @param array $dimensions
286
- * @param array $arguments
287
- *
288
- * @return mixed
289
- */
290
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
291
- return array(
292
- 'height' => $this->max_row_height_from_current_gallery(),
293
- 'width' => 0,
294
- 'crop' => false,
295
- );
296
- }
297
-
298
- /**
299
- * Returns the max_row_height for the current gallery
300
- *
301
- * @return int
302
- */
303
- function max_row_height_from_current_gallery() {
304
- $this->calculate_row_heights_for_current_gallery();
305
- $values = foogallery_current_gallery_get_cached_value( 'justified_row_height' );
306
-
307
- return intval( $values['max_row_height'] );
308
- }
309
-
310
- /**
311
- * Build up the arguments needed for rendering this gallery template
312
- *
313
- * @param $args
314
- *
315
- * @return array
316
- */
317
- function build_gallery_template_arguments( $args ) {
318
- $args = array(
319
- 'height' => $this->max_row_height_from_current_gallery(),
320
- 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
321
- 'crop' => false,
322
- );
323
-
324
- return $args;
325
- }
326
-
327
- /**
328
- * Adjust the default values for the justified template
329
- *
330
- * @param $fields
331
- * @param $template
332
- *
333
- * @return array
334
- * @uses "foogallery_override_gallery_template_fields"
335
- */
336
- function adjust_default_field_values( $fields, $template ) {
337
- //update specific fields
338
- foreach ( $fields as &$field ) {
339
- if ( 'border_size' === $field['id'] ) {
340
- $field['default'] = '';
341
- } else if ( 'hover_effect_caption_visibility' == $field['id'] ) {
342
- $field['default'] = 'fg-caption-always';
343
- } else if ( 'hover_effect_icon' == $field['id'] ) {
344
- $field['default'] = 'fg-hover-zoom2';
345
- } else if ( 'caption_desc_source' == $field['id'] ) {
346
- $field['default'] = 'none';
347
- }
348
- }
349
-
350
- return $fields;
351
- }
352
- }
353
  }
1
+ <?php
2
+
3
+ if ( ! class_exists( 'FooGallery_Justified_Gallery_Template' ) ) {
4
+
5
+ define( 'FOOGALLERY_JUSTIFIED_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ) );
6
+
7
+ class FooGallery_Justified_Gallery_Template {
8
+
9
+ const TEMPLATE_ID = 'justified';
10
+
11
+ /**
12
+ * Wire up everything we need to run the extension
13
+ */
14
+ function __construct() {
15
+ // @formatter:off
16
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
17
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
18
+ add_filter( 'foogallery_template_thumbnail_dimensions-justified', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
19
+
20
+ // add the data options needed for justified.
21
+ add_filter( 'foogallery_build_container_data_options-justified', array( $this, 'add_justified_options' ), 10, 3 );
22
+
23
+ // build up the thumb dimensions from some arguments.
24
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-justified', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
25
+
26
+ // build up the arguments needed for rendering this template.
27
+ add_filter( 'foogallery_gallery_template_arguments-justified', array( $this, 'build_gallery_template_arguments' ) );
28
+
29
+ add_filter( 'foogallery_override_gallery_template_fields-justified', array( $this, 'adjust_default_field_values' ), 10, 2 );
30
+
31
+ // add a style block for the gallery based on the field settings.
32
+ add_action( 'foogallery_loaded_template_before', array( $this, 'add_style_block' ), 10, 1 );
33
+ // @formatter:on
34
+ }
35
+
36
+ /**
37
+ * Add a style block based on the field settings
38
+ *
39
+ * @param $gallery FooGallery
40
+ */
41
+ function add_style_block( $gallery ) {
42
+ if ( self::TEMPLATE_ID !== $gallery->gallery_template ) {
43
+ return;
44
+ }
45
+
46
+ $id = $gallery->container_id();
47
+ $margins = intval( foogallery_gallery_template_setting( 'margins', 2 ) );
48
+ $row_height = intval( foogallery_gallery_template_setting( 'row_height', 250 ) );
49
+
50
+ // @formatter:off
51
+ ?>
52
+ <style>
53
+ #<?php echo $id; ?>.fg-justified .fg-item {
54
+ margin-right: <?php echo $margins; ?>px;
55
+ margin-bottom: <?php echo $margins; ?>px;
56
+ }
57
+
58
+ #<?php echo $id; ?>.fg-justified .fg-image {
59
+ height: <?php echo $row_height; ?>px;
60
+ }
61
+ </style>
62
+ <?php
63
+ // @formatter:on
64
+ }
65
+
66
+ /**
67
+ * Register myself so that all associated JS and CSS files can be found and automatically included
68
+ *
69
+ * @param array $extensions
70
+ *
71
+ * @return array
72
+ */
73
+ public function register_myself( $extensions ) {
74
+ $extensions[] = __FILE__;
75
+
76
+ return $extensions;
77
+ }
78
+
79
+ /**
80
+ * Add our gallery template to the list of templates available for every gallery
81
+ *
82
+ * @param array $gallery_templates The array of gallery templates.
83
+ *
84
+ * @return array
85
+ */
86
+ public function add_template( $gallery_templates ) {
87
+ $gallery_templates[] = array(
88
+ 'slug' => self::TEMPLATE_ID,
89
+ 'name' => __( 'Justified Gallery', 'foogallery' ),
90
+ 'preview_support' => true,
91
+ 'common_fields_support' => true,
92
+ 'lazyload_support' => true,
93
+ 'paging_support' => true,
94
+ 'mandatory_classes' => 'fg-justified',
95
+ 'thumbnail_dimensions' => true,
96
+ 'filtering_support' => true,
97
+ 'enqueue_core' => true,
98
+ 'fields' => array(
99
+ array(
100
+ 'id' => 'row_height',
101
+ 'title' => __( 'Row Height', 'foogallery' ),
102
+ 'desc' => __( 'The preferred height of your gallery rows. Depending on the aspect ratio of your images and the viewport, the row height might increase up to Max Row Height.', 'foogallery' ),
103
+ 'section' => __( 'General', 'foogallery' ),
104
+ 'type' => 'number',
105
+ 'class' => 'small-text',
106
+ 'default' => 200,
107
+ 'step' => '10',
108
+ 'min' => '0',
109
+ 'row_data' => array(
110
+ 'data-foogallery-change-selector' => 'input',
111
+ 'data-foogallery-value-selector' => 'input',
112
+ 'data-foogallery-preview' => 'shortcode',
113
+ ),
114
+ ),
115
+ array(
116
+ 'id' => 'thumb_height',
117
+ 'title' => __( 'Max Row Height', 'foogallery' ),
118
+ 'desc' => __( 'Choose the max height of your gallery rows. It should always be larger than Row Height by about 150%.', 'foogallery' ),
119
+ 'section' => __( 'General', 'foogallery' ),
120
+ 'type' => 'number',
121
+ 'class' => 'small-text',
122
+ 'default' => 300,
123
+ 'step' => '10',
124
+ 'min' => '0',
125
+ 'row_data' => array(
126
+ 'data-foogallery-preview' => 'shortcode',
127
+ 'data-foogallery-change-selector' => 'input',
128
+ ),
129
+ ),
130
+ array(
131
+ 'id' => 'margins',
132
+ 'title' => __( 'Margins', 'foogallery' ),
133
+ 'desc' => __( 'The spacing between your thumbnails.', 'foogallery' ),
134
+ 'section' => __( 'General', 'foogallery' ),
135
+ 'type' => 'number',
136
+ 'class' => 'small-text',
137
+ 'default' => 2,
138
+ 'step' => '1',
139
+ 'min' => '0',
140
+ 'row_data' => array(
141
+ 'data-foogallery-change-selector' => 'input',
142
+ 'data-foogallery-value-selector' => 'input',
143
+ 'data-foogallery-preview' => 'shortcode',
144
+ ),
145
+ ),
146
+ array(
147
+ 'id' => 'thumbnail_link',
148
+ 'title' => __( 'Thumbnail Link', 'foogallery' ),
149
+ 'section' => __( 'General', 'foogallery' ),
150
+ 'default' => 'image',
151
+ 'type' => 'thumb_link',
152
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything.', 'foogallery' ),
153
+ ),
154
+ array(
155
+ 'id' => 'lightbox',
156
+ 'title' => __( 'Lightbox', 'foogallery' ),
157
+ 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
158
+ 'section' => __( 'General', 'foogallery' ),
159
+ 'default' => 'none',
160
+ 'type' => 'lightbox',
161
+ ),
162
+ array(
163
+ 'id' => 'align',
164
+ 'title' => __( 'Alignment', 'foogallery' ),
165
+ 'desc' => __( 'For rows that cannot be justified, what alignment should be used?', 'foogallery' ),
166
+ 'section' => __( 'General', 'foogallery' ),
167
+ 'type' => 'radio',
168
+ 'spacer' => '<span class="spacer"></span>',
169
+ 'default' => 'center',
170
+ 'choices' => array(
171
+ 'left' => __( 'Left', 'foogallery' ),
172
+ 'center' => __( 'Center', 'foogallery' ),
173
+ 'right' => __( 'Right', 'foogallery' ),
174
+ ),
175
+ 'row_data' => array(
176
+ 'data-foogallery-change-selector' => 'input:radio',
177
+ 'data-foogallery-value-selector' => 'input:checked',
178
+ 'data-foogallery-preview' => 'shortcode',
179
+ ),
180
+ ),
181
+ array(
182
+ 'id' => 'last-row',
183
+ 'title' => __( 'Last Row', 'foogallery' ),
184
+ 'desc' => __( 'Decide what happens to the last row, when there are not enough images to full it completely.', 'foogallery' ),
185
+ 'section' => __( 'General', 'foogallery' ),
186
+ 'type' => 'radio',
187
+ 'default' => 'smart',
188
+ 'choices' => array(
189
+ 'smart' => __( 'Default - the last row is justified and aligned, but adheres to the max row height and also compares itself to the average height of all rows.', 'foogallery' ),
190
+ 'justify' => __( 'Justify - the last row is forced to be justified, ignoring the max row height. This can enlarge images to very large sizes in some scenarios.', 'foogallery' ),
191
+ 'hide' => __( 'Hide - the last row is hidden if it does not fill the entire row.', 'foogallery' ),
192
+ ),
193
+ 'row_data' => array(
194
+ 'data-foogallery-change-selector' => 'input:radio',
195
+ 'data-foogallery-value-selector' => 'input:checked',
196
+ 'data-foogallery-preview' => 'shortcode',
197
+ ),
198
+ ),
199
+ ),
200
+ );
201
+
202
+ return $gallery_templates;
203
+ }
204
+
205
+ /**
206
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
207
+ *
208
+ * @param array $dimensions
209
+ * @param FooGallery $foogallery
210
+ *
211
+ * @return mixed
212
+ */
213
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
214
+ return array(
215
+ 'height' => $this->max_row_height_from_current_gallery(),
216
+ 'width' => 0,
217
+ 'crop' => false,
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Add the required justified options if needed
223
+ *
224
+ * @param $options
225
+ * @param $gallery FooGallery
226
+ *
227
+ * @param $attributes array
228
+ *
229
+ * @return array
230
+ */
231
+ function add_justified_options( $options, $gallery, $attributes ) {
232
+ $this->calculate_row_heights_for_current_gallery();
233
+
234
+ $values = foogallery_current_gallery_get_cached_value( 'justified_row_height' );
235
+
236
+ $margins = foogallery_gallery_template_setting( 'margins', '1' );
237
+ $align = foogallery_gallery_template_setting( 'align', 'center' );
238
+ $last_row = foogallery_gallery_template_setting( 'last-row', 'smart' );
239
+
240
+ $options['template']['rowHeight'] = intval( $values['row_height'] );
241
+ $options['template']['maxRowHeight'] = intval( $values['max_row_height'] );
242
+ $options['template']['margins'] = intval( $margins );
243
+ $options['template']['align'] = $align;
244
+ $options['template']['lastRow'] = $last_row;
245
+
246
+ return $options;
247
+ }
248
+
249
+ /**
250
+ * Calculates the row heights for the current gallery, also taking into account legacy settings
251
+ */
252
+ function calculate_row_heights_for_current_gallery() {
253
+ if ( ! foogallery_current_gallery_has_cached_value( 'justified_row_height' ) ) {
254
+ $row_height = foogallery_gallery_template_setting( 'row_height', '200' );
255
+
256
+ //check to see if there is a legacy max_row_height
257
+ $max_row_height = foogallery_gallery_template_setting( 'max_row_height', false );
258
+
259
+ if ( false === $max_row_height ) {
260
+ //we do not have a legacy max_row_height, so use the thumb_height
261
+ $max_row_height = intval( foogallery_gallery_template_setting( 'thumb_height', '300' ) );
262
+ } else {
263
+ if ( strpos( $max_row_height, '%' ) === false ) {
264
+ $max_row_height = intval( $max_row_height );
265
+ } else {
266
+ $max_row_height = intval( $row_height * intval( $max_row_height ) / 100 );
267
+ }
268
+ }
269
+
270
+ //check for a negative max_row_height
271
+ if ( $max_row_height < 0 ) {
272
+ $max_row_height = $row_height * 2;
273
+ }
274
+
275
+ foogallery_current_gallery_set_cached_value( 'justified_row_height', array(
276
+ 'row_height' => intval( $row_height ),
277
+ 'max_row_height' => $max_row_height,
278
+ ) );
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Builds thumb dimensions from arguments
284
+ *
285
+ * @param array $dimensions
286
+ * @param array $arguments
287
+ *
288
+ * @return mixed
289
+ */
290
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
291
+ return array(
292
+ 'height' => $this->max_row_height_from_current_gallery(),
293
+ 'width' => 0,
294
+ 'crop' => false,
295
+ );
296
+ }
297
+
298
+ /**
299
+ * Returns the max_row_height for the current gallery
300
+ *
301
+ * @return int
302
+ */
303
+ function max_row_height_from_current_gallery() {
304
+ $this->calculate_row_heights_for_current_gallery();
305
+ $values = foogallery_current_gallery_get_cached_value( 'justified_row_height' );
306
+
307
+ return intval( $values['max_row_height'] );
308
+ }
309
+
310
+ /**
311
+ * Build up the arguments needed for rendering this gallery template
312
+ *
313
+ * @param $args
314
+ *
315
+ * @return array
316
+ */
317
+ function build_gallery_template_arguments( $args ) {
318
+ $args = array(
319
+ 'height' => $this->max_row_height_from_current_gallery(),
320
+ 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
321
+ 'crop' => false,
322
+ );
323
+
324
+ return $args;
325
+ }
326
+
327
+ /**
328
+ * Adjust the default values for the justified template
329
+ *
330
+ * @param $fields
331
+ * @param $template
332
+ *
333
+ * @return array
334
+ * @uses "foogallery_override_gallery_template_fields"
335
+ */
336
+ function adjust_default_field_values( $fields, $template ) {
337
+ //update specific fields
338
+ foreach ( $fields as &$field ) {
339
+ if ( 'border_size' === $field['id'] ) {
340
+ $field['default'] = '';
341
+ } else if ( 'hover_effect_caption_visibility' == $field['id'] ) {
342
+ $field['default'] = 'fg-caption-always';
343
+ } else if ( 'hover_effect_icon' == $field['id'] ) {
344
+ $field['default'] = 'fg-hover-zoom2';
345
+ } else if ( 'caption_desc_source' == $field['id'] ) {
346
+ $field['default'] = 'none';
347
+ }
348
+ }
349
+
350
+ return $fields;
351
+ }
352
+ }
353
  }
extensions/default-templates/justified/gallery-justified.php CHANGED
@@ -1,15 +1,15 @@
1
- <?php
2
- /**
3
- * FooGallery Justified gallery template
4
- */
5
- global $current_foogallery;
6
- global $current_foogallery_arguments;
7
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
- $foogallery_justified_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox );
9
- $foogallery_justified_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_justified_classes) );
10
- ?>
11
- <div <?php echo $foogallery_justified_attributes; ?>>
12
- <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
13
- echo foogallery_attachment_html( $attachment );
14
- } ?>
15
- </div>
1
+ <?php
2
+ /**
3
+ * FooGallery Justified gallery template
4
+ */
5
+ global $current_foogallery;
6
+ global $current_foogallery_arguments;
7
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
+ $foogallery_justified_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox );
9
+ $foogallery_justified_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_justified_classes) );
10
+ ?>
11
+ <div <?php echo $foogallery_justified_attributes; ?>>
12
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
13
+ echo foogallery_attachment_html( $attachment );
14
+ } ?>
15
+ </div>
extensions/default-templates/masonry/class-masonry-gallery-template.php CHANGED
@@ -1,407 +1,407 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Masonry_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_MASONRY_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Masonry_Gallery_Template {
8
-
9
- const template_id = 'masonry';
10
-
11
- /**
12
- * Wire up everything we need to run the extension
13
- */
14
- function __construct() {
15
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
16
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
17
-
18
- add_action( 'foogallery_enqueue_preview_dependencies', array( $this, 'enqueue_preview_dependencies' ) );
19
-
20
- add_filter( 'foogallery_located_template-masonry', array( $this, 'enqueue_dependencies' ) );
21
-
22
- add_filter( 'foogallery_template_thumbnail_dimensions-masonry', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
23
-
24
- //add the data options needed for masonry
25
- add_filter( 'foogallery_build_container_data_options-masonry', array( $this, 'add_masonry_options' ), 10, 3 );
26
-
27
- //build up the thumb dimensions from some arguments
28
- add_filter( 'foogallery_calculate_thumbnail_dimensions-masonry', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
-
30
- //build up the arguments needed for rendering this template
31
- add_filter( 'foogallery_gallery_template_arguments-masonry', array( $this, 'build_gallery_template_arguments' ) );
32
-
33
- //add extra fields to the templates
34
- add_filter( 'foogallery_override_gallery_template_fields-masonry', array( $this, 'add_masonry_fields' ), 10, 2 );
35
-
36
- //remove the captions if the captions are below thumbs
37
- add_filter( 'foogallery_build_attachment_html_caption', array( $this, 'remove_captions' ), 10, 3 );
38
-
39
- //add a style block for the gallery based on the field settings
40
- add_action( 'foogallery_loaded_template_before', array( $this, 'add_style_block' ), 10, 1 );
41
-
42
- add_filter( 'foogallery_build_class_attribute', array( $this, 'override_class_attributes' ), 99, 2 );
43
- }
44
-
45
- /**
46
- * Override the classes for the layout
47
- *
48
- * @param $classes array
49
- * @param $gallery FooGallery
50
- *
51
- * @return array
52
- */
53
- function override_class_attributes( $classes, $gallery ) {
54
- if ( self::template_id === $gallery->gallery_template ) {
55
- $classes[] = 'fg-' . foogallery_gallery_template_setting( 'layout', 'fixed' );
56
- }
57
-
58
- return $classes;
59
- }
60
-
61
- /**
62
- * Add a style block based on the field settings
63
- *
64
- * @param $gallery FooGallery
65
- */
66
- function add_style_block( $gallery ) {
67
- if ( self::template_id !== $gallery->gallery_template ) {
68
- return;
69
- }
70
-
71
- $id = $gallery->container_id();
72
- $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
73
-
74
- //get out early if the layout is not fixed
75
- if ( 'fixed' !== $layout ) {
76
- return;
77
- }
78
-
79
- $thumbnail_width = intval( foogallery_gallery_template_setting( 'thumbnail_width', 250 ) );
80
- $gutter_width = intval( foogallery_gallery_template_setting( 'gutter_width', 10 ) );
81
-
82
- ?>
83
- <style>
84
- #<?php echo $id; ?>.fg-masonry .fg-item {
85
- width: <?php echo $thumbnail_width; ?>px;
86
- margin-right: <?php echo $gutter_width; ?>px;
87
- margin-bottom: <?php echo $gutter_width; ?>px;
88
- }
89
- </style>
90
- <?php
91
- }
92
-
93
-
94
- /**
95
- * Register myself so that all associated JS and CSS files can be found and automatically included
96
- * @param $extensions
97
- *
98
- * @return array
99
- */
100
- function register_myself( $extensions ) {
101
- $extensions[] = __FILE__;
102
- return $extensions;
103
- }
104
-
105
- /**
106
- * Add our gallery template to the list of templates available for every gallery
107
- * @param $gallery_templates
108
- *
109
- * @return array
110
- */
111
- function add_template( $gallery_templates ) {
112
- $gallery_templates[] = array(
113
- 'slug' => self::template_id,
114
- 'name' => __( 'Masonry Image Gallery', 'foogallery' ),
115
- 'preview_support' => true,
116
- 'common_fields_support' => true,
117
- 'lazyload_support' => true,
118
- 'paging_support' => true,
119
- 'mandatory_classes' => 'fg-masonry',
120
- 'thumbnail_dimensions' => true,
121
- 'filtering_support' => true,
122
- 'fields' => array(
123
- array(
124
- 'id' => 'thumbnail_width',
125
- 'title' => __( 'Thumb Width', 'foogallery' ),
126
- 'desc' => __( 'Choose the width of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
127
- 'section' => __( 'General', 'foogallery' ),
128
- 'type' => 'number',
129
- 'class' => 'small-text',
130
- 'default' => 250,
131
- 'step' => '1',
132
- 'min' => '0',
133
- 'row_data'=> array(
134
- 'data-foogallery-change-selector' => 'input',
135
- 'data-foogallery-preview' => 'shortcode'
136
- )
137
- ),
138
- array(
139
- 'id' => 'layout',
140
- 'title' => __( 'Masonry Layout', 'foogallery' ),
141
- 'desc' => __( 'Choose a fixed width thumb layout, or responsive columns.', 'foogallery' ),
142
- 'section' => __( 'General', 'foogallery' ),
143
- 'type' => 'radio',
144
- 'choices' => array(
145
- 'fixed' => __( 'Fixed Width', 'foogallery' ),
146
- 'col6' => __( '6 Columns', 'foogallery' ),
147
- 'col5' => __( '5 Columns', 'foogallery' ),
148
- 'col4' => __( '4 Columns', 'foogallery' ),
149
- 'col3' => __( '3 Columns', 'foogallery' ),
150
- 'col2' => __( '2 Columns', 'foogallery' ),
151
- ),
152
- 'default' => 'fixed',
153
- 'row_data'=> array(
154
- 'data-foogallery-change-selector' => 'input:radio',
155
- 'data-foogallery-value-selector' => 'input:checked',
156
- 'data-foogallery-preview' => 'shortcode'
157
- )
158
- ),
159
- array(
160
- 'id' => 'horizontal',
161
- 'title' => __( 'Horizontal Layout', 'foogallery' ),
162
- 'desc' => __( 'You can choose to lay out items to (mostly) maintain horizontal left-to-right order.', 'foogallery' ),
163
- 'section' => __( 'General', 'foogallery' ),
164
- 'type' => 'radio',
165
- 'choices' => array(
166
- '' => __( 'Disabled', 'foogallery' ),
167
- 'yes' => __( 'Try to maintain lef-to-right order', 'foogallery' ),
168
- ),
169
- 'default' => '',
170
- 'row_data'=> array(
171
- 'data-foogallery-change-selector' => 'input:radio',
172
- 'data-foogallery-value-selector' => 'input:checked',
173
- 'data-foogallery-preview' => 'shortcode'
174
- )
175
- ),
176
- array(
177
- 'id' => 'gutter_width',
178
- 'title' => __( 'Gutter Width', 'foogallery' ),
179
- 'desc' => __( 'The spacing between your thumbnails. Only applicable when using a fixed layout!', 'foogallery' ),
180
- 'section' => __( 'General', 'foogallery' ),
181
- 'type' => 'number',
182
- 'class' => 'small-text',
183
- 'default' => 10,
184
- 'step' => '1',
185
- 'min' => '0',
186
- 'row_data'=> array(
187
- 'data-foogallery-hidden' => true,
188
- 'data-foogallery-change-selector' => 'input',
189
- 'data-foogallery-value-selector' => 'input',
190
- 'data-foogallery-show-when-field' => 'layout',
191
- 'data-foogallery-show-when-field-value' => 'fixed',
192
- 'data-foogallery-preview' => 'shortcode',
193
- )
194
- ),
195
- array(
196
- 'id' => 'gutter_percent',
197
- 'title' => __( 'Gutter Size', 'foogallery' ),
198
- 'desc' => __( 'Choose a gutter size when using responsive columns.', 'foogallery' ),
199
- 'section' => __( 'General', 'foogallery' ),
200
- 'type' => 'radio',
201
- 'choices' => array(
202
- 'fg-gutter-none' => __( 'No Gutter', 'foogallery' ),
203
- '' => __( 'Normal Size Gutter', 'foogallery' ),
204
- 'fg-gutter-large' => __( 'Larger Gutter', 'foogallery' )
205
- ),
206
- 'default' => '',
207
- 'row_data'=> array(
208
- 'data-foogallery-hidden' => true,
209
- 'data-foogallery-change-selector' => 'input:radio',
210
- 'data-foogallery-value-selector' => 'input:checked',
211
- 'data-foogallery-show-when-field' => 'layout',
212
- 'data-foogallery-show-when-field-operator' => '!==',
213
- 'data-foogallery-show-when-field-value' => 'fixed',
214
- 'data-foogallery-preview' => 'shortcode'
215
- )
216
- ),
217
- array(
218
- 'id' => 'alignment',
219
- 'title' => __( 'Alignment', 'foogallery' ),
220
- 'desc' => __( 'You can choose to center align your images or leave them at the default (left). Only applicable when using a fixed layout!', 'foogallery' ),
221
- 'section' => __( 'General', 'foogallery' ),
222
- 'type' => 'radio',
223
- 'spacer' => '<span class="spacer"></span>',
224
- 'choices' => array(
225
- '' => __( 'Left', 'foogallery' ),
226
- 'fg-center' => __( 'Center', 'foogallery' )
227
- ),
228
- 'default' => 'fg-center',
229
- 'row_data'=> array(
230
- 'data-foogallery-hidden' => true,
231
- 'data-foogallery-show-when-field' => 'layout',
232
- 'data-foogallery-show-when-field-value' => 'fixed',
233
- 'data-foogallery-change-selector' => 'input:radio',
234
- 'data-foogallery-preview' => 'shortcode'
235
- )
236
- ),
237
- array(
238
- 'id' => 'thumbnail_link',
239
- 'title' => __( 'Thumbnail Link', 'foogallery' ),
240
- 'default' => 'image' ,
241
- 'type' => 'thumb_link',
242
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything', 'foogallery' ),
243
- ),
244
- array(
245
- 'id' => 'lightbox',
246
- 'title' => __( 'Lightbox', 'foogallery' ),
247
- 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image"', 'foogallery' ),
248
- 'type' => 'lightbox',
249
- 'default' => 'none',
250
- ),
251
- ),
252
- );
253
-
254
-
255
- return $gallery_templates;
256
- }
257
-
258
- /**
259
- * Enqueue scripts that the masonry gallery template relies on
260
- */
261
- function enqueue_preview_dependencies() {
262
- wp_enqueue_script( 'masonry' );
263
- }
264
-
265
- /**
266
- * Enqueue scripts that the masonry gallery template relies on
267
- */
268
- function enqueue_dependencies() {
269
- wp_enqueue_script( 'masonry' );
270
-
271
- //enqueue core files
272
- foogallery_enqueue_core_gallery_template_style();
273
- foogallery_enqueue_core_gallery_template_script( array('jquery', 'masonry' ) );
274
- }
275
-
276
- /**
277
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
278
- *
279
- * @param array $dimensions
280
- * @param FooGallery $foogallery
281
- *
282
- * @return mixed
283
- */
284
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
285
- $width = $foogallery->get_meta( 'masonry_thumbnail_width', false );
286
- return array(
287
- 'height' => 0,
288
- 'width' => intval( $width ),
289
- 'crop' => false
290
- );
291
- }
292
-
293
- /**
294
- * Add the required masonry options if needed
295
- *
296
- * @param $options
297
- * @param $gallery FooGallery
298
- *
299
- * @param $attributes array
300
- *
301
- * @return array
302
- */
303
- function add_masonry_options($options, $gallery, $attributes) {
304
- $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
305
- if ( 'fixed' === $layout ) {
306
- $width = foogallery_gallery_template_setting( 'thumbnail_width', '250' );
307
- $gutter_width = foogallery_gallery_template_setting( 'gutter_width', '10' );
308
- $options['template']['columnWidth'] = intval($width);
309
- $options['template']['gutter'] = intval($gutter_width);
310
- }
311
- $horizontal = foogallery_gallery_template_setting( 'horizontal', '' );
312
- if ( 'yes' === $horizontal ) {
313
- $options['template']['horizontalOrder'] = true;
314
- }
315
- return $options;
316
- }
317
-
318
- /**
319
- * Builds thumb dimensions from arguments
320
- *
321
- * @param array $dimensions
322
- * @param array $arguments
323
- *
324
- * @return mixed
325
- */
326
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
327
- if ( array_key_exists( 'thumbnail_width', $arguments) ) {
328
- return array(
329
- 'height' => 0,
330
- 'width' => intval($arguments['thumbnail_width']),
331
- 'crop' => false
332
- );
333
- }
334
- return null;
335
- }
336
-
337
- /**
338
- * Build up the arguments needed for rendering this gallery template
339
- *
340
- * @param $args
341
- * @return array
342
- */
343
- function build_gallery_template_arguments( $args ) {
344
- $args = array(
345
- 'width' => foogallery_gallery_template_setting( 'thumbnail_width', '250' ),
346
- 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
347
- 'crop' => false
348
- );
349
-
350
- return $args;
351
- }
352
-
353
- /**
354
- * Add masonry-specific fields to the gallery template
355
- *
356
- * @uses "foogallery_override_gallery_template_fields"
357
- * @param $fields
358
- * @param $template
359
- *
360
- * @return array
361
- */
362
- function add_masonry_fields( $fields, $template ) {
363
- //update specific fields
364
- foreach ($fields as &$field) {
365
- if ( 'hover_effect_caption_visibility' === $field['id'] ) {
366
- //add a new choice for captions to show below the thumbs
367
- $field['choices']['fg-captions-bottom'] = __( 'Below Thumbnail', 'foogallery' );
368
- $field['default'] = 'fg-captions-bottom';
369
- } else if ( 'theme' === $field['id'] ) {
370
- $field['default'] = 'fg-dark';
371
- $field['choices'] = array(
372
- 'fg-light' => __( 'Light', 'foogallery' ),
373
- 'fg-dark' => __( 'Dark', 'foogallery' ),
374
- 'fg-transparent' => __( 'Transparent', 'foogallery' ),
375
- 'fg-custom' => __( 'Custom', 'foogallery' )
376
- );
377
- } else if ( 'drop_shadow' === $field['id'] ) {
378
- $field['default'] = 'fg-shadow-small';
379
- } else if ( 'hover_effect_icon' === $field['id'] ) {
380
- $field['default'] = 'fg-hover-plus';
381
- }
382
- }
383
-
384
- return $fields;
385
- }
386
-
387
- function remove_captions( $captions, $foogallery_attachment, $args ) {
388
- global $current_foogallery_template;
389
-
390
- //check if masonry
391
- if ( 'masonry' === $current_foogallery_template ) {
392
-
393
- $hover_effect_caption_visibility = foogallery_gallery_template_setting( 'hover_effect_caption_visibility', 'fg-caption-hover' );
394
-
395
- //check if captions are set to show below the thumbs
396
- if ( 'fg-captions-bottom' === $hover_effect_caption_visibility ) {
397
- //if we have no captions then do not output captions at all
398
- if ( !array_key_exists( 'title', $captions ) && !array_key_exists( 'desc', $captions ) ) {
399
- $captions = false;
400
- }
401
- }
402
- }
403
-
404
- return $captions;
405
- }
406
- }
407
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Masonry_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_MASONRY_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Masonry_Gallery_Template {
8
+
9
+ const template_id = 'masonry';
10
+
11
+ /**
12
+ * Wire up everything we need to run the extension
13
+ */
14
+ function __construct() {
15
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
16
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
17
+
18
+ add_action( 'foogallery_enqueue_preview_dependencies', array( $this, 'enqueue_preview_dependencies' ) );
19
+
20
+ add_filter( 'foogallery_located_template-masonry', array( $this, 'enqueue_dependencies' ) );
21
+
22
+ add_filter( 'foogallery_template_thumbnail_dimensions-masonry', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
23
+
24
+ //add the data options needed for masonry
25
+ add_filter( 'foogallery_build_container_data_options-masonry', array( $this, 'add_masonry_options' ), 10, 3 );
26
+
27
+ //build up the thumb dimensions from some arguments
28
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-masonry', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
+
30
+ //build up the arguments needed for rendering this template
31
+ add_filter( 'foogallery_gallery_template_arguments-masonry', array( $this, 'build_gallery_template_arguments' ) );
32
+
33
+ //add extra fields to the templates
34
+ add_filter( 'foogallery_override_gallery_template_fields-masonry', array( $this, 'add_masonry_fields' ), 10, 2 );
35
+
36
+ //remove the captions if the captions are below thumbs
37
+ add_filter( 'foogallery_build_attachment_html_caption', array( $this, 'remove_captions' ), 10, 3 );
38
+
39
+ //add a style block for the gallery based on the field settings
40
+ add_action( 'foogallery_loaded_template_before', array( $this, 'add_style_block' ), 10, 1 );
41
+
42
+ add_filter( 'foogallery_build_class_attribute', array( $this, 'override_class_attributes' ), 99, 2 );
43
+ }
44
+
45
+ /**
46
+ * Override the classes for the layout
47
+ *
48
+ * @param $classes array
49
+ * @param $gallery FooGallery
50
+ *
51
+ * @return array
52
+ */
53
+ function override_class_attributes( $classes, $gallery ) {
54
+ if ( self::template_id === $gallery->gallery_template ) {
55
+ $classes[] = 'fg-' . foogallery_gallery_template_setting( 'layout', 'fixed' );
56
+ }
57
+
58
+ return $classes;
59
+ }
60
+
61
+ /**
62
+ * Add a style block based on the field settings
63
+ *
64
+ * @param $gallery FooGallery
65
+ */
66
+ function add_style_block( $gallery ) {
67
+ if ( self::template_id !== $gallery->gallery_template ) {
68
+ return;
69
+ }
70
+
71
+ $id = $gallery->container_id();
72
+ $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
73
+
74
+ //get out early if the layout is not fixed
75
+ if ( 'fixed' !== $layout ) {
76
+ return;
77
+ }
78
+
79
+ $thumbnail_width = intval( foogallery_gallery_template_setting( 'thumbnail_width', 250 ) );
80
+ $gutter_width = intval( foogallery_gallery_template_setting( 'gutter_width', 10 ) );
81
+
82
+ ?>
83
+ <style>
84
+ #<?php echo $id; ?>.fg-masonry .fg-item {
85
+ width: <?php echo $thumbnail_width; ?>px;
86
+ margin-right: <?php echo $gutter_width; ?>px;
87
+ margin-bottom: <?php echo $gutter_width; ?>px;
88
+ }
89
+ </style>
90
+ <?php
91
+ }
92
+
93
+
94
+ /**
95
+ * Register myself so that all associated JS and CSS files can be found and automatically included
96
+ * @param $extensions
97
+ *
98
+ * @return array
99
+ */
100
+ function register_myself( $extensions ) {
101
+ $extensions[] = __FILE__;
102
+ return $extensions;
103
+ }
104
+
105
+ /**
106
+ * Add our gallery template to the list of templates available for every gallery
107
+ * @param $gallery_templates
108
+ *
109
+ * @return array
110
+ */
111
+ function add_template( $gallery_templates ) {
112
+ $gallery_templates[] = array(
113
+ 'slug' => self::template_id,
114
+ 'name' => __( 'Masonry Image Gallery', 'foogallery' ),
115
+ 'preview_support' => true,
116
+ 'common_fields_support' => true,
117
+ 'lazyload_support' => true,
118
+ 'paging_support' => true,
119
+ 'mandatory_classes' => 'fg-masonry',
120
+ 'thumbnail_dimensions' => true,
121
+ 'filtering_support' => true,
122
+ 'fields' => array(
123
+ array(
124
+ 'id' => 'thumbnail_width',
125
+ 'title' => __( 'Thumb Width', 'foogallery' ),
126
+ 'desc' => __( 'Choose the width of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
127
+ 'section' => __( 'General', 'foogallery' ),
128
+ 'type' => 'number',
129
+ 'class' => 'small-text',
130
+ 'default' => 250,
131
+ 'step' => '1',
132
+ 'min' => '0',
133
+ 'row_data'=> array(
134
+ 'data-foogallery-change-selector' => 'input',
135
+ 'data-foogallery-preview' => 'shortcode'
136
+ )
137
+ ),
138
+ array(
139
+ 'id' => 'layout',
140
+ 'title' => __( 'Masonry Layout', 'foogallery' ),
141
+ 'desc' => __( 'Choose a fixed width thumb layout, or responsive columns.', 'foogallery' ),
142
+ 'section' => __( 'General', 'foogallery' ),
143
+ 'type' => 'radio',
144
+ 'choices' => array(
145
+ 'fixed' => __( 'Fixed Width', 'foogallery' ),
146
+ 'col6' => __( '6 Columns', 'foogallery' ),
147
+ 'col5' => __( '5 Columns', 'foogallery' ),
148
+ 'col4' => __( '4 Columns', 'foogallery' ),
149
+ 'col3' => __( '3 Columns', 'foogallery' ),
150
+ 'col2' => __( '2 Columns', 'foogallery' ),
151
+ ),
152
+ 'default' => 'fixed',
153
+ 'row_data'=> array(
154
+ 'data-foogallery-change-selector' => 'input:radio',
155
+ 'data-foogallery-value-selector' => 'input:checked',
156
+ 'data-foogallery-preview' => 'shortcode'
157
+ )
158
+ ),
159
+ array(
160
+ 'id' => 'horizontal',
161
+ 'title' => __( 'Horizontal Layout', 'foogallery' ),
162
+ 'desc' => __( 'You can choose to lay out items to (mostly) maintain horizontal left-to-right order.', 'foogallery' ),
163
+ 'section' => __( 'General', 'foogallery' ),
164
+ 'type' => 'radio',
165
+ 'choices' => array(
166
+ '' => __( 'Disabled', 'foogallery' ),
167
+ 'yes' => __( 'Try to maintain lef-to-right order', 'foogallery' ),
168
+ ),
169
+ 'default' => '',
170
+ 'row_data'=> array(
171
+ 'data-foogallery-change-selector' => 'input:radio',
172
+ 'data-foogallery-value-selector' => 'input:checked',
173
+ 'data-foogallery-preview' => 'shortcode'
174
+ )
175
+ ),
176
+ array(
177
+ 'id' => 'gutter_width',
178
+ 'title' => __( 'Gutter Width', 'foogallery' ),
179
+ 'desc' => __( 'The spacing between your thumbnails. Only applicable when using a fixed layout!', 'foogallery' ),
180
+ 'section' => __( 'General', 'foogallery' ),
181
+ 'type' => 'number',
182
+ 'class' => 'small-text',
183
+ 'default' => 10,
184
+ 'step' => '1',
185
+ 'min' => '0',
186
+ 'row_data'=> array(
187
+ 'data-foogallery-hidden' => true,
188
+ 'data-foogallery-change-selector' => 'input',
189
+ 'data-foogallery-value-selector' => 'input',
190
+ 'data-foogallery-show-when-field' => 'layout',
191
+ 'data-foogallery-show-when-field-value' => 'fixed',
192
+ 'data-foogallery-preview' => 'shortcode',
193
+ )
194
+ ),
195
+ array(
196
+ 'id' => 'gutter_percent',
197
+ 'title' => __( 'Gutter Size', 'foogallery' ),
198
+ 'desc' => __( 'Choose a gutter size when using responsive columns.', 'foogallery' ),
199
+ 'section' => __( 'General', 'foogallery' ),
200
+ 'type' => 'radio',
201
+ 'choices' => array(
202
+ 'fg-gutter-none' => __( 'No Gutter', 'foogallery' ),
203
+ '' => __( 'Normal Size Gutter', 'foogallery' ),
204
+ 'fg-gutter-large' => __( 'Larger Gutter', 'foogallery' )
205
+ ),
206
+ 'default' => '',
207
+ 'row_data'=> array(
208
+ 'data-foogallery-hidden' => true,
209
+ 'data-foogallery-change-selector' => 'input:radio',
210
+ 'data-foogallery-value-selector' => 'input:checked',
211
+ 'data-foogallery-show-when-field' => 'layout',
212
+ 'data-foogallery-show-when-field-operator' => '!==',
213
+ 'data-foogallery-show-when-field-value' => 'fixed',
214
+ 'data-foogallery-preview' => 'shortcode'
215
+ )
216
+ ),
217
+ array(
218
+ 'id' => 'alignment',
219
+ 'title' => __( 'Alignment', 'foogallery' ),
220
+ 'desc' => __( 'You can choose to center align your images or leave them at the default (left). Only applicable when using a fixed layout!', 'foogallery' ),
221
+ 'section' => __( 'General', 'foogallery' ),
222
+ 'type' => 'radio',
223
+ 'spacer' => '<span class="spacer"></span>',
224
+ 'choices' => array(
225
+ '' => __( 'Left', 'foogallery' ),
226
+ 'fg-center' => __( 'Center', 'foogallery' )
227
+ ),
228
+ 'default' => 'fg-center',
229
+ 'row_data'=> array(
230
+ 'data-foogallery-hidden' => true,
231
+ 'data-foogallery-show-when-field' => 'layout',
232
+ 'data-foogallery-show-when-field-value' => 'fixed',
233
+ 'data-foogallery-change-selector' => 'input:radio',
234
+ 'data-foogallery-preview' => 'shortcode'
235
+ )
236
+ ),
237
+ array(
238
+ 'id' => 'thumbnail_link',
239
+ 'title' => __( 'Thumbnail Link', 'foogallery' ),
240
+ 'default' => 'image' ,
241
+ 'type' => 'thumb_link',
242
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything', 'foogallery' ),
243
+ ),
244
+ array(
245
+ 'id' => 'lightbox',
246
+ 'title' => __( 'Lightbox', 'foogallery' ),
247
+ 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image"', 'foogallery' ),
248
+ 'type' => 'lightbox',
249
+ 'default' => 'none',
250
+ ),
251
+ ),
252
+ );
253
+
254
+
255
+ return $gallery_templates;
256
+ }
257
+
258
+ /**
259
+ * Enqueue scripts that the masonry gallery template relies on
260
+ */
261
+ function enqueue_preview_dependencies() {
262
+ wp_enqueue_script( 'masonry' );
263
+ }
264
+
265
+ /**
266
+ * Enqueue scripts that the masonry gallery template relies on
267
+ */
268
+ function enqueue_dependencies() {
269
+ wp_enqueue_script( 'masonry' );
270
+
271
+ //enqueue core files
272
+ foogallery_enqueue_core_gallery_template_style();
273
+ foogallery_enqueue_core_gallery_template_script( array('jquery', 'masonry' ) );
274
+ }
275
+
276
+ /**
277
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
278
+ *
279
+ * @param array $dimensions
280
+ * @param FooGallery $foogallery
281
+ *
282
+ * @return mixed
283
+ */
284
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
285
+ $width = $foogallery->get_meta( 'masonry_thumbnail_width', false );
286
+ return array(
287
+ 'height' => 0,
288
+ 'width' => intval( $width ),
289
+ 'crop' => false
290
+ );
291
+ }
292
+
293
+ /**
294
+ * Add the required masonry options if needed
295
+ *
296
+ * @param $options
297
+ * @param $gallery FooGallery
298
+ *
299
+ * @param $attributes array
300
+ *
301
+ * @return array
302
+ */
303
+ function add_masonry_options($options, $gallery, $attributes) {
304
+ $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
305
+ if ( 'fixed' === $layout ) {
306
+ $width = foogallery_gallery_template_setting( 'thumbnail_width', '250' );
307
+ $gutter_width = foogallery_gallery_template_setting( 'gutter_width', '10' );
308
+ $options['template']['columnWidth'] = intval($width);
309
+ $options['template']['gutter'] = intval($gutter_width);
310
+ }
311
+ $horizontal = foogallery_gallery_template_setting( 'horizontal', '' );
312
+ if ( 'yes' === $horizontal ) {
313
+ $options['template']['horizontalOrder'] = true;
314
+ }
315
+ return $options;
316
+ }
317
+
318
+ /**
319
+ * Builds thumb dimensions from arguments
320
+ *
321
+ * @param array $dimensions
322
+ * @param array $arguments
323
+ *
324
+ * @return mixed
325
+ */
326
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
327
+ if ( array_key_exists( 'thumbnail_width', $arguments) ) {
328
+ return array(
329
+ 'height' => 0,
330
+ 'width' => intval($arguments['thumbnail_width']),
331
+ 'crop' => false
332
+ );
333
+ }
334
+ return null;
335
+ }
336
+
337
+ /**
338
+ * Build up the arguments needed for rendering this gallery template
339
+ *
340
+ * @param $args
341
+ * @return array
342
+ */
343
+ function build_gallery_template_arguments( $args ) {
344
+ $args = array(
345
+ 'width' => foogallery_gallery_template_setting( 'thumbnail_width', '250' ),
346
+ 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
347
+ 'crop' => false
348
+ );
349
+
350
+ return $args;
351
+ }
352
+
353
+ /**
354
+ * Add masonry-specific fields to the gallery template
355
+ *
356
+ * @uses "foogallery_override_gallery_template_fields"
357
+ * @param $fields
358
+ * @param $template
359
+ *
360
+ * @return array
361
+ */
362
+ function add_masonry_fields( $fields, $template ) {
363
+ //update specific fields
364
+ foreach ($fields as &$field) {
365
+ if ( 'hover_effect_caption_visibility' === $field['id'] ) {
366
+ //add a new choice for captions to show below the thumbs
367
+ $field['choices']['fg-captions-bottom'] = __( 'Below Thumbnail', 'foogallery' );
368
+ $field['default'] = 'fg-captions-bottom';
369
+ } else if ( 'theme' === $field['id'] ) {
370
+ $field['default'] = 'fg-dark';
371
+ $field['choices'] = array(
372
+ 'fg-light' => __( 'Light', 'foogallery' ),
373
+ 'fg-dark' => __( 'Dark', 'foogallery' ),
374
+ 'fg-transparent' => __( 'Transparent', 'foogallery' ),
375
+ 'fg-custom' => __( 'Custom', 'foogallery' )
376
+ );
377
+ } else if ( 'drop_shadow' === $field['id'] ) {
378
+ $field['default'] = 'fg-shadow-small';
379
+ } else if ( 'hover_effect_icon' === $field['id'] ) {
380
+ $field['default'] = 'fg-hover-plus';
381
+ }
382
+ }
383
+
384
+ return $fields;
385
+ }
386
+
387
+ function remove_captions( $captions, $foogallery_attachment, $args ) {
388
+ global $current_foogallery_template;
389
+
390
+ //check if masonry
391
+ if ( 'masonry' === $current_foogallery_template ) {
392
+
393
+ $hover_effect_caption_visibility = foogallery_gallery_template_setting( 'hover_effect_caption_visibility', 'fg-caption-hover' );
394
+
395
+ //check if captions are set to show below the thumbs
396
+ if ( 'fg-captions-bottom' === $hover_effect_caption_visibility ) {
397
+ //if we have no captions then do not output captions at all
398
+ if ( !array_key_exists( 'title', $captions ) && !array_key_exists( 'desc', $captions ) ) {
399
+ $captions = false;
400
+ }
401
+ }
402
+ }
403
+
404
+ return $captions;
405
+ }
406
+ }
407
  }
extensions/default-templates/masonry/gallery-masonry.php CHANGED
@@ -1,26 +1,26 @@
1
- <?php
2
- /**
3
- * FooGallery masonry gallery template
4
- */
5
- global $current_foogallery;
6
- global $current_foogallery_arguments;
7
-
8
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
9
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
10
- $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
11
- $gutter_percent = '';
12
- if ( 'fixed' !== $layout ) {
13
- $gutter_percent = foogallery_gallery_template_setting( 'gutter_percent', '' );
14
- }
15
- $foogallery_masonry_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $alignment, $gutter_percent );
16
- $foogallery_masonry_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_masonry_classes) );
17
- ?>
18
- <div <?php echo $foogallery_masonry_attributes; ?>>
19
- <?php if ( 'fixed' !== $layout ) { ?>
20
- <div class="fg-column-width"></div>
21
- <div class="fg-gutter-width"></div>
22
- <?php } ?>
23
- <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
24
- echo foogallery_attachment_html( $attachment );
25
- } ?>
26
  </div>
1
+ <?php
2
+ /**
3
+ * FooGallery masonry gallery template
4
+ */
5
+ global $current_foogallery;
6
+ global $current_foogallery_arguments;
7
+
8
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
9
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
10
+ $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
11
+ $gutter_percent = '';
12
+ if ( 'fixed' !== $layout ) {
13
+ $gutter_percent = foogallery_gallery_template_setting( 'gutter_percent', '' );
14
+ }
15
+ $foogallery_masonry_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $alignment, $gutter_percent );
16
+ $foogallery_masonry_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_masonry_classes) );
17
+ ?>
18
+ <div <?php echo $foogallery_masonry_attributes; ?>>
19
+ <?php if ( 'fixed' !== $layout ) { ?>
20
+ <div class="fg-column-width"></div>
21
+ <div class="fg-gutter-width"></div>
22
+ <?php } ?>
23
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
24
+ echo foogallery_attachment_html( $attachment );
25
+ } ?>
26
  </div>
extensions/default-templates/masonry/js/admin-gallery-masonry.js CHANGED
@@ -1,30 +1,30 @@
1
- (function (FOOGALLERY_MASONRY_TEMPLATE, $, undefined) {
2
-
3
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls = function() {
4
-
5
- var layout = $('input[name="foogallery_settings[masonry_layout]"]:checked').val();
6
-
7
- if ( layout === 'fixed' ) {
8
- $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').show();
9
- $('.gallery_template_field-masonry-gutter_percent').hide();
10
- } else {
11
- $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').hide();
12
- $('.gallery_template_field-masonry-gutter_percent').show();
13
- }
14
- };
15
-
16
- FOOGALLERY_MASONRY_TEMPLATE.adminReady = function () {
17
- $('body').on('foogallery-gallery-template-changed-masonry', function() {
18
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
19
- });
20
-
21
- $('input[name="foogallery_settings[masonry_layout]"]').change(function() {
22
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
23
- });
24
- };
25
-
26
- }(window.FOOGALLERY_MASONRY_TEMPLATE = window.FOOGALLERY_MASONRY_TEMPLATE || {}, jQuery));
27
-
28
- jQuery(function () {
29
- FOOGALLERY_MASONRY_TEMPLATE.adminReady();
30
  });
1
+ (function (FOOGALLERY_MASONRY_TEMPLATE, $, undefined) {
2
+
3
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls = function() {
4
+
5
+ var layout = $('input[name="foogallery_settings[masonry_layout]"]:checked').val();
6
+
7
+ if ( layout === 'fixed' ) {
8
+ $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').show();
9
+ $('.gallery_template_field-masonry-gutter_percent').hide();
10
+ } else {
11
+ $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').hide();
12
+ $('.gallery_template_field-masonry-gutter_percent').show();
13
+ }
14
+ };
15
+
16
+ FOOGALLERY_MASONRY_TEMPLATE.adminReady = function () {
17
+ $('body').on('foogallery-gallery-template-changed-masonry', function() {
18
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
19
+ });
20
+
21
+ $('input[name="foogallery_settings[masonry_layout]"]').change(function() {
22
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
23
+ });
24
+ };
25
+
26
+ }(window.FOOGALLERY_MASONRY_TEMPLATE = window.FOOGALLERY_MASONRY_TEMPLATE || {}, jQuery));
27
+
28
+ jQuery(function () {
29
+ FOOGALLERY_MASONRY_TEMPLATE.adminReady();
30
  });
extensions/default-templates/shared/css/admin-foogallery.css CHANGED
@@ -1,87 +1,87 @@
1
- .foogallery-setting-caption_icon,
2
- .foogallery-setting-loading_icon,
3
- .foogallery-setting-video_overlay,
4
- .foogallery-setting-panel_theme {
5
- content: "";
6
- display: inline-block;
7
- position: relative;
8
- width: 32px;
9
- height: 32px;
10
- margin: 0;
11
- background: transparent no-repeat center center;
12
- background-size: 32px 32px;
13
- vertical-align: middle;
14
- }
15
- .foogallery-setting-caption_icon.fg-hover-zoom {
16
- background-image: url('../img/icons.svg#zoom-light');
17
- }
18
- .foogallery-setting-caption_icon.fg-hover-zoom2 {
19
- background-image: url('../img/icons.svg#zoom2-light');
20
- }
21
- .foogallery-setting-caption_icon.fg-hover-zoom3 {
22
- background-image: url('../img/icons.svg#zoom3-light');
23
- }
24
- .foogallery-setting-caption_icon.fg-hover-plus {
25
- background-image: url('../img/icons.svg#plus-light');
26
- }
27
- .foogallery-setting-caption_icon.fg-hover-circle-plus {
28
- background-image: url('../img/icons.svg#circle-plus-light');
29
- }
30
- .foogallery-setting-caption_icon.fg-hover-eye {
31
- background-image: url('../img/icons.svg#eye-light');
32
- }
33
- .foogallery-setting-caption_icon.fg-hover-external {
34
- background-image: url('../img/icons.svg#external-light');
35
- }
36
- .foogallery-setting-video_overlay.fg-video-default {
37
- background-image: url('../img/icons.svg#video-default-light');
38
- }
39
- .foogallery-setting-video_overlay.fg-video-1 {
40
- background-image: url('../img/icons.svg#video-1-light');
41
- }
42
- .foogallery-setting-video_overlay.fg-video-2 {
43
- background-image: url('../img/icons.svg#video-2-light');
44
- }
45
- .foogallery-setting-video_overlay.fg-video-3 {
46
- background-image: url('../img/icons.svg#video-3-light');
47
- }
48
- .foogallery-setting-video_overlay.fg-video-4 {
49
- background-image: url('../img/icons.svg#video-4-light');
50
- }
51
- .foogallery-setting-caption_icon.fg-hover-cart {
52
- background-image: url('../img/icons.svg#cart-light');
53
- }
54
-
55
- .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td label {
56
- background-color: #eee;
57
- }
58
-
59
- .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td input:checked + label {
60
- background-color: #eee;
61
- }
62
-
63
- .fg-item-inner {
64
- margin: 0;
65
- }
66
-
67
- .foogallery-setting-panel_theme.fg-light {
68
- background-color: #fff;
69
- }
70
- .foogallery-setting-panel_theme.fg-dark {
71
- background-color: #292929;
72
- }
73
- .foogallery-setting-panel_theme.fg-blue {
74
- background-color: #3079ed;
75
- }
76
- .foogallery-setting-panel_theme.fg-purple {
77
- background-color: #6816c2;
78
- }
79
- .foogallery-setting-panel_theme.fg-green {
80
- background-color: #027339;
81
- }
82
- .foogallery-setting-panel_theme.fg-red {
83
- background-color: #c22b24;
84
- }
85
- .foogallery-setting-panel_theme.fg-orange {
86
- background-color: #e57731;
87
  }
1
+ .foogallery-setting-caption_icon,
2
+ .foogallery-setting-loading_icon,
3
+ .foogallery-setting-video_overlay,
4
+ .foogallery-setting-panel_theme {
5
+ content: "";
6
+ display: inline-block;
7
+ position: relative;
8
+ width: 32px;
9
+ height: 32px;
10
+ margin: 0;
11
+ background: transparent no-repeat center center;
12
+ background-size: 32px 32px;
13
+ vertical-align: middle;
14
+ }
15
+ .foogallery-setting-caption_icon.fg-hover-zoom {
16
+ background-image: url('../img/icons.svg#zoom-light');
17
+ }
18
+ .foogallery-setting-caption_icon.fg-hover-zoom2 {
19
+ background-image: url('../img/icons.svg#zoom2-light');
20
+ }
21
+ .foogallery-setting-caption_icon.fg-hover-zoom3 {
22
+ background-image: url('../img/icons.svg#zoom3-light');
23
+ }
24
+ .foogallery-setting-caption_icon.fg-hover-plus {
25
+ background-image: url('../img/icons.svg#plus-light');
26
+ }
27
+ .foogallery-setting-caption_icon.fg-hover-circle-plus {
28
+ background-image: url('../img/icons.svg#circle-plus-light');
29
+ }
30
+ .foogallery-setting-caption_icon.fg-hover-eye {
31
+ background-image: url('../img/icons.svg#eye-light');
32
+ }
33
+ .foogallery-setting-caption_icon.fg-hover-external {
34
+ background-image: url('../img/icons.svg#external-light');
35
+ }
36
+ .foogallery-setting-video_overlay.fg-video-default {
37
+ background-image: url('../img/icons.svg#video-default-light');
38
+ }
39
+ .foogallery-setting-video_overlay.fg-video-1 {
40
+ background-image: url('../img/icons.svg#video-1-light');
41
+ }
42
+ .foogallery-setting-video_overlay.fg-video-2 {
43
+ background-image: url('../img/icons.svg#video-2-light');
44
+ }
45
+ .foogallery-setting-video_overlay.fg-video-3 {
46
+ background-image: url('../img/icons.svg#video-3-light');
47
+ }
48
+ .foogallery-setting-video_overlay.fg-video-4 {
49
+ background-image: url('../img/icons.svg#video-4-light');
50
+ }
51
+ .foogallery-setting-caption_icon.fg-hover-cart {
52
+ background-image: url('../img/icons.svg#cart-light');
53
+ }
54
+
55
+ .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td label {
56
+ background-color: #eee;
57
+ }
58
+
59
+ .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td input:checked + label {
60
+ background-color: #eee;
61
+ }
62
+
63
+ .fg-item-inner {
64
+ margin: 0;
65
+ }
66
+
67
+ .foogallery-setting-panel_theme.fg-light {
68
+ background-color: #fff;
69
+ }
70
+ .foogallery-setting-panel_theme.fg-dark {
71
+ background-color: #292929;
72
+ }
73
+ .foogallery-setting-panel_theme.fg-blue {
74
+ background-color: #3079ed;
75
+ }
76
+ .foogallery-setting-panel_theme.fg-purple {
77
+ background-color: #6816c2;
78
+ }
79
+ .foogallery-setting-panel_theme.fg-green {
80
+ background-color: #027339;
81
+ }
82
+ .foogallery-setting-panel_theme.fg-red {
83
+ background-color: #c22b24;
84
+ }
85
+ .foogallery-setting-panel_theme.fg-orange {
86
+ background-color: #e57731;
87
  }
extensions/default-templates/shared/css/foogallery.css CHANGED
@@ -1,3479 +1,3479 @@
1
- .foogallery, .foogallery * {
2
- box-sizing: border-box;
3
- }
4
- .foogallery {
5
- display: block;
6
- z-index: 1;
7
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
8
- position: relative;
9
- line-height: 0;
10
- font-size: 0;
11
- width: 100%;
12
- max-width: 100%;
13
- }
14
- .foogallery .fg-item {
15
- display: inline-block;
16
- position: relative;
17
- background-color: transparent;
18
- z-index: 2;
19
- -webkit-user-select: none;
20
- -moz-user-select: none;
21
- -ms-user-select: none;
22
- user-select: none;
23
- }
24
- .foogallery .fg-item.fg-hidden {
25
- display: none!important;
26
- }
27
- .foogallery .fg-item-inner {
28
- display: block;
29
- position: relative;
30
- visibility: hidden;
31
- overflow: hidden;
32
- opacity: 0;
33
- z-index: 3;
34
- margin: 0;
35
- border: solid 0 transparent;
36
- }
37
-
38
- .foogallery .fg-item.fg-error:before {
39
- content: "";
40
- display: block;
41
- position: absolute;
42
- top: 50%;
43
- left: 50%;
44
- transform: translateX(-50%) translateY(-50%);
45
- width: 32px;
46
- height: 32px;
47
- background-image: url('../img/icons.svg#image');
48
- background-color: transparent;
49
- background-repeat: no-repeat;
50
- background-position: center center;
51
- background-size: 32px 32px;
52
- }
53
-
54
- .foogallery .fg-item.fg-loaded {
55
- z-index: 4;
56
- }
57
- .foogallery .fg-loaded .fg-item-inner {
58
- visibility: visible;
59
- opacity: 1;
60
- z-index: 5;
61
- }
62
- .foogallery .fg-error .fg-item-inner {
63
- pointer-events: none;
64
- cursor: default;
65
- }
66
- .foogallery .fg-thumb {
67
- display: block;
68
- position: relative;
69
- border: none;
70
- outline: 0;
71
- text-decoration: none;
72
- z-index: 4;
73
- box-shadow: none;
74
- }
75
- .foogallery .fg-thumb:hover,
76
- .foogallery .fg-thumb:focus {
77
- border: none;
78
- outline: 0;
79
- text-decoration: none;
80
- box-shadow: none;
81
- }
82
- .foogallery .fg-image-overlay {
83
- position: absolute;
84
- top: 0;
85
- right: 0;
86
- bottom: 0;
87
- left: 0;
88
- z-index: 8;
89
- visibility: hidden;
90
- opacity: 0;
91
- }
92
- .foogallery .fg-image-wrap {
93
- display: block;
94
- position: relative;
95
- }
96
- .foogallery .fg-image {
97
- display: block;
98
- position: relative;
99
- border: none;
100
- outline: 0;
101
- text-decoration: none;
102
- z-index: 5;
103
- max-width: 100%;
104
- height: auto;
105
- margin: 0;
106
- width: auto;
107
- }
108
- .foogallery picture.fg-image > img {
109
- display: block;
110
- position: relative;
111
- border: none;
112
- outline: 0;
113
- text-decoration: none;
114
- max-width: 100%;
115
- height: auto;
116
- margin: 0;
117
- width: auto;
118
- }
119
- .foogallery .fg-loaded .fg-thumb {
120
- z-index: 6;
121
- }
122
- .foogallery .fg-loaded .fg-image {
123
- z-index: 7;
124
- }
125
-
126
- /* Utility */
127
- .fg-sr-only {
128
- position: absolute;
129
- width: 1px;
130
- height: 1px;
131
- padding: 0;
132
- margin: -1px;
133
- overflow: hidden;
134
- clip: rect(0,0,0,0);
135
- border: 0;
136
- }
137
- /* Item Style */
138
- .foogallery.fg-light .fg-item-inner {
139
- background-color: #FFF;
140
- color: #333;
141
- border-color: #FFF;
142
- }
143
- .foogallery.fg-dark .fg-item-inner {
144
- background-color: #333;
145
- color: #FFF;
146
- border-color: #333;
147
- }
148
- /* Idle / Loading / Error Style */
149
- .foogallery.fg-light .fg-item.fg-idle,
150
- .foogallery.fg-light .fg-item.fg-loading,
151
- .foogallery.fg-light .fg-item.fg-error {
152
- background-color: #eee;
153
- box-shadow: inset 0 0 0 1px #ddd;
154
- }
155
- .foogallery.fg-dark .fg-item.fg-idle,
156
- .foogallery.fg-dark .fg-item.fg-loading,
157
- .foogallery.fg-dark .fg-item.fg-error {
158
- background-color: #444;
159
- box-shadow: inset 0 0 0 1px #333;
160
- }
161
- /* Caption & Overlay Colors */
162
- .foogallery .fg-caption {
163
- background-color: rgba(0,0,0,0.6);
164
- color: #fff;
165
- }
166
- .foogallery .fg-caption a {
167
- color: #fff;
168
- border-bottom: 1px solid #FFF;
169
- }
170
- .foogallery.fg-light-overlays .fg-caption {
171
- background-color: rgba(255,255,255,0.8);
172
- color: #333;
173
- }
174
- .foogallery.fg-light-overlays .fg-caption a {
175
- color: #333;
176
- border-bottom-color: #333;
177
- }
178
- .foogallery.fg-transparent-overlays .fg-caption {
179
- background-color: transparent;
180
- color: #fff;
181
- }
182
- .foogallery.fg-transparent-overlays .fg-caption a {
183
- color: #fff;
184
- border-bottom-color: #fff;
185
- }
186
-
187
- .foogallery .fg-image-overlay {
188
- background-color: rgba(0,0,0,0.6);
189
- color: #fff;
190
- }
191
- .foogallery.fg-light-overlays .fg-image-overlay {
192
- background-color: rgba(255,255,255,0.8);
193
- color: #333;
194
- }
195
- .foogallery.fg-transparent-overlays .fg-image-overlay {
196
- background-color: transparent;
197
- color: #fff;
198
- }
199
- /* Colors */
200
- .fg-exif-light .fg-item.fg-item-exif .fg-image-wrap:after {
201
- background-color: #FFF;
202
- color: #333;
203
- }
204
- .fg-exif-dark .fg-item.fg-item-exif .fg-image-wrap:after {
205
- background-color: #333;
206
- color: #FFF;
207
- }
208
-
209
- /* Rounded Corners */
210
- .fg-exif-rounded .fg-item.fg-item-exif .fg-image-wrap:after {
211
- border-radius: 3px;
212
- }
213
-
214
- /* Positions ~ Top, Right, Bottom & Left */
215
- .fg-exif-bottom-right .fg-item.fg-item-exif .fg-image-wrap:after,
216
- .fg-exif-bottom-left .fg-item.fg-item-exif .fg-image-wrap:after,
217
- .fg-exif-top-right .fg-item.fg-item-exif .fg-image-wrap:after,
218
- .fg-exif-top-left .fg-item.fg-item-exif .fg-image-wrap:after {
219
- display: inline-block;
220
- position: absolute;
221
- content: 'EXIF';
222
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
223
- font-size: 11px;
224
- line-height: 10px;
225
- padding: 3px 4px;
226
- z-index: 7;
227
- }
228
- .fg-exif-bottom-right .fg-item.fg-item-exif .fg-image-wrap:after {
229
- bottom: 5px;
230
- right: 5px;
231
- }
232
- .fg-exif-bottom-left .fg-item.fg-item-exif .fg-image-wrap:after {
233
- bottom: 5px;
234
- left: 5px;
235
- }
236
- .fg-exif-top-right .fg-item.fg-item-exif .fg-image-wrap:after {
237
- top: 5px;
238
- right: 5px;
239
- }
240
- .fg-exif-top-left .fg-item.fg-item-exif .fg-image-wrap:after {
241
- top: 5px;
242
- left: 5px;
243
- }
244
- /* Border Size */
245
- .foogallery.fg-border-thin .fg-item-inner {
246
- border-width: 4px;
247
- }
248
- .foogallery.fg-border-medium .fg-item-inner {
249
- border-width: 10px;
250
- }
251
- .foogallery.fg-border-thick .fg-item-inner {
252
- border-width: 16px;
253
- }
254
- /* Drop Shadows */
255
- .foogallery.fg-light.fg-shadow-outline .fg-item-inner {
256
- box-shadow: 0 0 0 1px #ddd;
257
- }
258
- .foogallery.fg-dark.fg-shadow-outline .fg-item-inner {
259
- box-shadow: 0 0 0 1px #222;
260
- }
261
- .foogallery.fg-light.fg-shadow-small .fg-item-inner,
262
- .foogallery.fg-dark.fg-shadow-small .fg-item-inner {
263
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
264
- }
265
- .foogallery.fg-light.fg-shadow-medium .fg-item-inner,
266
- .foogallery.fg-dark.fg-shadow-medium .fg-item-inner {
267
- box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
268
- }
269
- .foogallery.fg-light.fg-shadow-large .fg-item-inner,
270
- .foogallery.fg-dark.fg-shadow-large .fg-item-inner {
271
- box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
272
- }
273
- /* Inset Shadows */
274
- .foogallery.fg-shadow-inset-small .fg-thumb:after,
275
- .foogallery.fg-shadow-inset-medium .fg-thumb:after,
276
- .foogallery.fg-shadow-inset-large .fg-thumb:after {
277
- display: block;
278
- content: "";
279
- position: absolute;
280
- top: 0;
281
- left: 0;
282
- right: 0;
283
- bottom: 0;
284
- z-index: 7;
285
- }
286
- .foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after,
287
- .foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after {
288
- box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
289
- }
290
- .foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after,
291
- .foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after {
292
- box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
293
- }
294
- .foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after,
295
- .foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after {
296
- box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
297
- }
298
-
299
- .foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
300
- .foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
301
- .foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
302
- border-radius: 50%;
303
- }
304
- /* Rounded Corners */
305
- .foogallery.fg-round-small .fg-item,
306
- .foogallery.fg-round-small .fg-item-inner {
307
- border-radius: 5px;
308
- }
309
- .foogallery.fg-round-medium .fg-item,
310
- .foogallery.fg-round-medium .fg-item-inner {
311
- border-radius: 10px;
312
- }
313
- .foogallery.fg-round-large .fg-item,
314
- .foogallery.fg-round-large .fg-item-inner {
315
- border-radius: 15px;
316
- }
317
- .foogallery.fg-round-full .fg-item,
318
- .foogallery.fg-round-full .fg-item-inner {
319
- border-radius: 50%;
320
- }
321
- /* Loader Styles */
322
- .foogallery .fg-loader {
323
- position: absolute;
324
- top: 50%;
325
- left: 50%;
326
- margin-top: -0.5em;
327
- margin-left: -0.5em;
328
- width: 1em;
329
- height: 1em;
330
- font-size: 5px;
331
- visibility: hidden;
332
- opacity: 0;
333
- pointer-events: none;
334
- }
335
-
336
- .foogallery .fg-loading .fg-loader {
337
- visibility: visible;
338
- opacity: 1;
339
- }
340
- .fg-loading-default .fg-loader {
341
- border-radius: 50%;
342
- text-indent: -9999em;
343
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
344
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
345
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
346
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
347
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
348
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
349
- -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
350
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
351
- -webkit-animation: loading-default 1.1s infinite paused steps(8, start);
352
- animation: loading-default 1.1s infinite paused steps(8, start);
353
- }
354
- .fg-loading-default .fg-loading .fg-loader {
355
- -webkit-animation-play-state: running;
356
- animation-play-state: running;
357
- }
358
-
359
- @-webkit-keyframes loading-default {
360
- 0% {
361
- transform: rotate(0deg);
362
- }
363
- 100% {
364
- transform: rotate(360deg);
365
- }
366
- }
367
-
368
- @keyframes loading-default {
369
- 0% {
370
- transform: rotate(0deg);
371
- }
372
- 100% {
373
- transform: rotate(360deg);
374
- }
375
- }
376
- .fg-loading-bars .fg-loader,
377
- .fg-loading-bars .fg-loader:before,
378
- .fg-loading-bars .fg-loader:after {
379
- background: rgba(130, 130, 130, 1);
380
- width: 1em;
381
- height: 4em;
382
- -webkit-animation: loading-bars 1s infinite paused ease-in-out;
383
- animation: loading-bars 1s infinite paused ease-in-out;
384
- }
385
- .fg-loading-bars .fg-loading .fg-loader,
386
- .fg-loading-bars .fg-loading .fg-loader:before,
387
- .fg-loading-bars .fg-loading .fg-loader:after {
388
- -webkit-animation-play-state: running;
389
- animation-play-state: running;
390
- }
391
- .fg-loading-bars .fg-loader {
392
- color: rgba(130, 130, 130, 1);
393
- text-indent: -9999em;
394
- font-size: 4px;
395
- margin-top: -2em;
396
- margin-left: -0.5em;
397
- -webkit-animation-delay: -0.16s;
398
- animation-delay: -0.16s;
399
- }
400
- .fg-loading-bars .fg-loader:before,
401
- .fg-loading-bars .fg-loader:after {
402
- position: absolute;
403
- top: 0;
404
- content: '';
405
- }
406
- .fg-loading-bars .fg-loader:before {
407
- left: -1.5em;
408
- -webkit-animation-delay: -0.32s;
409
- animation-delay: -0.32s;
410
- }
411
- .fg-loading-bars .fg-loader:after {
412
- left: 1.5em;
413
- }
414
- @-webkit-keyframes loading-bars {
415
- 0%,
416
- 80%,
417
- 100% {
418
- box-shadow: 0 0;
419
- height: 4em;
420
- }
421
- 40% {
422
- box-shadow: 0 -2em;
423
- height: 5em;
424
- }
425
- }
426
- @keyframes loading-bars {
427
- 0%,
428
- 80%,
429
- 100% {
430
- box-shadow: 0 0;
431
- height: 4em;
432
- }
433
- 40% {
434
- box-shadow: 0 -2em;
435
- height: 5em;
436
- }
437
- }
438
- .fg-loading-trail .fg-loader {
439
- color: #828282;
440
- margin-top: 0;
441
- margin-left: 0;
442
- font-size: 20px;
443
- text-indent: -9999em;
444
- overflow: hidden;
445
- border-radius: 50%;
446
- -webkit-animation: loading-trail-1 1.7s infinite paused ease, loading-trail-2 1.7s infinite paused ease;
447
- animation: loading-trail-1 1.7s infinite paused ease, loading-trail-2 1.7s infinite paused ease;
448
- }
449
- .fg-loading-trail .fg-loading .fg-loader {
450
- -webkit-animation-play-state: running;
451
- animation-play-state: running;
452
- }
453
-
454
- @-webkit-keyframes loading-trail-1 {
455
- 0% {
456
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
457
- }
458
- 5%,
459
- 95% {
460
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
461
- }
462
- 10%,
463
- 59% {
464
- box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
465
- }
466
- 20% {
467
- box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
468
- }
469
- 38% {
470
- box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
471
- }
472
- 100% {
473
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
474
- }
475
- }
476
- @keyframes loading-trail-1 {
477
- 0% {
478
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
479
- }
480
- 5%,
481
- 95% {
482
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
483
- }
484
- 10%,
485
- 59% {
486
- box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
487
- }
488
- 20% {
489
- box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
490
- }
491
- 38% {
492
- box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
493
- }
494
- 100% {
495
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
496
- }
497
- }
498
- @-webkit-keyframes loading-trail-2 {
499
- 0% {
500
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
501
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
502
- }
503
- 100% {
504
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
505
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
506
- }
507
- }
508
- @keyframes loading-trail-2 {
509
- 0% {
510
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
511
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
512
- }
513
- 100% {
514
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
515
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
516
- }
517
- }
518
- .fg-loading-pulse .fg-loader,
519
- .fg-loading-pulse .fg-loader:before,
520
- .fg-loading-pulse .fg-loader:after {
521
- border-radius: 50%;
522
- width: 2.5em;
523
- height: 2.5em;
524
- -webkit-animation: loading-pulse 1.8s infinite both paused ease-in-out;
525
- animation: loading-pulse 1.8s infinite both paused ease-in-out;
526
- }
527
- .fg-loading-pulse .fg-loading .fg-loader,
528
- .fg-loading-pulse .fg-loading .fg-loader:before,
529
- .fg-loading-pulse .fg-loading .fg-loader:after {
530
- -webkit-animation-play-state: running;
531
- animation-play-state: running;
532
- }
533
-
534
- .fg-loading-pulse .fg-loader {
535
- color: #828282;
536
- font-size: 4px;
537
- margin-top: -3.75em;
538
- margin-left: -1.25em;
539
- text-indent: -9999em;
540
- -webkit-animation-delay: -0.16s;
541
- animation-delay: -0.16s;
542
- }
543
- .fg-loading-pulse .fg-loader:before,
544
- .fg-loading-pulse .fg-loader:after {
545
- content: '';
546
- position: absolute;
547
- top: 0;
548
- }
549
- .fg-loading-pulse .fg-loader:before {
550
- left: -3.5em;
551
- -webkit-animation-delay: -0.32s;
552
- animation-delay: -0.32s;
553
- }
554
- .fg-loading-pulse .fg-loader:after {
555
- left: 3.5em;
556
- }
557
- @-webkit-keyframes loading-pulse {
558
- 0%,
559
- 80%,
560
- 100% {
561
- box-shadow: 0 2.5em 0 -1.3em;
562
- }
563
- 40% {
564
- box-shadow: 0 2.5em 0 0;
565
- }
566
- }
567
- @keyframes loading-pulse {
568
- 0%,
569
- 80%,
570
- 100% {
571
- box-shadow: 0 2.5em 0 -1.3em;
572
- }
573
- 40% {
574
- box-shadow: 0 2.5em 0 0;
575
- }
576
- }
577
- .fg-loading-dots .fg-loader {
578
- color: #828282;
579
- font-size: 5px;
580
- border-radius: 50%;
581
- text-indent: -9999em;
582
- -webkit-animation: loading-dots 1.3s infinite paused linear;
583
- animation: loading-dots 1.3s infinite paused linear;
584
- }
585
- .fg-loading-dots .fg-loading .fg-loader {
586
- -webkit-animation-play-state: running;
587
- animation-play-state: running;
588
- }
589
-
590
- @-webkit-keyframes loading-dots {
591
- 0%,
592
- 100% {
593
- box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
594
- }
595
- 12.5% {
596
- box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
597
- }
598
- 25% {
599
- box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
600
- }
601
- 37.5% {
602
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
603
- }
604
- 50% {
605
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
606
- }
607
- 62.5% {
608
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
609
- }
610
- 75% {
611
- box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
612
- }
613
- 87.5% {
614
- box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
615
- }
616
- }
617
- @keyframes loading-dots {
618
- 0%,
619
- 100% {
620
- box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
621
- }
622
- 12.5% {
623
- box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
624
- }
625
- 25% {
626
- box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
627
- }
628
- 37.5% {
629
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
630
- }
631
- 50% {
632
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
633
- }
634
- 62.5% {
635
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
636
- }
637
- 75% {
638
- box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
639
- }
640
- 87.5% {
641
- box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
642
- }
643
- }
644
- .fg-loading-partial .fg-loader,
645
- .fg-loading-partial .fg-loader:after {
646
- border-radius: 50%;
647
- width: 10em;
648
- height: 10em;
649
- }
650
- .fg-loading-partial .fg-loader {
651
- font-size: 4px;
652
- text-indent: -9999em;
653
- margin-top: 0;
654
- margin-left: 0;
655
- border-top: 1.1em solid rgba(130,130,130, 0.2);
656
- border-right: 1.1em solid rgba(130,130,130, 0.2);
657
- border-bottom: 1.1em solid rgba(130,130,130, 0.2);
658
- border-left: 1.1em solid #828282;
659
- -webkit-animation: loading-partial 1.1s infinite paused linear;
660
- animation: loading-partial 1.1s infinite paused linear;
661
- }
662
- .fg-loading-partial .fg-loading .fg-loader {
663
- -webkit-animation-play-state: running;
664
- animation-play-state: running;
665
- }
666
-
667
- @-webkit-keyframes loading-partial {
668
- 0% {
669
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
670
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
671
- }
672
- 100% {
673
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
674
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
675
- }
676
- }
677
- @keyframes loading-partial {
678
- 0% {
679
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
680
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
681
- }
682
- 100% {
683
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
684
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
685
- }
686
- }
687
- /* Loaded Effects */
688
- .foogallery.fg-loaded-fade-in .fg-item.fg-loaded,
689
- .foogallery.fg-loaded-slide-up .fg-item.fg-loaded,
690
- .foogallery.fg-loaded-slide-down .fg-item.fg-loaded,
691
- .foogallery.fg-loaded-slide-left .fg-item.fg-loaded,
692
- .foogallery.fg-loaded-slide-right .fg-item.fg-loaded,
693
- .foogallery.fg-loaded-scale-up .fg-item.fg-loaded,
694
- .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
695
- .foogallery.fg-loaded-drop .fg-item.fg-loaded,
696
- .foogallery.fg-loaded-fly .fg-item.fg-loaded,
697
- .foogallery.fg-loaded-flip .fg-item.fg-loaded {
698
- transition-timing-function: ease;
699
- transition-duration: 650ms;
700
- transition-property: background-color, transform;
701
- }
702
- .foogallery.fg-loaded-fade-in .fg-loaded .fg-item-inner,
703
- .foogallery.fg-loaded-slide-up .fg-loaded .fg-item-inner,
704
- .foogallery.fg-loaded-slide-down .fg-loaded .fg-item-inner,
705
- .foogallery.fg-loaded-slide-left .fg-loaded .fg-item-inner,
706
- .foogallery.fg-loaded-slide-right .fg-loaded .fg-item-inner,
707
- .foogallery.fg-loaded-scale-up .fg-loaded .fg-item-inner,
708
- .foogallery.fg-loaded-swing-down .fg-loaded .fg-item-inner,
709
- .foogallery.fg-loaded-drop .fg-loaded .fg-item-inner,
710
- .foogallery.fg-loaded-fly .fg-loaded .fg-item-inner,
711
- .foogallery.fg-loaded-flip .fg-loaded .fg-item-inner {
712
- transition-timing-function: ease;
713
- transition-duration: 650ms;
714
- }
715
- /* Only apply the perspective once loaded otherwise transitions could take place behind other items*/
716
- .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
717
- .foogallery.fg-loaded-drop .fg-item.fg-loaded,
718
- .foogallery.fg-loaded-fly .fg-item.fg-loaded,
719
- .foogallery.fg-loaded-flip .fg-item.fg-loaded {
720
- perspective: 1300px;
721
- }
722
- /* Drop */
723
- .foogallery.fg-loaded-drop .fg-item-inner {
724
- transition-property: visibility, opacity, transform;
725
- transform-style: preserve-3d;
726
- transform: translateZ(400px) translateY(100%) rotateX(-90deg);
727
- }
728
- .foogallery.fg-loaded-drop .fg-loaded .fg-item-inner {
729
- transform: translateZ(0px) translateY(0px) rotateX(0deg);
730
- }
731
- /* Fade In */
732
- .foogallery.fg-loaded-fade-in .fg-item-inner {
733
- transition-property: visibility, opacity;
734
- }
735
- /* Flip */
736
- .foogallery.fg-loaded-flip .fg-item-inner {
737
- transition-property: visibility, opacity, transform;
738
- backface-visibility: hidden;
739
- transform-style: preserve-3d;
740
- transform: rotateY(-180deg);
741
- }
742
- .foogallery.fg-loaded-flip .fg-loaded .fg-item-inner {
743
- transform: rotateY(0deg);
744
- }
745
- /* Fly */
746
- .foogallery.fg-loaded-fly .fg-item-inner {
747
- transition-property: visibility, opacity, transform;
748
- transform-style: preserve-3d;
749
- transform-origin: 50% 50% -300px;
750
- transform: rotateX(-180deg);
751
- }
752
- .foogallery.fg-loaded-fly .fg-loaded .fg-item-inner {
753
- transform: rotateX(0deg);
754
- }
755
- /* Scale Up */
756
- .foogallery.fg-loaded-scale-up .fg-item-inner {
757
- transition-property: visibility, opacity, transform;
758
- transform: scale(0.6);
759
- }
760
- .foogallery.fg-loaded-scale-up .fg-loaded .fg-item-inner {
761
- transform: scale(1);
762
- }
763
- /* Slide Up */
764
- .foogallery.fg-loaded-slide-up .fg-item-inner {
765
- transition-property: visibility, opacity, transform;
766
- transform: translateY(50%);
767
- }
768
- .foogallery.fg-loaded-slide-up .fg-loaded .fg-item-inner {
769
- transform: translateY(0);
770
- }
771
- /* Slide Down */
772
- .foogallery.fg-loaded-slide-down .fg-item-inner {
773
- transition-property: visibility, opacity, transform;
774
- transform: translateY(-50%);
775
- }
776
- .foogallery.fg-loaded-slide-down .fg-loaded .fg-item-inner {
777
- transform: translateY(0);
778
- }
779
- /* Slide Left */
780
- .foogallery.fg-loaded-slide-left .fg-item-inner {
781
- transition-property: visibility, opacity, transform;
782
- transform: translateX(50%);
783
- }
784
- .foogallery.fg-loaded-slide-left .fg-loaded .fg-item-inner {
785
- transform: translateX(0);
786
- }
787
- /* Slide Right */
788
- .foogallery.fg-loaded-slide-right .fg-item-inner {
789
- transition-property: visibility, opacity, transform;
790
- transform: translateX(-50%);
791
- }
792
- .foogallery.fg-loaded-slide-right .fg-loaded .fg-item-inner {
793
- transform: translateX(0);
794
- }
795
- /* Swing Down */
796
- .foogallery.fg-loaded-swing-down .fg-item-inner {
797
- transition-property: visibility, opacity, transform;
798
- transform-style: preserve-3d;
799
- transform-origin: 0 0;
800
- transform: rotateX(-80deg);
801
- }
802
- .foogallery.fg-loaded-swing-down .fg-loaded .fg-item-inner {
803
- transform: rotateX(0deg);
804
- }
805
- /* Caption Styles */
806
- .foogallery .fg-caption {
807
- visibility: hidden;
808
- opacity: 0;
809
- position: absolute;
810
- z-index: 8;
811
- width: 100%;
812
- max-height: 100%;
813
- overflow: hidden;
814
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
815
- font-size: 13px;
816
- font-weight: 400;
817
- line-height: 1.3;
818
- border: none;
819
- text-align: center;
820
- cursor: pointer;
821
- margin: 0;
822
- }
823
- .foogallery .fg-caption a {
824
- text-decoration: none;
825
- }
826
-
827
- .foogallery .fg-caption a:hover {
828
- border-bottom: none;
829
- }
830
-
831
- .foogallery .fg-caption-title {
832
- box-sizing: content-box;
833
- white-space: nowrap;
834
- overflow: hidden;
835
- text-overflow: ellipsis;
836
- font-size: 16px;
837
- font-weight: 400;
838
- padding: 0;
839
- margin: 0.4em;
840
- height: 1.3em;
841
- min-height: 1.3em;
842
- line-height: 1.3em;
843
- }
844
- .foogallery .fg-caption-desc {
845
- padding: 0;
846
- margin: 0.4em;
847
- overflow: hidden;
848
- height: 100%;
849
- max-height: 100%;
850
- }
851
- .foogallery .fg-caption-title+.fg-caption-desc {
852
- margin-top: 0;
853
- }
854
-
855
- .foogallery .fg-caption-buttons {
856
- display: flex;
857
- position: relative;
858
- flex-direction: row;
859
- flex-wrap: wrap;
860
- align-items: center;
861
- justify-content: center;
862
- width: 100%;
863
- padding: 5px;
864
- margin: 0;
865
- }
866
-
867
- .foogallery .fg-caption-buttons > a {
868
- display: inline-block;
869
- position: relative;
870
- padding: 0.4em 0.8em;
871
- margin: 1px;
872
- max-width: 100%;
873
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
874
- font-size: 12px;
875
- font-weight: 400;
876
- line-height: 1.42857143;
877
- text-align: center;
878
- white-space: nowrap;
879
- vertical-align: middle;
880
- cursor: pointer;
881
- user-select: none;
882
- background-image: none;
883
- text-decoration: none!important;
884
- border: 1px solid transparent;
885
- border-radius: 4px;
886
- box-shadow: none;
887
- outline: none;
888
- opacity: 1;
889
- transition-timing-function: ease-out;
890
- transition-duration: 0.3s;
891
- transition-property: color, opacity, border-color, background-color;
892
- }
893
-
894
- @media only screen and (max-width: 600px) {
895
- .foogallery .fg-caption-buttons {
896
- align-items: stretch;
897
- }
898
- .foogallery .fg-caption-buttons > a {
899
- flex: 1;
900
- }
901
- }
902
-
903
- /* Light */
904
- .foogallery .fg-caption .fg-caption-buttons > a {
905
- color: #333;
906
- background-color: #fff;
907
- border-color: #ccc;
908
- }
909
- .foogallery .fg-caption .fg-caption-buttons > a:not(.fg-disabled):hover {
910
- color: #333;
911
- background-color: #e6e6e6;
912
- border-color: #adadad;
913
- border-bottom: solid 1px;
914
- }
915
- .foogallery .fg-caption .fg-caption-buttons > a.fg-disabled {
916
- color: #9d9d9d;
917
- }
918
- .foogallery .fg-caption .fg-caption-buttons > a.fg-disabled:hover {
919
- border-bottom: solid 1px;
920
- }
921
-
922
- /* Dark */
923
- .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a {
924
- color: #FFF;
925
- background-color: #444;
926
- border-color: #333;
927
- }
928
- .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a:not(.fg-disabled):hover {
929
- color: #9d9d9d;
930
- background-color: #333;
931
- border-color: #222;
932
- }
933
- .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a.fg-disabled {
934
- color: #9d9d9d;
935
- }
936
- .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a.fg-disabled:hover {
937
- border-bottom: solid 1px;
938
- }
939
-
940
- /* Always */
941
- .foogallery.fg-caption-always .fg-item .fg-caption .fg-caption-inner:before {
942
- display: none;
943
- }
944
- .foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption {
945
- left: 0;
946
- bottom: 0;
947
- transition-timing-function: ease;
948
- transition-duration: 300ms;
949
- transition-property: visibility, opacity;
950
- visibility: visible;
951
- opacity: 1;
952
- }
953
- .foogallery.fg-caption-always .fg-caption {
954
- text-align: left;
955
- }
956
-
957
- /* On Hover */
958
- .foogallery.fg-caption-hover .fg-caption .fg-caption-inner {
959
- display: flex;
960
- flex-direction: column;
961
- align-items: center;
962
- justify-content: center;
963
- width: 100%;
964
- max-height: 100%;
965
- position: absolute;
966
- top: 50%;
967
- left: 0;
968
- transform: translateY(-50%);
969
- padding: 0.4em;
970
- }
971
- .foogallery.fg-caption-hover .fg-item.fg-loaded .fg-image-overlay {
972
- display: none;
973
- }
974
-
975
- /* Alignment */
976
- .foogallery.fg-c-l .fg-caption,
977
- .foogallery.fg-caption-always.fg-c-l .fg-caption {
978
- text-align: left;
979
- }
980
- .foogallery.fg-c-c .fg-caption,
981
- .foogallery.fg-caption-always.fg-c-c .fg-caption {
982
- text-align: center;
983
- }
984
- .foogallery.fg-c-r .fg-caption,
985
- .foogallery.fg-caption-always.fg-c-r .fg-caption {
986
- text-align: right;
987
- }
988
- .foogallery.fg-c-j .fg-caption,
989
- .foogallery.fg-caption-always.fg-c-j .fg-caption {
990
- text-align: justify;
991
- }
992
- /* Icon & Overlay */
993
- .foogallery .fg-image-overlay:before {
994
- content: "";
995
- display: block;
996
- position: absolute;
997
- top: 50%;
998
- left: 50%;
999
- transform: translateX(-50%) translateY(-50%);
1000
- width: 32px;
1001
- height: 32px;
1002
- background-size: 32px 32px;
1003
- background-position: center center;
1004
- background-repeat: no-repeat;
1005
- min-width: 32px;
1006
- min-height: 32px;
1007
- }
1008
- .foogallery .fg-caption-inner:before {
1009
- content: "";
1010
- display: none;
1011
- position: relative;
1012
- width: 32px;
1013
- height: 32px;
1014
- margin: 0.4em;
1015
- background-size: 32px 32px;
1016
- vertical-align: middle;
1017
- background-position: center center;
1018
- background-repeat: no-repeat;
1019
- min-width: 32px;
1020
- min-height: 32px;
1021
- }
1022
- .foogallery.fg-hover-zoom:not(.fg-preset) .fg-caption-inner:before,
1023
- .foogallery.fg-hover-zoom2:not(.fg-preset) .fg-caption-inner:before,
1024
- .foogallery.fg-hover-zoom3:not(.fg-preset) .fg-caption-inner:before,
1025
- .foogallery.fg-hover-plus:not(.fg-preset) .fg-caption-inner:before,
1026
- .foogallery.fg-hover-circle-plus:not(.fg-preset) .fg-caption-inner:before,
1027
- .foogallery.fg-hover-eye:not(.fg-preset) .fg-caption-inner:before,
1028
- .foogallery.fg-hover-external:not(.fg-preset) .fg-caption-inner:before,
1029
- .foogallery.fg-hover-tint:not(.fg-preset) .fg-caption-inner:before,
1030
- .foogallery.fg-hover-cart:not(.fg-preset) .fg-caption-inner:before,
1031
- .foogallery.fg-video-default:not(.fg-preset) .fg-caption-inner:before,
1032
- .foogallery.fg-video-1:not(.fg-preset) .fg-caption-inner:before,
1033
- .foogallery.fg-video-2:not(.fg-preset) .fg-caption-inner:before,
1034
- .foogallery.fg-video-3:not(.fg-preset) .fg-caption-inner:before,
1035
- .foogallery.fg-video-4:not(.fg-preset) .fg-caption-inner:before {
1036
- display: block;
1037
- }
1038
-
1039
- .foogallery.fg-hover-zoom:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1040
- .foogallery.fg-hover-zoom2:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1041
- .foogallery.fg-hover-zoom3:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1042
- .foogallery.fg-hover-plus:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1043
- .foogallery.fg-hover-circle-plus:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1044
- .foogallery.fg-hover-eye:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1045
- .foogallery.fg-hover-external:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1046
- .foogallery.fg-hover-tint:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1047
- .foogallery.fg-hover-cart:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1048
- .foogallery.fg-video-default:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1049
- .foogallery.fg-video-1:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1050
- .foogallery.fg-video-2:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1051
- .foogallery.fg-video-3:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1052
- .foogallery.fg-video-4:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay {
1053
- visibility: visible;
1054
- opacity: 1;
1055
- }
1056
- .foogallery.fg-video-sticky .fg-type-video.fg-loaded .fg-item-inner .fg-image-overlay {
1057
- background-color: transparent;
1058
- visibility: visible;
1059
- opacity: 1;
1060
- display: block;
1061
- }
1062
- .foogallery.fg-video-sticky .fg-type-video .fg-caption-inner:before {
1063
- display: none;
1064
- }
1065
-
1066
- .foogallery.fg-hover-zoom .fg-image-overlay:before,
1067
- .foogallery.fg-hover-zoom .fg-caption-inner:before {
1068
- background-image: url('../img/icons.svg#zoom-light');
1069
- }
1070
- .foogallery.fg-light-overlays.fg-hover-zoom .fg-image-overlay:before,
1071
- .foogallery.fg-light-overlays.fg-hover-zoom .fg-caption-inner:before {
1072
- background-image: url('../img/icons.svg#zoom-dark');
1073
- }
1074
-
1075
- .foogallery.fg-hover-zoom2 .fg-image-overlay:before,
1076
- .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
1077
- background-image: url('../img/icons.svg#zoom2-light');
1078
- }
1079
- .foogallery.fg-light-overlays.fg-hover-zoom2 .fg-image-overlay:before,
1080
- .foogallery.fg-light-overlays.fg-hover-zoom2 .fg-caption-inner:before {
1081
- background-image: url('../img/icons.svg#zoom2-dark');
1082
- }
1083
-
1084
- .foogallery.fg-hover-zoom3 .fg-image-overlay:before,
1085
- .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
1086
- background-image: url('../img/icons.svg#zoom3-light');
1087
- }
1088
- .foogallery.fg-light-overlays.fg-hover-zoom3 .fg-image-overlay:before,
1089
- .foogallery.fg-light-overlays.fg-hover-zoom3 .fg-caption-inner:before {
1090
- background-image: url('../img/icons.svg#zoom3-dark');
1091
- }
1092
-
1093
- .foogallery.fg-hover-plus .fg-image-overlay:before,
1094
- .foogallery.fg-hover-plus .fg-caption-inner:before {
1095
- background-image: url('../img/icons.svg#plus-light');
1096
- }
1097
- .foogallery.fg-light-overlays.fg-hover-plus .fg-image-overlay:before,
1098
- .foogallery.fg-light-overlays.fg-hover-plus .fg-caption-inner:before {
1099
- background-image: url('../img/icons.svg#plus-dark');
1100
- }
1101
-
1102
- .foogallery.fg-hover-circle-plus .fg-image-overlay:before,
1103
- .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
1104
- background-image: url('../img/icons.svg#circle-plus-light');
1105
- }
1106
- .foogallery.fg-light-overlays.fg-hover-circle-plus .fg-image-overlay:before,
1107
- .foogallery.fg-light-overlays.fg-hover-circle-plus .fg-caption-inner:before {
1108
- background-image: url('../img/icons.svg#circle-plus-dark');
1109
- }
1110
-
1111
- .foogallery.fg-hover-eye .fg-image-overlay:before,
1112
- .foogallery.fg-hover-eye .fg-caption-inner:before {
1113
- background-image: url('../img/icons.svg#eye-light');
1114
- }
1115
- .foogallery.fg-light-overlays.fg-hover-eye .fg-image-overlay:before,
1116
- .foogallery.fg-light-overlays.fg-hover-eye .fg-caption-inner:before {
1117
- background-image: url('../img/icons.svg#eye-dark');
1118
- }
1119
-
1120
- .foogallery.fg-hover-external .fg-image-overlay:before,
1121
- .foogallery.fg-hover-external .fg-caption-inner:before {
1122
- background-image: url('../img/icons.svg#external-light');
1123
- }
1124
- .foogallery.fg-light-overlays.fg-hover-external .fg-image-overlay:before,
1125
- .foogallery.fg-light-overlays.fg-hover-external .fg-caption-inner:before {
1126
- background-image: url('../img/icons.svg#external-dark');
1127
- }
1128
-
1129
- .foogallery.fg-hover-cart .fg-image-overlay:before,
1130
- .foogallery.fg-hover-cart .fg-caption-inner:before {
1131
- background-image: url('../img/icons.svg#cart-light');
1132
- }
1133
- .foogallery.fg-light-overlays.fg-hover-cart .fg-image-overlay:before,
1134
- .foogallery.fg-light-overlays.fg-hover-cart .fg-caption-inner:before {
1135
- background-image: url('../img/icons.svg#cart-dark');
1136
- }
1137
-
1138
- .foogallery.fg-video-default .fg-type-video .fg-image-overlay:before,
1139
- .foogallery.fg-video-default .fg-type-video .fg-caption-inner:before {
1140
- background-image: url('../img/icons.svg#video-default-light');
1141
- }
1142
- .foogallery.fg-light-overlays.fg-video-default .fg-type-video .fg-image-overlay:before,
1143
- .foogallery.fg-light-overlays.fg-video-default .fg-type-video .fg-caption-inner:before {
1144
- background-image: url('../img/icons.svg#video-default-dark');
1145
- }
1146
-
1147
- .foogallery.fg-video-1 .fg-type-video .fg-image-overlay:before,
1148
- .foogallery.fg-video-1 .fg-type-video .fg-caption-inner:before {
1149
- background-image: url('../img/icons.svg#video-1-light');
1150
- }
1151
- .foogallery.fg-light-overlays.fg-video-1 .fg-type-video .fg-image-overlay:before,
1152
- .foogallery.fg-light-overlays.fg-video-1 .fg-type-video .fg-caption-inner:before {
1153
- background-image: url('../img/icons.svg#video-1-dark');
1154
- }
1155
-
1156
- .foogallery.fg-video-2 .fg-type-video .fg-image-overlay:before,
1157
- .foogallery.fg-video-2 .fg-type-video .fg-caption-inner:before {
1158
- background-image: url('../img/icons.svg#video-2-light');
1159
- }
1160
- .foogallery.fg-light-overlays.fg-video-2 .fg-type-video .fg-image-overlay:before,
1161
- .foogallery.fg-light-overlays.fg-video-2 .fg-type-video .fg-caption-inner:before {
1162
- background-image: url('../img/icons.svg#video-2-dark');
1163
- }
1164
-
1165
- .foogallery.fg-video-3 .fg-type-video .fg-image-overlay:before,
1166
- .foogallery.fg-video-3 .fg-type-video .fg-caption-inner:before {
1167
- background-image: url('../img/icons.svg#video-3-light');
1168
- }
1169
- .foogallery.fg-light-overlays.fg-video-3 .fg-type-video .fg-image-overlay:before,
1170
- .foogallery.fg-light-overlays.fg-video-3 .fg-type-video .fg-caption-inner:before {
1171
- background-image: url('../img/icons.svg#video-3-dark');
1172
- }
1173
-
1174
- .foogallery.fg-video-4 .fg-type-video .fg-image-overlay:before,
1175
- .foogallery.fg-video-4 .fg-type-video .fg-caption-inner:before {
1176
- background-image: url('../img/icons.svg#video-4-light');
1177
- }
1178
- .foogallery.fg-light-overlays.fg-video-4 .fg-type-video .fg-image-overlay:before,
1179
- .foogallery.fg-light-overlays.fg-video-4 .fg-type-video .fg-caption-inner:before {
1180
- background-image: url('../img/icons.svg#video-4-dark');
1181
- }
1182
- /* Transitions */
1183
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption,
1184
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption,
1185
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1186
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1187
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1188
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,
1189
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,
1190
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-loaded .fg-caption,
1191
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-loaded .fg-caption,
1192
- .foogallery.fg-caption-hover.fg-hover-scale .fg-loaded .fg-caption,
1193
- .foogallery.fg-hover-instant .fg-loaded .fg-image-overlay,
1194
- .foogallery.fg-hover-fade .fg-loaded .fg-image-overlay,
1195
- .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1196
- .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1197
- .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1198
- .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1199
- .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1200
- .foogallery.fg-hover-colorize .fg-loaded .fg-image-overlay,
1201
- .foogallery.fg-hover-grayscale .fg-loaded .fg-image-overlay,
1202
- .foogallery.fg-hover-scale .fg-item.fg-loaded,
1203
- .foogallery.fg-hover-scale .fg-loaded .fg-image-overlay,
1204
- .foogallery.fg-hover-zoomed .fg-loaded .fg-image,
1205
- .foogallery.fg-hover-colorize .fg-loaded .fg-image,
1206
- .foogallery.fg-hover-grayscale .fg-loaded .fg-image {
1207
- transition-timing-function: ease;
1208
- transition-duration: 300ms;
1209
- backface-visibility: hidden;
1210
- }
1211
- /* Colorize */
1212
- .foogallery.fg-hover-colorize .fg-image {
1213
- filter: grayscale(100%);
1214
- transition-property: filter;
1215
- }
1216
- .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image,
1217
- .foogallery.fg-hover-colorize .fg-item-inner:focus-within .fg-image {
1218
- filter: grayscale(0%);
1219
- }
1220
- .foogallery.fg-hover-colorize .fg-image-overlay,
1221
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption {
1222
- display: block;
1223
- left: 0;
1224
- top: 0;
1225
- bottom: 0;
1226
- transition-property: visibility, opacity, background-color;
1227
- }
1228
- .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image-overlay,
1229
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption,
1230
- .foogallery.fg-hover-colorize .fg-item-inner:focus-within .fg-image-overlay,
1231
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:focus-within .fg-caption {
1232
- visibility: visible;
1233
- opacity: 1;
1234
- }
1235
- /* Fade */
1236
- .foogallery.fg-hover-fade .fg-loaded .fg-image-overlay,
1237
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption {
1238
- display: block;
1239
- left: 0;
1240
- top: 0;
1241
- bottom: 0;
1242
- transition-property: visibility, opacity, background-color;
1243
- }
1244
- .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1245
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption,
1246
- .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1247
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:focus-within .fg-caption {
1248
- visibility: visible;
1249
- opacity: 1;
1250
- }
1251
- /* Grayscale */
1252
- .foogallery.fg-hover-grayscale .fg-image {
1253
- filter: grayscale(0%);
1254
- transition-property: filter;
1255
- }
1256
- .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image,
1257
- .foogallery.fg-hover-grayscale .fg-item-inner:focus-within .fg-image {
1258
- filter: grayscale(100%);
1259
- }
1260
- .foogallery.fg-hover-grayscale .fg-image-overlay,
1261
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption {
1262
- display: block;
1263
- left: 0;
1264
- top: 0;
1265
- bottom: 0;
1266
- transition-property: visibility, opacity, background-color;
1267
- }
1268
- .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image-overlay,
1269
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption,
1270
- .foogallery.fg-hover-grayscale .fg-item-inner:focus-within .fg-image-overlay,
1271
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:focus-within .fg-caption {
1272
- visibility: visible;
1273
- opacity: 1;
1274
- }
1275
- /* Instant */
1276
- .foogallery.fg-hover-instant .fg-loaded .fg-image-overlay,
1277
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption {
1278
- display: block;
1279
- left: 0;
1280
- top: 0;
1281
- bottom: 0;
1282
- transition-property: none;
1283
- }
1284
- .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1285
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption,
1286
- .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1287
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:focus-within .fg-caption {
1288
- visibility: visible;
1289
- opacity: 1;
1290
- }
1291
- /* Push */
1292
- .foogallery.fg-hover-push .fg-loaded .fg-image-overlay,
1293
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1294
- display: block;
1295
- left: 0;
1296
- top: 0;
1297
- bottom: 0;
1298
- transform: translateX(100%);
1299
- visibility: visible;
1300
- opacity: 1;
1301
- }
1302
- .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1303
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1304
- transition-property: transform;
1305
- }
1306
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption,
1307
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:focus-within .fg-caption {
1308
- transform: translateY(0);
1309
- }
1310
- .foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1311
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1312
- .foogallery.fg-hover-push .fg-loaded .fg-item-inner .fg-thumb:focus,
1313
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner .fg-thumb:focus {
1314
- transform: translateX(-100%);
1315
- }
1316
- /* Scale */
1317
- .foogallery.fg-hover-scale .fg-item {
1318
- transition-property: transform;
1319
- z-index: 4;
1320
- }
1321
-
1322
- .foogallery.fg-hover-scale .fg-item:hover,
1323
- .foogallery.fg-hover-scale .fg-item:focus-within {
1324
- transform: scale(1.048);
1325
- z-index: 10;
1326
- }
1327
- .foogallery.fg-hover-scale .fg-image-overlay,
1328
- .foogallery.fg-caption-hover.fg-hover-scale .fg-caption {
1329
- display: block;
1330
- left: 0;
1331
- top: 0;
1332
- bottom: 0;
1333
- transition-property: visibility, opacity, background-color;
1334
- }
1335
- .foogallery.fg-hover-scale .fg-item-inner:hover .fg-image-overlay,
1336
- .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption,
1337
- .foogallery.fg-hover-scale .fg-item-inner:focus-within .fg-image-overlay,
1338
- .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:focus-within .fg-caption {
1339
- visibility: visible;
1340
- opacity: 1;
1341
- }
1342
- /* Zoomed */
1343
- .foogallery.fg-hover-zoomed .fg-image {
1344
- transition-property: transform;
1345
- z-index: 4;
1346
- }
1347
- .foogallery.fg-hover-zoomed .fg-item:hover .fg-image,
1348
- .foogallery.fg-hover-zoomed .fg-item:focus-within .fg-image {
1349
- transform: scale(1.15);
1350
- }
1351
- .foogallery.fg-hover-zoomed .fg-image-wrap {
1352
- overflow: hidden;
1353
- }
1354
-
1355
- .foogallery.fg-hover-zoomed .fg-image-overlay,
1356
- .foogallery.fg-caption-hover.fg-hover-zoomed .fg-caption {
1357
- display: block;
1358
- left: 0;
1359
- top: 0;
1360
- bottom: 0;
1361
- transition-property: visibility, opacity, background-color;
1362
- }
1363
- .foogallery.fg-hover-zoomed .fg-item-inner:hover .fg-image-overlay,
1364
- .foogallery.fg-caption-hover.fg-hover-zoomed .fg-item-inner:hover .fg-caption,
1365
- .foogallery.fg-hover-zoomed .fg-item-inner:focus-within .fg-image-overlay,
1366
- .foogallery.fg-caption-hover.fg-hover-zoomed .fg-item-inner:focus-within .fg-caption {
1367
- visibility: visible;
1368
- opacity: 1;
1369
- }
1370
- /* Slide */
1371
- .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1372
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1373
- .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1374
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1375
- .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1376
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1377
- .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1378
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1379
- display: block;
1380
- left: 0;
1381
- top: 0;
1382
- bottom: 0;
1383
- transition-property: transform, background-color, opacity, visibility;
1384
- visibility: visible;
1385
- opacity: 1;
1386
- }
1387
- .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1388
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,
1389
- .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1390
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,
1391
- .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1392
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,
1393
- .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1394
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption,
1395
- .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1396
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:focus-within .fg-caption,
1397
- .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1398
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:focus-within .fg-caption,
1399
- .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1400
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:focus-within .fg-caption,
1401
- .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1402
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:focus-within .fg-caption {
1403
- transform: translateY(0) translateX(0);
1404
- }
1405
-
1406
-
1407
- /* Slide Up */
1408
- .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1409
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption {
1410
- transform: translateY(100%);
1411
- }
1412
-
1413
- /* Slide Down */
1414
- .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1415
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption {
1416
- transform: translateY(-100%);
1417
- }
1418
-
1419
- /* Slide Left */
1420
- .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1421
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption {
1422
- transform: translateX(100%);
1423
- }
1424
-
1425
- /* Slide Right */
1426
- .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1427
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1428
- transform: translateX(-100%);
1429
- }
1430
- .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1431
- box-sizing: border-box;
1432
- }
1433
- .fg-paging-container {
1434
- display: block;
1435
- padding: 15px;
1436
- margin-top: 0!important;
1437
- margin-bottom: 0!important;
1438
- margin-left: auto;
1439
- margin-right: auto;
1440
- text-align: center;
1441
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1442
- -webkit-user-select: none;
1443
- -moz-user-select: none;
1444
- -ms-user-select: none;
1445
- user-select: none;
1446
- }
1447
- .fg-ph-dots:after {
1448
- display: block;
1449
- content: '';
1450
- width: 0;
1451
- height: 22px;
1452
- }
1453
-
1454
- .fg-paging-container .fg-dots,
1455
- .fg-paging-container .fg-dot-item {
1456
- display: inline-block;
1457
- margin: 0;
1458
- padding: 0;
1459
- outline: none;
1460
- list-style: none;
1461
- }
1462
- .fg-paging-container .fg-dot-item .fg-dot-link {
1463
- display: inline-block;
1464
- margin: 3px;
1465
- font-weight: 400;
1466
- line-height: 1.42857143;
1467
- text-align: center;
1468
- white-space: nowrap;
1469
- vertical-align: middle;
1470
- cursor: pointer;
1471
- user-select: none;
1472
- background-image: none;
1473
- text-decoration: none;
1474
- border: 1px solid transparent;
1475
- position: relative;
1476
- border-radius: 50%;
1477
- padding: 0;
1478
- font-size: 0;
1479
- outline: none;
1480
- color: transparent;
1481
- box-shadow: none;
1482
- }
1483
- .fg-paging-container .fg-dot-item .fg-dot-link:before {
1484
- content: "";
1485
- background-color: transparent;
1486
- border: 1px solid transparent;
1487
- display: block;
1488
- border-radius: 50%;
1489
- width: 9px;
1490
- height: 9px;
1491
- padding: 0;
1492
- margin: 2px;
1493
- }
1494
- .fg-paging-container .fg-dot-item .fg-dot-link:active,
1495
- .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1496
- .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1497
- text-decoration: none;
1498
- box-shadow: none;
1499
- outline: none;
1500
- }
1501
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1502
- .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1503
- cursor: not-allowed;
1504
- pointer-events: none;
1505
- }
1506
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1507
- cursor: not-allowed;
1508
- pointer-events: none;
1509
- outline: none;
1510
- }
1511
-
1512
- /* Light - Dots */
1513
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1514
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1515
- transition-timing-function: ease-out;
1516
- transition-duration: 0.3s;
1517
- transition-property: color, border-color, background-color;
1518
- }
1519
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1520
- background-color: #eee;
1521
- border-color: #9d9d9d;
1522
- }
1523
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1524
- border-color: #888;
1525
- }
1526
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1527
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1528
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1529
- background-color: #666;
1530
- border-color: #888;
1531
- }
1532
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1533
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1534
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1535
- background-color: #eee;
1536
- border-color: #9d9d9d;
1537
- opacity: 0.5;
1538
- }
1539
-
1540
- /* Dark - Dots */
1541
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1542
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1543
- transition-timing-function: ease-out;
1544
- transition-duration: 0.3s;
1545
- transition-property: color, border-color, background-color;
1546
- }
1547
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1548
- background-color: #666;
1549
- border-color: #333;
1550
- }
1551
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1552
- border-color: #444;
1553
- }
1554
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1555
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1556
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1557
- background-color: #333;
1558
- border-color: #444;
1559
- }
1560
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1561
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1562
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1563
- background-color: #666;
1564
- border-color: #333;
1565
- opacity: 0.5;
1566
- }
1567
- .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1568
- box-sizing: border-box;
1569
- }
1570
- .fg-paging-container {
1571
- display: block;
1572
- padding: 15px;
1573
- margin-top: 0!important;
1574
- margin-bottom: 0!important;
1575
- margin-left: auto;
1576
- margin-right: auto;
1577
- text-align: center;
1578
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1579
- -webkit-user-select: none;
1580
- -moz-user-select: none;
1581
- -ms-user-select: none;
1582
- user-select: none;
1583
- }
1584
- .fg-ph-dots:after {
1585
- display: block;
1586
- content: '';
1587
- width: 0;
1588
- height: 22px;
1589
- }
1590
-
1591
- .fg-paging-container .fg-dots,
1592
- .fg-paging-container .fg-dot-item {
1593
- display: inline-block;
1594
- margin: 0;
1595
- padding: 0;
1596
- outline: none;
1597
- list-style: none;
1598
- }
1599
- .fg-paging-container .fg-dot-item .fg-dot-link {
1600
- display: inline-block;
1601
- margin: 3px;
1602
- font-weight: 400;
1603
- line-height: 1.42857143;
1604
- text-align: center;
1605
- white-space: nowrap;
1606
- vertical-align: middle;
1607
- cursor: pointer;
1608
- user-select: none;
1609
- background-image: none;
1610
- text-decoration: none;
1611
- border: 1px solid transparent;
1612
- position: relative;
1613
- border-radius: 50%;
1614
- padding: 0;
1615
- font-size: 0;
1616
- outline: none;
1617
- color: transparent;
1618
- box-shadow: none;
1619
- }
1620
- .fg-paging-container .fg-dot-item .fg-dot-link:before {
1621
- content: "";
1622
- background-color: transparent;
1623
- border: 1px solid transparent;
1624
- display: block;
1625
- border-radius: 50%;
1626
- width: 9px;
1627
- height: 9px;
1628
- padding: 0;
1629
- margin: 2px;
1630
- }
1631
- .fg-paging-container .fg-dot-item .fg-dot-link:active,
1632
- .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1633
- .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1634
- text-decoration: none;
1635
- box-shadow: none;
1636
- outline: none;
1637
- }
1638
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1639
- .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1640
- cursor: not-allowed;
1641
- pointer-events: none;
1642
- }
1643
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1644
- cursor: not-allowed;
1645
- pointer-events: none;
1646
- outline: none;
1647
- }
1648
-
1649
- /* Light - Dots */
1650
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1651
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1652
- transition-timing-function: ease-out;
1653
- transition-duration: 0.3s;
1654
- transition-property: color, border-color, background-color;
1655
- }
1656
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1657
- background-color: #eee;
1658
- border-color: #9d9d9d;
1659
- }
1660
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1661
- border-color: #888;
1662
- }
1663
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1664
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1665
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1666
- background-color: #666;
1667
- border-color: #888;
1668
- }
1669
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1670
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1671
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1672
- background-color: #eee;
1673
- border-color: #9d9d9d;
1674
- opacity: 0.5;
1675
- }
1676
-
1677
- /* Dark - Dots */
1678
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1679
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1680
- transition-timing-function: ease-out;
1681
- transition-duration: 0.3s;
1682
- transition-property: color, border-color, background-color;
1683
- }
1684
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1685
- background-color: #666;
1686
- border-color: #333;
1687
- }
1688
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1689
- border-color: #444;
1690
- }
1691
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1692
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1693
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1694
- background-color: #333;
1695
- border-color: #444;
1696
- }
1697
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1698
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1699
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1700
- background-color: #666;
1701
- border-color: #333;
1702
- opacity: 0.5;
1703
- }
1704
- /* Base styles */
1705
- .fg-default:after {
1706
- content: '';
1707
- display: block;
1708
- clear: both;
1709
- }
1710
-
1711
- .fg-default .fg-item {
1712
- display: inline-block;
1713
- vertical-align: top;
1714
- max-width: 100%;
1715
- }
1716
- .fg-default .fg-item-inner,
1717
- .fg-default .fg-thumb {
1718
- display: block;
1719
- vertical-align: top;
1720
- max-width: 100%;
1721
- }
1722
-
1723
- .fg-default .fg-image {
1724
- border-radius: 0;
1725
- display: block;
1726
- max-width: 100%;
1727
- height: auto;
1728
- margin: 0;
1729
- padding: 0;
1730
- }
1731
-
1732
- /* Horizontal alignment */
1733
- .fg-default .fg-image {
1734
- vertical-align: top;
1735
- }
1736
-
1737
- .fg-default.fg-left {
1738
- text-align: left;
1739
- }
1740
-
1741
- .fg-default.fg-center {
1742
- text-align: center;
1743
- }
1744
-
1745
- .fg-default.fg-right {
1746
- text-align: right;
1747
- }
1748
-
1749
- /* Gutter widths */
1750
- .fg-default.fg-gutter-5 {
1751
- padding-left: 5px;
1752
- margin-bottom: -5px;
1753
- }
1754
- .fg-default.fg-gutter-5 .fg-item {
1755
- margin-right: 5px;
1756
- margin-bottom: 5px;
1757
- }
1758
-
1759
- .fg-default.fg-gutter-10 {
1760
- padding-left: 10px;
1761
- margin-bottom: -10px;
1762
- }
1763
- .fg-default.fg-gutter-10 .fg-item {
1764
- margin-right: 10px;
1765
- margin-bottom: 10px;
1766
- }
1767
-
1768
- .fg-default.fg-gutter-15 {
1769
- padding-left: 15px;
1770
- margin-bottom: -15px;
1771
- }
1772
- .fg-default.fg-gutter-15 .fg-item {
1773
- margin-right: 15px;
1774
- margin-bottom: 15px;
1775
- }
1776
-
1777
- .fg-default.fg-gutter-20 {
1778
- padding-left: 20px;
1779
- margin-bottom: -20px;
1780
- }
1781
- .fg-default.fg-gutter-20 .fg-item {
1782
- margin-right: 20px;
1783
- margin-bottom: 20px;
1784
- }
1785
-
1786
- .fg-default.fg-gutter-25 {
1787
- padding-left: 25px;
1788
- margin-bottom: -25px;
1789
- }
1790
- .fg-default.fg-gutter-25 .fg-item {
1791
- margin-right: 25px;
1792
- margin-bottom: 25px;
1793
- }
1794
-
1795
-
1796
- @media only screen and (max-width: 600px){
1797
- .fg-default.fg-m-col1 .fg-image,
1798
- .fg-default.fg-m-col2 .fg-image,
1799
- .fg-default.fg-m-col3 .fg-image {
1800
- width: 100%;
1801
- }
1802
- .fg-default.fg-m-col1.fg-gutter-5 .fg-item {
1803
- width: calc(100% - 10px);
1804
- min-width: calc(100% - 10px);
1805
- max-width: calc(100% - 10px);
1806
- }
1807
- .fg-default.fg-m-col2.fg-gutter-5 .fg-item {
1808
- width: calc(50% - 10px);
1809
- min-width: calc(50% - 10px);
1810
- max-width: calc(50% - 10px);
1811
- }
1812
- .fg-default.fg-m-col3.fg-gutter-5 .fg-item {
1813
- width: calc(33.33% - 10px);
1814
- min-width: calc(33.33% - 10px);
1815
- max-width: calc(33.33% - 10px);
1816
- }
1817
-
1818
- .fg-default.fg-m-col1.fg-gutter-10 .fg-item {
1819
- width: calc(100% - 20px);
1820
- min-width: calc(100% - 20px);
1821
- max-width: calc(100% - 20px);
1822
- }
1823
- .fg-default.fg-m-col2.fg-gutter-10 .fg-item {
1824
- width: calc(50% - 20px);
1825
- min-width: calc(50% - 20px);
1826
- max-width: calc(50% - 20px);
1827
- }
1828
- .fg-default.fg-m-col3.fg-gutter-10 .fg-item {
1829
- width: calc(33.33% - 20px);
1830
- min-width: calc(33.33% - 20px);
1831
- max-width: calc(33.33% - 20px);
1832
- }
1833
-
1834
- .fg-default.fg-m-col1.fg-gutter-15 .fg-item {
1835
- width: calc(100% - 30px);
1836
- min-width: calc(100% - 30px);
1837
- max-width: calc(100% - 30px);
1838
- }
1839
- .fg-default.fg-m-col2.fg-gutter-15 .fg-item {
1840
- width: calc(50% - 30px);
1841
- min-width: calc(50% - 30px);
1842
- max-width: calc(50% - 30px);
1843
- }
1844
- .fg-default.fg-m-col3.fg-gutter-15 .fg-item {
1845
- width: calc(33.33% - 30px);
1846
- min-width: calc(33.33% - 30px);
1847
- max-width: calc(33.33% - 30px);
1848
- }
1849
-
1850
- .fg-default.fg-m-col1.fg-gutter-20 .fg-item {
1851
- width: calc(100% - 40px);
1852
- min-width: calc(100% - 40px);
1853
- max-width: calc(100% - 40px);
1854
- }
1855
- .fg-default.fg-m-col2.fg-gutter-20 .fg-item {
1856
- width: calc(50% - 40px);
1857
- min-width: calc(50% - 40px);
1858
- max-width: calc(50% - 40px);
1859
- }
1860
- .fg-default.fg-m-col3.fg-gutter-20 .fg-item {
1861
- width: calc(33.33% - 40px);
1862
- min-width: calc(33.33% - 40px);
1863
- max-width: calc(33.33% - 40px);
1864
- }
1865
-
1866
- .fg-default.fg-m-col1.fg-gutter-25 .fg-item {
1867
- width: calc(100% - 50px);
1868
- min-width: calc(100% - 50px);
1869
- max-width: calc(100% - 50px);
1870
- }
1871
- .fg-default.fg-m-col2.fg-gutter-25 .fg-item {
1872
- width: calc(50% - 50px);
1873
- min-width: calc(50% - 50px);
1874
- max-width: calc(50% - 50px);
1875
- }
1876
- .fg-default.fg-m-col3.fg-gutter-25 .fg-item {
1877
- width: calc(33.33% - 50px);
1878
- min-width: calc(33.33% - 50px);
1879
- max-width: calc(33.33% - 50px);
1880
- }
1881
- }
1882
- /* Base styles */
1883
- .fg-masonry * {
1884
- box-sizing: border-box;
1885
- }
1886
- .foogallery.fg-masonry {
1887
- margin: 0 auto;
1888
- text-align: center;
1889
- }
1890
- .fg-masonry .fg-thumb {
1891
- display: block;
1892
- }
1893
- .fg-masonry.fg-fixed .fg-item,
1894
- .fg-masonry.fg-fixed .fg-image,
1895
- .fg-masonry.fg-fixed .fg-column-width {
1896
- max-width: 100%;
1897
- }
1898
-
1899
- .fg-masonry .fg-column-width {
1900
- display: inline-block;
1901
- border: solid 0 transparent;
1902
- }
1903
- .fg-masonry .fg-column-width,
1904
- .fg-masonry .fg-gutter-width {
1905
- position: absolute;
1906
- height: 0;
1907
- visibility: hidden;
1908
- opacity: 0;
1909
- pointer-events: none;
1910
- }
1911
-
1912
- .fg-masonry.fg-fixed .fg-item .fg-image,
1913
- .fg-masonry.fg-col6 .fg-item .fg-image,
1914
- .fg-masonry.fg-col5 .fg-item .fg-image,
1915
- .fg-masonry.fg-col4 .fg-item .fg-image,
1916
- .fg-masonry.fg-col3 .fg-item .fg-image,
1917
- .fg-masonry.fg-col2 .fg-item .fg-image {
1918
- width: 100%;
1919
- height: auto;
1920
- max-width: 100%;
1921
- }
1922
-
1923
- .fg-masonry .fg-item {
1924
- line-height: 0;
1925
- font-size: 0;
1926
- vertical-align: top;
1927
- }
1928
-
1929
- /* 2 column layouts */
1930
- /* 2 column layout - normal gutter */
1931
- .fg-masonry.fg-col2 .fg-item { margin-bottom: 1%; width: 49.5%; }
1932
- .fg-masonry.fg-col2 .fg-column-width { width: 49.5%; }
1933
- .fg-masonry.fg-col2 .fg-gutter-width { width: 1%; }
1934
-
1935
- /* 2 column layout - no gutter */
1936
- .fg-masonry.fg-col2.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1937
- .fg-masonry.fg-col2.fg-gutter-none .fg-column-width { width: 50%; }
1938
- .fg-masonry.fg-col2.fg-gutter-none .fg-gutter-width { width: 0; }
1939
-
1940
- /* 2 column layout - large gutter */
1941
- .fg-masonry.fg-col2.fg-gutter-large .fg-item { margin-bottom: 3%; width: 48.5%; }
1942
- .fg-masonry.fg-col2.fg-gutter-large .fg-column-width { width: 48.5%; }
1943
- .fg-masonry.fg-col2.fg-gutter-large .fg-gutter-width { width: 3%; }
1944
-
1945
- /* 3 column layouts */
1946
- /* 3 column layout - normal gutter */
1947
- .fg-masonry.fg-col3 .fg-item { margin-bottom: 1%; width: 32.66%; }
1948
- .fg-masonry.fg-col3 .fg-column-width { width: 32.66%; }
1949
- .fg-masonry.fg-col3 .fg-gutter-width { width: 1%; }
1950
-
1951
- /* 3 column layout - no gutter */
1952
- .fg-masonry.fg-col3.fg-gutter-none .fg-item { margin-bottom: 0; width: 33.33%; }
1953
- .fg-masonry.fg-col3.fg-gutter-none .fg-column-width { width: 33.33%; }
1954
- .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width { width: 0; }
1955
-
1956
- /* 3 column layout - large gutter */
1957
- .fg-masonry.fg-col3.fg-gutter-large .fg-item { margin-bottom: 3%; width: 31.33%; }
1958
- .fg-masonry.fg-col3.fg-gutter-large .fg-column-width { width: 31.33%; }
1959
- .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width { width: 3%; }
1960
-
1961
- /* 4 column layouts */
1962
- /* 4 column layout - normal gutter */
1963
- .fg-masonry.fg-col4 .fg-item { margin-bottom: 1%; width: 24.25%; }
1964
- .fg-masonry.fg-col4 .fg-column-width { width: 24.25%; }
1965
- .fg-masonry.fg-col4 .fg-gutter-width { width: 1%; }
1966
-
1967
- /* 4 column layout - no gutter */
1968
- .fg-masonry.fg-col4.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
1969
- .fg-masonry.fg-col4.fg-gutter-none .fg-column-width { width: 25%; }
1970
- .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width { width: 0; }
1971
-
1972
- /* 4 column layout - large gutter */
1973
- .fg-masonry.fg-col4.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22.75%; }
1974
- .fg-masonry.fg-col4.fg-gutter-large .fg-column-width { width: 22.75%; }
1975
- .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width { width: 3%; }
1976
-
1977
- /* 5 column layouts */
1978
- /* 5 column layout - normal gutter */
1979
- .fg-masonry.fg-col5 .fg-item { margin-bottom: 1%; width: 19.2%; }
1980
- .fg-masonry.fg-col5 .fg-column-width { width: 19.2%; }
1981
- .fg-masonry.fg-col5 .fg-gutter-width { width: 1%; }
1982
-
1983
- /* 5 column layout - no gutter */
1984
- .fg-masonry.fg-col5.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
1985
- .fg-masonry.fg-col5.fg-gutter-none .fg-column-width { width: 20%; }
1986
- .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width { width: 0; }
1987
-
1988
- /* 5 column layout - large gutter */
1989
- .fg-masonry.fg-col5.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17.6%; }
1990
- .fg-masonry.fg-col5.fg-gutter-large .fg-column-width { width: 17.6%; }
1991
- .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width { width: 3%; }
1992
-
1993
- /* 6 column layouts */
1994
- /* 6 column layout - normal gutter */
1995
- .fg-masonry.fg-col6 .fg-item { margin-bottom: 1%; width: 15.83%; }
1996
- .fg-masonry.fg-col6 .fg-column-width { width: 15.83%; }
1997
- .fg-masonry.fg-col6 .fg-gutter-width { width: 1%; }
1998
-
1999
- /* 6 column layout - no gutter */
2000
- .fg-masonry.fg-col6.fg-gutter-none .fg-item { margin-bottom: 0; width: 16.66%; }
2001
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width { width: 16.66%; }
2002
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width { width: 0; }
2003
-
2004
- /* 6 column layout - large gutter */
2005
- .fg-masonry.fg-col6.fg-gutter-large .fg-item { margin-bottom: 3%; width: 14.16%; }
2006
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width { width: 14.16%; }
2007
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width { width: 3%; }
2008
-
2009
- /* Force 5 column layout < 1280px */
2010
- @media screen and (max-width: 1280px) {
2011
- /* default gutter */
2012
- .fg-masonry.fg-col6 .fg-item { margin-bottom: 1%; width: 19.2%; }
2013
- .fg-masonry.fg-col6 .fg-column-width { width: 19.2%; }
2014
- .fg-masonry.fg-col6 .fg-gutter-width { width: 1%; }
2015
-
2016
- /* no gutter */
2017
- .fg-masonry.fg-col6.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
2018
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width { width: 20%; }
2019
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width { width: 0; }
2020
-
2021
- /* large gutter */
2022
- .fg-masonry.fg-col6.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17.6%; }
2023
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width { width: 17.6%; }
2024
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width { width: 3%; }
2025
- }
2026
-
2027
- /* Force 4 column layout < 1024px */
2028
- @media screen and (max-width: 1024px) {
2029
- /* default gutter */
2030
- .fg-masonry.fg-col6 .fg-item,
2031
- .fg-masonry.fg-col5 .fg-item { margin-bottom: 1%; width: 24.25%; }
2032
- .fg-masonry.fg-col6 .fg-column-width,
2033
- .fg-masonry.fg-col5 .fg-column-width { width: 24.25%; }
2034
- .fg-masonry.fg-col6 .fg-gutter-width,
2035
- .fg-masonry.fg-col5 .fg-gutter-width { width: 1%; }
2036
-
2037
- /* no gutter */
2038
- .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2039
- .fg-masonry.fg-col5.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
2040
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2041
- .fg-masonry.fg-col5.fg-gutter-none .fg-column-width { width: 25%; }
2042
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2043
- .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width { width: 0; }
2044
-
2045
- /* large gutter */
2046
- .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2047
- .fg-masonry.fg-col5.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22.75%; }
2048
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2049
- .fg-masonry.fg-col5.fg-gutter-large .fg-column-width { width: 22.75%; }
2050
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2051
- .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width { width: 3%; }
2052
- }
2053
-
2054
- /* Force 3 column layout < 720px */
2055
- @media screen and (max-width: 720px) {
2056
- /* default gutter */
2057
- .fg-masonry.fg-col6 .fg-item,
2058
- .fg-masonry.fg-col5 .fg-item,
2059
- .fg-masonry.fg-col4 .fg-item { margin-bottom: 1%; width: 32.66%; }
2060
- .fg-masonry.fg-col6 .fg-column-width,
2061
- .fg-masonry.fg-col5 .fg-column-width,
2062
- .fg-masonry.fg-col4 .fg-column-width { width: 32.66%; }
2063
- .fg-masonry.fg-col6 .fg-gutter-width,
2064
- .fg-masonry.fg-col5 .fg-gutter-width,
2065
- .fg-masonry.fg-col4 .fg-gutter-width { width: 1%; }
2066
-
2067
- /* no gutter */
2068
- .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2069
- .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2070
- .fg-masonry.fg-col4.fg-gutter-none .fg-item { margin-bottom: 0; width: 33.33%; }
2071
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2072
- .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2073
- .fg-masonry.fg-col4.fg-gutter-none .fg-column-width { width: 33.33%; }
2074
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2075
- .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2076
- .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width { width: 0; }
2077
-
2078
- /* large gutter */
2079
- .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2080
- .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2081
- .fg-masonry.fg-col4.fg-gutter-large .fg-item { margin-bottom: 3%; width: 31.33%; }
2082
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2083
- .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2084
- .fg-masonry.fg-col4.fg-gutter-large .fg-column-width { width: 31.33%; }
2085
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2086
- .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2087
- .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width { width: 3%; }
2088
-
2089
- }
2090
-
2091
- /* Force 2 column layout < 480px */
2092
- @media screen and (max-width: 480px) {
2093
- /* default gutter */
2094
- .fg-masonry.fg-col6 .fg-item,
2095
- .fg-masonry.fg-col5 .fg-item,
2096
- .fg-masonry.fg-col4 .fg-item,
2097
- .fg-masonry.fg-col3 .fg-item { margin-bottom: 1%; width: 49.5%; }
2098
- .fg-masonry.fg-col6 .fg-column-width,
2099
- .fg-masonry.fg-col5 .fg-column-width,
2100
- .fg-masonry.fg-col4 .fg-column-width,
2101
- .fg-masonry.fg-col3 .fg-column-width { width: 49.5%; }
2102
- .fg-masonry.fg-col6 .fg-gutter-width,
2103
- .fg-masonry.fg-col5 .fg-gutter-width,
2104
- .fg-masonry.fg-col4 .fg-gutter-width,
2105
- .fg-masonry.fg-col3 .fg-gutter-width { width: 1%; }
2106
-
2107
- /* no gutter */
2108
- .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2109
- .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2110
- .fg-masonry.fg-col4.fg-gutter-none .fg-item,
2111
- .fg-masonry.fg-col3.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
2112
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2113
- .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2114
- .fg-masonry.fg-col4.fg-gutter-none .fg-column-width,
2115
- .fg-masonry.fg-col3.fg-gutter-none .fg-column-width { width: 50%; }
2116
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2117
- .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2118
- .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width,
2119
- .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width { width: 0; }
2120
-
2121
- /* large gutter */
2122
- .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2123
- .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2124
- .fg-masonry.fg-col4.fg-gutter-large .fg-item,
2125
- .fg-masonry.fg-col3.fg-gutter-large .fg-item { margin-bottom: 3%; width: 48.5%; }
2126
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2127
- .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2128
- .fg-masonry.fg-col4.fg-gutter-large .fg-column-width,
2129
- .fg-masonry.fg-col3.fg-gutter-large .fg-column-width { width: 48.5%; }
2130
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2131
- .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2132
- .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width,
2133
- .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width { width: 3%; }
2134
- }
2135
-
2136
- /* Force 1 column layout < 320px */
2137
- @media screen and (max-width: 320px) {
2138
- /* default gutter */
2139
- .fg-masonry.fg-col6 .fg-item,
2140
- .fg-masonry.fg-col5 .fg-item,
2141
- .fg-masonry.fg-col4 .fg-item,
2142
- .fg-masonry.fg-col3 .fg-item,
2143
- .fg-masonry.fg-col2 .fg-item { margin-bottom: 1%; width: 100%; }
2144
- .fg-masonry.fg-col6 .fg-column-width,
2145
- .fg-masonry.fg-col5 .fg-column-width,
2146
- .fg-masonry.fg-col4 .fg-column-width,
2147
- .fg-masonry.fg-col3 .fg-column-width,
2148
- .fg-masonry.fg-col2 .fg-column-width { width: 100%; }
2149
- .fg-masonry.fg-col6 .fg-gutter-width,
2150
- .fg-masonry.fg-col5 .fg-gutter-width,
2151
- .fg-masonry.fg-col4 .fg-gutter-width,
2152
- .fg-masonry.fg-col3 .fg-gutter-width,
2153
- .fg-masonry.fg-col2 .fg-gutter-width { width: 0; }
2154
-
2155
- /* no gutter */
2156
- .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2157
- .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2158
- .fg-masonry.fg-col4.fg-gutter-none .fg-item,
2159
- .fg-masonry.fg-col3.fg-gutter-none .fg-item,
2160
- .fg-masonry.fg-col2.fg-gutter-none .fg-item { margin-bottom: 0; width: 100%; }
2161
- .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2162
- .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2163
- .fg-masonry.fg-col4.fg-gutter-none .fg-column-width,
2164
- .fg-masonry.fg-col3.fg-gutter-none .fg-column-width,
2165
- .fg-masonry.fg-col2.fg-gutter-none .fg-column-width { width: 100%; }
2166
- .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2167
- .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2168
- .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width,
2169
- .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width,
2170
- .fg-masonry.fg-col2.fg-gutter-none .fg-gutter-width { width: 0; }
2171
-
2172
- /* large gutter */
2173
- .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2174
- .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2175
- .fg-masonry.fg-col4.fg-gutter-large .fg-item,
2176
- .fg-masonry.fg-col3.fg-gutter-large .fg-item,
2177
- .fg-masonry.fg-col2.fg-gutter-large .fg-item { margin-bottom: 3%; width: 100%; }
2178
- .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2179
- .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2180
- .fg-masonry.fg-col4.fg-gutter-large .fg-column-width,
2181
- .fg-masonry.fg-col3.fg-gutter-large .fg-column-width,
2182
- .fg-masonry.fg-col2.fg-gutter-large .fg-column-width { width: 100%; }
2183
- .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2184
- .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2185
- .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width,
2186
- .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width,
2187
- .fg-masonry.fg-col2.fg-gutter-large .fg-gutter-width { width: 0; }
2188
- }
2189
-
2190
- /* Border Styles - We must apply width changing border styles to the fg-column-width element so that the plugin can correctly determine the item widths. */
2191
- .foogallery.fg-border-thin .fg-column-width {
2192
- border-width: 4px;
2193
- }
2194
- .foogallery.fg-border-medium .fg-column-width {
2195
- border-width: 10px;
2196
- }
2197
- .foogallery.fg-border-thick .fg-column-width {
2198
- border-width: 16px;
2199
- }
2200
-
2201
- /* Captions Bottom */
2202
- .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption {
2203
- visibility: visible;
2204
- opacity: 1;
2205
- font-size: 13px;
2206
- position: relative;
2207
- display: block;
2208
- top: auto;
2209
- bottom: auto;
2210
- left: auto;
2211
- right: auto;
2212
- width: auto;
2213
- height: auto;
2214
- text-transform: none;
2215
- transform: none;
2216
- transition: none;
2217
- background-color: transparent;
2218
- border-style: solid;
2219
- border-color: transparent;
2220
- text-align: left;
2221
- }
2222
- .foogallery.fg-masonry.fg-captions-bottom.fg-c-l .fg-item-inner .fg-caption {
2223
- text-align: left;
2224
- }
2225
- .foogallery.fg-masonry.fg-captions-bottom.fg-c-c .fg-item-inner .fg-caption {
2226
- text-align: center;
2227
- }
2228
- .foogallery.fg-masonry.fg-captions-bottom.fg-c-r .fg-item-inner .fg-caption {
2229
- text-align: right;
2230
- }
2231
- .foogallery.fg-masonry.fg-captions-bottom.fg-c-j .fg-item-inner .fg-caption {
2232
- text-align: justify;
2233
- }
2234
- .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner:hover .fg-caption {
2235
- transform: none;
2236
- transition: none;
2237
- }
2238
- .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner {
2239
- display: block;
2240
- position: relative;
2241
- max-height: none;
2242
- top: auto;
2243
- bottom: auto;
2244
- left: auto;
2245
- right: auto;
2246
- width: auto;
2247
- height: auto;
2248
- border: none;
2249
- transform: none;
2250
- transition: none;
2251
- }
2252
- .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner:before {
2253
- display: none;
2254
- }
2255
- .foogallery.fg-masonry.fg-captions-bottom.fg-caption-hover .fg-item-inner .fg-image-overlay {
2256
- display: block;
2257
- }
2258
- .foogallery.fg-masonry.fg-captions-bottom.fg-caption-always .fg-item-inner:hover .fg-caption {
2259
- visibility: visible;
2260
- opacity: 1;
2261
- }
2262
-
2263
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption,
2264
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption {
2265
- color: #828282;
2266
- }
2267
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption a,
2268
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a {
2269
- color: #828282;
2270
- border-bottom: 1px solid #828282;
2271
- }
2272
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption a:hover,
2273
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a:hover {
2274
- border-bottom: none;
2275
- }
2276
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title,
2277
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
2278
- color: #222;
2279
- }
2280
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title,
2281
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
2282
- color: #FFF;
2283
- }
2284
- .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
2285
- border-bottom: 1px solid #222;
2286
- }
2287
- .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
2288
- border-bottom: 1px solid #FFF;
2289
- }
2290
-
2291
- /* Handle Border Sizing for Captions Below */
2292
- .fg-masonry.fg-captions-bottom .fg-caption {
2293
- border-width: 10px;
2294
- }
2295
- .fg-masonry.fg-captions-bottom .fg-caption-title+.fg-caption-desc {
2296
- margin-top: 4px;
2297
- }
2298
- .fg-masonry.fg-captions-bottom.fg-border-thin .fg-caption {
2299
- border-width: 10px 4px 4px 4px;
2300
- }
2301
- .fg-masonry.fg-captions-bottom.fg-border-medium .fg-caption {
2302
- border-width: 10px 0 0 0;
2303
- }
2304
- .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption {
2305
- border-width: 16px 0 0 0;
2306
- }
2307
- .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption-title+.fg-caption-desc {
2308
- margin-top: 10px;
2309
- }
2310
-
2311
- /* Transparent Theme */
2312
- .fg-masonry.fg-transparent .fg-item-inner {
2313
- background-color: transparent;
2314
- color: #333;
2315
- border-color: transparent;
2316
- }
2317
-
2318
- /* Captions */
2319
- .fg-masonry.fg-transparent .fg-caption {
2320
- color: #7f7f7f;
2321
- }
2322
- .fg-masonry.fg-transparent.fg-captions-bottom .fg-caption {
2323
- border-width: 0;
2324
- border-top-width: 10px;
2325
- border-bottom-width: 10px;
2326
- }
2327
- .fg-masonry.fg-transparent .fg-caption a {
2328
- color: #7f7f7f;
2329
- border-bottom: 1px solid #7f7f7f;
2330
- }
2331
- .fg-masonry.fg-transparent .fg-caption a:hover {
2332
- border-bottom: none;
2333
- }
2334
- .fg-masonry.fg-transparent .fg-caption-title,
2335
- .fg-masonry.fg-transparent .fg-caption-title a {
2336
- color: #333;
2337
- }
2338
- .fg-masonry.fg-transparent .fg-caption-title a {
2339
- border-bottom: 1px solid #333;
2340
- }
2341
-
2342
- /* Rounded Corners */
2343
- .fg-masonry.fg-transparent.fg-round-full .fg-item,
2344
- .fg-masonry.fg-transparent.fg-round-full .fg-item-inner {
2345
- border-radius: 15px;
2346
- }
2347
- .fg-masonry.fg-transparent.fg-round-full .fg-image-wrap,
2348
- .fg-masonry.fg-transparent.fg-round-full .fg-image-overlay,
2349
- .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
2350
- .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
2351
- .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
2352
- border-radius: 50%;
2353
- overflow: hidden;
2354
- }
2355
-
2356
- .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2357
- .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2358
- .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2359
- .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2360
- .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2361
- .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2362
- overflow: hidden;
2363
- }
2364
- .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2365
- .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2366
- .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2367
- .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2368
- .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2369
- border-radius: 5px;
2370
- }
2371
- .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2372
- .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2373
- .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2374
- .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2375
- .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2376
- border-radius: 10px;
2377
- }
2378
- .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2379
- .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2380
- .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2381
- .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2382
- .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2383
- border-radius: 15px;
2384
- }
2385
-
2386
- /* Shadows */
2387
- .fg-masonry.fg-transparent.fg-shadow-inset-small .fg-thumb:after {
2388
- box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
2389
- }
2390
- .fg-masonry.fg-transparent.fg-shadow-inset-medium .fg-thumb:after {
2391
- box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
2392
- }
2393
- .fg-masonry.fg-transparent.fg-shadow-inset-large .fg-thumb:after {
2394
- box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
2395
- }
2396
-
2397
- .fg-masonry.fg-transparent.fg-shadow-outline .fg-item-inner {
2398
- box-shadow: 0 0 0 1px rgba(128, 128, 128, 0.5);
2399
- }
2400
- .fg-masonry.fg-transparent.fg-shadow-small .fg-item-inner {
2401
- box-shadow: 0 1px 4px 0 rgba(128, 128, 128, 0.5);
2402
- }
2403
- .fg-masonry.fg-transparent.fg-shadow-medium .fg-item-inner {
2404
- box-shadow: 0 1px 10px 0 rgba(128, 128, 128, 0.5);
2405
- }
2406
- .fg-masonry.fg-transparent.fg-shadow-large .fg-item-inner {
2407
- box-shadow: 0 1px 16px 0 rgba(128, 128, 128, 0.5);
2408
- }
2409
- /* Base Styles */
2410
- .fg-justified {
2411
- box-sizing: border-box;
2412
- position: relative;
2413
- text-align: center;
2414
- }
2415
- .foogallery.fg-justified .fg-item {
2416
- box-sizing: border-box;
2417
- display: inline-block;
2418
- margin: 0;
2419
- padding: 0;
2420
- }
2421
- .foogallery.fg-justified .fg-item-inner,
2422
- .foogallery.fg-justified .fg-thumb,
2423
- .foogallery.fg-justified .fg-image {
2424
- box-sizing: border-box;
2425
- display: block;
2426
- margin: 0;
2427
- padding: 0;
2428
- }
2429
- .fg-justified .fg-item {
2430
- visibility: visible;
2431
- position: relative;
2432
- }
2433
- .fg-justified .fg-item-inner {
2434
- position: relative;
2435
- width: 100%;
2436
- height: 100%;
2437
- }
2438
- .fg-justified .fg-thumb {
2439
- position: relative;
2440
- overflow: hidden;
2441
- }
2442
- .fg-justified .fg-image {
2443
- z-index: 1;
2444
- }
2445
- .fg-justified .fg-item.fg-positioned .fg-thumb,
2446
- .fg-justified .fg-item.fg-positioned .fg-image-wrap {
2447
- width: 100%;
2448
- height: 100%;
2449
- }
2450
- .fg-justified .fg-item.fg-positioned .fg-image {
2451
- width: 100%!important;
2452
- height: auto!important;
2453
- min-height: 100%;
2454
- }
2455
- /* CSS justified layout. */
2456
- .foogallery.fg-justified-css {
2457
- position: relative;
2458
- display: flex;
2459
- box-sizing: border-box;
2460
- align-items: center;
2461
- justify-content: stretch;
2462
- flex-wrap: wrap;
2463
- }
2464
- .foogallery.fg-justified-css:after {
2465
- display: block;
2466
- content: '';
2467
- flex-shrink: 0;
2468
- flex-grow: 10;
2469
- min-width: 60px;
2470
- }
2471
- .foogallery.fg-justified-css .fg-item,
2472
- .foogallery.fg-justified-css .fg-item-inner,
2473
- .foogallery.fg-justified-css .fg-thumb,
2474
- .foogallery.fg-justified-css .fg-image {
2475
- display: block;
2476
- }
2477
-
2478
- .foogallery.fg-justified-css .fg-item {
2479
- flex-shrink: 0;
2480
- flex-grow: 1;
2481
- margin: 5px;
2482
- }
2483
- .foogallery.fg-justified-css .fg-thumb {
2484
-
2485
- }
2486
- .foogallery.fg-justified-css .fg-image-wrap {
2487
- display: flex;
2488
- align-items: center;
2489
- justify-content: stretch;
2490
- overflow: hidden;
2491
- }
2492
- .foogallery.fg-justified-css .fg-image {
2493
- width: 100%;
2494
- height: auto;
2495
- }
2496
- .fg-simple_portfolio {
2497
- display: flex;
2498
- flex-wrap: wrap;
2499
- justify-content: center;
2500
- align-items: stretch;
2501
- align-content: center;
2502
- }
2503
- .fg-simple_portfolio .fg-item {
2504
- position: relative;
2505
- flex-grow: 0;
2506
- flex-shrink: 0;
2507
- flex-basis: auto;
2508
- margin: 10px;
2509
- max-width: 100%;
2510
- }
2511
- .fg-simple_portfolio .fg-item-inner {
2512
- display: flex;
2513
- flex-direction: column;
2514
- margin: 0;
2515
- height: 100%;
2516
- }
2517
- .fg-simple_portfolio.fg-captions-top .fg-item-inner {
2518
- flex-direction: column-reverse;
2519
- }
2520
- .fg-simple_portfolio .fg-image {
2521
- height: auto;
2522
- width: 100%;
2523
- }
2524
-
2525
- /* Some badly written themes apply min-width:0 and min-height:0 to every element in the page which causes layout issues with flex. */
2526
- .fg-simple_portfolio .fg-thumb {
2527
- min-width: auto;
2528
- min-height: auto;
2529
- }
2530
-
2531
- /* Reset captions for the portfolio */
2532
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption {
2533
- visibility: visible;
2534
- opacity: 1;
2535
- font-size: 13px;
2536
- position: relative;
2537
- display: block;
2538
- top: auto;
2539
- bottom: auto;
2540
- left: auto;
2541
- right: auto;
2542
- width: 100%;
2543
- height: 100%;
2544
- text-transform: none;
2545
- transform: none;
2546
- transition: none;
2547
- background-color: transparent;
2548
- border-style: solid;
2549
- border-color: transparent;
2550
- text-align: left;
2551
- }
2552
- .foogallery.fg-simple_portfolio.fg-c-l .fg-item-inner .fg-caption {
2553
- text-align: left;
2554
- }
2555
- .foogallery.fg-simple_portfolio.fg-c-c .fg-item-inner .fg-caption {
2556
- text-align: center;
2557
- }
2558
- .foogallery.fg-simple_portfolio.fg-c-r .fg-item-inner .fg-caption {
2559
- text-align: right;
2560
- }
2561
- .foogallery.fg-simple_portfolio.fg-c-j .fg-item-inner .fg-caption {
2562
- text-align: justify;
2563
- }
2564
- .foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption {
2565
- transform: none;
2566
- transition: none;
2567
- }
2568
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner {
2569
- display: block;
2570
- top: auto;
2571
- bottom: auto;
2572
- left: auto;
2573
- right: auto;
2574
- width: auto;
2575
- height: auto;
2576
- border: none;
2577
- transform: none;
2578
- transition: none;
2579
- }
2580
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before {
2581
- display: none;
2582
- }
2583
- .foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-image-overlay {
2584
- display: block;
2585
- }
2586
- .foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption {
2587
- visibility: visible;
2588
- opacity: 1;
2589
- }
2590
- .fg-simple_portfolio .fg-caption-title {
2591
- white-space: normal;
2592
- height: auto;
2593
- }
2594
-
2595
- .fg-simple_portfolio.fg-light .fg-caption,
2596
- .fg-simple_portfolio.fg-dark .fg-caption {
2597
- color: #828282;
2598
- }
2599
- .fg-simple_portfolio.fg-light .fg-caption a,
2600
- .fg-simple_portfolio.fg-dark .fg-caption a {
2601
- color: #828282;
2602
- border-bottom: 1px solid #828282;
2603
- }
2604
- .fg-simple_portfolio.fg-light .fg-caption a:hover,
2605
- .fg-simple_portfolio.fg-dark .fg-caption a:hover {
2606
- border-bottom: none;
2607
- }
2608
- .fg-simple_portfolio.fg-light .fg-caption-title,
2609
- .fg-simple_portfolio.fg-light .fg-caption-title a {
2610
- color: #222;
2611
- }
2612
- .fg-simple_portfolio.fg-dark .fg-caption-title,
2613
- .fg-simple_portfolio.fg-dark .fg-caption-title a {
2614
- color: #FFF;
2615
- }
2616
- .fg-simple_portfolio.fg-light .fg-caption-title a {
2617
- border-bottom: 1px solid #222;
2618
- }
2619
- .fg-simple_portfolio.fg-dark .fg-caption-title a {
2620
- border-bottom: 1px solid #FFF;
2621
- }
2622
-
2623
- /* Handle Border Sizing */
2624
- .fg-simple_portfolio .fg-caption {
2625
- border-width: 0;
2626
- }
2627
- .fg-simple_portfolio .fg-caption-title+.fg-caption-desc {
2628
- margin-top: 4px;
2629
- }
2630
- .fg-simple_portfolio.fg-border-thin .fg-caption {
2631
- border-width: 10px 4px 4px 4px;
2632
- }
2633
- .fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption {
2634
- border-width: 4px 4px 10px 4px;
2635
- }
2636
- .fg-simple_portfolio.fg-border-medium .fg-caption {
2637
- border-width: 10px 0 0 0;
2638
- }
2639
- .fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption {
2640
- border-width: 0 0 10px 0;
2641
- }
2642
- .fg-simple_portfolio.fg-border-thick .fg-caption {
2643
- border-width: 16px 0 0 0;
2644
- }
2645
- .fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption {
2646
- border-width: 0 0 16px 0;
2647
- }
2648
- .fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc {
2649
- margin-top: 10px;
2650
- }
2651
-
2652
- /* Transparent Theme */
2653
- .fg-simple_portfolio.fg-transparent .fg-item-inner {
2654
- background-color: transparent;
2655
- color: #333;
2656
- border-color: transparent;
2657
- }
2658
-
2659
- /* Captions */
2660
- .fg-simple_portfolio.fg-transparent .fg-caption {
2661
- color: #7f7f7f;
2662
- }
2663
- .fg-simple_portfolio.fg-transparent .fg-caption a {
2664
- color: #7f7f7f;
2665
- border-bottom: 1px solid #7f7f7f;
2666
- }
2667
- .fg-simple_portfolio.fg-transparent .fg-caption a:hover {
2668
- border-bottom: none;
2669
- }
2670
- .fg-simple_portfolio.fg-transparent .fg-caption-title,
2671
- .fg-simple_portfolio.fg-transparent .fg-caption-title a {
2672
- color: #333;
2673
- }
2674
- .fg-simple_portfolio.fg-transparent .fg-caption-title a {
2675
- border-bottom: 1px solid #333;
2676
- }
2677
-
2678
- /* Rounded Corners */
2679
- .fg-simple_portfolio.fg-transparent.fg-round-full .fg-item,
2680
- .fg-simple_portfolio.fg-transparent.fg-round-full .fg-item-inner {
2681
- border-radius: 15px;
2682
- }
2683
- .fg-simple_portfolio.fg-transparent.fg-round-full .fg-image-wrap,
2684
- .fg-simple_portfolio.fg-transparent.fg-round-full .fg-image-overlay,
2685
- .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
2686
- .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
2687
- .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
2688
- border-radius: 50%;
2689
- overflow: hidden;
2690
- }
2691
-
2692
- .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2693
- .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2694
- .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2695
- .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2696
- .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2697
- .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2698
- overflow: hidden;
2699
- }
2700
- .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2701
- .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2702
- .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2703
- .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2704
- .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2705
- border-radius: 5px;
2706
- }
2707
- .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2708
- .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2709
- .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2710
- .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2711
- .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2712
- border-radius: 10px;
2713
- }
2714
- .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2715
- .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2716
- .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2717
- .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2718
- .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2719
- border-radius: 15px;
2720
- }
2721
-
2722
- /* Shadows */
2723
- .fg-simple_portfolio.fg-transparent.fg-shadow-inset-small .fg-thumb:after {
2724
- box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
2725
- }
2726
- .fg-simple_portfolio.fg-transparent.fg-shadow-inset-medium .fg-thumb:after {
2727
- box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
2728
- }
2729
- .fg-simple_portfolio.fg-transparent.fg-shadow-inset-large .fg-thumb:after {
2730
- box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
2731
- }
2732
-
2733
- .fg-simple_portfolio.fg-transparent.fg-shadow-outline .fg-item-inner {
2734
- box-shadow: 0 0 0 1px rgba(128, 128, 128, 0.5);
2735
- }
2736
- .fg-simple_portfolio.fg-transparent.fg-shadow-small .fg-item-inner {
2737
- box-shadow: 0 1px 4px 0 rgba(128, 128, 128, 0.5);
2738
- }
2739
- .fg-simple_portfolio.fg-transparent.fg-shadow-medium .fg-item-inner {
2740
- box-shadow: 0 1px 10px 0 rgba(128, 128, 128, 0.5);
2741
- }
2742
- .fg-simple_portfolio.fg-transparent.fg-shadow-large .fg-item-inner {
2743
- box-shadow: 0 1px 16px 0 rgba(128, 128, 128, 0.5);
2744
- }
2745
- /* Polaroid */
2746
- .foogallery.fg-preset.fg-polaroid .fg-item {
2747
- -webkit-backface-visibility: hidden;
2748
- backface-visibility: hidden;
2749
- transition: transform 0.35s, background-color 0.65s;
2750
- }
2751
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1) {
2752
- -webkit-transform: rotate(3deg);
2753
- transform: rotate(3deg);
2754
- }
2755
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n) {
2756
- -webkit-transform: rotate(-3deg);
2757
- transform: rotate(-3deg);
2758
- }
2759
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n) {
2760
- -webkit-transform: rotate(1deg);
2761
- transform: rotate(1deg);
2762
- }
2763
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n) {
2764
- -webkit-transform: rotate(-2deg);
2765
- transform: rotate(-2deg);
2766
- }
2767
-
2768
- .foogallery.fg-preset.fg-polaroid .fg-item:hover {
2769
- -webkit-transform: rotate(0);
2770
- transform: rotate(0);
2771
- }
2772
-
2773
- .foogallery.fg-preset.fg-polaroid .fg-caption {
2774
- position: relative;
2775
- width: auto;
2776
- font-family: "Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
2777
- }
2778
-
2779
- .foogallery.fg-preset.fg-polaroid .fg-caption-inner,
2780
- .foogallery.fg-preset.fg-polaroid .fg-caption-title {
2781
- position: relative;
2782
- width: auto;
2783
- }
2784
- .foogallery.fg-preset.fg-polaroid .fg-caption-title {
2785
- text-align: center;
2786
- }
2787
- .foogallery.fg-preset.fg-polaroid .fg-caption-desc {
2788
- display: none;
2789
- }
2790
-
2791
- /* Themes */
2792
- .foogallery.fg-preset.fg-polaroid .fg-caption-title,
2793
- .foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title {
2794
- color: #333;
2795
- }
2796
- .foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title {
2797
- color: #FFF;
2798
- }
2799
-
2800
- /* Handle Border Sizing */
2801
- .foogallery.fg-preset.fg-polaroid .fg-caption {
2802
- border-style: solid;
2803
- border-color: transparent;
2804
- border-width: 10px;
2805
- }
2806
- .foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc {
2807
- margin-top: 4px;
2808
- }
2809
- .foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption {
2810
- border-width: 10px 4px 4px 4px;
2811
- }
2812
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption {
2813
- border-width: 4px 4px 10px 4px;
2814
- }
2815
- .foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption {
2816
- border-width: 10px 0 0 0;
2817
- }
2818
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption {
2819
- border-width: 0 0 10px 0;
2820
- }
2821
- .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption {
2822
- border-width: 16px 0 0 0;
2823
- }
2824
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption {
2825
- border-width: 0 0 16px 0;
2826
- }
2827
- .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc {
2828
- margin-top: 10px;
2829
- }
2830
- /* Base styles */
2831
- .fg-image-viewer {
2832
- display: block;
2833
- font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
2834
- }
2835
- .fg-image-viewer.fg-left {
2836
- text-align: left;
2837
- }
2838
-
2839
- .fg-image-viewer.fg-center {
2840
- text-align: center;
2841
- }
2842
- .fg-image-viewer.fg-right {
2843
- text-align: right;
2844
- }
2845
-
2846
- .fiv-inner {
2847
- position: relative;
2848
- display: inline-block;
2849
- max-width: 100%;
2850
- overflow: hidden;
2851
- z-index: 6;
2852
- }
2853
- .fiv-inner .fiv-inner-container {
2854
- position: relative;
2855
- overflow: hidden;
2856
- max-width: 100%;
2857
- border-style: solid;
2858
- border-width: 0;
2859
- border-bottom-width: 4px;
2860
- z-index: 5;
2861
- }
2862
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,
2863
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,
2864
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,
2865
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited {
2866
- position: relative;
2867
- display: block;
2868
- border: none;
2869
- outline: none;
2870
- text-decoration: none;
2871
- box-shadow: none;
2872
- max-width: 100%;
2873
- }
2874
-
2875
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item {
2876
- position: absolute;
2877
- visibility: visible;
2878
- opacity: 1;
2879
- border: none;
2880
- outline: none;
2881
- text-decoration: none;
2882
- box-shadow: none;
2883
- max-width: 100%;
2884
- }
2885
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item:first-of-type {
2886
- position: relative;
2887
- }
2888
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img {
2889
- display: block;
2890
- max-width: 100%;
2891
- height: auto;
2892
- border: none;
2893
- outline: none;
2894
- text-decoration: none;
2895
- }
2896
-
2897
- .fg-image-viewer .fiv-inner .fiv-ctrls {
2898
- display: block;
2899
- text-align: center;
2900
- font-size: 14px;
2901
- border-style: solid;
2902
- line-height: 34px;
2903
- }
2904
- .fg-image-viewer .fiv-inner .fiv-ctrls:after {
2905
- content: '';
2906
- display: block;
2907
- clear: both;
2908
- }
2909
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count {
2910
- display: inline-block;
2911
- font-weight: normal;
2912
- margin: 0;
2913
- }
2914
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,
2915
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2916
- cursor: pointer;
2917
- -webkit-user-select: none;
2918
- -moz-user-select: none;
2919
- -ms-user-select: none;
2920
- user-select: none;
2921
- border: none;
2922
- min-width: 80px;
2923
- position: relative;
2924
- overflow: hidden;
2925
- transition: background-color .3s;
2926
- }
2927
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before,
2928
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2929
- display: block;
2930
- position: absolute;
2931
- font-size: 24px;
2932
- line-height: 30px;
2933
- top:0;
2934
- left:0;
2935
- width: 100%;
2936
- transform: translateY(0);
2937
- transition: transform .3s;
2938
- }
2939
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before,
2940
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before {
2941
- transform: translateY(-100%);
2942
- }
2943
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span,
2944
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span {
2945
- display: block;
2946
- width: 100%;
2947
- transform: translateY(100%);
2948
- transition: transform .3s;
2949
- }
2950
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span,
2951
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span {
2952
- transform: translateY(0);
2953
- }
2954
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev {
2955
- float: left;
2956
- }
2957
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before {
2958
- content: '\2190';
2959
- }
2960
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2961
- float: right;
2962
- }
2963
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2964
- content: '\2192';
2965
- }
2966
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span {
2967
- margin: 0 4px;
2968
- }
2969
-
2970
- /* Captions */
2971
-
2972
- .foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption {
2973
- padding: 0;
2974
- border: none;
2975
- }
2976
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title {
2977
- padding: 10px 10px 10px 10px;
2978
- }
2979
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc {
2980
- padding: 10px 10px 10px 10px;
2981
- }
2982
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc {
2983
- padding: 0 10px 10px 10px;
2984
- }
2985
-
2986
- /* Theme - Default (Light) */
2987
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,
2988
- .fg-image-viewer.fg-light .fiv-inner .fiv-inner-container,
2989
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,
2990
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,
2991
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next {
2992
- background-color: #FFF;
2993
- color: #333;
2994
- border-color: #FFF;
2995
- }
2996
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover,
2997
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover {
2998
- background-color: #F2F2F2;
2999
- }
3000
- .fg-image-viewer.fg-light .fiv-prev,
3001
- .fg-image-viewer.fg-light .fiv-next {
3002
- box-shadow: inset 0 0 0 1px #ddd;
3003
- }
3004
-
3005
- /* Theme - Dark */
3006
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,
3007
- .fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container,
3008
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,
3009
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,
3010
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next {
3011
- background-color: #333;
3012
- color: #FFF;
3013
- border-color: #333;
3014
- }
3015
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,
3016
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover {
3017
- background-color: #444;
3018
- }
3019
- .fg-image-viewer.fg-dark .fiv-prev,
3020
- .fg-image-viewer.fg-dark .fiv-next {
3021
- box-shadow: inset 0 0 0 1px #222;
3022
- }
3023
-
3024
- /* Border Size */
3025
- .foogallery.fg-image-viewer.fg-border-thin .fg-item-inner,
3026
- .foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,
3027
- .foogallery.fg-image-viewer.fg-border-thick .fg-item-inner {
3028
- border-width: 0;
3029
- }
3030
- .foogallery.fg-image-viewer .fiv-ctrls,
3031
- .foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container {
3032
- border-width: 4px;
3033
- }
3034
- .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
3035
- .foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container {
3036
- border-width: 10px;
3037
- }
3038
- .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,
3039
- .foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container {
3040
- border-width: 16px;
3041
- }
3042
- .foogallery.fg-image-viewer .fiv-ctrls,
3043
- .foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls,
3044
- .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
3045
- .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls {
3046
- border-top-width: 1px;
3047
- }
3048
-
3049
- /* Rounded Corners */
3050
- .foogallery.fg-image-viewer.fg-round-small .fg-item,
3051
- .foogallery.fg-image-viewer.fg-round-small .fg-item-inner,
3052
- .foogallery.fg-image-viewer.fg-round-small .fiv-inner {
3053
- border-radius: 5px;
3054
- }
3055
- .foogallery.fg-image-viewer.fg-round-small .fg-item,
3056
- .foogallery.fg-image-viewer.fg-round-small .fg-item-inner {
3057
- border-bottom-left-radius: 0;
3058
- border-bottom-right-radius: 0;
3059
- }
3060
- .foogallery.fg-image-viewer.fg-round-small .fiv-prev,
3061
- .foogallery.fg-image-viewer.fg-round-small .fiv-next {
3062
- border-radius: 3px;
3063
- }
3064
-
3065
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,
3066
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,
3067
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev,
3068
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,
3069
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,
3070
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,
3071
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,
3072
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,
3073
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,
3074
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,
3075
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,
3076
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next {
3077
- border-radius: 3px;
3078
- }
3079
-
3080
- .foogallery.fg-image-viewer.fg-round-medium .fg-item,
3081
- .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,
3082
- .foogallery.fg-image-viewer.fg-round-medium .fiv-inner {
3083
- border-radius: 10px;
3084
- }
3085
- .foogallery.fg-image-viewer.fg-round-medium .fg-item,
3086
- .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner {
3087
- border-bottom-left-radius: 0;
3088
- border-bottom-right-radius: 0;
3089
- }
3090
- .foogallery.fg-image-viewer.fg-round-medium .fiv-prev,
3091
- .foogallery.fg-image-viewer.fg-round-medium .fiv-next {
3092
- border-radius: 5px;
3093
- }
3094
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,
3095
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,
3096
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev,
3097
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next {
3098
- border-radius: 5px;
3099
- }
3100
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,
3101
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,
3102
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,
3103
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,
3104
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,
3105
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,
3106
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev,
3107
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next {
3108
- border-radius: 3px;
3109
- }
3110
-
3111
- .foogallery.fg-image-viewer.fg-round-large .fg-item,
3112
- .foogallery.fg-image-viewer.fg-round-large .fg-item-inner,
3113
- .foogallery.fg-image-viewer.fg-round-large .fiv-inner {
3114
- border-radius: 15px;
3115
- }
3116
- .foogallery.fg-image-viewer.fg-round-large .fg-item,
3117
- .foogallery.fg-image-viewer.fg-round-large .fg-item-inner {
3118
- border-bottom-left-radius: 0;
3119
- border-bottom-right-radius: 0;
3120
- }
3121
- .foogallery.fg-image-viewer.fg-round-large .fiv-prev,
3122
- .foogallery.fg-image-viewer.fg-round-large .fiv-next {
3123
- border-radius: 11px;
3124
- }
3125
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,
3126
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,
3127
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev,
3128
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next {
3129
- border-radius: 11px;
3130
- }
3131
-
3132
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,
3133
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,
3134
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev,
3135
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next {
3136
- border-radius: 5px;
3137
- }
3138
-
3139
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,
3140
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,
3141
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev,
3142
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next {
3143
- border-radius: 3px;
3144
- }
3145
-
3146
- .foogallery.fg-image-viewer.fg-round-full .fiv-inner,
3147
- .foogallery.fg-image-viewer.fg-round-full .fiv-prev,
3148
- .foogallery.fg-image-viewer.fg-round-full .fiv-next {
3149
- border-radius: 50%;
3150
- }
3151
-
3152
- /* Drop Shadows */
3153
- .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,
3154
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,
3155
- .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner,
3156
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,
3157
- .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,
3158
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,
3159
- .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,
3160
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner {
3161
- box-shadow: none;
3162
- }
3163
-
3164
- .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner {
3165
- box-shadow: 0 0 0 1px #ddd;
3166
- }
3167
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner {
3168
- box-shadow: 0 0 0 1px #222;
3169
- }
3170
- .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner,
3171
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner {
3172
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
3173
- }
3174
- .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner,
3175
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner {
3176
- box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
3177
- }
3178
- .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner,
3179
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner {
3180
- box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
3181
- }
3182
- .foogallery.fg-thumbnail,
3183
- .foogallery.fg-thumbnail.fg-center {
3184
- text-align: center;
3185
- }
3186
- .foogallery.fg-thumbnail.fg-left {
3187
- text-align: left;
3188
- }
3189
- .foogallery.fg-thumbnail.fg-right {
3190
- text-align: right;
3191
- }
3192
-
3193
- .foogallery.fg-thumbnail.fg-float-left {
3194
- float: left;
3195
- width: auto;
3196
- }
3197
- .foogallery.fg-thumbnail.fg-float-right {
3198
- float: right;
3199
- width: auto;
3200
- }
3201
-
3202
- .foogallery.fg-thumbnail .fg-item {
3203
- display: inline-block;
3204
- vertical-align: top;
3205
- max-width: 100%;
3206
- }
3207
- .foogallery.fg-thumbnail .fg-image {
3208
- max-width: 100%;
3209
- }
3210
- .foogallery.fg-thumbnail .fg-st-hidden {
3211
- display: none;
3212
- }
3213
- .foogallery-stack-album {
3214
- text-align: center;
3215
- overflow: hidden;
3216
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
3217
- font-size: 13px;
3218
- font-weight: 400;
3219
- line-height: 1.3;
3220
- }
3221
- .foogallery-stack-album,
3222
- .foogallery-stack-album * {
3223
- box-sizing: border-box;
3224
- }
3225
-
3226
- .foogallery-stack-album.fg-align-left {
3227
- text-align: left;
3228
- }
3229
- .foogallery-stack-album.fg-align-center {
3230
- text-align: center;
3231
- }
3232
- .foogallery-stack-album.fg-align-right {
3233
- text-align: right;
3234
- }
3235
-
3236
- .foogallery-stack-album.fg-disable-transitions,
3237
- .foogallery-stack-album.fg-disable-transitions * {
3238
- transition: none !important;
3239
- }
3240
-
3241
- .fg-header {
3242
- display: flex;
3243
- flex-wrap: nowrap;
3244
- justify-content: space-between;
3245
- align-items: center;
3246
- position: relative;
3247
- padding: 0;
3248
- margin: 0;
3249
- border-top: solid 1px #aaa;
3250
- border-bottom: solid 1px #aaa;
3251
- }
3252
-
3253
- .fg-header-title {
3254
- display: block;
3255
- margin: 0;
3256
- padding: 0 20px;
3257
- width: 100%;
3258
- text-align: left;
3259
- }
3260
-
3261
- .fg-header-active {
3262
- display: block;
3263
- margin: 0;
3264
- padding: 0 20px;
3265
- visibility: hidden;
3266
- opacity: 0;
3267
- width: 100%;
3268
- text-align: right;
3269
- transition-property: opacity, visibility;
3270
- transition-duration: .3s;
3271
- transition-timing-function: ease-in-out;
3272
- }
3273
-
3274
- .fg-header-back {
3275
- display: block;
3276
- padding: 0;
3277
- margin: 5px;
3278
- visibility: hidden;
3279
- opacity: 0;
3280
- min-width: 40px;
3281
- width: 40px;
3282
- height: 40px;
3283
- border-radius: 50%;
3284
- text-align: center;
3285
- line-height: 38px;
3286
- color: #999;
3287
- background: #ddd;
3288
- background: rgba(200,200,200,0.5);
3289
- cursor: pointer;
3290
- -webkit-touch-callout: none;
3291
- -webkit-user-select: none;
3292
- -moz-user-select: none;
3293
- -ms-user-select: none;
3294
- user-select: none;
3295
- transition-property: opacity, visibility;
3296
- transition-duration: .3s;
3297
- transition-timing-function: ease-in-out;
3298
- }
3299
-
3300
- .fg-has-active .fg-header-back,
3301
- .fg-has-active .fg-header-active {
3302
- visibility: visible;
3303
- opacity: 1;
3304
- }
3305
-
3306
-
3307
- .fg-piles {
3308
- display: inline-block;
3309
- position: relative;
3310
- transition-property: width, height;
3311
- transition-duration: .3s;
3312
- transition-timing-function: ease-in-out;
3313
- }
3314
-
3315
- .fg-pile {
3316
- display: block;
3317
- position: absolute;
3318
- top: 0;
3319
- left: 0;
3320
- list-style: none;
3321
- padding: 0;
3322
- margin: 0;
3323
- visibility: visible;
3324
- opacity: 1;
3325
- transition-property: opacity, visibility, top, left, width, height;
3326
- transition-duration: .3s;
3327
- transition-timing-function: ease-in-out;
3328
- }
3329
-
3330
- .fg-pile.fg-hidden {
3331
- visibility: hidden;
3332
- opacity: 0;
3333
- }
3334
-
3335
- .fg-pile-item {
3336
- display: block;
3337
- position: absolute;
3338
- top: 25px;
3339
- left: 25px;
3340
- visibility: visible;
3341
- opacity: 1;
3342
- cursor: pointer;
3343
- border: 10px solid #fff;
3344
- background-color: #FFF;
3345
- box-shadow: 0 1px 4px rgba(0,0,0,0.2);
3346
- transition-property: opacity, visibility, top, left, transform;
3347
- transition-duration: .3s;
3348
- transition-timing-function: ease-in-out;
3349
- z-index: 1;
3350
- transform: rotate(0deg);
3351
- }
3352
-
3353
- .fg-expanded .fg-pile-item {
3354
- z-index: 2;
3355
- transform: rotate(0deg) !important;
3356
- }
3357
- .fg-pile-item.fg-has-cover {
3358
- z-index: 10;
3359
- transform: rotate(0deg) !important;
3360
- }
3361
-
3362
- .fg-pile-item:nth-child(2) {
3363
- z-index: 9;
3364
- }
3365
- .fg-pile-item:nth-child(3) {
3366
- z-index: 8;
3367
- }
3368
- .fg-pile-item:nth-child(4) {
3369
- z-index: 7;
3370
- }
3371
- .fg-pile-item:nth-child(1n+5) {
3372
- visibility: hidden;
3373
- opacity: 0;
3374
- }
3375
- .fg-expanded .fg-pile-item:nth-child(1n+4) {
3376
- visibility: visible;
3377
- opacity: 1;
3378
- }
3379
-
3380
- .fg-pile-item-thumb {
3381
- display: block;
3382
- }
3383
-
3384
- .fg-pile-item-image {
3385
- display: block;
3386
- }
3387
-
3388
- .fg-pile-item-caption {
3389
- display: flex;
3390
- justify-content: center;
3391
- flex-direction: column;
3392
- position: absolute;
3393
- top: 0;
3394
- left: 0;
3395
- bottom: 0;
3396
- right: 0;
3397
- width: 100%;
3398
- height: 100%;
3399
- margin: 0;
3400
- padding: 10px;
3401
- background-color: rgba(68, 68, 68, 0.5);
3402
- color: #FFFFFF;
3403
- text-align: center;
3404
- visibility: hidden;
3405
- opacity: 0;
3406
- transition-property: opacity, visibility;
3407
- transition-duration: .3s;
3408
- transition-timing-function: ease-in-out;
3409
- }
3410
- .fg-pile-item-title {
3411
- display: block;
3412
- width: 100%;
3413
- padding: 0 0 10px;
3414
- }
3415
- .fg-pile-item-desc {
3416
- display: block;
3417
- width: 100%;
3418
- max-height: 100%;
3419
- border-top: solid 1px currentColor;
3420
- padding: 10px 0 0;
3421
- overflow: hidden;
3422
- }
3423
-
3424
- .fg-pile-item-thumb:hover .fg-pile-item-caption {
3425
- visibility: visible;
3426
- opacity: 1;
3427
- }
3428
-
3429
- .fg-pile-cover {
3430
- display: flex;
3431
- justify-content: left;
3432
- align-items: center;
3433
- position: absolute;
3434
- top: 0;
3435
- left: 0;
3436
- bottom: 0;
3437
- right: 0;
3438
- width: 100%;
3439
- height: 100%;
3440
- visibility: visible;
3441
- opacity: 1;
3442
- cursor: pointer;
3443
- -webkit-touch-callout: none;
3444
- -webkit-user-select: none;
3445
- -moz-user-select: none;
3446
- -ms-user-select: none;
3447
- user-select: none;
3448
- transition-property: opacity, visibility;
3449
- transition-duration: .3s;
3450
- transition-timing-function: ease-in-out;
3451
- }
3452
-
3453
- .fg-expanded .fg-pile-cover {
3454
- visibility: hidden;
3455
- opacity: 0;
3456
- pointer-events: none;
3457
- }
3458
-
3459
- .fg-pile-cover-content {
3460
- display: flex;
3461
- position: relative;
3462
- background: #fff;
3463
- color: #333;
3464
- width: 75%;
3465
- font-weight: 700;
3466
- box-shadow: 1px 1px 1px rgba(0,0,0,0.1), 5px 0 5px -3px rgba(0,0,0,0.4), inset 0 0 5px rgba(0,0,0,0.04);
3467
- }
3468
-
3469
- .fg-pile-cover-title {
3470
- text-align: center;
3471
- padding: 10px;
3472
- width: 100%;
3473
- }
3474
- .fg-pile-cover-count {
3475
- color: #aaa;
3476
- padding: 10px 5px;
3477
- background: #F7F7F7;
3478
- height: 100%;
3479
  }
1
+ .foogallery, .foogallery * {
2
+ box-sizing: border-box;
3
+ }
4
+ .foogallery {
5
+ display: block;
6
+ z-index: 1;
7
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
8
+ position: relative;
9
+ line-height: 0;
10
+ font-size: 0;
11
+ width: 100%;
12
+ max-width: 100%;
13
+ }
14
+ .foogallery .fg-item {
15
+ display: inline-block;
16
+ position: relative;
17
+ background-color: transparent;
18
+ z-index: 2;
19
+ -webkit-user-select: none;
20
+ -moz-user-select: none;
21
+ -ms-user-select: none;
22
+ user-select: none;
23
+ }
24
+ .foogallery .fg-item.fg-hidden {
25
+ display: none!important;
26
+ }
27
+ .foogallery .fg-item-inner {
28
+ display: block;
29
+ position: relative;
30
+ visibility: hidden;
31
+ overflow: hidden;
32
+ opacity: 0;
33
+ z-index: 3;
34
+ margin: 0;
35
+ border: solid 0 transparent;
36
+ }
37
+
38
+ .foogallery .fg-item.fg-error:before {
39
+ content: "";
40
+ display: block;
41
+ position: absolute;
42
+ top: 50%;
43
+ left: 50%;
44
+ transform: translateX(-50%) translateY(-50%);
45
+ width: 32px;
46
+ height: 32px;
47
+ background-image: url('../img/icons.svg#image');
48
+ background-color: transparent;
49
+ background-repeat: no-repeat;
50
+ background-position: center center;
51
+ background-size: 32px 32px;
52
+ }
53
+
54
+ .foogallery .fg-item.fg-loaded {
55
+ z-index: 4;
56
+ }
57
+ .foogallery .fg-loaded .fg-item-inner {
58
+ visibility: visible;
59
+ opacity: 1;
60
+ z-index: 5;
61
+ }
62
+ .foogallery .fg-error .fg-item-inner {
63
+ pointer-events: none;
64
+ cursor: default;
65
+ }
66
+ .foogallery .fg-thumb {
67
+ display: block;
68
+ position: relative;
69
+ border: none;
70
+ outline: 0;
71
+ text-decoration: none;
72
+ z-index: 4;
73
+ box-shadow: none;
74
+ }
75
+ .foogallery .fg-thumb:hover,
76
+ .foogallery .fg-thumb:focus {
77
+ border: none;
78
+ outline: 0;
79
+ text-decoration: none;
80
+ box-shadow: none;
81
+ }
82
+ .foogallery .fg-image-overlay {
83
+ position: absolute;
84
+ top: 0;
85
+ right: 0;
86
+ bottom: 0;
87
+ left: 0;
88
+ z-index: 8;
89
+ visibility: hidden;
90
+ opacity: 0;
91
+ }
92
+ .foogallery .fg-image-wrap {
93
+ display: block;
94
+ position: relative;
95
+ }
96
+ .foogallery .fg-image {
97
+ display: block;
98
+ position: relative;
99
+ border: none;
100
+ outline: 0;
101
+ text-decoration: none;
102
+ z-index: 5;
103
+ max-width: 100%;
104
+ height: auto;
105
+ margin: 0;
106
+ width: auto;
107
+ }
108
+ .foogallery picture.fg-image > img {
109
+ display: block;
110
+ position: relative;
111
+ border: none;
112
+ outline: 0;
113
+ text-decoration: none;
114
+ max-width: 100%;
115
+ height: auto;
116
+ margin: 0;
117
+ width: auto;
118
+ }
119
+ .foogallery .fg-loaded .fg-thumb {
120
+ z-index: 6;
121
+ }
122
+ .foogallery .fg-loaded .fg-image {
123
+ z-index: 7;
124
+ }
125
+
126
+ /* Utility */
127
+ .fg-sr-only {
128
+ position: absolute;
129
+ width: 1px;
130
+ height: 1px;
131
+ padding: 0;
132
+ margin: -1px;
133
+ overflow: hidden;
134
+ clip: rect(0,0,0,0);
135
+ border: 0;
136
+ }
137
+ /* Item Style */
138
+ .foogallery.fg-light .fg-item-inner {
139
+ background-color: #FFF;
140
+ color: #333;
141
+ border-color: #FFF;
142
+ }
143
+ .foogallery.fg-dark .fg-item-inner {
144
+ background-color: #333;
145
+ color: #FFF;
146
+ border-color: #333;
147
+ }
148
+ /* Idle / Loading / Error Style */
149
+ .foogallery.fg-light .fg-item.fg-idle,
150
+ .foogallery.fg-light .fg-item.fg-loading,
151
+ .foogallery.fg-light .fg-item.fg-error {
152
+ background-color: #eee;
153
+ box-shadow: inset 0 0 0 1px #ddd;
154
+ }
155
+ .foogallery.fg-dark .fg-item.fg-idle,
156
+ .foogallery.fg-dark .fg-item.fg-loading,
157
+ .foogallery.fg-dark .fg-item.fg-error {
158
+ background-color: #444;
159
+ box-shadow: inset 0 0 0 1px #333;
160
+ }
161
+ /* Caption & Overlay Colors */
162
+ .foogallery .fg-caption {
163
+ background-color: rgba(0,0,0,0.6);
164
+ color: #fff;
165
+ }
166
+ .foogallery .fg-caption a {
167
+ color: #fff;
168
+ border-bottom: 1px solid #FFF;
169
+ }
170
+ .foogallery.fg-light-overlays .fg-caption {
171
+ background-color: rgba(255,255,255,0.8);
172
+ color: #333;
173
+ }
174
+ .foogallery.fg-light-overlays .fg-caption a {
175
+ color: #333;
176
+ border-bottom-color: #333;
177
+ }
178
+ .foogallery.fg-transparent-overlays .fg-caption {
179
+ background-color: transparent;
180
+ color: #fff;
181
+ }
182
+ .foogallery.fg-transparent-overlays .fg-caption a {
183
+ color: #fff;
184
+ border-bottom-color: #fff;
185
+ }
186
+
187
+ .foogallery .fg-image-overlay {
188
+ background-color: rgba(0,0,0,0.6);
189
+ color: #fff;
190
+ }
191
+ .foogallery.fg-light-overlays .fg-image-overlay {
192
+ background-color: rgba(255,255,255,0.8);
193
+ color: #333;
194
+ }
195
+ .foogallery.fg-transparent-overlays .fg-image-overlay {
196
+ background-color: transparent;
197
+ color: #fff;
198
+ }
199
+ /* Colors */
200
+ .fg-exif-light .fg-item.fg-item-exif .fg-image-wrap:after {
201
+ background-color: #FFF;
202
+ color: #333;
203
+ }
204
+ .fg-exif-dark .fg-item.fg-item-exif .fg-image-wrap:after {
205
+ background-color: #333;
206
+ color: #FFF;
207
+ }
208
+
209
+ /* Rounded Corners */
210
+ .fg-exif-rounded .fg-item.fg-item-exif .fg-image-wrap:after {
211
+ border-radius: 3px;
212
+ }
213
+
214
+ /* Positions ~ Top, Right, Bottom & Left */
215
+ .fg-exif-bottom-right .fg-item.fg-item-exif .fg-image-wrap:after,
216
+ .fg-exif-bottom-left .fg-item.fg-item-exif .fg-image-wrap:after,
217
+ .fg-exif-top-right .fg-item.fg-item-exif .fg-image-wrap:after,
218
+ .fg-exif-top-left .fg-item.fg-item-exif .fg-image-wrap:after {
219
+ display: inline-block;
220
+ position: absolute;
221
+ content: 'EXIF';
222
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
223
+ font-size: 11px;
224
+ line-height: 10px;
225
+ padding: 3px 4px;
226
+ z-index: 7;
227
+ }
228
+ .fg-exif-bottom-right .fg-item.fg-item-exif .fg-image-wrap:after {
229
+ bottom: 5px;
230
+ right: 5px;
231
+ }
232
+ .fg-exif-bottom-left .fg-item.fg-item-exif .fg-image-wrap:after {
233
+ bottom: 5px;
234
+ left: 5px;
235
+ }
236
+ .fg-exif-top-right .fg-item.fg-item-exif .fg-image-wrap:after {
237
+ top: 5px;
238
+ right: 5px;
239
+ }
240
+ .fg-exif-top-left .fg-item.fg-item-exif .fg-image-wrap:after {
241
+ top: 5px;
242
+ left: 5px;
243
+ }
244
+ /* Border Size */
245
+ .foogallery.fg-border-thin .fg-item-inner {
246
+ border-width: 4px;
247
+ }
248
+ .foogallery.fg-border-medium .fg-item-inner {
249
+ border-width: 10px;
250
+ }
251
+ .foogallery.fg-border-thick .fg-item-inner {
252
+ border-width: 16px;
253
+ }
254
+ /* Drop Shadows */
255
+ .foogallery.fg-light.fg-shadow-outline .fg-item-inner {
256
+ box-shadow: 0 0 0 1px #ddd;
257
+ }
258
+ .foogallery.fg-dark.fg-shadow-outline .fg-item-inner {
259
+ box-shadow: 0 0 0 1px #222;
260
+ }
261
+ .foogallery.fg-light.fg-shadow-small .fg-item-inner,
262
+ .foogallery.fg-dark.fg-shadow-small .fg-item-inner {
263
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
264
+ }
265
+ .foogallery.fg-light.fg-shadow-medium .fg-item-inner,
266
+ .foogallery.fg-dark.fg-shadow-medium .fg-item-inner {
267
+ box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
268
+ }
269
+ .foogallery.fg-light.fg-shadow-large .fg-item-inner,
270
+ .foogallery.fg-dark.fg-shadow-large .fg-item-inner {
271
+ box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
272
+ }
273
+ /* Inset Shadows */
274
+ .foogallery.fg-shadow-inset-small .fg-thumb:after,
275
+ .foogallery.fg-shadow-inset-medium .fg-thumb:after,
276
+ .foogallery.fg-shadow-inset-large .fg-thumb:after {
277
+ display: block;
278
+ content: "";
279
+ position: absolute;
280
+ top: 0;
281
+ left: 0;
282
+ right: 0;
283
+ bottom: 0;
284
+ z-index: 7;
285
+ }
286
+ .foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after,
287
+ .foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after {
288
+ box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
289
+ }
290
+ .foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after,
291
+ .foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after {
292
+ box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
293
+ }
294
+ .foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after,
295
+ .foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after {
296
+ box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
297
+ }
298
+
299
+ .foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
300
+ .foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
301
+ .foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
302
+ border-radius: 50%;
303
+ }
304
+ /* Rounded Corners */
305
+ .foogallery.fg-round-small .fg-item,
306
+ .foogallery.fg-round-small .fg-item-inner {
307
+ border-radius: 5px;
308
+ }
309
+ .foogallery.fg-round-medium .fg-item,
310
+ .foogallery.fg-round-medium .fg-item-inner {
311
+ border-radius: 10px;
312
+ }
313
+ .foogallery.fg-round-large .fg-item,
314
+ .foogallery.fg-round-large .fg-item-inner {
315
+ border-radius: 15px;
316
+ }
317
+ .foogallery.fg-round-full .fg-item,
318
+ .foogallery.fg-round-full .fg-item-inner {
319
+ border-radius: 50%;
320
+ }
321
+ /* Loader Styles */
322
+ .foogallery .fg-loader {
323
+ position: absolute;
324
+ top: 50%;
325
+ left: 50%;
326
+ margin-top: -0.5em;
327
+ margin-left: -0.5em;
328
+ width: 1em;
329
+ height: 1em;
330
+ font-size: 5px;
331
+ visibility: hidden;
332
+ opacity: 0;
333
+ pointer-events: none;
334
+ }
335
+
336
+ .foogallery .fg-loading .fg-loader {
337
+ visibility: visible;
338
+ opacity: 1;
339
+ }
340
+ .fg-loading-default .fg-loader {
341
+ border-radius: 50%;
342
+ text-indent: -9999em;
343
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
344
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
345
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
346
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
347
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
348
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
349
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
350
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
351
+ -webkit-animation: loading-default 1.1s infinite paused steps(8, start);
352
+ animation: loading-default 1.1s infinite paused steps(8, start);
353
+ }
354
+ .fg-loading-default .fg-loading .fg-loader {
355
+ -webkit-animation-play-state: running;
356
+ animation-play-state: running;
357
+ }
358
+
359
+ @-webkit-keyframes loading-default {
360
+ 0% {
361
+ transform: rotate(0deg);
362
+ }
363
+ 100% {
364
+ transform: rotate(360deg);
365
+ }
366
+ }
367
+
368
+ @keyframes loading-default {
369
+ 0% {
370
+ transform: rotate(0deg);
371
+ }
372
+ 100% {
373
+ transform: rotate(360deg);
374
+ }
375
+ }
376
+ .fg-loading-bars .fg-loader,
377
+ .fg-loading-bars .fg-loader:before,
378
+ .fg-loading-bars .fg-loader:after {
379
+ background: rgba(130, 130, 130, 1);
380
+ width: 1em;
381
+ height: 4em;
382
+ -webkit-animation: loading-bars 1s infinite paused ease-in-out;
383
+ animation: loading-bars 1s infinite paused ease-in-out;
384
+ }
385
+ .fg-loading-bars .fg-loading .fg-loader,
386
+ .fg-loading-bars .fg-loading .fg-loader:before,
387
+ .fg-loading-bars .fg-loading .fg-loader:after {
388
+ -webkit-animation-play-state: running;
389
+ animation-play-state: running;
390
+ }
391
+ .fg-loading-bars .fg-loader {
392
+ color: rgba(130, 130, 130, 1);
393
+ text-indent: -9999em;
394
+ font-size: 4px;
395
+ margin-top: -2em;
396
+ margin-left: -0.5em;
397
+ -webkit-animation-delay: -0.16s;
398
+ animation-delay: -0.16s;
399
+ }
400
+ .fg-loading-bars .fg-loader:before,
401
+ .fg-loading-bars .fg-loader:after {
402
+ position: absolute;
403
+ top: 0;
404
+ content: '';
405
+ }
406
+ .fg-loading-bars .fg-loader:before {
407
+ left: -1.5em;
408
+ -webkit-animation-delay: -0.32s;
409
+ animation-delay: -0.32s;
410
+ }
411
+ .fg-loading-bars .fg-loader:after {
412
+ left: 1.5em;
413
+ }
414
+ @-webkit-keyframes loading-bars {
415
+ 0%,
416
+ 80%,
417
+ 100% {
418
+ box-shadow: 0 0;
419
+ height: 4em;
420
+ }
421
+ 40% {
422
+ box-shadow: 0 -2em;
423
+ height: 5em;
424
+ }
425
+ }
426
+ @keyframes loading-bars {
427
+ 0%,
428
+ 80%,
429
+ 100% {
430
+ box-shadow: 0 0;
431
+ height: 4em;
432
+ }
433
+ 40% {
434
+ box-shadow: 0 -2em;
435
+ height: 5em;
436
+ }
437
+ }
438
+ .fg-loading-trail .fg-loader {
439
+ color: #828282;
440
+ margin-top: 0;
441
+ margin-left: 0;
442
+ font-size: 20px;
443
+ text-indent: -9999em;
444
+ overflow: hidden;
445
+ border-radius: 50%;
446
+ -webkit-animation: loading-trail-1 1.7s infinite paused ease, loading-trail-2 1.7s infinite paused ease;
447
+ animation: loading-trail-1 1.7s infinite paused ease, loading-trail-2 1.7s infinite paused ease;
448
+ }
449
+ .fg-loading-trail .fg-loading .fg-loader {
450
+ -webkit-animation-play-state: running;
451
+ animation-play-state: running;
452
+ }
453
+
454
+ @-webkit-keyframes loading-trail-1 {
455
+ 0% {
456
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
457
+ }
458
+ 5%,
459
+ 95% {
460
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
461
+ }
462
+ 10%,
463
+ 59% {
464
+ box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
465
+ }
466
+ 20% {
467
+ box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
468
+ }
469
+ 38% {
470
+ box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
471
+ }
472
+ 100% {
473
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
474
+ }
475
+ }
476
+ @keyframes loading-trail-1 {
477
+ 0% {
478
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
479
+ }
480
+ 5%,
481
+ 95% {
482
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
483
+ }
484
+ 10%,
485
+ 59% {
486
+ box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
487
+ }
488
+ 20% {
489
+ box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
490
+ }
491
+ 38% {
492
+ box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
493
+ }
494
+ 100% {
495
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
496
+ }
497
+ }
498
+ @-webkit-keyframes loading-trail-2 {
499
+ 0% {
500
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
501
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
502
+ }
503
+ 100% {
504
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
505
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
506
+ }
507
+ }
508
+ @keyframes loading-trail-2 {
509
+ 0% {
510
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
511
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
512
+ }
513
+ 100% {
514
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
515
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
516
+ }
517
+ }
518
+ .fg-loading-pulse .fg-loader,
519
+ .fg-loading-pulse .fg-loader:before,
520
+ .fg-loading-pulse .fg-loader:after {
521
+ border-radius: 50%;
522
+ width: 2.5em;
523
+ height: 2.5em;
524
+ -webkit-animation: loading-pulse 1.8s infinite both paused ease-in-out;
525
+ animation: loading-pulse 1.8s infinite both paused ease-in-out;
526
+ }
527
+ .fg-loading-pulse .fg-loading .fg-loader,
528
+ .fg-loading-pulse .fg-loading .fg-loader:before,
529
+ .fg-loading-pulse .fg-loading .fg-loader:after {
530
+ -webkit-animation-play-state: running;
531
+ animation-play-state: running;
532
+ }
533
+
534
+ .fg-loading-pulse .fg-loader {
535
+ color: #828282;
536
+ font-size: 4px;
537
+ margin-top: -3.75em;
538
+ margin-left: -1.25em;
539
+ text-indent: -9999em;
540
+ -webkit-animation-delay: -0.16s;
541
+ animation-delay: -0.16s;
542
+ }
543
+ .fg-loading-pulse .fg-loader:before,
544
+ .fg-loading-pulse .fg-loader:after {
545
+ content: '';
546
+ position: absolute;
547
+ top: 0;
548
+ }
549
+ .fg-loading-pulse .fg-loader:before {
550
+ left: -3.5em;
551
+ -webkit-animation-delay: -0.32s;
552
+ animation-delay: -0.32s;
553
+ }
554
+ .fg-loading-pulse .fg-loader:after {
555
+ left: 3.5em;
556
+ }
557
+ @-webkit-keyframes loading-pulse {
558
+ 0%,
559
+ 80%,
560
+ 100% {
561
+ box-shadow: 0 2.5em 0 -1.3em;
562
+ }
563
+ 40% {
564
+ box-shadow: 0 2.5em 0 0;
565
+ }
566
+ }
567
+ @keyframes loading-pulse {
568
+ 0%,
569
+ 80%,
570
+ 100% {
571
+ box-shadow: 0 2.5em 0 -1.3em;
572
+ }
573
+ 40% {
574
+ box-shadow: 0 2.5em 0 0;
575
+ }
576
+ }
577
+ .fg-loading-dots .fg-loader {
578
+ color: #828282;
579
+ font-size: 5px;
580
+ border-radius: 50%;
581
+ text-indent: -9999em;
582
+ -webkit-animation: loading-dots 1.3s infinite paused linear;
583
+ animation: loading-dots 1.3s infinite paused linear;
584
+ }
585
+ .fg-loading-dots .fg-loading .fg-loader {
586
+ -webkit-animation-play-state: running;
587
+ animation-play-state: running;
588
+ }
589
+
590
+ @-webkit-keyframes loading-dots {
591
+ 0%,
592
+ 100% {
593
+ box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
594
+ }
595
+ 12.5% {
596
+ box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
597
+ }
598
+ 25% {
599
+ box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
600
+ }
601
+ 37.5% {
602
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
603
+ }
604
+ 50% {
605
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
606
+ }
607
+ 62.5% {
608
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
609
+ }
610
+ 75% {
611
+ box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
612
+ }
613
+ 87.5% {
614
+ box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
615
+ }
616
+ }
617
+ @keyframes loading-dots {
618
+ 0%,
619
+ 100% {
620
+ box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
621
+ }
622
+ 12.5% {
623
+ box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
624
+ }
625
+ 25% {
626
+ box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
627
+ }
628
+ 37.5% {
629
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
630
+ }
631
+ 50% {
632
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
633
+ }
634
+ 62.5% {
635
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
636
+ }
637
+ 75% {
638
+ box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
639
+ }
640
+ 87.5% {
641
+ box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
642
+ }
643
+ }
644
+ .fg-loading-partial .fg-loader,
645
+ .fg-loading-partial .fg-loader:after {
646
+ border-radius: 50%;
647
+ width: 10em;
648
+ height: 10em;
649
+ }
650
+ .fg-loading-partial .fg-loader {
651
+ font-size: 4px;
652
+ text-indent: -9999em;
653
+ margin-top: 0;
654
+ margin-left: 0;
655
+ border-top: 1.1em solid rgba(130,130,130, 0.2);
656
+ border-right: 1.1em solid rgba(130,130,130, 0.2);
657
+ border-bottom: 1.1em solid rgba(130,130,130, 0.2);
658
+ border-left: 1.1em solid #828282;
659
+ -webkit-animation: loading-partial 1.1s infinite paused linear;
660
+ animation: loading-partial 1.1s infinite paused linear;
661
+ }
662
+ .fg-loading-partial .fg-loading .fg-loader {
663
+ -webkit-animation-play-state: running;
664
+ animation-play-state: running;
665
+ }
666
+
667
+ @-webkit-keyframes loading-partial {
668
+ 0% {
669
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
670
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
671
+ }
672
+ 100% {
673
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
674
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
675
+ }
676
+ }
677
+ @keyframes loading-partial {
678
+ 0% {
679
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
680
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
681
+ }
682
+ 100% {
683
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
684
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
685
+ }
686
+ }
687
+ /* Loaded Effects */
688
+ .foogallery.fg-loaded-fade-in .fg-item.fg-loaded,
689
+ .foogallery.fg-loaded-slide-up .fg-item.fg-loaded,
690
+ .foogallery.fg-loaded-slide-down .fg-item.fg-loaded,
691
+ .foogallery.fg-loaded-slide-left .fg-item.fg-loaded,
692
+ .foogallery.fg-loaded-slide-right .fg-item.fg-loaded,
693
+ .foogallery.fg-loaded-scale-up .fg-item.fg-loaded,
694
+ .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
695
+ .foogallery.fg-loaded-drop .fg-item.fg-loaded,
696
+ .foogallery.fg-loaded-fly .fg-item.fg-loaded,
697
+ .foogallery.fg-loaded-flip .fg-item.fg-loaded {
698
+ transition-timing-function: ease;
699
+ transition-duration: 650ms;
700
+ transition-property: background-color, transform;
701
+ }
702
+ .foogallery.fg-loaded-fade-in .fg-loaded .fg-item-inner,
703
+ .foogallery.fg-loaded-slide-up .fg-loaded .fg-item-inner,
704
+ .foogallery.fg-loaded-slide-down .fg-loaded .fg-item-inner,
705
+ .foogallery.fg-loaded-slide-left .fg-loaded .fg-item-inner,
706
+ .foogallery.fg-loaded-slide-right .fg-loaded .fg-item-inner,
707
+ .foogallery.fg-loaded-scale-up .fg-loaded .fg-item-inner,
708
+ .foogallery.fg-loaded-swing-down .fg-loaded .fg-item-inner,
709
+ .foogallery.fg-loaded-drop .fg-loaded .fg-item-inner,
710
+ .foogallery.fg-loaded-fly .fg-loaded .fg-item-inner,
711
+ .foogallery.fg-loaded-flip .fg-loaded .fg-item-inner {
712
+ transition-timing-function: ease;
713
+ transition-duration: 650ms;
714
+ }
715
+ /* Only apply the perspective once loaded otherwise transitions could take place behind other items*/
716
+ .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
717
+ .foogallery.fg-loaded-drop .fg-item.fg-loaded,
718
+ .foogallery.fg-loaded-fly .fg-item.fg-loaded,
719
+ .foogallery.fg-loaded-flip .fg-item.fg-loaded {
720
+ perspective: 1300px;
721
+ }
722
+ /* Drop */
723
+ .foogallery.fg-loaded-drop .fg-item-inner {
724
+ transition-property: visibility, opacity, transform;
725
+ transform-style: preserve-3d;
726
+ transform: translateZ(400px) translateY(100%) rotateX(-90deg);
727
+ }
728
+ .foogallery.fg-loaded-drop .fg-loaded .fg-item-inner {
729
+ transform: translateZ(0px) translateY(0px) rotateX(0deg);
730
+ }
731
+ /* Fade In */
732
+ .foogallery.fg-loaded-fade-in .fg-item-inner {
733
+ transition-property: visibility, opacity;
734
+ }
735
+ /* Flip */
736
+ .foogallery.fg-loaded-flip .fg-item-inner {
737
+ transition-property: visibility, opacity, transform;
738
+ backface-visibility: hidden;
739
+ transform-style: preserve-3d;
740
+ transform: rotateY(-180deg);
741
+ }
742
+ .foogallery.fg-loaded-flip .fg-loaded .fg-item-inner {
743
+ transform: rotateY(0deg);
744
+ }
745
+ /* Fly */
746
+ .foogallery.fg-loaded-fly .fg-item-inner {
747
+ transition-property: visibility, opacity, transform;
748
+ transform-style: preserve-3d;
749
+ transform-origin: 50% 50% -300px;
750
+ transform: rotateX(-180deg);
751
+ }
752
+ .foogallery.fg-loaded-fly .fg-loaded .fg-item-inner {
753
+ transform: rotateX(0deg);
754
+ }
755
+ /* Scale Up */
756
+ .foogallery.fg-loaded-scale-up .fg-item-inner {
757
+ transition-property: visibility, opacity, transform;
758
+ transform: scale(0.6);
759
+ }
760
+ .foogallery.fg-loaded-scale-up .fg-loaded .fg-item-inner {
761
+ transform: scale(1);
762
+ }
763
+ /* Slide Up */
764
+ .foogallery.fg-loaded-slide-up .fg-item-inner {
765
+ transition-property: visibility, opacity, transform;
766
+ transform: translateY(50%);
767
+ }
768
+ .foogallery.fg-loaded-slide-up .fg-loaded .fg-item-inner {
769
+ transform: translateY(0);
770
+ }
771
+ /* Slide Down */
772
+ .foogallery.fg-loaded-slide-down .fg-item-inner {
773
+ transition-property: visibility, opacity, transform;
774
+ transform: translateY(-50%);
775
+ }
776
+ .foogallery.fg-loaded-slide-down .fg-loaded .fg-item-inner {
777
+ transform: translateY(0);
778
+ }
779
+ /* Slide Left */
780
+ .foogallery.fg-loaded-slide-left .fg-item-inner {
781
+ transition-property: visibility, opacity, transform;
782
+ transform: translateX(50%);
783
+ }
784
+ .foogallery.fg-loaded-slide-left .fg-loaded .fg-item-inner {
785
+ transform: translateX(0);
786
+ }
787
+ /* Slide Right */
788
+ .foogallery.fg-loaded-slide-right .fg-item-inner {
789
+ transition-property: visibility, opacity, transform;
790
+ transform: translateX(-50%);
791
+ }
792
+ .foogallery.fg-loaded-slide-right .fg-loaded .fg-item-inner {
793
+ transform: translateX(0);
794
+ }
795
+ /* Swing Down */
796
+ .foogallery.fg-loaded-swing-down .fg-item-inner {
797
+ transition-property: visibility, opacity, transform;
798
+ transform-style: preserve-3d;
799
+ transform-origin: 0 0;
800
+ transform: rotateX(-80deg);
801
+ }
802
+ .foogallery.fg-loaded-swing-down .fg-loaded .fg-item-inner {
803
+ transform: rotateX(0deg);
804
+ }
805
+ /* Caption Styles */
806
+ .foogallery .fg-caption {
807
+ visibility: hidden;
808
+ opacity: 0;
809
+ position: absolute;
810
+ z-index: 8;
811
+ width: 100%;
812
+ max-height: 100%;
813
+ overflow: hidden;
814
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
815
+ font-size: 13px;
816
+ font-weight: 400;
817
+ line-height: 1.3;
818
+ border: none;
819
+ text-align: center;
820
+ cursor: pointer;
821
+ margin: 0;
822
+ }
823
+ .foogallery .fg-caption a {
824
+ text-decoration: none;
825
+ }
826
+
827
+ .foogallery .fg-caption a:hover {
828
+ border-bottom: none;
829
+ }
830
+
831
+ .foogallery .fg-caption-title {
832
+ box-sizing: content-box;
833
+ white-space: nowrap;
834
+ overflow: hidden;
835
+ text-overflow: ellipsis;
836
+ font-size: 16px;
837
+ font-weight: 400;
838
+ padding: 0;
839
+ margin: 0.4em;
840
+ height: 1.3em;
841
+ min-height: 1.3em;
842
+ line-height: 1.3em;
843
+ }
844
+ .foogallery .fg-caption-desc {
845
+ padding: 0;
846
+ margin: 0.4em;
847
+ overflow: hidden;
848
+ height: 100%;
849
+ max-height: 100%;
850
+ }
851
+ .foogallery .fg-caption-title+.fg-caption-desc {
852
+ margin-top: 0;
853
+ }
854
+
855
+ .foogallery .fg-caption-buttons {
856
+ display: flex;
857
+ position: relative;
858
+ flex-direction: row;
859
+ flex-wrap: wrap;
860
+ align-items: center;
861
+ justify-content: center;
862
+ width: 100%;
863
+ padding: 5px;
864
+ margin: 0;
865
+ }
866
+
867
+ .foogallery .fg-caption-buttons > a {
868
+ display: inline-block;
869
+ position: relative;
870
+ padding: 0.4em 0.8em;
871
+ margin: 1px;
872
+ max-width: 100%;
873
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
874
+ font-size: 12px;
875
+ font-weight: 400;
876
+ line-height: 1.42857143;
877
+ text-align: center;
878
+ white-space: nowrap;
879
+ vertical-align: middle;
880
+ cursor: pointer;
881
+ user-select: none;
882
+ background-image: none;
883
+ text-decoration: none!important;
884
+ border: 1px solid transparent;
885
+ border-radius: 4px;
886
+ box-shadow: none;
887
+ outline: none;
888
+ opacity: 1;
889
+ transition-timing-function: ease-out;
890
+ transition-duration: 0.3s;
891
+ transition-property: color, opacity, border-color, background-color;
892
+ }
893
+
894
+ @media only screen and (max-width: 600px) {
895
+ .foogallery .fg-caption-buttons {
896
+ align-items: stretch;
897
+ }
898
+ .foogallery .fg-caption-buttons > a {
899
+ flex: 1;
900
+ }
901
+ }
902
+
903
+ /* Light */
904
+ .foogallery .fg-caption .fg-caption-buttons > a {
905
+ color: #333;
906
+ background-color: #fff;
907
+ border-color: #ccc;
908
+ }
909
+ .foogallery .fg-caption .fg-caption-buttons > a:not(.fg-disabled):hover {
910
+ color: #333;
911
+ background-color: #e6e6e6;
912
+ border-color: #adadad;
913
+ border-bottom: solid 1px;
914
+ }
915
+ .foogallery .fg-caption .fg-caption-buttons > a.fg-disabled {
916
+ color: #9d9d9d;
917
+ }
918
+ .foogallery .fg-caption .fg-caption-buttons > a.fg-disabled:hover {
919
+ border-bottom: solid 1px;
920
+ }
921
+
922
+ /* Dark */
923
+ .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a {
924
+ color: #FFF;
925
+ background-color: #444;
926
+ border-color: #333;
927
+ }
928
+ .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a:not(.fg-disabled):hover {
929
+ color: #9d9d9d;
930
+ background-color: #333;
931
+ border-color: #222;
932
+ }
933
+ .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a.fg-disabled {
934
+ color: #9d9d9d;
935
+ }
936
+ .foogallery.fg-light-overlays .fg-caption .fg-caption-buttons > a.fg-disabled:hover {
937
+ border-bottom: solid 1px;
938
+ }
939
+
940
+ /* Always */
941
+ .foogallery.fg-caption-always .fg-item .fg-caption .fg-caption-inner:before {
942
+ display: none;
943
+ }
944
+ .foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption {
945
+ left: 0;
946
+ bottom: 0;
947
+ transition-timing-function: ease;
948
+ transition-duration: 300ms;
949
+ transition-property: visibility, opacity;
950
+ visibility: visible;
951
+ opacity: 1;
952
+ }
953
+ .foogallery.fg-caption-always .fg-caption {
954
+ text-align: left;
955
+ }
956
+
957
+ /* On Hover */
958
+ .foogallery.fg-caption-hover .fg-caption .fg-caption-inner {
959
+ display: flex;
960
+ flex-direction: column;
961
+ align-items: center;
962
+ justify-content: center;
963
+ width: 100%;
964
+ max-height: 100%;
965
+ position: absolute;
966
+ top: 50%;
967
+ left: 0;
968
+ transform: translateY(-50%);
969
+ padding: 0.4em;
970
+ }
971
+ .foogallery.fg-caption-hover .fg-item.fg-loaded .fg-image-overlay {
972
+ display: none;
973
+ }
974
+
975
+ /* Alignment */
976
+ .foogallery.fg-c-l .fg-caption,
977
+ .foogallery.fg-caption-always.fg-c-l .fg-caption {
978
+ text-align: left;
979
+ }
980
+ .foogallery.fg-c-c .fg-caption,
981
+ .foogallery.fg-caption-always.fg-c-c .fg-caption {
982
+ text-align: center;
983
+ }
984
+ .foogallery.fg-c-r .fg-caption,
985
+ .foogallery.fg-caption-always.fg-c-r .fg-caption {
986
+ text-align: right;
987
+ }
988
+ .foogallery.fg-c-j .fg-caption,
989
+ .foogallery.fg-caption-always.fg-c-j .fg-caption {
990
+ text-align: justify;
991
+ }
992
+ /* Icon & Overlay */
993
+ .foogallery .fg-image-overlay:before {
994
+ content: "";
995
+ display: block;
996
+ position: absolute;
997
+ top: 50%;
998
+ left: 50%;
999
+ transform: translateX(-50%) translateY(-50%);
1000
+ width: 32px;
1001
+ height: 32px;
1002
+ background-size: 32px 32px;
1003
+ background-position: center center;
1004
+ background-repeat: no-repeat;
1005
+ min-width: 32px;
1006
+ min-height: 32px;
1007
+ }
1008
+ .foogallery .fg-caption-inner:before {
1009
+ content: "";
1010
+ display: none;
1011
+ position: relative;
1012
+ width: 32px;
1013
+ height: 32px;
1014
+ margin: 0.4em;
1015
+ background-size: 32px 32px;
1016
+ vertical-align: middle;
1017
+ background-position: center center;
1018
+ background-repeat: no-repeat;
1019
+ min-width: 32px;
1020
+ min-height: 32px;
1021
+ }
1022
+ .foogallery.fg-hover-zoom:not(.fg-preset) .fg-caption-inner:before,
1023
+ .foogallery.fg-hover-zoom2:not(.fg-preset) .fg-caption-inner:before,
1024
+ .foogallery.fg-hover-zoom3:not(.fg-preset) .fg-caption-inner:before,
1025
+ .foogallery.fg-hover-plus:not(.fg-preset) .fg-caption-inner:before,
1026
+ .foogallery.fg-hover-circle-plus:not(.fg-preset) .fg-caption-inner:before,
1027
+ .foogallery.fg-hover-eye:not(.fg-preset) .fg-caption-inner:before,
1028
+ .foogallery.fg-hover-external:not(.fg-preset) .fg-caption-inner:before,
1029
+ .foogallery.fg-hover-tint:not(.fg-preset) .fg-caption-inner:before,
1030
+ .foogallery.fg-hover-cart:not(.fg-preset) .fg-caption-inner:before,
1031
+ .foogallery.fg-video-default:not(.fg-preset) .fg-caption-inner:before,
1032
+ .foogallery.fg-video-1:not(.fg-preset) .fg-caption-inner:before,
1033
+ .foogallery.fg-video-2:not(.fg-preset) .fg-caption-inner:before,
1034
+ .foogallery.fg-video-3:not(.fg-preset) .fg-caption-inner:before,
1035
+ .foogallery.fg-video-4:not(.fg-preset) .fg-caption-inner:before {
1036
+ display: block;
1037
+ }
1038
+
1039
+ .foogallery.fg-hover-zoom:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1040
+ .foogallery.fg-hover-zoom2:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1041
+ .foogallery.fg-hover-zoom3:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1042
+ .foogallery.fg-hover-plus:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1043
+ .foogallery.fg-hover-circle-plus:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1044
+ .foogallery.fg-hover-eye:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1045
+ .foogallery.fg-hover-external:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1046
+ .foogallery.fg-hover-tint:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1047
+ .foogallery.fg-hover-cart:not(.fg-preset) .fg-item-inner:hover .fg-image-overlay,
1048
+ .foogallery.fg-video-default:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1049
+ .foogallery.fg-video-1:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1050
+ .foogallery.fg-video-2:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1051
+ .foogallery.fg-video-3:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay,
1052
+ .foogallery.fg-video-4:not(.fg-preset) .fg-type-video .fg-item-inner:hover .fg-image-overlay {
1053
+ visibility: visible;
1054
+ opacity: 1;
1055
+ }
1056
+ .foogallery.fg-video-sticky .fg-type-video.fg-loaded .fg-item-inner .fg-image-overlay {
1057
+ background-color: transparent;
1058
+ visibility: visible;
1059
+ opacity: 1;
1060
+ display: block;
1061
+ }
1062
+ .foogallery.fg-video-sticky .fg-type-video .fg-caption-inner:before {
1063
+ display: none;
1064
+ }
1065
+
1066
+ .foogallery.fg-hover-zoom .fg-image-overlay:before,
1067
+ .foogallery.fg-hover-zoom .fg-caption-inner:before {
1068
+ background-image: url('../img/icons.svg#zoom-light');
1069
+ }
1070
+ .foogallery.fg-light-overlays.fg-hover-zoom .fg-image-overlay:before,
1071
+ .foogallery.fg-light-overlays.fg-hover-zoom .fg-caption-inner:before {
1072
+ background-image: url('../img/icons.svg#zoom-dark');
1073
+ }
1074
+
1075
+ .foogallery.fg-hover-zoom2 .fg-image-overlay:before,
1076
+ .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
1077
+ background-image: url('../img/icons.svg#zoom2-light');
1078
+ }
1079
+ .foogallery.fg-light-overlays.fg-hover-zoom2 .fg-image-overlay:before,
1080
+ .foogallery.fg-light-overlays.fg-hover-zoom2 .fg-caption-inner:before {
1081
+ background-image: url('../img/icons.svg#zoom2-dark');
1082
+ }
1083
+
1084
+ .foogallery.fg-hover-zoom3 .fg-image-overlay:before,
1085
+ .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
1086
+ background-image: url('../img/icons.svg#zoom3-light');
1087
+ }
1088
+ .foogallery.fg-light-overlays.fg-hover-zoom3 .fg-image-overlay:before,
1089
+ .foogallery.fg-light-overlays.fg-hover-zoom3 .fg-caption-inner:before {
1090
+ background-image: url('../img/icons.svg#zoom3-dark');
1091
+ }
1092
+
1093
+ .foogallery.fg-hover-plus .fg-image-overlay:before,
1094
+ .foogallery.fg-hover-plus .fg-caption-inner:before {
1095
+ background-image: url('../img/icons.svg#plus-light');
1096
+ }
1097
+ .foogallery.fg-light-overlays.fg-hover-plus .fg-image-overlay:before,
1098
+ .foogallery.fg-light-overlays.fg-hover-plus .fg-caption-inner:before {
1099
+ background-image: url('../img/icons.svg#plus-dark');
1100
+ }
1101
+
1102
+ .foogallery.fg-hover-circle-plus .fg-image-overlay:before,
1103
+ .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
1104
+ background-image: url('../img/icons.svg#circle-plus-light');
1105
+ }
1106
+ .foogallery.fg-light-overlays.fg-hover-circle-plus .fg-image-overlay:before,
1107
+ .foogallery.fg-light-overlays.fg-hover-circle-plus .fg-caption-inner:before {
1108
+ background-image: url('../img/icons.svg#circle-plus-dark');
1109
+ }
1110
+
1111
+ .foogallery.fg-hover-eye .fg-image-overlay:before,
1112
+ .foogallery.fg-hover-eye .fg-caption-inner:before {
1113
+ background-image: url('../img/icons.svg#eye-light');
1114
+ }
1115
+ .foogallery.fg-light-overlays.fg-hover-eye .fg-image-overlay:before,
1116
+ .foogallery.fg-light-overlays.fg-hover-eye .fg-caption-inner:before {
1117
+ background-image: url('../img/icons.svg#eye-dark');
1118
+ }
1119
+
1120
+ .foogallery.fg-hover-external .fg-image-overlay:before,
1121
+ .foogallery.fg-hover-external .fg-caption-inner:before {
1122
+ background-image: url('../img/icons.svg#external-light');
1123
+ }
1124
+ .foogallery.fg-light-overlays.fg-hover-external .fg-image-overlay:before,
1125
+ .foogallery.fg-light-overlays.fg-hover-external .fg-caption-inner:before {
1126
+ background-image: url('../img/icons.svg#external-dark');
1127
+ }
1128
+
1129
+ .foogallery.fg-hover-cart .fg-image-overlay:before,
1130
+ .foogallery.fg-hover-cart .fg-caption-inner:before {
1131
+ background-image: url('../img/icons.svg#cart-light');
1132
+ }
1133
+ .foogallery.fg-light-overlays.fg-hover-cart .fg-image-overlay:before,
1134
+ .foogallery.fg-light-overlays.fg-hover-cart .fg-caption-inner:before {
1135
+ background-image: url('../img/icons.svg#cart-dark');
1136
+ }
1137
+
1138
+ .foogallery.fg-video-default .fg-type-video .fg-image-overlay:before,
1139
+ .foogallery.fg-video-default .fg-type-video .fg-caption-inner:before {
1140
+ background-image: url('../img/icons.svg#video-default-light');
1141
+ }
1142
+ .foogallery.fg-light-overlays.fg-video-default .fg-type-video .fg-image-overlay:before,
1143
+ .foogallery.fg-light-overlays.fg-video-default .fg-type-video .fg-caption-inner:before {
1144
+ background-image: url('../img/icons.svg#video-default-dark');
1145
+ }
1146
+
1147
+ .foogallery.fg-video-1 .fg-type-video .fg-image-overlay:before,
1148
+ .foogallery.fg-video-1 .fg-type-video .fg-caption-inner:before {
1149
+ background-image: url('../img/icons.svg#video-1-light');
1150
+ }
1151
+ .foogallery.fg-light-overlays.fg-video-1 .fg-type-video .fg-image-overlay:before,
1152
+ .foogallery.fg-light-overlays.fg-video-1 .fg-type-video .fg-caption-inner:before {
1153
+ background-image: url('../img/icons.svg#video-1-dark');
1154
+ }
1155
+
1156
+ .foogallery.fg-video-2 .fg-type-video .fg-image-overlay:before,
1157
+ .foogallery.fg-video-2 .fg-type-video .fg-caption-inner:before {
1158
+ background-image: url('../img/icons.svg#video-2-light');
1159
+ }
1160
+ .foogallery.fg-light-overlays.fg-video-2 .fg-type-video .fg-image-overlay:before,
1161
+ .foogallery.fg-light-overlays.fg-video-2 .fg-type-video .fg-caption-inner:before {
1162
+ background-image: url('../img/icons.svg#video-2-dark');
1163
+ }
1164
+
1165
+ .foogallery.fg-video-3 .fg-type-video .fg-image-overlay:before,
1166
+ .foogallery.fg-video-3 .fg-type-video .fg-caption-inner:before {
1167
+ background-image: url('../img/icons.svg#video-3-light');
1168
+ }
1169
+ .foogallery.fg-light-overlays.fg-video-3 .fg-type-video .fg-image-overlay:before,
1170
+ .foogallery.fg-light-overlays.fg-video-3 .fg-type-video .fg-caption-inner:before {
1171
+ background-image: url('../img/icons.svg#video-3-dark');
1172
+ }
1173
+
1174
+ .foogallery.fg-video-4 .fg-type-video .fg-image-overlay:before,
1175
+ .foogallery.fg-video-4 .fg-type-video .fg-caption-inner:before {
1176
+ background-image: url('../img/icons.svg#video-4-light');
1177
+ }
1178
+ .foogallery.fg-light-overlays.fg-video-4 .fg-type-video .fg-image-overlay:before,
1179
+ .foogallery.fg-light-overlays.fg-video-4 .fg-type-video .fg-caption-inner:before {
1180
+ background-image: url('../img/icons.svg#video-4-dark');
1181
+ }
1182
+ /* Transitions */
1183
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption,
1184
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption,
1185
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1186
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1187
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1188
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,
1189
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,
1190
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-loaded .fg-caption,
1191
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-loaded .fg-caption,
1192
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-loaded .fg-caption,
1193
+ .foogallery.fg-hover-instant .fg-loaded .fg-image-overlay,
1194
+ .foogallery.fg-hover-fade .fg-loaded .fg-image-overlay,
1195
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1196
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1197
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1198
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1199
+ .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1200
+ .foogallery.fg-hover-colorize .fg-loaded .fg-image-overlay,
1201
+ .foogallery.fg-hover-grayscale .fg-loaded .fg-image-overlay,
1202
+ .foogallery.fg-hover-scale .fg-item.fg-loaded,
1203
+ .foogallery.fg-hover-scale .fg-loaded .fg-image-overlay,
1204
+ .foogallery.fg-hover-zoomed .fg-loaded .fg-image,
1205
+ .foogallery.fg-hover-colorize .fg-loaded .fg-image,
1206
+ .foogallery.fg-hover-grayscale .fg-loaded .fg-image {
1207
+ transition-timing-function: ease;
1208
+ transition-duration: 300ms;
1209
+ backface-visibility: hidden;
1210
+ }
1211
+ /* Colorize */
1212
+ .foogallery.fg-hover-colorize .fg-image {
1213
+ filter: grayscale(100%);
1214
+ transition-property: filter;
1215
+ }
1216
+ .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image,
1217
+ .foogallery.fg-hover-colorize .fg-item-inner:focus-within .fg-image {
1218
+ filter: grayscale(0%);
1219
+ }
1220
+ .foogallery.fg-hover-colorize .fg-image-overlay,
1221
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption {
1222
+ display: block;
1223
+ left: 0;
1224
+ top: 0;
1225
+ bottom: 0;
1226
+ transition-property: visibility, opacity, background-color;
1227
+ }
1228
+ .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image-overlay,
1229
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption,
1230
+ .foogallery.fg-hover-colorize .fg-item-inner:focus-within .fg-image-overlay,
1231
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:focus-within .fg-caption {
1232
+ visibility: visible;
1233
+ opacity: 1;
1234
+ }
1235
+ /* Fade */
1236
+ .foogallery.fg-hover-fade .fg-loaded .fg-image-overlay,
1237
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption {
1238
+ display: block;
1239
+ left: 0;
1240
+ top: 0;
1241
+ bottom: 0;
1242
+ transition-property: visibility, opacity, background-color;
1243
+ }
1244
+ .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1245
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption,
1246
+ .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1247
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:focus-within .fg-caption {
1248
+ visibility: visible;
1249
+ opacity: 1;
1250
+ }
1251
+ /* Grayscale */
1252
+ .foogallery.fg-hover-grayscale .fg-image {
1253
+ filter: grayscale(0%);
1254
+ transition-property: filter;
1255
+ }
1256
+ .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image,
1257
+ .foogallery.fg-hover-grayscale .fg-item-inner:focus-within .fg-image {
1258
+ filter: grayscale(100%);
1259
+ }
1260
+ .foogallery.fg-hover-grayscale .fg-image-overlay,
1261
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption {
1262
+ display: block;
1263
+ left: 0;
1264
+ top: 0;
1265
+ bottom: 0;
1266
+ transition-property: visibility, opacity, background-color;
1267
+ }
1268
+ .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image-overlay,
1269
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption,
1270
+ .foogallery.fg-hover-grayscale .fg-item-inner:focus-within .fg-image-overlay,
1271
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:focus-within .fg-caption {
1272
+ visibility: visible;
1273
+ opacity: 1;
1274
+ }
1275
+ /* Instant */
1276
+ .foogallery.fg-hover-instant .fg-loaded .fg-image-overlay,
1277
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption {
1278
+ display: block;
1279
+ left: 0;
1280
+ top: 0;
1281
+ bottom: 0;
1282
+ transition-property: none;
1283
+ }
1284
+ .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1285
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption,
1286
+ .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1287
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:focus-within .fg-caption {
1288
+ visibility: visible;
1289
+ opacity: 1;
1290
+ }
1291
+ /* Push */
1292
+ .foogallery.fg-hover-push .fg-loaded .fg-image-overlay,
1293
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1294
+ display: block;
1295
+ left: 0;
1296
+ top: 0;
1297
+ bottom: 0;
1298
+ transform: translateX(100%);
1299
+ visibility: visible;
1300
+ opacity: 1;
1301
+ }
1302
+ .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1303
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1304
+ transition-property: transform;
1305
+ }
1306
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption,
1307
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:focus-within .fg-caption {
1308
+ transform: translateY(0);
1309
+ }
1310
+ .foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1311
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1312
+ .foogallery.fg-hover-push .fg-loaded .fg-item-inner .fg-thumb:focus,
1313
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner .fg-thumb:focus {
1314
+ transform: translateX(-100%);
1315
+ }
1316
+ /* Scale */
1317
+ .foogallery.fg-hover-scale .fg-item {
1318
+ transition-property: transform;
1319
+ z-index: 4;
1320
+ }
1321
+
1322
+ .foogallery.fg-hover-scale .fg-item:hover,
1323
+ .foogallery.fg-hover-scale .fg-item:focus-within {
1324
+ transform: scale(1.048);
1325
+ z-index: 10;
1326
+ }
1327
+ .foogallery.fg-hover-scale .fg-image-overlay,
1328
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-caption {
1329
+ display: block;
1330
+ left: 0;
1331
+ top: 0;
1332
+ bottom: 0;
1333
+ transition-property: visibility, opacity, background-color;
1334
+ }
1335
+ .foogallery.fg-hover-scale .fg-item-inner:hover .fg-image-overlay,
1336
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption,
1337
+ .foogallery.fg-hover-scale .fg-item-inner:focus-within .fg-image-overlay,
1338
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:focus-within .fg-caption {
1339
+ visibility: visible;
1340
+ opacity: 1;
1341
+ }
1342
+ /* Zoomed */
1343
+ .foogallery.fg-hover-zoomed .fg-image {
1344
+ transition-property: transform;
1345
+ z-index: 4;
1346
+ }
1347
+ .foogallery.fg-hover-zoomed .fg-item:hover .fg-image,
1348
+ .foogallery.fg-hover-zoomed .fg-item:focus-within .fg-image {
1349
+ transform: scale(1.15);
1350
+ }
1351
+ .foogallery.fg-hover-zoomed .fg-image-wrap {
1352
+ overflow: hidden;
1353
+ }
1354
+
1355
+ .foogallery.fg-hover-zoomed .fg-image-overlay,
1356
+ .foogallery.fg-caption-hover.fg-hover-zoomed .fg-caption {
1357
+ display: block;
1358
+ left: 0;
1359
+ top: 0;
1360
+ bottom: 0;
1361
+ transition-property: visibility, opacity, background-color;
1362
+ }
1363
+ .foogallery.fg-hover-zoomed .fg-item-inner:hover .fg-image-overlay,
1364
+ .foogallery.fg-caption-hover.fg-hover-zoomed .fg-item-inner:hover .fg-caption,
1365
+ .foogallery.fg-hover-zoomed .fg-item-inner:focus-within .fg-image-overlay,
1366
+ .foogallery.fg-caption-hover.fg-hover-zoomed .fg-item-inner:focus-within .fg-caption {
1367
+ visibility: visible;
1368
+ opacity: 1;
1369
+ }
1370
+ /* Slide */
1371
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1372
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1373
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1374
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1375
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1376
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1377
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1378
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1379
+ display: block;
1380
+ left: 0;
1381
+ top: 0;
1382
+ bottom: 0;
1383
+ transition-property: transform, background-color, opacity, visibility;
1384
+ visibility: visible;
1385
+ opacity: 1;
1386
+ }
1387
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1388
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,
1389
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1390
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,
1391
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1392
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,
1393
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-image-overlay,
1394
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption,
1395
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1396
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:focus-within .fg-caption,
1397
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1398
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:focus-within .fg-caption,
1399
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1400
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:focus-within .fg-caption,
1401
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:focus-within .fg-image-overlay,
1402
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:focus-within .fg-caption {
1403
+ transform: translateY(0) translateX(0);
1404
+ }
1405
+
1406
+
1407
+ /* Slide Up */
1408
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-image-overlay,
1409
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption {
1410
+ transform: translateY(100%);
1411
+ }
1412
+
1413
+ /* Slide Down */
1414
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-image-overlay,
1415
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption {
1416
+ transform: translateY(-100%);
1417
+ }
1418
+
1419
+ /* Slide Left */
1420
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-image-overlay,
1421
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption {
1422
+ transform: translateX(100%);
1423
+ }
1424
+
1425
+ /* Slide Right */
1426
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-image-overlay,
1427
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1428
+ transform: translateX(-100%);
1429
+ }
1430
+ .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1431
+ box-sizing: border-box;
1432
+ }
1433
+ .fg-paging-container {
1434
+ display: block;
1435
+ padding: 15px;
1436
+ margin-top: 0!important;
1437
+ margin-bottom: 0!important;
1438
+ margin-left: auto;
1439
+ margin-right: auto;
1440
+ text-align: center;
1441
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1442
+ -webkit-user-select: none;
1443
+ -moz-user-select: none;
1444
+ -ms-user-select: none;
1445
+ user-select: none;
1446
+ }
1447
+ .fg-ph-dots:after {
1448
+ display: block;
1449
+ content: '';
1450
+ width: 0;
1451
+ height: 22px;
1452
+ }
1453
+
1454
+ .fg-paging-container .fg-dots,
1455
+ .fg-paging-container .fg-dot-item {
1456
+ display: inline-block;
1457
+ margin: 0;
1458
+ padding: 0;
1459
+ outline: none;
1460
+ list-style: none;
1461
+ }
1462
+ .fg-paging-container .fg-dot-item .fg-dot-link {
1463
+ display: inline-block;
1464
+ margin: 3px;
1465
+ font-weight: 400;
1466
+ line-height: 1.42857143;
1467
+ text-align: center;
1468
+ white-space: nowrap;
1469
+ vertical-align: middle;
1470
+ cursor: pointer;
1471
+ user-select: none;
1472
+ background-image: none;
1473
+ text-decoration: none;
1474
+ border: 1px solid transparent;
1475
+ position: relative;
1476
+ border-radius: 50%;
1477
+ padding: 0;
1478
+ font-size: 0;
1479
+ outline: none;
1480
+ color: transparent;
1481
+ box-shadow: none;
1482
+ }
1483
+ .fg-paging-container .fg-dot-item .fg-dot-link:before {
1484
+ content: "";
1485
+ background-color: transparent;
1486
+ border: 1px solid transparent;
1487
+ display: block;
1488
+ border-radius: 50%;
1489
+ width: 9px;
1490
+ height: 9px;
1491
+ padding: 0;
1492
+ margin: 2px;
1493
+ }
1494
+ .fg-paging-container .fg-dot-item .fg-dot-link:active,
1495
+ .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1496
+ .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1497
+ text-decoration: none;
1498
+ box-shadow: none;
1499
+ outline: none;
1500
+ }
1501
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1502
+ .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1503
+ cursor: not-allowed;
1504
+ pointer-events: none;
1505
+ }
1506
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1507
+ cursor: not-allowed;
1508
+ pointer-events: none;
1509
+ outline: none;
1510
+ }
1511
+
1512
+ /* Light - Dots */
1513
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1514
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1515
+ transition-timing-function: ease-out;
1516
+ transition-duration: 0.3s;
1517
+ transition-property: color, border-color, background-color;
1518
+ }
1519
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1520
+ background-color: #eee;
1521
+ border-color: #9d9d9d;
1522
+ }
1523
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1524
+ border-color: #888;
1525
+ }
1526
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1527
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1528
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1529
+ background-color: #666;
1530
+ border-color: #888;
1531
+ }
1532
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1533
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1534
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1535
+ background-color: #eee;
1536
+ border-color: #9d9d9d;
1537
+ opacity: 0.5;
1538
+ }
1539
+
1540
+ /* Dark - Dots */
1541
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1542
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1543
+ transition-timing-function: ease-out;
1544
+ transition-duration: 0.3s;
1545
+ transition-property: color, border-color, background-color;
1546
+ }
1547
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1548
+ background-color: #666;
1549
+ border-color: #333;
1550
+ }
1551
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1552
+ border-color: #444;
1553
+ }
1554
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1555
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1556
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1557
+ background-color: #333;
1558
+ border-color: #444;
1559
+ }
1560
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1561
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1562
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1563
+ background-color: #666;
1564
+ border-color: #333;
1565
+ opacity: 0.5;
1566
+ }
1567
+ .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1568
+ box-sizing: border-box;
1569
+ }
1570
+ .fg-paging-container {
1571
+ display: block;
1572
+ padding: 15px;
1573
+ margin-top: 0!important;
1574
+ margin-bottom: 0!important;
1575
+ margin-left: auto;
1576
+ margin-right: auto;
1577
+ text-align: center;
1578
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1579
+ -webkit-user-select: none;
1580
+ -moz-user-select: none;
1581
+ -ms-user-select: none;
1582
+ user-select: none;
1583
+ }
1584
+ .fg-ph-dots:after {
1585
+ display: block;
1586
+ content: '';
1587
+ width: 0;
1588
+ height: 22px;
1589
+ }
1590
+
1591
+ .fg-paging-container .fg-dots,
1592
+ .fg-paging-container .fg-dot-item {
1593
+ display: inline-block;
1594
+ margin: 0;
1595
+ padding: 0;
1596
+ outline: none;
1597
+ list-style: none;
1598
+ }
1599
+ .fg-paging-container .fg-dot-item .fg-dot-link {
1600
+ display: inline-block;
1601
+ margin: 3px;
1602
+ font-weight: 400;
1603
+ line-height: 1.42857143;
1604
+ text-align: center;
1605
+ white-space: nowrap;
1606
+ vertical-align: middle;
1607
+ cursor: pointer;
1608
+ user-select: none;
1609
+ background-image: none;
1610
+ text-decoration: none;
1611
+ border: 1px solid transparent;
1612
+ position: relative;
1613
+ border-radius: 50%;
1614
+ padding: 0;
1615
+ font-size: 0;
1616
+ outline: none;
1617
+ color: transparent;
1618
+ box-shadow: none;
1619
+ }
1620
+ .fg-paging-container .fg-dot-item .fg-dot-link:before {
1621
+ content: "";
1622
+ background-color: transparent;
1623
+ border: 1px solid transparent;
1624
+ display: block;
1625
+ border-radius: 50%;
1626
+ width: 9px;
1627
+ height: 9px;
1628
+ padding: 0;
1629
+ margin: 2px;
1630
+ }
1631
+ .fg-paging-container .fg-dot-item .fg-dot-link:active,
1632
+ .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1633
+ .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1634
+ text-decoration: none;
1635
+ box-shadow: none;
1636
+ outline: none;
1637
+ }
1638
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1639
+ .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1640
+ cursor: not-allowed;
1641
+ pointer-events: none;
1642
+ }
1643
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1644
+ cursor: not-allowed;
1645
+ pointer-events: none;
1646
+ outline: none;
1647
+ }
1648
+
1649
+ /* Light - Dots */
1650
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1651
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1652
+ transition-timing-function: ease-out;
1653
+ transition-duration: 0.3s;
1654
+ transition-property: color, border-color, background-color;
1655
+ }
1656
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1657
+ background-color: #eee;
1658
+ border-color: #9d9d9d;
1659
+ }
1660
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1661
+ border-color: #888;
1662
+ }
1663
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1664
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1665
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1666
+ background-color: #666;
1667
+ border-color: #888;
1668
+ }
1669
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1670
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1671
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1672
+ background-color: #eee;
1673
+ border-color: #9d9d9d;
1674
+ opacity: 0.5;
1675
+ }
1676
+
1677
+ /* Dark - Dots */
1678
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1679
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1680
+ transition-timing-function: ease-out;
1681
+ transition-duration: 0.3s;
1682
+ transition-property: color, border-color, background-color;
1683
+ }
1684
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1685
+ background-color: #666;
1686
+ border-color: #333;
1687
+ }
1688
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1689
+ border-color: #444;
1690
+ }
1691
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1692
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1693
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1694
+ background-color: #333;
1695
+ border-color: #444;
1696
+ }
1697
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1698
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1699
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1700
+ background-color: #666;
1701
+ border-color: #333;
1702
+ opacity: 0.5;
1703
+ }
1704
+ /* Base styles */
1705
+ .fg-default:after {
1706
+ content: '';
1707
+ display: block;
1708
+ clear: both;
1709
+ }
1710
+
1711
+ .fg-default .fg-item {
1712
+ display: inline-block;
1713
+ vertical-align: top;
1714
+ max-width: 100%;
1715
+ }
1716
+ .fg-default .fg-item-inner,
1717
+ .fg-default .fg-thumb {
1718
+ display: block;
1719
+ vertical-align: top;
1720
+ max-width: 100%;
1721
+ }
1722
+
1723
+ .fg-default .fg-image {
1724
+ border-radius: 0;
1725
+ display: block;
1726
+ max-width: 100%;
1727
+ height: auto;
1728
+ margin: 0;
1729
+ padding: 0;
1730
+ }
1731
+
1732
+ /* Horizontal alignment */
1733
+ .fg-default .fg-image {
1734
+ vertical-align: top;
1735
+ }
1736
+
1737
+ .fg-default.fg-left {
1738
+ text-align: left;
1739
+ }
1740
+
1741
+ .fg-default.fg-center {
1742
+ text-align: center;
1743
+ }
1744
+
1745
+ .fg-default.fg-right {
1746
+ text-align: right;
1747
+ }
1748
+
1749
+ /* Gutter widths */
1750
+ .fg-default.fg-gutter-5 {
1751
+ padding-left: 5px;
1752
+ margin-bottom: -5px;
1753
+ }
1754
+ .fg-default.fg-gutter-5 .fg-item {
1755
+ margin-right: 5px;
1756
+ margin-bottom: 5px;
1757
+ }
1758
+
1759
+ .fg-default.fg-gutter-10 {
1760
+ padding-left: 10px;
1761
+ margin-bottom: -10px;
1762
+ }
1763
+ .fg-default.fg-gutter-10 .fg-item {
1764
+ margin-right: 10px;
1765
+ margin-bottom: 10px;
1766
+ }
1767
+
1768
+ .fg-default.fg-gutter-15 {
1769
+ padding-left: 15px;
1770
+ margin-bottom: -15px;
1771
+ }
1772
+ .fg-default.fg-gutter-15 .fg-item {
1773
+ margin-right: 15px;
1774
+ margin-bottom: 15px;
1775
+ }
1776
+
1777
+ .fg-default.fg-gutter-20 {
1778
+ padding-left: 20px;
1779
+ margin-bottom: -20px;
1780
+ }
1781
+ .fg-default.fg-gutter-20 .fg-item {
1782
+ margin-right: 20px;
1783
+ margin-bottom: 20px;
1784
+ }
1785
+
1786
+ .fg-default.fg-gutter-25 {
1787
+ padding-left: 25px;
1788
+ margin-bottom: -25px;
1789
+ }
1790
+ .fg-default.fg-gutter-25 .fg-item {
1791
+ margin-right: 25px;
1792
+ margin-bottom: 25px;
1793
+ }
1794
+
1795
+
1796
+ @media only screen and (max-width: 600px){
1797
+ .fg-default.fg-m-col1 .fg-image,
1798
+ .fg-default.fg-m-col2 .fg-image,
1799
+ .fg-default.fg-m-col3 .fg-image {
1800
+ width: 100%;
1801
+ }
1802
+ .fg-default.fg-m-col1.fg-gutter-5 .fg-item {
1803
+ width: calc(100% - 10px);
1804
+ min-width: calc(100% - 10px);
1805
+ max-width: calc(100% - 10px);
1806
+ }
1807
+ .fg-default.fg-m-col2.fg-gutter-5 .fg-item {
1808
+ width: calc(50% - 10px);
1809
+ min-width: calc(50% - 10px);
1810
+ max-width: calc(50% - 10px);
1811
+ }
1812
+ .fg-default.fg-m-col3.fg-gutter-5 .fg-item {
1813
+ width: calc(33.33% - 10px);
1814
+ min-width: calc(33.33% - 10px);
1815
+ max-width: calc(33.33% - 10px);
1816
+ }
1817
+
1818
+ .fg-default.fg-m-col1.fg-gutter-10 .fg-item {
1819
+ width: calc(100% - 20px);
1820
+ min-width: calc(100% - 20px);
1821
+ max-width: calc(100% - 20px);
1822
+ }
1823
+ .fg-default.fg-m-col2.fg-gutter-10 .fg-item {
1824
+ width: calc(50% - 20px);
1825
+ min-width: calc(50% - 20px);
1826
+ max-width: calc(50% - 20px);
1827
+ }
1828
+ .fg-default.fg-m-col3.fg-gutter-10 .fg-item {
1829
+ width: calc(33.33% - 20px);
1830
+ min-width: calc(33.33% - 20px);
1831
+ max-width: calc(33.33% - 20px);
1832
+ }
1833
+
1834
+ .fg-default.fg-m-col1.fg-gutter-15 .fg-item {
1835
+ width: calc(100% - 30px);
1836
+ min-width: calc(100% - 30px);
1837
+ max-width: calc(100% - 30px);
1838
+ }
1839
+ .fg-default.fg-m-col2.fg-gutter-15 .fg-item {
1840
+ width: calc(50% - 30px);
1841
+ min-width: calc(50% - 30px);
1842
+ max-width: calc(50% - 30px);
1843
+ }
1844
+ .fg-default.fg-m-col3.fg-gutter-15 .fg-item {
1845
+ width: calc(33.33% - 30px);
1846
+ min-width: calc(33.33% - 30px);
1847
+ max-width: calc(33.33% - 30px);
1848
+ }
1849
+
1850
+ .fg-default.fg-m-col1.fg-gutter-20 .fg-item {
1851
+ width: calc(100% - 40px);
1852
+ min-width: calc(100% - 40px);
1853
+ max-width: calc(100% - 40px);
1854
+ }
1855
+ .fg-default.fg-m-col2.fg-gutter-20 .fg-item {
1856
+ width: calc(50% - 40px);
1857
+ min-width: calc(50% - 40px);
1858
+ max-width: calc(50% - 40px);
1859
+ }
1860
+ .fg-default.fg-m-col3.fg-gutter-20 .fg-item {
1861
+ width: calc(33.33% - 40px);
1862
+ min-width: calc(33.33% - 40px);
1863
+ max-width: calc(33.33% - 40px);
1864
+ }
1865
+
1866
+ .fg-default.fg-m-col1.fg-gutter-25 .fg-item {
1867
+ width: calc(100% - 50px);
1868
+ min-width: calc(100% - 50px);
1869
+ max-width: calc(100% - 50px);
1870
+ }
1871
+ .fg-default.fg-m-col2.fg-gutter-25 .fg-item {
1872
+ width: calc(50% - 50px);
1873
+ min-width: calc(50% - 50px);
1874
+ max-width: calc(50% - 50px);
1875
+ }
1876
+ .fg-default.fg-m-col3.fg-gutter-25 .fg-item {
1877
+ width: calc(33.33% - 50px);
1878
+ min-width: calc(33.33% - 50px);
1879
+ max-width: calc(33.33% - 50px);
1880
+ }
1881
+ }
1882
+ /* Base styles */
1883
+ .fg-masonry * {
1884
+ box-sizing: border-box;
1885
+ }
1886
+ .foogallery.fg-masonry {
1887
+ margin: 0 auto;
1888
+ text-align: center;
1889
+ }
1890
+ .fg-masonry .fg-thumb {
1891
+ display: block;
1892
+ }
1893
+ .fg-masonry.fg-fixed .fg-item,
1894
+ .fg-masonry.fg-fixed .fg-image,
1895
+ .fg-masonry.fg-fixed .fg-column-width {
1896
+ max-width: 100%;
1897
+ }
1898
+
1899
+ .fg-masonry .fg-column-width {
1900
+ display: inline-block;
1901
+ border: solid 0 transparent;
1902
+ }
1903
+ .fg-masonry .fg-column-width,
1904
+ .fg-masonry .fg-gutter-width {
1905
+ position: absolute;
1906
+ height: 0;
1907
+ visibility: hidden;
1908
+ opacity: 0;
1909
+ pointer-events: none;
1910
+ }
1911
+
1912
+ .fg-masonry.fg-fixed .fg-item .fg-image,
1913
+ .fg-masonry.fg-col6 .fg-item .fg-image,
1914
+ .fg-masonry.fg-col5 .fg-item .fg-image,
1915
+ .fg-masonry.fg-col4 .fg-item .fg-image,
1916
+ .fg-masonry.fg-col3 .fg-item .fg-image,
1917
+ .fg-masonry.fg-col2 .fg-item .fg-image {
1918
+ width: 100%;
1919
+ height: auto;
1920
+ max-width: 100%;
1921
+ }
1922
+
1923
+ .fg-masonry .fg-item {
1924
+ line-height: 0;
1925
+ font-size: 0;
1926
+ vertical-align: top;
1927
+ }
1928
+
1929
+ /* 2 column layouts */
1930
+ /* 2 column layout - normal gutter */
1931
+ .fg-masonry.fg-col2 .fg-item { margin-bottom: 1%; width: 49.5%; }
1932
+ .fg-masonry.fg-col2 .fg-column-width { width: 49.5%; }
1933
+ .fg-masonry.fg-col2 .fg-gutter-width { width: 1%; }
1934
+
1935
+ /* 2 column layout - no gutter */
1936
+ .fg-masonry.fg-col2.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1937
+ .fg-masonry.fg-col2.fg-gutter-none .fg-column-width { width: 50%; }
1938
+ .fg-masonry.fg-col2.fg-gutter-none .fg-gutter-width { width: 0; }
1939
+
1940
+ /* 2 column layout - large gutter */
1941
+ .fg-masonry.fg-col2.fg-gutter-large .fg-item { margin-bottom: 3%; width: 48.5%; }
1942
+ .fg-masonry.fg-col2.fg-gutter-large .fg-column-width { width: 48.5%; }
1943
+ .fg-masonry.fg-col2.fg-gutter-large .fg-gutter-width { width: 3%; }
1944
+
1945
+ /* 3 column layouts */
1946
+ /* 3 column layout - normal gutter */
1947
+ .fg-masonry.fg-col3 .fg-item { margin-bottom: 1%; width: 32.66%; }
1948
+ .fg-masonry.fg-col3 .fg-column-width { width: 32.66%; }
1949
+ .fg-masonry.fg-col3 .fg-gutter-width { width: 1%; }
1950
+
1951
+ /* 3 column layout - no gutter */
1952
+ .fg-masonry.fg-col3.fg-gutter-none .fg-item { margin-bottom: 0; width: 33.33%; }
1953
+ .fg-masonry.fg-col3.fg-gutter-none .fg-column-width { width: 33.33%; }
1954
+ .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width { width: 0; }
1955
+
1956
+ /* 3 column layout - large gutter */
1957
+ .fg-masonry.fg-col3.fg-gutter-large .fg-item { margin-bottom: 3%; width: 31.33%; }
1958
+ .fg-masonry.fg-col3.fg-gutter-large .fg-column-width { width: 31.33%; }
1959
+ .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width { width: 3%; }
1960
+
1961
+ /* 4 column layouts */
1962
+ /* 4 column layout - normal gutter */
1963
+ .fg-masonry.fg-col4 .fg-item { margin-bottom: 1%; width: 24.25%; }
1964
+ .fg-masonry.fg-col4 .fg-column-width { width: 24.25%; }
1965
+ .fg-masonry.fg-col4 .fg-gutter-width { width: 1%; }
1966
+
1967
+ /* 4 column layout - no gutter */
1968
+ .fg-masonry.fg-col4.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
1969
+ .fg-masonry.fg-col4.fg-gutter-none .fg-column-width { width: 25%; }
1970
+ .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width { width: 0; }
1971
+
1972
+ /* 4 column layout - large gutter */
1973
+ .fg-masonry.fg-col4.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22.75%; }
1974
+ .fg-masonry.fg-col4.fg-gutter-large .fg-column-width { width: 22.75%; }
1975
+ .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width { width: 3%; }
1976
+
1977
+ /* 5 column layouts */
1978
+ /* 5 column layout - normal gutter */
1979
+ .fg-masonry.fg-col5 .fg-item { margin-bottom: 1%; width: 19.2%; }
1980
+ .fg-masonry.fg-col5 .fg-column-width { width: 19.2%; }
1981
+ .fg-masonry.fg-col5 .fg-gutter-width { width: 1%; }
1982
+
1983
+ /* 5 column layout - no gutter */
1984
+ .fg-masonry.fg-col5.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
1985
+ .fg-masonry.fg-col5.fg-gutter-none .fg-column-width { width: 20%; }
1986
+ .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width { width: 0; }
1987
+
1988
+ /* 5 column layout - large gutter */
1989
+ .fg-masonry.fg-col5.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17.6%; }
1990
+ .fg-masonry.fg-col5.fg-gutter-large .fg-column-width { width: 17.6%; }
1991
+ .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width { width: 3%; }
1992
+
1993
+ /* 6 column layouts */
1994
+ /* 6 column layout - normal gutter */
1995
+ .fg-masonry.fg-col6 .fg-item { margin-bottom: 1%; width: 15.83%; }
1996
+ .fg-masonry.fg-col6 .fg-column-width { width: 15.83%; }
1997
+ .fg-masonry.fg-col6 .fg-gutter-width { width: 1%; }
1998
+
1999
+ /* 6 column layout - no gutter */
2000
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item { margin-bottom: 0; width: 16.66%; }
2001
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width { width: 16.66%; }
2002
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width { width: 0; }
2003
+
2004
+ /* 6 column layout - large gutter */
2005
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item { margin-bottom: 3%; width: 14.16%; }
2006
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width { width: 14.16%; }
2007
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width { width: 3%; }
2008
+
2009
+ /* Force 5 column layout < 1280px */
2010
+ @media screen and (max-width: 1280px) {
2011
+ /* default gutter */
2012
+ .fg-masonry.fg-col6 .fg-item { margin-bottom: 1%; width: 19.2%; }
2013
+ .fg-masonry.fg-col6 .fg-column-width { width: 19.2%; }
2014
+ .fg-masonry.fg-col6 .fg-gutter-width { width: 1%; }
2015
+
2016
+ /* no gutter */
2017
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
2018
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width { width: 20%; }
2019
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width { width: 0; }
2020
+
2021
+ /* large gutter */
2022
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17.6%; }
2023
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width { width: 17.6%; }
2024
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width { width: 3%; }
2025
+ }
2026
+
2027
+ /* Force 4 column layout < 1024px */
2028
+ @media screen and (max-width: 1024px) {
2029
+ /* default gutter */
2030
+ .fg-masonry.fg-col6 .fg-item,
2031
+ .fg-masonry.fg-col5 .fg-item { margin-bottom: 1%; width: 24.25%; }
2032
+ .fg-masonry.fg-col6 .fg-column-width,
2033
+ .fg-masonry.fg-col5 .fg-column-width { width: 24.25%; }
2034
+ .fg-masonry.fg-col6 .fg-gutter-width,
2035
+ .fg-masonry.fg-col5 .fg-gutter-width { width: 1%; }
2036
+
2037
+ /* no gutter */
2038
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2039
+ .fg-masonry.fg-col5.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
2040
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2041
+ .fg-masonry.fg-col5.fg-gutter-none .fg-column-width { width: 25%; }
2042
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2043
+ .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width { width: 0; }
2044
+
2045
+ /* large gutter */
2046
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2047
+ .fg-masonry.fg-col5.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22.75%; }
2048
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2049
+ .fg-masonry.fg-col5.fg-gutter-large .fg-column-width { width: 22.75%; }
2050
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2051
+ .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width { width: 3%; }
2052
+ }
2053
+
2054
+ /* Force 3 column layout < 720px */
2055
+ @media screen and (max-width: 720px) {
2056
+ /* default gutter */
2057
+ .fg-masonry.fg-col6 .fg-item,
2058
+ .fg-masonry.fg-col5 .fg-item,
2059
+ .fg-masonry.fg-col4 .fg-item { margin-bottom: 1%; width: 32.66%; }
2060
+ .fg-masonry.fg-col6 .fg-column-width,
2061
+ .fg-masonry.fg-col5 .fg-column-width,
2062
+ .fg-masonry.fg-col4 .fg-column-width { width: 32.66%; }
2063
+ .fg-masonry.fg-col6 .fg-gutter-width,
2064
+ .fg-masonry.fg-col5 .fg-gutter-width,
2065
+ .fg-masonry.fg-col4 .fg-gutter-width { width: 1%; }
2066
+
2067
+ /* no gutter */
2068
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2069
+ .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2070
+ .fg-masonry.fg-col4.fg-gutter-none .fg-item { margin-bottom: 0; width: 33.33%; }
2071
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2072
+ .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2073
+ .fg-masonry.fg-col4.fg-gutter-none .fg-column-width { width: 33.33%; }
2074
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2075
+ .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2076
+ .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width { width: 0; }
2077
+
2078
+ /* large gutter */
2079
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2080
+ .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2081
+ .fg-masonry.fg-col4.fg-gutter-large .fg-item { margin-bottom: 3%; width: 31.33%; }
2082
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2083
+ .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2084
+ .fg-masonry.fg-col4.fg-gutter-large .fg-column-width { width: 31.33%; }
2085
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2086
+ .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2087
+ .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width { width: 3%; }
2088
+
2089
+ }
2090
+
2091
+ /* Force 2 column layout < 480px */
2092
+ @media screen and (max-width: 480px) {
2093
+ /* default gutter */
2094
+ .fg-masonry.fg-col6 .fg-item,
2095
+ .fg-masonry.fg-col5 .fg-item,
2096
+ .fg-masonry.fg-col4 .fg-item,
2097
+ .fg-masonry.fg-col3 .fg-item { margin-bottom: 1%; width: 49.5%; }
2098
+ .fg-masonry.fg-col6 .fg-column-width,
2099
+ .fg-masonry.fg-col5 .fg-column-width,
2100
+ .fg-masonry.fg-col4 .fg-column-width,
2101
+ .fg-masonry.fg-col3 .fg-column-width { width: 49.5%; }
2102
+ .fg-masonry.fg-col6 .fg-gutter-width,
2103
+ .fg-masonry.fg-col5 .fg-gutter-width,
2104
+ .fg-masonry.fg-col4 .fg-gutter-width,
2105
+ .fg-masonry.fg-col3 .fg-gutter-width { width: 1%; }
2106
+
2107
+ /* no gutter */
2108
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2109
+ .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2110
+ .fg-masonry.fg-col4.fg-gutter-none .fg-item,
2111
+ .fg-masonry.fg-col3.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
2112
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2113
+ .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2114
+ .fg-masonry.fg-col4.fg-gutter-none .fg-column-width,
2115
+ .fg-masonry.fg-col3.fg-gutter-none .fg-column-width { width: 50%; }
2116
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2117
+ .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2118
+ .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width,
2119
+ .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width { width: 0; }
2120
+
2121
+ /* large gutter */
2122
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2123
+ .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2124
+ .fg-masonry.fg-col4.fg-gutter-large .fg-item,
2125
+ .fg-masonry.fg-col3.fg-gutter-large .fg-item { margin-bottom: 3%; width: 48.5%; }
2126
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2127
+ .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2128
+ .fg-masonry.fg-col4.fg-gutter-large .fg-column-width,
2129
+ .fg-masonry.fg-col3.fg-gutter-large .fg-column-width { width: 48.5%; }
2130
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2131
+ .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2132
+ .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width,
2133
+ .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width { width: 3%; }
2134
+ }
2135
+
2136
+ /* Force 1 column layout < 320px */
2137
+ @media screen and (max-width: 320px) {
2138
+ /* default gutter */
2139
+ .fg-masonry.fg-col6 .fg-item,
2140
+ .fg-masonry.fg-col5 .fg-item,
2141
+ .fg-masonry.fg-col4 .fg-item,
2142
+ .fg-masonry.fg-col3 .fg-item,
2143
+ .fg-masonry.fg-col2 .fg-item { margin-bottom: 1%; width: 100%; }
2144
+ .fg-masonry.fg-col6 .fg-column-width,
2145
+ .fg-masonry.fg-col5 .fg-column-width,
2146
+ .fg-masonry.fg-col4 .fg-column-width,
2147
+ .fg-masonry.fg-col3 .fg-column-width,
2148
+ .fg-masonry.fg-col2 .fg-column-width { width: 100%; }
2149
+ .fg-masonry.fg-col6 .fg-gutter-width,
2150
+ .fg-masonry.fg-col5 .fg-gutter-width,
2151
+ .fg-masonry.fg-col4 .fg-gutter-width,
2152
+ .fg-masonry.fg-col3 .fg-gutter-width,
2153
+ .fg-masonry.fg-col2 .fg-gutter-width { width: 0; }
2154
+
2155
+ /* no gutter */
2156
+ .fg-masonry.fg-col6.fg-gutter-none .fg-item,
2157
+ .fg-masonry.fg-col5.fg-gutter-none .fg-item,
2158
+ .fg-masonry.fg-col4.fg-gutter-none .fg-item,
2159
+ .fg-masonry.fg-col3.fg-gutter-none .fg-item,
2160
+ .fg-masonry.fg-col2.fg-gutter-none .fg-item { margin-bottom: 0; width: 100%; }
2161
+ .fg-masonry.fg-col6.fg-gutter-none .fg-column-width,
2162
+ .fg-masonry.fg-col5.fg-gutter-none .fg-column-width,
2163
+ .fg-masonry.fg-col4.fg-gutter-none .fg-column-width,
2164
+ .fg-masonry.fg-col3.fg-gutter-none .fg-column-width,
2165
+ .fg-masonry.fg-col2.fg-gutter-none .fg-column-width { width: 100%; }
2166
+ .fg-masonry.fg-col6.fg-gutter-none .fg-gutter-width,
2167
+ .fg-masonry.fg-col5.fg-gutter-none .fg-gutter-width,
2168
+ .fg-masonry.fg-col4.fg-gutter-none .fg-gutter-width,
2169
+ .fg-masonry.fg-col3.fg-gutter-none .fg-gutter-width,
2170
+ .fg-masonry.fg-col2.fg-gutter-none .fg-gutter-width { width: 0; }
2171
+
2172
+ /* large gutter */
2173
+ .fg-masonry.fg-col6.fg-gutter-large .fg-item,
2174
+ .fg-masonry.fg-col5.fg-gutter-large .fg-item,
2175
+ .fg-masonry.fg-col4.fg-gutter-large .fg-item,
2176
+ .fg-masonry.fg-col3.fg-gutter-large .fg-item,
2177
+ .fg-masonry.fg-col2.fg-gutter-large .fg-item { margin-bottom: 3%; width: 100%; }
2178
+ .fg-masonry.fg-col6.fg-gutter-large .fg-column-width,
2179
+ .fg-masonry.fg-col5.fg-gutter-large .fg-column-width,
2180
+ .fg-masonry.fg-col4.fg-gutter-large .fg-column-width,
2181
+ .fg-masonry.fg-col3.fg-gutter-large .fg-column-width,
2182
+ .fg-masonry.fg-col2.fg-gutter-large .fg-column-width { width: 100%; }
2183
+ .fg-masonry.fg-col6.fg-gutter-large .fg-gutter-width,
2184
+ .fg-masonry.fg-col5.fg-gutter-large .fg-gutter-width,
2185
+ .fg-masonry.fg-col4.fg-gutter-large .fg-gutter-width,
2186
+ .fg-masonry.fg-col3.fg-gutter-large .fg-gutter-width,
2187
+ .fg-masonry.fg-col2.fg-gutter-large .fg-gutter-width { width: 0; }
2188
+ }
2189
+
2190
+ /* Border Styles - We must apply width changing border styles to the fg-column-width element so that the plugin can correctly determine the item widths. */
2191
+ .foogallery.fg-border-thin .fg-column-width {
2192
+ border-width: 4px;
2193
+ }
2194
+ .foogallery.fg-border-medium .fg-column-width {
2195
+ border-width: 10px;
2196
+ }
2197
+ .foogallery.fg-border-thick .fg-column-width {
2198
+ border-width: 16px;
2199
+ }
2200
+
2201
+ /* Captions Bottom */
2202
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption {
2203
+ visibility: visible;
2204
+ opacity: 1;
2205
+ font-size: 13px;
2206
+ position: relative;
2207
+ display: block;
2208
+ top: auto;
2209
+ bottom: auto;
2210
+ left: auto;
2211
+ right: auto;
2212
+ width: auto;
2213
+ height: auto;
2214
+ text-transform: none;
2215
+ transform: none;
2216
+ transition: none;
2217
+ background-color: transparent;
2218
+ border-style: solid;
2219
+ border-color: transparent;
2220
+ text-align: left;
2221
+ }
2222
+ .foogallery.fg-masonry.fg-captions-bottom.fg-c-l .fg-item-inner .fg-caption {
2223
+ text-align: left;
2224
+ }
2225
+ .foogallery.fg-masonry.fg-captions-bottom.fg-c-c .fg-item-inner .fg-caption {
2226
+ text-align: center;
2227
+ }
2228
+ .foogallery.fg-masonry.fg-captions-bottom.fg-c-r .fg-item-inner .fg-caption {
2229
+ text-align: right;
2230
+ }
2231
+ .foogallery.fg-masonry.fg-captions-bottom.fg-c-j .fg-item-inner .fg-caption {
2232
+ text-align: justify;
2233
+ }
2234
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner:hover .fg-caption {
2235
+ transform: none;
2236
+ transition: none;
2237
+ }
2238
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner {
2239
+ display: block;
2240
+ position: relative;
2241
+ max-height: none;
2242
+ top: auto;
2243
+ bottom: auto;
2244
+ left: auto;
2245
+ right: auto;
2246
+ width: auto;
2247
+ height: auto;
2248
+ border: none;
2249
+ transform: none;
2250
+ transition: none;
2251
+ }
2252
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner:before {
2253
+ display: none;
2254
+ }
2255
+ .foogallery.fg-masonry.fg-captions-bottom.fg-caption-hover .fg-item-inner .fg-image-overlay {
2256
+ display: block;
2257
+ }
2258
+ .foogallery.fg-masonry.fg-captions-bottom.fg-caption-always .fg-item-inner:hover .fg-caption {
2259
+ visibility: visible;
2260
+ opacity: 1;
2261
+ }
2262
+
2263
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption,
2264
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption {
2265
+ color: #828282;
2266
+ }
2267
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption a,
2268
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a {
2269
+ color: #828282;
2270
+ border-bottom: 1px solid #828282;
2271
+ }
2272
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption a:hover,
2273
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a:hover {
2274
+ border-bottom: none;
2275
+ }
2276
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title,
2277
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
2278
+ color: #222;
2279
+ }
2280
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title,
2281
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
2282
+ color: #FFF;
2283
+ }
2284
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
2285
+ border-bottom: 1px solid #222;
2286
+ }
2287
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
2288
+ border-bottom: 1px solid #FFF;
2289
+ }
2290
+
2291
+ /* Handle Border Sizing for Captions Below */
2292
+ .fg-masonry.fg-captions-bottom .fg-caption {
2293
+ border-width: 10px;
2294
+ }
2295
+ .fg-masonry.fg-captions-bottom .fg-caption-title+.fg-caption-desc {
2296
+ margin-top: 4px;
2297
+ }
2298
+ .fg-masonry.fg-captions-bottom.fg-border-thin .fg-caption {
2299
+ border-width: 10px 4px 4px 4px;
2300
+ }
2301
+ .fg-masonry.fg-captions-bottom.fg-border-medium .fg-caption {
2302
+ border-width: 10px 0 0 0;
2303
+ }
2304
+ .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption {
2305
+ border-width: 16px 0 0 0;
2306
+ }
2307
+ .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption-title+.fg-caption-desc {
2308
+ margin-top: 10px;
2309
+ }
2310
+
2311
+ /* Transparent Theme */
2312
+ .fg-masonry.fg-transparent .fg-item-inner {
2313
+ background-color: transparent;
2314
+ color: #333;
2315
+ border-color: transparent;
2316
+ }
2317
+
2318
+ /* Captions */
2319
+ .fg-masonry.fg-transparent .fg-caption {
2320
+ color: #7f7f7f;
2321
+ }
2322
+ .fg-masonry.fg-transparent.fg-captions-bottom .fg-caption {
2323
+ border-width: 0;
2324
+ border-top-width: 10px;
2325
+ border-bottom-width: 10px;
2326
+ }
2327
+ .fg-masonry.fg-transparent .fg-caption a {
2328
+ color: #7f7f7f;
2329
+ border-bottom: 1px solid #7f7f7f;
2330
+ }
2331
+ .fg-masonry.fg-transparent .fg-caption a:hover {
2332
+ border-bottom: none;
2333
+ }
2334
+ .fg-masonry.fg-transparent .fg-caption-title,
2335
+ .fg-masonry.fg-transparent .fg-caption-title a {
2336
+ color: #333;
2337
+ }
2338
+ .fg-masonry.fg-transparent .fg-caption-title a {
2339
+ border-bottom: 1px solid #333;
2340
+ }
2341
+
2342
+ /* Rounded Corners */
2343
+ .fg-masonry.fg-transparent.fg-round-full .fg-item,
2344
+ .fg-masonry.fg-transparent.fg-round-full .fg-item-inner {
2345
+ border-radius: 15px;
2346
+ }
2347
+ .fg-masonry.fg-transparent.fg-round-full .fg-image-wrap,
2348
+ .fg-masonry.fg-transparent.fg-round-full .fg-image-overlay,
2349
+ .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
2350
+ .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
2351
+ .fg-masonry.fg-transparent.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
2352
+ border-radius: 50%;
2353
+ overflow: hidden;
2354
+ }
2355
+
2356
+ .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2357
+ .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2358
+ .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2359
+ .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2360
+ .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2361
+ .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2362
+ overflow: hidden;
2363
+ }
2364
+ .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2365
+ .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2366
+ .fg-masonry.fg-transparent.fg-round-small.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2367
+ .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2368
+ .fg-masonry.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2369
+ border-radius: 5px;
2370
+ }
2371
+ .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2372
+ .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2373
+ .fg-masonry.fg-transparent.fg-round-medium.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2374
+ .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2375
+ .fg-masonry.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2376
+ border-radius: 10px;
2377
+ }
2378
+ .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2379
+ .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2380
+ .fg-masonry.fg-transparent.fg-round-large.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2381
+ .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2382
+ .fg-masonry.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2383
+ border-radius: 15px;
2384
+ }
2385
+
2386
+ /* Shadows */
2387
+ .fg-masonry.fg-transparent.fg-shadow-inset-small .fg-thumb:after {
2388
+ box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
2389
+ }
2390
+ .fg-masonry.fg-transparent.fg-shadow-inset-medium .fg-thumb:after {
2391
+ box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
2392
+ }
2393
+ .fg-masonry.fg-transparent.fg-shadow-inset-large .fg-thumb:after {
2394
+ box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
2395
+ }
2396
+
2397
+ .fg-masonry.fg-transparent.fg-shadow-outline .fg-item-inner {
2398
+ box-shadow: 0 0 0 1px rgba(128, 128, 128, 0.5);
2399
+ }
2400
+ .fg-masonry.fg-transparent.fg-shadow-small .fg-item-inner {
2401
+ box-shadow: 0 1px 4px 0 rgba(128, 128, 128, 0.5);
2402
+ }
2403
+ .fg-masonry.fg-transparent.fg-shadow-medium .fg-item-inner {
2404
+ box-shadow: 0 1px 10px 0 rgba(128, 128, 128, 0.5);
2405
+ }
2406
+ .fg-masonry.fg-transparent.fg-shadow-large .fg-item-inner {
2407
+ box-shadow: 0 1px 16px 0 rgba(128, 128, 128, 0.5);
2408
+ }
2409
+ /* Base Styles */
2410
+ .fg-justified {
2411
+ box-sizing: border-box;
2412
+ position: relative;
2413
+ text-align: center;
2414
+ }
2415
+ .foogallery.fg-justified .fg-item {
2416
+ box-sizing: border-box;
2417
+ display: inline-block;
2418
+ margin: 0;
2419
+ padding: 0;
2420
+ }
2421
+ .foogallery.fg-justified .fg-item-inner,
2422
+ .foogallery.fg-justified .fg-thumb,
2423
+ .foogallery.fg-justified .fg-image {
2424
+ box-sizing: border-box;
2425
+ display: block;
2426
+ margin: 0;
2427
+ padding: 0;
2428
+ }
2429
+ .fg-justified .fg-item {
2430
+ visibility: visible;
2431
+ position: relative;
2432
+ }
2433
+ .fg-justified .fg-item-inner {
2434
+ position: relative;
2435
+ width: 100%;
2436
+ height: 100%;
2437
+ }
2438
+ .fg-justified .fg-thumb {
2439
+ position: relative;
2440
+ overflow: hidden;
2441
+ }
2442
+ .fg-justified .fg-image {
2443
+ z-index: 1;
2444
+ }
2445
+ .fg-justified .fg-item.fg-positioned .fg-thumb,
2446
+ .fg-justified .fg-item.fg-positioned .fg-image-wrap {
2447
+ width: 100%;
2448
+ height: 100%;
2449
+ }
2450
+ .fg-justified .fg-item.fg-positioned .fg-image {
2451
+ width: 100%!important;
2452
+ height: auto!important;
2453
+ min-height: 100%;
2454
+ }
2455
+ /* CSS justified layout. */
2456
+ .foogallery.fg-justified-css {
2457
+ position: relative;
2458
+ display: flex;
2459
+ box-sizing: border-box;
2460
+ align-items: center;
2461
+ justify-content: stretch;
2462
+ flex-wrap: wrap;
2463
+ }
2464
+ .foogallery.fg-justified-css:after {
2465
+ display: block;
2466
+ content: '';
2467
+ flex-shrink: 0;
2468
+ flex-grow: 10;
2469
+ min-width: 60px;
2470
+ }
2471
+ .foogallery.fg-justified-css .fg-item,
2472
+ .foogallery.fg-justified-css .fg-item-inner,
2473
+ .foogallery.fg-justified-css .fg-thumb,
2474
+ .foogallery.fg-justified-css .fg-image {
2475
+ display: block;
2476
+ }
2477
+
2478
+ .foogallery.fg-justified-css .fg-item {
2479
+ flex-shrink: 0;
2480
+ flex-grow: 1;
2481
+ margin: 5px;
2482
+ }
2483
+ .foogallery.fg-justified-css .fg-thumb {
2484
+
2485
+ }
2486
+ .foogallery.fg-justified-css .fg-image-wrap {
2487
+ display: flex;
2488
+ align-items: center;
2489
+ justify-content: stretch;
2490
+ overflow: hidden;
2491
+ }
2492
+ .foogallery.fg-justified-css .fg-image {
2493
+ width: 100%;
2494
+ height: auto;
2495
+ }
2496
+ .fg-simple_portfolio {
2497
+ display: flex;
2498
+ flex-wrap: wrap;
2499
+ justify-content: center;
2500
+ align-items: stretch;
2501
+ align-content: center;
2502
+ }
2503
+ .fg-simple_portfolio .fg-item {
2504
+ position: relative;
2505
+ flex-grow: 0;
2506
+ flex-shrink: 0;
2507
+ flex-basis: auto;
2508
+ margin: 10px;
2509
+ max-width: 100%;
2510
+ }
2511
+ .fg-simple_portfolio .fg-item-inner {
2512
+ display: flex;
2513
+ flex-direction: column;
2514
+ margin: 0;
2515
+ height: 100%;
2516
+ }
2517
+ .fg-simple_portfolio.fg-captions-top .fg-item-inner {
2518
+ flex-direction: column-reverse;
2519
+ }
2520
+ .fg-simple_portfolio .fg-image {
2521
+ height: auto;
2522
+ width: 100%;
2523
+ }
2524
+
2525
+ /* Some badly written themes apply min-width:0 and min-height:0 to every element in the page which causes layout issues with flex. */
2526
+ .fg-simple_portfolio .fg-thumb {
2527
+ min-width: auto;
2528
+ min-height: auto;
2529
+ }
2530
+
2531
+ /* Reset captions for the portfolio */
2532
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption {
2533
+ visibility: visible;
2534
+ opacity: 1;
2535
+ font-size: 13px;
2536
+ position: relative;
2537
+ display: block;
2538
+ top: auto;
2539
+ bottom: auto;
2540
+ left: auto;
2541
+ right: auto;
2542
+ width: 100%;
2543
+ height: 100%;
2544
+ text-transform: none;
2545
+ transform: none;
2546
+ transition: none;
2547
+ background-color: transparent;
2548
+ border-style: solid;
2549
+ border-color: transparent;
2550
+ text-align: left;
2551
+ }
2552
+ .foogallery.fg-simple_portfolio.fg-c-l .fg-item-inner .fg-caption {
2553
+ text-align: left;
2554
+ }
2555
+ .foogallery.fg-simple_portfolio.fg-c-c .fg-item-inner .fg-caption {
2556
+ text-align: center;
2557
+ }
2558
+ .foogallery.fg-simple_portfolio.fg-c-r .fg-item-inner .fg-caption {
2559
+ text-align: right;
2560
+ }
2561
+ .foogallery.fg-simple_portfolio.fg-c-j .fg-item-inner .fg-caption {
2562
+ text-align: justify;
2563
+ }
2564
+ .foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption {
2565
+ transform: none;
2566
+ transition: none;
2567
+ }
2568
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner {
2569
+ display: block;
2570
+ top: auto;
2571
+ bottom: auto;
2572
+ left: auto;
2573
+ right: auto;
2574
+ width: auto;
2575
+ height: auto;
2576
+ border: none;
2577
+ transform: none;
2578
+ transition: none;
2579
+ }
2580
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before {
2581
+ display: none;
2582
+ }
2583
+ .foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-image-overlay {
2584
+ display: block;
2585
+ }
2586
+ .foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption {
2587
+ visibility: visible;
2588
+ opacity: 1;
2589
+ }
2590
+ .fg-simple_portfolio .fg-caption-title {
2591
+ white-space: normal;
2592
+ height: auto;
2593
+ }
2594
+
2595
+ .fg-simple_portfolio.fg-light .fg-caption,
2596
+ .fg-simple_portfolio.fg-dark .fg-caption {
2597
+ color: #828282;
2598
+ }
2599
+ .fg-simple_portfolio.fg-light .fg-caption a,
2600
+ .fg-simple_portfolio.fg-dark .fg-caption a {
2601
+ color: #828282;
2602
+ border-bottom: 1px solid #828282;
2603
+ }
2604
+ .fg-simple_portfolio.fg-light .fg-caption a:hover,
2605
+ .fg-simple_portfolio.fg-dark .fg-caption a:hover {
2606
+ border-bottom: none;
2607
+ }
2608
+ .fg-simple_portfolio.fg-light .fg-caption-title,
2609
+ .fg-simple_portfolio.fg-light .fg-caption-title a {
2610
+ color: #222;
2611
+ }
2612
+ .fg-simple_portfolio.fg-dark .fg-caption-title,
2613
+ .fg-simple_portfolio.fg-dark .fg-caption-title a {
2614
+ color: #FFF;
2615
+ }
2616
+ .fg-simple_portfolio.fg-light .fg-caption-title a {
2617
+ border-bottom: 1px solid #222;
2618
+ }
2619
+ .fg-simple_portfolio.fg-dark .fg-caption-title a {
2620
+ border-bottom: 1px solid #FFF;
2621
+ }
2622
+
2623
+ /* Handle Border Sizing */
2624
+ .fg-simple_portfolio .fg-caption {
2625
+ border-width: 0;
2626
+ }
2627
+ .fg-simple_portfolio .fg-caption-title+.fg-caption-desc {
2628
+ margin-top: 4px;
2629
+ }
2630
+ .fg-simple_portfolio.fg-border-thin .fg-caption {
2631
+ border-width: 10px 4px 4px 4px;
2632
+ }
2633
+ .fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption {
2634
+ border-width: 4px 4px 10px 4px;
2635
+ }
2636
+ .fg-simple_portfolio.fg-border-medium .fg-caption {
2637
+ border-width: 10px 0 0 0;
2638
+ }
2639
+ .fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption {
2640
+ border-width: 0 0 10px 0;
2641
+ }
2642
+ .fg-simple_portfolio.fg-border-thick .fg-caption {
2643
+ border-width: 16px 0 0 0;
2644
+ }
2645
+ .fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption {
2646
+ border-width: 0 0 16px 0;
2647
+ }
2648
+ .fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc {
2649
+ margin-top: 10px;
2650
+ }
2651
+
2652
+ /* Transparent Theme */
2653
+ .fg-simple_portfolio.fg-transparent .fg-item-inner {
2654
+ background-color: transparent;
2655
+ color: #333;
2656
+ border-color: transparent;
2657
+ }
2658
+
2659
+ /* Captions */
2660
+ .fg-simple_portfolio.fg-transparent .fg-caption {
2661
+ color: #7f7f7f;
2662
+ }
2663
+ .fg-simple_portfolio.fg-transparent .fg-caption a {
2664
+ color: #7f7f7f;
2665
+ border-bottom: 1px solid #7f7f7f;
2666
+ }
2667
+ .fg-simple_portfolio.fg-transparent .fg-caption a:hover {
2668
+ border-bottom: none;
2669
+ }
2670
+ .fg-simple_portfolio.fg-transparent .fg-caption-title,
2671
+ .fg-simple_portfolio.fg-transparent .fg-caption-title a {
2672
+ color: #333;
2673
+ }
2674
+ .fg-simple_portfolio.fg-transparent .fg-caption-title a {
2675
+ border-bottom: 1px solid #333;
2676
+ }
2677
+
2678
+ /* Rounded Corners */
2679
+ .fg-simple_portfolio.fg-transparent.fg-round-full .fg-item,
2680
+ .fg-simple_portfolio.fg-transparent.fg-round-full .fg-item-inner {
2681
+ border-radius: 15px;
2682
+ }
2683
+ .fg-simple_portfolio.fg-transparent.fg-round-full .fg-image-wrap,
2684
+ .fg-simple_portfolio.fg-transparent.fg-round-full .fg-image-overlay,
2685
+ .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
2686
+ .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
2687
+ .fg-simple_portfolio.fg-transparent.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
2688
+ border-radius: 50%;
2689
+ overflow: hidden;
2690
+ }
2691
+
2692
+ .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2693
+ .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2694
+ .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2695
+ .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay,
2696
+ .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2697
+ .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2698
+ overflow: hidden;
2699
+ }
2700
+ .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2701
+ .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2702
+ .fg-simple_portfolio.fg-transparent.fg-round-small.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2703
+ .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2704
+ .fg-simple_portfolio.fg-transparent.fg-round-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2705
+ border-radius: 5px;
2706
+ }
2707
+ .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2708
+ .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2709
+ .fg-simple_portfolio.fg-transparent.fg-round-medium.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2710
+ .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2711
+ .fg-simple_portfolio.fg-transparent.fg-round-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2712
+ border-radius: 10px;
2713
+ }
2714
+ .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-small:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2715
+ .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-medium:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2716
+ .fg-simple_portfolio.fg-transparent.fg-round-large.fg-shadow-inset-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-thumb:after,
2717
+ .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-wrap,
2718
+ .fg-simple_portfolio.fg-transparent.fg-round-large:not(.fg-shadow-outline):not(.fg-shadow-small):not(.fg-shadow-medium):not(.fg-shadow-large) .fg-image-overlay {
2719
+ border-radius: 15px;
2720
+ }
2721
+
2722
+ /* Shadows */
2723
+ .fg-simple_portfolio.fg-transparent.fg-shadow-inset-small .fg-thumb:after {
2724
+ box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
2725
+ }
2726
+ .fg-simple_portfolio.fg-transparent.fg-shadow-inset-medium .fg-thumb:after {
2727
+ box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
2728
+ }
2729
+ .fg-simple_portfolio.fg-transparent.fg-shadow-inset-large .fg-thumb:after {
2730
+ box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
2731
+ }
2732
+
2733
+ .fg-simple_portfolio.fg-transparent.fg-shadow-outline .fg-item-inner {
2734
+ box-shadow: 0 0 0 1px rgba(128, 128, 128, 0.5);
2735
+ }
2736
+ .fg-simple_portfolio.fg-transparent.fg-shadow-small .fg-item-inner {
2737
+ box-shadow: 0 1px 4px 0 rgba(128, 128, 128, 0.5);
2738
+ }
2739
+ .fg-simple_portfolio.fg-transparent.fg-shadow-medium .fg-item-inner {
2740
+ box-shadow: 0 1px 10px 0 rgba(128, 128, 128, 0.5);
2741
+ }
2742
+ .fg-simple_portfolio.fg-transparent.fg-shadow-large .fg-item-inner {
2743
+ box-shadow: 0 1px 16px 0 rgba(128, 128, 128, 0.5);
2744
+ }
2745
+ /* Polaroid */
2746
+ .foogallery.fg-preset.fg-polaroid .fg-item {
2747
+ -webkit-backface-visibility: hidden;
2748
+ backface-visibility: hidden;
2749
+ transition: transform 0.35s, background-color 0.65s;
2750
+ }
2751
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1) {
2752
+ -webkit-transform: rotate(3deg);
2753
+ transform: rotate(3deg);
2754
+ }
2755
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n) {
2756
+ -webkit-transform: rotate(-3deg);
2757
+ transform: rotate(-3deg);
2758
+ }
2759
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n) {
2760
+ -webkit-transform: rotate(1deg);
2761
+ transform: rotate(1deg);
2762
+ }
2763
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n) {
2764
+ -webkit-transform: rotate(-2deg);
2765
+ transform: rotate(-2deg);
2766
+ }
2767
+
2768
+ .foogallery.fg-preset.fg-polaroid .fg-item:hover {
2769
+ -webkit-transform: rotate(0);
2770
+ transform: rotate(0);
2771
+ }
2772
+
2773
+ .foogallery.fg-preset.fg-polaroid .fg-caption {
2774
+ position: relative;
2775
+ width: auto;
2776
+ font-family: "Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
2777
+ }
2778
+
2779
+ .foogallery.fg-preset.fg-polaroid .fg-caption-inner,
2780
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title {
2781
+ position: relative;
2782
+ width: auto;
2783
+ }
2784
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title {
2785
+ text-align: center;
2786
+ }
2787
+ .foogallery.fg-preset.fg-polaroid .fg-caption-desc {
2788
+ display: none;
2789
+ }
2790
+
2791
+ /* Themes */
2792
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title,
2793
+ .foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title {
2794
+ color: #333;
2795
+ }
2796
+ .foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title {
2797
+ color: #FFF;
2798
+ }
2799
+
2800
+ /* Handle Border Sizing */
2801
+ .foogallery.fg-preset.fg-polaroid .fg-caption {
2802
+ border-style: solid;
2803
+ border-color: transparent;
2804
+ border-width: 10px;
2805
+ }
2806
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc {
2807
+ margin-top: 4px;
2808
+ }
2809
+ .foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption {
2810
+ border-width: 10px 4px 4px 4px;
2811
+ }
2812
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption {
2813
+ border-width: 4px 4px 10px 4px;
2814
+ }
2815
+ .foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption {
2816
+ border-width: 10px 0 0 0;
2817
+ }
2818
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption {
2819
+ border-width: 0 0 10px 0;
2820
+ }
2821
+ .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption {
2822
+ border-width: 16px 0 0 0;
2823
+ }
2824
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption {
2825
+ border-width: 0 0 16px 0;
2826
+ }
2827
+ .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc {
2828
+ margin-top: 10px;
2829
+ }
2830
+ /* Base styles */
2831
+ .fg-image-viewer {
2832
+ display: block;
2833
+ font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
2834
+ }
2835
+ .fg-image-viewer.fg-left {
2836
+ text-align: left;
2837
+ }
2838
+
2839
+ .fg-image-viewer.fg-center {
2840
+ text-align: center;
2841
+ }
2842
+ .fg-image-viewer.fg-right {
2843
+ text-align: right;
2844
+ }
2845
+
2846
+ .fiv-inner {
2847
+ position: relative;
2848
+ display: inline-block;
2849
+ max-width: 100%;
2850
+ overflow: hidden;
2851
+ z-index: 6;
2852
+ }
2853
+ .fiv-inner .fiv-inner-container {
2854
+ position: relative;
2855
+ overflow: hidden;
2856
+ max-width: 100%;
2857
+ border-style: solid;
2858
+ border-width: 0;
2859
+ border-bottom-width: 4px;
2860
+ z-index: 5;
2861
+ }
2862
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,
2863
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,
2864
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,
2865
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited {
2866
+ position: relative;
2867
+ display: block;
2868
+ border: none;
2869
+ outline: none;
2870
+ text-decoration: none;
2871
+ box-shadow: none;
2872
+ max-width: 100%;
2873
+ }
2874
+
2875
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item {
2876
+ position: absolute;
2877
+ visibility: visible;
2878
+ opacity: 1;
2879
+ border: none;
2880
+ outline: none;
2881
+ text-decoration: none;
2882
+ box-shadow: none;
2883
+ max-width: 100%;
2884
+ }
2885
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item:first-of-type {
2886
+ position: relative;
2887
+ }
2888
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img {
2889
+ display: block;
2890
+ max-width: 100%;
2891
+ height: auto;
2892
+ border: none;
2893
+ outline: none;
2894
+ text-decoration: none;
2895
+ }
2896
+
2897
+ .fg-image-viewer .fiv-inner .fiv-ctrls {
2898
+ display: block;
2899
+ text-align: center;
2900
+ font-size: 14px;
2901
+ border-style: solid;
2902
+ line-height: 34px;
2903
+ }
2904
+ .fg-image-viewer .fiv-inner .fiv-ctrls:after {
2905
+ content: '';
2906
+ display: block;
2907
+ clear: both;
2908
+ }
2909
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count {
2910
+ display: inline-block;
2911
+ font-weight: normal;
2912
+ margin: 0;
2913
+ }
2914
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,
2915
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2916
+ cursor: pointer;
2917
+ -webkit-user-select: none;
2918
+ -moz-user-select: none;
2919
+ -ms-user-select: none;
2920
+ user-select: none;
2921
+ border: none;
2922
+ min-width: 80px;
2923
+ position: relative;
2924
+ overflow: hidden;
2925
+ transition: background-color .3s;
2926
+ }
2927
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before,
2928
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2929
+ display: block;
2930
+ position: absolute;
2931
+ font-size: 24px;
2932
+ line-height: 30px;
2933
+ top:0;
2934
+ left:0;
2935
+ width: 100%;
2936
+ transform: translateY(0);
2937
+ transition: transform .3s;
2938
+ }
2939
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before,
2940
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before {
2941
+ transform: translateY(-100%);
2942
+ }
2943
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span,
2944
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span {
2945
+ display: block;
2946
+ width: 100%;
2947
+ transform: translateY(100%);
2948
+ transition: transform .3s;
2949
+ }
2950
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span,
2951
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span {
2952
+ transform: translateY(0);
2953
+ }
2954
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev {
2955
+ float: left;
2956
+ }
2957
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before {
2958
+ content: '\2190';
2959
+ }
2960
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2961
+ float: right;
2962
+ }
2963
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2964
+ content: '\2192';
2965
+ }
2966
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span {
2967
+ margin: 0 4px;
2968
+ }
2969
+
2970
+ /* Captions */
2971
+
2972
+ .foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption {
2973
+ padding: 0;
2974
+ border: none;
2975
+ }
2976
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title {
2977
+ padding: 10px 10px 10px 10px;
2978
+ }
2979
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc {
2980
+ padding: 10px 10px 10px 10px;
2981
+ }
2982
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc {
2983
+ padding: 0 10px 10px 10px;
2984
+ }
2985
+
2986
+ /* Theme - Default (Light) */
2987
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,
2988
+ .fg-image-viewer.fg-light .fiv-inner .fiv-inner-container,
2989
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,
2990
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,
2991
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next {
2992
+ background-color: #FFF;
2993
+ color: #333;
2994
+ border-color: #FFF;
2995
+ }
2996
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover,
2997
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover {
2998
+ background-color: #F2F2F2;
2999
+ }
3000
+ .fg-image-viewer.fg-light .fiv-prev,
3001
+ .fg-image-viewer.fg-light .fiv-next {
3002
+ box-shadow: inset 0 0 0 1px #ddd;
3003
+ }
3004
+
3005
+ /* Theme - Dark */
3006
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,
3007
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container,
3008
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,
3009
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,
3010
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next {
3011
+ background-color: #333;
3012
+ color: #FFF;
3013
+ border-color: #333;
3014
+ }
3015
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,
3016
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover {
3017
+ background-color: #444;
3018
+ }
3019
+ .fg-image-viewer.fg-dark .fiv-prev,
3020
+ .fg-image-viewer.fg-dark .fiv-next {
3021
+ box-shadow: inset 0 0 0 1px #222;
3022
+ }
3023
+
3024
+ /* Border Size */
3025
+ .foogallery.fg-image-viewer.fg-border-thin .fg-item-inner,
3026
+ .foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,
3027
+ .foogallery.fg-image-viewer.fg-border-thick .fg-item-inner {
3028
+ border-width: 0;
3029
+ }
3030
+ .foogallery.fg-image-viewer .fiv-ctrls,
3031
+ .foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container {
3032
+ border-width: 4px;
3033
+ }
3034
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
3035
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container {
3036
+ border-width: 10px;
3037
+ }
3038
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,
3039
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container {
3040
+ border-width: 16px;
3041
+ }
3042
+ .foogallery.fg-image-viewer .fiv-ctrls,
3043
+ .foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls,
3044
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
3045
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls {
3046
+ border-top-width: 1px;
3047
+ }
3048
+
3049
+ /* Rounded Corners */
3050
+ .foogallery.fg-image-viewer.fg-round-small .fg-item,
3051
+ .foogallery.fg-image-viewer.fg-round-small .fg-item-inner,
3052
+ .foogallery.fg-image-viewer.fg-round-small .fiv-inner {
3053
+ border-radius: 5px;
3054
+ }
3055
+ .foogallery.fg-image-viewer.fg-round-small .fg-item,
3056
+ .foogallery.fg-image-viewer.fg-round-small .fg-item-inner {
3057
+ border-bottom-left-radius: 0;
3058
+ border-bottom-right-radius: 0;
3059
+ }
3060
+ .foogallery.fg-image-viewer.fg-round-small .fiv-prev,
3061
+ .foogallery.fg-image-viewer.fg-round-small .fiv-next {
3062
+ border-radius: 3px;
3063
+ }
3064
+
3065
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,
3066
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,
3067
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev,
3068
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,
3069
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,
3070
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,
3071
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,
3072
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,
3073
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,
3074
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,
3075
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,
3076
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next {
3077
+ border-radius: 3px;
3078
+ }
3079
+
3080
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item,
3081
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,
3082
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-inner {
3083
+ border-radius: 10px;
3084
+ }
3085
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item,
3086
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner {
3087
+ border-bottom-left-radius: 0;
3088
+ border-bottom-right-radius: 0;
3089
+ }
3090
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-prev,
3091
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-next {
3092
+ border-radius: 5px;
3093
+ }
3094
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,
3095
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,
3096
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev,
3097
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next {
3098
+ border-radius: 5px;
3099
+ }
3100
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,
3101
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,
3102
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,
3103
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,
3104
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,
3105
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,
3106
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev,
3107
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next {
3108
+ border-radius: 3px;
3109
+ }
3110
+
3111
+ .foogallery.fg-image-viewer.fg-round-large .fg-item,
3112
+ .foogallery.fg-image-viewer.fg-round-large .fg-item-inner,
3113
+ .foogallery.fg-image-viewer.fg-round-large .fiv-inner {
3114
+ border-radius: 15px;
3115
+ }
3116
+ .foogallery.fg-image-viewer.fg-round-large .fg-item,
3117
+ .foogallery.fg-image-viewer.fg-round-large .fg-item-inner {
3118
+ border-bottom-left-radius: 0;
3119
+ border-bottom-right-radius: 0;
3120
+ }
3121
+ .foogallery.fg-image-viewer.fg-round-large .fiv-prev,
3122
+ .foogallery.fg-image-viewer.fg-round-large .fiv-next {
3123
+ border-radius: 11px;
3124
+ }
3125
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,
3126
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,
3127
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev,
3128
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next {
3129
+ border-radius: 11px;
3130
+ }
3131
+
3132
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,
3133
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,
3134
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev,
3135
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next {
3136
+ border-radius: 5px;
3137
+ }
3138
+
3139
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,
3140
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,
3141
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev,
3142
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next {
3143
+ border-radius: 3px;
3144
+ }
3145
+
3146
+ .foogallery.fg-image-viewer.fg-round-full .fiv-inner,
3147
+ .foogallery.fg-image-viewer.fg-round-full .fiv-prev,
3148
+ .foogallery.fg-image-viewer.fg-round-full .fiv-next {
3149
+ border-radius: 50%;
3150
+ }
3151
+
3152
+ /* Drop Shadows */
3153
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,
3154
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,
3155
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner,
3156
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,
3157
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,
3158
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,
3159
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,
3160
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner {
3161
+ box-shadow: none;
3162
+ }
3163
+
3164
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner {
3165
+ box-shadow: 0 0 0 1px #ddd;
3166
+ }
3167
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner {
3168
+ box-shadow: 0 0 0 1px #222;
3169
+ }
3170
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner,
3171
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner {
3172
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
3173
+ }
3174
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner,
3175
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner {
3176
+ box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
3177
+ }
3178
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner,
3179
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner {
3180
+ box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
3181
+ }
3182
+ .foogallery.fg-thumbnail,
3183
+ .foogallery.fg-thumbnail.fg-center {
3184
+ text-align: center;
3185
+ }
3186
+ .foogallery.fg-thumbnail.fg-left {
3187
+ text-align: left;
3188
+ }
3189
+ .foogallery.fg-thumbnail.fg-right {
3190
+ text-align: right;
3191
+ }
3192
+
3193
+ .foogallery.fg-thumbnail.fg-float-left {
3194
+ float: left;
3195
+ width: auto;
3196
+ }
3197
+ .foogallery.fg-thumbnail.fg-float-right {
3198
+ float: right;
3199
+ width: auto;
3200
+ }
3201
+
3202
+ .foogallery.fg-thumbnail .fg-item {
3203
+ display: inline-block;
3204
+ vertical-align: top;
3205
+ max-width: 100%;
3206
+ }
3207
+ .foogallery.fg-thumbnail .fg-image {
3208
+ max-width: 100%;
3209
+ }
3210
+ .foogallery.fg-thumbnail .fg-st-hidden {
3211
+ display: none;
3212
+ }
3213
+ .foogallery-stack-album {
3214
+ text-align: center;
3215
+ overflow: hidden;
3216
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
3217
+ font-size: 13px;
3218
+ font-weight: 400;
3219
+ line-height: 1.3;
3220
+ }
3221
+ .foogallery-stack-album,
3222
+ .foogallery-stack-album * {
3223
+ box-sizing: border-box;
3224
+ }
3225
+
3226
+ .foogallery-stack-album.fg-align-left {
3227
+ text-align: left;
3228
+ }
3229
+ .foogallery-stack-album.fg-align-center {
3230
+ text-align: center;
3231
+ }
3232
+ .foogallery-stack-album.fg-align-right {
3233
+ text-align: right;
3234
+ }
3235
+
3236
+ .foogallery-stack-album.fg-disable-transitions,
3237
+ .foogallery-stack-album.fg-disable-transitions * {
3238
+ transition: none !important;
3239
+ }
3240
+
3241
+ .fg-header {
3242
+ display: flex;
3243
+ flex-wrap: nowrap;
3244
+ justify-content: space-between;
3245
+ align-items: center;
3246
+ position: relative;
3247
+ padding: 0;
3248
+ margin: 0;
3249
+ border-top: solid 1px #aaa;
3250
+ border-bottom: solid 1px #aaa;
3251
+ }
3252
+
3253
+ .fg-header-title {
3254
+ display: block;
3255
+ margin: 0;
3256
+ padding: 0 20px;
3257
+ width: 100%;
3258
+ text-align: left;
3259
+ }
3260
+
3261
+ .fg-header-active {
3262
+ display: block;
3263
+ margin: 0;
3264
+ padding: 0 20px;
3265
+ visibility: hidden;
3266
+ opacity: 0;
3267
+ width: 100%;
3268
+ text-align: right;
3269
+ transition-property: opacity, visibility;
3270
+ transition-duration: .3s;
3271
+ transition-timing-function: ease-in-out;
3272
+ }
3273
+
3274
+ .fg-header-back {
3275
+ display: block;
3276
+ padding: 0;
3277
+ margin: 5px;
3278
+ visibility: hidden;
3279
+ opacity: 0;
3280
+ min-width: 40px;
3281
+ width: 40px;
3282
+ height: 40px;
3283
+ border-radius: 50%;
3284
+ text-align: center;
3285
+ line-height: 38px;
3286
+ color: #999;
3287
+ background: #ddd;
3288
+ background: rgba(200,200,200,0.5);
3289
+ cursor: pointer;
3290
+ -webkit-touch-callout: none;
3291
+ -webkit-user-select: none;
3292
+ -moz-user-select: none;
3293
+ -ms-user-select: none;
3294
+ user-select: none;
3295
+ transition-property: opacity, visibility;
3296
+ transition-duration: .3s;
3297
+ transition-timing-function: ease-in-out;
3298
+ }
3299
+
3300
+ .fg-has-active .fg-header-back,
3301
+ .fg-has-active .fg-header-active {
3302
+ visibility: visible;
3303
+ opacity: 1;
3304
+ }
3305
+
3306
+
3307
+ .fg-piles {
3308
+ display: inline-block;
3309
+ position: relative;
3310
+ transition-property: width, height;
3311
+ transition-duration: .3s;
3312
+ transition-timing-function: ease-in-out;
3313
+ }
3314
+
3315
+ .fg-pile {
3316
+ display: block;
3317
+ position: absolute;
3318
+ top: 0;
3319
+ left: 0;
3320
+ list-style: none;
3321
+ padding: 0;
3322
+ margin: 0;
3323
+ visibility: visible;
3324
+ opacity: 1;
3325
+ transition-property: opacity, visibility, top, left, width, height;
3326
+ transition-duration: .3s;
3327
+ transition-timing-function: ease-in-out;
3328
+ }
3329
+
3330
+ .fg-pile.fg-hidden {
3331
+ visibility: hidden;
3332
+ opacity: 0;
3333
+ }
3334
+
3335
+ .fg-pile-item {
3336
+ display: block;
3337
+ position: absolute;
3338
+ top: 25px;
3339
+ left: 25px;
3340
+ visibility: visible;
3341
+ opacity: 1;
3342
+ cursor: pointer;
3343
+ border: 10px solid #fff;
3344
+ background-color: #FFF;
3345
+ box-shadow: 0 1px 4px rgba(0,0,0,0.2);
3346
+ transition-property: opacity, visibility, top, left, transform;
3347
+ transition-duration: .3s;
3348
+ transition-timing-function: ease-in-out;
3349
+ z-index: 1;
3350
+ transform: rotate(0deg);
3351
+ }
3352
+
3353
+ .fg-expanded .fg-pile-item {
3354
+ z-index: 2;
3355
+ transform: rotate(0deg) !important;
3356
+ }
3357
+ .fg-pile-item.fg-has-cover {
3358
+ z-index: 10;
3359
+ transform: rotate(0deg) !important;
3360
+ }
3361
+
3362
+ .fg-pile-item:nth-child(2) {
3363
+ z-index: 9;
3364
+ }
3365
+ .fg-pile-item:nth-child(3) {
3366
+ z-index: 8;
3367
+ }
3368
+ .fg-pile-item:nth-child(4) {
3369
+ z-index: 7;
3370
+ }
3371
+ .fg-pile-item:nth-child(1n+5) {
3372
+ visibility: hidden;
3373
+ opacity: 0;
3374
+ }
3375
+ .fg-expanded .fg-pile-item:nth-child(1n+4) {
3376
+ visibility: visible;
3377
+ opacity: 1;
3378
+ }
3379
+
3380
+ .fg-pile-item-thumb {
3381
+ display: block;
3382
+ }
3383
+
3384
+ .fg-pile-item-image {
3385
+ display: block;
3386
+ }
3387
+
3388
+ .fg-pile-item-caption {
3389
+ display: flex;
3390
+ justify-content: center;
3391
+ flex-direction: column;
3392
+ position: absolute;
3393
+ top: 0;
3394
+ left: 0;
3395
+ bottom: 0;
3396
+ right: 0;
3397
+ width: 100%;
3398
+ height: 100%;
3399
+ margin: 0;
3400
+ padding: 10px;
3401
+ background-color: rgba(68, 68, 68, 0.5);
3402
+ color: #FFFFFF;
3403
+ text-align: center;
3404
+ visibility: hidden;
3405
+ opacity: 0;
3406
+ transition-property: opacity, visibility;
3407
+ transition-duration: .3s;
3408
+ transition-timing-function: ease-in-out;
3409
+ }
3410
+ .fg-pile-item-title {
3411
+ display: block;
3412
+ width: 100%;
3413
+ padding: 0 0 10px;
3414
+ }
3415
+ .fg-pile-item-desc {
3416
+ display: block;
3417
+ width: 100%;
3418
+ max-height: 100%;
3419
+ border-top: solid 1px currentColor;
3420
+ padding: 10px 0 0;
3421
+ overflow: hidden;
3422
+ }
3423
+
3424
+ .fg-pile-item-thumb:hover .fg-pile-item-caption {
3425
+ visibility: visible;
3426
+ opacity: 1;
3427
+ }
3428
+
3429
+ .fg-pile-cover {
3430
+ display: flex;
3431
+ justify-content: left;
3432
+ align-items: center;
3433
+ position: absolute;
3434
+ top: 0;
3435
+ left: 0;
3436
+ bottom: 0;
3437
+ right: 0;
3438
+ width: 100%;
3439
+ height: 100%;
3440
+ visibility: visible;
3441
+ opacity: 1;
3442
+ cursor: pointer;
3443
+ -webkit-touch-callout: none;
3444
+ -webkit-user-select: none;
3445
+ -moz-user-select: none;
3446
+ -ms-user-select: none;
3447
+ user-select: none;
3448
+ transition-property: opacity, visibility;
3449
+ transition-duration: .3s;
3450
+ transition-timing-function: ease-in-out;
3451
+ }
3452
+
3453
+ .fg-expanded .fg-pile-cover {
3454
+ visibility: hidden;
3455
+ opacity: 0;
3456
+ pointer-events: none;
3457
+ }
3458
+
3459
+ .fg-pile-cover-content {
3460
+ display: flex;
3461
+ position: relative;
3462
+ background: #fff;
3463
+ color: #333;
3464
+ width: 75%;
3465
+ font-weight: 700;
3466
+ box-shadow: 1px 1px 1px rgba(0,0,0,0.1), 5px 0 5px -3px rgba(0,0,0,0.4), inset 0 0 5px rgba(0,0,0,0.04);
3467
+ }
3468
+
3469
+ .fg-pile-cover-title {
3470
+ text-align: center;
3471
+ padding: 10px;
3472
+ width: 100%;
3473
+ }
3474
+ .fg-pile-cover-count {
3475
+ color: #aaa;
3476
+ padding: 10px 5px;
3477
+ background: #F7F7F7;
3478
+ height: 100%;
3479
  }
extensions/default-templates/shared/img/icons.svg CHANGED
@@ -1,184 +1,184 @@
1
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16">
2
- <style>
3
- .icon { display: none; fill: #999; }
4
- .icon:target { display: inline; }
5
- .dark { fill: #333; }
6
- .light { fill: #FFF; }
7
- </style>
8
- <defs>
9
- <path id="image-def" d="M15 1h-14c-0.55 0-1 0.45-1 1v12c0 0.55 0.45 1 1 1h14c0.55 0 1-0.45 1-1v-12c0-0.55-0.45-1-1-1zM11.5 3c0.828 0 1.5 0.672 1.5 1.5s-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5 0.672-1.5 1.5-1.5zM14 13h-12v-2l3.5-6 4 5h1l3.5-3v6z"/>
10
- <path id="zoom-def" d="M15.56 15.56c-0.587 0.587-1.538 0.587-2.125 0l-2.652-2.652c-1.090 0.699-2.379 1.116-3.771 1.116-3.872 0-7.012-3.139-7.012-7.012s3.14-7.012 7.012-7.012c3.873 0 7.012 3.139 7.012 7.012 0 1.392-0.417 2.68-1.116 3.771l2.652 2.652c0.587 0.587 0.587 1.538 0 2.125zM7.012 2.003c-2.766 0-5.009 2.243-5.009 5.009s2.243 5.009 5.009 5.009c2.766 0 5.009-2.242 5.009-5.009s-2.242-5.009-5.009-5.009zM8.014 10.017h-2.003v-2.003h-2.003v-2.003h2.003v-2.003h2.003v2.003h2.003v2.003h-2.003v2.003z"/>
11
- <path id="zoom2-def" d="M15.56 15.56c-0.587 0.587-1.538 0.587-2.125 0l-2.652-2.652c-1.090 0.699-2.379 1.116-3.771 1.116-3.872 0-7.012-3.139-7.012-7.012s3.14-7.012 7.012-7.012c3.873 0 7.012 3.139 7.012 7.012 0 1.391-0.417 2.68-1.116 3.771l2.652 2.652c0.587 0.587 0.587 1.538 0 2.125zM7.012 2.003c-2.766 0-5.009 2.242-5.009 5.009s2.243 5.009 5.009 5.009c2.766 0 5.009-2.242 5.009-5.009s-2.242-5.009-5.009-5.009z"/>
12
- <g id="zoom3-def">
13
- <path d="M8.667 7.333h-1.333v-1.333c0-0.184-0.149-0.333-0.333-0.333s-0.333 0.149-0.333 0.333v1.333h-1.333c-0.184 0-0.333 0.149-0.333 0.333s0.149 0.333 0.333 0.333h1.333v1.333c0 0.184 0.149 0.333 0.333 0.333s0.333-0.149 0.333-0.333v-1.333h1.333c0.184 0 0.333-0.149 0.333-0.333s-0.149-0.333-0.333-0.333z"/>
14
- <path d="M12.288 9.98l-0.857-0.858c0.151-0.459 0.236-0.947 0.236-1.455 0-2.573-2.094-4.667-4.667-4.667s-4.667 2.094-4.667 4.667 2.094 4.667 4.667 4.667c0.509 0 0.997-0.085 1.456-0.236l1.549 1.547 0.043 0.037c0.401 0.337 0.899 0.523 1.403 0.523 1.151 0 2.087-0.936 2.087-2.087 0-0.56-0.219-1.085-0.616-1.479l-0.633-0.657zM3.667 7.667c0-1.838 1.495-3.333 3.333-3.333s3.333 1.495 3.333 3.333-1.495 3.333-3.333 3.333-3.333-1.495-3.333-3.333z"/>
15
- </g>
16
- <path id="circle-plus-def" d="M8 0c-4.418 0-8 3.582-8 8s3.582 8 8 8 8-3.582 8-8-3.582-8-8-8zM9 9v4h-2v-4h-4v-2h4v-4h2v4h4v2h-4z"/>
17
- <path id="plus-def" d="M15.5 6h-5.5v-5.5c0-0.276-0.224-0.5-0.5-0.5h-3c-0.276 0-0.5 0.224-0.5 0.5v5.5h-5.5c-0.276 0-0.5 0.224-0.5 0.5v3c0 0.276 0.224 0.5 0.5 0.5h5.5v5.5c0 0.276 0.224 0.5 0.5 0.5h3c0.276 0 0.5-0.224 0.5-0.5v-5.5h5.5c0.276 0 0.5-0.224 0.5-0.5v-3c0-0.276-0.224-0.5-0.5-0.5z"/>
18
- <path id="eye-def" d="M5.998 8c0 1.104 0.896 2 2 2s2-0.896 2-2v-0.017c-0.214 0.217-0.507 0.35-0.833 0.35-0.644 0-1.167-0.523-1.167-1.167 0-0.463 0.273-0.867 0.663-1.053-0.207-0.073-0.43-0.113-0.663-0.113-1.103 0-2 0.897-2 2zM15.552 6.863c-1.24-1.577-4.26-4.197-7.55-4.197-3.293 0-6.316 2.62-7.557 4.197-0.28 0.36-0.433 0.75-0.443 1.137 0.010 0.387 0.163 0.777 0.443 1.137 1.24 1.577 4.26 4.197 7.553 4.197s6.313-2.62 7.553-4.197c0.283-0.36 0.437-0.75 0.447-1.137-0.010-0.387-0.163-0.777-0.447-1.137zM7.998 11.333c-1.84 0-3.333-1.493-3.333-3.333s1.493-3.333 3.333-3.333 3.333 1.493 3.333 3.333c-0 1.84-1.493 3.333-3.333 3.333z"/>
19
- <path id="external-def" d="M2 2v12h12v-4h2v5c0 0.552-0.448 1-1 1h-14c-0.552 0-1-0.448-1-1v-14c0-0.552 0.448-1 1-1h5v2h-4zM8 0h7c0.552 0 1 0.448 1 1v7l-3-3l-6 6l-2-2l6-6z"/>
20
- <path id="video-default-def" d="M0 8a8 8 0 0 0 16 0a8 8 0 0 0-16 0M6 5l5 3-5 3z" fill-rule="evenodd"/>
21
- <path id="video-1-def" d="M3 2l10 6-10 6z"/>
22
- <path id="video-2-def" d="M0 8C0 2 0 2 8 2C16 2 16 2 16 8C16 14 16 14 8 14C0 14 0 14 0 8zM6.5 5.5l4 2.5-4 2.5z" fill-rule="evenodd"/>
23
- <path id="video-3-def" d="M0 8a8 8 0 0 0 16 0a8 8 0 0 0-16 0M1.5 8a6.5 6.5 0 0 0 13 0a6.5 6.5 0 0 0-13 0M6 5l5 3-5 3z" fill-rule="evenodd"/>
24
- <path id="video-4-def" d="M0 1c0-0.552 0.448-1 1-1h14c0.552 0 1 0.448 1 1v14c0 0.552-0.448 1-1 1h-14c-0.552 0-1-0.448-1-1zM6 5l5 3-5 3z" fill-rule="evenodd"/>
25
- <g id="cart-def">
26
- <path d="M13.238 9c0.55 0 1.124-0.433 1.275-0.962l1.451-5.077c0.151-0.529-0.175-0.962-0.725-0.962h-10.238c0-1.105-0.895-2-2-2h-3v2h3v8.5c0 0.828 0.672 1.5 1.5 1.5h9.5c0.552 0 1-0.448 1-1s-0.448-1-1-1h-9v-1h8.238zM5 4h9.044l-0.857 3h-8.187v-3z"/>
27
- <path d="M6 14.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"/>
28
- <path d="M15 14.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"/>
29
- </g>
30
- </defs>
31
- <!-- image -->
32
- <g id="image" class="icon">
33
- <use xlink:href="#image-def"/>
34
- </g>
35
- <g id="image-light" class="icon light">
36
- <use xlink:href="#image-def"/>
37
- </g>
38
- <g id="image-dark" class="icon dark">
39
- <use xlink:href="#image-def"/>
40
- </g>
41
-
42
- <!-- zoom -->
43
- <g id="zoom" class="icon">
44
- <use xlink:href="#zoom-def"/>
45
- </g>
46
- <g id="zoom-light" class="icon light">
47
- <use xlink:href="#zoom-def"/>
48
- </g>
49
- <g id="zoom-dark" class="icon dark">
50
- <use xlink:href="#zoom-def"/>
51
- </g>
52
-
53
- <!-- zoom2 -->
54
- <g id="zoom2" class="icon">
55
- <use xlink:href="#zoom2-def"/>
56
- </g>
57
- <g id="zoom2-light" class="icon light">
58
- <use xlink:href="#zoom2-def"/>
59
- </g>
60
- <g id="zoom2-dark" class="icon dark">
61
- <use xlink:href="#zoom2-def"/>
62
- </g>
63
-
64
- <!-- zoom3 -->
65
- <g id="zoom3" class="icon">
66
- <use xlink:href="#zoom3-def"/>
67
- </g>
68
- <g id="zoom3-light" class="icon light">
69
- <use xlink:href="#zoom3-def"/>
70
- </g>
71
- <g id="zoom3-dark" class="icon dark">
72
- <use xlink:href="#zoom3-def"/>
73
- </g>
74
-
75
- <!-- circle-plus -->
76
- <g id="circle-plus" class="icon">
77
- <use xlink:href="#circle-plus-def"/>
78
- </g>
79
- <g id="circle-plus-light" class="icon light">
80
- <use xlink:href="#circle-plus-def"/>
81
- </g>
82
- <g id="circle-plus-dark" class="icon dark">
83
- <use xlink:href="#circle-plus-def"/>
84
- </g>
85
-
86
- <!-- plus -->
87
- <g id="plus" class="icon">
88
- <use xlink:href="#plus-def"/>
89
- </g>
90
- <g id="plus-light" class="icon light">
91
- <use xlink:href="#plus-def"/>
92
- </g>
93
- <g id="plus-dark" class="icon dark">
94
- <use xlink:href="#plus-def"/>
95
- </g>
96
-
97
- <!-- eye -->
98
- <g id="eye" class="icon">
99
- <use xlink:href="#eye-def"/>
100
- </g>
101
- <g id="eye-light" class="icon light">
102
- <use xlink:href="#eye-def"/>
103
- </g>
104
- <g id="eye-dark" class="icon dark">
105
- <use xlink:href="#eye-def"/>
106
- </g>
107
-
108
- <!-- external -->
109
- <g id="external" class="icon">
110
- <use xlink:href="#external-def"/>
111
- </g>
112
- <g id="external-light" class="icon light">
113
- <use xlink:href="#external-def"/>
114
- </g>
115
- <g id="external-dark" class="icon dark">
116
- <use xlink:href="#external-def"/>
117
- </g>
118
-
119
- <!-- cart -->
120
- <g id="cart" class="icon">
121
- <use xlink:href="#cart-def"/>
122
- </g>
123
- <g id="cart-light" class="icon light">
124
- <use xlink:href="#cart-def"/>
125
- </g>
126
- <g id="cart-dark" class="icon dark">
127
- <use xlink:href="#cart-def"/>
128
- </g>
129
-
130
- <!-- video-default -->
131
- <g id="video-default" class="icon">
132
- <use xlink:href="#video-default-def"/>
133
- </g>
134
- <g id="video-default-light" class="icon light">
135
- <use xlink:href="#video-default-def"/>
136
- </g>
137
- <g id="video-default-dark" class="icon dark">
138
- <use xlink:href="#video-default-def"/>
139
- </g>
140
-
141
- <!-- video-1 -->
142
- <g id="video-1" class="icon">
143
- <use xlink:href="#video-1-def"/>
144
- </g>
145
- <g id="video-1-light" class="icon light">
146
- <use xlink:href="#video-1-def"/>
147
- </g>
148
- <g id="video-1-dark" class="icon dark">
149
- <use xlink:href="#video-1-def"/>
150
- </g>
151
-
152
- <!-- video-2 -->
153
- <g id="video-2" class="icon">
154
- <use xlink:href="#video-2-def"/>
155
- </g>
156
- <g id="video-2-light" class="icon light">
157
- <use xlink:href="#video-2-def"/>
158
- </g>
159
- <g id="video-2-dark" class="icon dark">
160
- <use xlink:href="#video-2-def"/>
161
- </g>
162
-
163
- <!-- video-3 -->
164
- <g id="video-3" class="icon">
165
- <use xlink:href="#video-3-def"/>
166
- </g>
167
- <g id="video-3-light" class="icon light">
168
- <use xlink:href="#video-3-def"/>
169
- </g>
170
- <g id="video-3-dark" class="icon dark">
171
- <use xlink:href="#video-3-def"/>
172
- </g>
173
-
174
- <!-- video-4 -->
175
- <g id="video-4" class="icon">
176
- <use xlink:href="#video-4-def"/>
177
- </g>
178
- <g id="video-4-light" class="icon light">
179
- <use xlink:href="#video-4-def"/>
180
- </g>
181
- <g id="video-4-dark" class="icon dark">
182
- <use xlink:href="#video-4-def"/>
183
- </g>
184
  </svg>
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16">
2
+ <style>
3
+ .icon { display: none; fill: #999; }
4
+ .icon:target { display: inline; }
5
+ .dark { fill: #333; }
6
+ .light { fill: #FFF; }
7
+ </style>
8
+ <defs>
9
+ <path id="image-def" d="M15 1h-14c-0.55 0-1 0.45-1 1v12c0 0.55 0.45 1 1 1h14c0.55 0 1-0.45 1-1v-12c0-0.55-0.45-1-1-1zM11.5 3c0.828 0 1.5 0.672 1.5 1.5s-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5 0.672-1.5 1.5-1.5zM14 13h-12v-2l3.5-6 4 5h1l3.5-3v6z"/>
10
+ <path id="zoom-def" d="M15.56 15.56c-0.587 0.587-1.538 0.587-2.125 0l-2.652-2.652c-1.090 0.699-2.379 1.116-3.771 1.116-3.872 0-7.012-3.139-7.012-7.012s3.14-7.012 7.012-7.012c3.873 0 7.012 3.139 7.012 7.012 0 1.392-0.417 2.68-1.116 3.771l2.652 2.652c0.587 0.587 0.587 1.538 0 2.125zM7.012 2.003c-2.766 0-5.009 2.243-5.009 5.009s2.243 5.009 5.009 5.009c2.766 0 5.009-2.242 5.009-5.009s-2.242-5.009-5.009-5.009zM8.014 10.017h-2.003v-2.003h-2.003v-2.003h2.003v-2.003h2.003v2.003h2.003v2.003h-2.003v2.003z"/>
11
+ <path id="zoom2-def" d="M15.56 15.56c-0.587 0.587-1.538 0.587-2.125 0l-2.652-2.652c-1.090 0.699-2.379 1.116-3.771 1.116-3.872 0-7.012-3.139-7.012-7.012s3.14-7.012 7.012-7.012c3.873 0 7.012 3.139 7.012 7.012 0 1.391-0.417 2.68-1.116 3.771l2.652 2.652c0.587 0.587 0.587 1.538 0 2.125zM7.012 2.003c-2.766 0-5.009 2.242-5.009 5.009s2.243 5.009 5.009 5.009c2.766 0 5.009-2.242 5.009-5.009s-2.242-5.009-5.009-5.009z"/>
12
+ <g id="zoom3-def">
13
+ <path d="M8.667 7.333h-1.333v-1.333c0-0.184-0.149-0.333-0.333-0.333s-0.333 0.149-0.333 0.333v1.333h-1.333c-0.184 0-0.333 0.149-0.333 0.333s0.149 0.333 0.333 0.333h1.333v1.333c0 0.184 0.149 0.333 0.333 0.333s0.333-0.149 0.333-0.333v-1.333h1.333c0.184 0 0.333-0.149 0.333-0.333s-0.149-0.333-0.333-0.333z"/>
14
+ <path d="M12.288 9.98l-0.857-0.858c0.151-0.459 0.236-0.947 0.236-1.455 0-2.573-2.094-4.667-4.667-4.667s-4.667 2.094-4.667 4.667 2.094 4.667 4.667 4.667c0.509 0 0.997-0.085 1.456-0.236l1.549 1.547 0.043 0.037c0.401 0.337 0.899 0.523 1.403 0.523 1.151 0 2.087-0.936 2.087-2.087 0-0.56-0.219-1.085-0.616-1.479l-0.633-0.657zM3.667 7.667c0-1.838 1.495-3.333 3.333-3.333s3.333 1.495 3.333 3.333-1.495 3.333-3.333 3.333-3.333-1.495-3.333-3.333z"/>
15
+ </g>
16
+ <path id="circle-plus-def" d="M8 0c-4.418 0-8 3.582-8 8s3.582 8 8 8 8-3.582 8-8-3.582-8-8-8zM9 9v4h-2v-4h-4v-2h4v-4h2v4h4v2h-4z"/>
17
+ <path id="plus-def" d="M15.5 6h-5.5v-5.5c0-0.276-0.224-0.5-0.5-0.5h-3c-0.276 0-0.5 0.224-0.5 0.5v5.5h-5.5c-0.276 0-0.5 0.224-0.5 0.5v3c0 0.276 0.224 0.5 0.5 0.5h5.5v5.5c0 0.276 0.224 0.5 0.5 0.5h3c0.276 0 0.5-0.224 0.5-0.5v-5.5h5.5c0.276 0 0.5-0.224 0.5-0.5v-3c0-0.276-0.224-0.5-0.5-0.5z"/>
18
+ <path id="eye-def" d="M5.998 8c0 1.104 0.896 2 2 2s2-0.896 2-2v-0.017c-0.214 0.217-0.507 0.35-0.833 0.35-0.644 0-1.167-0.523-1.167-1.167 0-0.463 0.273-0.867 0.663-1.053-0.207-0.073-0.43-0.113-0.663-0.113-1.103 0-2 0.897-2 2zM15.552 6.863c-1.24-1.577-4.26-4.197-7.55-4.197-3.293 0-6.316 2.62-7.557 4.197-0.28 0.36-0.433 0.75-0.443 1.137 0.010 0.387 0.163 0.777 0.443 1.137 1.24 1.577 4.26 4.197 7.553 4.197s6.313-2.62 7.553-4.197c0.283-0.36 0.437-0.75 0.447-1.137-0.010-0.387-0.163-0.777-0.447-1.137zM7.998 11.333c-1.84 0-3.333-1.493-3.333-3.333s1.493-3.333 3.333-3.333 3.333 1.493 3.333 3.333c-0 1.84-1.493 3.333-3.333 3.333z"/>
19
+ <path id="external-def" d="M2 2v12h12v-4h2v5c0 0.552-0.448 1-1 1h-14c-0.552 0-1-0.448-1-1v-14c0-0.552 0.448-1 1-1h5v2h-4zM8 0h7c0.552 0 1 0.448 1 1v7l-3-3l-6 6l-2-2l6-6z"/>
20
+ <path id="video-default-def" d="M0 8a8 8 0 0 0 16 0a8 8 0 0 0-16 0M6 5l5 3-5 3z" fill-rule="evenodd"/>
21
+ <path id="video-1-def" d="M3 2l10 6-10 6z"/>
22
+ <path id="video-2-def" d="M0 8C0 2 0 2 8 2C16 2 16 2 16 8C16 14 16 14 8 14C0 14 0 14 0 8zM6.5 5.5l4 2.5-4 2.5z" fill-rule="evenodd"/>
23
+ <path id="video-3-def" d="M0 8a8 8 0 0 0 16 0a8 8 0 0 0-16 0M1.5 8a6.5 6.5 0 0 0 13 0a6.5 6.5 0 0 0-13 0M6 5l5 3-5 3z" fill-rule="evenodd"/>
24
+ <path id="video-4-def" d="M0 1c0-0.552 0.448-1 1-1h14c0.552 0 1 0.448 1 1v14c0 0.552-0.448 1-1 1h-14c-0.552 0-1-0.448-1-1zM6 5l5 3-5 3z" fill-rule="evenodd"/>
25
+ <g id="cart-def">
26
+ <path d="M13.238 9c0.55 0 1.124-0.433 1.275-0.962l1.451-5.077c0.151-0.529-0.175-0.962-0.725-0.962h-10.238c0-1.105-0.895-2-2-2h-3v2h3v8.5c0 0.828 0.672 1.5 1.5 1.5h9.5c0.552 0 1-0.448 1-1s-0.448-1-1-1h-9v-1h8.238zM5 4h9.044l-0.857 3h-8.187v-3z"/>
27
+ <path d="M6 14.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"/>
28
+ <path d="M15 14.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"/>
29
+ </g>
30
+ </defs>
31
+ <!-- image -->
32
+ <g id="image" class="icon">
33
+ <use xlink:href="#image-def"/>
34
+ </g>
35
+ <g id="image-light" class="icon light">
36
+ <use xlink:href="#image-def"/>
37
+ </g>
38
+ <g id="image-dark" class="icon dark">
39
+ <use xlink:href="#image-def"/>
40
+ </g>
41
+
42
+ <!-- zoom -->
43
+ <g id="zoom" class="icon">
44
+ <use xlink:href="#zoom-def"/>
45
+ </g>
46
+ <g id="zoom-light" class="icon light">
47
+ <use xlink:href="#zoom-def"/>
48
+ </g>
49
+ <g id="zoom-dark" class="icon dark">
50
+ <use xlink:href="#zoom-def"/>
51
+ </g>
52
+
53
+ <!-- zoom2 -->
54
+ <g id="zoom2" class="icon">
55
+ <use xlink:href="#zoom2-def"/>
56
+ </g>
57
+ <g id="zoom2-light" class="icon light">
58
+ <use xlink:href="#zoom2-def"/>
59
+ </g>
60
+ <g id="zoom2-dark" class="icon dark">
61
+ <use xlink:href="#zoom2-def"/>
62
+ </g>
63
+
64
+ <!-- zoom3 -->
65
+ <g id="zoom3" class="icon">
66
+ <use xlink:href="#zoom3-def"/>
67
+ </g>
68
+ <g id="zoom3-light" class="icon light">
69
+ <use xlink:href="#zoom3-def"/>
70
+ </g>
71
+ <g id="zoom3-dark" class="icon dark">
72
+ <use xlink:href="#zoom3-def"/>
73
+ </g>
74
+
75
+ <!-- circle-plus -->
76
+ <g id="circle-plus" class="icon">
77
+ <use xlink:href="#circle-plus-def"/>
78
+ </g>
79
+ <g id="circle-plus-light" class="icon light">
80
+ <use xlink:href="#circle-plus-def"/>
81
+ </g>
82
+ <g id="circle-plus-dark" class="icon dark">
83
+ <use xlink:href="#circle-plus-def"/>
84
+ </g>
85
+
86
+ <!-- plus -->
87
+ <g id="plus" class="icon">
88
+ <use xlink:href="#plus-def"/>
89
+ </g>
90
+ <g id="plus-light" class="icon light">
91
+ <use xlink:href="#plus-def"/>
92
+ </g>
93
+ <g id="plus-dark" class="icon dark">
94
+ <use xlink:href="#plus-def"/>
95
+ </g>
96
+
97
+ <!-- eye -->
98
+ <g id="eye" class="icon">
99
+ <use xlink:href="#eye-def"/>
100
+ </g>
101
+ <g id="eye-light" class="icon light">
102
+ <use xlink:href="#eye-def"/>
103
+ </g>
104
+ <g id="eye-dark" class="icon dark">
105
+ <use xlink:href="#eye-def"/>
106
+ </g>
107
+
108
+ <!-- external -->
109
+ <g id="external" class="icon">
110
+ <use xlink:href="#external-def"/>
111
+ </g>
112
+ <g id="external-light" class="icon light">
113
+ <use xlink:href="#external-def"/>
114
+ </g>
115
+ <g id="external-dark" class="icon dark">
116
+ <use xlink:href="#external-def"/>
117
+ </g>
118
+
119
+ <!-- cart -->
120
+ <g id="cart" class="icon">
121
+ <use xlink:href="#cart-def"/>
122
+ </g>
123
+ <g id="cart-light" class="icon light">
124
+ <use xlink:href="#cart-def"/>
125
+ </g>
126
+ <g id="cart-dark" class="icon dark">
127
+ <use xlink:href="#cart-def"/>
128
+ </g>
129
+
130
+ <!-- video-default -->
131
+ <g id="video-default" class="icon">
132
+ <use xlink:href="#video-default-def"/>
133
+ </g>
134
+ <g id="video-default-light" class="icon light">
135
+ <use xlink:href="#video-default-def"/>
136
+ </g>
137
+ <g id="video-default-dark" class="icon dark">
138
+ <use xlink:href="#video-default-def"/>
139
+ </g>
140
+
141
+ <!-- video-1 -->
142
+ <g id="video-1" class="icon">
143
+ <use xlink:href="#video-1-def"/>
144
+ </g>
145
+ <g id="video-1-light" class="icon light">
146
+ <use xlink:href="#video-1-def"/>
147
+ </g>
148
+ <g id="video-1-dark" class="icon dark">
149
+ <use xlink:href="#video-1-def"/>
150
+ </g>
151
+
152
+ <!-- video-2 -->
153
+ <g id="video-2" class="icon">
154
+ <use xlink:href="#video-2-def"/>
155
+ </g>
156
+ <g id="video-2-light" class="icon light">
157
+ <use xlink:href="#video-2-def"/>
158
+ </g>
159
+ <g id="video-2-dark" class="icon dark">
160
+ <use xlink:href="#video-2-def"/>
161
+ </g>
162
+
163
+ <!-- video-3 -->
164
+ <g id="video-3" class="icon">
165
+ <use xlink:href="#video-3-def"/>
166
+ </g>
167
+ <g id="video-3-light" class="icon light">
168
+ <use xlink:href="#video-3-def"/>
169
+ </g>
170
+ <g id="video-3-dark" class="icon dark">
171
+ <use xlink:href="#video-3-def"/>
172
+ </g>
173
+
174
+ <!-- video-4 -->
175
+ <g id="video-4" class="icon">
176
+ <use xlink:href="#video-4-def"/>
177
+ </g>
178
+ <g id="video-4-light" class="icon light">
179
+ <use xlink:href="#video-4-def"/>
180
+ </g>
181
+ <g id="video-4-dark" class="icon dark">
182
+ <use xlink:href="#video-4-def"/>
183
+ </g>
184
  </svg>
extensions/default-templates/shared/js/foogallery.js CHANGED
@@ -1,11520 +1,11520 @@
1
- /**
2
- * Copyright 2016 Google Inc. All Rights Reserved.
3
- *
4
- * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.
5
- *
6
- * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
7
- *
8
- */
9
- (function() {
10
- 'use strict';
11
-
12
- // Exit early if we're not running in a browser.
13
- if (typeof window !== 'object') {
14
- return;
15
- }
16
-
17
- // Exit early if all IntersectionObserver and IntersectionObserverEntry
18
- // features are natively supported.
19
- if ('IntersectionObserver' in window &&
20
- 'IntersectionObserverEntry' in window &&
21
- 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {
22
-
23
- // Minimal polyfill for Edge 15's lack of `isIntersecting`
24
- // See: https://github.com/w3c/IntersectionObserver/issues/211
25
- if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {
26
- Object.defineProperty(window.IntersectionObserverEntry.prototype,
27
- 'isIntersecting', {
28
- get: function () {
29
- return this.intersectionRatio > 0;
30
- }
31
- });
32
- }
33
- return;
34
- }
35
-
36
-
37
- /**
38
- * A local reference to the document.
39
- */
40
- var document = window.document;
41
-
42
-
43
- /**
44
- * An IntersectionObserver registry. This registry exists to hold a strong
45
- * reference to IntersectionObserver instances currently observing a target
46
- * element. Without this registry, instances without another reference may be
47
- * garbage collected.
48
- */
49
- var registry = [];
50
-
51
-
52
- /**
53
- * Creates the global IntersectionObserverEntry constructor.
54
- * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry
55
- * @param {Object} entry A dictionary of instance properties.
56
- * @constructor
57
- */
58
- function IntersectionObserverEntry(entry) {
59
- this.time = entry.time;
60
- this.target = entry.target;
61
- this.rootBounds = entry.rootBounds;
62
- this.boundingClientRect = entry.boundingClientRect;
63
- this.intersectionRect = entry.intersectionRect || getEmptyRect();
64
- this.isIntersecting = !!entry.intersectionRect;
65
-
66
- // Calculates the intersection ratio.
67
- var targetRect = this.boundingClientRect;
68
- var targetArea = targetRect.width * targetRect.height;
69
- var intersectionRect = this.intersectionRect;
70
- var intersectionArea = intersectionRect.width * intersectionRect.height;
71
-
72
- // Sets intersection ratio.
73
- if (targetArea) {
74
- // Round the intersection ratio to avoid floating point math issues:
75
- // https://github.com/w3c/IntersectionObserver/issues/324
76
- this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));
77
- } else {
78
- // If area is zero and is intersecting, sets to 1, otherwise to 0
79
- this.intersectionRatio = this.isIntersecting ? 1 : 0;
80
- }
81
- }
82
-
83
-
84
- /**
85
- * Creates the global IntersectionObserver constructor.
86
- * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface
87
- * @param {Function} callback The function to be invoked after intersection
88
- * changes have queued. The function is not invoked if the queue has
89
- * been emptied by calling the `takeRecords` method.
90
- * @param {Object=} opt_options Optional configuration options.
91
- * @constructor
92
- */
93
- function IntersectionObserver(callback, opt_options) {
94
-
95
- var options = opt_options || {};
96
-
97
- if (typeof callback != 'function') {
98
- throw new Error('callback must be a function');
99
- }
100
-
101
- if (options.root && options.root.nodeType != 1) {
102
- throw new Error('root must be an Element');
103
- }
104
-
105
- // Binds and throttles `this._checkForIntersections`.
106
- this._checkForIntersections = throttle(
107
- this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);
108
-
109
- // Private properties.
110
- this._callback = callback;
111
- this._observationTargets = [];
112
- this._queuedEntries = [];
113
- this._rootMarginValues = this._parseRootMargin(options.rootMargin);
114
-
115
- // Public properties.
116
- this.thresholds = this._initThresholds(options.threshold);
117
- this.root = options.root || null;
118
- this.rootMargin = this._rootMarginValues.map(function(margin) {
119
- return margin.value + margin.unit;
120
- }).join(' ');
121
- }
122
-
123
-
124
- /**
125
- * The minimum interval within which the document will be checked for
126
- * intersection changes.
127
- */
128
- IntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;
129
-
130
-
131
- /**
132
- * The frequency in which the polyfill polls for intersection changes.
133
- * this can be updated on a per instance basis and must be set prior to
134
- * calling `observe` on the first target.
135
- */
136
- IntersectionObserver.prototype.POLL_INTERVAL = null;
137
-
138
- /**
139
- * Use a mutation observer on the root element
140
- * to detect intersection changes.
141
- */
142
- IntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;
143
-
144
-
145
- /**
146
- * Starts observing a target element for intersection changes based on
147
- * the thresholds values.
148
- * @param {Element} target The DOM element to observe.
149
- */
150
- IntersectionObserver.prototype.observe = function(target) {
151
- var isTargetAlreadyObserved = this._observationTargets.some(function(item) {
152
- return item.element == target;
153
- });
154
-
155
- if (isTargetAlreadyObserved) {
156
- return;
157
- }
158
-
159
- if (!(target && target.nodeType == 1)) {
160
- throw new Error('target must be an Element');
161
- }
162
-
163
- this._registerInstance();
164
- this._observationTargets.push({element: target, entry: null});
165
- this._monitorIntersections();
166
- this._checkForIntersections();
167
- };
168
-
169
-
170
- /**
171
- * Stops observing a target element for intersection changes.
172
- * @param {Element} target The DOM element to observe.
173
- */
174
- IntersectionObserver.prototype.unobserve = function(target) {
175
- this._observationTargets =
176
- this._observationTargets.filter(function(item) {
177
-
178
- return item.element != target;
179
- });
180
- if (!this._observationTargets.length) {
181
- this._unmonitorIntersections();
182
- this._unregisterInstance();
183
- }
184
- };
185
-
186
-
187
- /**
188
- * Stops observing all target elements for intersection changes.
189
- */
190
- IntersectionObserver.prototype.disconnect = function() {
191
- this._observationTargets = [];
192
- this._unmonitorIntersections();
193
- this._unregisterInstance();
194
- };
195
-
196
-
197
- /**
198
- * Returns any queue entries that have not yet been reported to the
199
- * callback and clears the queue. This can be used in conjunction with the
200
- * callback to obtain the absolute most up-to-date intersection information.
201
- * @return {Array} The currently queued entries.
202
- */
203
- IntersectionObserver.prototype.takeRecords = function() {
204
- var records = this._queuedEntries.slice();
205
- this._queuedEntries = [];
206
- return records;
207
- };
208
-
209
-
210
- /**
211
- * Accepts the threshold value from the user configuration object and
212
- * returns a sorted array of unique threshold values. If a value is not
213
- * between 0 and 1 and error is thrown.
214
- * @private
215
- * @param {Array|number=} opt_threshold An optional threshold value or
216
- * a list of threshold values, defaulting to [0].
217
- * @return {Array} A sorted list of unique and valid threshold values.
218
- */
219
- IntersectionObserver.prototype._initThresholds = function(opt_threshold) {
220
- var threshold = opt_threshold || [0];
221
- if (!Array.isArray(threshold)) threshold = [threshold];
222
-
223
- return threshold.sort().filter(function(t, i, a) {
224
- if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {
225
- throw new Error('threshold must be a number between 0 and 1 inclusively');
226
- }
227
- return t !== a[i - 1];
228
- });
229
- };
230
-
231
-
232
- /**
233
- * Accepts the rootMargin value from the user configuration object
234
- * and returns an array of the four margin values as an object containing
235
- * the value and unit properties. If any of the values are not properly
236
- * formatted or use a unit other than px or %, and error is thrown.
237
- * @private
238
- * @param {string=} opt_rootMargin An optional rootMargin value,
239
- * defaulting to '0px'.
240
- * @return {Array<Object>} An array of margin objects with the keys
241
- * value and unit.
242
- */
243
- IntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {
244
- var marginString = opt_rootMargin || '0px';
245
- var margins = marginString.split(/\s+/).map(function(margin) {
246
- var parts = /^(-?\d*\.?\d+)(px|%)$/.exec(margin);
247
- if (!parts) {
248
- throw new Error('rootMargin must be specified in pixels or percent');
249
- }
250
- return {value: parseFloat(parts[1]), unit: parts[2]};
251
- });
252
-
253
- // Handles shorthand.
254
- margins[1] = margins[1] || margins[0];
255
- margins[2] = margins[2] || margins[0];
256
- margins[3] = margins[3] || margins[1];
257
-
258
- return margins;
259
- };
260
-
261
-
262
- /**
263
- * Starts polling for intersection changes if the polling is not already
264
- * happening, and if the page's visibility state is visible.
265
- * @private
266
- */
267
- IntersectionObserver.prototype._monitorIntersections = function() {
268
- if (!this._monitoringIntersections) {
269
- this._monitoringIntersections = true;
270
-
271
- // If a poll interval is set, use polling instead of listening to
272
- // resize and scroll events or DOM mutations.
273
- if (this.POLL_INTERVAL) {
274
- this._monitoringInterval = setInterval(
275
- this._checkForIntersections, this.POLL_INTERVAL);
276
- }
277
- else {
278
- addEvent(window, 'resize', this._checkForIntersections, true);
279
- addEvent(document, 'scroll', this._checkForIntersections, true);
280
-
281
- if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {
282
- this._domObserver = new MutationObserver(this._checkForIntersections);
283
- this._domObserver.observe(document, {
284
- attributes: true,
285
- childList: true,
286
- characterData: true,
287
- subtree: true
288
- });
289
- }
290
- }
291
- }
292
- };
293
-
294
-
295
- /**
296
- * Stops polling for intersection changes.
297
- * @private
298
- */
299
- IntersectionObserver.prototype._unmonitorIntersections = function() {
300
- if (this._monitoringIntersections) {
301
- this._monitoringIntersections = false;
302
-
303
- clearInterval(this._monitoringInterval);
304
- this._monitoringInterval = null;
305
-
306
- removeEvent(window, 'resize', this._checkForIntersections, true);
307
- removeEvent(document, 'scroll', this._checkForIntersections, true);
308
-
309
- if (this._domObserver) {
310
- this._domObserver.disconnect();
311
- this._domObserver = null;
312
- }
313
- }
314
- };
315
-
316
-
317
- /**
318
- * Scans each observation target for intersection changes and adds them
319
- * to the internal entries queue. If new entries are found, it
320
- * schedules the callback to be invoked.
321
- * @private
322
- */
323
- IntersectionObserver.prototype._checkForIntersections = function() {
324
- var rootIsInDom = this._rootIsInDom();
325
- var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();
326
-
327
- this._observationTargets.forEach(function(item) {
328
- var target = item.element;
329
- var targetRect = getBoundingClientRect(target);
330
- var rootContainsTarget = this._rootContainsTarget(target);
331
- var oldEntry = item.entry;
332
- var intersectionRect = rootIsInDom && rootContainsTarget &&
333
- this._computeTargetAndRootIntersection(target, rootRect);
334
-
335
- var newEntry = item.entry = new IntersectionObserverEntry({
336
- time: now(),
337
- target: target,
338
- boundingClientRect: targetRect,
339
- rootBounds: rootRect,
340
- intersectionRect: intersectionRect
341
- });
342
-
343
- if (!oldEntry) {
344
- this._queuedEntries.push(newEntry);
345
- } else if (rootIsInDom && rootContainsTarget) {
346
- // If the new entry intersection ratio has crossed any of the
347
- // thresholds, add a new entry.
348
- if (this._hasCrossedThreshold(oldEntry, newEntry)) {
349
- this._queuedEntries.push(newEntry);
350
- }
351
- } else {
352
- // If the root is not in the DOM or target is not contained within
353
- // root but the previous entry for this target had an intersection,
354
- // add a new record indicating removal.
355
- if (oldEntry && oldEntry.isIntersecting) {
356
- this._queuedEntries.push(newEntry);
357
- }
358
- }
359
- }, this);
360
-
361
- if (this._queuedEntries.length) {
362
- this._callback(this.takeRecords(), this);
363
- }
364
- };
365
-
366
-
367
- /**
368
- * Accepts a target and root rect computes the intersection between then
369
- * following the algorithm in the spec.
370
- * TODO(philipwalton): at this time clip-path is not considered.
371
- * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo
372
- * @param {Element} target The target DOM element
373
- * @param {Object} rootRect The bounding rect of the root after being
374
- * expanded by the rootMargin value.
375
- * @return {?Object} The final intersection rect object or undefined if no
376
- * intersection is found.
377
- * @private
378
- */
379
- IntersectionObserver.prototype._computeTargetAndRootIntersection =
380
- function(target, rootRect) {
381
-
382
- // If the element isn't displayed, an intersection can't happen.
383
- if (window.getComputedStyle(target).display == 'none') return;
384
-
385
- var targetRect = getBoundingClientRect(target);
386
- var intersectionRect = targetRect;
387
- var parent = getParentNode(target);
388
- var atRoot = false;
389
-
390
- while (!atRoot) {
391
- var parentRect = null;
392
- var parentComputedStyle = parent.nodeType == 1 ?
393
- window.getComputedStyle(parent) : {};
394
-
395
- // If the parent isn't displayed, an intersection can't happen.
396
- if (parentComputedStyle.display == 'none') return;
397
-
398
- if (parent == this.root || parent == document) {
399
- atRoot = true;
400
- parentRect = rootRect;
401
- } else {
402
- // If the element has a non-visible overflow, and it's not the <body>
403
- // or <html> element, update the intersection rect.
404
- // Note: <body> and <html> cannot be clipped to a rect that's not also
405
- // the document rect, so no need to compute a new intersection.
406
- if (parent != document.body &&
407
- parent != document.documentElement &&
408
- parentComputedStyle.overflow != 'visible') {
409
- parentRect = getBoundingClientRect(parent);
410
- }
411
- }
412
-
413
- // If either of the above conditionals set a new parentRect,
414
- // calculate new intersection data.
415
- if (parentRect) {
416
- intersectionRect = computeRectIntersection(parentRect, intersectionRect);
417
-
418
- if (!intersectionRect) break;
419
- }
420
- parent = getParentNode(parent);
421
- }
422
- return intersectionRect;
423
- };
424
-
425
-
426
- /**
427
- * Returns the root rect after being expanded by the rootMargin value.
428
- * @return {Object} The expanded root rect.
429
- * @private
430
- */
431
- IntersectionObserver.prototype._getRootRect = function() {
432
- var rootRect;
433
- if (this.root) {
434
- rootRect = getBoundingClientRect(this.root);
435
- } else {
436
- // Use <html>/<body> instead of window since scroll bars affect size.
437
- var html = document.documentElement;
438
- var body = document.body;
439
- rootRect = {
440
- top: 0,
441
- left: 0,
442
- right: html.clientWidth || body.clientWidth,
443
- width: html.clientWidth || body.clientWidth,
444
- bottom: html.clientHeight || body.clientHeight,
445
- height: html.clientHeight || body.clientHeight
446
- };
447
- }
448
- return this._expandRectByRootMargin(rootRect);
449
- };
450
-
451
-
452
- /**
453
- * Accepts a rect and expands it by the rootMargin value.
454
- * @param {Object} rect The rect object to expand.
455
- * @return {Object} The expanded rect.
456
- * @private
457
- */
458
- IntersectionObserver.prototype._expandRectByRootMargin = function(rect) {
459
- var margins = this._rootMarginValues.map(function(margin, i) {
460
- return margin.unit == 'px' ? margin.value :
461
- margin.value * (i % 2 ? rect.width : rect.height) / 100;
462
- });
463
- var newRect = {
464
- top: rect.top - margins[0],
465
- right: rect.right + margins[1],
466
- bottom: rect.bottom + margins[2],
467
- left: rect.left - margins[3]
468
- };
469
- newRect.width = newRect.right - newRect.left;
470
- newRect.height = newRect.bottom - newRect.top;
471
-
472
- return newRect;
473
- };
474
-
475
-
476
- /**
477
- * Accepts an old and new entry and returns true if at least one of the
478
- * threshold values has been crossed.
479
- * @param {?IntersectionObserverEntry} oldEntry The previous entry for a
480
- * particular target element or null if no previous entry exists.
481
- * @param {IntersectionObserverEntry} newEntry The current entry for a
482
- * particular target element.
483
- * @return {boolean} Returns true if a any threshold has been crossed.
484
- * @private
485
- */
486
- IntersectionObserver.prototype._hasCrossedThreshold =
487
- function(oldEntry, newEntry) {
488
-
489
- // To make comparing easier, an entry that has a ratio of 0
490
- // but does not actually intersect is given a value of -1
491
- var oldRatio = oldEntry && oldEntry.isIntersecting ?
492
- oldEntry.intersectionRatio || 0 : -1;
493
- var newRatio = newEntry.isIntersecting ?
494
- newEntry.intersectionRatio || 0 : -1;
495
-
496
- // Ignore unchanged ratios
497
- if (oldRatio === newRatio) return;
498
-
499
- for (var i = 0; i < this.thresholds.length; i++) {
500
- var threshold = this.thresholds[i];
501
-
502
- // Return true if an entry matches a threshold or if the new ratio
503
- // and the old ratio are on the opposite sides of a threshold.
504
- if (threshold == oldRatio || threshold == newRatio ||
505
- threshold < oldRatio !== threshold < newRatio) {
506
- return true;
507
- }
508
- }
509
- };
510
-
511
-
512
- /**
513
- * Returns whether or not the root element is an element and is in the DOM.
514
- * @return {boolean} True if the root element is an element and is in the DOM.
515
- * @private
516
- */
517
- IntersectionObserver.prototype._rootIsInDom = function() {
518
- return !this.root || containsDeep(document, this.root);
519
- };
520
-
521
-
522
- /**
523
- * Returns whether or not the target element is a child of root.
524
- * @param {Element} target The target element to check.
525
- * @return {boolean} True if the target element is a child of root.
526
- * @private
527
- */
528
- IntersectionObserver.prototype._rootContainsTarget = function(target) {
529
- return containsDeep(this.root || document, target);
530
- };
531
-
532
-
533
- /**
534
- * Adds the instance to the global IntersectionObserver registry if it isn't
535
- * already present.
536
- * @private
537
- */
538
- IntersectionObserver.prototype._registerInstance = function() {
539
- if (registry.indexOf(this) < 0) {
540
- registry.push(this);
541
- }
542
- };
543
-
544
-
545
- /**
546
- * Removes the instance from the global IntersectionObserver registry.
547
- * @private
548
- */
549
- IntersectionObserver.prototype._unregisterInstance = function() {
550
- var index = registry.indexOf(this);
551
- if (index != -1) registry.splice(index, 1);
552
- };
553
-
554
-
555
- /**
556
- * Returns the result of the performance.now() method or null in browsers
557
- * that don't support the API.
558
- * @return {number} The elapsed time since the page was requested.
559
- */
560
- function now() {
561
- return window.performance && performance.now && performance.now();
562
- }
563
-
564
-
565
- /**
566
- * Throttles a function and delays its execution, so it's only called at most
567
- * once within a given time period.
568
- * @param {Function} fn The function to throttle.
569
- * @param {number} timeout The amount of time that must pass before the
570
- * function can be called again.
571
- * @return {Function} The throttled function.
572
- */
573
- function throttle(fn, timeout) {
574
- var timer = null;
575
- return function () {
576
- if (!timer) {
577
- timer = setTimeout(function() {
578
- fn();
579
- timer = null;
580
- }, timeout);
581
- }
582
- };
583
- }
584
-
585
-
586
- /**
587
- * Adds an event handler to a DOM node ensuring cross-browser compatibility.
588
- * @param {Node} node The DOM node to add the event handler to.
589
- * @param {string} event The event name.
590
- * @param {Function} fn The event handler to add.
591
- * @param {boolean} opt_useCapture Optionally adds the even to the capture
592
- * phase. Note: this only works in modern browsers.
593
- */
594
- function addEvent(node, event, fn, opt_useCapture) {
595
- if (typeof node.addEventListener == 'function') {
596
- node.addEventListener(event, fn, opt_useCapture || false);
597
- }
598
- else if (typeof node.attachEvent == 'function') {
599
- node.attachEvent('on' + event, fn);
600
- }
601
- }
602
-
603
-
604
- /**
605
- * Removes a previously added event handler from a DOM node.
606
- * @param {Node} node The DOM node to remove the event handler from.
607
- * @param {string} event The event name.
608
- * @param {Function} fn The event handler to remove.
609
- * @param {boolean} opt_useCapture If the event handler was added with this
610
- * flag set to true, it should be set to true here in order to remove it.
611
- */
612
- function removeEvent(node, event, fn, opt_useCapture) {
613
- if (typeof node.removeEventListener == 'function') {
614
- node.removeEventListener(event, fn, opt_useCapture || false);
615
- }
616
- else if (typeof node.detatchEvent == 'function') {
617
- node.detatchEvent('on' + event, fn);
618
- }
619
- }
620
-
621
-
622
- /**
623
- * Returns the intersection between two rect objects.
624
- * @param {Object} rect1 The first rect.
625
- * @param {Object} rect2 The second rect.
626
- * @return {?Object} The intersection rect or undefined if no intersection
627
- * is found.
628
- */
629
- function computeRectIntersection(rect1, rect2) {
630
- var top = Math.max(rect1.top, rect2.top);
631
- var bottom = Math.min(rect1.bottom, rect2.bottom);
632
- var left = Math.max(rect1.left, rect2.left);
633
- var right = Math.min(rect1.right, rect2.right);
634
- var width = right - left;
635
- var height = bottom - top;
636
-
637
- return (width >= 0 && height >= 0) && {
638
- top: top,
639
- bottom: bottom,
640
- left: left,
641
- right: right,
642
- width: width,
643
- height: height
644
- };
645
- }
646
-
647
-
648
- /**
649
- * Shims the native getBoundingClientRect for compatibility with older IE.
650
- * @param {Element} el The element whose bounding rect to get.
651
- * @return {Object} The (possibly shimmed) rect of the element.
652
- */
653
- function getBoundingClientRect(el) {
654
- var rect;
655
-
656
- try {
657
- rect = el.getBoundingClientRect();
658
- } catch (err) {
659
- // Ignore Windows 7 IE11 "Unspecified error"
660
- // https://github.com/w3c/IntersectionObserver/pull/205
661
- }
662
-
663
- if (!rect) return getEmptyRect();
664
-
665
- // Older IE
666
- if (!(rect.width && rect.height)) {
667
- rect = {
668
- top: rect.top,
669
- right: rect.right,
670
- bottom: rect.bottom,
671
- left: rect.left,
672
- width: rect.right - rect.left,
673
- height: rect.bottom - rect.top
674
- };
675
- }
676
- return rect;
677
- }
678
-
679
-
680
- /**
681
- * Returns an empty rect object. An empty rect is returned when an element
682
- * is not in the DOM.
683
- * @return {Object} The empty rect.
684
- */
685
- function getEmptyRect() {
686
- return {
687
- top: 0,
688
- bottom: 0,
689
- left: 0,
690
- right: 0,
691
- width: 0,
692
- height: 0
693
- };
694
- }
695
-
696
- /**
697
- * Checks to see if a parent element contains a child element (including inside
698
- * shadow DOM).
699
- * @param {Node} parent The parent element.
700
- * @param {Node} child The child element.
701
- * @return {boolean} True if the parent node contains the child node.
702
- */
703
- function containsDeep(parent, child) {
704
- var node = child;
705
- while (node) {
706
- if (node == parent) return true;
707
-
708
- node = getParentNode(node);
709
- }
710
- return false;
711
- }
712
-
713
-
714
- /**
715
- * Gets the parent node of an element or its host element if the parent node
716
- * is a shadow root.
717
- * @param {Node} node The node whose parent to get.
718
- * @return {Node|null} The parent node or null if no parent exists.
719
- */
720
- function getParentNode(node) {
721
- var parent = node.parentNode;
722
-
723
- if (parent && parent.nodeType == 11 && parent.host) {
724
- // If the parent is a shadow root, return the host element.
725
- return parent.host;
726
- }
727
-
728
- if (parent && parent.assignedSlot) {
729
- // If the parent is distributed in a <slot>, return the parent of a slot.
730
- return parent.assignedSlot.parentNode;
731
- }
732
-
733
- return parent;
734
- }
735
-
736
-
737
- // Exposes the constructors globally.
738
- window.IntersectionObserver = IntersectionObserver;
739
- window.IntersectionObserverEntry = IntersectionObserverEntry;
740
-
741
- }());
742
- // @see https://github.com/que-etc/resize-observer-polyfill
743
- (function (global, factory) {
744
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
745
- typeof define === 'function' && define.amd ? define(factory) :
746
- (global.ResizeObserver = factory());
747
- }(this, (function () { 'use strict';
748
-
749
- /**
750
- * A collection of shims that provide minimal functionality of the ES6 collections.
751
- *
752
- * These implementations are not meant to be used outside of the ResizeObserver
753
- * modules as they cover only a limited range of use cases.
754
- */
755
- /* eslint-disable require-jsdoc, valid-jsdoc */
756
- var MapShim = (function () {
757
- if (typeof Map !== 'undefined') {
758
- return Map;
759
- }
760
- /**
761
- * Returns index in provided array that matches the specified key.
762
- *
763
- * @param {Array<Array>} arr
764
- * @param {*} key
765
- * @returns {number}
766
- */
767
- function getIndex(arr, key) {
768
- var result = -1;
769
- arr.some(function (entry, index) {
770
- if (entry[0] === key) {
771
- result = index;
772
- return true;
773
- }
774
- return false;
775
- });
776
- return result;
777
- }
778
- return /** @class */ (function () {
779
- function class_1() {
780
- this.__entries__ = [];
781
- }
782
- Object.defineProperty(class_1.prototype, "size", {
783
- /**
784
- * @returns {boolean}
785
- */
786
- get: function () {
787
- return this.__entries__.length;
788
- },
789
- enumerable: true,
790
- configurable: true
791
- });
792
- /**
793
- * @param {*} key
794
- * @returns {*}
795
- */
796
- class_1.prototype.get = function (key) {
797
- var index = getIndex(this.__entries__, key);
798
- var entry = this.__entries__[index];
799
- return entry && entry[1];
800
- };
801
- /**
802
- * @param {*} key
803
- * @param {*} value
804
- * @returns {void}
805
- */
806
- class_1.prototype.set = function (key, value) {
807
- var index = getIndex(this.__entries__, key);
808
- if (~index) {
809
- this.__entries__[index][1] = value;
810
- }
811
- else {
812
- this.__entries__.push([key, value]);
813
- }
814
- };
815
- /**
816
- * @param {*} key
817
- * @returns {void}
818
- */
819
- class_1.prototype.delete = function (key) {
820
- var entries = this.__entries__;
821
- var index = getIndex(entries, key);
822
- if (~index) {
823
- entries.splice(index, 1);
824
- }
825
- };
826
- /**
827
- * @param {*} key
828
- * @returns {void}
829
- */
830
- class_1.prototype.has = function (key) {
831
- return !!~getIndex(this.__entries__, key);
832
- };
833
- /**
834
- * @returns {void}
835
- */
836
- class_1.prototype.clear = function () {
837
- this.__entries__.splice(0);
838
- };
839
- /**
840
- * @param {Function} callback
841
- * @param {*} [ctx=null]
842
- * @returns {void}
843
- */
844
- class_1.prototype.forEach = function (callback, ctx) {
845
- if (ctx === void 0) { ctx = null; }
846
- for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {
847
- var entry = _a[_i];
848
- callback.call(ctx, entry[1], entry[0]);
849
- }
850
- };
851
- return class_1;
852
- }());
853
- })();
854
-
855
- /**
856
- * Detects whether window and document objects are available in current environment.
857
- */
858
- var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;
859
-
860
- // Returns global object of a current environment.
861
- var global$1 = (function () {
862
- if (typeof global !== 'undefined' && global.Math === Math) {
863
- return global;
864
- }
865
- if (typeof self !== 'undefined' && self.Math === Math) {
866
- return self;
867
- }
868
- if (typeof window !== 'undefined' && window.Math === Math) {
869
- return window;
870
- }
871
- // eslint-disable-next-line no-new-func
872
- return Function('return this')();
873
- })();
874
-
875
- /**
876
- * A shim for the requestAnimationFrame which falls back to the setTimeout if
877
- * first one is not supported.
878
- *
879
- * @returns {number} Requests' identifier.
880
- */
881
- var requestAnimationFrame$1 = (function () {
882
- if (typeof requestAnimationFrame === 'function') {
883
- // It's required to use a bounded function because IE sometimes throws
884
- // an "Invalid calling object" error if rAF is invoked without the global
885
- // object on the left hand side.
886
- return requestAnimationFrame.bind(global$1);
887
- }
888
- return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };
889
- })();
890
-
891
- // Defines minimum timeout before adding a trailing call.
892
- var trailingTimeout = 2;
893
- /**
894
- * Creates a wrapper function which ensures that provided callback will be
895
- * invoked only once during the specified delay period.
896
- *
897
- * @param {Function} callback - Function to be invoked after the delay period.
898
- * @param {number} delay - Delay after which to invoke callback.
899
- * @returns {Function}
900
- */
901
- function throttle (callback, delay) {
902
- var leadingCall = false, trailingCall = false, lastCallTime = 0;
903
- /**
904
- * Invokes the original callback function and schedules new invocation if
905
- * the "proxy" was called during current request.
906
- *
907
- * @returns {void}
908
- */
909
- function resolvePending() {
910
- if (leadingCall) {
911
- leadingCall = false;
912
- callback();
913
- }
914
- if (trailingCall) {
915
- proxy();
916
- }
917
- }
918
- /**
919
- * Callback invoked after the specified delay. It will further postpone
920
- * invocation of the original function delegating it to the
921
- * requestAnimationFrame.
922
- *
923
- * @returns {void}
924
- */
925
- function timeoutCallback() {
926
- requestAnimationFrame$1(resolvePending);
927
- }
928
- /**
929
- * Schedules invocation of the original function.
930
- *
931
- * @returns {void}
932
- */
933
- function proxy() {
934
- var timeStamp = Date.now();
935
- if (leadingCall) {
936
- // Reject immediately following calls.
937
- if (timeStamp - lastCallTime < trailingTimeout) {
938
- return;
939
- }
940
- // Schedule new call to be in invoked when the pending one is resolved.
941
- // This is important for "transitions" which never actually start
942
- // immediately so there is a chance that we might miss one if change
943
- // happens amids the pending invocation.
944
- trailingCall = true;
945
- }
946
- else {
947
- leadingCall = true;
948
- trailingCall = false;
949
- setTimeout(timeoutCallback, delay);
950
- }
951
- lastCallTime = timeStamp;
952
- }
953
- return proxy;
954
- }
955
-
956
- // Minimum delay before invoking the update of observers.
957
- var REFRESH_DELAY = 20;
958
- // A list of substrings of CSS properties used to find transition events that
959
- // might affect dimensions of observed elements.
960
- var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];
961
- // Check if MutationObserver is available.
962
- var mutationObserverSupported = typeof MutationObserver !== 'undefined';
963
- /**
964
- * Singleton controller class which handles updates of ResizeObserver instances.
965
- */
966
- var ResizeObserverController = /** @class */ (function () {
967
- /**
968
- * Creates a new instance of ResizeObserverController.
969
- *
970
- * @private
971
- */
972
- function ResizeObserverController() {
973
- /**
974
- * Indicates whether DOM listeners have been added.
975
- *
976
- * @private {boolean}
977
- */
978
- this.connected_ = false;
979
- /**
980
- * Tells that controller has subscribed for Mutation Events.
981
- *
982
- * @private {boolean}
983
- */
984
- this.mutationEventsAdded_ = false;
985
- /**
986
- * Keeps reference to the instance of MutationObserver.
987
- *
988
- * @private {MutationObserver}
989
- */
990
- this.mutationsObserver_ = null;
991
- /**
992
- * A list of connected observers.
993
- *
994
- * @private {Array<ResizeObserverSPI>}
995
- */
996
- this.observers_ = [];
997
- this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
998
- this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
999
- }
1000
- /**
1001
- * Adds observer to observers list.
1002
- *
1003
- * @param {ResizeObserverSPI} observer - Observer to be added.
1004
- * @returns {void}
1005
- */
1006
- ResizeObserverController.prototype.addObserver = function (observer) {
1007
- if (!~this.observers_.indexOf(observer)) {
1008
- this.observers_.push(observer);
1009
- }
1010
- // Add listeners if they haven't been added yet.
1011
- if (!this.connected_) {
1012
- this.connect_();
1013
- }
1014
- };
1015
- /**
1016
- * Removes observer from observers list.
1017
- *
1018
- * @param {ResizeObserverSPI} observer - Observer to be removed.
1019
- * @returns {void}
1020
- */
1021
- ResizeObserverController.prototype.removeObserver = function (observer) {
1022
- var observers = this.observers_;
1023
- var index = observers.indexOf(observer);
1024
- // Remove observer if it's present in registry.
1025
- if (~index) {
1026
- observers.splice(index, 1);
1027
- }
1028
- // Remove listeners if controller has no connected observers.
1029
- if (!observers.length && this.connected_) {
1030
- this.disconnect_();
1031
- }
1032
- };
1033
- /**
1034
- * Invokes the update of observers. It will continue running updates insofar
1035
- * it detects changes.
1036
- *
1037
- * @returns {void}
1038
- */
1039
- ResizeObserverController.prototype.refresh = function () {
1040
- var changesDetected = this.updateObservers_();
1041
- // Continue running updates if changes have been detected as there might
1042
- // be future ones caused by CSS transitions.
1043
- if (changesDetected) {
1044
- this.refresh();
1045
- }
1046
- };
1047
- /**
1048
- * Updates every observer from observers list and notifies them of queued
1049
- * entries.
1050
- *
1051
- * @private
1052
- * @returns {boolean} Returns "true" if any observer has detected changes in
1053
- * dimensions of it's elements.
1054
- */
1055
- ResizeObserverController.prototype.updateObservers_ = function () {
1056
- // Collect observers that have active observations.
1057
- var activeObservers = this.observers_.filter(function (observer) {
1058
- return observer.gatherActive(), observer.hasActive();
1059
- });
1060
- // Deliver notifications in a separate cycle in order to avoid any
1061
- // collisions between observers, e.g. when multiple instances of
1062
- // ResizeObserver are tracking the same element and the callback of one
1063
- // of them changes content dimensions of the observed target. Sometimes
1064
- // this may result in notifications being blocked for the rest of observers.
1065
- activeObservers.forEach(function (observer) { return observer.broadcastActive(); });
1066
- return activeObservers.length > 0;
1067
- };
1068
- /**
1069
- * Initializes DOM listeners.
1070
- *
1071
- * @private
1072
- * @returns {void}
1073
- */
1074
- ResizeObserverController.prototype.connect_ = function () {
1075
- // Do nothing if running in a non-browser environment or if listeners
1076
- // have been already added.
1077
- if (!isBrowser || this.connected_) {
1078
- return;
1079
- }
1080
- // Subscription to the "Transitionend" event is used as a workaround for
1081
- // delayed transitions. This way it's possible to capture at least the
1082
- // final state of an element.
1083
- document.addEventListener('transitionend', this.onTransitionEnd_);
1084
- window.addEventListener('resize', this.refresh);
1085
- if (mutationObserverSupported) {
1086
- this.mutationsObserver_ = new MutationObserver(this.refresh);
1087
- this.mutationsObserver_.observe(document, {
1088
- attributes: true,
1089
- childList: true,
1090
- characterData: true,
1091
- subtree: true
1092
- });
1093
- }
1094
- else {
1095
- document.addEventListener('DOMSubtreeModified', this.refresh);
1096
- this.mutationEventsAdded_ = true;
1097
- }
1098
- this.connected_ = true;
1099
- };
1100
- /**
1101
- * Removes DOM listeners.
1102
- *
1103
- * @private
1104
- * @returns {void}
1105
- */
1106
- ResizeObserverController.prototype.disconnect_ = function () {
1107
- // Do nothing if running in a non-browser environment or if listeners
1108
- // have been already removed.
1109
- if (!isBrowser || !this.connected_) {
1110
- return;
1111
- }
1112
- document.removeEventListener('transitionend', this.onTransitionEnd_);
1113
- window.removeEventListener('resize', this.refresh);
1114
- if (this.mutationsObserver_) {
1115
- this.mutationsObserver_.disconnect();
1116
- }
1117
- if (this.mutationEventsAdded_) {
1118
- document.removeEventListener('DOMSubtreeModified', this.refresh);
1119
- }
1120
- this.mutationsObserver_ = null;
1121
- this.mutationEventsAdded_ = false;
1122
- this.connected_ = false;
1123
- };
1124
- /**
1125
- * "Transitionend" event handler.
1126
- *
1127
- * @private
1128
- * @param {TransitionEvent} event
1129
- * @returns {void}
1130
- */
1131
- ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {
1132
- var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;
1133
- // Detect whether transition may affect dimensions of an element.
1134
- var isReflowProperty = transitionKeys.some(function (key) {
1135
- return !!~propertyName.indexOf(key);
1136
- });
1137
- if (isReflowProperty) {
1138
- this.refresh();
1139
- }
1140
- };
1141
- /**
1142
- * Returns instance of the ResizeObserverController.
1143
- *
1144
- * @returns {ResizeObserverController}
1145
- */
1146
- ResizeObserverController.getInstance = function () {
1147
- if (!this.instance_) {
1148
- this.instance_ = new ResizeObserverController();
1149
- }
1150
- return this.instance_;
1151
- };
1152
- /**
1153
- * Holds reference to the controller's instance.
1154
- *
1155
- * @private {ResizeObserverController}
1156
- */
1157
- ResizeObserverController.instance_ = null;
1158
- return ResizeObserverController;
1159
- }());
1160
-
1161
- /**
1162
- * Defines non-writable/enumerable properties of the provided target object.
1163
- *
1164
- * @param {Object} target - Object for which to define properties.
1165
- * @param {Object} props - Properties to be defined.
1166
- * @returns {Object} Target object.
1167
- */
1168
- var defineConfigurable = (function (target, props) {
1169
- for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
1170
- var key = _a[_i];
1171
- Object.defineProperty(target, key, {
1172
- value: props[key],
1173
- enumerable: false,
1174
- writable: false,
1175
- configurable: true
1176
- });
1177
- }
1178
- return target;
1179
- });
1180
-
1181
- /**
1182
- * Returns the global object associated with provided element.
1183
- *
1184
- * @param {Object} target
1185
- * @returns {Object}
1186
- */
1187
- var getWindowOf = (function (target) {
1188
- // Assume that the element is an instance of Node, which means that it
1189
- // has the "ownerDocument" property from which we can retrieve a
1190
- // corresponding global object.
1191
- var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
1192
- // Return the local global object if it's not possible extract one from
1193
- // provided element.
1194
- return ownerGlobal || global$1;
1195
- });
1196
-
1197
- // Placeholder of an empty content rectangle.
1198
- var emptyRect = createRectInit(0, 0, 0, 0);
1199
- /**
1200
- * Converts provided string to a number.
1201
- *
1202
- * @param {number|string} value
1203
- * @returns {number}
1204
- */
1205
- function toFloat(value) {
1206
- return parseFloat(value) || 0;
1207
- }
1208
- /**
1209
- * Extracts borders size from provided styles.
1210
- *
1211
- * @param {CSSStyleDeclaration} styles
1212
- * @param {...string} positions - Borders positions (top, right, ...)
1213
- * @returns {number}
1214
- */
1215
- function getBordersSize(styles) {
1216
- var positions = [];
1217
- for (var _i = 1; _i < arguments.length; _i++) {
1218
- positions[_i - 1] = arguments[_i];
1219
- }
1220
- return positions.reduce(function (size, position) {
1221
- var value = styles['border-' + position + '-width'];
1222
- return size + toFloat(value);
1223
- }, 0);
1224
- }
1225
- /**
1226
- * Extracts paddings sizes from provided styles.
1227
- *
1228
- * @param {CSSStyleDeclaration} styles
1229
- * @returns {Object} Paddings box.
1230
- */
1231
- function getPaddings(styles) {
1232
- var positions = ['top', 'right', 'bottom', 'left'];
1233
- var paddings = {};
1234
- for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
1235
- var position = positions_1[_i];
1236
- var value = styles['padding-' + position];
1237
- paddings[position] = toFloat(value);
1238
- }
1239
- return paddings;
1240
- }
1241
- /**
1242
- * Calculates content rectangle of provided SVG element.
1243
- *
1244
- * @param {SVGGraphicsElement} target - Element content rectangle of which needs
1245
- * to be calculated.
1246
- * @returns {DOMRectInit}
1247
- */
1248
- function getSVGContentRect(target) {
1249
- var bbox = target.getBBox();
1250
- return createRectInit(0, 0, bbox.width, bbox.height);
1251
- }
1252
- /**
1253
- * Calculates content rectangle of provided HTMLElement.
1254
- *
1255
- * @param {HTMLElement} target - Element for which to calculate the content rectangle.
1256
- * @returns {DOMRectInit}
1257
- */
1258
- function getHTMLElementContentRect(target) {
1259
- // Client width & height properties can't be
1260
- // used exclusively as they provide rounded values.
1261
- var clientWidth = target.clientWidth, clientHeight = target.clientHeight;
1262
- // By this condition we can catch all non-replaced inline, hidden and
1263
- // detached elements. Though elements with width & height properties less
1264
- // than 0.5 will be discarded as well.
1265
- //
1266
- // Without it we would need to implement separate methods for each of
1267
- // those cases and it's not possible to perform a precise and performance
1268
- // effective test for hidden elements. E.g. even jQuery's ':visible' filter
1269
- // gives wrong results for elements with width & height less than 0.5.
1270
- if (!clientWidth && !clientHeight) {
1271
- return emptyRect;
1272
- }
1273
- var styles = getWindowOf(target).getComputedStyle(target);
1274
- var paddings = getPaddings(styles);
1275
- var horizPad = paddings.left + paddings.right;
1276
- var vertPad = paddings.top + paddings.bottom;
1277
- // Computed styles of width & height are being used because they are the
1278
- // only dimensions available to JS that contain non-rounded values. It could
1279
- // be possible to utilize the getBoundingClientRect if only it's data wasn't
1280
- // affected by CSS transformations let alone paddings, borders and scroll bars.
1281
- var width = toFloat(styles.width), height = toFloat(styles.height);
1282
- // Width & height include paddings and borders when the 'border-box' box
1283
- // model is applied (except for IE).
1284
- if (styles.boxSizing === 'border-box') {
1285
- // Following conditions are required to handle Internet Explorer which
1286
- // doesn't include paddings and borders to computed CSS dimensions.
1287
- //
1288
- // We can say that if CSS dimensions + paddings are equal to the "client"
1289
- // properties then it's either IE, and thus we don't need to subtract
1290
- // anything, or an element merely doesn't have paddings/borders styles.
1291
- if (Math.round(width + horizPad) !== clientWidth) {
1292
- width -= getBordersSize(styles, 'left', 'right') + horizPad;
1293
- }
1294
- if (Math.round(height + vertPad) !== clientHeight) {
1295
- height -= getBordersSize(styles, 'top', 'bottom') + vertPad;
1296
- }
1297
- }
1298
- // Following steps can't be applied to the document's root element as its
1299
- // client[Width/Height] properties represent viewport area of the window.
1300
- // Besides, it's as well not necessary as the <html> itself neither has
1301
- // rendered scroll bars nor it can be clipped.
1302
- if (!isDocumentElement(target)) {
1303
- // In some browsers (only in Firefox, actually) CSS width & height
1304
- // include scroll bars size which can be removed at this step as scroll
1305
- // bars are the only difference between rounded dimensions + paddings
1306
- // and "client" properties, though that is not always true in Chrome.
1307
- var vertScrollbar = Math.round(width + horizPad) - clientWidth;
1308
- var horizScrollbar = Math.round(height + vertPad) - clientHeight;
1309
- // Chrome has a rather weird rounding of "client" properties.
1310
- // E.g. for an element with content width of 314.2px it sometimes gives
1311
- // the client width of 315px and for the width of 314.7px it may give
1312
- // 314px. And it doesn't happen all the time. So just ignore this delta
1313
- // as a non-relevant.
1314
- if (Math.abs(vertScrollbar) !== 1) {
1315
- width -= vertScrollbar;
1316
- }
1317
- if (Math.abs(horizScrollbar) !== 1) {
1318
- height -= horizScrollbar;
1319
- }
1320
- }
1321
- return createRectInit(paddings.left, paddings.top, width, height);
1322
- }
1323
- /**
1324
- * Checks whether provided element is an instance of the SVGGraphicsElement.
1325
- *
1326
- * @param {Element} target - Element to be checked.
1327
- * @returns {boolean}
1328
- */
1329
- var isSVGGraphicsElement = (function () {
1330
- // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement
1331
- // interface.
1332
- if (typeof SVGGraphicsElement !== 'undefined') {
1333
- return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };
1334
- }
1335
- // If it's so, then check that element is at least an instance of the
1336
- // SVGElement and that it has the "getBBox" method.
1337
- // eslint-disable-next-line no-extra-parens
1338
- return function (target) { return (target instanceof getWindowOf(target).SVGElement &&
1339
- typeof target.getBBox === 'function'); };
1340
- })();
1341
- /**
1342
- * Checks whether provided element is a document element (<html>).
1343
- *
1344
- * @param {Element} target - Element to be checked.
1345
- * @returns {boolean}
1346
- */
1347
- function isDocumentElement(target) {
1348
- return target === getWindowOf(target).document.documentElement;
1349
- }
1350
- /**
1351
- * Calculates an appropriate content rectangle for provided html or svg element.
1352
- *
1353
- * @param {Element} target - Element content rectangle of which needs to be calculated.
1354
- * @returns {DOMRectInit}
1355
- */
1356
- function getContentRect(target) {
1357
- if (!isBrowser) {
1358
- return emptyRect;
1359
- }
1360
- if (isSVGGraphicsElement(target)) {
1361
- return getSVGContentRect(target);
1362
- }
1363
- return getHTMLElementContentRect(target);
1364
- }
1365
- /**
1366
- * Creates rectangle with an interface of the DOMRectReadOnly.
1367
- * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly
1368
- *
1369
- * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.
1370
- * @returns {DOMRectReadOnly}
1371
- */
1372
- function createReadOnlyRect(_a) {
1373
- var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
1374
- // If DOMRectReadOnly is available use it as a prototype for the rectangle.
1375
- var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;
1376
- var rect = Object.create(Constr.prototype);
1377
- // Rectangle's properties are not writable and non-enumerable.
1378
- defineConfigurable(rect, {
1379
- x: x, y: y, width: width, height: height,
1380
- top: y,
1381
- right: x + width,
1382
- bottom: height + y,
1383
- left: x
1384
- });
1385
- return rect;
1386
- }
1387
- /**
1388
- * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.
1389
- * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit
1390
- *
1391
- * @param {number} x - X coordinate.
1392
- * @param {number} y - Y coordinate.
1393
- * @param {number} width - Rectangle's width.
1394
- * @param {number} height - Rectangle's height.
1395
- * @returns {DOMRectInit}
1396
- */
1397
- function createRectInit(x, y, width, height) {
1398
- return { x: x, y: y, width: width, height: height };
1399
- }
1400
-
1401
- /**
1402
- * Class that is responsible for computations of the content rectangle of
1403
- * provided DOM element and for keeping track of it's changes.
1404
- */
1405
- var ResizeObservation = /** @class */ (function () {
1406
- /**
1407
- * Creates an instance of ResizeObservation.
1408
- *
1409
- * @param {Element} target - Element to be observed.
1410
- */
1411
- function ResizeObservation(target) {
1412
- /**
1413
- * Broadcasted width of content rectangle.
1414
- *
1415
- * @type {number}
1416
- */
1417
- this.broadcastWidth = 0;
1418
- /**
1419
- * Broadcasted height of content rectangle.
1420
- *
1421
- * @type {number}
1422
- */
1423
- this.broadcastHeight = 0;
1424
- /**
1425
- * Reference to the last observed content rectangle.
1426
- *
1427
- * @private {DOMRectInit}
1428
- */
1429
- this.contentRect_ = createRectInit(0, 0, 0, 0);
1430
- this.target = target;
1431
- }
1432
- /**
1433
- * Updates content rectangle and tells whether it's width or height properties
1434
- * have changed since the last broadcast.
1435
- *
1436
- * @returns {boolean}
1437
- */
1438
- ResizeObservation.prototype.isActive = function () {
1439
- var rect = getContentRect(this.target);
1440
- this.contentRect_ = rect;
1441
- return (rect.width !== this.broadcastWidth ||
1442
- rect.height !== this.broadcastHeight);
1443
- };
1444
- /**
1445
- * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data
1446
- * from the corresponding properties of the last observed content rectangle.
1447
- *
1448
- * @returns {DOMRectInit} Last observed content rectangle.
1449
- */
1450
- ResizeObservation.prototype.broadcastRect = function () {
1451
- var rect = this.contentRect_;
1452
- this.broadcastWidth = rect.width;
1453
- this.broadcastHeight = rect.height;
1454
- return rect;
1455
- };
1456
- return ResizeObservation;
1457
- }());
1458
-
1459
- var ResizeObserverEntry = /** @class */ (function () {
1460
- /**
1461
- * Creates an instance of ResizeObserverEntry.
1462
- *
1463
- * @param {Element} target - Element that is being observed.
1464
- * @param {DOMRectInit} rectInit - Data of the element's content rectangle.
1465
- */
1466
- function ResizeObserverEntry(target, rectInit) {
1467
- var contentRect = createReadOnlyRect(rectInit);
1468
- // According to the specification following properties are not writable
1469
- // and are also not enumerable in the native implementation.
1470
- //
1471
- // Property accessors are not being used as they'd require to define a
1472
- // private WeakMap storage which may cause memory leaks in browsers that
1473
- // don't support this type of collections.
1474
- defineConfigurable(this, { target: target, contentRect: contentRect });
1475
- }
1476
- return ResizeObserverEntry;
1477
- }());
1478
-
1479
- var ResizeObserverSPI = /** @class */ (function () {
1480
- /**
1481
- * Creates a new instance of ResizeObserver.
1482
- *
1483
- * @param {ResizeObserverCallback} callback - Callback function that is invoked
1484
- * when one of the observed elements changes it's content dimensions.
1485
- * @param {ResizeObserverController} controller - Controller instance which
1486
- * is responsible for the updates of observer.
1487
- * @param {ResizeObserver} callbackCtx - Reference to the public
1488
- * ResizeObserver instance which will be passed to callback function.
1489
- */
1490
- function ResizeObserverSPI(callback, controller, callbackCtx) {
1491
- /**
1492
- * Collection of resize observations that have detected changes in dimensions
1493
- * of elements.
1494
- *
1495
- * @private {Array<ResizeObservation>}
1496
- */
1497
- this.activeObservations_ = [];
1498
- /**
1499
- * Registry of the ResizeObservation instances.
1500
- *
1501
- * @private {Map<Element, ResizeObservation>}
1502
- */
1503
- this.observations_ = new MapShim();
1504
- if (typeof callback !== 'function') {
1505
- throw new TypeError('The callback provided as parameter 1 is not a function.');
1506
- }
1507
- this.callback_ = callback;
1508
- this.controller_ = controller;
1509
- this.callbackCtx_ = callbackCtx;
1510
- }
1511
- /**
1512
- * Starts observing provided element.
1513
- *
1514
- * @param {Element} target - Element to be observed.
1515
- * @returns {void}
1516
- */
1517
- ResizeObserverSPI.prototype.observe = function (target) {
1518
- if (!arguments.length) {
1519
- throw new TypeError('1 argument required, but only 0 present.');
1520
- }
1521
- // Do nothing if current environment doesn't have the Element interface.
1522
- if (typeof Element === 'undefined' || !(Element instanceof Object)) {
1523
- return;
1524
- }
1525
- if (!(target instanceof getWindowOf(target).Element)) {
1526
- throw new TypeError('parameter 1 is not of type "Element".');
1527
- }
1528
- var observations = this.observations_;
1529
- // Do nothing if element is already being observed.
1530
- if (observations.has(target)) {
1531
- return;
1532
- }
1533
- observations.set(target, new ResizeObservation(target));
1534
- this.controller_.addObserver(this);
1535
- // Force the update of observations.
1536
- this.controller_.refresh();
1537
- };
1538
- /**
1539
- * Stops observing provided element.
1540
- *
1541
- * @param {Element} target - Element to stop observing.
1542
- * @returns {void}
1543
- */
1544
- ResizeObserverSPI.prototype.unobserve = function (target) {
1545
- if (!arguments.length) {
1546
- throw new TypeError('1 argument required, but only 0 present.');
1547
- }
1548
- // Do nothing if current environment doesn't have the Element interface.
1549
- if (typeof Element === 'undefined' || !(Element instanceof Object)) {
1550
- return;
1551
- }
1552
- if (!(target instanceof getWindowOf(target).Element)) {
1553
- throw new TypeError('parameter 1 is not of type "Element".');
1554
- }
1555
- var observations = this.observations_;
1556
- // Do nothing if element is not being observed.
1557
- if (!observations.has(target)) {
1558
- return;
1559
- }
1560
- observations.delete(target);
1561
- if (!observations.size) {
1562
- this.controller_.removeObserver(this);
1563
- }
1564
- };
1565
- /**
1566
- * Stops observing all elements.
1567
- *
1568
- * @returns {void}
1569
- */
1570
- ResizeObserverSPI.prototype.disconnect = function () {
1571
- this.clearActive();
1572
- this.observations_.clear();
1573
- this.controller_.removeObserver(this);
1574
- };
1575
- /**
1576
- * Collects observation instances the associated element of which has changed
1577
- * it's content rectangle.
1578
- *
1579
- * @returns {void}
1580
- */
1581
- ResizeObserverSPI.prototype.gatherActive = function () {
1582
- var _this = this;
1583
- this.clearActive();
1584
- this.observations_.forEach(function (observation) {
1585
- if (observation.isActive()) {
1586
- _this.activeObservations_.push(observation);
1587
- }
1588
- });
1589
- };
1590
- /**
1591
- * Invokes initial callback function with a list of ResizeObserverEntry
1592
- * instances collected from active resize observations.
1593
- *
1594
- * @returns {void}
1595
- */
1596
- ResizeObserverSPI.prototype.broadcastActive = function () {
1597
- // Do nothing if observer doesn't have active observations.
1598
- if (!this.hasActive()) {
1599
- return;
1600
- }
1601
- var ctx = this.callbackCtx_;
1602
- // Create ResizeObserverEntry instance for every active observation.
1603
- var entries = this.activeObservations_.map(function (observation) {
1604
- return new ResizeObserverEntry(observation.target, observation.broadcastRect());
1605
- });
1606
- this.callback_.call(ctx, entries, ctx);
1607
- this.clearActive();
1608
- };
1609
- /**
1610
- * Clears the collection of active observations.
1611
- *
1612
- * @returns {void}
1613
- */
1614
- ResizeObserverSPI.prototype.clearActive = function () {
1615
- this.activeObservations_.splice(0);
1616
- };
1617
- /**
1618
- * Tells whether observer has active observations.
1619
- *
1620
- * @returns {boolean}
1621
- */
1622
- ResizeObserverSPI.prototype.hasActive = function () {
1623
- return this.activeObservations_.length > 0;
1624
- };
1625
- return ResizeObserverSPI;
1626
- }());
1627
-
1628
- // Registry of internal observers. If WeakMap is not available use current shim
1629
- // for the Map collection as it has all required methods and because WeakMap
1630
- // can't be fully polyfilled anyway.
1631
- var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();
1632
- /**
1633
- * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
1634
- * exposing only those methods and properties that are defined in the spec.
1635
- */
1636
- var ResizeObserver = /** @class */ (function () {
1637
- /**
1638
- * Creates a new instance of ResizeObserver.
1639
- *
1640
- * @param {ResizeObserverCallback} callback - Callback that is invoked when
1641
- * dimensions of the observed elements change.
1642
- */
1643
- function ResizeObserver(callback) {
1644
- if (!(this instanceof ResizeObserver)) {
1645
- throw new TypeError('Cannot call a class as a function.');
1646
- }
1647
- if (!arguments.length) {
1648
- throw new TypeError('1 argument required, but only 0 present.');
1649
- }
1650
- var controller = ResizeObserverController.getInstance();
1651
- var observer = new ResizeObserverSPI(callback, controller, this);
1652
- observers.set(this, observer);
1653
- }
1654
- return ResizeObserver;
1655
- }());
1656
- // Expose public methods of ResizeObserver.
1657
- [
1658
- 'observe',
1659
- 'unobserve',
1660
- 'disconnect'
1661
- ].forEach(function (method) {
1662
- ResizeObserver.prototype[method] = function () {
1663
- var _a;
1664
- return (_a = observers.get(this))[method].apply(_a, arguments);
1665
- };
1666
- });
1667
-
1668
- var index = (function () {
1669
- // Export existing implementation if available.
1670
- if (typeof global$1.ResizeObserver !== 'undefined') {
1671
- return global$1.ResizeObserver;
1672
- }
1673
- return ResizeObserver;
1674
- })();
1675
-
1676
- return index;
1677
-
1678
- })));
1679
- (function($, _){
1680
-
1681
- /**
1682
- * @summary A reference to the jQuery object the plugin is registered with.
1683
- * @memberof FooGallery
1684
- * @function $
1685
- * @type {jQuery}
1686
- * @description This is used internally for all jQuery operations to help work around issues where multiple jQuery libraries have been included in a single page.
1687
- * @example {@caption The following shows the issue when multiple jQuery's are included in a single page.}{@lang xml}
1688
- * <script src="jquery-1.12.4.js"></script>
1689
- * <script src="foogallery.js"></script>
1690
- * <script src="jquery-2.2.4.js"></script>
1691
- * <script>
1692
- * jQuery(function($){
1693
- * $(".selector").foogallery(); // => This would throw a TypeError: $(...).foogallery is not a function
1694
- * });
1695
- * </script>
1696
- * @example {@caption The reason the above throws an error is that the `$.fn.foogallery` function is registered to the first instance of jQuery in the page however the instance used to create the ready callback and actually try to execute `$(...).foogallery()` is the second. To resolve this issue ideally you would remove the second instance of jQuery however you can use the `FooGallery.$` member to ensure you are always working with the instance of jQuery the plugin was registered with.}{@lang xml}
1697
- * <script src="jquery-1.12.4.js"></script>
1698
- * <script src="foogallery.js"></script>
1699
- * <script src="jquery-2.2.4.js"></script>
1700
- * <script>
1701
- * FooGallery.$(function($){
1702
- * $(".selector").foogallery(); // => It works!
1703
- * });
1704
- * </script>
1705
- */
1706
- _.$ = $;
1707
-
1708
- /**
1709
- * @summary The jQuery plugin namespace.
1710
- * @external "jQuery.fn"
1711
- * @see {@link http://learn.jquery.com/plugins/basic-plugin-creation/|How to Create a Basic Plugin | jQuery Learning Center}
1712
- */
1713
-
1714
- })(
1715
- // dependencies
1716
- jQuery,
1717
- /**
1718
- * @summary The core namespace for the plugin containing all its code.
1719
- * @namespace FooGallery
1720
- * @description This plugin houses all it's code within a single `FooGallery` global variable to prevent polluting the global namespace and to make accessing its various members simpler.
1721
- * @example {@caption As this namespace is registered as a global on the `window` object, it can be accessed using the `window.` prefix.}
1722
- * var fg = window.FooGallery;
1723
- * @example {@caption Or without it.}
1724
- * var fg = FooGallery;
1725
- * @example {@caption When using this namespace I would recommend aliasing it to a short variable name such as `fg` or as used internally `_`.}
1726
- * // alias the FooGallery namespace
1727
- * var _ = FooGallery;
1728
- * @example {@caption This is not required but lets us write less code and allows the alias to be minified by compressors like UglifyJS. How you choose to alias the namespace is up to you. You can use the simple `var` method as seen above or supply the namespace as a parameter when creating a new scope as seen below.}
1729
- * // create a new scope to work in passing the namespace as a parameter
1730
- * (function(_){
1731
- *
1732
- * // use `_.` to access members and methods
1733
- *
1734
- * })(FooGallery);
1735
- */
1736
- window.FooGallery = window.FooGallery || {}
1737
- );
1738
- "use strict";
1739
-
1740
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
1741
-
1742
- /*!
1743
- * FooGallery.utils - Contains common utility methods and classes used in our plugins.
1744
- * @version 1.0.0
1745
- * @link https://github.com/steveush/foo-utils#readme
1746
- * @copyright Steve Usher 2021
1747
- * @license Released under the GPL-3.0 license.
1748
- */
1749
-
1750
- /**
1751
- * @file This creates the global FooGallery.utils namespace
1752
- */
1753
- (function ($) {
1754
- if (!$) {
1755
- console.warn('jQuery must be included in the page prior to the FooGallery.utils library.');
1756
- return;
1757
- }
1758
-
1759
- function __exists() {
1760
- try {
1761
- return !!window.FooGallery.utils; // does the namespace already exist?
1762
- } catch (err) {
1763
- return false;
1764
- }
1765
- }
1766
-
1767
- if (!__exists()) {
1768
- /**
1769
- * @summary This namespace contains common utility methods and code shared between our plugins.
1770
- * @global
1771
- * @namespace FooGallery.utils
1772
- * @description This namespace relies on jQuery being included in the page prior to it being loaded.
1773
- */
1774
- window.FooGallery.utils = {
1775
- /**
1776
- * @summary A reference to the jQuery object the library is registered with.
1777
- * @memberof FooGallery.utils.
1778
- * @name $
1779
- * @type {jQuery}
1780
- * @description This is used internally for all jQuery operations to help work around issues where multiple jQuery libraries have been included in a single page.
1781
- * @example {@caption The following shows the issue when multiple jQuery's are included in a single page.}{@lang html}
1782
- * <script src="jquery-1.12.4.js"></script>
1783
- * <script src="my-plugin.js"></script>
1784
- * <script src="jquery-2.2.4.js"></script>
1785
- * <script>
1786
- * jQuery(function($){
1787
- * $(".selector").myPlugin(); // => This would throw a TypeError: $(...).myPlugin is not a function
1788
- * });
1789
- * </script>
1790
- * @example {@caption The reason the above throws an error is that the `$.fn.myPlugin` function is registered to the first instance of jQuery in the page however the instance used to create the ready callback and actually try to execute `$(...).myPlugin()` is the second. To resolve this issue ideally you would remove the second instance of jQuery however you can use the `FooGallery.utils.$` member to ensure you are always working with the instance of jQuery the library was registered with.}{@lang html}
1791
- * <script src="jquery-1.12.4.js"></script>
1792
- * <script src="my-plugin.js"></script>
1793
- * <script src="jquery-2.2.4.js"></script>
1794
- * <script>
1795
- * FooGallery.utils.$(function($){
1796
- * $(".selector").myPlugin(); // => It works!
1797
- * });
1798
- * </script>
1799
- */
1800
- $: $,
1801
-
1802
- /**
1803
- * @summary The version of this library.
1804
- * @memberof FooGallery.utils.
1805
- * @name version
1806
- * @type {string}
1807
- */
1808
- version: '1.0.0'
1809
- };
1810
- } // at this point there will always be a FooGallery.utils namespace registered to the global scope.
1811
-
1812
- })(jQuery);
1813
-
1814
- (function ($, _) {
1815
- // only register methods if this version is the current version
1816
- if (_.version !== '1.0.0') return;
1817
- /**
1818
- * @summary Contains common type checking utility methods.
1819
- * @memberof FooGallery.utils.
1820
- * @namespace is
1821
- */
1822
-
1823
- _.is = {};
1824
- /**
1825
- * @summary Checks if the `value` is an array.
1826
- * @memberof FooGallery.utils.is.
1827
- * @function array
1828
- * @param {*} value - The value to check.
1829
- * @returns {boolean} `true` if the supplied `value` is an array.
1830
- * @example {@run true}
1831
- * // alias the FooGallery.utils.is namespace
1832
- * var _is = FooGallery.utils.is;
1833
- *
1834
- * console.log( _is.array( [] ) ); // => true
1835
- * console.log( _is.array( null ) ); // => false
1836
- * console.log( _is.array( 123 ) ); // => false
1837
- * console.log( _is.array( "" ) ); // => false
1838
- */
1839
-
1840
- _.is.array = function (value) {
1841
- return '[object Array]' === Object.prototype.toString.call(value);
1842
- };
1843
- /**
1844
- * @summary Checks if the `value` is a boolean.
1845
- * @memberof FooGallery.utils.is.
1846
- * @function boolean
1847
- * @param {*} value - The value to check.
1848
- * @returns {boolean} `true` if the supplied `value` is a boolean.
1849
- * @example {@run true}
1850
- * // alias the FooGallery.utils.is namespace
1851
- * var _is = FooGallery.utils.is;
1852
- *
1853
- * console.log( _is.boolean( true ) ); // => true
1854
- * console.log( _is.boolean( false ) ); // => true
1855
- * console.log( _is.boolean( "true" ) ); // => false
1856
- * console.log( _is.boolean( "false" ) ); // => false
1857
- * console.log( _is.boolean( 1 ) ); // => false
1858
- * console.log( _is.boolean( 0 ) ); // => false
1859
- */
1860
-
1861
-
1862
- _.is.boolean = function (value) {
1863
- return '[object Boolean]' === Object.prototype.toString.call(value);
1864
- };
1865
- /**
1866
- * @summary Checks if the `value` is an element.
1867
- * @memberof FooGallery.utils.is.
1868
- * @function element
1869
- * @param {*} value - The value to check.
1870
- * @returns {boolean} `true` if the supplied `value` is an element.
1871
- * @example {@run true}
1872
- * // alias the FooGallery.utils.is namespace
1873
- * var _is = FooGallery.utils.is,
1874
- * // create an element to test
1875
- * el = document.createElement("span");
1876
- *
1877
- * console.log( _is.element( el ) ); // => true
1878
- * console.log( _is.element( $(el) ) ); // => false
1879
- * console.log( _is.element( null ) ); // => false
1880
- * console.log( _is.element( {} ) ); // => false
1881
- */
1882
-
1883
-
1884
- _.is.element = function (value) {
1885
- return (typeof HTMLElement === "undefined" ? "undefined" : _typeof(HTMLElement)) === 'object' ? value instanceof HTMLElement : !!value && _typeof(value) === 'object' && value.nodeType === 1 && typeof value.nodeName === 'string';
1886
- };
1887
- /**
1888
- * @summary Checks if the `value` is empty.
1889
- * @memberof FooGallery.utils.is.
1890
- * @function empty
1891
- * @param {*} value - The value to check.
1892
- * @returns {boolean} `true` if the supplied `value` is empty.
1893
- * @description The following values are considered to be empty by this method:
1894
- *
1895
- * <ul><!--
1896
- * --><li>`""` - An empty string</li><!--
1897
- * --><li>`0` - 0 as an integer</li><!--
1898
- * --><li>`0.0` - 0 as a float</li><!--
1899
- * --><li>`[]` - An empty array</li><!--
1900
- * --><li>`{}` - An empty object</li><!--
1901
- * --><li>`$()` - An empty jQuery object</li><!--
1902
- * --><li>`false`</li><!--
1903
- * --><li>`null`</li><!--
1904
- * --><li>`undefined`</li><!--
1905
- * --></ul>
1906
- * @example {@run true}
1907
- * // alias the FooGallery.utils.is namespace
1908
- * var _is = FooGallery.utils.is;
1909
- *
1910
- * console.log( _is.empty( undefined ) ); // => true
1911
- * console.log( _is.empty( null ) ); // => true
1912
- * console.log( _is.empty( 0 ) ); // => true
1913
- * console.log( _is.empty( 0.0 ) ); // => true
1914
- * console.log( _is.empty( "" ) ); // => true
1915
- * console.log( _is.empty( [] ) ); // => true
1916
- * console.log( _is.empty( {} ) ); // => true
1917
- * console.log( _is.empty( 1 ) ); // => false
1918
- * console.log( _is.empty( 0.1 ) ); // => false
1919
- * console.log( _is.empty( "one" ) ); // => false
1920
- * console.log( _is.empty( ["one"] ) ); // => false
1921
- * console.log( _is.empty( { "name": "My Object" } ) ); // => false
1922
- */
1923
-
1924
-
1925
- _.is.empty = function (value) {
1926
- if (_.is.undef(value) || value === null) return true;
1927
- if (_.is.number(value) && value === 0) return true;
1928
- if (_.is.boolean(value) && value === false) return true;
1929
- if (_.is.string(value) && value.length === 0) return true;
1930
- if (_.is.array(value) && value.length === 0) return true;
1931
- if (_.is.jq(value) && value.length === 0) return true;
1932
-
1933
- if (_.is.hash(value)) {
1934
- for (var prop in value) {
1935
- if (value.hasOwnProperty(prop)) return false;
1936
- }
1937
-
1938
- return true;
1939
- }
1940
-
1941
- return false;
1942
- };
1943
- /**
1944
- * @summary Checks if the `value` is an error.
1945
- * @memberof FooGallery.utils.is.
1946
- * @function error
1947
- * @param {*} value - The value to check.
1948
- * @returns {boolean} `true` if the supplied `value` is an error.
1949
- * @example {@run true}
1950
- * // alias the FooGallery.utils.is namespace
1951
- * var _is = FooGallery.utils.is,
1952
- * // create some errors to test
1953
- * err1 = new Error("err1"),
1954
- * err2 = new SyntaxError("err2");
1955
- *
1956
- * console.log( _is.error( err1 ) ); // => true
1957
- * console.log( _is.error( err2 ) ); // => true
1958
- * console.log( _is.error( null ) ); // => false
1959
- * console.log( _is.error( 123 ) ); // => false
1960
- * console.log( _is.error( "" ) ); // => false
1961
- * console.log( _is.error( {} ) ); // => false
1962
- * console.log( _is.error( [] ) ); // => false
1963
- */
1964
-
1965
-
1966
- _.is.error = function (value) {
1967
- return '[object Error]' === Object.prototype.toString.call(value);
1968
- };
1969
- /**
1970
- * @summary Checks if the `value` is a function.
1971
- * @memberof FooGallery.utils.is.
1972
- * @function fn
1973
- * @param {*} value - The value to check.
1974
- * @returns {boolean} `true` if the supplied `value` is a function.
1975
- * @example {@run true}
1976
- * // alias the FooGallery.utils.is namespace
1977
- * var _is = FooGallery.utils.is,
1978
- * // create a function to test
1979
- * func = function(){};
1980
- *
1981
- * console.log( _is.fn( func ) ); // => true
1982
- * console.log( _is.fn( null ) ); // => false
1983
- * console.log( _is.fn( 123 ) ); // => false
1984
- * console.log( _is.fn( "" ) ); // => false
1985
- */
1986
-
1987
-
1988
- _.is.fn = function (value) {
1989
- return value === window.alert || '[object Function]' === Object.prototype.toString.call(value);
1990
- };
1991
- /**
1992
- * @summary Checks if the `value` is a hash.
1993
- * @memberof FooGallery.utils.is.
1994
- * @function hash
1995
- * @param {*} value - The value to check.
1996
- * @returns {boolean} `true` if the supplied `value` is a hash.
1997
- * @example {@run true}
1998
- * // alias the FooGallery.utils.is namespace
1999
- * var _is = FooGallery.utils.is;
2000
- *
2001
- * console.log( _is.hash( {"some": "prop"} ) ); // => true
2002
- * console.log( _is.hash( {} ) ); // => true
2003
- * console.log( _is.hash( window ) ); // => false
2004
- * console.log( _is.hash( document ) ); // => false
2005
- * console.log( _is.hash( "" ) ); // => false
2006
- * console.log( _is.hash( 123 ) ); // => false
2007
- */
2008
-
2009
-
2010
- _.is.hash = function (value) {
2011
- return _.is.object(value) && value.constructor === Object && !value.nodeType && !value.setInterval;
2012
- };
2013
- /**
2014
- * @summary Checks if the `value` is a jQuery object.
2015
- * @memberof FooGallery.utils.is.
2016
- * @function jq
2017
- * @param {*} value - The value to check.
2018
- * @returns {boolean} `true` if the supplied `value` is a jQuery object.
2019
- * @example {@run true}
2020
- * // alias the FooGallery.utils.is namespace
2021
- * var _is = FooGallery.utils.is,
2022
- * // create an element to test
2023
- * el = document.createElement("span");
2024
- *
2025
- * console.log( _is.jq( $(el) ) ); // => true
2026
- * console.log( _is.jq( $() ) ); // => true
2027
- * console.log( _is.jq( el ) ); // => false
2028
- * console.log( _is.jq( {} ) ); // => false
2029
- * console.log( _is.jq( null ) ); // => false
2030
- * console.log( _is.jq( 123 ) ); // => false
2031
- * console.log( _is.jq( "" ) ); // => false
2032
- */
2033
-
2034
-
2035
- _.is.jq = function (value) {
2036
- return !_.is.undef($) && value instanceof $;
2037
- };
2038
- /**
2039
- * @summary Checks if the `value` is a number.
2040
- * @memberof FooGallery.utils.is.
2041
- * @function number
2042
- * @param {*} value - The value to check.
2043
- * @returns {boolean}
2044
- * @example {@run true}
2045
- * // alias the FooGallery.utils.is namespace
2046
- * var _is = FooGallery.utils.is;
2047
- *
2048
- * console.log( _is.number( 123 ) ); // => true
2049
- * console.log( _is.number( undefined ) ); // => false
2050
- * console.log( _is.number( null ) ); // => false
2051
- * console.log( _is.number( "" ) ); // => false
2052
- */
2053
-
2054
-
2055
- _.is.number = function (value) {
2056
- return '[object Number]' === Object.prototype.toString.call(value) && !isNaN(value);
2057
- };
2058
- /**
2059
- * @summary Checks if the `value` is an object.
2060
- * @memberof FooGallery.utils.is.
2061
- * @function object
2062
- * @param {*} value - The value to check.
2063
- * @returns {boolean} `true` if the supplied `value` is an object.
2064
- * @example {@run true}
2065
- * // alias the FooGallery.utils.is namespace
2066
- * var _is = FooGallery.utils.is;
2067
- *
2068
- * console.log( _is.object( {"some": "prop"} ) ); // => true
2069
- * console.log( _is.object( {} ) ); // => true
2070
- * console.log( _is.object( window ) ); // => true
2071
- * console.log( _is.object( document ) ); // => true
2072
- * console.log( _is.object( undefined ) ); // => false
2073
- * console.log( _is.object( null ) ); // => false
2074
- * console.log( _is.object( "" ) ); // => false
2075
- * console.log( _is.object( 123 ) ); // => false
2076
- */
2077
-
2078
-
2079
- _.is.object = function (value) {
2080
- return '[object Object]' === Object.prototype.toString.call(value) && !_.is.undef(value) && value !== null;
2081
- };
2082
- /**
2083
- * @summary Checks if the `value` is a promise.
2084
- * @memberof FooGallery.utils.is.
2085
- * @function promise
2086
- * @param {*} value - The object to check.
2087
- * @returns {boolean} `true` if the supplied `value` is an object.
2088
- * @description This is a simple check to determine if an object is a jQuery promise object. It simply checks the object has a `then` and `promise` function defined.
2089
- *
2090
- * The promise object is created as an object literal inside of `jQuery.Deferred`, it has no prototype, nor any other truly unique properties that could be used to distinguish it.
2091
- *
2092
- * This method should be a little more accurate than the internal jQuery one that simply checks for a `promise` function.
2093
- * @example {@run true}
2094
- * // alias the FooGallery.utils.is namespace
2095
- * var _is = FooGallery.utils.is;
2096
- *
2097
- * console.log( _is.promise( $.Deferred() ) ); // => true
2098
- * console.log( _is.promise( {} ) ); // => false
2099
- * console.log( _is.promise( undefined ) ); // => false
2100
- * console.log( _is.promise( null ) ); // => false
2101
- * console.log( _is.promise( "" ) ); // => false
2102
- * console.log( _is.promise( 123 ) ); // => false
2103
- */
2104
-
2105
-
2106
- _.is.promise = function (value) {
2107
- return _.is.object(value) && _.is.fn(value.then) && _.is.fn(value.promise);
2108
- };
2109
- /**
2110
- * @summary Checks if the `value` is a valid CSS length.
2111
- * @memberof FooGallery.utils.is.
2112
- * @function size
2113
- * @param {*} value - The value to check.
2114
- * @returns {boolean} `true` if the `value` is a number or CSS length.
2115
- * @example {@run true}
2116
- * // alias the FooGallery.utils.is namespace
2117
- * var _is = FooGallery.utils.is;
2118
- *
2119
- * console.log( _is.size( 80 ) ); // => true
2120
- * console.log( _is.size( "80px" ) ); // => true
2121
- * console.log( _is.size( "80em" ) ); // => true
2122
- * console.log( _is.size( "80%" ) ); // => true
2123
- * console.log( _is.size( {} ) ); // => false
2124
- * console.log( _is.size( undefined ) ); // => false
2125
- * console.log( _is.size( null ) ); // => false
2126
- * console.log( _is.size( "" ) ); // => false
2127
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/length|&lt;length&gt; - CSS | MDN} for more information on CSS length values.
2128
- */
2129
-
2130
-
2131
- _.is.size = function (value) {
2132
- if (!(_.is.string(value) && !_.is.empty(value)) && !_.is.number(value)) return false;
2133
- return /^(auto|none|(?:[\d.]*)+?(?:%|px|mm|q|cm|in|pt|pc|em|ex|ch|rem|vh|vw|vmin|vmax)?)$/.test(value);
2134
- };
2135
- /**
2136
- * @summary Checks if the `value` is a string.
2137
- * @memberof FooGallery.utils.is.
2138
- * @function string
2139
- * @param {*} value - The value to check.
2140
- * @returns {boolean} `true` if the `value` is a string.
2141
- * @example {@run true}
2142
- * // alias the FooGallery.utils.is namespace
2143
- * var _is = FooGallery.utils.is;
2144
- *
2145
- * console.log( _is.string( "" ) ); // => true
2146
- * console.log( _is.string( undefined ) ); // => false
2147
- * console.log( _is.string( null ) ); // => false
2148
- * console.log( _is.string( 123 ) ); // => false
2149
- */
2150
-
2151
-
2152
- _.is.string = function (value) {
2153
- return '[object String]' === Object.prototype.toString.call(value);
2154
- };
2155
- /**
2156
- * @summary Checks if the `value` is `undefined`.
2157
- * @memberof FooGallery.utils.is.
2158
- * @function undef
2159
- * @param {*} value - The value to check is undefined.
2160
- * @returns {boolean} `true` if the supplied `value` is `undefined`.
2161
- * @example {@run true}
2162
- * // alias the FooGallery.utils.is namespace
2163
- * var _is = FooGallery.utils.is;
2164
- *
2165
- * console.log( _is.undef( undefined ) ); // => true
2166
- * console.log( _is.undef( null ) ); // => false
2167
- * console.log( _is.undef( 123 ) ); // => false
2168
- * console.log( _is.undef( "" ) ); // => false
2169
- */
2170
-
2171
-
2172
- _.is.undef = function (value) {
2173
- return typeof value === 'undefined';
2174
- };
2175
- })( // dependencies
2176
- FooGallery.utils.$, FooGallery.utils);
2177
-
2178
- (function ($, _, _is) {
2179
- // only register methods if this version is the current version
2180
- if (_.version !== '1.0.0') return;
2181
- /**
2182
- * @memberof FooGallery.utils.
2183
- * @namespace fn
2184
- * @summary Contains common function utility methods.
2185
- */
2186
-
2187
- _.fn = {};
2188
- var fnStr = Function.prototype.toString;
2189
- /**
2190
- * @summary The regular expression to test if a function uses the `this._super` method applied by the {@link FooGallery.utils.fn.add} method.
2191
- * @memberof FooGallery.utils.fn.
2192
- * @name CONTAINS_SUPER
2193
- * @type {RegExp}
2194
- * @default /\b_super\b/
2195
- * @readonly
2196
- * @description When the script is first loaded into the page this performs a quick check to see if the browser supports function decompilation. If it does the regular expression is set to match the expected `_super`, however if function decompilation is not supported, the regular expression is set to match anything effectively making the test always return `true`.
2197
- * @example {@run true}
2198
- * // alias the FooGallery.utils.fn namespace
2199
- * var _fn = FooGallery.utils.fn;
2200
- *
2201
- * // create some functions to test
2202
- * function testFn1(){}
2203
- * function testFn2(){
2204
- * this._super();
2205
- * }
2206
- *
2207
- * console.log( _fn.CONTAINS_SUPER.test( testFn1 ) ); // => false
2208
- * console.log( _fn.CONTAINS_SUPER.test( testFn2 ) ); // => true
2209
- *
2210
- * // NOTE: in browsers that don't support functional decompilation both tests will return `true`
2211
- */
2212
-
2213
- _.fn.CONTAINS_SUPER = /xyz/.test(fnStr.call(function () {
2214
- //noinspection JSUnresolvedVariable,BadExpressionStatementJS
2215
- xyz;
2216
- })) ? /\b_super\b/ : /.*/;
2217
- /**
2218
- * @summary An empty function that does nothing. Useful for setting a default value and checking if it has changed.
2219
- * @memberof FooGallery.utils.fn.
2220
- * @function noop
2221
- */
2222
-
2223
- _.fn.noop = function () {};
2224
- /**
2225
- * @summary Adds or overrides the given method `name` on the `proto` using the supplied `fn`.
2226
- * @memberof FooGallery.utils.fn.
2227
- * @function addOrOverride
2228
- * @param {Object} proto - The prototype to add the method to.
2229
- * @param {string} name - The name of the method to add, if this already exists the original will be exposed within the scope of the supplied `fn` as `this._super`.
2230
- * @param {function} fn - The function to add to the prototype, if this is overriding an existing method you can use `this._super` to access the original within its' scope.
2231
- * @description If the new method overrides a pre-existing one, this function will expose the overridden method as `this._super` within the new methods scope.
2232
- *
2233
- * This replaces having to write out the following to override a method and call its original:
2234
- *
2235
- * ```javascript
2236
- * var original = MyClass.prototype.someMethod;
2237
- * MyClass.prototype.someMethod = function(arg1, arg2){
2238
- * // execute the original
2239
- * original.call(this, arg1, arg2);
2240
- * };
2241
- * ```
2242
- *
2243
- * With the following:
2244
- *
2245
- * ```javascript
2246
- * FooGallery.utils.fn.addOrOverride( MyClass.prototype, "someMethod", function(arg1, arg2){
2247
- * // execute the original
2248
- * this._super(arg1, arg2);
2249
- * });
2250
- * ```
2251
- *
2252
- * This method is used by the {@link FooGallery.utils.Class} to implement the inheritance of individual methods.
2253
- * @example {@run true}
2254
- * // alias the FooGallery.utils.fn namespace
2255
- * var _fn = FooGallery.utils.fn;
2256
- *
2257
- * var proto = {
2258
- * write: function( message ){
2259
- * console.log( "Original#write: " + message );
2260
- * }
2261
- * };
2262
- *
2263
- * proto.write( "My message" ); // => "Original#write: My message"
2264
- *
2265
- * _fn.addOrOverride( proto, "write", function( message ){
2266
- * message = "Override#write: " + message;
2267
- * this._super( message );
2268
- * } );
2269
- *
2270
- * proto.write( "My message" ); // => "Original#write: Override#write: My message"
2271
- */
2272
-
2273
-
2274
- _.fn.addOrOverride = function (proto, name, fn) {
2275
- if (!_is.object(proto) || !_is.string(name) || _is.empty(name) || !_is.fn(fn)) return;
2276
-
2277
- var _super = proto[name],
2278
- wrap = _is.fn(_super) && _.fn.CONTAINS_SUPER.test(fnStr.call(fn)); // only wrap the function if it overrides a method and makes use of `_super` within it's body.
2279
-
2280
-
2281
- proto[name] = wrap ? function (_super, fn) {
2282
- // create a new wrapped that exposes the original method as `_super`
2283
- return function () {
2284
- var tmp = this._super;
2285
- this._super = _super;
2286
- var ret = fn.apply(this, arguments);
2287
- this._super = tmp;
2288
- return ret;
2289
- };
2290
- }(_super, fn) : fn;
2291
- };
2292
- /**
2293
- * @summary Exposes the `methods` from the `source` on the `target`.
2294
- * @memberof FooGallery.utils.fn.
2295
- * @function expose
2296
- * @param {Object} source - The object to expose methods from.
2297
- * @param {Object} target - The object to expose methods on.
2298
- * @param {String[]} methods - An array of method names to expose.
2299
- * @param {*} [thisArg] - The value of `this` within the exposed `methods`. Defaults to the `source` object.
2300
- */
2301
-
2302
-
2303
- _.fn.expose = function (source, target, methods, thisArg) {
2304
- if (_is.object(source) && _is.object(target) && _is.array(methods)) {
2305
- thisArg = _is.undef(thisArg) ? source : thisArg;
2306
- methods.forEach(function (method) {
2307
- if (_is.string(method) && _is.fn(source[method])) {
2308
- target[method] = source[method].bind(thisArg);
2309
- }
2310
- });
2311
- }
2312
- };
2313
- /**
2314
- * @summary Use the `Function.prototype.apply` method on a class constructor using the `new` keyword.
2315
- * @memberof FooGallery.utils.fn.
2316
- * @function apply
2317
- * @param {Object} klass - The class to create.
2318
- * @param {Array} [args=[]] - The arguments to pass to the constructor.
2319
- * @returns {Object} The new instance of the `klass` created with the supplied `args`.
2320
- * @description When using the default `Function.prototype.apply` you can't use it on class constructors requiring the `new` keyword, this method allows us to do that.
2321
- * @example {@run true}
2322
- * // alias the FooGallery.utils.fn namespace
2323
- * var _fn = FooGallery.utils.fn;
2324
- *
2325
- * // create a class to test with
2326
- * function Test( name, value ){
2327
- * if ( !( this instanceof Test )){
2328
- * console.log( "Test instantiated without the `new` keyword." );
2329
- * return;
2330
- * }
2331
- * console.log( "Test: name = " + name + ", value = " + value );
2332
- * }
2333
- *
2334
- * Test.apply( Test, ["My name", "My value"] ); // => "Test instantiated without the `new` keyword."
2335
- * _fn.apply( Test, ["My name", "My value"] ); // => "Test: name = My name, value = My value"
2336
- */
2337
-
2338
-
2339
- _.fn.apply = function (klass, args) {
2340
- args.unshift(klass);
2341
- return new (Function.prototype.bind.apply(klass, args))();
2342
- };
2343
- /**
2344
- * @summary Converts the default `arguments` object into a proper array.
2345
- * @memberof FooGallery.utils.fn.
2346
- * @function arg2arr
2347
- * @param {IArguments} args - The arguments object to create an array from.
2348
- * @returns {Array}
2349
- * @description This method is simply a replacement for calling `Array.prototype.slice.call()` to create an array from an `arguments` object.
2350
- * @example {@run true}
2351
- * // alias the FooGallery.utils.fn namespace
2352
- * var _fn = FooGallery.utils.fn;
2353
- *
2354
- * function callMe(){
2355
- * var args = _fn.arg2arr(arguments);
2356
- * console.log( arguments instanceof Array ); // => false
2357
- * console.log( args instanceof Array ); // => true
2358
- * console.log( args ); // => [ "arg1", "arg2" ]
2359
- * }
2360
- *
2361
- * callMe("arg1", "arg2");
2362
- */
2363
-
2364
-
2365
- _.fn.arg2arr = function (args) {
2366
- return Array.prototype.slice.call(args);
2367
- };
2368
- /**
2369
- * @summary Debounce the `fn` by the supplied `time`.
2370
- * @memberof FooGallery.utils.fn.
2371
- * @function debounce
2372
- * @param {function} fn - The function to debounce.
2373
- * @param {number} time - The time in milliseconds to delay execution.
2374
- * @returns {function}
2375
- * @description This returns a wrapped version of the `fn` which delays its' execution by the supplied `time`. Additional calls to the function will extend the delay until the `time` expires.
2376
- */
2377
-
2378
-
2379
- _.fn.debounce = function (fn, time) {
2380
- var timeout;
2381
- return function () {
2382
- var ctx = this,
2383
- args = _.fn.arg2arr(arguments);
2384
-
2385
- clearTimeout(timeout);
2386
- timeout = setTimeout(function () {
2387
- fn.apply(ctx, args);
2388
- }, time);
2389
- };
2390
- };
2391
- /**
2392
- * @summary Throttles the `fn` by the supplied `time`.
2393
- * @memberof FooGallery.utils.fn.
2394
- * @function throttle
2395
- * @param {function} fn - The function to throttle.
2396
- * @param {number} time - The time in milliseconds to delay execution.
2397
- * @returns {function}
2398
- * @description This returns a wrapped version of the `fn` which ensures it's executed only once every `time` milliseconds. The first call to the function will be executed, after that only the last of any additional calls will be executed once the `time` expires.
2399
- */
2400
-
2401
-
2402
- _.fn.throttle = function (fn, time) {
2403
- var last, timeout;
2404
- return function () {
2405
- var ctx = this,
2406
- args = _.fn.arg2arr(arguments);
2407
-
2408
- if (!last) {
2409
- fn.apply(ctx, args);
2410
- last = Date.now();
2411
- } else {
2412
- clearTimeout(timeout);
2413
- timeout = setTimeout(function () {
2414
- if (Date.now() - last >= time) {
2415
- fn.apply(ctx, args);
2416
- last = Date.now();
2417
- }
2418
- }, time - (Date.now() - last));
2419
- }
2420
- };
2421
- };
2422
- /**
2423
- * @summary A resolved promise object.
2424
- * @memberof FooGallery.utils.fn.
2425
- * @name resolved
2426
- * @type {Promise}
2427
- */
2428
-
2429
-
2430
- _.fn.resolved = $.Deferred().resolve().promise();
2431
- /**
2432
- * @summary A rejected promise object.
2433
- * @memberof FooGallery.utils.fn.
2434
- * @name rejected
2435
- * @type {Promise}
2436
- */
2437
-
2438
- _.fn.rejected = $.Deferred().reject().promise();
2439
- /**
2440
- * @summary Return a promise rejected using the supplied args.
2441
- * @memberof FooGallery.utils.fn.
2442
- * @function reject
2443
- * @param {*} [arg1] - The first argument to reject the promise with.
2444
- * @param {...*} [argN] - Any additional arguments to reject the promise with.
2445
- * @returns {Promise}
2446
- */
2447
-
2448
- _.fn.reject = function (arg1, argN) {
2449
- var def = $.Deferred(),
2450
- args = _.fn.arg2arr(arguments);
2451
-
2452
- return def.reject.apply(def, args).promise();
2453
- };
2454
- /**
2455
- * @summary Return a promise resolved using the supplied args.
2456
- * @memberof FooGallery.utils.fn.
2457
- * @function resolve
2458
- * @param {*} [arg1] - The first argument to resolve the promise with.
2459
- * @param {...*} [argN] - Any additional arguments to resolve the promise with.
2460
- * @returns {Promise}
2461
- */
2462
-
2463
-
2464
- _.fn.resolve = function (arg1, argN) {
2465
- var def = $.Deferred(),
2466
- args = _.fn.arg2arr(arguments);
2467
-
2468
- return def.resolve.apply(def, args).promise();
2469
- };
2470
- /**
2471
- * @summary Return a promise rejected using the supplied args.
2472
- * @memberof FooGallery.utils.fn.
2473
- * @function rejectWith
2474
- * @param {*} thisArg - The value of `this` within the promises callbacks.
2475
- * @param {*} [arg1] - The first argument to reject the promise with.
2476
- * @param {...*} [argN] - Any additional arguments to reject the promise with.
2477
- * @returns {Promise}
2478
- */
2479
-
2480
-
2481
- _.fn.rejectWith = function (thisArg, arg1, argN) {
2482
- var def = $.Deferred(),
2483
- args = _.fn.arg2arr(arguments);
2484
-
2485
- args.shift(); // remove the thisArg
2486
-
2487
- return def.rejectWith(thisArg, args).promise();
2488
- };
2489
- /**
2490
- * @summary Return a promise resolved using the supplied args.
2491
- * @memberof FooGallery.utils.fn.
2492
- * @function resolveWith
2493
- * @param {*} thisArg - The value of `this` within the promises callbacks.
2494
- * @param {*} [arg1] - The first argument to resolve the promise with.
2495
- * @param {...*} [argN] - Any additional arguments to resolve the promise with.
2496
- * @returns {Promise}
2497
- */
2498
-
2499
-
2500
- _.fn.resolveWith = function (thisArg, arg1, argN) {
2501
- var def = $.Deferred(),
2502
- args = _.fn.arg2arr(arguments);
2503
-
2504
- args.shift(); // remove the thisArg
2505
-
2506
- return def.resolveWith(thisArg, args).promise();
2507
- };
2508
- /**
2509
- * @summary Waits for all promises to complete before resolving with an array containing the return value of each. This method will reject immediately with the first rejection message or error.
2510
- * @memberof FooGallery.utils.fn.
2511
- * @function all
2512
- * @param {Promise[]} promises - The array of promises to wait for.
2513
- * @returns {Promise}
2514
- */
2515
-
2516
-
2517
- _.fn.all = function (promises) {
2518
- var d = $.Deferred(),
2519
- results = [];
2520
-
2521
- if (_is.array(promises) && promises.length > 0) {
2522
- (function () {
2523
- /**
2524
- * Pushes the arguments into the results array at the supplied index.
2525
- * @ignore
2526
- * @param {number} index
2527
- * @param {Array} args
2528
- */
2529
- var pushResult = function pushResult(index, args) {
2530
- if (rejected) return;
2531
- results[index] = args.length === 0 ? undefined : args.length === 1 ? args[0] : args;
2532
- remaining--;
2533
- if (!remaining) d.resolve(results);
2534
- };
2535
-
2536
- var remaining = promises.length,
2537
- rejected = false;
2538
- var i = 0,
2539
- l = promises.length;
2540
-
2541
- var _loop = function _loop() {
2542
- if (rejected) return "break";
2543
- var j = i; // hold a scoped reference that can be used in the async callbacks
2544
-
2545
- if (_is.promise(promises[j])) {
2546
- promises[j].then(function () {
2547
- pushResult(j, _.fn.arg2arr(arguments));
2548
- }, function () {
2549
- if (rejected) return;
2550
- rejected = true;
2551
- d.reject.apply(d, _.fn.arg2arr(arguments));
2552
- });
2553
- } else {
2554
- // if we were supplied something that was not a promise then just add it as a fulfilled result
2555
- pushResult(j, [promises[j]]);
2556
- }
2557
- };
2558
-
2559
- for (; i < l; i++) {
2560
- var _ret = _loop();
2561
-
2562
- if (_ret === "break") break;
2563
- }
2564
- })();
2565
- } else {
2566
- d.resolve(results);
2567
- }
2568
-
2569
- return d.promise();
2570
- };
2571
- /**
2572
- * @summary Waits for all promises to complete before resolving with an array containing the outcome of each.
2573
- * @memberof FooGallery.utils.fn.
2574
- * @function allSettled
2575
- * @param {Promise[]} promises - The array of promises to wait for.
2576
- * @returns {Promise}
2577
- */
2578
-
2579
-
2580
- _.fn.allSettled = function (promises) {
2581
- var d = $.Deferred(),
2582
- results = [];
2583
-
2584
- if (_is.array(promises) && promises.length > 0) {
2585
- (function () {
2586
- /**
2587
- * Sets the value in the results array using the status and args.
2588
- * @ignore
2589
- * @param {number} index
2590
- * @param {string} status
2591
- * @param {Array} args
2592
- */
2593
- var setResult = function setResult(index, status, args) {
2594
- results[index] = {
2595
- status: status
2596
- };
2597
-
2598
- if (args.length > 0) {
2599
- var prop = status === "rejected" ? "reason" : "value";
2600
- results[index][prop] = args.length === 1 ? args[0] : args;
2601
- }
2602
-
2603
- remaining--;
2604
- if (!remaining) d.resolve(results);
2605
- };
2606
-
2607
- var remaining = promises.length;
2608
- var i = 0,
2609
- l = promises.length;
2610
-
2611
- var _loop2 = function _loop2() {
2612
- var j = i; // hold a scoped reference that can be used in the async callbacks
2613
-
2614
- if (_is.promise(promises[j])) {
2615
- promises[j].then(function () {
2616
- setResult(j, "fulfilled", _.fn.arg2arr(arguments));
2617
- }, function () {
2618
- setResult(j, "rejected", _.fn.arg2arr(arguments));
2619
- });
2620
- } else {
2621
- // if we were supplied something that was not a promise then just add it as a fulfilled result
2622
- setResult(j, "fulfilled", [promises[j]]);
2623
- }
2624
- };
2625
-
2626
- for (; i < l; i++) {
2627
- _loop2();
2628
- }
2629
- })();
2630
- } else {
2631
- d.resolve(results);
2632
- }
2633
-
2634
- return d.promise();
2635
- };
2636
- })( // dependencies
2637
- FooGallery.utils.$, FooGallery.utils, FooGallery.utils.is);
2638
-
2639
- (function (_, _is) {
2640
- // only register methods if this version is the current version
2641
- if (_.version !== '1.0.0') return;
2642
- /**
2643
- * @summary Contains common url utility methods.
2644
- * @memberof FooGallery.utils.
2645
- * @namespace url
2646
- */
2647
-
2648
- _.url = {}; // used for parsing a url into it's parts.
2649
-
2650
- var _a = document.createElement('a');
2651
- /**
2652
- * @summary Parses the supplied url into an object containing it's component parts.
2653
- * @memberof FooGallery.utils.url.
2654
- * @function parts
2655
- * @param {string} url - The url to parse.
2656
- * @returns {FooGallery.utils.url~Parts}
2657
- * @example {@run true}
2658
- * // alias the FooGallery.utils.url namespace
2659
- * var _url = FooGallery.utils.url;
2660
- *
2661
- * console.log( _url.parts( "http://example.com/path/?param=true#something" ) ); // => {"hash":"#something", ...}
2662
- */
2663
-
2664
-
2665
- _.url.parts = function (url) {
2666
- _a.href = url;
2667
- var port = _a.port ? _a.port : ["http:", "https:"].indexOf(_a.protocol) !== -1 ? _a.protocol === "https:" ? "443" : "80" : "",
2668
- host = _a.hostname + (port ? ":" + port : ""),
2669
- origin = _a.origin ? _a.origin : _a.protocol + "//" + host,
2670
- pathname = _a.pathname.slice(0, 1) === "/" ? _a.pathname : "/" + _a.pathname;
2671
- return {
2672
- hash: _a.hash,
2673
- host: host,
2674
- hostname: _a.hostname,
2675
- href: _a.href,
2676
- origin: origin,
2677
- pathname: pathname,
2678
- port: port,
2679
- protocol: _a.protocol,
2680
- search: _a.search
2681
- };
2682
- };
2683
- /**
2684
- * @summary Given a <code>url</code> that could be relative or full this ensures a full url is returned.
2685
- * @memberof FooGallery.utils.url.
2686
- * @function full
2687
- * @param {string} url - The url to ensure is full.
2688
- * @returns {?string} `null` if the given `path` is not a string or empty.
2689
- * @description Given a full url this will simply return it however if given a relative url this will create a full url using the current location to fill in the blanks.
2690
- * @example {@run true}
2691
- * // alias the FooGallery.utils.url namespace
2692
- * var _url = FooGallery.utils.url;
2693
- *
2694
- * console.log( _url.full( "http://example.com/path/" ) ); // => "http://example.com/path/"
2695
- * console.log( _url.full( "/path/" ) ); // => "{protocol}//{host}/path/"
2696
- * console.log( _url.full( "path/" ) ); // => "{protocol}//{host}/{pathname}/path/"
2697
- * console.log( _url.full( "../path/" ) ); // => "{protocol}//{host}/{calculated pathname}/path/"
2698
- * console.log( _url.full() ); // => null
2699
- * console.log( _url.full( 123 ) ); // => null
2700
- */
2701
-
2702
-
2703
- _.url.full = function (url) {
2704
- if (!_is.string(url) || _is.empty(url)) return null;
2705
- _a.href = url;
2706
- return _a.href;
2707
- };
2708
- /**
2709
- * @summary Gets or sets a parameter in the given <code>search</code> string.
2710
- * @memberof FooGallery.utils.url.
2711
- * @function param
2712
- * @param {string} search - The search string to use (usually `location.search`).
2713
- * @param {string} key - The key of the parameter.
2714
- * @param {?string} [value] - The value to set for the parameter. If not provided the current value for the `key` is returned.
2715
- * @returns {?string} The value of the `key` in the given `search` string if no `value` is supplied or `null` if the `key` does not exist.
2716
- * @returns {string} A modified `search` string if a `value` is supplied.
2717
- * @example <caption>Shows how to retrieve a parameter value from a search string.</caption>{@run true}
2718
- * // alias the FooGallery.utils.url namespace
2719
- * var _url = FooGallery.utils.url,
2720
- * // create a search string to test
2721
- * search = "?wmode=opaque&autoplay=1";
2722
- *
2723
- * console.log( _url.param( search, "wmode" ) ); // => "opaque"
2724
- * console.log( _url.param( search, "autoplay" ) ); // => "1"
2725
- * console.log( _url.param( search, "nonexistent" ) ); // => null
2726
- * @example <caption>Shows how to set a parameter value in the given search string.</caption>{@run true}
2727
- * // alias the FooGallery.utils.url namespace
2728
- * var _url = FooGallery.utils.url,
2729
- * // create a search string to test
2730
- * search = "?wmode=opaque&autoplay=1";
2731
- *
2732
- * console.log( _url.param( search, "wmode", "window" ) ); // => "?wmode=window&autoplay=1"
2733
- * console.log( _url.param( search, "autoplay", "0" ) ); // => "?wmode=opaque&autoplay=0"
2734
- * console.log( _url.param( search, "v", "2" ) ); // => "?wmode=opaque&autoplay=1&v=2"
2735
- */
2736
-
2737
-
2738
- _.url.param = function (search, key, value) {
2739
- if (!_is.string(search) || !_is.string(key) || _is.empty(key)) return search;
2740
- var regex, match, result, param;
2741
-
2742
- if (_is.undef(value)) {
2743
- regex = new RegExp('[?|&]' + key + '=([^&;]+?)(&|#|;|$)'); // regex to match the key and it's value but only capture the value
2744
-
2745
- match = regex.exec(search) || ["", ""]; // match the param otherwise return an empty string match
2746
-
2747
- result = match[1].replace(/\+/g, '%20'); // replace any + character's with spaces
2748
-
2749
- return _is.string(result) && !_is.empty(result) ? decodeURIComponent(result) : null; // decode the result otherwise return null
2750
- }
2751
-
2752
- if (_is.empty(value)) {
2753
- regex = new RegExp('^([^#]*\?)(([^#]*)&)?' + key + '(\=[^&#]*)?(&|#|$)');
2754
- result = search.replace(regex, '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/, '$1$3$4');
2755
- } else {
2756
- regex = new RegExp('([?&])' + key + '[^&]*'); // regex to match the key and it's current value but only capture the preceding ? or & char
2757
-
2758
- param = key + '=' + encodeURIComponent(value);
2759
- result = search.replace(regex, '$1' + param); // replace any existing instance of the key with the new value
2760
- // If nothing was replaced, then add the new param to the end
2761
-
2762
- if (result === search && !regex.test(result)) {
2763
- // if no replacement occurred and the parameter is not currently in the result then add it
2764
- result += (result.indexOf("?") !== -1 ? '&' : '?') + param;
2765
- }
2766
- }
2767
-
2768
- return result;
2769
- }; //######################
2770
- //## Type Definitions ##
2771
- //######################
2772
-
2773
- /**
2774
- * @summary A plain JavaScript object returned by the {@link FooGallery.utils.url.parts} method.
2775
- * @typedef {Object} FooGallery.utils.url~Parts
2776
- * @property {string} hash - A string containing a `#` followed by the fragment identifier of the URL.
2777
- * @property {string} host - A string containing the host, that is the hostname, a `:`, and the port of the URL.
2778
- * @property {string} hostname - A string containing the domain of the URL.
2779
- * @property {string} href - A string containing the entire URL.
2780
- * @property {string} origin - A string containing the canonical form of the origin of the specific location.
2781
- * @property {string} pathname - A string containing an initial `/` followed by the path of the URL.
2782
- * @property {string} port - A string containing the port number of the URL.
2783
- * @property {string} protocol - A string containing the protocol scheme of the URL, including the final `:`.
2784
- * @property {string} search - A string containing a `?` followed by the parameters of the URL. Also known as "querystring".
2785
- * @see {@link FooGallery.utils.url.parts} for example usage.
2786
- */
2787
-
2788
- })( // dependencies
2789
- FooGallery.utils, FooGallery.utils.is);
2790
-
2791
- (function (_, _is, _fn) {
2792
- // only register methods if this version is the current version
2793
- if (_.version !== '1.0.0') return;
2794
- /**
2795
- * @summary Contains common string utility methods.
2796
- * @memberof FooGallery.utils.
2797
- * @namespace str
2798
- */
2799
-
2800
- _.str = {};
2801
- /**
2802
- * @summary Removes whitespace from both ends of the target string.
2803
- * @memberof FooGallery.utils.str.
2804
- * @function trim
2805
- * @param {string} target - The string to trim.
2806
- * @returns {string|null} Returns `null` if the supplied target is not a string.
2807
- */
2808
-
2809
- _.str.trim = function (target) {
2810
- return _is.string(target) ? target.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '') : null;
2811
- };
2812
- /**
2813
- * @summary Converts the given `target` to camel case.
2814
- * @memberof FooGallery.utils.str.
2815
- * @function camel
2816
- * @param {string} target - The string to camel case.
2817
- * @returns {string}
2818
- * @example {@run true}
2819
- * // alias the FooGallery.utils.str namespace
2820
- * var _str = FooGallery.utils.str;
2821
- *
2822
- * console.log( _str.camel( "max-width" ) ); // => "maxWidth"
2823
- * console.log( _str.camel( "max--width" ) ); // => "maxWidth"
2824
- * console.log( _str.camel( "max Width" ) ); // => "maxWidth"
2825
- * console.log( _str.camel( "Max_width" ) ); // => "maxWidth"
2826
- * console.log( _str.camel( "MaxWidth" ) ); // => "maxWidth"
2827
- * console.log( _str.camel( "Abbreviations like CSS are left intact" ) ); // => "abbreviationsLikeCSSAreLeftIntact"
2828
- */
2829
-
2830
-
2831
- _.str.camel = function (target) {
2832
- if (!_is.string(target)) return target;
2833
- if (target.toUpperCase() === target) return target.toLowerCase();
2834
- return target.replace(/^([A-Z])|[-\s_]+(\w)/g, function (match, p1, p2) {
2835
- if (_is.string(p2)) return p2.toUpperCase();
2836
- return p1.toLowerCase();
2837
- });
2838
- };
2839
- /**
2840
- * @summary Converts the given `target` to kebab case. Non-alphanumeric characters are converted to `-`.
2841
- * @memberof FooGallery.utils.str.
2842
- * @function kebab
2843
- * @param {string} target - The string to kebab case.
2844
- * @returns {string}
2845
- * @example {@run true}
2846
- * // alias the FooGallery.utils.str namespace
2847
- * var _str = FooGallery.utils.str;
2848
- *
2849
- * console.log( _str.kebab( "max-width" ) ); // => "max-width"
2850
- * console.log( _str.kebab( "max--width" ) ); // => "max-width"
2851
- * console.log( _str.kebab( "max Width" ) ); // => "max-width"
2852
- * console.log( _str.kebab( "Max_width" ) ); // => "max-width"
2853
- * console.log( _str.kebab( "MaxWidth" ) ); // => "max-width"
2854
- * console.log( _str.kebab( "Non-alphanumeric ch@racters are converted to dashes!" ) ); // => "non-alphanumeric-ch-racters-are-converted-to-dashes"
2855
- */
2856
-
2857
-
2858
- _.str.kebab = function (target) {
2859
- if (!_is.string(target)) return target;
2860
- return target.match(/[A-Z]{2,}(?=[A-Z][a-z0-9]*|\b)|[A-Z]?[a-z0-9]*|[A-Z]|[0-9]+/g).filter(Boolean).map(function (x) {
2861
- return x.toLowerCase();
2862
- }).join('-');
2863
- };
2864
- /**
2865
- * @summary Checks if the `target` contains the given `substr`.
2866
- * @memberof FooGallery.utils.str.
2867
- * @function contains
2868
- * @param {string} target - The string to check.
2869
- * @param {string} substr - The string to check for.
2870
- * @param {boolean} [ignoreCase=false] - Whether or not to ignore casing when performing the check.
2871
- * @returns {boolean} `true` if the `target` contains the given `substr`.
2872
- * @example {@run true}
2873
- * // alias the FooGallery.utils.str namespace
2874
- * var _str = FooGallery.utils.str,
2875
- * // create a string to test
2876
- * target = "To be, or not to be, that is the question.";
2877
- *
2878
- * console.log( _str.contains( target, "To be" ) ); // => true
2879
- * console.log( _str.contains( target, "question" ) ); // => true
2880
- * console.log( _str.contains( target, "no" ) ); // => true
2881
- * console.log( _str.contains( target, "nonexistent" ) ); // => false
2882
- * console.log( _str.contains( target, "TO BE" ) ); // => false
2883
- * console.log( _str.contains( target, "TO BE", true ) ); // => true
2884
- */
2885
-
2886
-
2887
- _.str.contains = function (target, substr, ignoreCase) {
2888
- if (!_is.string(target) || _is.empty(target) || !_is.string(substr) || _is.empty(substr)) return false;
2889
- return substr.length <= target.length && (!!ignoreCase ? target.toUpperCase().indexOf(substr.toUpperCase()) : target.indexOf(substr)) !== -1;
2890
- };
2891
- /**
2892
- * @summary Checks if the `target` contains the given `word`.
2893
- * @memberof FooGallery.utils.str.
2894
- * @function containsWord
2895
- * @param {string} target - The string to check.
2896
- * @param {string} word - The word to check for.
2897
- * @param {boolean} [ignoreCase=false] - Whether or not to ignore casing when performing the check.
2898
- * @returns {boolean} `true` if the `target` contains the given `word`.
2899
- * @description This method differs from {@link FooGallery.utils.str.contains} in that it searches for whole words by splitting the `target` string on word boundaries (`\b`) and then comparing the individual parts.
2900
- * @example {@run true}
2901
- * // alias the FooGallery.utils.str namespace
2902
- * var _str = FooGallery.utils.str,
2903
- * // create a string to test
2904
- * target = "To be, or not to be, that is the question.";
2905
- *
2906
- * console.log( _str.containsWord( target, "question" ) ); // => true
2907
- * console.log( _str.containsWord( target, "no" ) ); // => false
2908
- * console.log( _str.containsWord( target, "NOT" ) ); // => false
2909
- * console.log( _str.containsWord( target, "NOT", true ) ); // => true
2910
- * console.log( _str.containsWord( target, "nonexistent" ) ); // => false
2911
- */
2912
-
2913
-
2914
- _.str.containsWord = function (target, word, ignoreCase) {
2915
- if (!_is.string(target) || _is.empty(target) || !_is.string(word) || _is.empty(word) || target.length < word.length) return false;
2916
- var parts = target.split(/\W/);
2917
- var i = 0,
2918
- len = parts.length;
2919
-
2920
- for (; i < len; i++) {
2921
- if (ignoreCase ? parts[i].toUpperCase() === word.toUpperCase() : parts[i] === word) return true;
2922
- }
2923
-
2924
- return false;
2925
- };
2926
- /**
2927
- * @summary Checks if the `target` ends with the given `substr`.
2928
- * @memberof FooGallery.utils.str.
2929
- * @function endsWith
2930
- * @param {string} target - The string to check.
2931
- * @param {string} substr - The substr to check for.
2932
- * @returns {boolean} `true` if the `target` ends with the given `substr`.
2933
- * @example {@run true}
2934
- * // alias the FooGallery.utils.str namespace
2935
- * var _str = FooGallery.utils.str;
2936
- *
2937
- * console.log( _str.endsWith( "something", "g" ) ); // => true
2938
- * console.log( _str.endsWith( "something", "ing" ) ); // => true
2939
- * console.log( _str.endsWith( "something", "no" ) ); // => false
2940
- */
2941
-
2942
-
2943
- _.str.endsWith = function (target, substr) {
2944
- if (!_is.string(target) || !_is.string(substr) || substr.length > target.length) return false;
2945
- return target.slice(target.length - substr.length) === substr;
2946
- };
2947
- /**
2948
- * @summary Checks if the `target` starts with the given `substr`.
2949
- * @memberof FooGallery.utils.str.
2950
- * @function startsWith
2951
- * @param {string} target - The string to check.
2952
- * @param {string} substr - The substr to check for.
2953
- * @returns {boolean} `true` if the `target` starts with the given `substr`.
2954
- * @example {@run true}
2955
- * // alias the FooGallery.utils.str namespace
2956
- * var _str = FooGallery.utils.str;
2957
- *
2958
- * console.log( _str.startsWith( "something", "s" ) ); // => true
2959
- * console.log( _str.startsWith( "something", "some" ) ); // => true
2960
- * console.log( _str.startsWith( "something", "no" ) ); // => false
2961
- */
2962
-
2963
-
2964
- _.str.startsWith = function (target, substr) {
2965
- if (_is.empty(target) || _is.empty(substr)) return false;
2966
- return target.slice(0, substr.length) === substr;
2967
- };
2968
- /**
2969
- * @summary Escapes the `target` for use in a regular expression.
2970
- * @memberof FooGallery.utils.str.
2971
- * @function escapeRegExp
2972
- * @param {string} target - The string to escape.
2973
- * @returns {string}
2974
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
2975
- */
2976
-
2977
-
2978
- _.str.escapeRegExp = function (target) {
2979
- if (!_is.string(target)) return target;
2980
- return target.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
2981
- };
2982
- /**
2983
- * @summary Generates a 32 bit FNV-1a hash from the given `target`.
2984
- * @memberof FooGallery.utils.str.
2985
- * @function fnv1a
2986
- * @param {string} target - The string to generate a hash from.
2987
- * @returns {?number} `null` if the `target` is not a string or empty otherwise a 32 bit FNV-1a hash.
2988
- * @example {@run true}
2989
- * // alias the FooGallery.utils.str namespace
2990
- * var _str = FooGallery.utils.str;
2991
- *
2992
- * console.log( _str.fnv1a( "Some string to generate a hash for." ) ); // => 207568994
2993
- * console.log( _str.fnv1a( "Some string to generate a hash for" ) ); // => 1350435704
2994
- * @see {@link https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function|Fowler–Noll–Vo hash function}
2995
- */
2996
-
2997
-
2998
- _.str.fnv1a = function (target) {
2999
- if (!_is.string(target) || _is.empty(target)) return null;
3000
- var i,
3001
- l,
3002
- hval = 0x811c9dc5;
3003
-
3004
- for (i = 0, l = target.length; i < l; i++) {
3005
- hval ^= target.charCodeAt(i);
3006
- hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
3007
- }
3008
-
3009
- return hval >>> 0;
3010
- };
3011
- /**
3012
- * @summary Returns the remainder of the `target` split on the first index of the given `substr`.
3013
- * @memberof FooGallery.utils.str.
3014
- * @function from
3015
- * @param {string} target - The string to split.
3016
- * @param {string} substr - The substring to split on.
3017
- * @returns {?string} `null` if the given `substr` does not exist within the `target`.
3018
- * @example {@run true}
3019
- * // alias the FooGallery.utils.str namespace
3020
- * var _str = FooGallery.utils.str,
3021
- * // create a string to test
3022
- * target = "To be, or not to be, that is the question.";
3023
- *
3024
- * console.log( _str.from( target, "no" ) ); // => "t to be, that is the question."
3025
- * console.log( _str.from( target, "that" ) ); // => " is the question."
3026
- * console.log( _str.from( target, "question" ) ); // => "."
3027
- * console.log( _str.from( target, "nonexistent" ) ); // => null
3028
- */
3029
-
3030
-
3031
- _.str.from = function (target, substr) {
3032
- return _.str.contains(target, substr) ? target.substring(target.indexOf(substr) + substr.length) : null;
3033
- };
3034
- /**
3035
- * @summary Joins any number of strings using the given `separator`.
3036
- * @memberof FooGallery.utils.str.
3037
- * @function join
3038
- * @param {string} separator - The separator to use to join the strings.
3039
- * @param {string} part - The first string to join.
3040
- * @param {...string} [partN] - Any number of additional strings to join.
3041
- * @returns {?string}
3042
- * @description This method differs from using the standard `Array.prototype.join` function to join strings in that it ignores empty parts and checks to see if each starts with the supplied `separator`. If the part starts with the `separator` it is removed before appending it to the final result.
3043
- * @example {@run true}
3044
- * // alias the FooGallery.utils.str namespace
3045
- * var _str = FooGallery.utils.str;
3046
- *
3047
- * console.log( _str.join( "_", "all", "in", "one" ) ); // => "all_in_one"
3048
- * console.log( _str.join( "_", "all", "_in", "one" ) ); // => "all_in_one"
3049
- * console.log( _str.join( "/", "http://", "/example.com/", "/path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
3050
- * console.log( _str.join( "/", "http://", "/example.com", "/path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
3051
- * console.log( _str.join( "/", "http://", "example.com", "path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
3052
- */
3053
-
3054
-
3055
- _.str.join = function (separator, part, partN) {
3056
- if (!_is.string(separator) || !_is.string(part)) return null;
3057
-
3058
- var parts = _fn.arg2arr(arguments);
3059
-
3060
- separator = parts.shift();
3061
- var i,
3062
- l,
3063
- result = parts.shift();
3064
-
3065
- for (i = 0, l = parts.length; i < l; i++) {
3066
- part = parts[i];
3067
- if (_is.empty(part)) continue;
3068
-
3069
- if (_.str.endsWith(result, separator)) {
3070
- result = result.slice(0, result.length - separator.length);
3071
- }
3072
-
3073
- if (_.str.startsWith(part, separator)) {
3074
- part = part.slice(separator.length);
3075
- }
3076
-
3077
- result += separator + part;
3078
- }
3079
-
3080
- return result;
3081
- };
3082
- /**
3083
- * @summary Returns the first part of the `target` split on the first index of the given `substr`.
3084
- * @memberof FooGallery.utils.str.
3085
- * @function until
3086
- * @param {string} target - The string to split.
3087
- * @param {string} substr - The substring to split on.
3088
- * @returns {string} The `target` if the `substr` does not exist.
3089
- * @example {@run true}
3090
- * // alias the FooGallery.utils.str namespace
3091
- * var _str = FooGallery.utils.str,
3092
- * // create a string to test
3093
- * target = "To be, or not to be, that is the question.";
3094
- *
3095
- * console.log( _str.until( target, "no" ) ); // => "To be, or "
3096
- * console.log( _str.until( target, "that" ) ); // => "To be, or not to be, "
3097
- * console.log( _str.until( target, "question" ) ); // => "To be, or not to be, that is the "
3098
- * console.log( _str.until( target, "nonexistent" ) ); // => "To be, or not to be, that is the question."
3099
- */
3100
-
3101
-
3102
- _.str.until = function (target, substr) {
3103
- return _.str.contains(target, substr) ? target.substring(0, target.indexOf(substr)) : target;
3104
- };
3105
- /**
3106
- * @summary A basic string formatter that can use both index and name based placeholders but handles only string or number replacements.
3107
- * @memberof FooGallery.utils.str.
3108
- * @function format
3109
- * @param {string} target - The format string containing any placeholders to replace.
3110
- * @param {string|number|Object|Array} arg1 - The first value to format the target with. If an object is supplied it's properties are used to match named placeholders. If an array, string or number is supplied it's values are used to match any index placeholders.
3111
- * @param {...(string|number)} [argN] - Any number of additional strings or numbers to format the target with.
3112
- * @returns {string} The string formatted with the supplied arguments.
3113
- * @description This method allows you to supply the replacements as an object when using named placeholders or as an array or additional arguments when using index placeholders.
3114
- *
3115
- * This does not perform a simultaneous replacement of placeholders, which is why it's referred to as a basic formatter. This means replacements that contain placeholders within there value could end up being replaced themselves as seen in the last example.
3116
- * @example {@caption The following shows how to use index placeholders.}{@run true}
3117
- * // alias the FooGallery.utils.str namespace
3118
- * var _str = FooGallery.utils.str,
3119
- * // create a format string using index placeholders
3120
- * format = "Hello, {0}, are you feeling {1}?";
3121
- *
3122
- * console.log( _str.format( format, "Steve", "OK" ) ); // => "Hello, Steve, are you feeling OK?"
3123
- * // or
3124
- * console.log( _str.format( format, [ "Steve", "OK" ] ) ); // => "Hello, Steve, are you feeling OK?"
3125
- * @example {@caption While the above works perfectly fine the downside is that the placeholders provide no clues as to what should be supplied as a replacement value, this is were supplying an object and using named placeholders steps in.}{@run true}
3126
- * // alias the FooGallery.utils.str namespace
3127
- * var _str = FooGallery.utils.str,
3128
- * // create a format string using named placeholders
3129
- * format = "Hello, {name}, are you feeling {adjective}?";
3130
- *
3131
- * console.log( _str.format( format, {name: "Steve", adjective: "OK"} ) ); // => "Hello, Steve, are you feeling OK?"
3132
- * @example {@caption The following demonstrates the issue with not performing a simultaneous replacement of placeholders.}{@run true}
3133
- * // alias the FooGallery.utils.str namespace
3134
- * var _str = FooGallery.utils.str;
3135
- *
3136
- * console.log( _str.format("{0}{1}", "{1}", "{0}") ); // => "{0}{0}"
3137
- *
3138
- * // If the replacement happened simultaneously the result would be "{1}{0}" but this method executes
3139
- * // replacements synchronously as seen below:
3140
- *
3141
- * // "{0}{1}".replace( "{0}", "{1}" )
3142
- * // => "{1}{1}".replace( "{1}", "{0}" )
3143
- * // => "{0}{0}"
3144
- */
3145
-
3146
-
3147
- _.str.format = function (target, arg1, argN) {
3148
- var args = _fn.arg2arr(arguments);
3149
-
3150
- target = args.shift(); // remove the target from the args
3151
-
3152
- if (_is.string(target) && args.length > 0) {
3153
- if (args.length === 1 && (_is.array(args[0]) || _is.object(args[0]))) {
3154
- args = args[0];
3155
- }
3156
-
3157
- _.each(args, function (value, placeholder) {
3158
- target = target.replace(new RegExp("\\{" + placeholder + "\\}", "gi"), value + "");
3159
- });
3160
- }
3161
-
3162
- return target;
3163
- };
3164
- })( // dependencies
3165
- FooGallery.utils, FooGallery.utils.is, FooGallery.utils.fn);
3166
-
3167
- (function ($, _, _is, _fn, _str) {
3168
- // only register methods if this version is the current version
3169
- if (_.version !== '1.0.0') return;
3170
- /**
3171
- * @summary Contains common object utility methods.
3172
- * @memberof FooGallery.utils.
3173
- * @namespace obj
3174
- */
3175
-
3176
- _.obj = {};
3177
- /**
3178
- * @summary Creates a new object with the specified prototype.
3179
- * @memberof FooGallery.utils.obj.
3180
- * @function create
3181
- * @param {Object} proto - The object which should be the prototype of the newly-created object.
3182
- * @returns {Object} A new object with the specified prototype.
3183
- * @description This is a basic implementation of the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create|Object.create} method.
3184
- */
3185
-
3186
- _.obj.create = function (proto) {
3187
- if (!_is.object(proto)) throw TypeError('Argument must be an object');
3188
-
3189
- function Obj() {}
3190
-
3191
- Obj.prototype = proto;
3192
- return new Obj();
3193
- };
3194
- /**
3195
- * @summary Merge the contents of two or more objects together into the first `target` object.
3196
- * @memberof FooGallery.utils.obj.
3197
- * @function extend
3198
- * @param {Object} target - The object to merge properties into.
3199
- * @param {Object} object - An object containing properties to merge.
3200
- * @param {...Object} [objectN] - Additional objects containing properties to merge.
3201
- * @returns {Object} The `target` merged with the contents from any additional objects.
3202
- * @description This does not merge arrays by index as jQuery does, it treats them as a single property and replaces the array with a shallow copy of the new one.
3203
- *
3204
- * This method makes use of the {@link FooGallery.utils.obj.merge} method internally.
3205
- * @example {@run true}
3206
- * // alias the FooGallery.utils.obj namespace
3207
- * var _obj = FooGallery.utils.obj,
3208
- * // create some objects to merge
3209
- * defaults = {"name": "My Object", "enabled": false, "arr": [1,2,3]},
3210
- * options = {"enabled": true, "something": 123, "arr": [4,5,6]};
3211
- *
3212
- * // merge the two objects into a new third one without modifying either of the originals
3213
- * var settings = _obj.extend( {}, defaults, options );
3214
- *
3215
- * console.log( settings ); // => {"name": "My Object", "enabled": true, "arr": [4,5,6], "something": 123}
3216
- * console.log( defaults ); // => {"name": "My Object", "enabled": true, "arr": [1,2,3]}
3217
- * console.log( options ); // => {"enabled": true, "arr": [4,5,6], "something": 123}
3218
- */
3219
-
3220
-
3221
- _.obj.extend = function (target, object, objectN) {
3222
- target = _is.object(target) ? target : {};
3223
-
3224
- var objects = _fn.arg2arr(arguments);
3225
-
3226
- objects.shift();
3227
-
3228
- _.each(objects, function (object) {
3229
- _.obj.merge(target, object);
3230
- });
3231
-
3232
- return target;
3233
- };
3234
- /**
3235
- * @summary Merge the contents of two objects together into the first `target` object.
3236
- * @memberof FooGallery.utils.obj.
3237
- * @function merge
3238
- * @param {Object} target - The object to merge properties into.
3239
- * @param {Object} object - The object containing properties to merge.
3240
- * @returns {Object} The `target` merged with the contents from the `object`.
3241
- * @description This does not merge arrays by index as jQuery does, it treats them as a single property and replaces the array with a shallow copy of the new one.
3242
- *
3243
- * This method is used internally by the {@link FooGallery.utils.obj.extend} method.
3244
- * @example {@run true}
3245
- * // alias the FooGallery.utils.obj namespace
3246
- * var _obj = FooGallery.utils.obj,
3247
- * // create some objects to merge
3248
- * target = {"name": "My Object", "enabled": false, "arr": [1,2,3]},
3249
- * object = {"enabled": true, "something": 123, "arr": [4,5,6]};
3250
- *
3251
- * console.log( _obj.merge( target, object ) ); // => {"name": "My Object", "enabled": true, "arr": [4,5,6], "something": 123}
3252
- */
3253
-
3254
-
3255
- _.obj.merge = function (target, object) {
3256
- target = _is.hash(target) ? target : {};
3257
- object = _is.hash(object) ? object : {};
3258
-
3259
- for (var prop in object) {
3260
- if (object.hasOwnProperty(prop)) {
3261
- if (_is.hash(object[prop])) {
3262
- target[prop] = _is.hash(target[prop]) ? target[prop] : {};
3263
-
3264
- _.obj.merge(target[prop], object[prop]);
3265
- } else if (_is.array(object[prop])) {
3266
- target[prop] = object[prop].slice();
3267
- } else {
3268
- target[prop] = object[prop];
3269
- }
3270
- }
3271
- }
3272
-
3273
- return target;
3274
- };
3275
- /**
3276
- * @summary Merge the validated properties of the `object` into the `target` using the optional `mappings`.
3277
- * @memberof FooGallery.utils.obj.
3278
- * @function mergeValid
3279
- * @param {Object} target - The object to merge properties into.
3280
- * @param {FooGallery.utils.obj~Validators} validators - An object containing validators for the `target` object properties.
3281
- * @param {Object} object - The object containing properties to merge.
3282
- * @param {FooGallery.utils.obj~Mappings} [mappings] - An object containing property name mappings.
3283
- * @returns {Object} The modified `target` object containing any valid properties from the supplied `object`.
3284
- * @example {@caption Shows the basic usage for this method and shows how invalid properties or those with no corresponding validator are ignored.}{@run true}
3285
- * // alias the FooGallery.utils.obj and FooGallery.utils.is namespaces
3286
- * var _obj = FooGallery.utils.obj,
3287
- * _is = FooGallery.utils.is;
3288
- *
3289
- * //create the target object and it's validators
3290
- * var target = {"name":"John","location":"unknown"},
3291
- * validators = {"name":_is.string,"location":_is.string};
3292
- *
3293
- * // create the object to merge into the target
3294
- * var object = {
3295
- * "name": 1234, // invalid
3296
- * "location": "Liverpool", // updated
3297
- * "notMerged": true // ignored
3298
- * };
3299
- *
3300
- * // merge the object into the target, invalid properties or those with no corresponding validator are ignored.
3301
- * console.log( _obj.mergeValid( target, validators, object ) ); // => { "name": "John", "location": "Liverpool" }
3302
- * @example {@caption Shows how to supply a mappings object for this method.}{@run true}
3303
- * // alias the FooGallery.utils.obj and FooGallery.utils.is namespaces
3304
-