Extendify — Gutenberg Patterns and Templates - Version 0.1.0

Version Description

  • 2022-01-06 =
  • Add null check on import position
  • Add support for importing patterns to a specific location
  • Add /extendify slash command to open the library
  • Add preview optimizations
  • Add check for live preview visibility
  • Fix pattern display bug with TT1 CSS Grid galleries
Download this release

Release Info

Developer extendify
Plugin Icon 128x128 Extendify — Gutenberg Patterns and Templates
Version 0.1.0
Comparing to
See all releases

Version 0.1.0

Files changed (144) hide show
  1. LICENSE +339 -0
  2. app/Admin.php +180 -0
  3. app/ApiRouter.php +137 -0
  4. app/App.php +113 -0
  5. app/Controllers/AuthController.php +43 -0
  6. app/Controllers/MetaController.php +30 -0
  7. app/Controllers/PingController.php +30 -0
  8. app/Controllers/PluginController.php +57 -0
  9. app/Controllers/SiteSettingsController.php +42 -0
  10. app/Controllers/TaxonomyController.php +29 -0
  11. app/Controllers/TemplateController.php +43 -0
  12. app/Controllers/UserController.php +80 -0
  13. app/Frontend.php +70 -0
  14. app/Http.php +151 -0
  15. app/Plugin.php +34 -0
  16. app/Shared.php +298 -0
  17. app/SiteSettings.php +72 -0
  18. app/User.php +148 -0
  19. bootstrap.php +48 -0
  20. config.json +7 -0
  21. editorplus/EditorPlus.php +221 -0
  22. editorplus/editorplus-template.php +50 -0
  23. editorplus/editorplus.js +29 -0
  24. extendify.php +75 -0
  25. loader.php +50 -0
  26. public/.gitkeep +0 -0
  27. public/assets/preview.png +0 -0
  28. public/build/.gitkeep +0 -0
  29. public/build/extendify-utilities.css +7 -0
  30. public/build/extendify.css +1 -0
  31. public/build/extendify.js +2 -0
  32. public/build/extendify.js.LICENSE.txt +20 -0
  33. public/editorplus/.gitkeep +0 -0
  34. public/editorplus/editorplus.min.js +1 -0
  35. readme.txt +78 -0
  36. routes/api.php +48 -0
  37. src/ExtendifyLibrary.js +62 -0
  38. src/api/General.js +12 -0
  39. src/api/Plugins.js +19 -0
  40. src/api/SiteSettings.js +16 -0
  41. src/api/Taxonomies.js +7 -0
  42. src/api/Templates.js +63 -0
  43. src/api/User.js +54 -0
  44. src/api/axios.js +70 -0
  45. src/app.css +132 -0
  46. src/app.js +45 -0
  47. src/blocks/blocks.js +1 -0
  48. src/blocks/library/block.js +38 -0
  49. src/blocks/library/block.json +15 -0
  50. src/buttons.js +136 -0
  51. src/components/DevHelpers.js +32 -0
  52. src/components/FooterNotice.js +103 -0
  53. src/components/ImportCounter.js +62 -0
  54. src/components/ImportTemplateBlock.js +248 -0
  55. src/components/LibraryAccessModal.js +112 -0
  56. src/components/LoginInterface.js +218 -0
  57. src/components/SiteTypeSelector.js +241 -0
  58. src/components/TaxonomySection.js +49 -0
  59. src/components/TypeSelect.js +37 -0
  60. src/components/buttons/Primary.js +10 -0
  61. src/components/icons/index.js +13 -0
  62. src/components/icons/library/alert.js +25 -0
  63. src/components/icons/library/brand-block-icon.js +17 -0
  64. src/components/icons/library/brand-logo.js +32 -0
  65. src/components/icons/library/brand-mark.js +17 -0
  66. src/components/icons/library/download.js +21 -0
  67. src/components/icons/library/featured.js +21 -0
  68. src/components/icons/library/growth-arrow.js +18 -0
  69. src/components/icons/library/layouts.js +20 -0
  70. src/components/icons/library/patterns.js +54 -0
  71. src/components/icons/library/star.js +20 -0
  72. src/components/icons/library/success.js +70 -0
  73. src/components/icons/library/support.js +39 -0
  74. src/components/icons/library/user.js +17 -0
  75. src/components/modals/Modal.js +74 -0
  76. src/components/modals/SettingsModal.js +23 -0
  77. src/components/modals/SplitModal.js +51 -0
  78. src/components/notices/FeedbackNotice.js +27 -0
  79. src/components/notices/PromotionNotice.js +23 -0
  80. src/components/notices/WelcomeNotice.js +46 -0
  81. src/hooks/helpers.js +26 -0
  82. src/hooks/useTaxonomies.js +27 -0
  83. src/listeners/index.js +3 -0
  84. src/listeners/softerror-encountered.js +24 -0
  85. src/listeners/template-inserted.js +24 -0
  86. src/middleware/NeedsPermissionModal.js +65 -0
  87. src/middleware/NeedsRegistrationModal.js +142 -0
  88. src/middleware/ReloadRequiredModal.js +49 -0
  89. src/middleware/hasPluginsActivated/ActivatePluginsModal.js +78 -0
  90. src/middleware/hasPluginsActivated/ActivatingModal.js +58 -0
  91. src/middleware/hasPluginsActivated/ErrorActivating.js +34 -0
  92. src/middleware/hasPluginsActivated/index.js +19 -0
  93. src/middleware/hasRequiredPlugins/ErrorInstalling.js +33 -0
  94. src/middleware/hasRequiredPlugins/InstallingModal.js +57 -0
  95. src/middleware/hasRequiredPlugins/RequiredPluginsModal.js +95 -0
  96. src/middleware/hasRequiredPlugins/index.js +19 -0
  97. src/middleware/helpers.js +61 -0
  98. src/middleware/index.js +46 -0
  99. src/pages/GridView.js +199 -0
  100. src/pages/MainWindow.js +53 -0
  101. src/pages/Sidebar.js +77 -0
  102. src/pages/layout/HasSidebar.js +16 -0
  103. src/pages/layout/Layout.js +45 -0
  104. src/pages/layout/Toolbar.js +43 -0
  105. src/state/GlobalState.js +36 -0
  106. src/state/Importing.js +22 -0
  107. src/state/SiteSettings.js +21 -0
  108. src/state/Taxonomies.js +14 -0
  109. src/state/Templates.js +124 -0
  110. src/state/User.js +102 -0
  111. src/util/general.js +58 -0
  112. src/util/templateInjection.js +32 -0
  113. src/utility-control/index.js +122 -0
  114. utility-framework/block-styles/cover-angled.css +19 -0
  115. utility-framework/classes/clip-path.css +11 -0
  116. utility-framework/classes/columns.css +117 -0
  117. utility-framework/classes/direction.css +7 -0
  118. utility-framework/classes/editor/no-caption.css +3 -0
  119. utility-framework/classes/editor/no-inserter.css +10 -0
  120. utility-framework/classes/editor/no-resize.css +10 -0
  121. utility-framework/classes/editor/pointer-events.css +3 -0
  122. utility-framework/classes/fallback.css +10 -0
  123. utility-framework/classes/inline-list.css +19 -0
  124. utility-framework/classes/misc.css +4 -0
  125. utility-framework/classes/text-stroke.css +23 -0
  126. utility-framework/extendify-utilities.css +86 -0
  127. utility-framework/fallback/align.css +5 -0
  128. utility-framework/fallback/colors.css +51 -0
  129. utility-framework/fallback/font-sizes.css +36 -0
  130. utility-framework/fallback/grid.css +143 -0
  131. utility-framework/fallback/group.css +54 -0
  132. utility-framework/fallback/image.css +10 -0
  133. utility-framework/suggestions.json +570 -0
  134. vendor/autoload.php +7 -0
  135. vendor/composer/ClassLoader.php +445 -0
  136. vendor/composer/InstalledVersions.php +654 -0
  137. vendor/composer/LICENSE +21 -0
  138. vendor/composer/autoload_classmap.php +9 -0
  139. vendor/composer/autoload_namespaces.php +9 -0
  140. vendor/composer/autoload_psr4.php +10 -0
  141. vendor/composer/autoload_real.php +55 -0
  142. vendor/composer/autoload_static.php +31 -0
  143. vendor/composer/installed.json +1 -0
  144. vendor/composer/installed.php +395 -0
LICENSE ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
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
+ {description}
294
+ Copyright (C) {year} {fullname}
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.
app/Admin.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin.
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+ use Extendify\Library\User;
10
+ use Extendify\Library\SiteSettings;
11
+
12
+ /**
13
+ * This class handles any file loading for the admin area.
14
+ */
15
+ class Admin
16
+ {
17
+
18
+ /**
19
+ * The instance
20
+ *
21
+ * @var $instance
22
+ */
23
+ public static $instance = null;
24
+
25
+ /**
26
+ * Adds various actions to set up the page
27
+ *
28
+ * @return self|void
29
+ */
30
+ public function __construct()
31
+ {
32
+ if (self::$instance) {
33
+ return self::$instance;
34
+ }
35
+
36
+ self::$instance = $this;
37
+ $this->loadScripts();
38
+
39
+ \add_filter('plugin_action_links_' . EXTENDIFY_PLUGIN_BASENAME, [ $this, 'pluginActionLinks' ]);
40
+ }
41
+
42
+ /**
43
+ * Adds action links to the plugin list table
44
+ *
45
+ * @param array $links An array of plugin action links.
46
+ * @return array An array of plugin action links.
47
+ */
48
+ public function pluginActionLinks($links)
49
+ {
50
+ $theme = get_option('template');
51
+ $label = esc_html__('Upgrade', 'extendify');
52
+
53
+ $links['upgrade'] = sprintf('<a href="%1$s" target="_blank"><b>%2$s</b></a>', "https://extendify.com/pricing?utm_source=extendify-plugin&utm_medium=wp-dash&utm_campaign=action-link&utm_content=$label&utm_term=$theme", $label);
54
+
55
+ return $links;
56
+ }
57
+
58
+ /**
59
+ * Adds scripts to the admin
60
+ *
61
+ * @return void
62
+ */
63
+ public function loadScripts()
64
+ {
65
+ \add_action(
66
+ 'admin_enqueue_scripts',
67
+ function ($hook) {
68
+ if (!current_user_can(App::$requiredCapability)) {
69
+ return;
70
+ }
71
+
72
+ if (!$this->checkItsGutenbergPost($hook)) {
73
+ return;
74
+ }
75
+
76
+ if (!$this->isLibraryEnabled()) {
77
+ return;
78
+ }
79
+
80
+ $this->addScopedScriptsAndStyles();
81
+ }
82
+ );
83
+ }
84
+
85
+ /**
86
+ * Makes sure we are on the correct page
87
+ *
88
+ * @param string $hook - An optional hook provided by WP to identify the page.
89
+ * @return boolean
90
+ */
91
+ public function checkItsGutenbergPost($hook = '')
92
+ {
93
+ if (isset($GLOBALS['typenow']) && \use_block_editor_for_post_type($GLOBALS['typenow'])) {
94
+ return $hook && in_array($hook, ['post.php', 'post-new.php'], true);
95
+ }
96
+
97
+ return false;
98
+ }
99
+
100
+ /**
101
+ * Adds various JS scripts
102
+ *
103
+ * @return void
104
+ */
105
+ public function addScopedScriptsAndStyles()
106
+ {
107
+ $version = App::$environment === 'PRODUCTION' ? App::$version : uniqid();
108
+
109
+ \wp_register_script(
110
+ App::$slug . '-scripts',
111
+ EXTENDIFY_BASE_URL . 'public/build/extendify.js',
112
+ [
113
+ 'wp-i18n',
114
+ 'wp-components',
115
+ 'wp-element',
116
+ 'wp-editor',
117
+ ],
118
+ $version,
119
+ true
120
+ );
121
+ \wp_localize_script(
122
+ App::$slug . '-scripts',
123
+ 'extendifyData',
124
+ [
125
+ 'root' => \esc_url_raw(rest_url(APP::$slug . '/' . APP::$apiVersion)),
126
+ 'nonce' => \wp_create_nonce('wp_rest'),
127
+ 'user' => json_decode(User::data('extendifysdk_user_data'), true),
128
+ 'sitesettings' => json_decode(SiteSettings::data()),
129
+ 'sdk_partner' => \esc_attr(APP::$sdkPartner),
130
+ 'asset_path' => \esc_url(EXTENDIFY_URL . 'public/assets'),
131
+ ]
132
+ );
133
+ \wp_enqueue_script(App::$slug . '-scripts');
134
+
135
+ \wp_set_script_translations(App::$slug . '-scripts', App::$textDomain);
136
+
137
+ \wp_enqueue_style(
138
+ App::$slug,
139
+ EXTENDIFY_BASE_URL . 'public/build/extendify.css',
140
+ [],
141
+ $version,
142
+ 'all'
143
+ );
144
+
145
+ \wp_enqueue_style(
146
+ App::$slug . '-utilities',
147
+ EXTENDIFY_BASE_URL . 'public/build/extendify-utilities.css',
148
+ [],
149
+ $version,
150
+ 'all'
151
+ );
152
+ }
153
+
154
+ /**
155
+ * Check if current user is Admin
156
+ *
157
+ * @return Boolean
158
+ */
159
+ private function isAdmin()
160
+ {
161
+ return in_array('administrator', \wp_get_current_user()->roles, true);
162
+ }
163
+
164
+ /**
165
+ * Check if scripts should add
166
+ *
167
+ * @return Boolean
168
+ */
169
+ public function isLibraryEnabled()
170
+ {
171
+ $settings = json_decode(SiteSettings::data());
172
+
173
+ // If it's disabled, only show it for admins.
174
+ if (isset($settings->state) && (isset($settings->state->enabled)) && !$settings->state->enabled) {
175
+ return $this->isAdmin();
176
+ }
177
+
178
+ return true;
179
+ }
180
+ }
app/ApiRouter.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * API router
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+ use Extendify\Library\Http;
10
+
11
+ /**
12
+ * Simple router for the REST Endpoints
13
+ */
14
+ class ApiRouter extends \WP_REST_Controller
15
+ {
16
+
17
+ /**
18
+ * The class instance.
19
+ *
20
+ * @var $instance
21
+ */
22
+ protected static $instance = null;
23
+
24
+ /**
25
+ * The capablity required for access.
26
+ *
27
+ * @var $capability
28
+ */
29
+ protected $capability;
30
+
31
+
32
+ /**
33
+ * The constructor
34
+ */
35
+ public function __construct()
36
+ {
37
+ $this->capability = App::$requiredCapability;
38
+ add_filter(
39
+ 'rest_request_before_callbacks',
40
+ // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
41
+ function ($response, $handler, $request) {
42
+ // Add the request to our helper class.
43
+ if ($request->get_header('x_extendify')) {
44
+ Http::init($request);
45
+ }
46
+
47
+ return $response;
48
+ },
49
+ 10,
50
+ 3
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Check the authorization of the request
56
+ *
57
+ * @return boolean
58
+ */
59
+ public function checkPermission()
60
+ {
61
+ // Check for the nonce on the server (used by WP REST).
62
+ if (isset($_SERVER['HTTP_X_WP_NONCE']) && \wp_verify_nonce(sanitize_text_field(wp_unslash($_SERVER['HTTP_X_WP_NONCE'])), 'wp_rest')) {
63
+ return \current_user_can($this->capability);
64
+ }
65
+
66
+ return false;
67
+ }
68
+
69
+ /**
70
+ * Register dynamic routes
71
+ *
72
+ * @param string $namespace - The api name space.
73
+ * @param string $endpoint - The endpoint.
74
+ * @param function $callback - The callback to run.
75
+ *
76
+ * @return void
77
+ */
78
+ public function getHandler($namespace, $endpoint, $callback)
79
+ {
80
+ \register_rest_route(
81
+ $namespace,
82
+ $endpoint,
83
+ [
84
+ 'methods' => 'GET',
85
+ 'callback' => $callback,
86
+ 'permission_callback' => [
87
+ $this,
88
+ 'checkPermission',
89
+ ],
90
+ ]
91
+ );
92
+ }
93
+
94
+ /**
95
+ * The post handler
96
+ *
97
+ * @param string $namespace - The api name space.
98
+ * @param string $endpoint - The endpoint.
99
+ * @param string $callback - The callback to run.
100
+ *
101
+ * @return void
102
+ */
103
+ public function postHandler($namespace, $endpoint, $callback)
104
+ {
105
+ \register_rest_route(
106
+ $namespace,
107
+ $endpoint,
108
+ [
109
+ 'methods' => 'POST',
110
+ 'callback' => $callback,
111
+ 'permission_callback' => [
112
+ $this,
113
+ 'checkPermission',
114
+ ],
115
+ ]
116
+ );
117
+ }
118
+
119
+ /**
120
+ * The caller
121
+ *
122
+ * @param string $name - The name of the method to call.
123
+ * @param array $arguments - The arguments to pass in.
124
+ *
125
+ * @return mixed
126
+ */
127
+ public static function __callStatic($name, array $arguments)
128
+ {
129
+ $name = "{$name}Handler";
130
+ if (is_null(self::$instance)) {
131
+ self::$instance = new static();
132
+ }
133
+
134
+ $r = self::$instance;
135
+ return $r->$name(APP::$slug . '/' . APP::$apiVersion, ...$arguments);
136
+ }
137
+ }
app/App.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The App details file
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\Plugin;
9
+
10
+ /**
11
+ * Controller for handling various app data
12
+ */
13
+ class App
14
+ {
15
+
16
+ /**
17
+ * Plugin name
18
+ *
19
+ * @var string
20
+ */
21
+ public static $name = '';
22
+
23
+ /**
24
+ * Plugin slug
25
+ *
26
+ * @var string
27
+ */
28
+ public static $slug = '';
29
+
30
+ /**
31
+ * Plugin version
32
+ *
33
+ * @var string
34
+ */
35
+ public static $version = '';
36
+
37
+ /**
38
+ * Plugin API REST version
39
+ *
40
+ * @var string
41
+ */
42
+ public static $apiVersion = 'v1';
43
+
44
+ /**
45
+ * Plugin text domain
46
+ *
47
+ * @var string
48
+ */
49
+ public static $textDomain = '';
50
+
51
+ /**
52
+ * Plugin environment
53
+ *
54
+ * @var string
55
+ */
56
+ public static $environment = '';
57
+
58
+ /**
59
+ * The partner plugin/theme
60
+ *
61
+ * @var string
62
+ */
63
+ public static $sdkPartner = '';
64
+
65
+ /**
66
+ * Host plugin
67
+ *
68
+ * @var string
69
+ */
70
+ public static $requiredCapability = 'upload_files';
71
+
72
+ /**
73
+ * Plugin config
74
+ *
75
+ * @var array
76
+ */
77
+ public static $config = [];
78
+
79
+ /**
80
+ * Process the readme file to get version and name
81
+ *
82
+ * @return void
83
+ */
84
+ public function __construct()
85
+ {
86
+ // Set the "partner" plugin/theme here with a fallback to support the previous plugin implementation.
87
+ self::$sdkPartner = isset($GLOBALS['extendify_sdk_partner']) ? $GLOBALS['extendify_sdk_partner'] : '';
88
+ if (!self::$sdkPartner && isset($GLOBALS['extendifySdkSourcePlugin'])) {
89
+ self::$sdkPartner = $GLOBALS['extendifySdkSourcePlugin'];
90
+ }
91
+
92
+ // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
93
+ $readme = file_get_contents(dirname(__DIR__) . '/readme.txt');
94
+
95
+ preg_match('/=== (.+) ===/', $readme, $matches);
96
+ self::$name = $matches[1];
97
+ self::$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', self::$name), '-'));
98
+
99
+ preg_match('/Stable tag: ([0-9.:]+)/', $readme, $matches);
100
+ self::$version = $matches[1];
101
+
102
+ // An easy way to check if we are in dev mode is to look for a dev specific file.
103
+ $isDev = is_readable(EXTENDIFY_PATH . 'node_modules') || is_readable(EXTENDIFY_PATH . '.devbuild');
104
+ self::$environment = $isDev ? 'DEVELOPMENT' : 'PRODUCTION';
105
+
106
+ self::$textDomain = Plugin::getPluginInfo('TextDomain', self::$slug);
107
+
108
+ // Add the config.
109
+ // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
110
+ $config = file_get_contents(dirname(__DIR__) . '/config.json');
111
+ self::$config = json_decode($config, true);
112
+ }
113
+ }
app/Controllers/AuthController.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Auth
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for dealing registration and authentication
16
+ */
17
+ class AuthController
18
+ {
19
+
20
+ /**
21
+ * Login a user to extendify - it will return the API key
22
+ *
23
+ * @param \WP_REST_Request $request - The request.
24
+ * @return WP_REST_Response|WP_Error
25
+ */
26
+ public static function login($request)
27
+ {
28
+ $response = Http::post('/login', $request->get_params());
29
+ return new \WP_REST_Response($response);
30
+ }
31
+
32
+ /**
33
+ * Handle registration - It will return the API key.
34
+ *
35
+ * @param \WP_REST_Request $request - The request.
36
+ * @return WP_REST_Response|WP_Error
37
+ */
38
+ public static function register($request)
39
+ {
40
+ $response = Http::post('/register', $request->get_params());
41
+ return new \WP_REST_Response($response);
42
+ }
43
+ }
app/Controllers/MetaController.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Http requests
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for sending little bits of info
16
+ */
17
+ class MetaController
18
+ {
19
+ /**
20
+ * Send data about a specific topic
21
+ *
22
+ * @param \WP_REST_Request $request - The request.
23
+ * @return WP_REST_Response|WP_Error
24
+ */
25
+ public static function getAll($request)
26
+ {
27
+ $response = Http::get('/meta-data', $request->get_params());
28
+ return new \WP_REST_Response($response);
29
+ }
30
+ }
app/Controllers/PingController.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Http requests
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for sending little bits of info
16
+ */
17
+ class PingController
18
+ {
19
+ /**
20
+ * Send data about a specific topic
21
+ *
22
+ * @param \WP_REST_Request $request - The request.
23
+ * @return WP_REST_Response|WP_Error
24
+ */
25
+ public static function ping($request)
26
+ {
27
+ $response = Http::post('/ping', $request->get_params());
28
+ return new \WP_REST_Response($response);
29
+ }
30
+ }
app/Controllers/PluginController.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Plugins
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Plugin;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for plugin dependency checking, etc
16
+ */
17
+ class PluginController
18
+ {
19
+
20
+ /**
21
+ * Return all plugins
22
+ *
23
+ * @return array
24
+ */
25
+ public static function index()
26
+ {
27
+ if (! function_exists('get_plugins')) {
28
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
29
+ }
30
+
31
+ return \get_plugins();
32
+ }
33
+
34
+ /**
35
+ * List active plugins
36
+ *
37
+ * @return array
38
+ */
39
+ public static function active()
40
+ {
41
+ return \get_option('active_plugins');
42
+ }
43
+
44
+ /**
45
+ * Install plugins
46
+ *
47
+ * @return bool|WP_Error
48
+ */
49
+ public static function install()
50
+ {
51
+ if (!\current_user_can('activate_plugins')) {
52
+ return new \WP_Error('not_allowed', \__('You are not allowed to activate plugins on this site.', 'extendify'));
53
+ }
54
+
55
+ return true;
56
+ }
57
+ }
app/Controllers/SiteSettingsController.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls User info
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\SiteSettings;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for managing Extendify SiteSettings.
16
+ */
17
+ class SiteSettingsController
18
+ {
19
+
20
+ /**
21
+ * Return Current SiteSettings meta data
22
+ *
23
+ * @return array
24
+ */
25
+ public static function show()
26
+ {
27
+ return new \WP_REST_Response(SiteSettings::data());
28
+ }
29
+
30
+ /**
31
+ * Persist the data
32
+ *
33
+ * @param \WP_REST_Request $request - The request.
34
+ * @return array
35
+ */
36
+ public static function store($request)
37
+ {
38
+ $settingsData = json_decode($request->get_param('data'), true);
39
+ \update_option(SiteSettings::key(), $settingsData, true);
40
+ return new \WP_REST_Response(SiteSettings::data());
41
+ }
42
+ }
app/Controllers/TaxonomyController.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Taxonomies
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for dealing with taxonomies
16
+ */
17
+ class TaxonomyController
18
+ {
19
+ /**
20
+ * Return all taxonomies
21
+ *
22
+ * @return WP_REST_Response|WP_Error
23
+ */
24
+ public static function index()
25
+ {
26
+ $response = Http::get('/taxonomies', []);
27
+ return new \WP_REST_Response($response);
28
+ }
29
+ }
app/Controllers/TemplateController.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Http requests
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for dealing with templates
16
+ */
17
+ class TemplateController
18
+ {
19
+
20
+ /**
21
+ * Return info about a template
22
+ *
23
+ * @param \WP_REST_Request $request - The request.
24
+ * @return WP_REST_Response|WP_Error
25
+ */
26
+ public static function index($request)
27
+ {
28
+ $response = Http::post('/templates', $request->get_params());
29
+ return new \WP_REST_Response($response);
30
+ }
31
+
32
+ /**
33
+ * Send data about a specific template
34
+ *
35
+ * @param \WP_REST_Request $request - The request.
36
+ * @return WP_REST_Response|WP_Error
37
+ */
38
+ public static function ping($request)
39
+ {
40
+ $response = Http::post('/templates', $request->get_params());
41
+ return new \WP_REST_Response($response);
42
+ }
43
+ }
app/Controllers/UserController.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls User info
4
+ */
5
+
6
+ namespace Extendify\Library\Controllers;
7
+
8
+ use Extendify\Library\Http;
9
+ use Extendify\Library\User;
10
+
11
+ if (!defined('ABSPATH')) {
12
+ die('No direct access.');
13
+ }
14
+
15
+ /**
16
+ * The controller for managing user data like API keys, etc
17
+ */
18
+ class UserController
19
+ {
20
+
21
+ /**
22
+ * Return the current user state
23
+ *
24
+ * @return array
25
+ */
26
+ public static function show()
27
+ {
28
+ return new \WP_REST_Response(User::state());
29
+ }
30
+
31
+ /**
32
+ * Return meta info about the current user
33
+ *
34
+ * @param \WP_REST_Request $request - The request.
35
+ * @return array
36
+ */
37
+ public static function meta($request)
38
+ {
39
+ $key = \sanitize_text_field(\wp_unslash($request->get_param('key')));
40
+ return new \WP_REST_Response(User::data($key));
41
+ }
42
+
43
+ /**
44
+ * Persist the data
45
+ *
46
+ * @param \WP_REST_Request $request - The request.
47
+ * @return array
48
+ */
49
+ public static function store($request)
50
+ {
51
+ $userData = json_decode($request->get_param('data'), true);
52
+ // Keep this key for historical reasons.
53
+ \update_user_meta(\get_current_user_id(), 'extendifysdk_user_data', $userData);
54
+
55
+ return new \WP_REST_Response(User::state());
56
+ }
57
+
58
+ /**
59
+ * Sign up the user to the mailing list.
60
+ *
61
+ * @param \WP_REST_Request $request - The request.
62
+ * @return WP_REST_Response|WP_Error
63
+ */
64
+ public static function mailingList($request)
65
+ {
66
+ $response = Http::post('/register-mailing-list', $request->get_params());
67
+ return new \WP_REST_Response($response);
68
+ }
69
+
70
+ /**
71
+ * Get the max imports
72
+ *
73
+ * @return WP_REST_Response|WP_Error
74
+ */
75
+ public static function maxImports()
76
+ {
77
+ $response = Http::get('/max-free-imports');
78
+ return new \WP_REST_Response($response);
79
+ }
80
+ }
app/Frontend.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Manage any frontend related tasks here.
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+
10
+ /**
11
+ * This class handles any file loading for the frontend of the site.
12
+ */
13
+ class Frontend
14
+ {
15
+
16
+ /**
17
+ * The instance
18
+ *
19
+ * @var $instance
20
+ */
21
+ public static $instance = null;
22
+
23
+ /**
24
+ * Adds various actions to set up the page
25
+ *
26
+ * @return self|void
27
+ */
28
+ public function __construct()
29
+ {
30
+ if (self::$instance) {
31
+ return self::$instance;
32
+ }
33
+
34
+ self::$instance = $this;
35
+ $this->loadScripts();
36
+ }
37
+
38
+ /**
39
+ * Adds scripts and styles to every page is enabled
40
+ *
41
+ * @return void
42
+ */
43
+ public function loadScripts()
44
+ {
45
+ \add_action(
46
+ 'wp_enqueue_scripts',
47
+ function () {
48
+ // TODO: Determine a way to conditionally load assets (https://github.com/extendify/company-product/issues/72).
49
+ $this->addStylesheets();
50
+ }
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Adds stylesheets as needed
56
+ *
57
+ * @return void
58
+ */
59
+ public function addStylesheets()
60
+ {
61
+ $version = App::$environment === 'PRODUCTION' ? App::$version : uniqid();
62
+ \wp_enqueue_style(
63
+ App::$slug . '-utilities',
64
+ EXTENDIFY_BASE_URL . 'public/build/extendify-utilities.css',
65
+ [],
66
+ $version,
67
+ 'all'
68
+ );
69
+ }
70
+ }
app/Http.php ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for making http requests
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+ use Extendify\Library\User;
10
+
11
+ /**
12
+ * Controller for http communication
13
+ */
14
+ class Http
15
+ {
16
+
17
+ /**
18
+ * The api endpoint
19
+ *
20
+ * @var string
21
+ */
22
+ public $baseUrl = '';
23
+
24
+ /**
25
+ * Request data sent to the server
26
+ *
27
+ * @var array
28
+ */
29
+ public $data = [];
30
+
31
+ /**
32
+ * Any headers required
33
+ *
34
+ * @var array
35
+ */
36
+ public $headers = [];
37
+
38
+ /**
39
+ * The class instance.
40
+ *
41
+ * @var $instance
42
+ */
43
+ protected static $instance = null;
44
+
45
+ /**
46
+ * Set up the base object to send with every request
47
+ *
48
+ * @param \WP_REST_Request $request - The request.
49
+ * @return void
50
+ */
51
+ public function __construct($request)
52
+ {
53
+ // Redundant, but extra prodection!
54
+ if (!\wp_verify_nonce(sanitize_text_field(wp_unslash($request->get_header('x_wp_nonce'))), 'wp_rest')) {
55
+ return;
56
+ }
57
+
58
+ // Some special cases for development.
59
+ $this->baseUrl = $request->get_header('x_extendify_dev_mode') !== 'false' ? App::$config['api']['dev'] : App::$config['api']['live'];
60
+ $this->baseUrl = $request->get_header('x_extendify_local_mode') !== 'false' ? App::$config['api']['local'] : $this->baseUrl;
61
+
62
+ $this->data = [
63
+ 'wp_language' => \get_locale(),
64
+ 'wp_theme' => \get_option('template'),
65
+ 'mode' => App::$environment,
66
+ 'uuid' => User::data('uuid'),
67
+ 'library_version' => App::$version,
68
+ 'wp_active_plugins' => $request->get_method() === 'POST' ? \get_option('active_plugins') : [],
69
+ 'sdk_partner' => App::$sdkPartner,
70
+ ];
71
+
72
+ $this->headers = [
73
+ 'Accept' => 'application/json',
74
+ 'referer' => $request->get_header('referer'),
75
+ 'user_agent' => $request->get_header('user_agent'),
76
+ ];
77
+ }
78
+
79
+ /**
80
+ * Register dynamic routes
81
+ *
82
+ * @param string $endpoint - The endpoint.
83
+ * @param array $data - The data to include.
84
+ * @param array $headers - The headers to include.
85
+ *
86
+ * @return array
87
+ */
88
+ public function getHandler($endpoint, $data = [], $headers = [])
89
+ {
90
+ $url = \esc_url_raw(
91
+ \add_query_arg(
92
+ \urlencode_deep(\urldecode_deep(array_merge($this->data, $data))),
93
+ $this->baseUrl . $endpoint
94
+ )
95
+ );
96
+
97
+ $response = \wp_remote_get(
98
+ $url,
99
+ [
100
+ 'headers' => array_merge($this->headers, $headers),
101
+ ]
102
+ );
103
+
104
+ $responseBody = \wp_remote_retrieve_body($response);
105
+ return json_decode($responseBody, true);
106
+ }
107
+
108
+ /**
109
+ * Register dynamic routes
110
+ *
111
+ * @param string $endpoint - The endpoint.
112
+ * @param array $data - The arguments to include.
113
+ * @param array $headers - The headers to include.
114
+ *
115
+ * @return array
116
+ */
117
+ public function postHandler($endpoint, $data = [], $headers = [])
118
+ {
119
+ $response = \wp_remote_post(
120
+ $this->baseUrl . $endpoint,
121
+ [
122
+ 'headers' => array_merge($this->headers, $headers),
123
+ 'body' => array_merge($this->data, $data),
124
+ ]
125
+ );
126
+
127
+ $responseBody = \wp_remote_retrieve_body($response);
128
+ return json_decode($responseBody, true);
129
+ }
130
+
131
+ /**
132
+ * The caller
133
+ *
134
+ * @param string $name - The name of the method to call.
135
+ * @param array $arguments - The arguments to pass in.
136
+ *
137
+ * @return mixed
138
+ */
139
+ public static function __callStatic($name, array $arguments)
140
+ {
141
+ if ($name === 'init') {
142
+ self::$instance = new static($arguments[0]);
143
+ return;
144
+ }
145
+
146
+ $name = "{$name}Handler";
147
+ $r = self::$instance;
148
+
149
+ return $r->$name(...$arguments);
150
+ }
151
+ }
app/Plugin.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // phpcs:ignoreFile
3
+ // This class was copied from JetPack (mostly)
4
+ // so will be a bit of work to refactor
5
+ /**
6
+ * Manage plugin dependencies
7
+ */
8
+
9
+ namespace Extendify\Library;
10
+
11
+ class Plugin
12
+ {
13
+ /**
14
+ * Will return info about a plugin
15
+ *
16
+ * @param string $identifier The key of the plugin info.
17
+ * @param string $plugin_id The plugin identifier string.
18
+ * @return string
19
+ */
20
+ public static function getPluginInfo($identifier, $plugin_id)
21
+ {
22
+ if (!function_exists('get_plugins')) {
23
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
24
+ }
25
+
26
+ foreach (get_plugins() as $plugin => $data) {
27
+ if ($data[$identifier] === $plugin_id) {
28
+ return $plugin;
29
+ }
30
+ }
31
+
32
+ return false;
33
+ }
34
+ }
app/Shared.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Manage any shared assets that load within the editor and the front-end.
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+
10
+ /**
11
+ * This class handles assets that load within the editor and the front-end.
12
+ */
13
+ class Shared
14
+ {
15
+
16
+ /**
17
+ * The instance
18
+ *
19
+ * @var $instance
20
+ */
21
+ public static $instance = null;
22
+
23
+ /**
24
+ * Current theme
25
+ *
26
+ * @var string
27
+ */
28
+ // phpcs:ignore
29
+ private $theme;
30
+
31
+ /**
32
+ * Adds various actions to set up the page
33
+ *
34
+ * @return self|void
35
+ */
36
+ public function __construct()
37
+ {
38
+ if (self::$instance) {
39
+ return self::$instance;
40
+ }
41
+
42
+ self::$instance = $this;
43
+
44
+ // Load only if a compatible theme is active.
45
+ $this->theme = get_option('template');
46
+ if (in_array( $this->theme, $this->compatibleThemes(), true )) {
47
+ $this->loadScripts();
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Themes with additional compatibility
53
+ *
54
+ * @return array
55
+ */
56
+ public function compatibleThemes()
57
+ {
58
+ $themes = [
59
+ 'kadence',
60
+ 'neve',
61
+ 'blocksy',
62
+ 'go',
63
+ 'astra',
64
+ 'oceanwp',
65
+ 'generatepress',
66
+ 'twentytwentyone',
67
+ 'twentytwentytwo',
68
+ 'twentytwenty',
69
+ 'twentynineteen',
70
+ ];
71
+
72
+ return $themes;
73
+ }
74
+
75
+ /**
76
+ * Adds styles to the front-end and editor
77
+ *
78
+ * @return void
79
+ */
80
+ public function loadScripts()
81
+ {
82
+ \add_action(
83
+ 'wp_enqueue_scripts',
84
+ function () {
85
+ $this->themeCompatInlineStyles();
86
+ }
87
+ );
88
+
89
+ \add_action(
90
+ 'admin_enqueue_scripts',
91
+ function () {
92
+ $this->themeCompatInlineStyles();
93
+ }
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Inline styles to be applied for compatible themes
99
+ *
100
+ * @return void
101
+ */
102
+ // phpcs:ignore
103
+ public function themeCompatInlineStyles()
104
+ {
105
+ $css = '';
106
+
107
+ if ($this->theme === 'kadence') {
108
+ $css = 'body, .editor-styles-wrapper {
109
+ --wp--preset--color--background: var(--global-palette8);
110
+ --wp--preset--color--foreground: var(--global-palette4);
111
+ --wp--preset--color--primary: var(--global-palette1);
112
+ --wp--preset--color--secondary: var(--global-palette2);
113
+ --wp--preset--color--tertiary: var(--global-palette7);
114
+ --wp--custom--spacing--large: clamp(var(--global-sm-spacing), 5vw, var(--global-xxl-spacing));
115
+ --wp--preset--font-size--large: var(--h2FontSize);
116
+ --wp--preset--font-size--huge: var(--h1FontSize);
117
+ }';
118
+ }
119
+
120
+ if ($this->theme === 'neve') {
121
+ $css = 'body, .editor-styles-wrapper {
122
+ --wp--preset--color--background: var(--nv-site-bg);
123
+ --wp--preset--color--foreground: var(--nv-text-color);
124
+ --wp--preset--color--primary: var(--nv-primary-accent);
125
+ --wp--preset--color--secondary: var(--nv-secondary-accent);
126
+ --wp--preset--color--tertiary: var(--nv-light-bg);
127
+ --wp--custom--spacing--large: clamp(15px, 5vw, 80px);
128
+ --wp--preset--font-size--large: var(--h2FontSize);
129
+ --wp--preset--font-size--huge: var(--h1FontSize);
130
+ }';
131
+ }
132
+
133
+ if ($this->theme === 'blocksy') {
134
+ $css = 'body, .editor-styles-wrapper {
135
+ --wp--preset--color--background: var(--paletteColor7);
136
+ --wp--preset--color--foreground: var(--color);
137
+ --wp--preset--color--primary: var(--paletteColor1);
138
+ --wp--preset--color--secondary: var(--paletteColor4);
139
+ }';
140
+ }
141
+
142
+ if ($this->theme === 'go') {
143
+ $css = 'body, .editor-styles-wrapper {
144
+ --wp--preset--color--background: var(--go--color--background);
145
+ --wp--preset--color--foreground: var(--go--color--text);
146
+ }';
147
+ }
148
+
149
+ if ($this->theme === 'astra') {
150
+ $css = 'body, .editor-styles-wrapper {
151
+ --wp--preset--color--background: #ffffff;
152
+ --wp--preset--color--foreground: var(--ast-global-color-2);
153
+ --wp--preset--color--primary: var(--ast-global-color-0);
154
+ --wp--preset--color--secondary: var(--ast-global-color-2);
155
+ }';
156
+ }
157
+
158
+ if ($this->theme === 'oceanwp') {
159
+ $background = get_theme_mod( 'ocean_background_color', '#ffffff' );
160
+ $primary = get_theme_mod( 'ocean_primary_color', '#13aff0' );
161
+ $secondary = get_theme_mod( 'ocean_hover_primary_color', '#0b7cac' );
162
+ $gap = get_theme_mod( 'ocean_separate_content_padding', '30px' );
163
+
164
+ $css = 'body, .editor-styles-wrapper {
165
+ --wp--preset--color--background: ' . $background . ';
166
+ --wp--preset--color--foreground: #1B1B1B;
167
+ --wp--preset--color--primary: ' . $primary . ';
168
+ --wp--preset--color--secondary: ' . $secondary . ';
169
+ --wp--style--block-gap: ' . $gap . ';
170
+ --wp--custom--spacing--large: clamp(2rem, 7vw, 8rem);
171
+ }';
172
+ }
173
+
174
+ if ($this->theme === 'generatepress') {
175
+ $settings = (array) get_option( 'generate_settings', [] );
176
+
177
+ if (! array_key_exists( 'background_color', $settings )) {
178
+ $background = '#f7f8f9';
179
+ } else {
180
+ $background = $settings['background_color'];
181
+ }
182
+
183
+ if (! array_key_exists( 'text_color', $settings )) {
184
+ $foreground = '#222222';
185
+ } else {
186
+ $foreground = $settings['text_color'];
187
+ }
188
+
189
+ if (! array_key_exists( 'link_color', $settings )) {
190
+ $primary = '#1e73be';
191
+ } else {
192
+ $primary = $settings['link_color'];
193
+ }
194
+
195
+ if (! array_key_exists( 'link_color', $settings )) {
196
+ $primary = '#1e73be';
197
+ } else {
198
+ $primary = $settings['link_color'];
199
+ }
200
+
201
+ $css = 'body, .editor-styles-wrapper {
202
+ --wp--preset--color--background: ' . $background . ';
203
+ --wp--preset--color--foreground: ' . $foreground . ';
204
+ --wp--preset--color--primary: ' . $primary . ';
205
+ --wp--preset--color--secondary: #636363;
206
+ --wp--style--block-gap: 3rem;
207
+ --wp--custom--spacing--large: clamp(2rem, 7vw, 8rem);
208
+ --responsive--alignwide-width: 1120px;
209
+ }';
210
+ }//end if
211
+
212
+ if ($this->theme === 'twentytwentytwo') {
213
+ $css = 'body, .editor-styles-wrapper {
214
+ --extendify--spacing--large: clamp(2rem,8vw,8rem);
215
+ }';
216
+ }
217
+
218
+ if ($this->theme === 'twentytwentyone') {
219
+ $css = 'body, .editor-styles-wrapper {
220
+ --wp--preset--color--background: var(--global--color-background);
221
+ --wp--preset--color--foreground: var(--global--color-primary);
222
+ --wp--preset--color--primary: var(--global--color-gray);
223
+ --wp--preset--color--secondary: #464b56;
224
+ --wp--preset--color--tertiary: var(--global--color-light-gray);
225
+ --wp--style--block-gap: var(--global--spacing-unit);
226
+ --wp--preset--font-size--large: 2.5rem;
227
+ --wp--preset--font-size--huge: var(--global--font-size-xxl);
228
+ }
229
+ .has-foreground-background-color,
230
+ .has-primary-background-color,
231
+ .has-secondary-background-color {
232
+ --local--color-primary: var(--wp--preset--color--background);
233
+ --local--color-background: var(--wp--preset--color--primary);
234
+ }';
235
+ }
236
+
237
+ if ($this->theme === 'twentytwenty') {
238
+ $background = sanitize_hex_color_no_hash( get_theme_mod( 'background_color', 'f5efe0' ) );
239
+ $primary = get_theme_mod(
240
+ 'accent_accessible_colors',
241
+ [
242
+ 'content' => [ 'accent' => '#cd2653' ],
243
+ ]
244
+ );
245
+ $primary = $primary['content']['accent'];
246
+ $css = 'body, .editor-styles-wrapper {
247
+ --wp--preset--color--background: #' . $background . ';
248
+ --wp--preset--color--foreground: #000;
249
+ --wp--preset--color--primary: ' . $primary . ';
250
+ --wp--preset--color--secondary: #69603e;
251
+ --wp--style--block-gap: 3rem;
252
+ --wp--custom--spacing--large: clamp(2rem, 7vw, 8rem);
253
+ --responsive--alignwide-width: 120rem;
254
+ }';
255
+ }//end if
256
+
257
+ if ($this->theme === 'twentynineteen') {
258
+ /**
259
+ * Use the color from Twenty Nineteen's customizer value.
260
+ */
261
+ $primary = 199;
262
+ if (get_theme_mod( 'primary_color', 'default' ) !== 'default') {
263
+ $primary = absint( get_theme_mod( 'primary_color_hue', 199 ) );
264
+ }
265
+
266
+ /**
267
+ * Filters Twenty Nineteen default saturation level.
268
+ *
269
+ * @since Twenty Nineteen 1.0
270
+ *
271
+ * @param int $saturation Color saturation level.
272
+ */
273
+ // phpcs:ignore
274
+ $saturation = apply_filters( 'twentynineteen_custom_colors_saturation', 100 );
275
+ $saturation = absint( $saturation ) . '%';
276
+
277
+ /**
278
+ * Filters Twenty Nineteen default lightness level.
279
+ *
280
+ * @since Twenty Nineteen 1.0
281
+ *
282
+ * @param int $lightness Color lightness level.
283
+ */
284
+ // phpcs:ignore
285
+ $lightness = apply_filters( 'twentynineteen_custom_colors_lightness', 33 );
286
+ $lightness = absint( $lightness ) . '%';
287
+
288
+ $css = 'body, .editor-styles-wrapper {
289
+ --wp--preset--color--foreground: #111;
290
+ --wp--preset--color--primary: hsl( ' . $primary . ', ' . $saturation . ', ' . $lightness . ' );
291
+ --wp--preset--color--secondary: #767676;
292
+ --wp--preset--color--tertiary: #f7f7f7;
293
+ }';
294
+ }//end if
295
+
296
+ wp_add_inline_style( App::$slug . '-utilities', $css );
297
+ }
298
+ }
app/SiteSettings.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for interacting with the user
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ /**
9
+ * Helper class for interacting with the user
10
+ */
11
+ class SiteSettings
12
+ {
13
+
14
+ /**
15
+ * SiteSettings option_name - For historical reasons do not change.
16
+ *
17
+ * @var string
18
+ */
19
+ protected $key = 'extendifysdk_sitesettings';
20
+
21
+ /**
22
+ * SiteSettings default value
23
+ *
24
+ * @var Json
25
+ */
26
+ protected $default = '{"state":{"enabled":true}}';
27
+
28
+ /**
29
+ * The class instance.
30
+ *
31
+ * @var $instance
32
+ */
33
+ protected static $instance = null;
34
+
35
+ /**
36
+ * Returns Setting
37
+ * Use it like Setting::data()
38
+ *
39
+ * @return mixed - Setting Data
40
+ */
41
+ private function dataHandler()
42
+ {
43
+ return \get_option($this->key, $this->default);
44
+ }
45
+
46
+ /**
47
+ * Returns Setting Key
48
+ * Use it like Setting::key()
49
+ *
50
+ * @return string - Setting key
51
+ */
52
+ private function keyHandler()
53
+ {
54
+ return $this->key;
55
+ }
56
+
57
+ /**
58
+ * Use it like Setting::method() e.g. Setting::data()
59
+ *
60
+ * @param string $name - The name of the method to call.
61
+ * @param array $arguments - The arguments to pass in.
62
+ *
63
+ * @return mixed
64
+ */
65
+ public static function __callStatic($name, array $arguments)
66
+ {
67
+ $name = "{$name}Handler";
68
+ self::$instance = new static();
69
+ $r = self::$instance;
70
+ return $r->$name(...$arguments);
71
+ }
72
+ }
app/User.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for interacting with the user
4
+ */
5
+
6
+ namespace Extendify\Library;
7
+
8
+ use Extendify\Library\App;
9
+
10
+ /**
11
+ * Helper class for interacting with the user
12
+ */
13
+ class User
14
+ {
15
+
16
+ /**
17
+ * User unique, anonymous identifier
18
+ *
19
+ * @var string
20
+ */
21
+ public $uuid = '';
22
+
23
+ /**
24
+ * A WP user
25
+ *
26
+ * @var \WP_User
27
+ */
28
+ protected $user = null;
29
+
30
+ /**
31
+ * The DB key for scoping. For historical reasons do not change
32
+ *
33
+ * @var string
34
+ */
35
+ protected $key = 'extendifysdk_';
36
+
37
+ /**
38
+ * The class instance.
39
+ *
40
+ * @var $instance
41
+ */
42
+ protected static $instance = null;
43
+
44
+ /**
45
+ * Set up the user
46
+ *
47
+ * @param WP_User $user - A WP User object.
48
+ * @return void
49
+ */
50
+ public function __construct($user)
51
+ {
52
+ $this->user = $user;
53
+ }
54
+
55
+ /**
56
+ * Return the user ID
57
+ *
58
+ * @return void
59
+ */
60
+ private function setupUuid()
61
+ {
62
+ $uuid = \get_user_meta($this->user->ID, $this->key . 'uuid', true);
63
+ if (!$uuid) {
64
+ $id = \wp_hash(\wp_json_encode($this->user));
65
+ \update_user_meta($this->user->ID, $this->key . 'uuid', $id);
66
+ }
67
+
68
+ $this->uuid = $uuid;
69
+ }
70
+
71
+ /**
72
+ * Returns data about the user
73
+ * Use it like User::data('ID') to get the user id
74
+ *
75
+ * @param string $arguments - Right now a string of arguments, like ID.
76
+ * @return mixed - Data about the user.
77
+ */
78
+ private function dataHandler($arguments)
79
+ {
80
+ // Right now assume a single argument, but could expand to multiple.
81
+ if (isset($this->user->$arguments)) {
82
+ return $this->user->$arguments;
83
+ }
84
+
85
+ return \get_user_meta($this->user->ID, $this->key . $arguments, true);
86
+ }
87
+
88
+ /**
89
+ * Returns the application state for he current user
90
+ * Use it like User::data('ID') to get the user id
91
+ *
92
+ * @return string - JSON representation of the current state
93
+ */
94
+ private function stateHandler()
95
+ {
96
+ $state = \get_user_meta($this->user->ID, $this->key . 'user_data');
97
+
98
+ // Add some state boilerplate code for the first load.
99
+ if (!isset($state[0])) {
100
+ $state[0] = '{}';
101
+ }
102
+
103
+ $userData = json_decode($state[0], true);
104
+ if (!isset($userData['version'])) {
105
+ $userData['version'] = 0;
106
+ }
107
+
108
+ // This will reset the allowed imports to 0 once a week which will force the library to re-check.
109
+ if (!get_transient('extendify_import_max_check_' . $this->user->ID)) {
110
+ set_transient('extendify_import_max_check_' . $this->user->ID, time(), strtotime('1 week', 0));
111
+ $userData['state']['allowedImports'] = 0;
112
+ }
113
+
114
+ if (!$userData['state']['sdkPartner']) {
115
+ $userData['state']['sdkPartner'] = App::$sdkPartner;
116
+ }
117
+
118
+ $userData['state']['uuid'] = self::data('uuid');
119
+ $userData['state']['canInstallPlugins'] = \current_user_can('install_plugins');
120
+ $userData['state']['canActivatePlugins'] = \current_user_can('activate_plugins');
121
+ $userData['state']['isAdmin'] = \current_user_can('create_users');
122
+
123
+ return \wp_json_encode($userData);
124
+ }
125
+
126
+ /**
127
+ * Allows to dynamically setup the user with uuid
128
+ * Use it like User::data('ID') to get the user id
129
+ *
130
+ * @param string $name - The name of the method to call.
131
+ * @param array $arguments - The arguments to pass in.
132
+ *
133
+ * @return mixed
134
+ */
135
+ public static function __callStatic($name, array $arguments)
136
+ {
137
+ $name = "{$name}Handler";
138
+ if (is_null(self::$instance)) {
139
+ require_once ABSPATH . 'wp-includes/pluggable.php';
140
+ self::$instance = new static(\wp_get_current_user());
141
+ $r = self::$instance;
142
+ $r->setupUuid();
143
+ }
144
+
145
+ $r = self::$instance;
146
+ return $r->$name(...$arguments);
147
+ }
148
+ }
bootstrap.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Bootstrap the application
4
+ */
5
+
6
+ use Extendify\Library\Admin;
7
+ use Extendify\Library\Frontend;
8
+ use Extendify\Library\Shared;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ if (!defined('EXTENDIFY_PATH')) {
15
+ define('EXTENDIFY_PATH', \plugin_dir_path(__FILE__));
16
+ }
17
+
18
+ if (!defined('EXTENDIFY_URL')) {
19
+ define('EXTENDIFY_URL', \plugin_dir_url(__FILE__));
20
+ }
21
+
22
+ if (!defined('EXTENDIFY_PLUGIN_BASENAME')) {
23
+ define('EXTENDIFY_PLUGIN_BASENAME', \plugin_basename(__DIR__ . '/extendify.php'));
24
+ }
25
+
26
+ if (is_readable(EXTENDIFY_PATH . 'vendor/autoload.php')) {
27
+ require EXTENDIFY_PATH . 'vendor/autoload.php';
28
+ }
29
+
30
+ $extendifyAdmin = new Admin();
31
+ $extendifyFrontend = new Frontend();
32
+ $extendifyShared = new Shared();
33
+
34
+ require EXTENDIFY_PATH . 'routes/api.php';
35
+ require EXTENDIFY_PATH . 'editorplus/EditorPlus.php';
36
+
37
+ \add_action(
38
+ 'init',
39
+ function () {
40
+ \load_plugin_textdomain('extendify', false, EXTENDIFY_PATH . 'languages');
41
+ }
42
+ );
43
+
44
+ // To cover legacy conflicts.
45
+ // phpcs:ignore
46
+ class ExtendifySdk
47
+ {
48
+ }
config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ {
2
+ "api": {
3
+ "live": "https://dashboard.extendify.com/api",
4
+ "dev": "https://testing.extendify.com/api",
5
+ "local": "http://templates.test/api"
6
+ }
7
+ }
editorplus/EditorPlus.php ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles editor related changes.
4
+ * Loaded (or not) in /bootstrap.php
5
+ */
6
+
7
+ if (!class_exists('edpl__EditorPlus')) {
8
+ // phpcs:ignore Squiz.Classes.ClassFileName.NoMatch,Squiz.Commenting.ClassComment.Missing,PEAR.Commenting.ClassComment.Missing
9
+ final class ExtendifyEditorPlus
10
+ {
11
+
12
+ /**
13
+ * A reference to an instance of this class.
14
+ *
15
+ * @var $instance
16
+ */
17
+ public static $instance;
18
+
19
+ /**
20
+ * The array of templates that this plugin tracks.
21
+ *
22
+ * @var array $templates
23
+ */
24
+ protected $templates = ['editorplus-template.php' => 'Extendify Template'];
25
+
26
+ /**
27
+ * Returns an instance of this class.
28
+ *
29
+ * @return self
30
+ */
31
+ public static function getInstance()
32
+ {
33
+ if (!current_user_can('install_plugins')) {
34
+ return;
35
+ }
36
+
37
+ if (is_null(self::$instance)) {
38
+ self::$instance = new ExtendifyEditorPlus();
39
+ }
40
+
41
+ return self::$instance;
42
+ }
43
+
44
+ /**
45
+ * Check whether we need to use the Extendify/EP template.
46
+ */
47
+ public function __construct()
48
+ {
49
+ // Maybe show the styles on the frontend.
50
+ add_action('wp_head', function () {
51
+ if ($this->useDeprecatedTemplate()) {
52
+ $this->showStylesheet();
53
+ }
54
+ });
55
+
56
+ // Maybe show the styles in admin.
57
+ add_action('admin_head', function () {
58
+ if ($this->useDeprecatedTemplate()) {
59
+ $this->showStylesheet();
60
+ }
61
+ });
62
+
63
+ // Maybe load the JS to inject the admin styles.
64
+ add_action(
65
+ 'admin_enqueue_scripts',
66
+ function () {
67
+ wp_enqueue_script(
68
+ 'extendify-editorplus-scripts',
69
+ EXTENDIFY_BASE_URL . 'public/editorplus/editorplus.min.js',
70
+ [],
71
+ '1.0',
72
+ true
73
+ );
74
+ }
75
+ );
76
+
77
+ // Maybe add the body class name to the front end.
78
+ add_filter(
79
+ 'body_class',
80
+ function ($classes) {
81
+ if ($this->useDeprecatedTemplate()) {
82
+ $classes[] = 'eplus_styles';
83
+ }
84
+
85
+ return $classes;
86
+ }
87
+ );
88
+
89
+ // Maybe add the body class name to the admin.
90
+ add_filter(
91
+ 'admin_body_class',
92
+ function ($classes) {
93
+ if ($this->useDeprecatedTemplate()) {
94
+ $classes .= ' eplus_styles';
95
+ }
96
+
97
+ return $classes;
98
+ }
99
+ );
100
+
101
+ // Maybe register the template into WP.
102
+ add_filter('theme_page_templates', function ($templates) {
103
+ if (!$this->useDeprecatedTemplate()) {
104
+ return $templates;
105
+ }
106
+
107
+ return array_merge($templates, $this->templates);
108
+ });
109
+
110
+ // Maybe add template to the dropdown list.
111
+ add_filter('wp_insert_post_data', [$this, 'registerProjectTemplates']);
112
+
113
+ // Maybe add template file path.
114
+ add_filter('template_include', [$this, 'viewProjectTemplate']);
115
+ }
116
+
117
+ /**
118
+ * Checks whether the page needs the EP template
119
+ *
120
+ * @return boolean
121
+ */
122
+ public function useDeprecatedTemplate()
123
+ {
124
+ $post = get_post();
125
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended
126
+ if (is_admin() && isset($_GET['post'])) {
127
+ // This will populate on the admin.
128
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended
129
+ $post = get_post(sanitize_text_field(wp_unslash($_GET['post'])));
130
+ }
131
+
132
+ return isset($post->ID) && get_post_meta($post->ID, '_wp_page_template', true) === 'editorplus-template.php';
133
+ }
134
+
135
+ /**
136
+ * Used to echo out page template stylesheet if the page template is not active.
137
+ *
138
+ * @return void
139
+ */
140
+ public function showStylesheet()
141
+ {
142
+ $post = get_post();
143
+ $cssContent = apply_filters(
144
+ // For historical reasons do not change this key.
145
+ 'extendifysdk_template_css',
146
+ get_post_meta($post->ID, 'extendify_custom_stylesheet', true),
147
+ $post
148
+ );
149
+
150
+ // Note that esc_html() cannot be used because `div &gt; span` is not interpreted properly.
151
+ // See: https://github.com/WordPress/WordPress/blob/ccdb1766aead26d4cef79badb015bb2727fefd59/wp-includes/theme.php#L1824-L1833 for reference.
152
+ if ($cssContent) {
153
+ // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
154
+ echo "<style id='extendify-custom-stylesheet' type='text/css'>" . wp_strip_all_tags($cssContent) . '</style>';
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Adds our template to the pages cache in order to trick WordPress,
160
+ * into thinking the template file exists where it doens't really exist.
161
+ *
162
+ * @param array $attributes - The attributes.
163
+ * @return array
164
+ */
165
+ public function registerProjectTemplates($attributes)
166
+ {
167
+ if (!$this->useDeprecatedTemplate()) {
168
+ return $attributes;
169
+ }
170
+
171
+ // Create the key used for the themes cache.
172
+ $cacheKey = 'page_templates-' . wp_hash(get_theme_root() . '/' . get_stylesheet());
173
+ // Retrieve the cache list.
174
+ // If it doesn't exist, or it's empty prepare an array.
175
+ $templates = wp_get_theme()->get_page_templates();
176
+ if (empty($templates)) {
177
+ $templates = [];
178
+ }
179
+
180
+ // New cache, therefore remove the old one.
181
+ wp_cache_delete($cacheKey, 'themes');
182
+ // Now add our template to the list of templates by merging our templates.
183
+ // with the existing templates array from the cache.
184
+ $templates = array_merge($templates, $this->templates);
185
+ // Add the modified cache to allow WordPress to pick it up for listing available templates.
186
+ wp_cache_add($cacheKey, $templates, 'themes', 1800);
187
+ return $attributes;
188
+ }
189
+
190
+ /**
191
+ * Checks if the template is assigned to the page.
192
+ *
193
+ * @param string $template - The template.
194
+ * @return string
195
+ */
196
+ public function viewProjectTemplate($template)
197
+ {
198
+ $post = get_post();
199
+ if (!$post || !$this->useDeprecatedTemplate()) {
200
+ return $template;
201
+ }
202
+
203
+ $currentTemplate = get_post_meta($post->ID, '_wp_page_template', true);
204
+
205
+ // Check that the set template is one we have defined.
206
+ if (!is_string($currentTemplate) || !array_key_exists($currentTemplate, $this->templates)) {
207
+ return $template;
208
+ }
209
+
210
+ $file = plugin_dir_path(__FILE__) . $currentTemplate;
211
+ if (!file_exists($file)) {
212
+ return $template;
213
+ }
214
+
215
+ return $file;
216
+ }
217
+ // phpcs:ignore Squiz.Classes.ClassDeclaration.SpaceBeforeCloseBrace
218
+ }
219
+
220
+ add_action('after_setup_theme', ['ExtendifyEditorPlus', 'getInstance']);
221
+ }//end if
editorplus/editorplus-template.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Template Name: Extendify Template
4
+ * Template Post Type: post, page
5
+ */
6
+
7
+ ?>
8
+ <?php wp_head(); ?>
9
+ <body <?php body_class(); ?>>
10
+ <div class="ep-temp-container ep-container">
11
+
12
+ <div class="ep-temp-entry-content">
13
+ <?php
14
+ if (have_posts()) {
15
+ while (have_posts()) {
16
+ the_post();
17
+ the_content();
18
+ }
19
+ }
20
+ ?>
21
+
22
+ </div>
23
+
24
+
25
+ </div><!-- #site-content -->
26
+ <style>
27
+ .ep-temp-container {
28
+ margin-left: auto;
29
+ margin-right: auto;
30
+ }
31
+ @media(min-width: 700px) {
32
+ .ep-temp-container [class*=extendify-] [class*=wp-block] > * {
33
+ margin-top: 0px;
34
+ }
35
+ .ep-temp-container [class*=wp-block] > * .wp-block-button__link {
36
+ border-radius: 0px !important;
37
+ }
38
+ .ep-temp-container .wp-block-image:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter) {
39
+ margin-top:0px;
40
+ }
41
+ body {background-color: #fff;}
42
+ html, body {
43
+ font-size: 16px !important;
44
+ }
45
+ }
46
+ </style>
47
+ </body>
48
+
49
+ <?php
50
+ wp_footer();
editorplus/editorplus.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Quick method to hide the title if the template is active
2
+ if (window._wpLoadBlockEditor) {
3
+ const finished = window.wp.data.subscribe(() => {
4
+ const epTemplateSelected =
5
+ window.wp.data
6
+ .select('core/editor')
7
+ .getEditedPostAttribute('template') ===
8
+ 'editorplus-template.php'
9
+ const title = document.querySelector(
10
+ '.edit-post-visual-editor__post-title-wrapper',
11
+ )
12
+ const wrapper = document.querySelector('.editor-styles-wrapper')
13
+
14
+ // Too early
15
+ if (!title || !wrapper) return
16
+
17
+ if (epTemplateSelected) {
18
+ // GB needs to compute the height first
19
+ Promise.resolve().then(() => (title.style.display = 'none'))
20
+ wrapper.style.paddingTop = '0'
21
+ wrapper.style.backgroundColor = '#ffffff'
22
+ } else {
23
+ title.style.removeProperty('display')
24
+ wrapper.style.removeProperty('padding-top')
25
+ wrapper.style.removeProperty('background-color')
26
+ }
27
+ finished()
28
+ })
29
+ }
extendify.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Name: Extendify
4
+ * Description: Extendify is the platform of site design and creation tools for people that want to build a beautiful WordPress website with a library of patterns and full page layouts for the Gutenberg block editor.
5
+ * Plugin URI: https://extendify.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash
6
+ * Author: Extendify.com
7
+ * Author URI: https://extendify.com/?utm_source=wp-plugins&utm_campaign=author-uri&utm_medium=wp-dash
8
+ * Version: 0.1.0
9
+ * License: GPL-2.0-or-later
10
+ * License URI: https://www.gnu.org/licenses/gpl-2.0.html
11
+ * Text Domain: extendify
12
+ *
13
+ * Extendify is free software: you can redistribute it and/or modify
14
+ * it under the terms of the GNU General Public License as published by
15
+ * the Free Software Foundation, either version 2 of the License, or
16
+ * any later version.
17
+ *
18
+ * Extendify is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ * GNU General Public License for more details.
22
+ */
23
+
24
+ if (!defined('ABSPATH')) {
25
+ exit;
26
+ }
27
+
28
+ /** ExtendifySdk is the previous class name used */
29
+ if (!class_exists('ExtendifySdk') && !class_exists('Extendify')) :
30
+
31
+ /**
32
+ * The Extendify Library
33
+ */
34
+ // phpcs:ignore Squiz.Classes.ClassFileName.NoMatch,Squiz.Commenting.ClassComment.Missing,PEAR.Commenting.ClassComment.Missing
35
+ final class Extendify
36
+ {
37
+
38
+ /**
39
+ * Var to make sure we only load once
40
+ *
41
+ * @var boolean $loaded
42
+ */
43
+ public static $loaded = false;
44
+
45
+ /**
46
+ * Set up the Library
47
+ *
48
+ * @return void
49
+ */
50
+ public function __invoke()
51
+ {
52
+ // Allow users to disable the libary. The latter is left in for historical reasons.
53
+ if (!apply_filters('extendify_load_library', true) || !apply_filters('extendifysdk_load_library', true)) {
54
+ return;
55
+ }
56
+
57
+ if (version_compare(PHP_VERSION, '5.6', '<') || version_compare($GLOBALS['wp_version'], '5.5', '<')) {
58
+ return;
59
+ }
60
+
61
+ if (!self::$loaded) {
62
+ self::$loaded = true;
63
+ require dirname(__FILE__) . '/bootstrap.php';
64
+ $app = new Extendify\Library\App();
65
+ if (!defined('EXTENDIFY_BASE_URL')) {
66
+ define('EXTENDIFY_BASE_URL', plugin_dir_url(__FILE__));
67
+ }
68
+ }
69
+ }
70
+ // phpcs:ignore Squiz.Classes.ClassDeclaration.SpaceBeforeCloseBrace
71
+ }
72
+
73
+ $extendify = new Extendify();
74
+ $extendify();
75
+ endif;
loader.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This file is used to help side load the library.
4
+ * Be sure to remove the front matter from extendify.php
5
+ */
6
+
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ if (!function_exists('extendifyCheckPluginInstalled')) {
12
+ /**
13
+ * Will be truthy if the plugin is installed.
14
+ *
15
+ * @param string $name name of the plugin 'extendify'.
16
+ * @return bool|string - will return path, ex. 'extendify/extendify.php'.
17
+ */
18
+ function extendifyCheckPluginInstalled($name)
19
+ {
20
+ if (!function_exists('get_plugins')) {
21
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
22
+ }
23
+
24
+ foreach (get_plugins() as $plugin => $data) {
25
+ if ($data['TextDomain'] === $name) {
26
+ return $plugin;
27
+ }
28
+ }
29
+
30
+ return false;
31
+ }
32
+ }//end if
33
+
34
+ $extendifyPluginName = extendifyCheckPluginInstalled('extendify');
35
+ if ($extendifyPluginName) {
36
+ // Exit if the library is installed and active.
37
+ // Remember, this file is only loaded by partner plugins.
38
+ if (is_plugin_active($extendifyPluginName)) {
39
+ // If the SDK is active then ignore the partner plugins.
40
+ $GLOBALS['extendify_sdk_partner'] = '';
41
+ return false;
42
+ }
43
+ }
44
+
45
+ // Next is first come, first serve. The later class is left in for historical reasons.
46
+ if (class_exists('Extendify') || class_exists('ExtendifySdk')) {
47
+ return false;
48
+ }
49
+
50
+ require_once plugin_dir_path(__FILE__) . 'extendify.php';
public/.gitkeep ADDED
File without changes
public/assets/preview.png ADDED
Binary file
public/build/.gitkeep ADDED
File without changes
public/build/extendify-utilities.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ .ext-absolute{position:absolute!important}.ext-relative{position:relative!important}.ext-top-base{top:var(--wp--style--block-gap,2rem)!important}.ext-top-lg{top:var(--extendify--spacing--large)!important}.ext--top-base{top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--top-lg{top:calc(var(--extendify--spacing--large)*-1)!important}.ext-right-base{right:var(--wp--style--block-gap,2rem)!important}.ext-right-lg{right:var(--extendify--spacing--large)!important}.ext--right-base{right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--right-lg{right:calc(var(--extendify--spacing--large)*-1)!important}.ext-bottom-base{bottom:var(--wp--style--block-gap,2rem)!important}.ext-bottom-lg{bottom:var(--extendify--spacing--large)!important}.ext--bottom-base{bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--bottom-lg{bottom:calc(var(--extendify--spacing--large)*-1)!important}.ext-left-base{left:var(--wp--style--block-gap,2rem)!important}.ext-left-lg{left:var(--extendify--spacing--large)!important}.ext--left-base{left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--left-lg{left:calc(var(--extendify--spacing--large)*-1)!important}.ext-order-1{order:1!important}.ext-order-2{order:2!important}.ext-col-auto{grid-column:auto!important}.ext-col-span-1{grid-column:span 1/span 1!important}.ext-col-span-2{grid-column:span 2/span 2!important}.ext-col-span-3{grid-column:span 3/span 3!important}.ext-col-span-4{grid-column:span 4/span 4!important}.ext-col-span-5{grid-column:span 5/span 5!important}.ext-col-span-6{grid-column:span 6/span 6!important}.ext-col-span-7{grid-column:span 7/span 7!important}.ext-col-span-8{grid-column:span 8/span 8!important}.ext-col-span-9{grid-column:span 9/span 9!important}.ext-col-span-10{grid-column:span 10/span 10!important}.ext-col-span-11{grid-column:span 11/span 11!important}.ext-col-span-12{grid-column:span 12/span 12!important}.ext-col-span-full{grid-column:1/-1!important}.ext-col-start-1{grid-column-start:1!important}.ext-col-start-2{grid-column-start:2!important}.ext-col-start-3{grid-column-start:3!important}.ext-col-start-4{grid-column-start:4!important}.ext-col-start-5{grid-column-start:5!important}.ext-col-start-6{grid-column-start:6!important}.ext-col-start-7{grid-column-start:7!important}.ext-col-start-8{grid-column-start:8!important}.ext-col-start-9{grid-column-start:9!important}.ext-col-start-10{grid-column-start:10!important}.ext-col-start-11{grid-column-start:11!important}.ext-col-start-12{grid-column-start:12!important}.ext-col-start-13{grid-column-start:13!important}.ext-col-start-auto{grid-column-start:auto!important}.ext-col-end-1{grid-column-end:1!important}.ext-col-end-2{grid-column-end:2!important}.ext-col-end-3{grid-column-end:3!important}.ext-col-end-4{grid-column-end:4!important}.ext-col-end-5{grid-column-end:5!important}.ext-col-end-6{grid-column-end:6!important}.ext-col-end-7{grid-column-end:7!important}.ext-col-end-8{grid-column-end:8!important}.ext-col-end-9{grid-column-end:9!important}.ext-col-end-10{grid-column-end:10!important}.ext-col-end-11{grid-column-end:11!important}.ext-col-end-12{grid-column-end:12!important}.ext-col-end-13{grid-column-end:13!important}.ext-col-end-auto{grid-column-end:auto!important}.ext-row-auto{grid-row:auto!important}.ext-row-span-1{grid-row:span 1/span 1!important}.ext-row-span-2{grid-row:span 2/span 2!important}.ext-row-span-3{grid-row:span 3/span 3!important}.ext-row-span-4{grid-row:span 4/span 4!important}.ext-row-span-5{grid-row:span 5/span 5!important}.ext-row-span-6{grid-row:span 6/span 6!important}.ext-row-span-full{grid-row:1/-1!important}.ext-row-start-1{grid-row-start:1!important}.ext-row-start-2{grid-row-start:2!important}.ext-row-start-3{grid-row-start:3!important}.ext-row-start-4{grid-row-start:4!important}.ext-row-start-5{grid-row-start:5!important}.ext-row-start-6{grid-row-start:6!important}.ext-row-start-7{grid-row-start:7!important}.ext-row-start-auto{grid-row-start:auto!important}.ext-row-end-1{grid-row-end:1!important}.ext-row-end-2{grid-row-end:2!important}.ext-row-end-3{grid-row-end:3!important}.ext-row-end-4{grid-row-end:4!important}.ext-row-end-5{grid-row-end:5!important}.ext-row-end-6{grid-row-end:6!important}.ext-row-end-7{grid-row-end:7!important}.ext-row-end-auto{grid-row-end:auto!important}.ext-m-0:not([style*=margin]){margin:0!important}.ext-m-auto:not([style*=margin]){margin:auto!important}.ext-m-base:not([style*=margin]){margin:var(--wp--style--block-gap,2rem)!important}.ext-m-lg:not([style*=margin]){margin:var(--extendify--spacing--large)!important}.ext--m-base:not([style*=margin]){margin:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--m-lg:not([style*=margin]){margin:calc(var(--extendify--spacing--large)*-1)!important}.ext-mx-0:not([style*=margin]){margin-left:0!important;margin-right:0!important}.ext-mx-auto:not([style*=margin]){margin-left:auto!important;margin-right:auto!important}.ext-mx-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important;margin-right:var(--wp--style--block-gap,2rem)!important}.ext-mx-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important;margin-right:var(--extendify--spacing--large)!important}.ext--mx-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--mx-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important;margin-right:calc(var(--extendify--spacing--large)*-1)!important}.ext-my-0:not([style*=margin]){margin-bottom:0!important;margin-top:0!important}.ext-my-auto:not([style*=margin]){margin-bottom:auto!important;margin-top:auto!important}.ext-my-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important;margin-top:var(--wp--style--block-gap,2rem)!important}.ext-my-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important;margin-top:var(--extendify--spacing--large)!important}.ext--my-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--my-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important;margin-top:calc(var(--extendify--spacing--large)*-1)!important}.ext-mt-0:not([style*=margin]){margin-top:0!important}.ext-mt-auto:not([style*=margin]){margin-top:auto!important}.ext-mt-base:not([style*=margin]){margin-top:var(--wp--style--block-gap,2rem)!important}.ext-mt-lg:not([style*=margin]){margin-top:var(--extendify--spacing--large)!important}.ext--mt-base:not([style*=margin]){margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--mt-lg:not([style*=margin]){margin-top:calc(var(--extendify--spacing--large)*-1)!important}.ext-mr-0:not([style*=margin]){margin-right:0!important}.ext-mr-auto:not([style*=margin]){margin-right:auto!important}.ext-mr-base:not([style*=margin]){margin-right:var(--wp--style--block-gap,2rem)!important}.ext-mr-lg:not([style*=margin]){margin-right:var(--extendify--spacing--large)!important}.ext--mr-base:not([style*=margin]){margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--mr-lg:not([style*=margin]){margin-right:calc(var(--extendify--spacing--large)*-1)!important}.ext-mb-0:not([style*=margin]){margin-bottom:0!important}.ext-mb-auto:not([style*=margin]){margin-bottom:auto!important}.ext-mb-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important}.ext-mb-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important}.ext--mb-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--mb-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important}.ext-ml-0:not([style*=margin]){margin-left:0!important}.ext-ml-auto:not([style*=margin]){margin-left:auto!important}.ext-ml-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important}.ext-ml-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important}.ext--ml-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.ext--ml-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important}.ext-block{display:block!important}.ext-inline-block{display:inline-block!important}.ext-inline{display:inline!important}.ext-flex{display:flex!important}.ext-inline-flex{display:inline-flex!important}.ext-grid{display:grid!important}.ext-inline-grid{display:inline-grid!important}.ext-hidden{display:none!important}.ext-w-auto{width:auto!important}.ext-w-full{width:100%!important}.ext-max-w-full{max-width:100%!important}.ext-flex-1{flex:1 1 0%!important}.ext-flex-auto{flex:1 1 auto!important}.ext-flex-initial{flex:0 1 auto!important}.ext-flex-none{flex:none!important}.ext-flex-shrink-0{flex-shrink:0!important}.ext-flex-shrink{flex-shrink:1!important}.ext-flex-grow-0{flex-grow:0!important}.ext-flex-grow{flex-grow:1!important}.ext-list-none{list-style-type:none!important}.ext-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.ext-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.ext-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.ext-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.ext-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))!important}.ext-grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))!important}.ext-grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))!important}.ext-grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))!important}.ext-grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))!important}.ext-grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))!important}.ext-grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))!important}.ext-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))!important}.ext-grid-cols-none{grid-template-columns:none!important}.ext-grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))!important}.ext-grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))!important}.ext-grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))!important}.ext-grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))!important}.ext-grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))!important}.ext-grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))!important}.ext-grid-rows-none{grid-template-rows:none!important}.ext-flex-row{flex-direction:row!important}.ext-flex-row-reverse{flex-direction:row-reverse!important}.ext-flex-col{flex-direction:column!important}.ext-flex-col-reverse{flex-direction:column-reverse!important}.ext-flex-wrap{flex-wrap:wrap!important}.ext-flex-wrap-reverse{flex-wrap:wrap-reverse!important}.ext-flex-nowrap{flex-wrap:nowrap!important}.ext-items-start{align-items:flex-start!important}.ext-items-end{align-items:flex-end!important}.ext-items-center{align-items:center!important}.ext-items-baseline{align-items:baseline!important}.ext-items-stretch{align-items:stretch!important}.ext-justify-start{justify-content:flex-start!important}.ext-justify-end{justify-content:flex-end!important}.ext-justify-center{justify-content:center!important}.ext-justify-between{justify-content:space-between!important}.ext-justify-around{justify-content:space-around!important}.ext-justify-evenly{justify-content:space-evenly!important}.ext-justify-items-start{justify-items:start!important}.ext-justify-items-end{justify-items:end!important}.ext-justify-items-center{justify-items:center!important}.ext-justify-items-stretch{justify-items:stretch!important}.ext-gap-0{gap:0!important}.ext-gap-base{gap:var(--wp--style--block-gap,2rem)!important}.ext-gap-lg{gap:var(--extendify--spacing--large)!important}.ext-gap-x-0{-moz-column-gap:0!important;column-gap:0!important}.ext-gap-x-base{-moz-column-gap:var(--wp--style--block-gap,2rem)!important;column-gap:var(--wp--style--block-gap,2rem)!important}.ext-gap-x-lg{-moz-column-gap:var(--extendify--spacing--large)!important;column-gap:var(--extendify--spacing--large)!important}.ext-gap-y-0{row-gap:0!important}.ext-gap-y-base{row-gap:var(--wp--style--block-gap,2rem)!important}.ext-gap-y-lg{row-gap:var(--extendify--spacing--large)!important}.ext-justify-self-auto{justify-self:auto!important}.ext-justify-self-start{justify-self:start!important}.ext-justify-self-end{justify-self:end!important}.ext-justify-self-center{justify-self:center!important}.ext-justify-self-stretch{justify-self:stretch!important}.ext-rounded-none{border-radius:0!important}.ext-rounded-full{border-radius:9999px!important}.ext-rounded-t-none{border-top-left-radius:0!important;border-top-right-radius:0!important}.ext-rounded-t-full{border-top-left-radius:9999px!important;border-top-right-radius:9999px!important}.ext-rounded-r-none{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.ext-rounded-r-full{border-bottom-right-radius:9999px!important;border-top-right-radius:9999px!important}.ext-rounded-b-none{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ext-rounded-b-full{border-bottom-left-radius:9999px!important;border-bottom-right-radius:9999px!important}.ext-rounded-l-none{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.ext-rounded-l-full{border-bottom-left-radius:9999px!important;border-top-left-radius:9999px!important}.ext-rounded-tl-none{border-top-left-radius:0!important}.ext-rounded-tl-full{border-top-left-radius:9999px!important}.ext-rounded-tr-none{border-top-right-radius:0!important}.ext-rounded-tr-full{border-top-right-radius:9999px!important}.ext-rounded-br-none{border-bottom-right-radius:0!important}.ext-rounded-br-full{border-bottom-right-radius:9999px!important}.ext-rounded-bl-none{border-bottom-left-radius:0!important}.ext-rounded-bl-full{border-bottom-left-radius:9999px!important}.ext-border-0{border-width:0!important}.ext-border-t-0{border-top-width:0!important}.ext-border-r-0{border-right-width:0!important}.ext-border-b-0{border-bottom-width:0!important}.ext-border-l-0{border-left-width:0!important}.ext-p-0:not([style*=padding]){padding:0!important}.ext-p-base:not([style*=padding]){padding:var(--wp--style--block-gap,2rem)!important}.ext-p-lg:not([style*=padding]){padding:var(--extendify--spacing--large)!important}.ext-px-0:not([style*=padding]){padding-left:0!important;padding-right:0!important}.ext-px-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important;padding-right:var(--wp--style--block-gap,2rem)!important}.ext-px-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important;padding-right:var(--extendify--spacing--large)!important}.ext-py-0:not([style*=padding]){padding-bottom:0!important;padding-top:0!important}.ext-py-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important;padding-top:var(--wp--style--block-gap,2rem)!important}.ext-py-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important;padding-top:var(--extendify--spacing--large)!important}.ext-pt-0:not([style*=padding]){padding-top:0!important}.ext-pt-base:not([style*=padding]){padding-top:var(--wp--style--block-gap,2rem)!important}.ext-pt-lg:not([style*=padding]){padding-top:var(--extendify--spacing--large)!important}.ext-pr-0:not([style*=padding]){padding-right:0!important}.ext-pr-base:not([style*=padding]){padding-right:var(--wp--style--block-gap,2rem)!important}.ext-pr-lg:not([style*=padding]){padding-right:var(--extendify--spacing--large)!important}.ext-pb-0:not([style*=padding]){padding-bottom:0!important}.ext-pb-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important}.ext-pb-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important}.ext-pl-0:not([style*=padding]){padding-left:0!important}.ext-pl-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important}.ext-pl-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important}.ext-text-left{text-align:left!important}.ext-text-center{text-align:center!important}.ext-text-right{text-align:right!important}.ext-leading-none{line-height:1!important}.ext-leading-tight{line-height:1.25!important}.ext-leading-snug{line-height:1.375!important}.ext-leading-normal{line-height:1.5!important}.ext-leading-relaxed{line-height:1.625!important}.ext-leading-loose{line-height:2!important}.clip-path--rhombus img{-webkit-clip-path:polygon(15% 6%,80% 29%,84% 93%,23% 69%);clip-path:polygon(15% 6%,80% 29%,84% 93%,23% 69%)}.clip-path--diamond img{-webkit-clip-path:polygon(5% 29%,60% 2%,91% 64%,36% 89%);clip-path:polygon(5% 29%,60% 2%,91% 64%,36% 89%)}.clip-path--rhombus-alt img{-webkit-clip-path:polygon(14% 9%,85% 24%,91% 89%,19% 76%);clip-path:polygon(14% 9%,85% 24%,91% 89%,19% 76%)}.wp-block-columns[class*=fullwidth-cols]{margin-bottom:unset}.ext .wp-block-columns .wp-block-column[style*=padding]{padding-left:0!important;padding-right:0!important}.ext .wp-block-columns+.wp-block-columns:not([class*=mt-]):not([class*=my-]):not([style*=margin]){margin-top:0!important}[class*=fullwidth-cols] .wp-block-column:first-child,[class*=fullwidth-cols] .wp-block-group:first-child{margin-top:0}[class*=fullwidth-cols] .wp-block-column:last-child,[class*=fullwidth-cols] .wp-block-group:last-child{margin-bottom:0}[class*=fullwidth-cols] .wp-block-column:first-child>*,[class*=fullwidth-cols] .wp-block-column>:first-child{margin-top:0}.ext .is-not-stacked-on-mobile .wp-block-column,[class*=fullwidth-cols] .wp-block-column>:last-child{margin-bottom:0}.wp-block-columns[class*=fullwidth-cols]:not(.is-not-stacked-on-mobile)>.wp-block-column:not(:last-child){margin-bottom:var(--wp--style--block-gap,2rem)}@media (min-width:782px){.wp-block-columns[class*=fullwidth-cols]:not(.is-not-stacked-on-mobile)>.wp-block-column:not(:last-child){margin-bottom:0}}.wp-block-columns[class*=fullwidth-cols].is-not-stacked-on-mobile>.wp-block-column{margin-bottom:0!important}@media (min-width:600px) and (max-width:781px){.wp-block-columns[class*=fullwidth-cols]:not(.is-not-stacked-on-mobile)>.wp-block-column:nth-child(2n){margin-left:var(--wp--style--block-gap,2em)}}@media (max-width:781px){.tablet\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile){flex-wrap:wrap}.tablet\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important;margin-left:0!important}}@media (max-width:1079px){.desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile){flex-wrap:wrap}.desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important;margin-left:0!important}.desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column:not(:last-child){margin-bottom:var(--wp--style--block-gap,2rem)!important}}.direction-rtl{direction:rtl}.direction-ltr{direction:ltr}.is-style-inline-list{padding-left:0!important}.is-style-inline-list li{list-style-type:none!important}@media (min-width:782px){.is-style-inline-list li{display:inline!important;margin-right:var(--wp--style--block-gap,2rem)!important}}@media (min-width:782px){.is-style-inline-list li:first-child{margin-left:0!important}}@media (min-width:782px){.is-style-inline-list li:last-child{margin-right:0!important}}.bring-to-front{position:relative;z-index:10}.text-stroke{-webkit-text-stroke-color:var(--wp--preset--color--background)}.text-stroke,.text-stroke--primary{-webkit-text-stroke-width:var(
2
+ --wp--custom--typography--text-stroke-width,2px
3
+ )}.text-stroke--primary{-webkit-text-stroke-color:var(--wp--preset--color--primary)}.text-stroke--secondary{-webkit-text-stroke-width:var(
4
+ --wp--custom--typography--text-stroke-width,2px
5
+ );-webkit-text-stroke-color:var(--wp--preset--color--secondary)}.editor\:no-caption .block-editor-rich-text__editable{display:none!important}.editor\:no-inserter .wp-block-column:not(.is-selected)>.block-list-appender,.editor\:no-inserter .wp-block-cover__inner-container>.block-list-appender,.editor\:no-inserter .wp-block-group__inner-container>.block-list-appender,.editor\:no-inserter>.block-list-appender{display:none}.editor\:no-resize .components-resizable-box__handle,.editor\:no-resize .components-resizable-box__handle:after,.editor\:no-resize .components-resizable-box__side-handle:before{display:none;pointer-events:none}.editor\:no-resize .components-resizable-box__container{display:block}.editor\:pointer-events-none{pointer-events:none}.is-style-angled{justify-content:flex-end}.ext .is-style-angled>[class*=_inner-container],.is-style-angled{align-items:center}.is-style-angled .wp-block-cover__image-background,.is-style-angled .wp-block-cover__video-background{-webkit-clip-path:polygon(0 0,30% 0,50% 100%,0 100%);clip-path:polygon(0 0,30% 0,50% 100%,0 100%);z-index:1}@media (min-width:782px){.is-style-angled .wp-block-cover__image-background,.is-style-angled .wp-block-cover__video-background{-webkit-clip-path:polygon(0 0,55% 0,65% 100%,0 100%);clip-path:polygon(0 0,55% 0,65% 100%,0 100%)}}.ext .wp-block[data-align=wide]{margin-bottom:0!important;margin-top:0!important}.has-foreground-color{color:var(--wp--preset--color--foreground,#000)!important}.has-foreground-background-color{background-color:var(--wp--preset--color--foreground,#000)!important}.has-background-color{color:var(--wp--preset--color--background,#fff)!important}.has-background-background-color{background-color:var(--wp--preset--color--background,#fff)!important}.has-primary-color{color:var(--wp--preset--color--primary,#4b5563)!important}.has-primary-background-color{background-color:var(--wp--preset--color--primary,#4b5563)!important}.has-secondary-color{color:var(--wp--preset--color--secondary,#9ca3af)!important}.has-secondary-background-color{background-color:var(--wp--preset--color--secondary,#9ca3af)!important}.ext.has-text-color h1,.ext.has-text-color h2,.ext.has-text-color h3,.ext.has-text-color h4,.ext.has-text-color h5,.ext.has-text-color h6,.ext.has-text-color p{color:currentColor}.editor-styles-wrapper .has-gigantic-font-size.wp-block,.has-gigantic-font-size{--fallback-size:clamp(var(--wp--preset--font-size--huge,22px),calc(1rem + var(--wp--custom--typography--gigantic--preferred, 5vw)),var(--wp--preset--font-size--huge,42px) * 2);font-size:var(--wp--preset--font-size--gigantic,var(--fallback-size))}.has-ext-small-font-size{font-size:var(--wp--preset--font-size--ext-small)!important}.has-ext-medium-font-size{font-size:var(--wp--preset--font-size--ext-medium)!important}.has-ext-large-font-size{font-size:var(--wp--preset--font-size--ext-large)!important}.has-ext-x-large-font-size{font-size:var(--wp--preset--font-size--ext-x-large)!important}.has-ext-gigantic-font-size{font-size:var(--wp--preset--font-size--ext-gigantic)!important}.ext .ext-grid>[class*=_inner-container]{display:grid}.ext>[class*=_inner-container]>.ext-grid:not([class*=columns]),.ext>[class*=_inner-container]>.wp-block>.ext-grid:not([class*=columns]){display:initial!important}.ext .ext-grid-cols-1>[class*=_inner-container]{grid-template-columns:repeat(1,minmax(0,1fr))!important}.ext .ext-grid-cols-2>[class*=_inner-container]{grid-template-columns:repeat(2,minmax(0,1fr))!important}.ext .ext-grid-cols-3>[class*=_inner-container]{grid-template-columns:repeat(3,minmax(0,1fr))!important}.ext .ext-grid-cols-4>[class*=_inner-container]{grid-template-columns:repeat(4,minmax(0,1fr))!important}.ext .ext-grid-cols-5>[class*=_inner-container]{grid-template-columns:repeat(5,minmax(0,1fr))!important}.ext .ext-grid-cols-6>[class*=_inner-container]{grid-template-columns:repeat(6,minmax(0,1fr))!important}.ext .ext-grid-cols-7>[class*=_inner-container]{grid-template-columns:repeat(7,minmax(0,1fr))!important}.ext .ext-grid-cols-8>[class*=_inner-container]{grid-template-columns:repeat(8,minmax(0,1fr))!important}.ext .ext-grid-cols-9>[class*=_inner-container]{grid-template-columns:repeat(9,minmax(0,1fr))!important}.ext .ext-grid-cols-10>[class*=_inner-container]{grid-template-columns:repeat(10,minmax(0,1fr))!important}.ext .ext-grid-cols-11>[class*=_inner-container]{grid-template-columns:repeat(11,minmax(0,1fr))!important}.ext .ext-grid-cols-12>[class*=_inner-container]{grid-template-columns:repeat(12,minmax(0,1fr))!important}.ext .ext-grid-cols-13>[class*=_inner-container]{grid-template-columns:repeat(13,minmax(0,1fr))!important}.ext .ext-grid-cols-none>[class*=_inner-container]{grid-template-columns:none!important}.ext .ext-grid-rows-1>[class*=_inner-container]{grid-template-rows:repeat(1,minmax(0,1fr))!important}.ext .ext-grid-rows-2>[class*=_inner-container]{grid-template-rows:repeat(2,minmax(0,1fr))!important}.ext .ext-grid-rows-3>[class*=_inner-container]{grid-template-rows:repeat(3,minmax(0,1fr))!important}.ext .ext-grid-rows-4>[class*=_inner-container]{grid-template-rows:repeat(4,minmax(0,1fr))!important}.ext .ext-grid-rows-5>[class*=_inner-container]{grid-template-rows:repeat(5,minmax(0,1fr))!important}.ext .ext-grid-rows-6>[class*=_inner-container]{grid-template-rows:repeat(6,minmax(0,1fr))!important}.ext .ext-grid-rows-none>[class*=_inner-container]{grid-template-rows:none!important}.ext .ext-items-start>[class*=_inner-container]{align-items:flex-start!important}.ext .ext-items-end>[class*=_inner-container]{align-items:flex-end!important}.ext .ext-items-center>[class*=_inner-container]{align-items:center!important}.ext .ext-items-baseline>[class*=_inner-container]{align-items:baseline!important}.ext .ext-items-stretch>[class*=_inner-container]{align-items:stretch!important}.ext.wp-block-group>:last-child{margin-bottom:0}.ext .wp-block-group__inner-container{padding:0!important}.ext.has-background{padding-left:var(--wp--style--block-gap,2rem);padding-right:var(--wp--style--block-gap,2rem)}.ext [class*=inner-container]>.alignwide [class*=inner-container],.ext [class*=inner-container]>[data-align=wide] [class*=inner-container]{max-width:var(--responsive--alignwide-width,120rem)}.ext [class*=inner-container]>.alignwide [class*=inner-container]>*,.ext [class*=inner-container]>[data-align=wide] [class*=inner-container]>*{max-width:100%!important}.ext [class*=inner-container]>.alignfull [class*=inner-container],.ext [class*=inner-container]>[data-align=full] [class*=inner-container]{max-width:100%}.ext [class*=inner-container]>.alignfull [class*=inner-container]>*,.ext [class*=inner-container]>[data-align=full] [class*=inner-container]>*{max-width:100%!important}.ext .wp-block-image{position:relative;text-align:center}.ext .wp-block-image img{display:inline-block;vertical-align:middle}body{--extendify--spacing--large:var(
6
+ --wp--custom--spacing--large,clamp(2em,8vw,8em)
7
+ );--wp--preset--font-size--ext-small:1rem;--wp--preset--font-size--ext-medium:clamp(1.5rem,2vw,2rem);--wp--preset--font-size--ext-large:clamp(2.25rem,4vw,3.75rem);--wp--preset--font-size--ext-x-large:clamp(3rem,6vw,4.75rem);--wp--preset--font-size--ext-gigantic:clamp(3.25rem,7.5vw,5.75rem)}.ast-separate-container .ext .block-editor-block-list__layout{padding:0!important}.block-editor-block-preview__content-iframe .ext [data-type="core/spacer"] .components-resizable-box__container{background:transparent!important}.block-editor-block-preview__content-iframe .ext [data-type="core/spacer"] .block-library-spacer__resize-container:before{display:none!important}.ext [data-block].wp-block-buttons .wp-block-button{margin-bottom:0;margin-top:0}.ext [data-block].wp-block-buttons .wp-block-button:first-child{margin-bottom:var(--wp--style--block-gap,2rem)!important;margin-top:0!important}.ext .wp-block-group__inner-container figure.wp-block-gallery.alignfull{margin-bottom:unset;margin-top:unset}.ext .alignwide{margin-left:auto!important;margin-right:auto!important}@media (min-width:782px){.tablet\:ext-absolute{position:absolute!important}.tablet\:ext-relative{position:relative!important}.tablet\:ext-top-base{top:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-top-lg{top:var(--extendify--spacing--large)!important}.tablet\:ext--top-base{top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--top-lg{top:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-right-base{right:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-right-lg{right:var(--extendify--spacing--large)!important}.tablet\:ext--right-base{right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--right-lg{right:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-bottom-base{bottom:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-bottom-lg{bottom:var(--extendify--spacing--large)!important}.tablet\:ext--bottom-base{bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--bottom-lg{bottom:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-left-base{left:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-left-lg{left:var(--extendify--spacing--large)!important}.tablet\:ext--left-base{left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--left-lg{left:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-order-1{order:1!important}.tablet\:ext-order-2{order:2!important}.tablet\:ext-m-0:not([style*=margin]){margin:0!important}.tablet\:ext-m-auto:not([style*=margin]){margin:auto!important}.tablet\:ext-m-base:not([style*=margin]){margin:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-m-lg:not([style*=margin]){margin:var(--extendify--spacing--large)!important}.tablet\:ext--m-base:not([style*=margin]){margin:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--m-lg:not([style*=margin]){margin:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-mx-0:not([style*=margin]){margin-left:0!important;margin-right:0!important}.tablet\:ext-mx-auto:not([style*=margin]){margin-left:auto!important;margin-right:auto!important}.tablet\:ext-mx-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important;margin-right:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-mx-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important;margin-right:var(--extendify--spacing--large)!important}.tablet\:ext--mx-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--mx-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important;margin-right:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-my-0:not([style*=margin]){margin-bottom:0!important;margin-top:0!important}.tablet\:ext-my-auto:not([style*=margin]){margin-bottom:auto!important;margin-top:auto!important}.tablet\:ext-my-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important;margin-top:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-my-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important;margin-top:var(--extendify--spacing--large)!important}.tablet\:ext--my-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--my-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important;margin-top:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-mt-0:not([style*=margin]){margin-top:0!important}.tablet\:ext-mt-auto:not([style*=margin]){margin-top:auto!important}.tablet\:ext-mt-base:not([style*=margin]){margin-top:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-mt-lg:not([style*=margin]){margin-top:var(--extendify--spacing--large)!important}.tablet\:ext--mt-base:not([style*=margin]){margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--mt-lg:not([style*=margin]){margin-top:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-mr-0:not([style*=margin]){margin-right:0!important}.tablet\:ext-mr-auto:not([style*=margin]){margin-right:auto!important}.tablet\:ext-mr-base:not([style*=margin]){margin-right:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-mr-lg:not([style*=margin]){margin-right:var(--extendify--spacing--large)!important}.tablet\:ext--mr-base:not([style*=margin]){margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--mr-lg:not([style*=margin]){margin-right:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-mb-0:not([style*=margin]){margin-bottom:0!important}.tablet\:ext-mb-auto:not([style*=margin]){margin-bottom:auto!important}.tablet\:ext-mb-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-mb-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important}.tablet\:ext--mb-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--mb-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-ml-0:not([style*=margin]){margin-left:0!important}.tablet\:ext-ml-auto:not([style*=margin]){margin-left:auto!important}.tablet\:ext-ml-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-ml-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important}.tablet\:ext--ml-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.tablet\:ext--ml-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important}.tablet\:ext-block{display:block!important}.tablet\:ext-inline-block{display:inline-block!important}.tablet\:ext-inline{display:inline!important}.tablet\:ext-flex{display:flex!important}.tablet\:ext-inline-flex{display:inline-flex!important}.tablet\:ext-grid{display:grid!important}.tablet\:ext-inline-grid{display:inline-grid!important}.tablet\:ext-hidden{display:none!important}.tablet\:ext-w-auto{width:auto!important}.tablet\:ext-w-full{width:100%!important}.tablet\:ext-max-w-full{max-width:100%!important}.tablet\:ext-flex-1{flex:1 1 0%!important}.tablet\:ext-flex-auto{flex:1 1 auto!important}.tablet\:ext-flex-initial{flex:0 1 auto!important}.tablet\:ext-flex-none{flex:none!important}.tablet\:ext-flex-shrink-0{flex-shrink:0!important}.tablet\:ext-flex-shrink{flex-shrink:1!important}.tablet\:ext-flex-grow-0{flex-grow:0!important}.tablet\:ext-flex-grow{flex-grow:1!important}.tablet\:ext-list-none{list-style-type:none!important}.tablet\:ext-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.tablet\:ext-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.tablet\:ext-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.tablet\:ext-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.tablet\:ext-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))!important}.tablet\:ext-grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))!important}.tablet\:ext-grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))!important}.tablet\:ext-grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))!important}.tablet\:ext-grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))!important}.tablet\:ext-grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))!important}.tablet\:ext-grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))!important}.tablet\:ext-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))!important}.tablet\:ext-grid-cols-none{grid-template-columns:none!important}.tablet\:ext-flex-row{flex-direction:row!important}.tablet\:ext-flex-row-reverse{flex-direction:row-reverse!important}.tablet\:ext-flex-col{flex-direction:column!important}.tablet\:ext-flex-col-reverse{flex-direction:column-reverse!important}.tablet\:ext-flex-wrap{flex-wrap:wrap!important}.tablet\:ext-flex-wrap-reverse{flex-wrap:wrap-reverse!important}.tablet\:ext-flex-nowrap{flex-wrap:nowrap!important}.tablet\:ext-items-start{align-items:flex-start!important}.tablet\:ext-items-end{align-items:flex-end!important}.tablet\:ext-items-center{align-items:center!important}.tablet\:ext-items-baseline{align-items:baseline!important}.tablet\:ext-items-stretch{align-items:stretch!important}.tablet\:ext-justify-start{justify-content:flex-start!important}.tablet\:ext-justify-end{justify-content:flex-end!important}.tablet\:ext-justify-center{justify-content:center!important}.tablet\:ext-justify-between{justify-content:space-between!important}.tablet\:ext-justify-around{justify-content:space-around!important}.tablet\:ext-justify-evenly{justify-content:space-evenly!important}.tablet\:ext-justify-items-start{justify-items:start!important}.tablet\:ext-justify-items-end{justify-items:end!important}.tablet\:ext-justify-items-center{justify-items:center!important}.tablet\:ext-justify-items-stretch{justify-items:stretch!important}.tablet\:ext-justify-self-auto{justify-self:auto!important}.tablet\:ext-justify-self-start{justify-self:start!important}.tablet\:ext-justify-self-end{justify-self:end!important}.tablet\:ext-justify-self-center{justify-self:center!important}.tablet\:ext-justify-self-stretch{justify-self:stretch!important}.tablet\:ext-p-0:not([style*=padding]){padding:0!important}.tablet\:ext-p-base:not([style*=padding]){padding:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-p-lg:not([style*=padding]){padding:var(--extendify--spacing--large)!important}.tablet\:ext-px-0:not([style*=padding]){padding-left:0!important;padding-right:0!important}.tablet\:ext-px-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important;padding-right:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-px-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important;padding-right:var(--extendify--spacing--large)!important}.tablet\:ext-py-0:not([style*=padding]){padding-bottom:0!important;padding-top:0!important}.tablet\:ext-py-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important;padding-top:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-py-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important;padding-top:var(--extendify--spacing--large)!important}.tablet\:ext-pt-0:not([style*=padding]){padding-top:0!important}.tablet\:ext-pt-base:not([style*=padding]){padding-top:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-pt-lg:not([style*=padding]){padding-top:var(--extendify--spacing--large)!important}.tablet\:ext-pr-0:not([style*=padding]){padding-right:0!important}.tablet\:ext-pr-base:not([style*=padding]){padding-right:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-pr-lg:not([style*=padding]){padding-right:var(--extendify--spacing--large)!important}.tablet\:ext-pb-0:not([style*=padding]){padding-bottom:0!important}.tablet\:ext-pb-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-pb-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important}.tablet\:ext-pl-0:not([style*=padding]){padding-left:0!important}.tablet\:ext-pl-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important}.tablet\:ext-pl-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important}.tablet\:ext-text-left{text-align:left!important}.tablet\:ext-text-center{text-align:center!important}.tablet\:ext-text-right{text-align:right!important}}@media (min-width:1080px){.desktop\:ext-absolute{position:absolute!important}.desktop\:ext-relative{position:relative!important}.desktop\:ext-top-base{top:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-top-lg{top:var(--extendify--spacing--large)!important}.desktop\:ext--top-base{top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--top-lg{top:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-right-base{right:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-right-lg{right:var(--extendify--spacing--large)!important}.desktop\:ext--right-base{right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--right-lg{right:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-bottom-base{bottom:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-bottom-lg{bottom:var(--extendify--spacing--large)!important}.desktop\:ext--bottom-base{bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--bottom-lg{bottom:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-left-base{left:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-left-lg{left:var(--extendify--spacing--large)!important}.desktop\:ext--left-base{left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--left-lg{left:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-order-1{order:1!important}.desktop\:ext-order-2{order:2!important}.desktop\:ext-m-0:not([style*=margin]){margin:0!important}.desktop\:ext-m-auto:not([style*=margin]){margin:auto!important}.desktop\:ext-m-base:not([style*=margin]){margin:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-m-lg:not([style*=margin]){margin:var(--extendify--spacing--large)!important}.desktop\:ext--m-base:not([style*=margin]){margin:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--m-lg:not([style*=margin]){margin:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-mx-0:not([style*=margin]){margin-left:0!important;margin-right:0!important}.desktop\:ext-mx-auto:not([style*=margin]){margin-left:auto!important;margin-right:auto!important}.desktop\:ext-mx-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important;margin-right:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-mx-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important;margin-right:var(--extendify--spacing--large)!important}.desktop\:ext--mx-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--mx-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important;margin-right:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-my-0:not([style*=margin]){margin-bottom:0!important;margin-top:0!important}.desktop\:ext-my-auto:not([style*=margin]){margin-bottom:auto!important;margin-top:auto!important}.desktop\:ext-my-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important;margin-top:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-my-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important;margin-top:var(--extendify--spacing--large)!important}.desktop\:ext--my-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important;margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--my-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important;margin-top:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-mt-0:not([style*=margin]){margin-top:0!important}.desktop\:ext-mt-auto:not([style*=margin]){margin-top:auto!important}.desktop\:ext-mt-base:not([style*=margin]){margin-top:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-mt-lg:not([style*=margin]){margin-top:var(--extendify--spacing--large)!important}.desktop\:ext--mt-base:not([style*=margin]){margin-top:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--mt-lg:not([style*=margin]){margin-top:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-mr-0:not([style*=margin]){margin-right:0!important}.desktop\:ext-mr-auto:not([style*=margin]){margin-right:auto!important}.desktop\:ext-mr-base:not([style*=margin]){margin-right:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-mr-lg:not([style*=margin]){margin-right:var(--extendify--spacing--large)!important}.desktop\:ext--mr-base:not([style*=margin]){margin-right:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--mr-lg:not([style*=margin]){margin-right:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-mb-0:not([style*=margin]){margin-bottom:0!important}.desktop\:ext-mb-auto:not([style*=margin]){margin-bottom:auto!important}.desktop\:ext-mb-base:not([style*=margin]){margin-bottom:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-mb-lg:not([style*=margin]){margin-bottom:var(--extendify--spacing--large)!important}.desktop\:ext--mb-base:not([style*=margin]){margin-bottom:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--mb-lg:not([style*=margin]){margin-bottom:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-ml-0:not([style*=margin]){margin-left:0!important}.desktop\:ext-ml-auto:not([style*=margin]){margin-left:auto!important}.desktop\:ext-ml-base:not([style*=margin]){margin-left:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-ml-lg:not([style*=margin]){margin-left:var(--extendify--spacing--large)!important}.desktop\:ext--ml-base:not([style*=margin]){margin-left:calc(var(--wp--style--block-gap, 2rem)*-1)!important}.desktop\:ext--ml-lg:not([style*=margin]){margin-left:calc(var(--extendify--spacing--large)*-1)!important}.desktop\:ext-block{display:block!important}.desktop\:ext-inline-block{display:inline-block!important}.desktop\:ext-inline{display:inline!important}.desktop\:ext-flex{display:flex!important}.desktop\:ext-inline-flex{display:inline-flex!important}.desktop\:ext-grid{display:grid!important}.desktop\:ext-inline-grid{display:inline-grid!important}.desktop\:ext-hidden{display:none!important}.desktop\:ext-w-auto{width:auto!important}.desktop\:ext-w-full{width:100%!important}.desktop\:ext-max-w-full{max-width:100%!important}.desktop\:ext-flex-1{flex:1 1 0%!important}.desktop\:ext-flex-auto{flex:1 1 auto!important}.desktop\:ext-flex-initial{flex:0 1 auto!important}.desktop\:ext-flex-none{flex:none!important}.desktop\:ext-flex-shrink-0{flex-shrink:0!important}.desktop\:ext-flex-shrink{flex-shrink:1!important}.desktop\:ext-flex-grow-0{flex-grow:0!important}.desktop\:ext-flex-grow{flex-grow:1!important}.desktop\:ext-list-none{list-style-type:none!important}.desktop\:ext-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.desktop\:ext-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.desktop\:ext-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.desktop\:ext-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.desktop\:ext-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))!important}.desktop\:ext-grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))!important}.desktop\:ext-grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))!important}.desktop\:ext-grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))!important}.desktop\:ext-grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))!important}.desktop\:ext-grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))!important}.desktop\:ext-grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))!important}.desktop\:ext-grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))!important}.desktop\:ext-grid-cols-none{grid-template-columns:none!important}.desktop\:ext-flex-row{flex-direction:row!important}.desktop\:ext-flex-row-reverse{flex-direction:row-reverse!important}.desktop\:ext-flex-col{flex-direction:column!important}.desktop\:ext-flex-col-reverse{flex-direction:column-reverse!important}.desktop\:ext-flex-wrap{flex-wrap:wrap!important}.desktop\:ext-flex-wrap-reverse{flex-wrap:wrap-reverse!important}.desktop\:ext-flex-nowrap{flex-wrap:nowrap!important}.desktop\:ext-items-start{align-items:flex-start!important}.desktop\:ext-items-end{align-items:flex-end!important}.desktop\:ext-items-center{align-items:center!important}.desktop\:ext-items-baseline{align-items:baseline!important}.desktop\:ext-items-stretch{align-items:stretch!important}.desktop\:ext-justify-start{justify-content:flex-start!important}.desktop\:ext-justify-end{justify-content:flex-end!important}.desktop\:ext-justify-center{justify-content:center!important}.desktop\:ext-justify-between{justify-content:space-between!important}.desktop\:ext-justify-around{justify-content:space-around!important}.desktop\:ext-justify-evenly{justify-content:space-evenly!important}.desktop\:ext-justify-items-start{justify-items:start!important}.desktop\:ext-justify-items-end{justify-items:end!important}.desktop\:ext-justify-items-center{justify-items:center!important}.desktop\:ext-justify-items-stretch{justify-items:stretch!important}.desktop\:ext-justify-self-auto{justify-self:auto!important}.desktop\:ext-justify-self-start{justify-self:start!important}.desktop\:ext-justify-self-end{justify-self:end!important}.desktop\:ext-justify-self-center{justify-self:center!important}.desktop\:ext-justify-self-stretch{justify-self:stretch!important}.desktop\:ext-p-0:not([style*=padding]){padding:0!important}.desktop\:ext-p-base:not([style*=padding]){padding:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-p-lg:not([style*=padding]){padding:var(--extendify--spacing--large)!important}.desktop\:ext-px-0:not([style*=padding]){padding-left:0!important;padding-right:0!important}.desktop\:ext-px-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important;padding-right:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-px-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important;padding-right:var(--extendify--spacing--large)!important}.desktop\:ext-py-0:not([style*=padding]){padding-bottom:0!important;padding-top:0!important}.desktop\:ext-py-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important;padding-top:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-py-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important;padding-top:var(--extendify--spacing--large)!important}.desktop\:ext-pt-0:not([style*=padding]){padding-top:0!important}.desktop\:ext-pt-base:not([style*=padding]){padding-top:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-pt-lg:not([style*=padding]){padding-top:var(--extendify--spacing--large)!important}.desktop\:ext-pr-0:not([style*=padding]){padding-right:0!important}.desktop\:ext-pr-base:not([style*=padding]){padding-right:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-pr-lg:not([style*=padding]){padding-right:var(--extendify--spacing--large)!important}.desktop\:ext-pb-0:not([style*=padding]){padding-bottom:0!important}.desktop\:ext-pb-base:not([style*=padding]){padding-bottom:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-pb-lg:not([style*=padding]){padding-bottom:var(--extendify--spacing--large)!important}.desktop\:ext-pl-0:not([style*=padding]){padding-left:0!important}.desktop\:ext-pl-base:not([style*=padding]){padding-left:var(--wp--style--block-gap,2rem)!important}.desktop\:ext-pl-lg:not([style*=padding]){padding-left:var(--extendify--spacing--large)!important}.desktop\:ext-text-left{text-align:left!important}.desktop\:ext-text-center{text-align:center!important}.desktop\:ext-text-right{text-align:right!important}}
public/build/extendify.css ADDED
@@ -0,0 +1 @@
 
1
+ div.extendify .sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}div.extendify .focus\:not-sr-only:focus{clip:auto!important;height:auto!important;margin:0!important;overflow:visible!important;padding:0!important;position:static!important;white-space:normal!important;width:auto!important}div.extendify .pointer-events-none{pointer-events:none!important}div.extendify .invisible{visibility:hidden!important}div.extendify .static{position:static!important}div.extendify .fixed{position:fixed!important}div.extendify .absolute{position:absolute!important}div.extendify .relative{position:relative!important}div.extendify .inset-0{bottom:0!important;left:0!important;right:0!important;top:0!important}div.extendify .top-0{top:0!important}div.extendify .top-2{top:.5rem!important}div.extendify .right-0{right:0!important}div.extendify .right-1{right:.25rem!important}div.extendify .right-2{right:.5rem!important}div.extendify .right-2\.5{right:.625rem!important}div.extendify .bottom-0{bottom:0!important}div.extendify .left-0{left:0!important}div.extendify .z-0{z-index:0!important}div.extendify .z-20{z-index:20!important}div.extendify .z-30{z-index:30!important}div.extendify .z-high{z-index:99999!important}div.extendify .m-0{margin:0!important}div.extendify .m-8{margin:2rem!important}div.extendify .m-auto{margin:auto!important}div.extendify .mx-6{margin-left:1.5rem!important;margin-right:1.5rem!important}div.extendify .mx-auto{margin-left:auto!important;margin-right:auto!important}div.extendify .my-0{margin-bottom:0!important;margin-top:0!important}div.extendify .my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}div.extendify .mt-4{margin-top:1rem!important}div.extendify .mt-10{margin-top:2.5rem!important}div.extendify .mt-px{margin-top:1px!important}div.extendify .-mt-2{margin-top:-.5rem!important}div.extendify .mr-1{margin-right:.25rem!important}div.extendify .mb-0{margin-bottom:0!important}div.extendify .mb-1{margin-bottom:.25rem!important}div.extendify .mb-2{margin-bottom:.5rem!important}div.extendify .mb-4{margin-bottom:1rem!important}div.extendify .mb-6{margin-bottom:1.5rem!important}div.extendify .mb-8{margin-bottom:2rem!important}div.extendify .mb-10{margin-bottom:2.5rem!important}div.extendify .ml-2{margin-left:.5rem!important}div.extendify .-ml-1{margin-left:-.25rem!important}div.extendify .-ml-2{margin-left:-.5rem!important}div.extendify .-ml-6{margin-left:-1.5rem!important}div.extendify .-ml-px{margin-left:-1px!important}div.extendify .-ml-1\.5{margin-left:-.375rem!important}div.extendify .block{display:block!important}div.extendify .flex{display:flex!important}div.extendify .table{display:table!important}div.extendify .hidden{display:none!important}div.extendify .h-20{height:5rem!important}div.extendify .h-80{height:20rem!important}div.extendify .h-auto{height:auto!important}div.extendify .h-full{height:100%!important}div.extendify .h-screen{height:100vh!important}div.extendify .max-h-96{max-height:24rem!important}div.extendify .min-h-0{min-height:0!important}div.extendify .min-h-screen{min-height:100vh!important}div.extendify .w-72{width:18rem!important}div.extendify .w-80{width:20rem!important}div.extendify .w-auto{width:auto!important}div.extendify .w-full{width:100%!important}div.extendify .w-screen{width:100vw!important}div.extendify .min-w-sm{min-width:7rem!important}div.extendify .max-w-xs{max-width:20rem!important}div.extendify .max-w-md{max-width:28rem!important}div.extendify .max-w-lg{max-width:32rem!important}div.extendify .max-w-xl{max-width:36rem!important}div.extendify .max-w-full{max-width:100%!important}div.extendify .max-w-screen-4xl{max-width:1920px!important}div.extendify .flex-1{flex:1 1 0%!important}div.extendify .flex-shrink-0{flex-shrink:0!important}div.extendify .flex-grow{flex-grow:1!important}div.extendify .transform{--tw-translate-x:0!important;--tw-translate-y:0!important;--tw-rotate:0!important;--tw-skew-x:0!important;--tw-skew-y:0!important;--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}div.extendify .-translate-x-1{--tw-translate-x:-0.25rem!important}div.extendify .translate-y-0{--tw-translate-y:0px!important}div.extendify .translate-y-4{--tw-translate-y:1rem!important}div.extendify .-translate-y-20{--tw-translate-y:-5rem!important}div.extendify .-translate-y-full{--tw-translate-y:-100%!important}div.extendify .rotate-90{--tw-rotate:90deg!important}div.extendify .cursor-pointer{cursor:pointer!important}div.extendify .resize{resize:both!important}div.extendify .flex-col{flex-direction:column!important}div.extendify .items-end{align-items:flex-end!important}div.extendify .items-center{align-items:center!important}div.extendify .items-stretch{align-items:stretch!important}div.extendify .justify-end{justify-content:flex-end!important}div.extendify .justify-center{justify-content:center!important}div.extendify .justify-between{justify-content:space-between!important}div.extendify .space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.25rem*var(--tw-space-x-reverse))!important}div.extendify .space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.5rem*var(--tw-space-x-reverse))!important}div.extendify .space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(1rem*var(--tw-space-x-reverse))!important}div.extendify .space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}div.extendify .space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}div.extendify .space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}div.extendify .overflow-hidden{overflow:hidden!important}div.extendify .overflow-y-auto{overflow-y:auto!important}div.extendify .whitespace-nowrap{white-space:nowrap!important}div.extendify .rounded-sm{border-radius:.125rem!important}div.extendify .rounded{border-radius:.25rem!important}div.extendify .rounded-md{border-radius:.375rem!important}div.extendify .rounded-tl-sm{border-top-left-radius:.125rem!important}div.extendify .rounded-tr-sm{border-top-right-radius:.125rem!important}div.extendify .rounded-br-sm{border-bottom-right-radius:.125rem!important}div.extendify .rounded-bl-sm{border-bottom-left-radius:.125rem!important}div.extendify .border-0{border-width:0!important}div.extendify .border-2{border-width:2px!important}div.extendify .border{border-width:1px!important}div.extendify .border-r{border-right-width:1px!important}div.extendify .border-b-0{border-bottom-width:0!important}div.extendify .border-b{border-bottom-width:1px!important}div.extendify .border-black{--tw-border-opacity:1!important;border-color:rgba(0,0,0,var(--tw-border-opacity))!important}div.extendify .border-gray-900{--tw-border-opacity:1!important;border-color:rgba(30,30,30,var(--tw-border-opacity))!important}div.extendify .border-extendify-main{--tw-border-opacity:1!important;border-color:rgba(11,74,67,var(--tw-border-opacity))!important}div.extendify .border-extendify-transparent-black-100{border-color:rgba(0,0,0,.07)!important}div.extendify .border-wp-alert-red{--tw-border-opacity:1!important;border-color:rgba(204,24,24,var(--tw-border-opacity))!important}div.extendify .focus\:border-transparent:focus{border-color:transparent!important}div.extendify .bg-transparent{background-color:transparent!important}div.extendify .bg-black{--tw-bg-opacity:1!important;background-color:rgba(0,0,0,var(--tw-bg-opacity))!important}div.extendify .bg-white{--tw-bg-opacity:1!important;background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}div.extendify .bg-gray-100{--tw-bg-opacity:1!important;background-color:rgba(240,240,240,var(--tw-bg-opacity))!important}div.extendify .bg-gray-900{--tw-bg-opacity:1!important;background-color:rgba(30,30,30,var(--tw-bg-opacity))!important}div.extendify .bg-extendify-main{--tw-bg-opacity:1!important;background-color:rgba(11,74,67,var(--tw-bg-opacity))!important}div.extendify .bg-extendify-alert{--tw-bg-opacity:1!important;background-color:rgba(132,16,16,var(--tw-bg-opacity))!important}div.extendify .bg-extendify-secondary{--tw-bg-opacity:1!important;background-color:rgba(203,195,245,var(--tw-bg-opacity))!important}div.extendify .bg-extendify-transparent-white{background-color:hsla(0,0%,99%,.88)!important}div.extendify .bg-extendify-transparent-black{background-color:rgba(0,0,0,.05)!important}div.extendify .hover\:bg-extendify-main-dark:hover{--tw-bg-opacity:1!important;background-color:rgba(5,49,44,var(--tw-bg-opacity))!important}div.extendify .hover\:bg-extendify-transparent-black-100:hover{background-color:rgba(0,0,0,.07)!important}div.extendify .active\:bg-gray-900:active{--tw-bg-opacity:1!important;background-color:rgba(30,30,30,var(--tw-bg-opacity))!important}div.extendify .bg-opacity-40{--tw-bg-opacity:0.4!important}div.extendify .bg-clip-padding{background-clip:padding-box!important}div.extendify .fill-current{fill:currentColor!important}div.extendify .stroke-current{stroke:currentColor!important}div.extendify .p-0{padding:0!important}div.extendify .p-1{padding:.25rem!important}div.extendify .p-2{padding:.5rem!important}div.extendify .p-3{padding:.75rem!important}div.extendify .p-4{padding:1rem!important}div.extendify .p-6{padding:1.5rem!important}div.extendify .p-10{padding:2.5rem!important}div.extendify .p-12{padding:3rem!important}div.extendify .p-1\.5{padding:.375rem!important}div.extendify .p-3\.5{padding:.875rem!important}div.extendify .px-0{padding-left:0!important;padding-right:0!important}div.extendify .px-2{padding-left:.5rem!important;padding-right:.5rem!important}div.extendify .px-3{padding-left:.75rem!important;padding-right:.75rem!important}div.extendify .px-4{padding-left:1rem!important;padding-right:1rem!important}div.extendify .px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}div.extendify .px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}div.extendify .px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}div.extendify .py-0{padding-bottom:0!important;padding-top:0!important}div.extendify .py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}div.extendify .py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}div.extendify .py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}div.extendify .py-4{padding-bottom:1rem!important;padding-top:1rem!important}div.extendify .py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}div.extendify .py-2\.5{padding-bottom:.625rem!important;padding-top:.625rem!important}div.extendify .pt-0{padding-top:0!important}div.extendify .pt-2{padding-top:.5rem!important}div.extendify .pt-4{padding-top:1rem!important}div.extendify .pt-6{padding-top:1.5rem!important}div.extendify .pt-px{padding-top:1px!important}div.extendify .pt-0\.5{padding-top:.125rem!important}div.extendify .pr-3{padding-right:.75rem!important}div.extendify .pb-2{padding-bottom:.5rem!important}div.extendify .pb-4{padding-bottom:1rem!important}div.extendify .pb-6{padding-bottom:1.5rem!important}div.extendify .pb-20{padding-bottom:5rem!important}div.extendify .pb-32{padding-bottom:8rem!important}div.extendify .pb-40{padding-bottom:10rem!important}div.extendify .pl-0{padding-left:0!important}div.extendify .pl-2{padding-left:.5rem!important}div.extendify .pl-6{padding-left:1.5rem!important}div.extendify .pl-8{padding-left:2rem!important}div.extendify .text-left{text-align:left!important}div.extendify .text-center{text-align:center!important}div.extendify .text-xs{font-size:.75rem!important;line-height:1rem!important}div.extendify .text-sm{font-size:.875rem!important;line-height:1.25rem!important}div.extendify .text-base{font-size:1rem!important;line-height:1.5rem!important}div.extendify .text-lg{font-size:1.125rem!important;line-height:1.75rem!important}div.extendify .text-xl{font-size:1.25rem!important;line-height:1.75rem!important}div.extendify .text-xss{font-size:11px!important}div.extendify .font-light{font-weight:300!important}div.extendify .font-normal{font-weight:400!important}div.extendify .font-medium{font-weight:500!important}div.extendify .font-semibold{font-weight:600!important}div.extendify .font-bold{font-weight:700!important}div.extendify .uppercase{text-transform:uppercase!important}div.extendify .leading-none{line-height:1!important}div.extendify .leading-extra-tight{line-height:.5!important}div.extendify .text-black{--tw-text-opacity:1!important;color:rgba(0,0,0,var(--tw-text-opacity))!important}div.extendify .text-white{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}div.extendify .text-gray-700{--tw-text-opacity:1!important;color:rgba(117,117,117,var(--tw-text-opacity))!important}div.extendify .text-gray-800{--tw-text-opacity:1!important;color:rgba(31,41,55,var(--tw-text-opacity))!important}div.extendify .text-gray-900{--tw-text-opacity:1!important;color:rgba(30,30,30,var(--tw-text-opacity))!important}div.extendify .text-extendify-main{--tw-text-opacity:1!important;color:rgba(11,74,67,var(--tw-text-opacity))!important}div.extendify .text-extendify-gray{--tw-text-opacity:1!important;color:rgba(95,95,95,var(--tw-text-opacity))!important}div.extendify .text-extendify-black{--tw-text-opacity:1!important;color:rgba(30,30,30,var(--tw-text-opacity))!important}div.extendify .text-wp-theme-500{color:var(--wp-admin-theme-color)!important}div.extendify .text-wp-alert-red{--tw-text-opacity:1!important;color:rgba(204,24,24,var(--tw-text-opacity))!important}div.extendify .hover\:text-white:hover{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}div.extendify .hover\:text-wp-theme-500:hover{color:var(--wp-admin-theme-color)!important}div.extendify .focus\:text-white:focus{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}div.extendify .focus\:text-blue-500:focus{--tw-text-opacity:1!important;color:rgba(59,130,246,var(--tw-text-opacity))!important}div.extendify .active\:text-white:active{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}div.extendify .underline{text-decoration:underline!important}div.extendify .hover\:no-underline:hover,div.extendify .no-underline{text-decoration:none!important}div.extendify .opacity-0{opacity:0!important}div.extendify .opacity-30{opacity:.3!important}div.extendify .opacity-50{opacity:.5!important}div.extendify .opacity-75{opacity:.75!important}div.extendify .opacity-100{opacity:1!important}div.extendify .group:hover .group-hover\:opacity-90{opacity:.9!important}div.extendify .focus\:opacity-100:focus,div.extendify .hover\:opacity-100:hover{opacity:1!important}div.extendify .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)!important}div.extendify .shadow-md,div.extendify .shadow-modal{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}div.extendify .shadow-modal{--tw-shadow: 0 0 0 1px rgba(0,0,0,.1),0 3px 15px -3px rgba(0,0,0,.035),0 0 1px rgba(0,0,0,.05)!important}div.extendify .focus\:outline-none:focus,div.extendify .outline-none{outline:2px solid transparent!important;outline-offset:2px!important}div.extendify .focus\:ring-wp:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--wp-admin-border-width-focus) + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}div.extendify .focus\:ring-wp-theme-500:focus{--tw-ring-color:var(--wp-admin-theme-color)!important}div.extendify .filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/)!important;--tw-brightness:var(--tw-empty,/*!*/ /*!*/)!important;--tw-contrast:var(--tw-empty,/*!*/ /*!*/)!important;--tw-grayscale:var(--tw-empty,/*!*/ /*!*/)!important;--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-invert:var(--tw-empty,/*!*/ /*!*/)!important;--tw-saturate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-sepia:var(--tw-empty,/*!*/ /*!*/)!important;--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}div.extendify .backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/)!important;-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important;backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important}div.extendify .backdrop-blur-xl{--tw-backdrop-blur:blur(24px)!important}div.extendify .backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)!important}div.extendify .transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}div.extendify .transition{transition-duration:.15s!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}div.extendify .transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}div.extendify .duration-200{transition-duration:.2s!important}div.extendify .duration-300{transition-duration:.3s!important}div.extendify .ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}div.extendify .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.extendify{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/)!important;--tw-ring-offset-width:0px!important;--tw-ring-offset-color:transparent!important;--tw-ring-color:var(--wp-admin-theme-color)!important}.extendify *,.extendify :after,.extendify :before{border:0 solid #e5e7eb!important;box-sizing:border-box!important}.extendify .button-focus:focus{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.extendify .button-focus{outline:2px solid transparent!important;outline-offset:2px!important}.extendify .button-focus:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--wp-admin-border-width-focus) + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-color:var(--wp-admin-theme-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.button-extendify-main{--tw-bg-opacity:1!important;background-color:rgba(11,74,67,var(--tw-bg-opacity))!important;cursor:pointer!important;white-space:nowrap!important}.button-extendify-main:hover{--tw-bg-opacity:1!important;background-color:rgba(5,49,44,var(--tw-bg-opacity))!important}.button-extendify-main:active{--tw-bg-opacity:1!important;background-color:rgba(30,30,30,var(--tw-bg-opacity))!important}.button-extendify-main{padding:.375rem .75rem!important}.button-extendify-main,.button-extendify-main:active,.button-extendify-main:focus,.button-extendify-main:hover{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}.button-extendify-main{text-decoration:none!important;transition-duration:.15s!important;transition-duration:.2s!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.extendify .button-extendify-main:focus{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.extendify .button-extendify-main{outline:2px solid transparent!important;outline-offset:2px!important}.extendify .button-extendify-main:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--wp-admin-border-width-focus) + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-color:var(--wp-admin-theme-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.extendify input.button-extendify-main:focus,.extendify input.button-focus:focus,.extendify select.button-extendify-main:focus,.extendify select.button-focus:focus{--tw-shadow:0 0 #0000!important;border-color:transparent!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;outline:2px solid transparent!important;outline-offset:2px!important}#extendify-search-input:not(:-moz-placeholder-shown)~svg{display:none!important}#extendify-search-input:not(:-ms-input-placeholder)~svg{display:none!important}#extendify-search-input:focus~svg,#extendify-search-input:not(:placeholder-shown)~svg{display:none!important}#extendify-search-input::-webkit-textfield-decoration-container{margin-right:.75rem!important}.extendify .components-panel__body>.components-panel__body-title{background-color:transparent!important;border-bottom:1px solid #e0e0e0!important}.extendify .components-modal__header{--tw-border-opacity:1!important;border-bottom-width:1px!important;border-color:rgba(221,221,221,var(--tw-border-opacity))!important}.block-editor-block-preview__content .block-editor-block-list__layout.is-root-container>.ext{max-width:none!important}.block-editor-block-list__layout.is-root-container .ext.block-editor-block-list__block{max-width:100%!important}.extendify .block-editor-block-preview__container{-webkit-animation:extendifyOpacityIn .2s cubic-bezier(.694,0,.335,1) 0ms forwards;animation:extendifyOpacityIn .2s cubic-bezier(.694,0,.335,1) 0ms forwards;opacity:0}.extendify .is-root-container>[data-align=full],.extendify .is-root-container>[data-align=full]>.wp-block,.extendify .is-root-container>[data-block]{margin-bottom:0!important;margin-top:0!important}.editor-styles-wrapper:not(.block-editor-writing-flow)>.is-root-container :where(.wp-block)[data-align=full]{margin-bottom:0!important;margin-top:0!important}@-webkit-keyframes extendifyOpacityIn{0%{opacity:0}to{opacity:1}}@keyframes extendifyOpacityIn{0%{opacity:0}to{opacity:1}}.extendify .with-light-shadow:after{--tw-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 3px 15px -3px rgba(0,0,0,.025),0 0 1px rgba(0,0,0,.02)!important;border-width:0!important;bottom:0!important;content:""!important;left:0!important;position:absolute!important;right:0!important;top:0!important}.extendify .with-light-shadow:after,.extendify .with-light-shadow:hover:after{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.extendify .with-light-shadow:hover:after{--tw-shadow:inset 0 0 0 1px rgba(0,0,0,.2),0 3px 15px -3px rgba(0,0,0,.025),0 0 1px rgba(0,0,0,.02)!important}.components-panel__body.ext-type-control .components-panel__body-toggle{padding-left:0!important;padding-right:0!important}.components-panel__body.ext-type-control .components-panel__body-title{border-bottom-width:0!important;margin:0!important;padding-left:1.25rem!important;padding-right:1.25rem!important}.components-panel__body.ext-type-control .components-panel__body-title .components-button{--tw-text-opacity:1!important;border-bottom-width:0!important;color:rgba(95,95,95,var(--tw-text-opacity))!important;font-size:11px!important;font-weight:500!important;margin:0!important;padding-bottom:.5rem!important;padding-top:.5rem!important;text-transform:uppercase!important}.components-panel__body.ext-type-control .components-button .components-panel__arrow{--tw-text-opacity:1!important;color:rgba(95,95,95,var(--tw-text-opacity))!important;right:0!important}.extendify .animate-pulse{-webkit-animation:extendifyPulse 3s cubic-bezier(.4,0,.6,1) infinite;animation:extendifyPulse 3s cubic-bezier(.4,0,.6,1) infinite}@-webkit-keyframes extendifyPulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes extendifyPulse{0%,to{opacity:1}50%{opacity:.5}}@media (min-width:600px){div.extendify .sm\:mx-0{margin-left:0!important;margin-right:0!important}div.extendify .sm\:mt-0{margin-top:0!important}div.extendify .sm\:mb-8{margin-bottom:2rem!important}div.extendify .sm\:block{display:block!important}div.extendify .sm\:flex{display:flex!important}div.extendify .sm\:h-auto{height:auto!important}div.extendify .sm\:w-64{width:16rem!important}div.extendify .sm\:w-auto{width:auto!important}div.extendify .sm\:translate-y-5{--tw-translate-y:1.25rem!important}div.extendify .sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}div.extendify .sm\:p-0{padding:0!important}div.extendify .sm\:py-0{padding-bottom:0!important;padding-top:0!important}div.extendify .sm\:py-5{padding-bottom:1.25rem!important;padding-top:1.25rem!important}div.extendify .sm\:pt-0{padding-top:0!important}}@media (min-width:782px){div.extendify .md\:m-0{margin:0!important}div.extendify .md\:mb-8{margin-bottom:2rem!important}div.extendify .md\:-ml-8{margin-left:-2rem!important}div.extendify .md\:block{display:block!important}div.extendify .md\:flex{display:flex!important}div.extendify .md\:w-6\/12{width:50%!important}div.extendify .md\:w-7\/12{width:58.333333%!important}div.extendify .md\:max-w-2xl{max-width:42rem!important}div.extendify .md\:rounded-l-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}div.extendify .md\:rounded-tr-none{border-top-right-radius:0!important}div.extendify .md\:px-8{padding-right:2rem!important}div.extendify .md\:pl-8,div.extendify .md\:px-8{padding-left:2rem!important}div.extendify .md\:leading-3{line-height:.75rem!important}}@media (min-width:1080px){div.extendify .lg\:absolute{position:absolute!important}div.extendify .lg\:block{display:block!important}div.extendify .lg\:flex{display:flex!important}div.extendify .lg\:overflow-hidden{overflow:hidden!important}div.extendify .lg\:p-16{padding:4rem!important}}
public/build/extendify.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ /*! For license information please see extendify.js.LICENSE.txt */
2
+ (()=>{var e,t={135:(e,t,n)=>{e.exports=n(248)},206:(e,t,n)=>{e.exports=n(57)},387:(e,t,n)=>{"use strict";var r=n(485),o=n(570),i=n(940),a=n(581),s=n(574),l=n(845),c=n(338),u=n(524),d=n(141),f=n(132);e.exports=function(e){return new Promise((function(t,n){var p,h=e.data,m=e.headers,x=e.responseType;function y(){e.cancelToken&&e.cancelToken.unsubscribe(p),e.signal&&e.signal.removeEventListener("abort",p)}r.isFormData(h)&&delete m["Content-Type"];var v=new XMLHttpRequest;if(e.auth){var g=e.auth.username||"",b=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";m.Authorization="Basic "+btoa(g+":"+b)}var w=s(e.baseURL,e.url);function j(){if(v){var r="getAllResponseHeaders"in v?l(v.getAllResponseHeaders()):null,i={data:x&&"text"!==x&&"json"!==x?v.response:v.responseText,status:v.status,statusText:v.statusText,headers:r,config:e,request:v};o((function(e){t(e),y()}),(function(e){n(e),y()}),i),v=null}}if(v.open(e.method.toUpperCase(),a(w,e.params,e.paramsSerializer),!0),v.timeout=e.timeout,"onloadend"in v?v.onloadend=j:v.onreadystatechange=function(){v&&4===v.readyState&&(0!==v.status||v.responseURL&&0===v.responseURL.indexOf("file:"))&&setTimeout(j)},v.onabort=function(){v&&(n(u("Request aborted",e,"ECONNABORTED",v)),v=null)},v.onerror=function(){n(u("Network Error",e,null,v)),v=null},v.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||d.transitional;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",v)),v=null},r.isStandardBrowserEnv()){var k=(e.withCredentials||c(w))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;k&&(m[e.xsrfHeaderName]=k)}"setRequestHeader"in v&&r.forEach(m,(function(e,t){void 0===h&&"content-type"===t.toLowerCase()?delete m[t]:v.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(v.withCredentials=!!e.withCredentials),x&&"json"!==x&&(v.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&v.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&v.upload&&v.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(p=function(e){v&&(n(!e||e&&e.type?new f("canceled"):e),v.abort(),v=null)},e.cancelToken&&e.cancelToken.subscribe(p),e.signal&&(e.signal.aborted?p():e.signal.addEventListener("abort",p))),h||(h=null),v.send(h)}))}},57:(e,t,n)=>{"use strict";var r=n(485),o=n(875),i=n(29),a=n(941);var s=function e(t){var n=new i(t),s=o(i.prototype.request,n);return r.extend(s,i.prototype,n),r.extend(s,n),s.create=function(n){return e(a(t,n))},s}(n(141));s.Axios=i,s.Cancel=n(132),s.CancelToken=n(603),s.isCancel=n(475),s.VERSION=n(345).version,s.all=function(e){return Promise.all(e)},s.spread=n(739),s.isAxiosError=n(835),e.exports=s,e.exports.default=s},132:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},603:(e,t,n)=>{"use strict";var r=n(132);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;this.promise.then((function(e){if(n._listeners){var t,r=n._listeners.length;for(t=0;t<r;t++)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},o.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},475:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},29:(e,t,n)=>{"use strict";var r=n(485),o=n(581),i=n(96),a=n(9),s=n(941),l=n(144),c=l.validators;function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=e.transitional;void 0!==t&&l.assertOptions(t,{silentJSONParsing:c.transitional(c.boolean),forcedJSONParsing:c.transitional(c.boolean),clarifyTimeoutError:c.transitional(c.boolean)},!1);var n=[],r=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(r=r&&t.synchronous,n.unshift(t.fulfilled,t.rejected))}));var o,i=[];if(this.interceptors.response.forEach((function(e){i.push(e.fulfilled,e.rejected)})),!r){var u=[a,void 0];for(Array.prototype.unshift.apply(u,n),u=u.concat(i),o=Promise.resolve(e);u.length;)o=o.then(u.shift(),u.shift());return o}for(var d=e;n.length;){var f=n.shift(),p=n.shift();try{d=f(d)}catch(e){p(e);break}}try{o=a(d)}catch(e){return Promise.reject(e)}for(;i.length;)o=o.then(i.shift(),i.shift());return o},u.prototype.getUri=function(e){return e=s(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},r.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,n,r){return this.request(s(r||{},{method:e,url:t,data:n}))}})),e.exports=u},96:(e,t,n)=>{"use strict";var r=n(485);function o(){this.handlers=[]}o.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},574:(e,t,n)=>{"use strict";var r=n(642),o=n(288);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},524:(e,t,n)=>{"use strict";var r=n(953);e.exports=function(e,t,n,o,i){var a=new Error(e);return r(a,t,n,o,i)}},9:(e,t,n)=>{"use strict";var r=n(485),o=n(212),i=n(475),a=n(141),s=n(132);function l(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new s("canceled")}e.exports=function(e){return l(e),e.headers=e.headers||{},e.data=o.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||a.adapter)(e).then((function(t){return l(e),t.data=o.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(l(e),t&&t.response&&(t.response.data=o.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},953:e=>{"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e}},941:(e,t,n)=>{"use strict";var r=n(485);e.exports=function(e,t){t=t||{};var n={};function o(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function i(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(e[n],t[n])}function a(e){if(!r.isUndefined(t[e]))return o(void 0,t[e])}function s(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(void 0,t[n])}function l(n){return n in t?o(e[n],t[n]):n in e?o(void 0,e[n]):void 0}var c={url:a,method:a,data:a,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:l};return r.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=c[e]||i,o=t(e);r.isUndefined(o)&&t!==l||(n[e]=o)})),n}},570:(e,t,n)=>{"use strict";var r=n(524);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},212:(e,t,n)=>{"use strict";var r=n(485),o=n(141);e.exports=function(e,t,n){var i=this||o;return r.forEach(n,(function(n){e=n.call(i,e,t)})),e}},141:(e,t,n)=>{"use strict";var r=n(61),o=n(485),i=n(446),a=n(953),s={"Content-Type":"application/x-www-form-urlencoded"};function l(e,t){!o.isUndefined(e)&&o.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var c,u={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==r&&"[object process]"===Object.prototype.toString.call(r))&&(c=n(387)),c),transformRequest:[function(e,t){return i(t,"Accept"),i(t,"Content-Type"),o.isFormData(e)||o.isArrayBuffer(e)||o.isBuffer(e)||o.isStream(e)||o.isFile(e)||o.isBlob(e)?e:o.isArrayBufferView(e)?e.buffer:o.isURLSearchParams(e)?(l(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):o.isObject(e)||t&&"application/json"===t["Content-Type"]?(l(t,"application/json"),function(e,t,n){if(o.isString(e))try{return(t||JSON.parse)(e),o.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||u.transitional,n=t&&t.silentJSONParsing,r=t&&t.forcedJSONParsing,i=!n&&"json"===this.responseType;if(i||r&&o.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(i){if("SyntaxError"===e.name)throw a(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),o.forEach(["post","put","patch"],(function(e){u.headers[e]=o.merge(s)})),e.exports=u},345:e=>{e.exports={version:"0.24.0"}},875:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return e.apply(t,n)}}},581:(e,t,n)=>{"use strict";var r=n(485);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var a=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))})))})),i=a.join("&")}if(i){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},288:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},940:(e,t,n)=>{"use strict";var r=n(485);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var s=[];s.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),r.isString(o)&&s.push("path="+o),r.isString(i)&&s.push("domain="+i),!0===a&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},642:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},835:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},338:(e,t,n)=>{"use strict";var r=n(485);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},446:(e,t,n)=>{"use strict";var r=n(485);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},845:(e,t,n)=>{"use strict";var r=n(485),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,a={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(a[t]&&o.indexOf(t)>=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}})),a):a}},739:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},144:(e,t,n)=>{"use strict";var r=n(345).version,o={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){o[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var i={};o.transitional=function(e,t,n){function o(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,r,a){if(!1===e)throw new Error(o(r," has been removed"+(t?" in "+t:"")));return t&&!i[r]&&(i[r]=!0,console.warn(o(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,r,a)}},e.exports={assertOptions:function(e,t,n){if("object"!=typeof e)throw new TypeError("options must be an object");for(var r=Object.keys(e),o=r.length;o-- >0;){var i=r[o],a=t[i];if(a){var s=e[i],l=void 0===s||a(s,i,e);if(!0!==l)throw new TypeError("option "+i+" must be "+l)}else if(!0!==n)throw Error("Unknown option "+i)}},validators:o}},485:(e,t,n)=>{"use strict";var r=n(875),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function a(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===o.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(null,e[o],o,e)}e.exports={isArray:i,isArrayBuffer:function(e){return"[object ArrayBuffer]"===o.call(e)},isBuffer:function(e){return null!==e&&!a(e)&&null!==e.constructor&&!a(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"undefined"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:s,isPlainObject:l,isUndefined:a,isDate:function(e){return"[object Date]"===o.call(e)},isFile:function(e){return"[object File]"===o.call(e)},isBlob:function(e){return"[object Blob]"===o.call(e)},isFunction:c,isStream:function(e){return s(e)&&c(e.pipe)},isURLSearchParams:function(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:u,merge:function e(){var t={};function n(n,r){l(t[r])&&l(n)?t[r]=e(t[r],n):l(n)?t[r]=e({},n):i(n)?t[r]=n.slice():t[r]=n}for(var r=0,o=arguments.length;r<o;r++)u(arguments[r],n);return t},extend:function(e,t,n){return u(t,(function(t,o){e[o]=n&&"function"==typeof t?r(t,n):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}}},78:(e,t,n)=>{"use strict";const r=wp.element;var o=n(363),i=n.n(o);function a(e){let t;const n=new Set,r=(e,r)=>{const o="function"==typeof e?e(t):e;if(o!==t){const e=t;t=r?o:Object.assign({},t,o),n.forEach((n=>n(t,e)))}},o=()=>t,i={setState:r,getState:o,subscribe:(e,r,i)=>r||i?((e,r=o,i=Object.is)=>{console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");let a=r(t);function s(){const n=r(t);if(!i(a,n)){const t=a;e(a=n,t)}}return n.add(s),()=>n.delete(s)})(e,r,i):(n.add(e),()=>n.delete(e)),destroy:()=>n.clear()};return t=e(r,o,i),i}const s="undefined"==typeof window||!window.navigator||/ServerSideRendering|^Deno\//.test(window.navigator.userAgent)?o.useEffect:o.useLayoutEffect;function l(e){const t="function"==typeof e?a(e):e,n=(e=t.getState,n=Object.is)=>{const[,r]=(0,o.useReducer)((e=>e+1),0),i=t.getState(),a=(0,o.useRef)(i),l=(0,o.useRef)(e),c=(0,o.useRef)(n),u=(0,o.useRef)(!1),d=(0,o.useRef)();let f;void 0===d.current&&(d.current=e(i));let p=!1;(a.current!==i||l.current!==e||c.current!==n||u.current)&&(f=e(i),p=!n(d.current,f)),s((()=>{p&&(d.current=f),a.current=i,l.current=e,c.current=n,u.current=!1}));const h=(0,o.useRef)(i);s((()=>{const e=()=>{try{const e=t.getState(),n=l.current(e);c.current(d.current,n)||(a.current=e,d.current=n,r())}catch(e){u.current=!0,r()}},n=t.subscribe(e);return t.getState()!==h.current&&e(),n}),[]);const m=p?f:d.current;return(0,o.useDebugValue)(m),m};return Object.assign(n,t),n[Symbol.iterator]=function(){console.warn("[useStore, api] = create() is deprecated and will be removed in v4");const e=[n,t];return{next(){const t=e.length<=0;return{value:e.shift(),done:t}}}},n}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var c=Object.defineProperty,u=Object.getOwnPropertySymbols,d=Object.prototype.hasOwnProperty,f=Object.prototype.propertyIsEnumerable,p=(e,t,n)=>t in e?c(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,h=(e,t)=>{for(var n in t||(t={}))d.call(t,n)&&p(e,n,t[n]);if(u)for(var n of u(t))f.call(t,n)&&p(e,n,t[n]);return e};const m=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then:e=>m(e)(n),catch(e){return this}}}catch(e){return{then(e){return this},catch:t=>m(t)(e)}}},x=(e,t)=>(n,r,o)=>{let i=h({getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:e=>e,version:0,merge:(e,t)=>h(h({},t),e)},t);(i.blacklist||i.whitelist)&&console.warn(`The ${i.blacklist?"blacklist":"whitelist"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);let a=!1;const s=new Set,l=new Set;let c;try{c=i.getStorage()}catch(e){}if(!c)return e(((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${i.name}', the given storage is currently unavailable.`),n(...e)}),r,o);c.removeItem||console.warn(`[zustand persist middleware] The given storage for item '${i.name}' does not contain a 'removeItem' method, which will be required in v4.`);const u=m(i.serialize),d=()=>{const e=i.partialize(h({},r()));let t;i.whitelist&&Object.keys(e).forEach((t=>{var n;!(null==(n=i.whitelist)?void 0:n.includes(t))&&delete e[t]})),i.blacklist&&i.blacklist.forEach((t=>delete e[t]));const n=u({state:e,version:i.version}).then((e=>c.setItem(i.name,e))).catch((e=>{t=e}));if(t)throw t;return n},f=o.setState;o.setState=(e,t)=>{f(e,t),d()};const p=e(((...e)=>{n(...e),d()}),r,o);let x;const y=()=>{var e;if(!c)return;a=!1,s.forEach((e=>e(r())));const t=(null==(e=i.onRehydrateStorage)?void 0:e.call(i,r()))||void 0;return m(c.getItem.bind(c))(i.name).then((e=>{if(e)return i.deserialize(e)})).then((e=>{if(e){if("number"!=typeof e.version||e.version===i.version)return e.state;if(i.migrate)return i.migrate(e.state,e.version);console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}})).then((e=>(x=i.merge(e,p),n(x,!0),d()))).then((()=>{null==t||t(x,void 0),a=!0,l.forEach((e=>e(x)))})).catch((e=>{null==t||t(void 0,e)}))};return o.persist={setOptions:e=>{i=h(h({},i),e),e.getStorage&&(c=e.getStorage())},clearStorage:()=>{var e;null==(e=null==c?void 0:c.removeItem)||e.call(c,i.name)},rehydrate:()=>y(),hasHydrated:()=>a,onHydrate:e=>(s.add(e),()=>{s.delete(e)}),onFinishHydration:e=>(l.add(e),()=>{l.delete(e)})},y(),x||p};var y=l(x((function(e){return{open:!1,metaData:{},currentTaxonomies:{},currentType:"pattern",settingsModal:!1,currentModal:null,updateCurrentTaxonomies:function(t){return e({currentTaxonomies:Object.assign({},t)})},updateCurrentType:function(t){return e({currentType:t})},setOpen:function(t){e({open:t})},setCurrentModal:function(t){e({currentModal:t})}}}),{name:"extendify-global-state",partialize:function(e){return delete e.currentModal,e}})),v=n(135),g=n.n(v),b=n(206),w=n.n(b)().create({baseURL:window.extendifyData.root,headers:{"X-WP-Nonce":window.extendifyData.nonce,"X-Requested-With":"XMLHttpRequest","X-Extendify":!0}});function j(e){return Object.prototype.hasOwnProperty.call(e,"data")?e.data:e}w.interceptors.response.use((function(e){return function(e){return Object.prototype.hasOwnProperty.call(e,"soft_error")&&window.dispatchEvent(new CustomEvent("extendify::softerror-encountered",{detail:e.soft_error,bubbles:!0})),e}(j(e))}),(function(e){return function(e){if(e.response)return console.error(e.response),Promise.reject(j(e.response))}(e)})),w.interceptors.request.use((function(e){return function(e){return e.headers["X-Extendify-Dev-Mode"]=window.location.search.indexOf("DEVMODE")>-1,e.headers["X-Extendify-Local-Mode"]=window.location.search.indexOf("LOCALMODE")>-1,e}(function(e){return e.data&&(e.data.remaining_imports=F.getState().remainingImports(),e.data.entry_point=F.getState().entryPoint,e.data.total_imports=F.getState().imports),e}(e))}),(function(e){return e}));var k=function(){return w.get("user")},O=function(e,t){var n=new FormData;return n.append("email",e),n.append("key",t),w.post("login",n,{headers:{"Content-Type":"multipart/form-data"}})},S=function(e){var t=new FormData;return t.append("data",JSON.stringify(e)),w.post("user",t,{headers:{"Content-Type":"multipart/form-data"}})},C=function(e){var t=new FormData;return t.append("email",e),w.post("register-mailing-list",t,{headers:{"Content-Type":"multipart/form-data"}})},E=function(){return w.get("max-free-imports")};function _(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function N(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?_(Object(n),!0).forEach((function(t){P(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):_(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function P(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function A(e){return function(e){if(Array.isArray(e))return T(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return T(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return T(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function L(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function I(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){L(i,r,o,a,s,"next",e)}function s(e){L(i,r,o,a,s,"throw",e)}a(void 0)}))}}var M,R,D={getItem:(R=I(g().mark((function e(){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k();case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)}))),function(){return R.apply(this,arguments)}),setItem:(M=I(g().mark((function e(t,n){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S(n);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)}))),function(e,t){return M.apply(this,arguments)}),removeItem:function(){}},F=l(x((function(e,t){return{firstLoadedOn:(new Date).toISOString(),email:"",apiKey:"",imports:0,uuid:"",sdkPartner:"",registration:{email:"",optedOut:!1},noticesDismissedAt:{},allowedImports:0,entryPoint:"not-set",enabled:null===window.extendifyData.sitesettings||(null===(n=window.extendifyData)||void 0===n||null===(r=n.sitesettings)||void 0===r||null===(o=r.state)||void 0===o?void 0:o.enabled),canInstallPlugins:!1,canActivatePlugins:!1,preferredOptions:{taxonomies:{},type:"",search:""},preferredOptionsHistory:{siteType:[]},incrementImports:function(){return e({imports:t().imports+1})},canImport:function(){return!!t().apiKey||Number(t().imports)<Number(t().allowedImports)},remainingImports:function(){if(t().apiKey)return"unlimited";var e=Number(t().allowedImports)-Number(t().imports);return e>0?e:0},updatePreferredSiteType:function(n){var r,o;if(t().updatePreferredOption("siteType",n),null!=n&&n.slug&&"unknown"!==n.slug){var i=null!==(r=null===(o=t().preferredOptionsHistory)||void 0===o?void 0:o.siteType)&&void 0!==r?r:[];if(!i.find((function(e){return e.slug===n.slug}))){var a=[n].concat(A(i));e({preferredOptionsHistory:Object.assign({},t().preferredOptionsHistory,{siteType:a.slice(0,3)})})}}},updatePreferredOption:function(n,r){var o,i;Object.prototype.hasOwnProperty.call(t().preferredOptions,n)||(r=Object.assign({},null!==(o=null===(i=t().preferredOptions)||void 0===i?void 0:i.taxonomies)&&void 0!==o?o:{},P({},n,r)),n="taxonomies");e({preferredOptions:N({},Object.assign({},t().preferredOptions,P({},n,r)))})}};var n,r,o}),{name:"extendify-user",getStorage:function(){return D}})),B=l(x((function(e){return{taxonomies:{},setTaxonomies:function(t){return e({taxonomies:t})}}}),{name:"extendify-taxonomies"}));function z(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function U(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?z(Object(n),!0).forEach((function(t){q(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):z(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function q(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function W(e){return function(e){if(Array.isArray(e))return V(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return V(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return V(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function V(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var $,H,J=l((function(e,t){return{templates:[],skipNextFetch:!1,fetchToken:null,taxonomyDefaultState:{},nextPage:"",searchParams:{taxonomies:{},type:"pattern"},initTemplateData:function(){e({activeTemplate:{}}),t().setupDefaultTaxonomies(),t().updateType(y.getState().currentType)},appendTemplates:function(n){return e({templates:W(new Map([].concat(W(t().templates),W(n)).map((function(e){return[e.id,e]}))).values())})},setupDefaultTaxonomies:function(){var n,r,o,i,a=B.getState().taxonomies,s=Object.entries(a).reduce((function(e,t){return e[t[0]]=function(e){return"siteType"===e?{slug:"",title:"Unknown"}:{slug:"",title:"Featured"}}(t[0]),e}),{}),l={},c=null!==(n=null===(r=F.getState().preferredOptions)||void 0===r?void 0:r.taxonomies)&&void 0!==n?n:{};c.tax_categories&&(c=t().getLegacySiteType(c,a)),s=Object.assign({},s,c,null!==(o=null===(i=y.getState())||void 0===i?void 0:i.currentTaxonomies)&&void 0!==o?o:{}),l.taxonomies=Object.assign({},s),e({taxonomyDefaultState:s,searchParams:U({},Object.assign(t().searchParams,l))})},updateTaxonomies:function(e){var n,r,o={};(o.taxonomies=Object.assign({},t().searchParams.taxonomies,e),null!=o&&null!==(n=o.taxonomies)&&void 0!==n&&n.siteType)&&F.getState().updatePreferredOption("siteType",null==o||null===(r=o.taxonomies)||void 0===r?void 0:r.siteType);y.getState().updateCurrentTaxonomies(null==o?void 0:o.taxonomies),t().updateSearchParams(o)},updateType:function(e){y.getState().updateCurrentType(e),t().updateSearchParams({type:e})},updateSearchParams:function(n){null!=n&&n.taxonomies&&!Object.keys(n.taxonomies).length&&(n.taxonomies=t().taxonomyDefaultState);var r=Object.assign({},t().searchParams,n);JSON.stringify(r)!==JSON.stringify(t().searchParams)&&e({templates:[],nextPage:"",searchParams:r})},getLegacySiteType:function(e,n){var r=n.siteType.find((function(t){return[t.slug,null==t?void 0:t.title].includes(e.tax_categories)}));return F.getState().updatePreferredSiteType(r),t().updateTaxonomies({siteType:r}),F.getState().updatePreferredOption("tax_categories",null),F.getState().preferredOptions.taxonomies}}}));function G(){return G=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},G.apply(this,arguments)}function K(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}function Y(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Z(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Y(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Y(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function X(e,t){if(e in t){for(var n=t[e],r=arguments.length,o=new Array(r>2?r-2:0),i=2;i<r;i++)o[i-2]=arguments[i];return"function"==typeof n?n.apply(void 0,o):n}var a=new Error('Tried to handle "'+e+'" but there is no handler defined. Only defined handlers are: '+Object.keys(t).map((function(e){return'"'+e+'"'})).join(", ")+".");throw Error.captureStackTrace&&Error.captureStackTrace(a,X),a}function Q(e){var t=e.props,n=e.slot,r=e.defaultTag,o=e.features,i=e.visible,a=void 0===i||i,s=e.name;if(a)return ee(t,n,r,s);var l=null!=o?o:$.None;if(l&$.Static){var c=t.static,u=void 0!==c&&c,d=K(t,["static"]);if(u)return ee(d,n,r,s)}if(l&$.RenderStrategy){var f,p=t.unmount,h=void 0===p||p,m=K(t,["unmount"]);return X(h?H.Unmount:H.Hidden,((f={})[H.Unmount]=function(){return null},f[H.Hidden]=function(){return ee(G({},m,{hidden:!0,style:{display:"none"}}),n,r,s)},f))}return ee(t,n,r,s)}function ee(e,t,n,r){var i;void 0===t&&(t={});var a=ne(e,["unmount","static"]),s=a.as,l=void 0===s?n:s,c=a.children,u=a.refName,d=void 0===u?"ref":u,f=K(a,["as","children","refName"]),p=void 0!==e.ref?((i={})[d]=e.ref,i):{},h="function"==typeof c?c(t):c;if(f.className&&"function"==typeof f.className&&(f.className=f.className(t)),l===o.Fragment&&Object.keys(f).length>0){if(!(0,o.isValidElement)(h)||Array.isArray(h)&&h.length>1)throw new Error(['Passing props on "Fragment"!',"","The current component <"+r+' /> is rendering a "Fragment".',"However we need to passthrough the following props:",Object.keys(f).map((function(e){return" - "+e})).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map((function(e){return" - "+e})).join("\n")].join("\n"));return(0,o.cloneElement)(h,Object.assign({},function(e,t,n){for(var r,o=Object.assign({},e),i=function(){var n,i=r.value;void 0!==e[i]&&void 0!==t[i]&&Object.assign(o,((n={})[i]=function(n){n.defaultPrevented||e[i](n),n.defaultPrevented||t[i](n)},n))},a=Z(n);!(r=a()).done;)i();return o}(function(e){var t=Object.assign({},e);for(var n in t)void 0===t[n]&&delete t[n];return t}(ne(f,["ref"])),h.props,["onClick"]),p))}return(0,o.createElement)(l,Object.assign({},ne(f,["ref"]),l!==o.Fragment&&p),h)}function te(e){var t;return Object.assign((0,o.forwardRef)(e),{displayName:null!=(t=e.displayName)?t:e.name})}function ne(e,t){void 0===t&&(t=[]);for(var n,r=Object.assign({},e),o=Z(t);!(n=o()).done;){var i=n.value;i in r&&delete r[i]}return r}!function(e){e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static"}($||($={})),function(e){e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden"}(H||(H={}));var re="undefined"!=typeof window?o.useLayoutEffect:o.useEffect,oe={serverHandoffComplete:!1};function ie(){var e=(0,o.useState)(oe.serverHandoffComplete),t=e[0],n=e[1];return(0,o.useEffect)((function(){!0!==t&&n(!0)}),[t]),(0,o.useEffect)((function(){!1===oe.serverHandoffComplete&&(oe.serverHandoffComplete=!0)}),[]),t}var ae=0;function se(){return++ae}function le(){var e=ie(),t=(0,o.useState)(e?se:null),n=t[0],r=t[1];return re((function(){null===n&&r(se())}),[n]),null!=n?""+n:void 0}function ce(){var e=(0,o.useRef)(!1);return(0,o.useEffect)((function(){return e.current=!0,function(){e.current=!1}}),[]),e}var ue,de,fe=(0,o.createContext)(null);function pe(){return(0,o.useContext)(fe)}function he(e){var t=e.value,n=e.children;return i().createElement(fe.Provider,{value:t},n)}function me(){var e=[],t={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){var e=requestAnimationFrame.apply(void 0,arguments);t.add((function(){return cancelAnimationFrame(e)}))})),nextFrame:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.requestAnimationFrame((function(){t.requestAnimationFrame.apply(t,n)}))},setTimeout:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){var e=setTimeout.apply(void 0,arguments);t.add((function(){return clearTimeout(e)}))})),add:function(t){e.push(t)},dispose:function(){for(var t,n=Z(e.splice(0));!(t=n()).done;){var r=t.value;r()}}};return t}function xe(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];e&&r.length>0&&(t=e.classList).add.apply(t,r)}function ye(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];e&&r.length>0&&(t=e.classList).remove.apply(t,r)}function ve(e,t,n,r,o,i){var a=me(),s=void 0!==i?function(e){var t={called:!1};return function(){if(!t.called)return t.called=!0,e.apply(void 0,arguments)}}(i):function(){};return ye.apply(void 0,[e].concat(o)),xe.apply(void 0,[e].concat(t,n)),a.nextFrame((function(){ye.apply(void 0,[e].concat(n)),xe.apply(void 0,[e].concat(r)),a.add(function(e,t){var n=me();if(!e)return n.dispose;var r=getComputedStyle(e),o=[r.transitionDuration,r.transitionDelay].map((function(e){var t=e.split(",").filter(Boolean).map((function(e){return e.includes("ms")?parseFloat(e):1e3*parseFloat(e)})).sort((function(e,t){return t-e}))[0];return void 0===t?0:t})),i=o[0],a=o[1];return 0!==i?n.setTimeout((function(){t(de.Finished)}),i+a):t(de.Finished),n.add((function(){return t(de.Cancelled)})),n.dispose}(e,(function(n){return ye.apply(void 0,[e].concat(r,t)),xe.apply(void 0,[e].concat(o)),s(n)})))})),a.add((function(){return ye.apply(void 0,[e].concat(t,n,r,o))})),a.add((function(){return s(de.Cancelled)})),a.dispose}function ge(e){return void 0===e&&(e=""),(0,o.useMemo)((function(){return e.split(" ").filter((function(e){return e.trim().length>1}))}),[e])}fe.displayName="OpenClosedContext",function(e){e[e.Open=0]="Open",e[e.Closed=1]="Closed"}(ue||(ue={})),function(e){e.Finished="finished",e.Cancelled="cancelled"}(de||(de={}));var be,we=(0,o.createContext)(null);we.displayName="TransitionContext",function(e){e.Visible="visible",e.Hidden="hidden"}(be||(be={}));var je=(0,o.createContext)(null);function ke(e){return"children"in e?ke(e.children):e.current.filter((function(e){return e.state===be.Visible})).length>0}function Oe(e){var t=(0,o.useRef)(e),n=(0,o.useRef)([]),r=ce();(0,o.useEffect)((function(){t.current=e}),[e]);var i=(0,o.useCallback)((function(e,o){var i;void 0===o&&(o=H.Hidden);var a=n.current.findIndex((function(t){return t.id===e}));-1!==a&&(X(o,((i={})[H.Unmount]=function(){n.current.splice(a,1)},i[H.Hidden]=function(){n.current[a].state=be.Hidden},i)),!ke(n)&&r.current&&(null==t.current||t.current()))}),[t,r,n]),a=(0,o.useCallback)((function(e){var t=n.current.find((function(t){return t.id===e}));return t?t.state!==be.Visible&&(t.state=be.Visible):n.current.push({id:e,state:be.Visible}),function(){return i(e,H.Unmount)}}),[n,i]);return(0,o.useMemo)((function(){return{children:n,register:a,unregister:i}}),[a,i,n])}function Se(){}je.displayName="NestingContext";var Ce=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function Ee(e){for(var t,n={},r=Z(Ce);!(t=r()).done;){var o,i=t.value;n[i]=null!=(o=e[i])?o:Se}return n}var _e,Ne=$.RenderStrategy;function Pe(e){var t,n=e.beforeEnter,r=e.afterEnter,a=e.beforeLeave,s=e.afterLeave,l=e.enter,c=e.enterFrom,u=e.enterTo,d=e.entered,f=e.leave,p=e.leaveFrom,h=e.leaveTo,m=K(e,["beforeEnter","afterEnter","beforeLeave","afterLeave","enter","enterFrom","enterTo","entered","leave","leaveFrom","leaveTo"]),x=(0,o.useRef)(null),y=(0,o.useState)(be.Visible),v=y[0],g=y[1],b=m.unmount?H.Unmount:H.Hidden,w=function(){var e=(0,o.useContext)(we);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),j=w.show,k=w.appear,O=w.initial,S=function(){var e=(0,o.useContext)(je);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),C=S.register,E=S.unregister,_=le(),N=(0,o.useRef)(!1),P=Oe((function(){N.current||(g(be.Hidden),E(_),F.current.afterLeave())}));re((function(){if(_)return C(_)}),[C,_]),re((function(){var e;b===H.Hidden&&_&&(j&&v!==be.Visible?g(be.Visible):X(v,((e={})[be.Hidden]=function(){return E(_)},e[be.Visible]=function(){return C(_)},e)))}),[v,_,C,E,j,b]);var A=ge(l),T=ge(c),L=ge(u),I=ge(d),M=ge(f),R=ge(p),D=ge(h),F=function(e){var t=(0,o.useRef)(Ee(e));return(0,o.useEffect)((function(){t.current=Ee(e)}),[e]),t}({beforeEnter:n,afterEnter:r,beforeLeave:a,afterLeave:s}),B=ie();(0,o.useEffect)((function(){if(B&&v===be.Visible&&null===x.current)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}),[x,v,B]);var z=O&&!k;re((function(){var e=x.current;if(e&&!z)return N.current=!0,j&&F.current.beforeEnter(),j||F.current.beforeLeave(),j?ve(e,A,T,L,I,(function(e){N.current=!1,e===de.Finished&&F.current.afterEnter()})):ve(e,M,R,D,I,(function(e){N.current=!1,e===de.Finished&&(ke(P)||(g(be.Hidden),E(_),F.current.afterLeave()))}))}),[F,_,N,E,P,x,z,j,A,T,L,M,R,D]);var U={ref:x},q=m;return i().createElement(je.Provider,{value:P},i().createElement(he,{value:X(v,(t={},t[be.Visible]=ue.Open,t[be.Hidden]=ue.Closed,t))},Q({props:G({},q,U),defaultTag:"div",features:Ne,visible:v===be.Visible,name:"Transition.Child"})))}function Ae(e){var t,n=e.show,r=e.appear,a=void 0!==r&&r,s=e.unmount,l=K(e,["show","appear","unmount"]),c=pe();void 0===n&&null!==c&&(n=X(c,((t={})[ue.Open]=!0,t[ue.Closed]=!1,t)));if(![!0,!1].includes(n))throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");var u=(0,o.useState)(n?be.Visible:be.Hidden),d=u[0],f=u[1],p=Oe((function(){f(be.Hidden)})),h=function(){var e=(0,o.useRef)(!0);return(0,o.useEffect)((function(){e.current=!1}),[]),e.current}(),m=(0,o.useMemo)((function(){return{show:n,appear:a||!h,initial:h}}),[n,a,h]);(0,o.useEffect)((function(){n?f(be.Visible):ke(p)||f(be.Hidden)}),[n,p]);var x={unmount:s};return i().createElement(je.Provider,{value:p},i().createElement(we.Provider,{value:m},Q({props:G({},x,{as:o.Fragment,children:i().createElement(Pe,Object.assign({},x,l))}),defaultTag:o.Fragment,features:Ne,visible:d===be.Visible,name:"Transition"})))}function Te(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=(0,o.useRef)(t);return(0,o.useEffect)((function(){r.current=t}),[t]),(0,o.useCallback)((function(e){for(var t,n=Z(r.current);!(t=n()).done;){var o=t.value;null!=o&&("function"==typeof o?o(e):o.current=e)}}),[r])}function Le(e){for(var t,n,r=e.parentElement,o=null;r&&!(r instanceof HTMLFieldSetElement);)r instanceof HTMLLegendElement&&(o=r),r=r.parentElement;var i=null!=(t=""===(null==(n=r)?void 0:n.getAttribute("disabled")))&&t;return(!i||!function(e){if(!e)return!1;var t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(o))&&i}function Ie(e,t,n){var r=(0,o.useRef)(t);r.current=t,(0,o.useEffect)((function(){function t(e){r.current.call(window,e)}return window.addEventListener(e,t,n),function(){return window.removeEventListener(e,t,n)}}),[e,n])}Ae.Child=function(e){var t=null!==(0,o.useContext)(we),n=null!==pe();return!t&&n?i().createElement(Ae,Object.assign({},e)):i().createElement(Pe,Object.assign({},e))},Ae.Root=Ae,function(e){e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab"}(_e||(_e={}));var Me,Re,De,Fe,Be,ze=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((function(e){return e+":not([tabindex='-1'])"})).join(",");function Ue(e){null==e||e.focus({preventScroll:!0})}function qe(e,t){var n=Array.isArray(e)?e:function(e){return void 0===e&&(e=document.body),null==e?[]:Array.from(e.querySelectorAll(ze))}(e),r=document.activeElement,o=function(){if(t&(Me.First|Me.Next))return De.Next;if(t&(Me.Previous|Me.Last))return De.Previous;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")}(),i=function(){if(t&Me.First)return 0;if(t&Me.Previous)return Math.max(0,n.indexOf(r))-1;if(t&Me.Next)return Math.max(0,n.indexOf(r))+1;if(t&Me.Last)return n.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")}(),a=t&Me.NoScroll?{preventScroll:!0}:{},s=0,l=n.length,c=void 0;do{var u;if(s>=l||s+l<=0)return Re.Error;var d=i+s;if(t&Me.WrapAround)d=(d+l)%l;else{if(d<0)return Re.Underflow;if(d>=l)return Re.Overflow}null==(u=c=n[d])||u.focus(a),s+=o}while(c!==document.activeElement);return c.hasAttribute("tabindex")||c.setAttribute("tabindex","0"),Re.Success}function We(e,t,n){void 0===t&&(t=Be.All);var r=void 0===n?{}:n,i=r.initialFocus,a=r.containers,s=(0,o.useRef)("undefined"!=typeof window?document.activeElement:null),l=(0,o.useRef)(null),c=ce(),u=Boolean(t&Be.RestoreFocus),d=Boolean(t&Be.InitialFocus);(0,o.useEffect)((function(){u&&(s.current=document.activeElement)}),[u]),(0,o.useEffect)((function(){if(u)return function(){Ue(s.current),s.current=null}}),[u]),(0,o.useEffect)((function(){if(d&&e.current){var t=document.activeElement;if(null==i?void 0:i.current){if((null==i?void 0:i.current)===t)return void(l.current=t)}else if(e.current.contains(t))return void(l.current=t);(null==i?void 0:i.current)?Ue(i.current):qe(e.current,Me.First)===Re.Error&&console.warn("There are no focusable elements inside the <FocusTrap />"),l.current=document.activeElement}}),[e,i,d]),Ie("keydown",(function(n){t&Be.TabLock&&e.current&&n.key===_e.Tab&&(n.preventDefault(),qe(e.current,(n.shiftKey?Me.Previous:Me.Next)|Me.WrapAround)===Re.Success&&(l.current=document.activeElement))})),Ie("focus",(function(n){if(t&Be.FocusLock){var r=new Set(null==a?void 0:a.current);if(r.add(e),r.size){var o=l.current;if(o&&c.current){var i=n.target;i&&i instanceof HTMLElement?!function(e,t){for(var n,r=Z(e);!(n=r()).done;){var o;if(null==(o=n.value.current)?void 0:o.contains(t))return!0}return!1}(r,i)?(n.preventDefault(),n.stopPropagation(),Ue(o)):(l.current=i,Ue(i)):Ue(l.current)}}}}),!0)}!function(e){e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll"}(Me||(Me={})),function(e){e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow"}(Re||(Re={})),function(e){e[e.Previous=-1]="Previous",e[e.Next=1]="Next"}(De||(De={})),function(e){e[e.Strict=0]="Strict",e[e.Loose=1]="Loose"}(Fe||(Fe={})),function(e){e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All"}(Be||(Be={}));var Ve=new Set,$e=new Map;function He(e){e.setAttribute("aria-hidden","true"),e.inert=!0}function Je(e){var t=$e.get(e);t&&(null===t["aria-hidden"]?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",t["aria-hidden"]),e.inert=t.inert)}var Ge=(0,o.createContext)(!1);function Ke(e){return i().createElement(Ge.Provider,{value:e.force},e.children)}const Ye=ReactDOM;function Ze(){var e=(0,o.useContext)(Ge),t=(0,o.useContext)(tt),n=(0,o.useState)((function(){if(!e&&null!==t)return null;if("undefined"==typeof window)return null;var n=document.getElementById("headlessui-portal-root");if(n)return n;var r=document.createElement("div");return r.setAttribute("id","headlessui-portal-root"),document.body.appendChild(r)})),r=n[0],i=n[1];return(0,o.useEffect)((function(){e||null!==t&&i(t.current)}),[t,i,e]),r}var Xe=o.Fragment;function Qe(e){var t=e,n=Ze(),r=(0,o.useState)((function(){return"undefined"==typeof window?null:document.createElement("div")}))[0],i=ie();return re((function(){if(n&&r)return n.appendChild(r),function(){var e;n&&(r&&(n.removeChild(r),n.childNodes.length<=0&&(null==(e=n.parentElement)||e.removeChild(n))))}}),[n,r]),i&&n&&r?(0,Ye.createPortal)(Q({props:t,defaultTag:Xe,name:"Portal"}),r):null}var et=o.Fragment,tt=(0,o.createContext)(null);Qe.Group=function(e){var t=e.target,n=K(e,["target"]);return i().createElement(tt.Provider,{value:t},Q({props:n,defaultTag:et,name:"Popover.Group"}))};var nt=(0,o.createContext)(null);function rt(){var e=(0,o.useContext)(nt);if(null===e){var t=new Error("You used a <Description /> component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,rt),t}return e}var ot,it,at,st,lt=(0,o.createContext)((function(){}));function ct(e){var t=e.children,n=e.onUpdate,r=e.type,a=e.element,s=(0,o.useContext)(lt),l=(0,o.useCallback)((function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];null==n||n.apply(void 0,t),s.apply(void 0,t)}),[s,n]);return re((function(){return l(ot.Add,r,a),function(){return l(ot.Remove,r,a)}}),[l,r,a]),i().createElement(lt.Provider,{value:l},t)}lt.displayName="StackContext",function(e){e[e.Add=0]="Add",e[e.Remove=1]="Remove"}(ot||(ot={})),function(e){e[e.Open=0]="Open",e[e.Closed=1]="Closed"}(at||(at={})),function(e){e[e.SetTitleId=0]="SetTitleId"}(st||(st={}));var ut=((it={})[st.SetTitleId]=function(e,t){return e.titleId===t.id?e:G({},e,{titleId:t.id})},it),dt=(0,o.createContext)(null);function ft(e){var t=(0,o.useContext)(dt);if(null===t){var n=new Error("<"+e+" /> is missing a parent <"+yt.displayName+" /> component.");throw Error.captureStackTrace&&Error.captureStackTrace(n,ft),n}return t}function pt(e,t){return X(t.type,ut,e,t)}dt.displayName="DialogContext";var ht=$.RenderStrategy|$.Static,mt=te((function(e,t){var n,r=e.open,a=e.onClose,s=e.initialFocus,l=K(e,["open","onClose","initialFocus"]),c=(0,o.useState)(0),u=c[0],d=c[1],f=pe();void 0===r&&null!==f&&(r=X(f,((n={})[ue.Open]=!0,n[ue.Closed]=!1,n)));var p=(0,o.useRef)(new Set),h=(0,o.useRef)(null),m=Te(h,t),x=e.hasOwnProperty("open")||null!==f,y=e.hasOwnProperty("onClose");if(!x&&!y)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!x)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!y)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if("boolean"!=typeof r)throw new Error("You provided an `open` prop to the `Dialog`, but the value is not a boolean. Received: "+r);if("function"!=typeof a)throw new Error("You provided an `onClose` prop to the `Dialog`, but the value is not a function. Received: "+a);var v=r?at.Open:at.Closed,g=null!==f?f===ue.Open:v===at.Open,b=(0,o.useReducer)(pt,{titleId:null,descriptionId:null}),w=b[0],j=b[1],k=(0,o.useCallback)((function(){return a(!1)}),[a]),O=(0,o.useCallback)((function(e){return j({type:st.SetTitleId,id:e})}),[j]),S=ie()&&v===at.Open,C=u>1,E=null!==(0,o.useContext)(dt);We(h,S?X(C?"parent":"leaf",{parent:Be.RestoreFocus,leaf:Be.All}):Be.None,{initialFocus:s,containers:p}),function(e,t){void 0===t&&(t=!0),re((function(){if(t&&e.current){var n=e.current;Ve.add(n);for(var r,o=Z($e.keys());!(r=o()).done;){var i=r.value;i.contains(n)&&(Je(i),$e.delete(i))}return document.querySelectorAll("body > *").forEach((function(e){if(e instanceof HTMLElement){for(var t,n=Z(Ve);!(t=n()).done;){var r=t.value;if(e.contains(r))return}1===Ve.size&&($e.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),He(e))}})),function(){if(Ve.delete(n),Ve.size>0)document.querySelectorAll("body > *").forEach((function(e){if(e instanceof HTMLElement&&!$e.has(e)){for(var t,n=Z(Ve);!(t=n()).done;){var r=t.value;if(e.contains(r))return}$e.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),He(e)}}));else for(var e,t=Z($e.keys());!(e=t()).done;){var r=e.value;Je(r),$e.delete(r)}}}}),[t])}(h,!!C&&S),Ie("mousedown",(function(e){var t,n=e.target;v===at.Open&&(C||(null==(t=h.current)?void 0:t.contains(n))||k())})),Ie("keydown",(function(e){e.key===_e.Escape&&v===at.Open&&(C||(e.preventDefault(),e.stopPropagation(),k()))})),(0,o.useEffect)((function(){if(v===at.Open&&!E){var e=document.documentElement.style.overflow,t=document.documentElement.style.paddingRight,n=window.innerWidth-document.documentElement.clientWidth;return document.documentElement.style.overflow="hidden",document.documentElement.style.paddingRight=n+"px",function(){document.documentElement.style.overflow=e,document.documentElement.style.paddingRight=t}}}),[v,E]),(0,o.useEffect)((function(){if(v===at.Open&&h.current){var e=new IntersectionObserver((function(e){for(var t,n=Z(e);!(t=n()).done;){var r=t.value;0===r.boundingClientRect.x&&0===r.boundingClientRect.y&&0===r.boundingClientRect.width&&0===r.boundingClientRect.height&&k()}}));return e.observe(h.current),function(){return e.disconnect()}}}),[v,h,k]);var _=function(){var e=(0,o.useState)([]),t=e[0],n=e[1];return[t.length>0?t.join(" "):void 0,(0,o.useMemo)((function(){return function(e){var t=(0,o.useCallback)((function(e){return n((function(t){return[].concat(t,[e])})),function(){return n((function(t){var n=t.slice(),r=n.indexOf(e);return-1!==r&&n.splice(r,1),n}))}}),[]),r=(0,o.useMemo)((function(){return{register:t,slot:e.slot,name:e.name,props:e.props}}),[t,e.slot,e.name,e.props]);return i().createElement(nt.Provider,{value:r},e.children)}}),[n])]}(),N=_[0],P=_[1],A="headlessui-dialog-"+le(),T=(0,o.useMemo)((function(){return[{dialogState:v,close:k,setTitleId:O},w]}),[v,w,k,O]),L=(0,o.useMemo)((function(){return{open:v===at.Open}}),[v]),I={ref:m,id:A,role:"dialog","aria-modal":v===at.Open||void 0,"aria-labelledby":w.titleId,"aria-describedby":N,onClick:function(e){e.stopPropagation()}},M=l;return i().createElement(ct,{type:"Dialog",element:h,onUpdate:(0,o.useCallback)((function(e,t,n){var r;"Dialog"===t&&X(e,((r={})[ot.Add]=function(){p.current.add(n),d((function(e){return e+1}))},r[ot.Remove]=function(){p.current.add(n),d((function(e){return e-1}))},r))}),[])},i().createElement(Ke,{force:!0},i().createElement(Qe,null,i().createElement(dt.Provider,{value:T},i().createElement(Qe.Group,{target:h},i().createElement(Ke,{force:!1},i().createElement(P,{slot:L,name:"Dialog.Description"},Q({props:G({},M,I),slot:L,defaultTag:"div",features:ht,visible:g,name:"Dialog"}))))))))})),xt=te((function e(t,n){var r=ft([yt.displayName,e.name].join("."))[0],i=r.dialogState,a=r.close,s=Te(n),l="headlessui-dialog-overlay-"+le(),c=(0,o.useCallback)((function(e){if(e.target===e.currentTarget){if(Le(e.currentTarget))return e.preventDefault();e.preventDefault(),e.stopPropagation(),a()}}),[a]),u=(0,o.useMemo)((function(){return{open:i===at.Open}}),[i]);return Q({props:G({},t,{ref:s,id:l,"aria-hidden":!0,onClick:c}),slot:u,defaultTag:"div",name:"Dialog.Overlay"})}));var yt=Object.assign(mt,{Overlay:xt,Title:function e(t){var n=ft([yt.displayName,e.name].join("."))[0],r=n.dialogState,i=n.setTitleId,a="headlessui-dialog-title-"+le();(0,o.useEffect)((function(){return i(a),function(){return i(null)}}),[a,i]);var s=(0,o.useMemo)((function(){return{open:r===at.Open}}),[r]);return Q({props:G({},t,{id:a}),slot:s,defaultTag:"h2",name:"Dialog.Title"})},Description:function(e){var t=rt(),n="headlessui-description-"+le();re((function(){return t.register(n)}),[n,t.register]);var r=e,o=G({},t.props,{id:n});return Q({props:G({},r,o),slot:t.slot||{},defaultTag:"p",name:t.name||"Description"})}});const vt=wp.i18n,gt=wp.components;var bt=n(42),wt=n.n(bt);const jt=lodash;function kt(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"broken-event",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"open";F.setState({entryPoint:e}),window.dispatchEvent(new CustomEvent("extendify::".concat(t,"-library"),{detail:e,bubbles:!0}))}function Ot(e){switch(e){case"editorplus":return"Editor Plus";case"ml-slider":return"MetaSlider"}return e}function St(e){switch(e){case"siteType":return"Site Type";case"patternType":return"Content";case"layoutType":return"Page Types"}}var Ct=n(246);function Et(e){var t=e.taxType,n=e.taxonomies,r=J((function(e){return e.updateTaxonomies})),o=J((function(e){return e.searchParams}));return!(null!=n&&n.length)>0?null:(0,Ct.jsx)(gt.PanelBody,{title:St(t),className:"ext-type-control p-0",initialOpen:!0,children:(0,Ct.jsx)(gt.PanelRow,{children:(0,Ct.jsx)("div",{className:"overflow-hidden w-full relative",children:(0,Ct.jsx)("ul",{className:"px-5 py-1 m-0 w-full",children:n.map((function(e){var n,i,a=(null==o||null===(n=o.taxonomies[t])||void 0===n?void 0:n.slug)===(null==e?void 0:e.slug);return(0,Ct.jsx)("li",{className:"m-0 w-full",children:(0,Ct.jsx)("button",{type:"button",className:"text-left text-sm cursor-pointer w-full flex justify-between items-center px-0 py-2 m-0 leading-none bg-transparent hover:text-wp-theme-500 transition duration-200 button-focus",onClick:function(){return r((i=e,(o=t)in(n={})?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i,n));var n,o,i},children:(0,Ct.jsx)("span",{className:wt()({"text-wp-theme-500":a}),children:null!==(i=null==e?void 0:e.title)&&void 0!==i?i:e.slug})})},e.slug)}))})})})})}function _t(e){return Array.isArray?Array.isArray(e):"[object Array]"===Mt(e)}function Nt(e){return"string"==typeof e}function Pt(e){return"number"==typeof e}function At(e){return!0===e||!1===e||function(e){return Tt(e)&&null!==e}(e)&&"[object Boolean]"==Mt(e)}function Tt(e){return"object"==typeof e}function Lt(e){return null!=e}function It(e){return!e.trim().length}function Mt(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Rt=Object.prototype.hasOwnProperty;class Dt{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach((e=>{let n=Ft(e);t+=n.weight,this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight})),this._keys.forEach((e=>{e.weight/=t}))}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function Ft(e){let t=null,n=null,r=null,o=1;if(Nt(e)||_t(e))r=e,t=Bt(e),n=zt(e);else{if(!Rt.call(e,"name"))throw new Error((e=>`Missing ${e} property in key`)("name"));const i=e.name;if(r=i,Rt.call(e,"weight")&&(o=e.weight,o<=0))throw new Error((e=>`Property 'weight' in key '${e}' must be a positive integer`)(i));t=Bt(i),n=zt(i)}return{path:t,id:n,weight:o,src:r}}function Bt(e){return _t(e)?e:e.split(".")}function zt(e){return _t(e)?e.join("."):e}var Ut={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1,includeMatches:!1,findAllMatches:!1,minMatchCharLength:1,location:0,threshold:.6,distance:100,...{useExtendedSearch:!1,getFn:function(e,t){let n=[],r=!1;const o=(e,t,i)=>{if(Lt(e))if(t[i]){const a=e[t[i]];if(!Lt(a))return;if(i===t.length-1&&(Nt(a)||Pt(a)||At(a)))n.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;let t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(a));else if(_t(a)){r=!0;for(let e=0,n=a.length;e<n;e+=1)o(a[e],t,i+1)}else t.length&&o(a,t,i+1)}else n.push(e)};return o(e,Nt(t)?t.split("."):t,0),r?n:n[0]},ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1}};const qt=/[^ ]+/g;class Wt{constructor({getFn:e=Ut.getFn,fieldNormWeight:t=Ut.fieldNormWeight}={}){this.norm=function(e=1,t=3){const n=new Map,r=Math.pow(10,t);return{get(t){const o=t.match(qt).length;if(n.has(o))return n.get(o);const i=1/Math.pow(o,.5*e),a=parseFloat(Math.round(i*r)/r);return n.set(o,a),a},clear(){n.clear()}}}(t,3),this.getFn=e,this.isCreated=!1,this.setIndexRecords()}setSources(e=[]){this.docs=e}setIndexRecords(e=[]){this.records=e}setKeys(e=[]){this.keys=e,this._keysMap={},e.forEach(((e,t)=>{this._keysMap[e.id]=t}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,Nt(this.docs[0])?this.docs.forEach(((e,t)=>{this._addString(e,t)})):this.docs.forEach(((e,t)=>{this._addObject(e,t)})),this.norm.clear())}add(e){const t=this.size();Nt(e)?this._addString(e,t):this._addObject(e,t)}removeAt(e){this.records.splice(e,1);for(let t=e,n=this.size();t<n;t+=1)this.records[t].i-=1}getValueForItemAtKeyId(e,t){return e[this._keysMap[t]]}size(){return this.records.length}_addString(e,t){if(!Lt(e)||It(e))return;let n={v:e,i:t,n:this.norm.get(e)};this.records.push(n)}_addObject(e,t){let n={i:t,$:{}};this.keys.forEach(((t,r)=>{let o=this.getFn(e,t.path);if(Lt(o))if(_t(o)){let e=[];const t=[{nestedArrIndex:-1,value:o}];for(;t.length;){const{nestedArrIndex:n,value:r}=t.pop();if(Lt(r))if(Nt(r)&&!It(r)){let t={v:r,i:n,n:this.norm.get(r)};e.push(t)}else _t(r)&&r.forEach(((e,n)=>{t.push({nestedArrIndex:n,value:e})}))}n.$[r]=e}else if(!It(o)){let e={v:o,n:this.norm.get(o)};n.$[r]=e}})),this.records.push(n)}toJSON(){return{keys:this.keys,records:this.records}}}function Vt(e,t,{getFn:n=Ut.getFn,fieldNormWeight:r=Ut.fieldNormWeight}={}){const o=new Wt({getFn:n,fieldNormWeight:r});return o.setKeys(e.map(Ft)),o.setSources(t),o.create(),o}function $t(e,{errors:t=0,currentLocation:n=0,expectedLocation:r=0,distance:o=Ut.distance,ignoreLocation:i=Ut.ignoreLocation}={}){const a=t/e.length;if(i)return a;const s=Math.abs(r-n);return o?a+s/o:s?1:a}const Ht=32;function Jt(e,t,n,{location:r=Ut.location,distance:o=Ut.distance,threshold:i=Ut.threshold,findAllMatches:a=Ut.findAllMatches,minMatchCharLength:s=Ut.minMatchCharLength,includeMatches:l=Ut.includeMatches,ignoreLocation:c=Ut.ignoreLocation}={}){if(t.length>Ht)throw new Error(`Pattern length exceeds max of ${Ht}.`);const u=t.length,d=e.length,f=Math.max(0,Math.min(r,d));let p=i,h=f;const m=s>1||l,x=m?Array(d):[];let y;for(;(y=e.indexOf(t,h))>-1;){let e=$t(t,{currentLocation:y,expectedLocation:f,distance:o,ignoreLocation:c});if(p=Math.min(e,p),h=y+u,m){let e=0;for(;e<u;)x[y+e]=1,e+=1}}h=-1;let v=[],g=1,b=u+d;const w=1<<u-1;for(let r=0;r<u;r+=1){let i=0,s=b;for(;i<s;){$t(t,{errors:r,currentLocation:f+s,expectedLocation:f,distance:o,ignoreLocation:c})<=p?i=s:b=s,s=Math.floor((b-i)/2+i)}b=s;let l=Math.max(1,f-s+1),y=a?d:Math.min(f+s,d)+u,j=Array(y+2);j[y+1]=(1<<r)-1;for(let i=y;i>=l;i-=1){let a=i-1,s=n[e.charAt(a)];if(m&&(x[a]=+!!s),j[i]=(j[i+1]<<1|1)&s,r&&(j[i]|=(v[i+1]|v[i])<<1|1|v[i+1]),j[i]&w&&(g=$t(t,{errors:r,currentLocation:a,expectedLocation:f,distance:o,ignoreLocation:c}),g<=p)){if(p=g,h=a,h<=f)break;l=Math.max(1,2*f-h)}}if($t(t,{errors:r+1,currentLocation:f,expectedLocation:f,distance:o,ignoreLocation:c})>p)break;v=j}const j={isMatch:h>=0,score:Math.max(.001,g)};if(m){const e=function(e=[],t=Ut.minMatchCharLength){let n=[],r=-1,o=-1,i=0;for(let a=e.length;i<a;i+=1){let a=e[i];a&&-1===r?r=i:a||-1===r||(o=i-1,o-r+1>=t&&n.push([r,o]),r=-1)}return e[i-1]&&i-r>=t&&n.push([r,i-1]),n}(x,s);e.length?l&&(j.indices=e):j.isMatch=!1}return j}function Gt(e){let t={};for(let n=0,r=e.length;n<r;n+=1){const o=e.charAt(n);t[o]=(t[o]||0)|1<<r-n-1}return t}class Kt{constructor(e,{location:t=Ut.location,threshold:n=Ut.threshold,distance:r=Ut.distance,includeMatches:o=Ut.includeMatches,findAllMatches:i=Ut.findAllMatches,minMatchCharLength:a=Ut.minMatchCharLength,isCaseSensitive:s=Ut.isCaseSensitive,ignoreLocation:l=Ut.ignoreLocation}={}){if(this.options={location:t,threshold:n,distance:r,includeMatches:o,findAllMatches:i,minMatchCharLength:a,isCaseSensitive:s,ignoreLocation:l},this.pattern=s?e:e.toLowerCase(),this.chunks=[],!this.pattern.length)return;const c=(e,t)=>{this.chunks.push({pattern:e,alphabet:Gt(e),startIndex:t})},u=this.pattern.length;if(u>Ht){let e=0;const t=u%Ht,n=u-t;for(;e<n;)c(this.pattern.substr(e,Ht),e),e+=Ht;if(t){const e=u-Ht;c(this.pattern.substr(e),e)}}else c(this.pattern,0)}searchIn(e){const{isCaseSensitive:t,includeMatches:n}=this.options;if(t||(e=e.toLowerCase()),this.pattern===e){let t={isMatch:!0,score:0};return n&&(t.indices=[[0,e.length-1]]),t}const{location:r,distance:o,threshold:i,findAllMatches:a,minMatchCharLength:s,ignoreLocation:l}=this.options;let c=[],u=0,d=!1;this.chunks.forEach((({pattern:t,alphabet:f,startIndex:p})=>{const{isMatch:h,score:m,indices:x}=Jt(e,t,f,{location:r+p,distance:o,threshold:i,findAllMatches:a,minMatchCharLength:s,includeMatches:n,ignoreLocation:l});h&&(d=!0),u+=m,h&&x&&(c=[...c,...x])}));let f={isMatch:d,score:d?u/this.chunks.length:1};return d&&n&&(f.indices=c),f}}class Yt{constructor(e){this.pattern=e}static isMultiMatch(e){return Zt(e,this.multiRegex)}static isSingleMatch(e){return Zt(e,this.singleRegex)}search(){}}function Zt(e,t){const n=e.match(t);return n?n[1]:null}class Xt extends Yt{constructor(e,{location:t=Ut.location,threshold:n=Ut.threshold,distance:r=Ut.distance,includeMatches:o=Ut.includeMatches,findAllMatches:i=Ut.findAllMatches,minMatchCharLength:a=Ut.minMatchCharLength,isCaseSensitive:s=Ut.isCaseSensitive,ignoreLocation:l=Ut.ignoreLocation}={}){super(e),this._bitapSearch=new Kt(e,{location:t,threshold:n,distance:r,includeMatches:o,findAllMatches:i,minMatchCharLength:a,isCaseSensitive:s,ignoreLocation:l})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class Qt extends Yt{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let t,n=0;const r=[],o=this.pattern.length;for(;(t=e.indexOf(this.pattern,n))>-1;)n=t+o,r.push([t,n-1]);const i=!!r.length;return{isMatch:i,score:i?0:1,indices:r}}}const en=[class extends Yt{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},Qt,class extends Yt{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},class extends Yt{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends Yt{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends Yt{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}},class extends Yt{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},Xt],tn=en.length,nn=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/;const rn=new Set([Xt.type,Qt.type]);class on{constructor(e,{isCaseSensitive:t=Ut.isCaseSensitive,includeMatches:n=Ut.includeMatches,minMatchCharLength:r=Ut.minMatchCharLength,ignoreLocation:o=Ut.ignoreLocation,findAllMatches:i=Ut.findAllMatches,location:a=Ut.location,threshold:s=Ut.threshold,distance:l=Ut.distance}={}){this.query=null,this.options={isCaseSensitive:t,includeMatches:n,minMatchCharLength:r,findAllMatches:i,ignoreLocation:o,location:a,threshold:s,distance:l},this.pattern=t?e:e.toLowerCase(),this.query=function(e,t={}){return e.split("|").map((e=>{let n=e.trim().split(nn).filter((e=>e&&!!e.trim())),r=[];for(let e=0,o=n.length;e<o;e+=1){const o=n[e];let i=!1,a=-1;for(;!i&&++a<tn;){const e=en[a];let n=e.isMultiMatch(o);n&&(r.push(new e(n,t)),i=!0)}if(!i)for(a=-1;++a<tn;){const e=en[a];let n=e.isSingleMatch(o);if(n){r.push(new e(n,t));break}}}return r}))}(this.pattern,this.options)}static condition(e,t){return t.useExtendedSearch}searchIn(e){const t=this.query;if(!t)return{isMatch:!1,score:1};const{includeMatches:n,isCaseSensitive:r}=this.options;e=r?e:e.toLowerCase();let o=0,i=[],a=0;for(let r=0,s=t.length;r<s;r+=1){const s=t[r];i.length=0,o=0;for(let t=0,r=s.length;t<r;t+=1){const r=s[t],{isMatch:l,indices:c,score:u}=r.search(e);if(!l){a=0,o=0,i.length=0;break}if(o+=1,a+=u,n){const e=r.constructor.type;rn.has(e)?i=[...i,...c]:i.push(c)}}if(o){let e={isMatch:!0,score:a/o};return n&&(e.indices=i),e}}return{isMatch:!1,score:1}}}const an=[];function sn(e,t){for(let n=0,r=an.length;n<r;n+=1){let r=an[n];if(r.condition(e,t))return new r(e,t)}return new Kt(e,t)}const ln="$and",cn="$or",un="$path",dn="$val",fn=e=>!(!e[ln]&&!e[cn]),pn=e=>({[ln]:Object.keys(e).map((t=>({[t]:e[t]})))});function hn(e,t,{auto:n=!0}={}){const r=e=>{let o=Object.keys(e);const i=(e=>!!e[un])(e);if(!i&&o.length>1&&!fn(e))return r(pn(e));if((e=>!_t(e)&&Tt(e)&&!fn(e))(e)){const r=i?e[un]:o[0],a=i?e[dn]:e[r];if(!Nt(a))throw new Error((e=>`Invalid value for key ${e}`)(r));const s={keyId:zt(r),pattern:a};return n&&(s.searcher=sn(a,t)),s}let a={children:[],operator:o[0]};return o.forEach((t=>{const n=e[t];_t(n)&&n.forEach((e=>{a.children.push(r(e))}))})),a};return fn(e)||(e=pn(e)),r(e)}function mn(e,t){const n=e.matches;t.matches=[],Lt(n)&&n.forEach((e=>{if(!Lt(e.indices)||!e.indices.length)return;const{indices:n,value:r}=e;let o={indices:n,value:r};e.key&&(o.key=e.key.src),e.idx>-1&&(o.refIndex=e.idx),t.matches.push(o)}))}function xn(e,t){t.score=e.score}class yn{constructor(e,t={},n){this.options={...Ut,...t},this.options.useExtendedSearch,this._keyStore=new Dt(this.options.keys),this.setCollection(e,n)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof Wt))throw new Error("Incorrect 'index' type");this._myIndex=t||Vt(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){Lt(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=(()=>!1)){const t=[];for(let n=0,r=this._docs.length;n<r;n+=1){const o=this._docs[n];e(o,n)&&(this.removeAt(n),n-=1,r-=1,t.push(o))}return t}removeAt(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}getIndex(){return this._myIndex}search(e,{limit:t=-1}={}){const{includeMatches:n,includeScore:r,shouldSort:o,sortFn:i,ignoreFieldNorm:a}=this.options;let s=Nt(e)?Nt(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,{ignoreFieldNorm:t=Ut.ignoreFieldNorm}){e.forEach((e=>{let n=1;e.matches.forEach((({key:e,norm:r,score:o})=>{const i=e?e.weight:null;n*=Math.pow(0===o&&i?Number.EPSILON:o,(i||1)*(t?1:r))})),e.score=n}))}(s,{ignoreFieldNorm:a}),o&&s.sort(i),Pt(t)&&t>-1&&(s=s.slice(0,t)),function(e,t,{includeMatches:n=Ut.includeMatches,includeScore:r=Ut.includeScore}={}){const o=[];return n&&o.push(mn),r&&o.push(xn),e.map((e=>{const{idx:n}=e,r={item:t[n],refIndex:n};return o.length&&o.forEach((t=>{t(e,r)})),r}))}(s,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(e){const t=sn(e,this.options),{records:n}=this._myIndex,r=[];return n.forEach((({v:e,i:n,n:o})=>{if(!Lt(e))return;const{isMatch:i,score:a,indices:s}=t.searchIn(e);i&&r.push({item:e,idx:n,matches:[{score:a,value:e,norm:o,indices:s}]})})),r}_searchLogical(e){const t=hn(e,this.options),n=(e,t,r)=>{if(!e.children){const{keyId:n,searcher:o}=e,i=this._findMatches({key:this._keyStore.get(n),value:this._myIndex.getValueForItemAtKeyId(t,n),searcher:o});return i&&i.length?[{idx:r,item:t,matches:i}]:[]}const o=[];for(let i=0,a=e.children.length;i<a;i+=1){const a=e.children[i],s=n(a,t,r);if(s.length)o.push(...s);else if(e.operator===ln)return[]}return o},r=this._myIndex.records,o={},i=[];return r.forEach((({$:e,i:r})=>{if(Lt(e)){let a=n(t,e,r);a.length&&(o[r]||(o[r]={idx:r,item:e,matches:[]},i.push(o[r])),a.forEach((({matches:e})=>{o[r].matches.push(...e)})))}})),i}_searchObjectList(e){const t=sn(e,this.options),{keys:n,records:r}=this._myIndex,o=[];return r.forEach((({$:e,i:r})=>{if(!Lt(e))return;let i=[];n.forEach(((n,r)=>{i.push(...this._findMatches({key:n,value:e[r],searcher:t}))})),i.length&&o.push({idx:r,item:e,matches:i})})),o}_findMatches({key:e,value:t,searcher:n}){if(!Lt(t))return[];let r=[];if(_t(t))t.forEach((({v:t,i:o,n:i})=>{if(!Lt(t))return;const{isMatch:a,score:s,indices:l}=n.searchIn(t);a&&r.push({score:s,key:e,value:t,idx:o,norm:i,indices:l})}));else{const{v:o,n:i}=t,{isMatch:a,score:s,indices:l}=n.searchIn(o);a&&r.push({score:s,key:e,value:o,norm:i,indices:l})}return r}}function vn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return gn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return gn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function gn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}yn.version="6.5.3",yn.createIndex=Vt,yn.parseIndex=function(e,{getFn:t=Ut.getFn,fieldNormWeight:n=Ut.fieldNormWeight}={}){const{keys:r,records:o}=e,i=new Wt({getFn:t,fieldNormWeight:n});return i.setKeys(r),i.setIndexRecords(o),i},yn.config=Ut,yn.parseQuery=hn,function(...e){an.push(...e)}(on);var bn=new Map;function wn(e){var t,n,o=e.value,i=e.setValue,a=e.terms,s=F((function(e){var t,n,r;return null!==(t=null===(n=e.preferredOptionsHistory)||void 0===n||null===(r=n.siteType)||void 0===r?void 0:r.filter((function(e){return e.slug})))&&void 0!==t?t:{}})),l=J((function(e){return e.searchParams})),c=vn((0,r.useState)(!1),2),u=c[0],d=c[1],f=(0,r.useRef)(),p=vn((0,r.useState)({}),2),h=p[0],m=p[1],x=vn((0,r.useState)(""),2),y=x[0],v=x[1],g=vn((0,r.useState)([]),2),b=g[0],w=g[1],j=(0,r.useMemo)((function(){return a.filter((function(e){return null==e?void 0:e.featured})).sort((function(e,t){return e.slug<t.slug?-1:e.slug>t.slug?1:0}))}),[a]),k=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(bn.has(e))w(bn.get(e));else{var t=h.search(e);bn.set(e,null!=t&&t.length?t.map((function(e){return e.item})):j),w(bn.get(e))}},O="unknown"===o.slug||!(null!=o&&o.slug);(0,r.useEffect)((function(){m(new yn(a,{keys:["slug","title","keywords"],minMatchCharLength:2,threshold:.3}))}),[a]),(0,r.useEffect)((function(){y.length||w(j)}),[j,y]),(0,r.useEffect)((function(){u&&f.current.focus()}),[u]);var S,C=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,vt.__)("Suggestions","extendify");return e===j&&(t=(0,vt.__)("Examples","extendify")),(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("h4",{className:"mt-4 mb-2 text-left uppercase text-xss text-gray-700 font-medium",children:t}),(0,Ct.jsx)("ul",{className:"m-0",children:e.map((function(e){var t,n,r,o=null!==(t=null==e?void 0:e.title)&&void 0!==t?t:e.slug,a=(null==l||null===(n=l.taxonomies)||void 0===n||null===(r=n.siteType)||void 0===r?void 0:r.slug)===e.slug;return(0,Ct.jsx)("li",{className:"m-0 mb-1",children:(0,Ct.jsx)("button",{type:"button",className:wt()("w-full text-left text-sm bg-transparent hover:text-wp-theme-500 m-0 pl-0 cursor-pointer",{"text-gray-800":!a}),onClick:function(){d(!1),i(e)},children:o})},e.slug+(null==e?void 0:e.title))}))})]})};return(0,Ct.jsxs)("div",{className:"w-full bg-extendify-transparent-black rounded",children:[(0,Ct.jsx)("button",{type:"button",onClick:function(){return d((function(e){return!e}))},className:"flex items-center justify-between text-gray-800 button-focus w-full p-4 m-0 cursor-pointer bg-transparent hover:bg-extendify-transparent-black-100 rounded",children:(S=u?(0,vt.__)("What kind of site is this?","extendify"):null!==(t=null!==(n=null==o?void 0:o.title)&&void 0!==n?n:o.slug)&&void 0!==t?t:"Unknown",(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsxs)("span",{className:"flex flex-col text-left",children:[(0,Ct.jsx)("span",{className:"text-sm mb-1",children:(0,vt.__)("Site Type","extendify")}),(0,Ct.jsx)("span",{className:"font-light text-xs",children:S})]}),(0,Ct.jsxs)("span",{className:"flex items-center space-x-4",children:[O&&!u&&(0,Ct.jsxs)("svg",{className:"text-wp-alert-red","aria-hidden":"true",focusable:"false",width:"21",height:"21",viewBox:"0 0 21 21",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)("path",{className:"stroke-current",d:"M10.9982 4.05371C7.66149 4.05371 4.95654 6.75866 4.95654 10.0954C4.95654 13.4321 7.66149 16.137 10.9982 16.137C14.3349 16.137 17.0399 13.4321 17.0399 10.0954C17.0399 6.75866 14.3349 4.05371 10.9982 4.05371V4.05371Z",strokeWidth:"1.25"}),(0,Ct.jsx)("path",{className:"fill-current",d:"M10.0205 12.8717C10.0205 12.3287 10.4508 11.8881 10.9938 11.8881C11.5368 11.8881 11.9774 12.3287 11.9774 12.8717C11.9774 13.4147 11.5368 13.8451 10.9938 13.8451C10.4508 13.8451 10.0205 13.4147 10.0205 12.8717Z"}),(0,Ct.jsx)("path",{className:"fill-current",d:"M11.6495 10.2591C11.6086 10.6177 11.3524 10.9148 10.9938 10.9148C10.625 10.9148 10.3791 10.6074 10.3483 10.2591L10.0205 7.31855C9.95901 6.81652 10.4918 6.34521 10.9938 6.34521C11.4959 6.34521 12.0286 6.81652 11.9774 7.31855L11.6495 10.2591Z"})]}),(0,Ct.jsx)("svg",{className:wt()("text-gray-700 stroke-current",{"transform rotate-90 -translate-x-1":u}),"aria-hidden":"true",focusable:"false",width:"8",height:"13",viewBox:"0 0 8 13",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)("path",{d:"M1.24194 11.5952L6.24194 6.09519L1.24194 0.595215",strokeWidth:"1.5"})})]})]}))}),u&&(0,Ct.jsxs)("div",{className:"p-4 pt-0 overflow-y-auto max-h-96",children:[(0,Ct.jsxs)("div",{className:"relative my-2",children:[(0,Ct.jsx)("label",{htmlFor:"site-type-search",className:"sr-only",children:(0,vt.__)("Search","extendify")}),(0,Ct.jsx)("input",{ref:f,id:"site-type-search",value:null!=y?y:"",onChange:function(e){return t=e.target.value,v(t),void k(t);var t},type:"text",className:"button-focus bg-white border-0 m-0 p-3.5 py-2.5 rounded text-sm w-full",placeholder:(0,vt.__)("Search","extendify")}),(0,Ct.jsx)("svg",{className:"absolute top-2 right-2 hidden lg:block pointer-events-none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"24",height:"24",role:"img","aria-hidden":"true",focusable:"false",children:(0,Ct.jsx)("path",{d:"M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"})})]}),y.length>1&&b===j&&(0,Ct.jsx)("p",{className:"text-left",children:(0,vt.__)("Nothing found...","extendify")}),b===j&&Object.keys(s).length>0&&(0,Ct.jsx)("div",{className:"mb-8",children:C(s,(0,vt.__)("Recent","extendify"))}),b.length>0&&(0,Ct.jsx)("div",{children:C(b)}),O?null:(0,Ct.jsx)("button",{type:"button",className:"mt-4 w-full text-left text-sm bg-transparent hover:text-wp-theme-500 pl-0 cursor-pointer text-wp-theme-500",onClick:function(){d(!1),i("Unknown")},children:(0,vt.__)("Reset","extendify")})]})]})}const jn=function(e){let{icon:t,size:n=24,...o}=e;return(0,r.cloneElement)(t,{width:n,height:n,...o})},kn=e=>(0,r.createElement)("circle",e),On=e=>(0,r.createElement)("g",e),Sn=e=>(0,r.createElement)("path",e),Cn=e=>(0,r.createElement)("rect",e),En=e=>{let{className:t,isPressed:n,...o}=e;const i={...o,className:wt()(t,{"is-pressed":n})||void 0,role:"img","aria-hidden":!0,focusable:!1};return(0,r.createElement)("svg",i)};const _n=(0,Ct.jsxs)(En,{viewBox:"0 0 14 14",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(Sn,{d:"M7.32457 0.907043C3.98785 0.907043 1.2829 3.61199 1.2829 6.94871C1.2829 10.2855 3.98785 12.9904 7.32457 12.9904C10.6613 12.9904 13.3663 10.2855 13.3663 6.94871C13.3663 3.61199 10.6613 0.907043 7.32457 0.907043V0.907043Z",stroke:"currentColor",strokeWidth:"1.25",fill:"none"}),(0,Ct.jsx)(Sn,{d:"M6.34684 9.72526C6.34684 9.18224 6.77716 8.74168 7.32018 8.74168C7.8632 8.74168 8.30377 9.18224 8.30377 9.72526C8.30377 10.2683 7.8632 10.6986 7.32018 10.6986C6.77716 10.6986 6.34684 10.2683 6.34684 9.72526Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{d:"M7.9759 7.11261C7.93492 7.47121 7.67878 7.76834 7.32018 7.76834C6.95134 7.76834 6.70544 7.46097 6.6747 7.11261L6.34684 4.1721C6.28537 3.67006 6.81814 3.19876 7.32018 3.19876C7.82222 3.19876 8.35499 3.67006 8.30377 4.1721L7.9759 7.11261Z",fill:"currentColor"})]});const Nn=(0,Ct.jsx)(En,{fill:"none",viewBox:"0 0 25 24",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)(Sn,{clipRule:"evenodd",d:"m14.4063 2h4.1856c1.1856 0 1.6147.12701 2.0484.36409.4336.23802.7729.58706 1.0049 1.03111.2319.445.3548.8853.3548 2.10175v4.29475c0 1.2165-.1238 1.6567-.3548 2.1017-.232.445-.5722.7931-1.0049 1.0312-.1939.1064-.3873.1939-.6476.2567v3.4179c0 1.8788-.1912 2.5588-.5481 3.246-.3582.6873-.8836 1.2249-1.552 1.5925-.6697.3676-1.3325.5623-3.1634.5623h-6.46431c-1.83096 0-2.49367-.1962-3.16346-.5623-.6698-.3676-1.19374-.9067-1.552-1.5925s-.54943-1.3672-.54943-3.246v-6.63138c0-1.87871.19117-2.55871.54801-3.24597.35827-.68727.88362-1.22632 1.55342-1.59393.66837-.36615 1.3325-.56231 3.16346-.56231h2.76781c.0519-.55814.1602-.86269.3195-1.16946.232-.445.5721-.79404 1.0058-1.03206.4328-.23708.8628-.36409 2.0483-.36409zm-2.1512 2.73372c0-.79711.6298-1.4433 1.4067-1.4433h5.6737c.777 0 1.4068.64619 1.4068 1.4433v5.82118c0 .7971-.6298 1.4433-1.4068 1.4433h-5.6737c-.7769 0-1.4067-.6462-1.4067-1.4433z",fill:"currentColor",fillRule:"evenodd"})});const Pn=(0,Ct.jsx)(En,{fill:"none",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)(Sn,{"clip-rule":"evenodd",d:"m13.505 4h3.3044c.936 0 1.2747.10161 1.6171.29127.3424.19042.6102.46965.7934.82489.1831.356.2801.70824.2801 1.6814v3.43584c0 .9731-.0977 1.3254-.2801 1.6814-.1832.356-.4517.6344-.7934.8248-.153.0852-.3057.1552-.5112.2054v2.7344c0 1.503-.151 2.047-.4327 2.5968-.2828.5498-.6976.9799-1.2252 1.274-.5288.294-1.052.4498-2.4975.4498h-5.10341c-1.44549 0-1.96869-.1569-2.49747-.4498-.52878-.2941-.94242-.7254-1.22526-1.274-.28284-.5487-.43376-1.0938-.43376-2.5968v-5.3051c0-1.50301.15092-2.04701.43264-2.59682.28284-.54981.6976-.98106 1.22638-1.27514.52767-.29293 1.05198-.44985 2.49747-.44985h2.18511c.041-.44652.1265-.69015.2522-.93557.1832-.356.4517-.63523.7941-.82565.3417-.18966.6812-.29127 1.6171-.29127zm-1.6984 2.18698c0-.63769.4973-1.15464 1.1106-1.15464h4.4793c.6133 0 1.1106.51695 1.1106 1.15464v4.65692c0 .6377-.4973 1.1547-1.1106 1.1547h-4.4793c-.6133 0-1.1106-.517-1.1106-1.1547z",fill:"currentColor","fill-rule":"evenodd"})});const An=(0,Ct.jsx)(En,{fill:"none",width:"150",height:"30",viewBox:"0 0 2524 492",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsxs)(On,{fill:"currentColor",children:[(0,Ct.jsx)(Sn,{d:"m609.404 378.5c-24.334 0-46-5.5-65-16.5-18.667-11.333-33.334-26.667-44-46-10.667-19.667-16-42.167-16-67.5 0-25.667 5.166-48.333 15.5-68 10.333-19.667 24.833-35 43.5-46 18.666-11.333 40-17 64-17 25 0 46.5 5.333 64.5 16 18 10.333 31.833 24.833 41.5 43.5 10 18.667 15 41 15 67v18.5l-212 .5 1-39h150.5c0-17-5.5-30.667-16.5-41-10.667-10.333-25.167-15.5-43.5-15.5-14.334 0-26.5 3-36.5 9-9.667 6-17 15-22 27s-7.5 26.667-7.5 44c0 26.667 5.666 46.833 17 60.5 11.666 13.667 28.833 20.5 51.5 20.5 16.666 0 30.333-3.167 41-9.5 11-6.333 18.166-15.333 21.5-27h56.5c-5.334 27-18.667 48.167-40 63.5-21 15.333-47.667 23-80 23z"}),(0,Ct.jsx)("path",{d:"m797.529 372h-69.5l85-121-85-126h71l54.5 84 52.5-84h68.5l-84 125.5 81.5 121.5h-70l-53-81.5z"}),(0,Ct.jsx)("path",{d:"m994.142 125h155.998v51h-155.998zm108.498 247h-61v-324h61z"}),(0,Ct.jsx)("path",{d:"m1278.62 378.5c-24.33 0-46-5.5-65-16.5-18.66-11.333-33.33-26.667-44-46-10.66-19.667-16-42.167-16-67.5 0-25.667 5.17-48.333 15.5-68 10.34-19.667 24.84-35 43.5-46 18.67-11.333 40-17 64-17 25 0 46.5 5.333 64.5 16 18 10.333 31.84 24.833 41.5 43.5 10 18.667 15 41 15 67v18.5l-212 .5 1-39h150.5c0-17-5.5-30.667-16.5-41-10.66-10.333-25.16-15.5-43.5-15.5-14.33 0-26.5 3-36.5 9-9.66 6-17 15-22 27s-7.5 26.667-7.5 44c0 26.667 5.67 46.833 17 60.5 11.67 13.667 28.84 20.5 51.5 20.5 16.67 0 30.34-3.167 41-9.5 11-6.333 18.17-15.333 21.5-27h56.5c-5.33 27-18.66 48.167-40 63.5-21 15.333-47.66 23-80 23z"}),(0,Ct.jsx)("path",{d:"m1484.44 372h-61v-247h56.5l5 32c7.67-12.333 18.5-22 32.5-29 14.34-7 29.84-10.5 46.5-10.5 31 0 54.34 9.167 70 27.5 16 18.333 24 43.333 24 75v152h-61v-137.5c0-20.667-4.66-36-14-46-9.33-10.333-22-15.5-38-15.5-19 0-33.83 6-44.5 18-10.66 12-16 28-16 48z"}),(0,Ct.jsx)("path",{d:"m1798.38 378.5c-24 0-44.67-5.333-62-16-17-11-30.34-26.167-40-45.5-9.34-19.333-14-41.833-14-67.5s4.66-48.333 14-68c9.66-20 23.5-35.667 41.5-47s39.33-17 64-17c17.33 0 33.16 3.5 47.5 10.5 14.33 6.667 25.33 16.167 33 28.5v-156.5h60.5v372h-56l-4-38.5c-7.34 14-18.67 25-34 33-15 8-31.84 12-50.5 12zm13.5-56c14.33 0 26.66-3 37-9 10.33-6.333 18.33-15.167 24-26.5 6-11.667 9-24.833 9-39.5 0-15-3-28-9-39-5.67-11.333-13.67-20.167-24-26.5-10.34-6.667-22.67-10-37-10-14 0-26.17 3.333-36.5 10-10.34 6.333-18.34 15.167-24 26.5-5.34 11.333-8 24.333-8 39s2.66 27.667 8 39c5.66 11.333 13.66 20.167 24 26.5 10.33 6.333 22.5 9.5 36.5 9.5z"}),(0,Ct.jsx)("path",{d:"m1996.45 372v-247h61v247zm30-296.5c-10.34 0-19.17-3.5-26.5-10.5-7-7.3333-10.5-16.1667-10.5-26.5s3.5-19 10.5-26c7.33-6.99999 16.16-10.49998 26.5-10.49998 10.33 0 19 3.49999 26 10.49998 7.33 7 11 15.6667 11 26s-3.67 19.1667-11 26.5c-7 7-15.67 10.5-26 10.5z"}),(0,Ct.jsx)("path",{d:"m2085.97 125h155v51h-155zm155.5-122.5v52c-3.33 0-6.83 0-10.5 0-3.33 0-6.83 0-10.5 0-15.33 0-25.67 3.6667-31 11-5 7.3333-7.5 17.1667-7.5 29.5v277h-60.5v-277c0-22.6667 3.67-40.8333 11-54.5 7.33-14 17.67-24.1667 31-30.5 13.33-6.66666 28.83-10 46.5-10 5 0 10.17.166671 15.5.5 5.67.333329 11 .99999 16 2z"}),(0,Ct.jsx)("path",{d:"m2330.4 125 80.5 228-33 62.5-112-290.5zm-58 361.5v-50.5h36.5c8 0 15-1 21-3 6-1.667 11.34-5 16-10 5-5 9.17-12.333 12.5-22l102.5-276h63l-121 302c-9 22.667-20.33 39.167-34 49.5-13.66 10.333-30.66 15.5-51 15.5-8.66 0-16.83-.5-24.5-1.5-7.33-.667-14.33-2-21-4z"}),(0,Ct.jsx)("path",{clipRule:"evenodd",d:"m226.926 25.1299h83.271c23.586 0 32.123 2.4639 40.751 7.0633 8.628 4.6176 15.378 11.389 19.993 20.0037 4.615 8.6329 7.059 17.1746 7.059 40.7738v83.3183c0 23.599-2.463 32.141-7.059 40.774-4.615 8.633-11.383 15.386-19.993 20.003-3.857 2.065-7.704 3.764-12.884 4.981v66.308c0 36.447-3.803 49.639-10.902 62.972-7.128 13.333-17.579 23.763-30.877 30.894-13.325 7.132-26.51 10.909-62.936 10.909h-128.605c-36.4268 0-49.6113-3.805-62.9367-10.909-13.3254-7.131-23.749-17.589-30.8765-30.894-7.12757-13.304-10.9308-26.525-10.9308-62.972v-128.649c0-36.447 3.80323-49.639 10.9026-62.972 7.1275-13.333 17.5793-23.7909 30.9047-30.9224 13.2972-7.1034 26.5099-10.9088 62.9367-10.9088h55.064c1.033-10.8281 3.188-16.7362 6.357-22.6877 4.615-8.6329 11.382-15.4043 20.01-20.0219 8.61-4.5994 17.165-7.0633 40.751-7.0633zm-42.798 53.0342c0-15.464 12.53-28 27.986-28h112.877c15.457 0 27.987 12.536 27.987 28v112.9319c0 15.464-12.53 28-27.987 28h-112.877c-15.456 0-27.986-12.536-27.986-28z",fillRule:"evenodd"})]})});const Tn=(0,Ct.jsxs)(En,{viewBox:"0 0 14 14",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(Sn,{d:"M7.32457 0.907043C3.98785 0.907043 1.2829 3.61199 1.2829 6.94871C1.2829 10.2855 3.98785 12.9904 7.32457 12.9904C10.6613 12.9904 13.3663 10.2855 13.3663 6.94871C13.3663 3.61199 10.6613 0.907043 7.32457 0.907043V0.907043Z",stroke:"white",strokeWidth:"1.25"}),(0,Ct.jsx)(Sn,{d:"M7.32458 10.0998L4.82458 7.59977M7.32458 10.0998V3.79764V10.0998ZM7.32458 10.0998L9.82458 7.59977L7.32458 10.0998Z",stroke:"white",strokeWidth:"1.25"})]});const Ln=(0,Ct.jsxs)(En,{fill:"none",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(Sn,{d:"m11.2721 16.9866.6041 2.2795.6042-2.2795.6213-2.3445c.0001-.0002.0001-.0004.0002-.0006.2404-.9015.8073-1.5543 1.4638-1.8165.0005-.0002.0009-.0004.0013-.0006l1.9237-.7555 1.4811-.5818-1.4811-.5817-1.9264-.7566c0-.0001-.0001-.0001-.0001-.0001-.0001 0-.0001 0-.0001 0-.654-.25727-1.2213-.90816-1.4621-1.81563-.0001-.00006-.0001-.00011-.0001-.00017l-.6215-2.34519-.6042-2.27947-.6041 2.27947-.6216 2.34519v.00017c-.2409.90747-.80819 1.55836-1.46216 1.81563-.00002 0-.00003 0-.00005 0-.00006 0-.00011 0-.00017.0001l-1.92637.7566-1.48108.5817 1.48108.5818 1.92637.7566c.00007 0 .00015.0001.00022.0001.65397.2572 1.22126.9082 1.46216 1.8156v.0002z",stroke:"currentColor","stroke-width":"1.25",fill:"none"}),(0,Ct.jsxs)(On,{fill:"currentColor",children:[(0,Ct.jsx)(Sn,{d:"m18.1034 18.3982-.2787.8625-.2787-.8625c-.1314-.4077-.4511-.7275-.8589-.8589l-.8624-.2786.8624-.2787c.4078-.1314.7275-.4512.8589-.8589l.2787-.8624.2787.8624c.1314.4077.4511.7275.8589.8589l.8624.2787-.8624.2786c-.4078.1314-.7269.4512-.8589.8589z"}),(0,Ct.jsx)(Sn,{d:"m6.33141 6.97291-.27868.86242-.27867-.86242c-.13142-.40775-.45116-.72749-.8589-.85891l-.86243-.27867.86243-.27868c.40774-.13141.72748-.45115.8589-.8589l.27867-.86242.27868.86242c.13142.40775.45116.72749.8589.8589l.86242.27868-.86242.27867c-.40774.13142-.7269.45116-.8589.85891z"})]})]});const In=(0,Ct.jsx)(En,{fill:"none",height:"24",viewBox:"0 0 25 24",width:"25",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)(Sn,{d:"m10.3949 8.7864 5.5476-.02507m0 0-.0476 5.52507m.0476-5.52507c-2.357 2.35707-5.4183 5.41827-7.68101 7.68097",stroke:"currentColor",strokeWidth:"1.5"})});const Mn=(0,Ct.jsx)(En,{fill:"none",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsxs)(On,{stroke:"currentColor",strokeWidth:"1.5",children:[(0,Ct.jsx)(Sn,{d:"m6 4.75h12c.6904 0 1.25.55964 1.25 1.25v12c0 .6904-.5596 1.25-1.25 1.25h-12c-.69036 0-1.25-.5596-1.25-1.25v-12c0-.69036.55964-1.25 1.25-1.25z"}),(0,Ct.jsx)(Sn,{d:"m9.25 19v-14"})]})});const Rn=(0,Ct.jsxs)(En,{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(Sn,{fillRule:"evenodd",clipRule:"evenodd",d:"M7.49271 18.0092C6.97815 17.1176 7.28413 15.9755 8.17569 15.4609C9.06724 14.946 10.2094 15.252 10.7243 16.1435C11.2389 17.0355 10.9329 18.1772 10.0413 18.6922C9.14978 19.2071 8.00764 18.9011 7.49271 18.0092V18.0092Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{fillRule:"evenodd",clipRule:"evenodd",d:"M16.5073 6.12747C17.0218 7.01903 16.7158 8.16117 15.8243 8.67573C14.9327 9.19066 13.7906 8.88467 13.2757 7.99312C12.7611 7.10119 13.0671 5.95942 13.9586 5.44449C14.8502 4.92956 15.9923 5.23555 16.5073 6.12747V6.12747Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{fillRule:"evenodd",clipRule:"evenodd",d:"M4.60135 11.1355C5.11628 10.2439 6.25805 9.93793 7.14998 10.4525C8.04153 10.9674 8.34752 12.1096 7.83296 13.0011C7.31803 13.8927 6.17588 14.1987 5.28433 13.6841C4.39278 13.1692 4.08679 12.0274 4.60135 11.1355V11.1355Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{fillRule:"evenodd",clipRule:"evenodd",d:"M19.3986 13.0011C18.8837 13.8927 17.7419 14.1987 16.85 13.6841C15.9584 13.1692 15.6525 12.027 16.167 11.1355C16.682 10.2439 17.8241 9.93793 18.7157 10.4525C19.6072 10.9674 19.9132 12.1092 19.3986 13.0011V13.0011Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{d:"M9.10857 8.92594C10.1389 8.92594 10.9742 8.09066 10.9742 7.06029C10.9742 6.02992 10.1389 5.19464 9.10857 5.19464C8.0782 5.19464 7.24292 6.02992 7.24292 7.06029C7.24292 8.09066 8.0782 8.92594 9.10857 8.92594Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{d:"M14.8913 18.942C15.9217 18.942 16.7569 18.1067 16.7569 17.0763C16.7569 16.046 15.9217 15.2107 14.8913 15.2107C13.8609 15.2107 13.0256 16.046 13.0256 17.0763C13.0256 18.1067 13.8609 18.942 14.8913 18.942Z",fill:"currentColor"}),(0,Ct.jsx)(Sn,{fillRule:"evenodd",clipRule:"evenodd",d:"M10.3841 13.0011C9.86951 12.1096 10.1755 10.9674 11.067 10.4525C11.9586 9.93793 13.1007 10.2439 13.6157 11.1355C14.1302 12.0274 13.8242 13.1692 12.9327 13.6841C12.0411 14.1987 10.899 13.8927 10.3841 13.0011V13.0011Z",fill:"currentColor"})]});const Dn=(0,Ct.jsxs)(En,{fill:"none",viewBox:"0 0 151 148",width:"151",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(kn,{cx:"65.6441",cy:"66.6114",fill:"#0b4a43",r:"65.3897"}),(0,Ct.jsxs)(On,{fill:"#cbc3f5",stroke:"#0b4a43",children:[(0,Ct.jsx)(Sn,{d:"m61.73 11.3928 3.0825 8.3304.1197.3234.3234.1197 8.3304 3.0825-8.3304 3.0825-.3234.1197-.1197.3234-3.0825 8.3304-3.0825-8.3304-.1197-.3234-.3234-.1197-8.3304-3.0825 8.3304-3.0825.3234-.1197.1197-.3234z",strokeWidth:"1.5"}),(0,Ct.jsx)(Sn,{d:"m84.3065 31.2718c0 5.9939-12.4614 22.323-18.6978 22.323h-17.8958v56.1522c3.5249.9 11.6535 0 17.8958 0h6.2364c11.2074 3.33 36.0089 7.991 45.5529 0l-9.294-62.1623c-2.267-1.7171-5.949-6.6968-2.55-12.8786 3.4-6.1817 2.55-18.0406 0-24.5756-1.871-4.79616-8.3289-8.90882-14.4482-8.90882s-7.0825 4.00668-6.7993 6.01003z",strokeWidth:"1.75"}),(0,Ct.jsx)(Cn,{height:"45.5077",rx:"9.13723",strokeWidth:"1.75",transform:"matrix(0 1 -1 0 191.5074 -96.0026)",width:"18.2745",x:"143.755",y:"47.7524"}),(0,Ct.jsx)(Cn,{height:"42.3038",rx:"8.73674",strokeWidth:"1.75",transform:"matrix(0 1 -1 0 241.97 -50.348)",width:"17.4735",x:"146.159",y:"95.811"}),(0,Ct.jsx)(Cn,{height:"55.9204",rx:"8.73674",strokeWidth:"1.75",transform:"matrix(0 1 -1 0 213.1347 -85.5913)",width:"17.4735",x:"149.363",y:"63.7717"}),(0,Ct.jsx)(Cn,{height:"51.1145",rx:"8.73674",strokeWidth:"1.75",transform:"matrix(0 1 -1 0 229.1545 -69.5715)",width:"17.4735",x:"149.363",y:"79.7915"}),(0,Ct.jsx)(Sn,{d:"m75.7483 105.349c.9858-25.6313-19.2235-42.0514-32.8401-44.0538v12.0146c8.5438 1.068 24.8303 9.7642 24.8303 36.0442 0 23.228 19.4905 33.374 29.6362 33.641v-10.413s-22.6122-1.602-21.6264-27.233z",strokeWidth:"1.75"}),(0,Ct.jsx)(Sn,{d:"m68.5388 109.354c.9858-25.6312-19.2234-42.0513-32.8401-44.0537v12.0147c8.5438 1.0679 24.8303 9.7641 24.8303 36.044 0 23.228 19.4905 33.374 29.6362 33.641v-10.413s-22.6122-1.602-21.6264-27.233z",strokeWidth:"1.75"})]})]});const Fn=(0,Ct.jsxs)(En,{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[(0,Ct.jsx)(kn,{cx:"12",cy:"12",r:"7.25",stroke:"currentColor",strokeWidth:"1.5"}),(0,Ct.jsx)(kn,{cx:"12",cy:"12",r:"4.25",stroke:"currentColor",strokeWidth:"1.5"}),(0,Ct.jsx)(kn,{cx:"11.9999",cy:"12.2",r:"6",transform:"rotate(-45 11.9999 12.2)",stroke:"currentColor",strokeWidth:"3",strokeDasharray:"1.5 4"})]});const Bn=(0,Ct.jsx)(En,{fill:"none",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)(Sn,{d:"m11.7758 3.45425c.0917-.18582.3567-.18581.4484 0l2.3627 4.78731c.0364.07379.1068.12493.1882.13676l5.2831.76769c.2051.02979.287.28178.1386.42642l-3.8229 3.72637c-.0589.0575-.0858.1402-.0719.2213l.9024 5.2618c.0351.2042-.1793.36-.3627.2635l-4.7254-2.4842c-.0728-.0383-.1598-.0383-.2326 0l-4.7254 2.4842c-.18341.0965-.39776-.0593-.36274-.2635l.90247-5.2618c.01391-.0811-.01298-.1638-.0719-.2213l-3.8229-3.72637c-.14838-.14464-.0665-.39663.13855-.42642l5.28312-.76769c.08143-.01183.15182-.06297.18823-.13676z",fill:"currentColor"})});const zn=(0,Ct.jsx)(En,{fill:"none",viewBox:"0 0 25 25",xmlns:"http://www.w3.org/2000/svg",children:(0,Ct.jsx)(Sn,{clipRule:"evenodd",d:"m13 4c4.9545 0 9 4.04545 9 9 0 4.9545-4.0455 9-9 9-4.95455 0-9-4.0455-9-9 0-4.95455 4.04545-9 9-9zm5.0909 13.4545c-1.9545 3.8637-8.22726 3.8637-10.22726 0-.04546-.1818-.04546-.3636 0-.5454 2-3.8636 8.27276-3.8636 10.22726 0 .0909.1818.0909.3636 0 .5454zm-5.0909-8.90905c-1.2727 0-2.3182 1.04546-2.3182 2.31815 0 1.2728 1.0455 2.3182 2.3182 2.3182s2.3182-1.0454 2.3182-2.3182c0-1.27269-1.0455-2.31815-2.3182-2.31815z",fill:"currentColor",fillRule:"evenodd"})});var Un=function(){var e=F((function(e){return e.remainingImports})),t=F((function(e){return e.allowedImports})),n=e()>0?"has-imports":"no-imports",o="has-imports"===n?"bg-extendify-main hover:bg-extendify-main-dark":"bg-extendify-alert",i="has-imports"===n?Tn:_n;return(0,r.useEffect)((function(){t||E().finally((function(e){e=/^[1-9]\d*$/.test(e)?e:"5",F.setState({allowedImports:e})}))}),[t]),t?(0,Ct.jsxs)("a",{target:"_blank",rel:"noreferrer",className:wt()(o,"hidden sm:flex w-full no-underline button-focus text-sm justify-between py-3 px-4 text-white rounded"),href:"https://www.extendify.com/pricing/?utm_source=".concat(encodeURIComponent(window.extendifyData.sdk_partner),"&utm_medium=library&utm_campaign=import-counter&utm_content=upgrade&utm_term=").concat(n),children:[(0,Ct.jsxs)("div",{className:"flex items-center space-x-2 no-underline",children:[(0,Ct.jsx)(jn,{icon:i,size:14}),(0,Ct.jsx)("span",{children:(0,vt.sprintf)((0,vt.__)("%s/%s Imports","extendify"),e(),Number(t))})]}),(0,Ct.jsx)("span",{className:"text-white no-underline font-medium outline-none",children:(0,vt.__)("Upgrade","extendify")})]}):null};function qn(){var e,t,n,r,o,i=B((function(e){return e.taxonomies})),a=J((function(e){return e.searchParams})),s=F((function(e){return e.updatePreferredSiteType})),l=J((function(e){return e.updateTaxonomies})),c=F((function(e){return e.apiKey})),u="pattern"===a.type?"patternType":"layoutType",d=!(null!=a&&null!==(e=a.taxonomies[u])&&void 0!==e&&null!==(t=e.slug)&&void 0!==t&&t.length);return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("div",{className:"hidden sm:flex px-5 -ml-1.5 text-extendify-black",children:(0,Ct.jsx)(jn,{icon:Pn,size:40})}),(0,Ct.jsx)("div",{className:"px-5",children:(0,Ct.jsxs)("button",{onClick:function(){return l((n={slug:"",title:"Featured"},(t=u)in(e={})?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e));var e,t,n},className:wt()("text-left text-sm cursor-pointer w-full flex items-center px-0 py-2 m-0 leading-none bg-transparent hover:text-wp-theme-500 transition duration-200 button-focus space-x-1",{"text-wp-theme-500":d}),children:[(0,Ct.jsx)(jn,{icon:Ln,size:24}),(0,Ct.jsx)("span",{className:"text-sm",children:(0,vt.__)("Featured","extendify")})]})}),(0,Ct.jsx)("div",{className:"sm:mb-8 mx-6 sm:mx-0 sm:mt-0 pt-0.5 px-5",children:Object.keys(null!==(n=null==i?void 0:i.siteType)&&void 0!==n?n:{}).length>0&&(0,Ct.jsx)(wn,{value:null!==(r=null==a||null===(o=a.taxonomies)||void 0===o?void 0:o.siteType)&&void 0!==r?r:"",setValue:function(e){s(e),l({siteType:e})},terms:i.siteType})}),(0,Ct.jsx)("div",{className:"mt-px flex-grow hidden overflow-y-auto pb-32 pt-px sm:block",children:(0,Ct.jsx)(gt.Panel,{className:"bg-transparent",children:(0,Ct.jsx)(Et,{taxType:u,taxonomies:i[u]})})}),!c.length&&(0,Ct.jsx)("div",{className:"px-5",children:(0,Ct.jsx)(Un,{})})]})}function Wn(e){var t=e.children;return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("aside",{className:"flex-shrink-0 py-0 sm:py-5 relative border-r border-extendify-transparent-black-100 bg-extendify-transparent-white backdrop-filter backdrop-blur-xl backdrop-saturate-200",children:(0,Ct.jsx)("div",{className:"flex flex-col h-full sm:w-64 py-6 sm:py-0 sm:space-y-6",children:t[0]})}),(0,Ct.jsx)("main",{id:"extendify-templates",className:"bg-white w-full pt-6 sm:pt-0 h-full overflow-hidden",children:t[1]})]})}const Vn=(0,r.createElement)(En,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},(0,r.createElement)(Sn,{d:"M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"}));var $n=function(e){var t=e.className,n=J((function(e){return e.updateType})),r=y((function(e){return e.currentType?e.currentType:"pattern"}));return(0,Ct.jsxs)("div",{className:t,children:[(0,Ct.jsx)("h4",{className:"sr-only",children:(0,vt.__)("Type select","extendify")}),(0,Ct.jsx)("button",{type:"button",className:wt()({"cursor-pointer text-xs leading-none m-0 py-2.5 px-4 min-w-sm border rounded-tl-sm rounded-bl-sm border-black button-focus":!0,"bg-gray-900 text-white":"pattern"===r,"bg-transparent text-black":"pattern"!==r}),onClick:function(){return n("pattern")},children:(0,Ct.jsx)("span",{className:"",children:(0,vt.__)("Patterns","extendify")})}),(0,Ct.jsx)("button",{type:"button",className:wt()({"cursor-pointer text-xs leading-none m-0 py-2.5 px-4 min-w-sm items-center border rounded-tr-sm rounded-br-sm border-black outline-none -ml-px button-focus":!0,"bg-gray-900 text-white":"template"===r,"bg-transparent text-black":"template"!==r}),onClick:function(){return n("template")},children:(0,Ct.jsx)("span",{className:"",children:(0,vt.__)("Page Layouts","extendify")})})]})};function Hn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Jn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Jn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Jn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Gn=function(){var e=Hn((0,r.useState)(!1),2),t=e[0],n=e[1],o=function(){n(window.location.search.indexOf("DEVMODE")>-1)};return(0,r.useEffect)((function(){return n(window.location.search.indexOf("DEVMODE")>-1),window.addEventListener("popstate",o),function(){window.removeEventListener("popstate",o)}}),[]),t};function Kn(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Yn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Zn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Zn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Zn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Xn(e){var t=e.actionCallback,n=e.initialFocus,o=F((function(e){return e.apiKey.length})),i=Yn((0,r.useState)(""),2),a=i[0],s=i[1],l=Yn((0,r.useState)(""),2),c=l[0],u=l[1],d=Yn((0,r.useState)(""),2),f=d[0],p=d[1],h=Yn((0,r.useState)("info"),2),m=h[0],x=h[1],y=Yn((0,r.useState)(!1),2),v=y[0],b=y[1],w=Yn((0,r.useState)(!1),2),j=w[0],k=w[1],S=(0,r.useRef)(null),C=(0,r.useRef)(null),E=Gn();(0,r.useEffect)((function(){return s(F.getState().email),function(){return x("info")}}),[]),(0,r.useEffect)((function(){var e;j&&(null==S||null===(e=S.current)||void 0===e||e.focus())}),[j]);var _=function(){var e,t=(e=g().mark((function e(t){var n,r,o,i,s;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),b(!0),p(""),e.next=5,O(a,c);case 5:if(n=e.sent,r=n.token,o=n.error,i=n.exception,void 0===(s=n.message)){e.next=15;break}return x("error"),b(!1),p(s.length?s:"Error: Are you interacting with the wrong server?"),e.abrupt("return");case 15:if(!o&&!i){e.next=20;break}return x("error"),b(!1),p(o.length?o:i),e.abrupt("return");case 20:if(r&&"string"==typeof r){e.next=25;break}return x("error"),b(!1),p((0,vt.__)("Something went wrong","extendify")),e.abrupt("return");case 25:x("success"),p("Success!"),k(!0),b(!1),F.setState({email:a,apiKey:r});case 30:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Kn(i,r,o,a,s,"next",e)}function s(e){Kn(i,r,o,a,s,"throw",e)}a(void 0)}))});return function(e){return t.apply(this,arguments)}}();return j?(0,Ct.jsxs)("section",{className:"w-80 space-y-8 text-center pt-2 pb-4",children:[(0,Ct.jsx)(jn,{icon:Dn,size:148}),(0,Ct.jsx)("p",{className:"text-lg text-extendify-black text-center leading-extra-tight font-semibold",children:(0,vt.__)("You've signed in to Extendify","extendify")}),(0,Ct.jsx)(gt.Button,{ref:S,className:"px-4 p-2 cursor-pointer text-center rounded bg-extendify-main text-white",onClick:t,children:(0,vt.__)("View patterns","extendify")})]}):o?(0,Ct.jsxs)("section",{className:"space-y-8 w-full pb-2",children:[(0,Ct.jsx)("p",{className:"text-base text-extendify-black leading-extra-tight",children:(0,vt.__)("Account","extendify")}),(0,Ct.jsxs)("div",{className:"flex justify-between items-center",children:[(0,Ct.jsxs)("div",{className:"flex items-center space-x-2 -ml-2",children:[(0,Ct.jsx)(jn,{icon:zn,size:48}),(0,Ct.jsx)("p",{className:"text-extendify-black",children:null!=a&&a.length?a:(0,vt.__)("Logged In","extendify")})]}),E&&(0,Ct.jsx)(gt.Button,{className:"px-4 py-3 cursor-pointer text-center rounded bg-extendify-main hover:bg-extendify-main-dark text-white",onClick:function(){u(""),F.setState({apiKey:""}),setTimeout((function(){var e;null==C||null===(e=C.current)||void 0===e||e.focus()}),0)},children:(0,vt.__)("Sign out","extendify")})]})]}):(0,Ct.jsxs)("section",{className:"w-80 text-left space-y-8 pb-6",children:[(0,Ct.jsxs)("div",{children:[(0,Ct.jsx)("p",{className:"text-lg text-extendify-black text-center leading-extra-tight font-semibold",children:(0,vt.__)("Sign in to Extendify","extendify")}),(0,Ct.jsxs)("p",{className:"text-sm text-extendify-gray text-center space-x-1 leading-extra-tight",children:[(0,Ct.jsx)("span",{children:(0,vt.__)("Don't have an account?","extendify")}),(0,Ct.jsx)("a",{href:"https://extendify.com/pricing?utm_source=".concat(window.extendifyData.sdk_partner,"&utm_medium=library&utm_campaign=sign-in-form&utm_content=sign-up"),target:"_blank",className:"underline hover:no-underline text-extendify-gray",rel:"noreferrer",children:(0,vt.__)("Sign up","extendify")})]})]}),(0,Ct.jsxs)("form",{onSubmit:_,className:"space-y-2",children:[(0,Ct.jsxs)("div",{className:"flex items-center",children:[(0,Ct.jsx)("label",{className:"sr-only",htmlFor:"extendify-login-email",children:(0,vt.__)("Email address","extendify")}),(0,Ct.jsx)("input",{ref:n,id:"extendify-login-email",name:"extendify-login-email",type:"email",className:"border-2 p-2 w-full rounded",placeholder:(0,vt.__)("Email address","extendify"),value:a.length?a:"",onChange:function(e){return s(e.target.value)}})]}),(0,Ct.jsxs)("div",{className:"flex items-center",children:[(0,Ct.jsx)("label",{className:"sr-only",htmlFor:"extendify-login-license",children:(0,vt.__)("License key","extendify")}),(0,Ct.jsx)("input",{ref:C,id:"extendify-login-license",name:"extendify-login-license",type:"text",className:"border-2 p-2 w-full rounded",placeholder:(0,vt.__)("License key","extendify"),value:c,onChange:function(e){return u(e.target.value)}})]}),(0,Ct.jsx)("div",{className:"pt-2 flex justify-center",children:(0,Ct.jsxs)("button",{type:"submit",className:"relative p-2 py-3 w-72 max-w-full flex justify-center cursor-pointer text-center rounded bg-extendify-main hover:bg-extendify-main-dark text-base text-white ",children:[(0,Ct.jsx)("span",{children:(0,vt.__)("Sign In","extendify")}),v&&(0,Ct.jsx)("div",{className:"absolute right-2.5",children:(0,Ct.jsx)(gt.Spinner,{})})]})}),f&&(0,Ct.jsx)("div",{className:wt()({"border-gray-900 text-gray-900":"info"===m,"border-wp-alert-red text-wp-alert-red":"error"===m,"border-extendify-main text-extendify-main":"success"===m}),children:f}),(0,Ct.jsx)("div",{className:"text-center pt-4",children:(0,Ct.jsx)("a",{target:"_blank",rel:"noreferrer",href:"https://extendify.com/guides/sign-in?utm_source=".concat(window.extendifyData.sdk_partner,"&utm_medium=library&utm_campaign=sign-in-form&utm_content=need-help"),className:"underline hover:no-underline text-sm text-extendify-gray",children:(0,vt.__)("Need Help?","extendify")})})]})]})}function Qn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function er(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Qn(Object(n),!0).forEach((function(t){tr(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Qn(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function tr(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var nr=(0,r.forwardRef)((function(e,t){return(0,Ct.jsx)(gt.Button,er(er({},e),{},{icon:(0,Ct.jsx)(jn,{icon:Vn}),ref:t,className:"text-extendify-black opacity-75 hover:opacity-100",showTooltip:!1,label:(0,vt.__)("Close dialog","extendify")}))})),rr=(0,r.forwardRef)((function(e,t){var n=e.isOpen,o=e.heading,i=e.onRequestClose,a=e.children,s=(0,r.useRef)(null);return(0,Ct.jsx)(Ae,{appear:!0,show:n,as:r.Fragment,className:"extendify",children:(0,Ct.jsx)(yt,{initialFocus:null!=t?t:s,onClose:i,children:(0,Ct.jsxs)("div",{className:"fixed z-high inset-0 flex",children:[(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-200 transition",enterFrom:"opacity-0",enterTo:"opacity-100",children:(0,Ct.jsx)(yt.Overlay,{className:"fixed inset-0 bg-black bg-opacity-40"})}),(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-300 translate transform",enterFrom:"opacity-0 translate-y-4 sm:translate-y-5",enterTo:"opacity-100 translate-y-0",children:(0,Ct.jsx)("div",{className:"m-auto relative w-full",children:(0,Ct.jsxs)("div",{className:"bg-white shadow-modal items-center justify-center m-auto max-w-lg relative rounded-sm w-full",children:[o?(0,Ct.jsxs)("div",{className:"border-b flex justify-between items-center leading-none pl-8 py-2 pr-3",children:[(0,Ct.jsx)("span",{className:"text-base text-extendify-black whitespace-nowrap",children:o}),(0,Ct.jsx)(nr,{onClick:i})]}):(0,Ct.jsx)("div",{className:"absolute block px-4 py-4 top-0 right-0 ",children:(0,Ct.jsx)(nr,{ref:s,onClick:i})}),(0,Ct.jsx)("div",{children:a})]})})})]})})})}));function or(e){var t=e.isOpen,n=e.onClose,o=(0,r.useRef)(null);return(0,Ct.jsx)(rr,{heading:(0,vt.__)("Settings","extendify"),isOpen:t,ref:o,onRequestClose:n,children:(0,Ct.jsx)("div",{className:"flex p-6 justify-center",children:(0,Ct.jsx)(Xn,{initialFocus:o,actionCallback:n})})})}var ir=function(e){var t=e.className,n=y((function(e){return e.setOpen})),r=y((function(e){return e.setCurrentModal})),o=F((function(e){return e.apiKey.length}));return(0,Ct.jsx)("div",{className:t,children:(0,Ct.jsxs)("div",{className:"flex justify-between items-center h-full",children:[(0,Ct.jsx)("div",{className:"flex-1"}),(0,Ct.jsx)($n,{className:"flex-1 flex items-center justify-center"}),(0,Ct.jsxs)("div",{className:"flex-1 flex justify-end items-center",children:[(0,Ct.jsx)(gt.Button,{onClick:function(){return r((0,Ct.jsx)(or,{isOpen:!0,onClose:function(){return r(null)}}))},icon:(0,Ct.jsx)(jn,{icon:zn,size:24}),label:(0,vt.__)("Login and settings area","extendify"),children:o?"":(0,vt.__)("Log In","extendify")}),(0,Ct.jsx)(gt.Button,{onClick:function(){return n(!1)},icon:(0,Ct.jsx)(jn,{icon:Vn,size:24}),label:(0,vt.__)("Close library","extendify")})]})]})})};function ar(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function sr(){return sr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},sr.apply(this,arguments)}function lr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function cr(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?lr(Object(n),!0).forEach((function(t){ur(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):lr(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ur(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const dr={breakpointCols:void 0,className:void 0,columnClassName:void 0,children:void 0,columnAttrs:void 0,column:void 0};class fr extends i().Component{constructor(e){let t;super(e),this.reCalculateColumnCount=this.reCalculateColumnCount.bind(this),this.reCalculateColumnCountDebounce=this.reCalculateColumnCountDebounce.bind(this),t=this.props.breakpointCols&&this.props.breakpointCols.default?this.props.breakpointCols.default:parseInt(this.props.breakpointCols)||2,this.state={columnCount:t}}componentDidMount(){this.reCalculateColumnCount(),window&&window.addEventListener("resize",this.reCalculateColumnCountDebounce)}componentDidUpdate(){this.reCalculateColumnCount()}componentWillUnmount(){window&&window.removeEventListener("resize",this.reCalculateColumnCountDebounce)}reCalculateColumnCountDebounce(){window&&window.requestAnimationFrame?(window.cancelAnimationFrame&&window.cancelAnimationFrame(this._lastRecalculateAnimationFrame),this._lastRecalculateAnimationFrame=window.requestAnimationFrame((()=>{this.reCalculateColumnCount()}))):this.reCalculateColumnCount()}reCalculateColumnCount(){const e=window&&window.innerWidth||1/0;let t=this.props.breakpointCols;"object"!=typeof t&&(t={default:parseInt(t)||2});let n=1/0,r=t.default||2;for(let o in t){const i=parseInt(o);i>0&&e<=i&&i<n&&(n=i,r=t[o])}r=Math.max(1,parseInt(r)||1),this.state.columnCount!==r&&this.setState({columnCount:r})}itemsInColumns(){const e=this.state.columnCount,t=new Array(e),n=i().Children.toArray(this.props.children);for(let r=0;r<n.length;r++){const o=r%e;t[o]||(t[o]=[]),t[o].push(n[r])}return t}renderColumns(){const{column:e,columnAttrs:t={},columnClassName:n}=this.props,r=this.itemsInColumns(),o=100/r.length+"%";let a=n;a&&"string"!=typeof a&&(this.logDeprecated('The property "columnClassName" requires a string'),void 0===a&&(a="my-masonry-grid_column"));const s=cr(cr(cr({},e),t),{},{style:cr(cr({},t.style),{},{width:o}),className:a});return r.map(((e,t)=>i().createElement("div",sr({},s,{key:t}),e)))}logDeprecated(e){console.error("[Masonry]",e)}render(){const e=this.props,{children:t,breakpointCols:n,columnClassName:r,columnAttrs:o,column:a,className:s}=e,l=ar(e,["children","breakpointCols","columnClassName","columnAttrs","column","className"]);let c=s;return"string"!=typeof s&&(this.logDeprecated('The property "className" requires a string'),void 0===s&&(c="my-masonry-grid")),i().createElement("div",sr({},l,{className:c}),this.renderColumns())}}fr.defaultProps=dr;const pr=fr;function hr(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function mr(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){hr(i,r,o,a,s,"next",e)}function s(e){hr(i,r,o,a,s,"throw",e)}a(void 0)}))}}var xr=0,yr=function(e){var t=arguments;return mr(g().mark((function n(){var r,o,i,a,s,l,c,u;return g().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return s=t.length>1&&void 0!==t[1]?t[1]:{},xr++,l="pattern"===e.type?"8":"4",c="pattern"===e.type?"patternType":"layoutType",n.next=6,w.post("templates",{filterByFormula:br(e,c),pageSize:null!==(r=null==s?void 0:s.pageSize)&&void 0!==r?r:l,categories:e.taxonomies,search:e.search,type:e.type,offset:null!==(o=s.offset)&&void 0!==o?o:"",initial:1===xr,request_count:xr,sdk_partner:null!==(i=null===(a=F.getState())||void 0===a?void 0:a.sdkPartner)&&void 0!==i?i:""});case 6:return u=n.sent,n.abrupt("return",u);case 8:case"end":return n.stop()}}),n)})))()},vr=function(e){var t,n;return w.post("templates/".concat(e.id),{template_id:null==e?void 0:e.id,maybe_import:!0,type:null===(t=e.fields)||void 0===t?void 0:t.type,pageSize:"1",template_name:null===(n=e.fields)||void 0===n?void 0:n.title})},gr=function(e){var t,n,r,o,i;return w.post("templates/".concat(e.id),{template_id:e.id,imported:!0,basePattern:null!==(t=null!==(n=null===(r=e.fields)||void 0===r?void 0:r.basePattern)&&void 0!==n?n:null===(o=e.fields)||void 0===o?void 0:o.baseLayout)&&void 0!==t?t:"",type:e.fields.type,pageSize:"1",template_name:null===(i=e.fields)||void 0===i?void 0:i.title})},br=function(e,t){var n,r,o,i=e.taxonomies,a=null!=i&&null!==(n=i.siteType)&&void 0!==n&&null!==(r=n.slug)&&void 0!==r&&r.length?i.siteType.slug:"default",s=['{type}="'.concat(t.replace("Type",""),'"'),'{siteType}="'.concat(a,'"')];return null!==(o=i[t])&&void 0!==o&&o.slug&&s.push("{".concat(t,'}="').concat(i[t].slug,'"')),"AND(".concat(s.join(", "),")").replace(/\r?\n|\r/g,"")};function wr(){return wr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},wr.apply(this,arguments)}function jr(e,t){return jr=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},jr(e,t)}var kr=new Map,Or=new WeakMap,Sr=0,Cr=void 0;function Er(e){return Object.keys(e).sort().filter((function(t){return void 0!==e[t]})).map((function(t){return t+"_"+("root"===t?(n=e.root)?(Or.has(n)||(Sr+=1,Or.set(n,Sr.toString())),Or.get(n)):"0":e[t]);var n})).toString()}function _r(e,t,n,r){if(void 0===n&&(n={}),void 0===r&&(r=Cr),void 0===window.IntersectionObserver&&void 0!==r){var o=e.getBoundingClientRect();return t(r,{isIntersecting:r,target:e,intersectionRatio:"number"==typeof n.threshold?n.threshold:0,time:0,boundingClientRect:o,intersectionRect:o,rootBounds:o}),function(){}}var i=function(e){var t=Er(e),n=kr.get(t);if(!n){var r,o=new Map,i=new IntersectionObserver((function(t){t.forEach((function(t){var n,i=t.isIntersecting&&r.some((function(e){return t.intersectionRatio>=e}));e.trackVisibility&&void 0===t.isVisible&&(t.isVisible=i),null==(n=o.get(t.target))||n.forEach((function(e){e(i,t)}))}))}),e);r=i.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:i,elements:o},kr.set(t,n)}return n}(n),a=i.id,s=i.observer,l=i.elements,c=l.get(e)||[];return l.has(e)||l.set(e,c),c.push(t),s.observe(e),function(){c.splice(c.indexOf(t),1),0===c.length&&(l.delete(e),s.unobserve(e)),0===l.size&&(s.disconnect(),kr.delete(a))}}var Nr=["children","as","tag","triggerOnce","threshold","root","rootMargin","onChange","skip","trackVisibility","delay","initialInView","fallbackInView"];function Pr(e){return"function"!=typeof e.children}var Ar=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).node=null,n._unobserveCb=null,n.handleNode=function(e){n.node&&(n.unobserve(),e||n.props.triggerOnce||n.props.skip||n.setState({inView:!!n.props.initialInView,entry:void 0})),n.node=e||null,n.observeNode()},n.handleChange=function(e,t){e&&n.props.triggerOnce&&n.unobserve(),Pr(n.props)||n.setState({inView:e,entry:t}),n.props.onChange&&n.props.onChange(e,t)},n.state={inView:!!t.initialInView,entry:void 0},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,jr(t,n);var i=r.prototype;return i.componentDidUpdate=function(e){e.rootMargin===this.props.rootMargin&&e.root===this.props.root&&e.threshold===this.props.threshold&&e.skip===this.props.skip&&e.trackVisibility===this.props.trackVisibility&&e.delay===this.props.delay||(this.unobserve(),this.observeNode())},i.componentWillUnmount=function(){this.unobserve(),this.node=null},i.observeNode=function(){if(this.node&&!this.props.skip){var e=this.props,t=e.threshold,n=e.root,r=e.rootMargin,o=e.trackVisibility,i=e.delay,a=e.fallbackInView;this._unobserveCb=_r(this.node,this.handleChange,{threshold:t,root:n,rootMargin:r,trackVisibility:o,delay:i},a)}},i.unobserve=function(){this._unobserveCb&&(this._unobserveCb(),this._unobserveCb=null)},i.render=function(){if(!Pr(this.props)){var e=this.state,t=e.inView,n=e.entry;return this.props.children({inView:t,entry:n,ref:this.handleNode})}var r=this.props,i=r.children,a=r.as,s=r.tag,l=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(r,Nr);return o.createElement(a||s||"div",wr({ref:this.handleNode},l),i)},r}(o.Component);function Tr(e){var t=void 0===e?{}:e,n=t.threshold,r=t.delay,i=t.trackVisibility,a=t.rootMargin,s=t.root,l=t.triggerOnce,c=t.skip,u=t.initialInView,d=t.fallbackInView,f=o.useRef(),p=o.useState({inView:!!u}),h=p[0],m=p[1],x=o.useCallback((function(e){void 0!==f.current&&(f.current(),f.current=void 0),c||e&&(f.current=_r(e,(function(e,t){m({inView:e,entry:t}),t.isIntersecting&&l&&f.current&&(f.current(),f.current=void 0)}),{root:s,rootMargin:a,threshold:n,trackVisibility:i,delay:r},d))}),[Array.isArray(n)?n.toString():n,s,a,l,c,i,d,r]);(0,o.useEffect)((function(){f.current||!h.entry||l||c||m({inView:!!u})}));var y=[x,h.inView,h.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}Ar.displayName="InView",Ar.defaultProps={threshold:0,triggerOnce:!1,initialInView:!1};const Lr=wp.blockEditor,Ir=wp.blocks;var Mr=function(){return w.get("plugins")},Rr=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=new FormData;return t.append("plugins",JSON.stringify(e)),w.post("plugins",t,{headers:{"Content-Type":"multipart/form-data"}})},Dr=function(){return w.get("active-plugins")};function Fr(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Br(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Fr(i,r,o,a,s,"next",e)}function s(e){Fr(i,r,o,a,s,"throw",e)}a(void 0)}))}}var zr=[],Ur=[];function qr(e){return Wr.apply(this,arguments)}function Wr(){return(Wr=Br(g().mark((function e(t){var n,r,o,i;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((o=(o=null!==(n=null==t||null===(r=t.fields)||void 0===r?void 0:r.required_plugins)&&void 0!==n?n:[]).filter((function(e){return"editorplus"!==e}))).length){e.next=4;break}return e.abrupt("return",!1);case 4:if(zr.length){e.next=10;break}return e.t0=Object,e.next=8,Mr();case 8:e.t1=e.sent,zr=e.t0.keys.call(e.t0,e.t1);case 10:return i=!!o.length&&o.filter((function(e){return!zr.some((function(t){return t.includes(e)}))})),e.abrupt("return",i.length);case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Vr(e){return $r.apply(this,arguments)}function $r(){return($r=Br(g().mark((function e(t){var n,r,o,i;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((o=(o=null!==(n=null==t||null===(r=t.fields)||void 0===r?void 0:r.required_plugins)&&void 0!==n?n:[]).filter((function(e){return"editorplus"!==e}))).length){e.next=4;break}return e.abrupt("return",!1);case 4:if(Ur.length){e.next=10;break}return e.t0=Object,e.next=8,Dr();case 8:e.t1=e.sent,Ur=e.t0.values.call(e.t0,e.t1);case 10:if(!(i=!!o.length&&o.filter((function(e){return!Ur.some((function(t){return t.includes(e)}))})))){e.next=16;break}return e.next=14,qr(t);case 14:if(!e.sent){e.next=16;break}return e.abrupt("return",!1);case 16:return e.abrupt("return",i.length);case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Hr=l(x((function(e){return{wantedTemplate:{},importOnLoad:!1,setWanted:function(t){return e({wantedTemplate:t})},removeWanted:function(){return e({wantedTemplate:{}})}}}),{name:"extendify-wanted-template"}));function Jr(e){var t=e.msg;return(0,Ct.jsxs)(gt.Modal,{style:{maxWidth:"500px"},title:(0,vt.__)("Error installing plugins","extendify"),isDismissible:!1,children:[(0,vt.__)("You have encountered an error that we cannot recover from. Please try again.","extendify"),(0,Ct.jsx)("br",{}),(0,Ct.jsx)(gt.Notice,{isDismissible:!1,status:"error",children:t}),(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:function(){return(0,r.render)((0,Ct.jsx)(no,{}),document.getElementById("extendify-root"))},children:(0,vt.__)("Go back","extendify")})]})}const Gr=wp.data;function Kr(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Yr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Yr(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Yr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Zr(){var e=Kr((0,r.useState)(!1),2),t=e[0],n=e[1],o=function(){};return(0,(0,Gr.select)("core/editor").isEditedPostDirty)()?(0,Ct.jsxs)(gt.Modal,{title:(0,vt.__)("Reload required","extendify"),isDismissible:!1,children:[(0,Ct.jsx)("p",{style:{maxWidth:"400px"},children:(0,vt.__)("Just one more thing! We need to reload the page to continue.","extendify")}),(0,Ct.jsxs)(gt.ButtonGroup,{children:[(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:o,disabled:t,children:(0,vt.__)("Reload page","extendify")}),(0,Ct.jsx)(gt.Button,{isSecondary:!0,onClick:function(){n(!0),(0,Gr.dispatch)("core/editor").savePost(),n(!1)},isBusy:t,style:{margin:"0 4px"},children:(0,vt.__)("Save changes","extendify")})]})]}):null}function Xr(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Qr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Qr(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Qr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function eo(e){var t,n=e.requiredPlugins,o=Xr((0,r.useState)(""),2),i=o[0],a=o[1],s=Hr((function(e){return e.wantedTemplate})),l=null!=n?n:null==s||null===(t=s.fields)||void 0===t?void 0:t.required_plugins.filter((function(e){return"editorplus"!==e}));return Rr(l).then((function(){Hr.setState({importOnLoad:!0}),(0,r.render)((0,Ct.jsx)(Zr,{}),document.getElementById("extendify-root"))})).catch((function(e){var t=e.message;a(t)})),i?(0,Ct.jsx)(Jr,{msg:i}):(0,Ct.jsx)(gt.Modal,{title:(0,vt.__)("Installing plugins","extendify"),isDismissible:!1,children:(0,Ct.jsx)(gt.Button,{style:{width:"100%"},disabled:!0,isPrimary:!0,isBusy:!0,onClick:function(){},children:(0,vt.__)("Installing...","extendify")})})}function to(){var e,t,n,o=Hr((function(e){return e.wantedTemplate})),i=(null==o||null===(e=o.fields)||void 0===e?void 0:e.required_plugins)||[];return(0,Ct.jsxs)(gt.Modal,{title:(0,vt.__)("Plugins required","extendify"),isDismissible:!1,children:[(0,Ct.jsx)("p",{style:{maxWidth:"400px"},children:(0,vt.sprintf)((0,vt.__)("In order to add this %s to your site, the following plugins are required to be installed and activated.","extendify"),null!==(t=null==o||null===(n=o.fields)||void 0===n?void 0:n.type)&&void 0!==t?t:"template")}),(0,Ct.jsx)("ul",{children:i.filter((function(e){return"editorplus"!==e})).map((function(e){return(0,Ct.jsx)("li",{children:Ot(e)},e)}))}),(0,Ct.jsx)("p",{style:{maxWidth:"400px",fontWeight:"bold"},children:(0,vt.__)("Please contact a site admin for assistance in adding these plugins to your site.","extendify")}),(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:function(){return(0,r.render)((0,Ct.jsx)(Ei,{show:!0}),document.getElementById("extendify-root"))},style:{boxShadow:"none"},children:(0,vt.__)("Return to library","extendify")})]})}function no(e){var t,n,o,i,a,s=e.forceOpen,l=e.buttonLabel,c=e.title,u=e.message,d=e.requiredPlugins,f=Hr((function(e){return e.wantedTemplate}));d=null!==(t=d)&&void 0!==t?t:null==f||null===(n=f.fields)||void 0===n?void 0:n.required_plugins;return null!==(o=F.getState())&&void 0!==o&&o.canInstallPlugins?(0,Ct.jsxs)(gt.Modal,{title:null!=c?c:(0,vt.__)("Install required plugins","extendify"),isDismissible:!1,children:[(0,Ct.jsx)("p",{style:{maxWidth:"400px"},children:null!=u?u:(0,vt.__)((0,vt.sprintf)("There is just one more step. This %s requires the following to be automatically installed and activated:",null!==(i=null==f||null===(a=f.fields)||void 0===a?void 0:a.type)&&void 0!==i?i:"template"),"extendify")}),(null==u?void 0:u.length)>0||(0,Ct.jsx)("ul",{children:d.filter((function(e){return"editorplus"!==e})).map((function(e){return(0,Ct.jsx)("li",{children:Ot(e)},e)}))}),(0,Ct.jsxs)(gt.ButtonGroup,{children:[(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:function(){return(0,r.render)((0,Ct.jsx)(eo,{requiredPlugins:d}),document.getElementById("extendify-root"))},children:null!=l?l:(0,vt.__)("Install Plugins","extendify")}),s||(0,Ct.jsx)(gt.Button,{isTertiary:!0,onClick:function(){s||(0,r.render)((0,Ct.jsx)(Ei,{show:!0}),document.getElementById("extendify-root"))},style:{boxShadow:"none",margin:"0 4px"},children:(0,vt.__)("No thanks, take me back","extendify")})]})]}):(0,Ct.jsx)(to,{})}function ro(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}var oo=function(){var e,t=(e=g().mark((function e(t){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,qr(t);case 2:return e.t0=!e.sent,e.t1=function(){},e.t2=function(){return new Promise((function(){(0,r.render)((0,Ct.jsx)(no,{}),document.getElementById("extendify-root"))}))},e.abrupt("return",{id:"hasRequiredPlugins",pass:e.t0,allow:e.t1,deny:e.t2});case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){ro(i,r,o,a,s,"next",e)}function s(e){ro(i,r,o,a,s,"throw",e)}a(void 0)}))});return function(e){return t.apply(this,arguments)}}();function io(e){var t=e.msg;return(0,Ct.jsxs)(gt.Modal,{style:{maxWidth:"500px"},title:(0,vt.__)("Error Activating plugins","extendify"),isDismissible:!1,children:[(0,vt.__)("You have encountered an error that we cannot recover from. Please try again.","extendify"),(0,Ct.jsx)("br",{}),(0,Ct.jsx)(gt.Notice,{isDismissible:!1,status:"error",children:t}),(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:function(){(0,r.render)((0,Ct.jsx)(fo,{}),document.getElementById("extendify-root"))},children:(0,vt.__)("Go back","extendify")})]})}function ao(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function so(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){ao(i,r,o,a,s,"next",e)}function s(e){ao(i,r,o,a,s,"throw",e)}a(void 0)}))}}function lo(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return co(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return co(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function co(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function uo(){var e,t=lo((0,r.useState)(""),2),n=t[0],o=t[1],i=Hr((function(e){return e.wantedTemplate})),a=null==i||null===(e=i.fields)||void 0===e?void 0:e.required_plugins.filter((function(e){return"editorplus"!==e}));return Rr(a).then((function(){Hr.setState({importOnLoad:!0})})).then(so(g().mark((function e(){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,new Promise((function(e){return setTimeout(e,1e3)}));case 2:(0,r.render)((0,Ct.jsx)(Zr,{}),document.getElementById("extendify-root"));case 3:case"end":return e.stop()}}),e)})))).catch((function(e){var t=e.response;o(t.data.message)})),n?(0,Ct.jsx)(io,{msg:n}):(0,Ct.jsx)(gt.Modal,{title:(0,vt.__)("Activating plugins","extendify"),isDismissible:!1,children:(0,Ct.jsx)(gt.Button,{style:{width:"100%"},disabled:!0,isPrimary:!0,isBusy:!0,onClick:function(){},children:(0,vt.__)("Activating...","extendify")})})}function fo(e){var t,n,o,i,a,s=Hr((function(e){return e.wantedTemplate})),l=(null==s||null===(t=s.fields)||void 0===t?void 0:t.required_plugins)||[];return null!==(n=F.getState())&&void 0!==n&&n.canActivatePlugins?(0,Ct.jsx)(gt.Modal,{title:(0,vt.__)("Activate required plugins","extendify"),isDismissible:!1,children:(0,Ct.jsxs)("div",{children:[(0,Ct.jsx)("p",{style:{maxWidth:"400px"},children:null!==(o=e.message)&&void 0!==o?o:(0,vt.__)((0,vt.sprintf)("There is just one more step. This %s requires the following plugins to be installed and activated:",null!==(i=null==s||null===(a=s.fields)||void 0===a?void 0:a.type)&&void 0!==i?i:"template"),"extendify")}),(0,Ct.jsx)("ul",{children:l.filter((function(e){return"editorplus"!==e})).map((function(e){return(0,Ct.jsx)("li",{children:Ot(e)},e)}))}),(0,Ct.jsxs)(gt.ButtonGroup,{children:[(0,Ct.jsx)(gt.Button,{isPrimary:!0,onClick:function(){return(0,r.render)((0,Ct.jsx)(uo,{}),document.getElementById("extendify-root"))},children:(0,vt.__)("Activate Plugins","extendify")}),e.showClose&&(0,Ct.jsx)(gt.Button,{isTertiary:!0,onClick:function(){return(0,r.render)((0,Ct.jsx)(Ei,{show:!0}),document.getElementById("extendify-root"))},style:{boxShadow:"none",margin:"0 4px"},children:(0,vt.__)("No thanks, return to library","extendify")})]})]})}):(0,Ct.jsx)(to,{})}function po(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}var ho=function(){var e,t=(e=g().mark((function e(t){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Vr(t);case 2:return e.t0=!e.sent,e.t1=function(){},e.t2=function(){return new Promise((function(){(0,r.render)((0,Ct.jsx)(fo,{showClose:!0}),document.getElementById("extendify-root"))}))},e.abrupt("return",{id:"hasPluginsActivated",pass:e.t0,allow:e.t1,deny:e.t2});case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){po(i,r,o,a,s,"next",e)}function s(e){po(i,r,o,a,s,"throw",e)}a(void 0)}))});return function(e){return t.apply(this,arguments)}}(),mo=["tagName","children"];function xo(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function yo(e){var t=e.tagName,n=void 0===t?"button":t,o=e.children,i=xo(e,mo);return i.className=wt()(i.className,"bg-extendify-main hover:bg-extendify-main-dark cursor-pointer rounded no-underline text-base text-white flex justify-center items-center"),(0,r.createElement)(n,i,o)}function vo(e){const{body:t}=document.implementation.createHTMLDocument("");t.innerHTML=e;const n=t.getElementsByTagName("*");let r=n.length;for(;r--;){const e=n[r];if("SCRIPT"===e.tagName)(o=e).parentNode,o.parentNode.removeChild(o);else{let t=e.attributes.length;for(;t--;){const{name:n}=e.attributes[t];n.startsWith("on")&&e.removeAttribute(n)}}}var o;return t.innerHTML}function go(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function bo(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return wo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return wo(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function wo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function jo(e){var t=e.finished,n=e.resetMiddleware,o=bo((0,r.useState)(""),2),i=o[0],a=o[1],s=F((function(e){return e.remainingImports})),l=(0,r.useRef)(null),c=y((function(e){return e.setCurrentModal})),u=function(){var e,n=(e=g().mark((function e(n){var r;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.preventDefault(),r=Number(F.getState().allowedImports)+10,F.setState({registration:{email:i},allowedImports:r}),e.next=5,C(i);case 5:t();case 6:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){go(i,r,o,a,s,"next",e)}function s(e){go(i,r,o,a,s,"throw",e)}a(void 0)}))});return function(e){return n.apply(this,arguments)}}();return(0,Ct.jsx)(rr,{isOpen:!0,onRequestClose:function(){c(null),n()},ref:l,children:(0,Ct.jsxs)("div",{className:"p-10 space-y-4 text-extendify-black",children:[(0,Ct.jsx)(jn,{icon:Pn,size:42,className:"-ml-2 -mt-2"}),(0,Ct.jsx)("h3",{className:"text-xl md:leading-3",children:1==s()?(0,vt.__)("This is your last import","extendify"):(0,vt.sprintf)((0,vt.__)("You now have %s imports left","extendify"),s())}),(0,Ct.jsx)("p",{className:"max-w-md text-sm",dangerouslySetInnerHTML:{__html:vo((0,vt.sprintf)((0,vt.__)("Subscribe and %1$swe'll send you 10 more%2$s. Plus you'll get updates and special offers from us fine folks at Extendify.","extendify"),"<strong>","</strong>"))}}),(0,Ct.jsxs)("form",{onSubmit:u,className:"flex space-x-2 py-2 items-stretch",children:[(0,Ct.jsxs)("div",{className:"relative w-full max-w-xs",children:[(0,Ct.jsx)("label",{htmlFor:"extendify-email-register",className:"sr-only",children:(0,vt.__)("Email","extendify")}),(0,Ct.jsx)("input",{ref:l,id:"extendify-email-register",name:"extendify-email-register",required:!0,onChange:function(e){return a(e.target.value)},type:"email",className:"text-sm min-h-0 p-2 border-2 border-gray-900 rounded-md w-full",placeholder:(0,vt.__)("Enter your email address","extendify")})]}),(0,Ct.jsx)(yo,{type:"submit",className:"px-4 rounded-md my-0",children:(0,vt.__)("Submit","extendify")})]}),(0,Ct.jsx)(gt.Button,{isLink:!0,className:"text-extendify-gray text-sm my-0",onClick:function(){F.setState({registration:{optedOut:!0}}),t()},children:(0,vt.__)("No thanks — finish importing","extendify")})]})})}function ko(){return{id:"NeedsRegistrationModal",pass:(i=F.getState(),(1!==(null==i?void 0:i.remainingImports())||null==i||null===(e=i.registration)||void 0===e||!e.optedOut)&&((null==i||null===(t=i.registration)||void 0===t||null===(n=t.email)||void 0===n?void 0:n.length)||(null==i||null===(r=i.apiKey)||void 0===r?void 0:r.length)||(null==i||null===(o=i.registration)||void 0===o?void 0:o.optedOut)||0===(null==i?void 0:i.imports))),allow:function(){},deny:function(){return new Promise((function(e,t){y.setState({currentModal:(0,Ct.jsx)(jo,{finished:e,resetMiddleware:t})})}))}};var e,t,n,r,o,i}function Oo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return So(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return So(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}function So(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Co(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Eo(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Co(i,r,o,a,s,"next",e)}function s(e){Co(i,r,o,a,s,"throw",e)}a(void 0)}))}}function _o(e){return new Ao(e)}function No(e){return function(){return new Po(e.apply(this,arguments))}}function Po(e){var t,n;function r(t,n){try{var i=e[t](n),a=i.value,s=a instanceof Ao;Promise.resolve(s?a.wrapped:a).then((function(e){s?r("return"===t?"return":"next",e):o(i.done?"return":"normal",e)}),(function(e){r("throw",e)}))}catch(e){o("throw",e)}}function o(e,o){switch(e){case"return":t.resolve({value:o,done:!0});break;case"throw":t.reject(o);break;default:t.resolve({value:o,done:!1})}(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,o){return new Promise((function(i,a){var s={key:e,arg:o,resolve:i,reject:a,next:null};n?n=n.next=s:(t=n=s,r(e,o))}))},"function"!=typeof e.return&&(this.return=void 0)}function Ao(e){this.wrapped=e}Po.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},Po.prototype.next=function(e){return this._invoke("next",e)},Po.prototype.throw=function(e){return this._invoke("throw",e)},Po.prototype.return=function(e){return this._invoke("return",e)};function To(e){return Lo.apply(this,arguments)}function Lo(){return(Lo=Eo(g().mark((function e(t){var n,r;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=Io(t.stack);case 1:return r=void 0,e.prev=3,e.next=6,n.next();case 6:r=e.sent,e.next=13;break;case 9:throw e.prev=9,e.t0=e.catch(3),t.reset(),"Middleware exited";case 13:if(!r.done){e.next=15;break}return e.abrupt("break",17);case 15:e.next=1;break;case 17:case"end":return e.stop()}}),e,null,[[3,9]])})))).apply(this,arguments)}function Io(e){return Mo.apply(this,arguments)}function Mo(){return(Mo=No(g().mark((function e(t){var n,r,o;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=Oo(t),e.prev=1,n.s();case 3:if((r=n.n()).done){e.next=11;break}return o=r.value,e.next=7,_o(o());case 7:return e.next=9,e.sent;case 9:e.next=3;break;case 11:e.next=16;break;case 13:e.prev=13,e.t0=e.catch(1),n.e(e.t0);case 16:return e.prev=16,n.f(),e.finish(16);case 19:case"end":return e.stop()}}),e,null,[[1,13,16,19]])})))).apply(this,arguments)}function Ro(e,t){var n=(0,Gr.dispatch)("core/block-editor"),r=n.insertBlocks,o=n.replaceBlock,i=(0,Gr.select)("core/block-editor"),a=i.getSelectedBlock,s=i.getBlockHierarchyRootClientId,l=i.getBlockIndex,c=i.getGlobalBlockCount,u=a()||{},d=u.clientId,f=u.name,p=u.attributes,h=d?s(d):"",m=(h?l(h):c())+1;return("core/paragraph"===f&&""===(null==p?void 0:p.content)?o(d,e):r(e,m)).then((function(){return window.dispatchEvent(new CustomEvent("extendify::template-inserted",{detail:{template:t},bubbles:!0}))}))}function Do(e){var t=e.onRequestClose,n=e.isOpen,o=e.left,i=e.right;return(0,Ct.jsx)(Ae.Root,{appear:!0,show:!0,as:r.Fragment,children:(0,Ct.jsx)(yt,{as:"div",static:!0,open:n,className:"extendify",onClose:t,children:(0,Ct.jsxs)("div",{className:"fixed z-high inset-0 flex",children:[(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-50 transition",enterFrom:"opacity-0",enterTo:"opacity-100",children:(0,Ct.jsx)(yt.Overlay,{className:"fixed inset-0 bg-black bg-opacity-40 transition-opacity"})}),(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-300 translate transform",enterFrom:"opacity-0 translate-y-4 sm:translate-y-5",enterTo:"opacity-100 translate-y-0",children:(0,Ct.jsx)("div",{className:"m-auto",children:(0,Ct.jsxs)("div",{className:"shadow-modal relative m-8 md:m-0 max-w-md rounded-sm md:flex bg-gray-100 items-center justify-center md:max-w-2xl",children:[(0,Ct.jsxs)("button",{onClick:t,className:"absolute bg-transparent block p-4 top-0 right-0 rounded-md cursor-pointer text-gray-700 opacity-30 hover:opacity-100",children:[(0,Ct.jsx)("span",{className:"sr-only",children:(0,vt.__)("Close","extendify")}),(0,Ct.jsx)(jn,{icon:Vn})]}),(0,Ct.jsx)("div",{className:"rounded-md md:rounded-l-md md:rounded-tr-none bg-white p-12 text-center md:w-7/12 items-center",children:o}),(0,Ct.jsx)("div",{className:"justify-center md:justify-none md:w-6/12 p-10 text-black hidden md:block ",children:i})]})})})]})})})}var Fo=n(306);function Bo(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return zo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return zo(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function zo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Uo=function(e){var t=e.template,n=Bo((0,r.useState)(t.id),2),o=n[0],i=n[1];return(0,r.useEffect)((function(){o!==t.id&&setTimeout((function(){return i(t.id)}),1e3)}),[o,t.id]),(0,Ct.jsxs)("div",{className:"group-hover:opacity-90 opacity-0 flex space-x-2 items-center mb-2 ml-2 absolute bottom-0 left-0 transition duration-200 ease-in-out",children:[(0,Ct.jsx)(Fo.CopyToClipboard,{text:t.id,onCopy:function(){return i((0,vt.__)("Copied...","extendify"))},children:(0,Ct.jsx)("button",{className:"bg-white border border-black p-2 rounded-md shadow-md cursor-pointer",children:o})}),(0,Ct.jsx)("a",{target:"_blank",className:"bg-white border font-semibold border-black p-2 rounded-md shadow-md no-underline text-black",href:"https://airtable.com/appn5PSl8wU6X70sG/tblviYevlV5fYAEH7/viwh0L1kHmXN7FIB9/".concat(t.id),rel:"noreferrer",children:(0,vt.__)("Edit","extendify")})]})};function qo(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Wo(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Vo(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var $o=(0,r.memo)((function(e){var t=e.blocks;return(0,Ct.jsx)("div",{className:"with-light-shadow relative",children:(0,Ct.jsx)(Lr.BlockPreview,{blocks:t,live:!1,viewportWidth:1400})})}),(function(e,t){return e.clientId==t.clientId})),Ho=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{hasRequiredPlugins:oo,hasPluginsActivated:ho,NeedsRegistrationModal:ko,stack:[],check:function(t){var n=this;return Eo(g().mark((function r(){var o,i,a,s;return g().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:o=Oo(e),r.prev=1,o.s();case 3:if((i=o.n()).done){r.next=11;break}return a=i.value,r.next=7,n["".concat(a)](t);case 7:s=r.sent,n.stack.push(s.pass?s.allow:s.deny);case 9:r.next=3;break;case 11:r.next=16;break;case 13:r.prev=13,r.t0=r.catch(1),o.e(r.t0);case 16:return r.prev=16,o.f(),r.finish(16);case 19:case"end":return r.stop()}}),r,null,[[1,13,16,19]])})))()},reset:function(){this.stack=[]}}}(["NeedsRegistrationModal","hasRequiredPlugins","hasPluginsActivated"]),Jo=(0,Ct.jsx)(Do,{isOpen:!0,onRequestClose:function(){return y.setState({currentModal:null})},left:(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("div",{className:"flex space-x-2 items-center justify-center mb-10 text-extendify-black",children:An}),(0,Ct.jsx)("h3",{className:"text-xl md:leading-3",children:(0,vt.__)("You're out of imports","extendify")}),(0,Ct.jsx)("p",{className:"text-sm text-black",children:(0,vt.__)("Sign up today and get unlimited access to our entire collection of patterns and page layouts.","extendify")}),(0,Ct.jsxs)("div",{children:[(0,Ct.jsxs)(yo,{tagName:"a",target:"_blank",className:"m-auto mt-10 py-3",href:"https://extendify.com/pricing/?utm_source=".concat(window.extendifyData.sdk_partner,"&utm_medium=library&utm_campaign=no-imports-modal&utm_content=get-unlimited-imports"),rel:"noreferrer",children:[(0,vt.__)("Get Unlimited Imports","extendify"),(0,Ct.jsx)(jn,{icon:In,size:24,className:"-ml-1 mr-1"})]}),(0,Ct.jsxs)("p",{className:"text-sm text-extendify-gray mb-0",children:[(0,vt.__)("Have an account?","extendify"),(0,Ct.jsx)(gt.Button,{onClick:function(){y.setState({currentModal:(0,Ct.jsx)(or,{isOpen:!0,onClose:function(){return y.setState({currentModal:null})}})})},className:"underline hover:no-underline text-sm text-extendify-gray pl-2",children:(0,vt.__)("Sign in","extendify")})]})]})]}),right:(0,Ct.jsxs)("div",{className:"space-y-2",children:[(0,Ct.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,Ct.jsx)(jn,{icon:Rn,size:24,className:"-ml-1 mr-1"}),(0,Ct.jsx)("span",{className:"text-sm leading-none",children:(0,vt.__)("Access to 100's of Patterns","extendify")})]}),(0,Ct.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,Ct.jsx)(jn,{icon:Mn,size:24,className:"-ml-1 mr-1"}),(0,Ct.jsx)("span",{className:"text-sm leading-none",children:(0,vt.__)("Beautiful full page layouts","extendify")})]}),(0,Ct.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,Ct.jsx)(jn,{icon:Fn,size:24,className:"-ml-1 mr-1"}),(0,Ct.jsx)("span",{className:"text-sm leading-none",children:(0,vt.__)("Fast and friendly support","extendify")})]}),(0,Ct.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,Ct.jsx)(jn,{icon:Bn,size:24,className:"-ml-1 mr-1"}),(0,Ct.jsx)("span",{className:"text-sm leading-none",children:(0,vt.__)("14-Day guarantee","extendify")})]})]})});function Go(e){var t,n=e.template,o=(0,r.useRef)(null),i=(0,r.useRef)(!1),a=F((function(e){return e.canImport})),s=y((function(e){return e.setOpen})),l=y((function(e){return e.setCurrentModal})),c=(0,Ir.rawHandler)({HTML:n.fields.code}),u=Wo((0,r.useState)(!1),2),d=u[0],f=u[1],p=Wo((0,r.useState)(!1),2),h=p[0],m=p[1],x=Wo(Tr(),2),v=x[0],b=x[1],w=Gn(),j=function(){var e,t=(e=g().mark((function e(){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ho.check(n);case 2:To(Ho).then((function(){setTimeout((function(){Ro(c,n).then((function(){return l(null)})).then((function(){return s(!1)})).then((function(){return Ho.reset()}))}),100)})).catch((function(){}));case 3:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){qo(i,r,o,a,s,"next",e)}function s(e){qo(i,r,o,a,s,"throw",e)}a(void 0)}))});return function(){return t.apply(this,arguments)}}(),k=function(){a()?(vr(n),j()):l(Jo)};return(0,r.useEffect)((function(){var e,t,n,r=[];return e=window.requestAnimationFrame((function(){t=window.requestAnimationFrame((function(){o.current.querySelectorAll("iframe").forEach((function(e){var t=window.requestAnimationFrame((function(){e.contentWindow.dispatchEvent(new Event("resize"))}));r.push(t)})),n=window.requestAnimationFrame((function(){window.dispatchEvent(new Event("resize")),m(!0)}))}))})),function(){return[].concat(r,[e,t,n]).forEach((function(e){return window.cancelAnimationFrame(e)}))}}),[]),(0,r.useEffect)((function(){!d&&b&&f(!0)}),[b,d,n]),(0,Ct.jsxs)("div",{className:"relative group",children:[(0,Ct.jsxs)("div",{role:"button",tabIndex:"0",ref:o,"aria-label":(0,vt.sprintf)((0,vt.__)("Press to import %s","extendify"),null==n||null===(t=n.fields)||void 0===t?void 0:t.type),className:"mb-6 md:mb-8 cursor-pointer button-focus",onFocus:function(){i.current||(i.current=!0,Array.from(o.current.querySelectorAll('a, button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])')).forEach((function(e){return e.setAttribute("tabIndex","-1")})))},onClick:k,onKeyDown:function(e){["Enter","Space"," "].includes(e.key)&&(e.stopPropagation(),e.preventDefault(),k())},children:[(0,Ct.jsx)("div",{ref:v,className:"invisible absolute inset-0 pointer-events-none"}),d&&(0,Ct.jsx)($o,{blocks:c})]}),w&&h&&(0,Ct.jsx)(Uo,{template:n})]})}function Ko(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Yo(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Ko(i,r,o,a,s,"next",e)}function s(e){Ko(i,r,o,a,s,"throw",e)}a(void 0)}))}}function Zo(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Xo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Xo(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Qo(){var e=function(){var e=(0,r.useRef)(!1);return(0,r.useEffect)((function(){return e.current=!0,function(){return e.current=!1}})),e}(),t=J((function(e){return e.templates})),n=J((function(e){return e.appendTemplates})),o=Zo((0,r.useState)(""),2),i=o[0],a=o[1],s=Zo((0,r.useState)(!1),2),l=s[0],c=s[1],u=Zo(Tr(),2),d=u[0],f=u[1],p=J((function(e){return e.updateSearchParams})),h=J((function(e){return e.searchParams})),m=(0,r.useRef)(J.getState().nextPage),x=(0,r.useRef)(J.getState().searchParams),y="pattern"===x.current.type?"patternType":"layoutType",v=x.current.taxonomies[y];(0,r.useEffect)((function(){return J.subscribe((function(e){return m.current=e}),(function(e){return e.nextPage}))}),[]),(0,r.useEffect)((function(){return J.subscribe((function(e){return x.current=e}),(function(e){return e.searchParams}))}),[]);var b,w=(0,r.useCallback)(Yo(g().mark((function t(){var r,o;return g().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return a(""),c(!1),t.next=4,yr(x.current,{offset:m.current}).catch((function(e){console.error(e),a(e&&e.message?e.message:(0,vt.__)("Unknown error occured. Check browser console or contact support.","extendify"))}));case 4:if(o=t.sent,e.current){t.next=7;break}return t.abrupt("return");case 7:null!=o&&null!==(r=o.error)&&void 0!==r&&r.length&&a(null==o?void 0:o.error),null!=o&&o.records&&h===x.current&&(J.setState({nextPage:o.offset}),n(o.records),c(o.records.length<=0));case 9:case"end":return t.stop()}}),t)}))),[h,n,e]);if((0,r.useEffect)((function(){Object.keys(x.current.taxonomies).length&&(J.getState().skipNextFetch?J.setState({skipNextFetch:!1}):w())}),[w,x]),(0,r.useEffect)((function(){f&&w()}),[f,w]),i.length)return(0,Ct.jsxs)("div",{className:"text-left",children:[(0,Ct.jsx)("h2",{className:"text-left",children:(0,vt.__)("Server error","extendify")}),(0,Ct.jsx)("code",{className:"block max-w-xl p-4 mb-4",style:{minHeight:"10rem"},children:i}),(0,Ct.jsx)(gt.Button,{isTertiary:!0,onClick:function(){p({taxonomies:{},search:""}),w()},children:(0,vt.__)("Press here to reload experience")})]});if(l)return(0,Ct.jsx)("div",{className:"flex h-full items-center justify-center w-full -mt-2 sm:mt-0",children:(0,Ct.jsx)("h2",{className:"text-sm text-extendify-gray font-normal",children:(0,vt.sprintf)("template"===x.current.type?(0,vt.__)('We couldn\'t find any layouts in the "%s" category.',"extendify"):(0,vt.__)('We couldn\'t find any patterns in the "%s" category.',"extendify"),null!==(b=null==v?void 0:v.title)&&void 0!==b?b:v.slug)})});if(!t.length)return(0,Ct.jsx)("div",{className:"flex h-full items-center justify-center w-full -mt-2 sm:mt-0",children:(0,Ct.jsx)(gt.Spinner,{})});return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)(pr,{breakpointCols:{default:2,1320:2,860:1,599:2,400:1},className:"flex -ml-6 md:-ml-8 w-auto pb-40 pt-0.5 px-0.5",columnClassName:"pl-6 md:pl-8 bg-clip-padding min-h-screen",children:t.map((function(e){return(0,Ct.jsx)(Go,{template:e},e.id)}))}),J.getState().nextPage&&(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("div",{className:"transform -translate-y-20",children:(0,Ct.jsx)(gt.Spinner,{})}),(0,Ct.jsx)("div",{className:"-translate-y-full flex flex-col h-80 items-end justify-end my-2 relative transform z-0 text",ref:d,style:{zIndex:-1}})]})]})}function ei(e){var t=e.setOpen;return(0,Ct.jsx)("div",{className:"h-full flex flex-col items-center relative max-w-screen-4xl mx-auto",children:(0,Ct.jsxs)("div",{className:"w-full flex-grow overflow-hidden",children:[(0,Ct.jsx)("button",{onClick:function(){return document.getElementById("extendify-templates").querySelector("button").focus()},className:"sr-only focus:not-sr-only focus:text-blue-500",children:(0,vt.__)("Skip to content","extendify")}),(0,Ct.jsx)("div",{className:"sm:flex relative mx-auto h-full",children:(0,Ct.jsxs)(Wn,{children:[(0,Ct.jsx)(qn,{}),(0,Ct.jsxs)("div",{className:"relative h-full z-30 flex flex-col",children:[(0,Ct.jsx)(ir,{className:"hidden sm:block w-full h-20 flex-shrink-0 px-6 md:px-8",hideLibrary:function(){return t(!1)}}),(0,Ct.jsx)("div",{className:"flex-grow z-20 overflow-y-auto px-6 md:px-8",children:(0,Ct.jsx)(Qo,{})})]})]})})]})})}const ti=(0,r.createElement)(En,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},(0,r.createElement)(Sn,{d:"M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z"}));function ni(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ri(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ni(Object(n),!0).forEach((function(t){oi(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ni(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function oi(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ii(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return ai(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ai(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ai(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var si={welcome:function(){var e=y((function(e){return e.setOpen}));return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("span",{className:"text-black",children:(0,vt.__)("Welcome to the Extendify Library","extendify")}),(0,Ct.jsx)("span",{className:"px-2 opacity-50","aria-hidden":"true",children:"|"}),(0,Ct.jsxs)("div",{className:"flex space-x-2 justify-center items-center",children:[(0,Ct.jsx)(gt.Button,{variant:"link",className:"text-black underline hover:no-underline p-0 h-auto",href:"https://extendify.com/welcome/?utm_source=".concat(window.extendifyData.sdk_partner,"&utm_medium=library&utm_campaign=welcome-notice&utm_content=tell-me-more"),target:"_blank",children:(0,vt.__)("Tell me more","extendify")}),(0,Ct.jsx)("span",{className:"font-bold","aria-hidden":"true",children:"•"}),(0,Ct.jsx)(gt.Button,{variant:"link",className:"text-black underline hover:no-underline p-0 h-auto",onClick:function(){document.getElementById("extendify-templates-inserter-btn").classList.add("invisible"),F.setState({enabled:!1}),e(!1)},children:(0,vt.__)("Turn off the library","extendify")})]})]})},promotion:function(e){var t,n=e.promotionData;return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("span",{className:"text-black",children:null!==(t=null==n?void 0:n.text)&&void 0!==t?t:""}),(0,Ct.jsx)("span",{className:"px-2 opacity-50","aria-hidden":"true",children:"|"}),(0,Ct.jsx)("div",{className:"flex space-x-2 justify-center items-center",children:(null==n?void 0:n.url)&&(0,Ct.jsx)(gt.Button,{variant:"link",className:"text-black underline hover:no-underline p-0 h-auto",href:"".concat(n.url,"?utm_source=").concat(window.extendifyData.sdk_partner),target:"_blank",children:null==n?void 0:n.button_text})})]})},feedback:function(){return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("span",{className:"text-black",children:(0,vt.__)("Tell us how to make the Extendify Library work better for you","extendify")}),(0,Ct.jsx)("span",{className:"px-2 opacity-50","aria-hidden":"true",children:"|"}),(0,Ct.jsx)("div",{className:"flex space-x-2 justify-center items-center",children:(0,Ct.jsx)(gt.Button,{variant:"link",className:"text-black underline hover:no-underline p-0 h-auto",href:"https://extendify.com/feedback/?utm_source=".concat(window.extendifyData.sdk_partner,"&utm_medium=library&utm_campaign=feedback-notice&utm_content=give-feedback"),target:"_blank",children:(0,vt.__)("Give feedback","extendify")})})]})}};function li(){var e,t=ii((0,r.useState)(null),2),n=t[0],o=t[1],i=(0,r.useRef)(!1),a=y((function(e){var t,n;return null===(t=e.metaData)||void 0===t||null===(n=t.banners)||void 0===n?void 0:n.footer})),s=null!==(e=Object.keys(si).find((function(e){return"promotion"===e?(null==a?void 0:a.key)&&!F.getState().noticesDismissedAt[a.key]:"feedback"===e?(o=null!==(t=F.getState().imports)&&void 0!==t?t:0,i=null!==(n=null===(r=F.getState())||void 0===r?void 0:r.firstLoadedOn)&&void 0!==n?n:new Date,s=(new Date).getTime()-new Date(i).getTime(),o>=3&&s/864e5>3&&!F.getState().noticesDismissedAt[e]):!F.getState().noticesDismissedAt[e];var t,n,r,o,i,s})))&&void 0!==e?e:null,l=si[s];return(0,r.useEffect)((function(){si[s]&&!i.current&&(o(!0),i.current=!0)}),[s]),n?(0,Ct.jsxs)("div",{className:"bg-extendify-secondary hidden lg:flex space-x-4 py-3 px-5 justify-center items-center relative max-w-screen-4xl mx-auto",children:[(0,Ct.jsx)(l,{promotionData:a}),(0,Ct.jsx)("div",{className:"absolute right-1",children:(0,Ct.jsx)(gt.Button,{className:"opacity-50 hover:opacity-100 focus:opacity-100 text-extendify-black",icon:(0,Ct.jsx)(jn,{icon:ti}),label:(0,vt.__)("Dismiss this notice","extendify"),onClick:function(){o(!1);var e="promotion"===s?a.key:s;F.setState({noticesDismissedAt:Object.assign({},ri(ri({},F.getState().noticesDismissedAt),{},oi({},e,(new Date).toISOString())))})},showTooltip:!1})})]}):null}function ci(){var e=(0,r.useRef)(null),t=y((function(e){return e.open})),n=y((function(e){return e.setOpen})),o=y((function(e){return e.currentModal}));return(0,Ct.jsx)(Ae,{appear:!0,show:t,as:r.Fragment,children:(0,Ct.jsx)(yt,{as:"div",static:!0,className:"extendify",initialFocus:e,onClose:function(){return n(!1)},children:(0,Ct.jsx)("div",{className:"h-screen w-screen sm:h-auto m-auto sm:w-auto fixed z-high inset-0 overflow-y-auto",children:(0,Ct.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-300",enterFrom:"opacity-0",enterTo:"opacity-100",children:(0,Ct.jsx)(yt.Overlay,{className:"fixed inset-0 bg-black bg-opacity-40 transition-opacity"})}),(0,Ct.jsx)(Ae.Child,{as:r.Fragment,enter:"ease-out duration-300",enterFrom:"opacity-0 translate-y-4 sm:translate-y-5",enterTo:"opacity-100 translate-y-0",children:(0,Ct.jsxs)("div",{ref:e,tabIndex:"0",onClick:function(e){return e.target===e.currentTarget&&n(!1)},className:"fixed lg:absolute inset-0 lg:overflow-hidden transform transition-all p-2 lg:p-16",children:[(0,Ct.jsx)(ei,{}),(0,Ct.jsx)(li,{}),o]})})]})})})})}const ui=wp.compose,di=wp.hooks,fi=JSON.parse('{"t":["ext-absolute","ext-relative","ext-top-base","ext-top-lg","ext--top-base","ext--top-lg","ext-right-base","ext-right-lg","ext--right-base","ext--right-lg","ext-bottom-base","ext-bottom-lg","ext--bottom-base","ext--bottom-lg","ext-left-base","ext-left-lg","ext--left-base","ext--left-lg","ext-order-1","ext-order-2","ext-col-auto","ext-col-span-1","ext-col-span-2","ext-col-span-3","ext-col-span-4","ext-col-span-5","ext-col-span-6","ext-col-span-7","ext-col-span-8","ext-col-span-9","ext-col-span-10","ext-col-span-11","ext-col-span-12","ext-col-span-full","ext-col-start-1","ext-col-start-2","ext-col-start-3","ext-col-start-4","ext-col-start-5","ext-col-start-6","ext-col-start-7","ext-col-start-8","ext-col-start-9","ext-col-start-10","ext-col-start-11","ext-col-start-12","ext-col-start-13","ext-col-start-auto","ext-col-end-1","ext-col-end-2","ext-col-end-3","ext-col-end-4","ext-col-end-5","ext-col-end-6","ext-col-end-7","ext-col-end-8","ext-col-end-9","ext-col-end-10","ext-col-end-11","ext-col-end-12","ext-col-end-13","ext-col-end-auto","ext-row-auto","ext-row-span-1","ext-row-span-2","ext-row-span-3","ext-row-span-4","ext-row-span-5","ext-row-span-6","ext-row-span-full","ext-row-start-1","ext-row-start-2","ext-row-start-3","ext-row-start-4","ext-row-start-5","ext-row-start-6","ext-row-start-7","ext-row-start-auto","ext-row-end-1","ext-row-end-2","ext-row-end-3","ext-row-end-4","ext-row-end-5","ext-row-end-6","ext-row-end-7","ext-row-end-auto","ext-m-0","ext-m-auto","ext-m-base","ext-m-lg","ext--m-base","ext--m-lg","ext-mx-0","ext-mx-auto","ext-mx-base","ext-mx-lg","ext--mx-base","ext--mx-lg","ext-my-0","ext-my-auto","ext-my-base","ext-my-lg","ext--my-base","ext--my-lg","ext-mt-0","ext-mt-auto","ext-mt-base","ext-mt-lg","ext--mt-base","ext--mt-lg","ext-mr-0","ext-mr-auto","ext-mr-base","ext-mr-lg","ext--mr-base","ext--mr-lg","ext-mb-0","ext-mb-auto","ext-mb-base","ext-mb-lg","ext--mb-base","ext--mb-lg","ext-ml-0","ext-ml-auto","ext-ml-base","ext-ml-lg","ext--ml-base","ext--ml-lg","ext-block","ext-inline-block","ext-inline","ext-flex","ext-inline-flex","ext-grid","ext-inline-grid","ext-hidden","ext-w-auto","ext-w-full","ext-max-w-full","ext-flex-1","ext-flex-auto","ext-flex-initial","ext-flex-none","ext-flex-shrink-0","ext-flex-shrink","ext-flex-grow-0","ext-flex-grow","ext-list-none","ext-grid-cols-1","ext-grid-cols-2","ext-grid-cols-3","ext-grid-cols-4","ext-grid-cols-5","ext-grid-cols-6","ext-grid-cols-7","ext-grid-cols-8","ext-grid-cols-9","ext-grid-cols-10","ext-grid-cols-11","ext-grid-cols-12","ext-grid-cols-none","ext-grid-rows-1","ext-grid-rows-2","ext-grid-rows-3","ext-grid-rows-4","ext-grid-rows-5","ext-grid-rows-6","ext-grid-rows-none","ext-flex-row","ext-flex-row-reverse","ext-flex-col","ext-flex-col-reverse","ext-flex-wrap","ext-flex-wrap-reverse","ext-flex-nowrap","ext-items-start","ext-items-end","ext-items-center","ext-items-baseline","ext-items-stretch","ext-justify-start","ext-justify-end","ext-justify-center","ext-justify-between","ext-justify-around","ext-justify-evenly","ext-justify-items-start","ext-justify-items-end","ext-justify-items-center","ext-justify-items-stretch","ext-gap-0","ext-gap-base","ext-gap-lg","ext-gap-x-0","ext-gap-x-base","ext-gap-x-lg","ext-gap-y-0","ext-gap-y-base","ext-gap-y-lg","ext-justify-self-auto","ext-justify-self-start","ext-justify-self-end","ext-justify-self-center","ext-justify-self-stretch","ext-rounded-none","ext-rounded-full","ext-rounded-t-none","ext-rounded-t-full","ext-rounded-r-none","ext-rounded-r-full","ext-rounded-b-none","ext-rounded-b-full","ext-rounded-l-none","ext-rounded-l-full","ext-rounded-tl-none","ext-rounded-tl-full","ext-rounded-tr-none","ext-rounded-tr-full","ext-rounded-br-none","ext-rounded-br-full","ext-rounded-bl-none","ext-rounded-bl-full","ext-border-0","ext-border-t-0","ext-border-r-0","ext-border-b-0","ext-border-l-0","ext-p-0","ext-p-base","ext-p-lg","ext-px-0","ext-px-base","ext-px-lg","ext-py-0","ext-py-base","ext-py-lg","ext-pt-0","ext-pt-base","ext-pt-lg","ext-pr-0","ext-pr-base","ext-pr-lg","ext-pb-0","ext-pb-base","ext-pb-lg","ext-pl-0","ext-pl-base","ext-pl-lg","ext-text-left","ext-text-center","ext-text-right","ext-leading-none","ext-leading-tight","ext-leading-snug","ext-leading-normal","ext-leading-relaxed","ext-leading-loose","clip-path--rhombus","clip-path--diamond","clip-path--rhombus-alt","wp-block-columns[class*=\\"fullwidth-cols\\"]\\n","tablet\\\\:fullwidth-cols","desktop\\\\:fullwidth-cols","direction-rtl","direction-ltr","bring-to-front","text-stroke","text-stroke--primary","text-stroke--secondary","editor\\\\:no-caption","editor\\\\:no-inserter","editor\\\\:no-resize","editor\\\\:pointer-events-none","tablet\\\\:ext-absolute","tablet\\\\:ext-relative","tablet\\\\:ext-top-base","tablet\\\\:ext-top-lg","tablet\\\\:ext--top-base","tablet\\\\:ext--top-lg","tablet\\\\:ext-right-base","tablet\\\\:ext-right-lg","tablet\\\\:ext--right-base","tablet\\\\:ext--right-lg","tablet\\\\:ext-bottom-base","tablet\\\\:ext-bottom-lg","tablet\\\\:ext--bottom-base","tablet\\\\:ext--bottom-lg","tablet\\\\:ext-left-base","tablet\\\\:ext-left-lg","tablet\\\\:ext--left-base","tablet\\\\:ext--left-lg","tablet\\\\:ext-order-1","tablet\\\\:ext-order-2","tablet\\\\:ext-m-0","tablet\\\\:ext-m-auto","tablet\\\\:ext-m-base","tablet\\\\:ext-m-lg","tablet\\\\:ext--m-base","tablet\\\\:ext--m-lg","tablet\\\\:ext-mx-0","tablet\\\\:ext-mx-auto","tablet\\\\:ext-mx-base","tablet\\\\:ext-mx-lg","tablet\\\\:ext--mx-base","tablet\\\\:ext--mx-lg","tablet\\\\:ext-my-0","tablet\\\\:ext-my-auto","tablet\\\\:ext-my-base","tablet\\\\:ext-my-lg","tablet\\\\:ext--my-base","tablet\\\\:ext--my-lg","tablet\\\\:ext-mt-0","tablet\\\\:ext-mt-auto","tablet\\\\:ext-mt-base","tablet\\\\:ext-mt-lg","tablet\\\\:ext--mt-base","tablet\\\\:ext--mt-lg","tablet\\\\:ext-mr-0","tablet\\\\:ext-mr-auto","tablet\\\\:ext-mr-base","tablet\\\\:ext-mr-lg","tablet\\\\:ext--mr-base","tablet\\\\:ext--mr-lg","tablet\\\\:ext-mb-0","tablet\\\\:ext-mb-auto","tablet\\\\:ext-mb-base","tablet\\\\:ext-mb-lg","tablet\\\\:ext--mb-base","tablet\\\\:ext--mb-lg","tablet\\\\:ext-ml-0","tablet\\\\:ext-ml-auto","tablet\\\\:ext-ml-base","tablet\\\\:ext-ml-lg","tablet\\\\:ext--ml-base","tablet\\\\:ext--ml-lg","tablet\\\\:ext-block","tablet\\\\:ext-inline-block","tablet\\\\:ext-inline","tablet\\\\:ext-flex","tablet\\\\:ext-inline-flex","tablet\\\\:ext-grid","tablet\\\\:ext-inline-grid","tablet\\\\:ext-hidden","tablet\\\\:ext-w-auto","tablet\\\\:ext-w-full","tablet\\\\:ext-max-w-full","tablet\\\\:ext-flex-1","tablet\\\\:ext-flex-auto","tablet\\\\:ext-flex-initial","tablet\\\\:ext-flex-none","tablet\\\\:ext-flex-shrink-0","tablet\\\\:ext-flex-shrink","tablet\\\\:ext-flex-grow-0","tablet\\\\:ext-flex-grow","tablet\\\\:ext-list-none","tablet\\\\:ext-grid-cols-1","tablet\\\\:ext-grid-cols-2","tablet\\\\:ext-grid-cols-3","tablet\\\\:ext-grid-cols-4","tablet\\\\:ext-grid-cols-5","tablet\\\\:ext-grid-cols-6","tablet\\\\:ext-grid-cols-7","tablet\\\\:ext-grid-cols-8","tablet\\\\:ext-grid-cols-9","tablet\\\\:ext-grid-cols-10","tablet\\\\:ext-grid-cols-11","tablet\\\\:ext-grid-cols-12","tablet\\\\:ext-grid-cols-none","tablet\\\\:ext-flex-row","tablet\\\\:ext-flex-row-reverse","tablet\\\\:ext-flex-col","tablet\\\\:ext-flex-col-reverse","tablet\\\\:ext-flex-wrap","tablet\\\\:ext-flex-wrap-reverse","tablet\\\\:ext-flex-nowrap","tablet\\\\:ext-items-start","tablet\\\\:ext-items-end","tablet\\\\:ext-items-center","tablet\\\\:ext-items-baseline","tablet\\\\:ext-items-stretch","tablet\\\\:ext-justify-start","tablet\\\\:ext-justify-end","tablet\\\\:ext-justify-center","tablet\\\\:ext-justify-between","tablet\\\\:ext-justify-around","tablet\\\\:ext-justify-evenly","tablet\\\\:ext-justify-items-start","tablet\\\\:ext-justify-items-end","tablet\\\\:ext-justify-items-center","tablet\\\\:ext-justify-items-stretch","tablet\\\\:ext-justify-self-auto","tablet\\\\:ext-justify-self-start","tablet\\\\:ext-justify-self-end","tablet\\\\:ext-justify-self-center","tablet\\\\:ext-justify-self-stretch","tablet\\\\:ext-p-0","tablet\\\\:ext-p-base","tablet\\\\:ext-p-lg","tablet\\\\:ext-px-0","tablet\\\\:ext-px-base","tablet\\\\:ext-px-lg","tablet\\\\:ext-py-0","tablet\\\\:ext-py-base","tablet\\\\:ext-py-lg","tablet\\\\:ext-pt-0","tablet\\\\:ext-pt-base","tablet\\\\:ext-pt-lg","tablet\\\\:ext-pr-0","tablet\\\\:ext-pr-base","tablet\\\\:ext-pr-lg","tablet\\\\:ext-pb-0","tablet\\\\:ext-pb-base","tablet\\\\:ext-pb-lg","tablet\\\\:ext-pl-0","tablet\\\\:ext-pl-base","tablet\\\\:ext-pl-lg","tablet\\\\:ext-text-left","tablet\\\\:ext-text-center","tablet\\\\:ext-text-right","desktop\\\\:ext-absolute","desktop\\\\:ext-relative","desktop\\\\:ext-top-base","desktop\\\\:ext-top-lg","desktop\\\\:ext--top-base","desktop\\\\:ext--top-lg","desktop\\\\:ext-right-base","desktop\\\\:ext-right-lg","desktop\\\\:ext--right-base","desktop\\\\:ext--right-lg","desktop\\\\:ext-bottom-base","desktop\\\\:ext-bottom-lg","desktop\\\\:ext--bottom-base","desktop\\\\:ext--bottom-lg","desktop\\\\:ext-left-base","desktop\\\\:ext-left-lg","desktop\\\\:ext--left-base","desktop\\\\:ext--left-lg","desktop\\\\:ext-order-1","desktop\\\\:ext-order-2","desktop\\\\:ext-m-0","desktop\\\\:ext-m-auto","desktop\\\\:ext-m-base","desktop\\\\:ext-m-lg","desktop\\\\:ext--m-base","desktop\\\\:ext--m-lg","desktop\\\\:ext-mx-0","desktop\\\\:ext-mx-auto","desktop\\\\:ext-mx-base","desktop\\\\:ext-mx-lg","desktop\\\\:ext--mx-base","desktop\\\\:ext--mx-lg","desktop\\\\:ext-my-0","desktop\\\\:ext-my-auto","desktop\\\\:ext-my-base","desktop\\\\:ext-my-lg","desktop\\\\:ext--my-base","desktop\\\\:ext--my-lg","desktop\\\\:ext-mt-0","desktop\\\\:ext-mt-auto","desktop\\\\:ext-mt-base","desktop\\\\:ext-mt-lg","desktop\\\\:ext--mt-base","desktop\\\\:ext--mt-lg","desktop\\\\:ext-mr-0","desktop\\\\:ext-mr-auto","desktop\\\\:ext-mr-base","desktop\\\\:ext-mr-lg","desktop\\\\:ext--mr-base","desktop\\\\:ext--mr-lg","desktop\\\\:ext-mb-0","desktop\\\\:ext-mb-auto","desktop\\\\:ext-mb-base","desktop\\\\:ext-mb-lg","desktop\\\\:ext--mb-base","desktop\\\\:ext--mb-lg","desktop\\\\:ext-ml-0","desktop\\\\:ext-ml-auto","desktop\\\\:ext-ml-base","desktop\\\\:ext-ml-lg","desktop\\\\:ext--ml-base","desktop\\\\:ext--ml-lg","desktop\\\\:ext-block","desktop\\\\:ext-inline-block","desktop\\\\:ext-inline","desktop\\\\:ext-flex","desktop\\\\:ext-inline-flex","desktop\\\\:ext-grid","desktop\\\\:ext-inline-grid","desktop\\\\:ext-hidden","desktop\\\\:ext-w-auto","desktop\\\\:ext-w-full","desktop\\\\:ext-max-w-full","desktop\\\\:ext-flex-1","desktop\\\\:ext-flex-auto","desktop\\\\:ext-flex-initial","desktop\\\\:ext-flex-none","desktop\\\\:ext-flex-shrink-0","desktop\\\\:ext-flex-shrink","desktop\\\\:ext-flex-grow-0","desktop\\\\:ext-flex-grow","desktop\\\\:ext-list-none","desktop\\\\:ext-grid-cols-1","desktop\\\\:ext-grid-cols-2","desktop\\\\:ext-grid-cols-3","desktop\\\\:ext-grid-cols-4","desktop\\\\:ext-grid-cols-5","desktop\\\\:ext-grid-cols-6","desktop\\\\:ext-grid-cols-7","desktop\\\\:ext-grid-cols-8","desktop\\\\:ext-grid-cols-9","desktop\\\\:ext-grid-cols-10","desktop\\\\:ext-grid-cols-11","desktop\\\\:ext-grid-cols-12","desktop\\\\:ext-grid-cols-none","desktop\\\\:ext-flex-row","desktop\\\\:ext-flex-row-reverse","desktop\\\\:ext-flex-col","desktop\\\\:ext-flex-col-reverse","desktop\\\\:ext-flex-wrap","desktop\\\\:ext-flex-wrap-reverse","desktop\\\\:ext-flex-nowrap","desktop\\\\:ext-items-start","desktop\\\\:ext-items-end","desktop\\\\:ext-items-center","desktop\\\\:ext-items-baseline","desktop\\\\:ext-items-stretch","desktop\\\\:ext-justify-start","desktop\\\\:ext-justify-end","desktop\\\\:ext-justify-center","desktop\\\\:ext-justify-between","desktop\\\\:ext-justify-around","desktop\\\\:ext-justify-evenly","desktop\\\\:ext-justify-items-start","desktop\\\\:ext-justify-items-end","desktop\\\\:ext-justify-items-center","desktop\\\\:ext-justify-items-stretch","desktop\\\\:ext-justify-self-auto","desktop\\\\:ext-justify-self-start","desktop\\\\:ext-justify-self-end","desktop\\\\:ext-justify-self-center","desktop\\\\:ext-justify-self-stretch","desktop\\\\:ext-p-0","desktop\\\\:ext-p-base","desktop\\\\:ext-p-lg","desktop\\\\:ext-px-0","desktop\\\\:ext-px-base","desktop\\\\:ext-px-lg","desktop\\\\:ext-py-0","desktop\\\\:ext-py-base","desktop\\\\:ext-py-lg","desktop\\\\:ext-pt-0","desktop\\\\:ext-pt-base","desktop\\\\:ext-pt-lg","desktop\\\\:ext-pr-0","desktop\\\\:ext-pr-base","desktop\\\\:ext-pr-lg","desktop\\\\:ext-pb-0","desktop\\\\:ext-pb-base","desktop\\\\:ext-pb-lg","desktop\\\\:ext-pl-0","desktop\\\\:ext-pl-base","desktop\\\\:ext-pl-lg","desktop\\\\:ext-text-left","desktop\\\\:ext-text-center","desktop\\\\:ext-text-right"]}');function pi(e){return function(e){if(Array.isArray(e))return hi(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return hi(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return hi(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function hi(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function mi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function xi(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?mi(Object(n),!0).forEach((function(t){yi(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):mi(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function yi(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var vi=(0,ui.createHigherOrderComponent)((function(e){return function(t){var n=t.attributes.extUtilities,r=fi.t.map((function(e){return e.replace(".","").replace(new RegExp("\\\\","g"),"")}));return(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)(e,xi({},t)),n&&(0,Ct.jsx)(Lr.InspectorAdvancedControls,{children:(0,Ct.jsx)(gt.FormTokenField,{label:(0,vt.__)("Extendify Utilities","extendify"),tokenizeOnSpace:!0,value:n,suggestions:r,onChange:function(e){t.setAttributes({extUtilities:e})}})})]})}}),"utilityClassEdit");function gi(e,t,n){var r=e.className,o=n.extUtilities,i=n.className;if(!o||!Object.keys(o).length)return e;var a=function(e){switch(Object.prototype.toString.call(e)){case"[object String]":return e.split(" ");case"[object Array]":return e;default:return[]}},s=new Set([].concat(pi(a(i)),pi(a(r)),pi(a(o))));return Object.assign({},e,{className:pi(s).join(" ")})}function bi(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}(0,di.addFilter)("blocks.registerBlockType","extendify/utilities/attributes",(function(e){return xi(xi({},e),{},{attributes:xi(xi({},e.attributes),{},{extUtilities:{type:"array",default:[]}})})})),(0,di.addFilter)("blocks.registerBlockType","extendify/utilities/addEditProps",(function(e){var t=e.getEditWrapperProps;return e.getEditWrapperProps=function(n){var r={};return t&&(r=t(n)),gi(r,e,n)},e})),(0,di.addFilter)("editor.BlockEdit","extendify/utilities/advancedClassControls",vi),(0,di.addFilter)("blocks.getSaveContent.extraProps","extendify/utilities/extra-props",gi);var wi=function(){return(e=g().mark((function e(){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.get("taxonomies");case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){bi(i,r,o,a,s,"next",e)}function s(e){bi(i,r,o,a,s,"throw",e)}a(void 0)}))})();var e};function ji(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function ki(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){ji(i,r,o,a,s,"next",e)}function s(e){ji(i,r,o,a,s,"throw",e)}a(void 0)}))}}var Oi=function(){return w.get("meta-data")};function Si(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Ci(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ci(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ci(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ei(e){var t=e.show,n=void 0!==t&&t,o=y((function(e){return e.open})),i=y((function(e){return e.setOpen})),a=Si((0,r.useState)(!1),2),s=a[0],l=a[1],c=(0,r.useCallback)((function(){return i(!0)}),[i]),u=(0,r.useCallback)((function(){return i(!1)}),[i]),d=J((function(e){return e.initTemplateData})),f=F((function(e){return e.uuid.length>0})),p=J((function(e){return Object.keys(e.taxonomyDefaultState).length>0}));return function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=J((function(e){return e.setupDefaultTaxonomies})),n=B((function(e){return e.setTaxonomies})),o=(0,r.useCallback)(ki(g().mark((function e(){var r,o;return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,wi();case 2:if(o=e.sent,o=Object.keys(o).reduce((function(e,t){return e[t]=o[t],e}),{}),null!==(r=Object.keys(o))&&void 0!==r&&r.length){e.next=6;break}return e.abrupt("return");case 6:n(o),t();case 8:case"end":return e.stop()}}),e)}))),[n,t]);(0,r.useEffect)((function(){e&&o()}),[o,e])}(o),(0,r.useEffect)((function(){f&&p&&(d(),l(!0))}),[f,p,d]),(0,r.useEffect)((function(){n&&i(!0)}),[n,i]),(0,r.useEffect)((function(){Oi().then((function(e){y.setState({metaData:e})}))}),[]),(0,r.useEffect)((function(){return window.addEventListener("extendify::open-library",c),window.addEventListener("extendify::close-library",u),function(){window.removeEventListener("extendify::open-library",c),window.removeEventListener("extendify::close-library",u)}}),[u,c]),s?(0,Ct.jsx)(ci,{}):null}const _i=wp.plugins,Ni=wp.editPost;var Pi=function(){return w.get("site-settings")},Ai=function(e){var t=new FormData;return t.append("data",JSON.stringify(e)),w.post("site-settings",t,{headers:{"Content-Type":"multipart/form-data"}})};function Ti(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Li(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Ti(i,r,o,a,s,"next",e)}function s(e){Ti(i,r,o,a,s,"throw",e)}a(void 0)}))}}var Ii={getItem:function(){var e=Li(g().mark((function e(){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Pi();case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),setItem:function(){var e=Li(g().mark((function e(t,n){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ai(n);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),removeItem:function(){}},Mi=l(x((function(){return{enabled:!0}}),{name:"extendify-sitesettings",getStorage:function(){return Ii}}));function Ri(e,t,n,r,o,i,a){try{var s=e[i](a),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function Di(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){Ri(i,r,o,a,s,"next",e)}function s(e){Ri(i,r,o,a,s,"throw",e)}a(void 0)}))}}function Fi(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){s=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(s)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Bi(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Bi(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Bi(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const zi=function(){var e=(0,Gr.useSelect)((function(e){return e("core").canUser("create","users")})),t=Fi((0,r.useState)(F((function(e){return e.enabled}))),2),n=t[0],o=t[1],i=Fi((0,r.useState)(Mi((function(e){return e.enabled}))),2),a=i[0],s=i[1];function l(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=document.getElementById("extendify-templates-inserter-btn");t&&(e?t.classList.add("invisible"):t.classList.remove("invisible"))}function c(e){return u.apply(this,arguments)}function u(){return(u=Di(g().mark((function e(t){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,F.setState({enabled:t});case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e){return f.apply(this,arguments)}function f(){return(f=Di(g().mark((function e(t){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Mi.setState({enabled:t});case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t){return h.apply(this,arguments)}function h(){return h=Di(g().mark((function e(t,n){return g().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("global"!==n){e.next=5;break}return e.next=3,d(t);case 3:e.next=7;break;case 5:return e.next=7,c(t);case 7:case"end":return e.stop()}}),e)}))),h.apply(this,arguments)}function m(e){"global"===e?s((function(t){return p(!t,e),!t})):o((function(t){return l(!t),p(!t,e),!t}))}return(0,r.useEffect)((function(){l(!n)}),[n]),(0,Ct.jsxs)(gt.Modal,{title:(0,vt.__)("Extendify Settings","extendify"),onRequestClose:function(){var e=document.getElementById("extendify-util");(0,r.unmountComponentAtNode)(e)},children:[(0,Ct.jsx)(gt.ToggleControl,{label:e?(0,vt.__)("Enable the library for myself","extendify"):(0,vt.__)("Enable the library","extendify"),help:(0,vt.__)("Publish with hundreds of patterns & page layouts","extendify"),checked:n,onChange:function(){return m("user")}}),e&&(0,Ct.jsxs)(Ct.Fragment,{children:[(0,Ct.jsx)("br",{}),(0,Ct.jsx)(gt.ToggleControl,{label:(0,vt.__)("Allow all users to publish with the library"),help:(0,vt.__)("Everyone publishes with patterns & page layouts","extendify"),checked:a,onChange:function(){return m("global")}})]})]})};var Ui=function(e){var t,n;kt(null===(t=e.target.closest("[data-extendify-identifier]"))||void 0===t||null===(n=t.dataset)||void 0===n?void 0:n.extendifyIdentifier,"open")},qi=function(){var e,t,n;return null===window.extendifyData.user||(null===(e=window.extendifyData)||void 0===e||null===(t=e.user)||void 0===t||null===(n=t.state)||void 0===n?void 0:n.isAdmin)},Wi=function(){var e,t,n;return null===window.extendifyData.sitesettings||(null===(e=window.extendifyData)||void 0===e||null===(t=e.sitesettings)||void 0===t||null===(n=t.state)||void 0===n?void 0:n.enabled)},Vi=(0,Ct.jsx)("div",{id:"extendify-templates-inserter",className:"extendify",children:(0,Ct.jsxs)("button",{style:"background:#D9F1EE;color:#1e1e1e;border:1px solid #949494 !important;font-weight:bold;font-size:14px;padding:8px;margin-right:8px",type:"button","data-extendify-identifier":"main-button",id:"extendify-templates-inserter-btn",className:"components-button",children:[(0,Ct.jsx)(jn,{icon:Pn,size:24,className:"-ml-1 mr-1"}),(0,vt.__)("Library","extendify")]})});if(window._wpLoadBlockEditor)var $i=window.wp.data.subscribe((function(){requestAnimationFrame((function(){var e,t,n;(Wi()||qi())&&(document.getElementById("extendify-templates-inserter-btn")||document.querySelector(".edit-post-header-toolbar")&&(document.querySelector(".edit-post-header-toolbar").insertAdjacentHTML("beforeend",(0,r.renderToString)(Vi)),document.getElementById("extendify-templates-inserter-btn").addEventListener("click",Ui),(null===window.extendifyData.user?Wi():null===(e=window.extendifyData)||void 0===e||null===(t=e.user)||void 0===t||null===(n=t.state)||void 0===n?void 0:n.enabled)||document.getElementById("extendify-templates-inserter-btn").classList.add("invisible"),$i()))}))}));if(window._wpLoadBlockEditor)var Hi=window.wp.data.subscribe((function(){requestAnimationFrame((function(){if((Wi()||qi())&&document.querySelector("[id$=patterns-view]")&&!document.getElementById("extendify-cta-button")){var e=(0,Ct.jsx)("div",{children:(0,Ct.jsx)("button",{id:"extendify-cta-button",style:"margin:1rem 1rem 0;width: calc(100% - 2rem);justify-content: center;","data-extendify-identifier":"patterns-cta",className:"components-button is-secondary",children:(0,vt.__)("Discover patterns in Extendify Library","extendify")})});document.querySelector("[id$=patterns-view]").insertAdjacentHTML("afterbegin",(0,r.renderToString)(e)),document.getElementById("extendify-cta-button").addEventListener("click",Ui),Hi()}}))}));window._wpLoadBlockEditor&&(0,_i.registerPlugin)("extendify-settings-enable-disable",{render:function(){return(0,Ct.jsx)(Ct.Fragment,{children:(0,Ct.jsxs)(Ni.PluginSidebarMoreMenuItem,{onClick:function(){var e=document.getElementById("extendify-util");(0,r.render)((0,Ct.jsx)(zi,{}),e)},icon:(0,Ct.jsx)(jn,{icon:Pn,size:24}),children:[" ",(0,vt.__)("Extendify","extendify")]})})}}),[{register:function(){var e=(0,Gr.dispatch)("core/notices").createNotice,t=F.getState().incrementImports;window.addEventListener("extendify::template-inserted",(function(n){e("info",(0,vt.__)("Page layout added"),{isDismissible:!0,type:"snackbar"}),setTimeout((function(){var e;t(),gr(null===(e=n.detail)||void 0===e?void 0:e.template)}),0)}))}},{register:function(){var e=this;window.addEventListener("extendify::softerror-encountered",(function(t){e[(0,jt.camelCase)(t.detail.type)](t.detail)}))},versionOutdated:function(e){(0,r.render)((0,Ct.jsx)(no,{title:e.data.title,requiredPlugins:["extendify"],message:e.data.message,buttonLabel:e.data.buttonLabel,forceOpen:!0}),document.getElementById("extendify-root"))}}].forEach((function(e){return e.register()}));const Ji=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"extendify/library","title":"Pattern Library","category":"design","description":"Add block patterns and full page layouts with the Extendify Library.","keywords":["pattern","extendify","library","template","layouts"],"textdomain":"extendify","attributes":{"preview":{"type":"string"}}}');(0,Ir.registerBlockType)(Ji,{icon:Nn,example:{attributes:{preview:window.extendifyData.asset_path+"/preview.png"}},edit:function(e){var t=e.clientId,n=e.attributes,o=(0,Gr.useDispatch)("core/block-editor").removeBlock;return(0,r.useEffect)((function(){n.preview||(kt("library-block","open"),o(t))}),[t,n,o]),(0,Ct.jsx)("img",{style:{display:"block",maxWidth:"100%"},src:n.preview,alt:(0,vt.sprintf)((0,vt.__)("%s Pattern Library","extendify"),"Extendify")})}}),window._wpLoadBlockEditor&&window.wp.domReady((function(){var e=Object.assign(document.createElement("div"),{id:"extendify-root"});if(document.body.append(e),(0,r.render)((0,Ct.jsx)(Ei,{}),e),e.parentNode.insertBefore(Object.assign(document.createElement("div"),{id:"extendify-util"}),e.nextSibling),Hr.getState().importOnLoad){var t=Hr.getState().wantedTemplate;setTimeout((function(){Ro((0,Ir.rawHandler)({HTML:t.fields.code}),t)}),0)}Hr.setState({importOnLoad:!1,wantedTemplate:{}})}))},42:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(n){var i=typeof n;if("string"===i||"number"===i)e.push(n);else if(Array.isArray(n)){if(n.length){var a=o.apply(null,n);a&&e.push(a)}}else if("object"===i)if(n.toString===Object.prototype.toString)for(var s in n)r.call(n,s)&&n[s]&&e.push(s);else e.push(n.toString())}}return e.join(" ")}e.exports?(o.default=o,e.exports=o):void 0===(n=function(){return o}.apply(t,[]))||(e.exports=n)}()},12:(e,t,n)=>{"use strict";var r=n(185),o={"text/plain":"Text","text/html":"Url",default:"Text"};e.exports=function(e,t){var n,i,a,s,l,c,u=!1;t||(t={}),n=t.debug||!1;try{if(a=r(),s=document.createRange(),l=document.getSelection(),(c=document.createElement("span")).textContent=e,c.style.all="unset",c.style.position="fixed",c.style.top=0,c.style.clip="rect(0, 0, 0, 0)",c.style.whiteSpace="pre",c.style.webkitUserSelect="text",c.style.MozUserSelect="text",c.style.msUserSelect="text",c.style.userSelect="text",c.addEventListener("copy",(function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),void 0===r.clipboardData){n&&console.warn("unable to use e.clipboardData"),n&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var i=o[t.format]||o.default;window.clipboardData.setData(i,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))})),document.body.appendChild(c),s.selectNodeContents(c),l.addRange(s),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");u=!0}catch(r){n&&console.error("unable to copy using execCommand: ",r),n&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(t.format||"text",e),t.onCopy&&t.onCopy(window.clipboardData),u=!0}catch(r){n&&console.error("unable to copy using clipboardData: ",r),n&&console.error("falling back to prompt"),i=function(e){var t=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return e.replace(/#{\s*key\s*}/g,t)}("message"in t?t.message:"Copy to clipboard: #{key}, Enter"),window.prompt(i,e)}}finally{l&&("function"==typeof l.removeRange?l.removeRange(s):l.removeAllRanges()),c&&document.body.removeChild(c),a()}return u}},716:()=>{},965:()=>{},525:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function o(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,i){for(var a,s,l=o(e),c=1;c<arguments.length;c++){for(var u in a=Object(arguments[c]))n.call(a,u)&&(l[u]=a[u]);if(t){s=t(a);for(var d=0;d<s.length;d++)r.call(a,s[d])&&(l[s[d]]=a[s[d]])}}return l}},61:e=>{var t,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function a(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:o}catch(e){t=o}try{n="function"==typeof clearTimeout?clearTimeout:i}catch(e){n=i}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&f())}function f(){if(!c){var e=a(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u<t;)s&&s[u].run();u=-1,t=l.length}s=null,c=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===i||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function h(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new p(e,t)),1!==l.length||c||a(f)},p.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=h,r.addListener=h,r.once=h,r.off=h,r.removeListener=h,r.removeAllListeners=h,r.emit=h,r.prependListener=h,r.prependOnceListener=h,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},218:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CopyToClipboard=void 0;var r=i(n(363)),o=i(n(12));function i(e){return e&&e.__esModule?e:{default:e}}function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function d(e,t){return!t||"object"!==a(t)&&"function"!=typeof t?p(e):t}function f(e){return f=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},f(e)}function p(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var x=function(e){function t(){var e,n;c(this,t);for(var i=arguments.length,a=new Array(i),s=0;s<i;s++)a[s]=arguments[s];return m(p(n=d(this,(e=f(t)).call.apply(e,[this].concat(a)))),"onClick",(function(e){var t=n.props,i=t.text,a=t.onCopy,s=t.children,l=t.options,c=r.default.Children.only(s),u=(0,o.default)(i,l);a&&a(i,u),c&&c.props&&"function"==typeof c.props.onClick&&c.props.onClick(e)})),n}var n,i,a;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&h(e,t)}(t,e),n=t,i=[{key:"render",value:function(){var e=this.props,t=(e.text,e.onCopy,e.options,e.children),n=l(e,["text","onCopy","options","children"]),o=r.default.Children.only(t);return r.default.cloneElement(o,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(n,!0).forEach((function(t){m(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(n).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},n,{onClick:this.onClick}))}}],i&&u(n.prototype,i),a&&u(n,a),t}(r.default.PureComponent);t.CopyToClipboard=x,m(x,"defaultProps",{onCopy:void 0,options:void 0})},306:(e,t,n)=>{"use strict";var r=n(218).CopyToClipboard;r.CopyToClipboard=r,e.exports=r},426:(e,t,n)=>{"use strict";n(525);var r=n(363),o=60103;if(t.Fragment=60107,"function"==typeof Symbol&&Symbol.for){var i=Symbol.for;o=i("react.element"),t.Fragment=i("react.fragment")}var a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s=Object.prototype.hasOwnProperty,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,i={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)s.call(t,r)&&!l.hasOwnProperty(r)&&(i[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===i[r]&&(i[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:i,_owner:a.current}}t.jsx=c,t.jsxs=c},246:(e,t,n)=>{"use strict";e.exports=n(426)},248:e=>{var t=function(e){"use strict";var t,n=Object.prototype,r=n.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var o=t&&t.prototype instanceof x?t:x,i=Object.create(o.prototype),a=new _(r||[]);return i._invoke=function(e,t,n){var r=d;return function(o,i){if(r===p)throw new Error("Generator is already running");if(r===h){if("throw"===o)throw i;return P()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var s=S(a,n);if(s){if(s===m)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(r===d)throw r=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r=p;var l=u(e,t,n);if("normal"===l.type){if(r=n.done?h:f,l.arg===m)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r=h,n.method="throw",n.arg=l.arg)}}}(e,n,a),i}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var d="suspendedStart",f="suspendedYield",p="executing",h="completed",m={};function x(){}function y(){}function v(){}var g={};l(g,i,(function(){return this}));var b=Object.getPrototypeOf,w=b&&b(b(N([])));w&&w!==n&&r.call(w,i)&&(g=w);var j=v.prototype=x.prototype=Object.create(g);function k(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function O(e,t){function n(o,i,a,s){var l=u(e[o],e,i);if("throw"!==l.type){var c=l.arg,d=c.value;return d&&"object"==typeof d&&r.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,s)}),(function(e){n("throw",e,a,s)})):t.resolve(d).then((function(e){c.value=e,a(c)}),(function(e){return n("throw",e,a,s)}))}s(l.arg)}var o;this._invoke=function(e,r){function i(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(i,i):i()}}function S(e,n){var r=e.iterator[n.method];if(r===t){if(n.delegate=null,"throw"===n.method){if(e.iterator.return&&(n.method="return",n.arg=t,S(e,n),"throw"===n.method))return m;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return m}var o=u(r,e.iterator,n.arg);if("throw"===o.type)return n.method="throw",n.arg=o.arg,n.delegate=null,m;var i=o.arg;return i?i.done?(n[e.resultName]=i.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,m):i:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,m)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function E(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(C,this),this.reset(!0)}function N(e){if(e){var n=e[i];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,a=function n(){for(;++o<e.length;)if(r.call(e,o))return n.value=e[o],n.done=!1,n;return n.value=t,n.done=!0,n};return a.next=a}}return{next:P}}function P(){return{value:t,done:!0}}return y.prototype=v,l(j,"constructor",v),l(v,"constructor",y),y.displayName=l(v,s,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,v):(e.__proto__=v,l(e,s,"GeneratorFunction")),e.prototype=Object.create(j),e},e.awrap=function(e){return{__await:e}},k(O.prototype),l(O.prototype,a,(function(){return this})),e.AsyncIterator=O,e.async=function(t,n,r,o,i){void 0===i&&(i=Promise);var a=new O(c(t,n,r,o),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},k(j),l(j,s,"Generator"),l(j,i,(function(){return this})),l(j,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=N,_.prototype={constructor:_,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(E),!e)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function o(r,o){return s.type="throw",s.arg=e,n.next=r,o&&(n.method="next",n.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,m):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),E(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;E(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:N(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),m}},e}(e.exports);try{regeneratorRuntime=t}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=t:Function("r","regeneratorRuntime = r")(t)}},185:e=>{e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case"INPUT":case"TEXTAREA":t.blur();break;default:t=null}return e.removeAllRanges(),function(){"Caret"===e.type&&e.removeAllRanges(),e.rangeCount||n.forEach((function(t){e.addRange(t)})),t&&t.focus()}}},363:e=>{"use strict";e.exports=React}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.m=t,e=[],r.O=(t,n,o,i)=>{if(!n){var a=1/0;for(u=0;u<e.length;u++){for(var[n,o,i]=e[u],s=!0,l=0;l<n.length;l++)(!1&i||a>=i)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(s=!1,i<a&&(a=i));if(s){e.splice(u--,1);var c=o();void 0!==c&&(t=c)}}return t}i=i||0;for(var u=e.length;u>0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,o,i]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={245:0,506:0,551:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var o,i,[a,s,l]=n,c=0;if(a.some((t=>0!==e[t]))){for(o in s)r.o(s,o)&&(r.m[o]=s[o]);if(l)var u=l(r)}for(t&&t(n);c<a.length;c++)i=a[c],r.o(e,i)&&e[i]&&e[i][0](),e[a[c]]=0;return r.O(u)},n=self.webpackChunk=self.webpackChunk||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),r.O(void 0,[506,551],(()=>r(78))),r.O(void 0,[506,551],(()=>r(716)));var o=r.O(void 0,[506,551],(()=>r(965)));o=r.O(o)})();
public/build/extendify.js.LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ object-assign
3
+ (c) Sindre Sorhus
4
+ @license MIT
5
+ */
6
+
7
+ /*!
8
+ Copyright (c) 2018 Jed Watson.
9
+ Licensed under the MIT License (MIT), see
10
+ http://jedwatson.github.io/classnames
11
+ */
12
+
13
+ /** @license React v17.0.2
14
+ * react-jsx-runtime.production.min.js
15
+ *
16
+ * Copyright (c) Facebook, Inc. and its affiliates.
17
+ *
18
+ * This source code is licensed under the MIT license found in the
19
+ * LICENSE file in the root directory of this source tree.
20
+ */
public/editorplus/.gitkeep ADDED
File without changes
public/editorplus/editorplus.min.js ADDED
@@ -0,0 +1 @@
 
1
+ (()=>{if(window._wpLoadBlockEditor)var e=window.wp.data.subscribe((function(){var t="editorplus-template.php"===window.wp.data.select("core/editor").getEditedPostAttribute("template"),o=document.querySelector(".edit-post-visual-editor__post-title-wrapper"),r=document.querySelector(".editor-styles-wrapper");o&&r&&(t?(Promise.resolve().then((function(){return o.style.display="none"})),r.style.paddingTop="0",r.style.backgroundColor="#ffffff"):(o.style.removeProperty("display"),r.style.removeProperty("padding-top"),r.style.removeProperty("background-color")),e())}))})();
readme.txt ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Extendify ===
2
+ Contributors: extendify, richtabor, kbat82, clubkert, arturgrabo
3
+ Tags: page builder, editor, patterns, drag-and-drop, blocks, visual editor, wysiwyg, design, website builder, landing page builder, front-end builder
4
+ Requires at least: 5.4
5
+ Tested up to: 5.8.2
6
+ Stable tag: 0.1.0
7
+ Requires PHP: 5.6
8
+ License: GPLv2
9
+ License URI: https://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ Extendify is the platform of site design and creation tools for people that want to build a beautiful WordPress website with a library of patterns and full page layouts for the Gutenberg block editor.
12
+
13
+ == Description ==
14
+
15
+ Make a beautiful WordPress website easier, and faster, than ever before with Extendify's suite of design and publishing tools.
16
+
17
+ = A library of web components =
18
+ Our library of reusable website patterns and full page layouts can be assembled to rapidly build beautiful websites. These best-in-class templates enable you to drag, drop and publish in WordPress, without a single line of code.
19
+
20
+ = Built for your theme and your workflow =
21
+ Extendify is a theme-agnostic design experience platform that works with your Gutenberg-friendly WordPress theme — instantly leveling-up your editing and publishing flow today.
22
+
23
+ = Like Extendify? =
24
+ - Follow us on [Twitter](https://www.twitter.com/extendifyinc).
25
+ - Rate us on [WordPress](https://wordpress.org/support/plugin/extendify/reviews/?filter=5/#new-post) :)
26
+
27
+ = Privacy =
28
+ Extendify is a SaaS (software as a service) connector plugin that uses a custom API to fetch block patterns and page layouts from our servers. API requests are only made when a user clicks on the Library button. In order to provide and improve this service, Extendify passes site data along with an API request, including:
29
+
30
+ * Browser
31
+ * Referring site
32
+ * Category selection
33
+ * WP language
34
+ * Active theme
35
+ * Active plugins
36
+ * Anonymized UUID
37
+ * Anonymized IP address
38
+
39
+ By activating the Extendify plugin and accessing the library, you agree to our [privacy policy](https://extendify.com/privacy-policy) and [terms of service](https://extendify.com/terms-of-service).
40
+
41
+ == Installation ==
42
+
43
+ 1. Install using the WordPress plugin installer, or extract the zip file and drop the contents into the `wp-content/plugins/` directory of your WordPress site.
44
+ 2. Activate the plugin through the 'Plugins' menu in WordPress.
45
+ 3. Edit or create a new page on your site
46
+ 4. Press the 'Library' button at the top left of the editor header
47
+ 5. Browse and import beautiful patterns and full page layouts; click one to add it directly to the page.
48
+
49
+ For documentation and tutorials, read our [guides](https://extendify.com/guides/?utm_source=wp-repo&utm_medium=link&utm_campaign=readme).
50
+
51
+ == Frequently Asked Questions ==
52
+
53
+ **Can I use Extendify with any theme?**
54
+ Yes! You can create a beautiful site in just a few clicks with just about any Gutenberg-friendly WordPress theme.
55
+
56
+ **Can I use Extendify with WooCommerce?**
57
+ Yes! Extendify is compatible with WooCommerce. You’ll need to install and configure WooCommerce separately to set up eCommerce functionality.
58
+
59
+ **Is Extendify free?**
60
+ Extendify is a free plugin available through the WordPress.org directory that allows users to extend the power of the Gutenberg Block Editor. Each user receives a limited number of imports completely free. We offer a paid subscription for folks who want unlimited access to all of our beautiful patterns and page layouts.
61
+
62
+ **What is Extendify Pro?**
63
+ Extendify Pro gives you unlimited access to the entire library of our patterns and page layouts, without restrictions.
64
+
65
+ **Will Extendify slow down my website?**
66
+ Nope! Extendify imports lightweight block-based content that is served directly from your WordPress site. Our templates use the latest WordPress technologies, leveraging the best that Gutenberg has to offer, without any of the bloat of traditional page builders.
67
+
68
+ == Changelog ==
69
+
70
+ Read our full changelog articles [here](https://extendify.com/changelog)
71
+
72
+ = 0.1.0 - 2022-01-06 =
73
+ * Add null check on import position
74
+ * Add support for importing patterns to a specific location
75
+ * Add `/extendify` slash command to open the library
76
+ * Add preview optimizations
77
+ * Add check for live preview visibility
78
+ * Fix pattern display bug with TT1 CSS Grid galleries
routes/api.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Api routes
4
+ */
5
+
6
+ if (!defined('ABSPATH')) {
7
+ die('No direct access.');
8
+ }
9
+
10
+ use Extendify\Library\ApiRouter;
11
+ use Extendify\Library\Controllers\AuthController;
12
+ use Extendify\Library\Controllers\MetaController;
13
+ use Extendify\Library\Controllers\PingController;
14
+ use Extendify\Library\Controllers\UserController;
15
+ use Extendify\Library\Controllers\PluginController;
16
+ use Extendify\Library\Controllers\SiteSettingsController;
17
+ use Extendify\Library\Controllers\TaxonomyController;
18
+ use Extendify\Library\Controllers\TemplateController;
19
+
20
+ \add_action(
21
+ 'rest_api_init',
22
+ function () {
23
+ ApiRouter::get('/active-plugins', [PluginController::class, 'active']);
24
+ ApiRouter::get('/plugins', [PluginController::class, 'index']);
25
+ ApiRouter::post('/plugins', [PluginController::class, 'install']);
26
+
27
+ ApiRouter::get('/taxonomies', [TaxonomyController::class, 'index']);
28
+
29
+ ApiRouter::post('/templates', [TemplateController::class, 'index']);
30
+ ApiRouter::post('/templates/(?P<template_id>[a-zA-Z0-9-]+)', [TemplateController::class, 'ping']);
31
+
32
+ ApiRouter::get('/user', [UserController::class, 'show']);
33
+ ApiRouter::post('/user', [UserController::class, 'store']);
34
+ ApiRouter::get('/user-meta', [UserController::class, 'meta']);
35
+ ApiRouter::get('/max-free-imports', [UserController::class, 'maxImports']);
36
+
37
+ ApiRouter::post('/register-mailing-list', [UserController::class, 'mailingList']);
38
+
39
+ ApiRouter::post('/register', [AuthController::class, 'register']);
40
+ ApiRouter::post('/login', [AuthController::class, 'login']);
41
+
42
+ ApiRouter::get('/meta-data', [MetaController::class, 'getAll']);
43
+ ApiRouter::post('/simple-ping', [PingController::class, 'ping']);
44
+
45
+ ApiRouter::get('/site-settings', [SiteSettingsController::class, 'show']);
46
+ ApiRouter::post('/site-settings', [SiteSettingsController::class, 'store']);
47
+ }
48
+ );
src/ExtendifyLibrary.js ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useCallback, useState } from '@wordpress/element'
2
+ import { useGlobalStore } from './state/GlobalState'
3
+ import { useUserStore } from './state/User'
4
+ import { useTemplatesStore } from './state/Templates'
5
+ import MainWindow from './pages/MainWindow'
6
+ import './utility-control'
7
+ import useTaxonomies from './hooks/useTaxonomies'
8
+ import { General as GeneralApi } from './api/General'
9
+
10
+ export default function ExtendifyLibrary({ show = false }) {
11
+ const open = useGlobalStore((state) => state.open)
12
+ const setOpen = useGlobalStore((state) => state.setOpen)
13
+ const [ready, setReady] = useState(false)
14
+ const showLibrary = useCallback(() => setOpen(true), [setOpen])
15
+ const hideLibrary = useCallback(() => setOpen(false), [setOpen])
16
+ const initTemplateData = useTemplatesStore(
17
+ (state) => state.initTemplateData,
18
+ )
19
+
20
+ // When the uuid of the user comes back from the database, we can
21
+ // assume that the state object is ready. This is important to check
22
+ // as the library may be "open" when loaded, but not ready.
23
+ const userStoreReady = useUserStore((state) => state.uuid.length > 0)
24
+ const templatesStoreReady = useTemplatesStore(
25
+ (state) => Object.keys(state.taxonomyDefaultState).length > 0,
26
+ )
27
+ useTaxonomies(open)
28
+
29
+ useEffect(() => {
30
+ if (userStoreReady && templatesStoreReady) {
31
+ initTemplateData()
32
+ setReady(true)
33
+ }
34
+ }, [userStoreReady, templatesStoreReady, initTemplateData])
35
+
36
+ useEffect(() => {
37
+ show && setOpen(true)
38
+ }, [show, setOpen])
39
+
40
+ useEffect(() => {
41
+ GeneralApi.metaData().then((data) => {
42
+ useGlobalStore.setState({
43
+ metaData: data,
44
+ })
45
+ })
46
+ }, [])
47
+
48
+ // Let the visibility to be controlled from outside the application
49
+ useEffect(() => {
50
+ window.addEventListener('extendify::open-library', showLibrary)
51
+ window.addEventListener('extendify::close-library', hideLibrary)
52
+ return () => {
53
+ window.removeEventListener('extendify::open-library', showLibrary)
54
+ window.removeEventListener('extendify::close-library', hideLibrary)
55
+ }
56
+ }, [hideLibrary, showLibrary])
57
+
58
+ if (!ready) {
59
+ return null
60
+ }
61
+ return <MainWindow />
62
+ }
src/api/General.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+
3
+ export const General = {
4
+ metaData() {
5
+ return api.get('meta-data')
6
+ },
7
+ ping(action) {
8
+ return api.post('simple-ping', {
9
+ action,
10
+ })
11
+ },
12
+ }
src/api/Plugins.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+
3
+ export const Plugins = {
4
+ getInstalled() {
5
+ return api.get('plugins')
6
+ },
7
+ installAndActivate(plugins = []) {
8
+ const formData = new FormData()
9
+ formData.append('plugins', JSON.stringify(plugins))
10
+ return api.post('plugins', formData, {
11
+ headers: {
12
+ 'Content-Type': 'multipart/form-data',
13
+ },
14
+ })
15
+ },
16
+ getActivated() {
17
+ return api.get('active-plugins')
18
+ },
19
+ }
src/api/SiteSettings.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+
3
+ export const SiteSettings = {
4
+ getData() {
5
+ return api.get('site-settings')
6
+ },
7
+ setData(data) {
8
+ const formData = new FormData()
9
+ formData.append('data', JSON.stringify(data))
10
+ return api.post('site-settings', formData, {
11
+ headers: {
12
+ 'Content-Type': 'multipart/form-data',
13
+ },
14
+ })
15
+ },
16
+ }
src/api/Taxonomies.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+
3
+ export const Taxonomies = {
4
+ async get() {
5
+ return await api.get('taxonomies')
6
+ },
7
+ }
src/api/Templates.js ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+ import { useUserStore } from '../state/User'
3
+
4
+ let count = 0
5
+
6
+ export const Templates = {
7
+ async get(searchParams, options = {}) {
8
+ count++
9
+ const defaultpageSize = searchParams.type === 'pattern' ? '8' : '4'
10
+ const taxonomyType =
11
+ searchParams.type === 'pattern' ? 'patternType' : 'layoutType'
12
+ const templates = await api.post('templates', {
13
+ filterByFormula: prepareFilterFormula(searchParams, taxonomyType),
14
+ pageSize: options?.pageSize ?? defaultpageSize,
15
+ categories: searchParams.taxonomies,
16
+ search: searchParams.search,
17
+ type: searchParams.type,
18
+ offset: options.offset ?? '',
19
+ initial: count === 1,
20
+ request_count: count,
21
+ sdk_partner: useUserStore.getState()?.sdkPartner ?? '',
22
+ })
23
+ return templates
24
+ },
25
+
26
+ // TODO: Refactor this later to combine the following three
27
+ maybeImport(template) {
28
+ return api.post(`templates/${template.id}`, {
29
+ template_id: template?.id,
30
+ maybe_import: true,
31
+ type: template.fields?.type,
32
+ pageSize: '1',
33
+ template_name: template.fields?.title,
34
+ })
35
+ },
36
+ import(template) {
37
+ return api.post(`templates/${template.id}`, {
38
+ template_id: template.id,
39
+ imported: true,
40
+ basePattern:
41
+ template.fields?.basePattern ??
42
+ template.fields?.baseLayout ??
43
+ '',
44
+ type: template.fields.type,
45
+ pageSize: '1',
46
+ template_name: template.fields?.title,
47
+ })
48
+ },
49
+ }
50
+
51
+ const prepareFilterFormula = ({ taxonomies }, type) => {
52
+ const siteType = taxonomies?.siteType?.slug?.length
53
+ ? taxonomies.siteType.slug
54
+ : 'default'
55
+ const formula = [
56
+ `{type}="${type.replace('Type', '')}"`,
57
+ `{siteType}="${siteType}"`,
58
+ ]
59
+ if (taxonomies[type]?.slug) {
60
+ formula.push(`{${type}}="${taxonomies[type].slug}"`)
61
+ }
62
+ return `AND(${formula.join(', ')})`.replace(/\r?\n|\r/g, '')
63
+ }
src/api/User.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Axios as api } from './axios'
2
+
3
+ export const User = {
4
+ getData() {
5
+ return api.get('user')
6
+ },
7
+ getMeta(key) {
8
+ return api.get('user-meta', {
9
+ params: {
10
+ key,
11
+ },
12
+ })
13
+ },
14
+ authenticate(email, key) {
15
+ const formData = new FormData()
16
+ formData.append('email', email)
17
+ formData.append('key', key)
18
+ return api.post('login', formData, {
19
+ headers: {
20
+ 'Content-Type': 'multipart/form-data',
21
+ },
22
+ })
23
+ },
24
+ register(email) {
25
+ const formData = new FormData()
26
+ formData.append('data', email)
27
+ return api.post('register', formData, {
28
+ headers: {
29
+ 'Content-Type': 'multipart/form-data',
30
+ },
31
+ })
32
+ },
33
+ setData(data) {
34
+ const formData = new FormData()
35
+ formData.append('data', JSON.stringify(data))
36
+ return api.post('user', formData, {
37
+ headers: {
38
+ 'Content-Type': 'multipart/form-data',
39
+ },
40
+ })
41
+ },
42
+ registerMailingList(email) {
43
+ const formData = new FormData()
44
+ formData.append('email', email)
45
+ return api.post('register-mailing-list', formData, {
46
+ headers: {
47
+ 'Content-Type': 'multipart/form-data',
48
+ },
49
+ })
50
+ },
51
+ allowedImports() {
52
+ return api.get('max-free-imports')
53
+ },
54
+ }
src/api/axios.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import axios from 'axios'
2
+ import { useUserStore } from '../state/User'
3
+
4
+ const Axios = axios.create({
5
+ baseURL: window.extendifyData.root,
6
+ headers: {
7
+ 'X-WP-Nonce': window.extendifyData.nonce,
8
+ 'X-Requested-With': 'XMLHttpRequest',
9
+ 'X-Extendify': true,
10
+ },
11
+ })
12
+
13
+ function findResponse(response) {
14
+ return Object.prototype.hasOwnProperty.call(response, 'data')
15
+ ? response.data
16
+ : response
17
+ }
18
+
19
+ function handleErrors(error) {
20
+ if (!error.response) {
21
+ return
22
+ }
23
+ console.error(error.response)
24
+ // TODO: add a global error message system
25
+ return Promise.reject(findResponse(error.response))
26
+ }
27
+
28
+ function addDefaults(request) {
29
+ if (request.data) {
30
+ request.data.remaining_imports = useUserStore
31
+ .getState()
32
+ .remainingImports()
33
+ request.data.entry_point = useUserStore.getState().entryPoint
34
+ request.data.total_imports = useUserStore.getState().imports
35
+ }
36
+ return request
37
+ }
38
+
39
+ function checkDevMode(request) {
40
+ request.headers['X-Extendify-Dev-Mode'] =
41
+ window.location.search.indexOf('DEVMODE') > -1
42
+ request.headers['X-Extendify-Local-Mode'] =
43
+ window.location.search.indexOf('LOCALMODE') > -1
44
+ return request
45
+ }
46
+
47
+ function checkForSoftError(response) {
48
+ if (Object.prototype.hasOwnProperty.call(response, 'soft_error')) {
49
+ window.dispatchEvent(
50
+ new CustomEvent('extendify::softerror-encountered', {
51
+ detail: response.soft_error,
52
+ bubbles: true,
53
+ }),
54
+ )
55
+ }
56
+ return response
57
+ }
58
+
59
+ Axios.interceptors.response.use(
60
+ (response) => checkForSoftError(findResponse(response)),
61
+ (error) => handleErrors(error),
62
+ )
63
+
64
+ // TODO: setup a pipe function instead of this nested pattern
65
+ Axios.interceptors.request.use(
66
+ (request) => checkDevMode(addDefaults(request)),
67
+ (error) => error,
68
+ )
69
+
70
+ export { Axios }
src/app.css ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Adding CSS classes should be done with consideration and rarely */
2
+ @tailwind base;
3
+ @tailwind components;
4
+ @tailwind utilities;
5
+
6
+ .extendify {
7
+ --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/);
8
+ --tw-ring-offset-width: 0px;
9
+ --tw-ring-offset-color: transparent;
10
+ --tw-ring-color: var(--wp-admin-theme-color);
11
+ }
12
+
13
+ .extendify *,
14
+ .extendify *:after,
15
+ .extendify *:before {
16
+ box-sizing: border-box;
17
+ border: 0 solid #e5e7eb;
18
+ }
19
+ .extendify .button-focus {
20
+ @apply focus:ring-wp focus:ring-wp-theme-500 outline-none focus:shadow-none;
21
+ }
22
+ .extendify select.button-focus,
23
+ .extendify input.button-focus {
24
+ @apply focus:border-transparent focus:outline-none focus:shadow-none;
25
+ }
26
+
27
+ .button-extendify-main {
28
+ @apply bg-extendify-main button-focus cursor-pointer transition duration-200 p-1.5 px-3 text-white hover:text-white no-underline hover:bg-extendify-main-dark active:bg-gray-900 active:text-white focus:text-white whitespace-nowrap;
29
+ }
30
+ #extendify-search-input:focus ~ svg,
31
+ #extendify-search-input:not(:placeholder-shown) ~ svg {
32
+ @apply hidden;
33
+ }
34
+ #extendify-search-input::-webkit-textfield-decoration-container {
35
+ @apply mr-3;
36
+ }
37
+
38
+ /* WP tweaks and overrides */
39
+ .extendify .components-panel__body > .components-panel__body-title {
40
+ /* Override WP aggressive boder:none and border:0 */
41
+ border-bottom: 1px solid #e0e0e0 !important;
42
+ @apply bg-transparent;
43
+ }
44
+ .extendify .components-modal__header {
45
+ @apply border-b border-gray-300;
46
+ }
47
+
48
+ /* A shim to ensure live previews w/o iframes display properly */
49
+ .block-editor-block-preview__content
50
+ .block-editor-block-list__layout.is-root-container
51
+ > .ext {
52
+ @apply max-w-none;
53
+ }
54
+
55
+ /* Ensure our patterns display fullwidth on old themes + < 5.9 */
56
+ .block-editor-block-list__layout.is-root-container
57
+ .ext.block-editor-block-list__block {
58
+ @apply max-w-full;
59
+ }
60
+
61
+ .extendify .block-editor-block-preview__container {
62
+ /* no important */
63
+ @apply opacity-0;
64
+ animation: extendifyOpacityIn 200ms cubic-bezier(0.694, 0, 0.335, 1)
65
+ forwards 0ms;
66
+ }
67
+
68
+ /* Remove excess margin for top-level patterns on < 5.9 */
69
+ .extendify .is-root-container > [data-block],
70
+ .extendify .is-root-container > [data-align="full"],
71
+ .extendify .is-root-container > [data-align="full"] > .wp-block {
72
+ @apply my-0 !important;
73
+ }
74
+
75
+ /* Remove excess margin for top-level patterns on 5.9+ */
76
+ .editor-styles-wrapper:not(.block-editor-writing-flow)
77
+ > .is-root-container
78
+ :where(.wp-block)[data-align="full"] {
79
+ @apply my-0 !important;
80
+ }
81
+
82
+ @keyframes extendifyOpacityIn {
83
+ 0% {
84
+ opacity: 0;
85
+ }
86
+ 100% {
87
+ opacity: 1;
88
+ }
89
+ }
90
+
91
+ .extendify .with-light-shadow::after {
92
+ content: "";
93
+ @apply absolute inset-0 border-0 shadow-inner-sm;
94
+ }
95
+ .extendify .with-light-shadow:hover::after {
96
+ @apply shadow-inner-md;
97
+ }
98
+
99
+ /* Style contentType/pageType control in sidebar */
100
+ .components-panel__body.ext-type-control .components-panel__body-toggle {
101
+ @apply pl-0 pr-0;
102
+ }
103
+
104
+ .components-panel__body.ext-type-control .components-panel__body-title {
105
+ @apply m-0 border-b-0 px-5;
106
+ }
107
+
108
+ .components-panel__body.ext-type-control
109
+ .components-panel__body-title
110
+ .components-button {
111
+ @apply m-0 border-b-0 text-extendify-gray py-2 uppercase font-medium text-xss;
112
+ }
113
+
114
+ .components-panel__body.ext-type-control
115
+ .components-button
116
+ .components-panel__arrow {
117
+ @apply right-0 text-extendify-gray;
118
+ }
119
+
120
+ .extendify .animate-pulse {
121
+ animation: extendifyPulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
122
+ }
123
+
124
+ @keyframes extendifyPulse {
125
+ 0%,
126
+ 100% {
127
+ opacity: 1;
128
+ }
129
+ 50% {
130
+ opacity: 0.5;
131
+ }
132
+ }
src/app.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ExtendifyLibrary from './ExtendifyLibrary'
2
+ import { render } from '@wordpress/element'
3
+ import { useWantedTemplateStore } from './state/Importing'
4
+ import { injectTemplateBlocks } from './util/templateInjection'
5
+ import { rawHandler } from '@wordpress/blocks'
6
+ import './buttons'
7
+ import './listeners'
8
+ import './blocks/blocks'
9
+
10
+ window._wpLoadBlockEditor &&
11
+ window.wp.domReady(() => {
12
+ // Insert into the editor (note: Modal opens in a portal)
13
+ const extendify = Object.assign(document.createElement('div'), {
14
+ id: 'extendify-root',
15
+ })
16
+ document.body.append(extendify)
17
+ render(<ExtendifyLibrary />, extendify)
18
+
19
+ // Add an extra div to use for utility modals, etc
20
+ extendify.parentNode.insertBefore(
21
+ Object.assign(document.createElement('div'), {
22
+ id: 'extendify-util',
23
+ }),
24
+ extendify.nextSibling,
25
+ )
26
+
27
+ // Insert a template on page load if it exists in localstorage
28
+ // Note 6/28/21 - this was moved to after the render to possibly
29
+ // fix a bug where imports would go from 3->0.
30
+ if (useWantedTemplateStore.getState().importOnLoad) {
31
+ const template = useWantedTemplateStore.getState().wantedTemplate
32
+ setTimeout(() => {
33
+ injectTemplateBlocks(
34
+ rawHandler({ HTML: template.fields.code }),
35
+ template,
36
+ )
37
+ }, 0)
38
+ }
39
+
40
+ // Reset template state after checking if we need an import
41
+ useWantedTemplateStore.setState({
42
+ importOnLoad: false,
43
+ wantedTemplate: {},
44
+ })
45
+ })
src/blocks/blocks.js ADDED
@@ -0,0 +1 @@
 
1
+ import './library/block.js'
src/blocks/library/block.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __, sprintf } from '@wordpress/i18n'
2
+ import { registerBlockType } from '@wordpress/blocks'
3
+ import { useDispatch } from '@wordpress/data'
4
+ import { useEffect } from '@wordpress/element'
5
+ import { brandBlockIcon } from '../../components/icons'
6
+ import { setModalVisibility } from '../../util/general'
7
+ import metadata from './block.json'
8
+
9
+ export const openModal = (source) => setModalVisibility(source, 'open')
10
+
11
+ registerBlockType(metadata, {
12
+ icon: brandBlockIcon,
13
+ example: {
14
+ attributes: {
15
+ preview: window.extendifyData.asset_path + '/preview.png',
16
+ },
17
+ },
18
+ edit: function Edit({ clientId, attributes }) {
19
+ const { removeBlock } = useDispatch('core/block-editor')
20
+ useEffect(() => {
21
+ if (attributes.preview) {
22
+ return
23
+ }
24
+ openModal('library-block')
25
+ removeBlock(clientId)
26
+ }, [clientId, attributes, removeBlock])
27
+ return (
28
+ <img
29
+ style={{ display: 'block', maxWidth: '100%' }}
30
+ src={attributes.preview}
31
+ alt={sprintf(
32
+ __('%s Pattern Library', 'extendify'),
33
+ 'Extendify',
34
+ )}
35
+ />
36
+ )
37
+ },
38
+ })
src/blocks/library/block.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://schemas.wp.org/trunk/block.json",
3
+ "apiVersion": 2,
4
+ "name": "extendify/library",
5
+ "title": "Pattern Library",
6
+ "category": "design",
7
+ "description": "Add block patterns and full page layouts with the Extendify Library.",
8
+ "keywords": ["pattern", "extendify", "library", "template", "layouts"],
9
+ "textdomain": "extendify",
10
+ "attributes": {
11
+ "preview": {
12
+ "type": "string"
13
+ }
14
+ }
15
+ }
src/buttons.js ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { renderToString, render } from '@wordpress/element'
3
+ import { registerPlugin } from '@wordpress/plugins'
4
+ import { openModal } from './util/general'
5
+ import { PluginSidebarMoreMenuItem } from '@wordpress/edit-post'
6
+ import { Icon } from '@wordpress/icons'
7
+ import { brandMark } from './components/icons/'
8
+ import LibraryAccessModal from './components/LibraryAccessModal'
9
+
10
+ const openLibrary = (event) => {
11
+ openModal(
12
+ event.target.closest('[data-extendify-identifier]')?.dataset
13
+ ?.extendifyIdentifier,
14
+ )
15
+ }
16
+
17
+ // This returns true if the user object is null (Library never opened), or if it's enabled in the user settings
18
+ const isAdmin = () =>
19
+ window.extendifyData.user === null ||
20
+ window.extendifyData?.user?.state?.isAdmin
21
+ const isGlobalLibraryEnabled = () =>
22
+ window.extendifyData.sitesettings === null ||
23
+ window.extendifyData?.sitesettings?.state?.enabled
24
+ const isLibraryEnabled = () =>
25
+ window.extendifyData.user === null
26
+ ? isGlobalLibraryEnabled()
27
+ : window.extendifyData?.user?.state?.enabled
28
+
29
+ const mainButton = (
30
+ <div id="extendify-templates-inserter" className="extendify">
31
+ <button
32
+ style="background:#D9F1EE;color:#1e1e1e;border:1px solid #949494 !important;font-weight:bold;font-size:14px;padding:8px;margin-right:8px"
33
+ type="button"
34
+ data-extendify-identifier="main-button"
35
+ id="extendify-templates-inserter-btn"
36
+ className="components-button">
37
+ <Icon icon={brandMark} size={24} className="-ml-1 mr-1" />
38
+ {__('Library', 'extendify')}
39
+ </button>
40
+ </div>
41
+ )
42
+
43
+ // Add the MAIN button when Gutenberg is available and ready
44
+ if (window._wpLoadBlockEditor) {
45
+ const finish = window.wp.data.subscribe(() => {
46
+ requestAnimationFrame(() => {
47
+ if (!isGlobalLibraryEnabled() && !isAdmin()) {
48
+ return
49
+ }
50
+
51
+ // Redundant extra check added because of a bug where the above check wasn't working
52
+ if (document.getElementById('extendify-templates-inserter-btn')) {
53
+ return
54
+ }
55
+ if (!document.querySelector('.edit-post-header-toolbar')) {
56
+ return
57
+ }
58
+ document
59
+ .querySelector('.edit-post-header-toolbar')
60
+ .insertAdjacentHTML('beforeend', renderToString(mainButton))
61
+ document
62
+ .getElementById('extendify-templates-inserter-btn')
63
+ .addEventListener('click', openLibrary)
64
+ if (!isLibraryEnabled()) {
65
+ document
66
+ .getElementById('extendify-templates-inserter-btn')
67
+ .classList.add('invisible')
68
+ }
69
+ finish()
70
+ })
71
+ })
72
+ }
73
+
74
+ // The CTA button inside patterns
75
+ if (window._wpLoadBlockEditor) {
76
+ const finish = window.wp.data.subscribe(() => {
77
+ requestAnimationFrame(() => {
78
+ // Redundant extra check added because of a bug where the above check wasn't working
79
+ if (!isGlobalLibraryEnabled() && !isAdmin()) {
80
+ return
81
+ }
82
+ if (!document.querySelector('[id$=patterns-view]')) {
83
+ return
84
+ }
85
+ if (document.getElementById('extendify-cta-button')) {
86
+ return
87
+ }
88
+ const ctaButton = (
89
+ <div>
90
+ <button
91
+ id="extendify-cta-button"
92
+ style="margin:1rem 1rem 0;width: calc(100% - 2rem);justify-content: center;"
93
+ data-extendify-identifier="patterns-cta"
94
+ className="components-button is-secondary">
95
+ {__(
96
+ 'Discover patterns in Extendify Library',
97
+ 'extendify',
98
+ )}
99
+ </button>
100
+ </div>
101
+ )
102
+ document
103
+ .querySelector('[id$=patterns-view]')
104
+ .insertAdjacentHTML('afterbegin', renderToString(ctaButton))
105
+ document
106
+ .getElementById('extendify-cta-button')
107
+ .addEventListener('click', openLibrary)
108
+ finish()
109
+ })
110
+ })
111
+ }
112
+
113
+ // This will add a button to enable or disable the library button
114
+ const LibraryEnableDisable = () => {
115
+ function setOpenSiteSettingsModal() {
116
+ const util = document.getElementById('extendify-util')
117
+ render(<LibraryAccessModal />, util)
118
+ }
119
+
120
+ return (
121
+ <>
122
+ <PluginSidebarMoreMenuItem
123
+ onClick={setOpenSiteSettingsModal}
124
+ icon={<Icon icon={brandMark} size={24} />}>
125
+ {' '}
126
+ {__('Extendify', 'extendify')}
127
+ </PluginSidebarMoreMenuItem>
128
+ </>
129
+ )
130
+ }
131
+
132
+ // Load this button always, which is used to enable or disable
133
+ window._wpLoadBlockEditor &&
134
+ registerPlugin('extendify-settings-enable-disable', {
135
+ render: LibraryEnableDisable,
136
+ })
src/components/DevHelpers.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState } from '@wordpress/element'
2
+ import { CopyToClipboard } from 'react-copy-to-clipboard'
3
+ import { __ } from '@wordpress/i18n'
4
+
5
+ /** Overlay for pattern import button */
6
+ export const DevButtonOverlay = ({ template }) => {
7
+ const [idText, setIdText] = useState(template.id)
8
+
9
+ useEffect(() => {
10
+ if (idText === template.id) return
11
+ setTimeout(() => setIdText(template.id), 1000)
12
+ }, [idText, template.id])
13
+
14
+ return (
15
+ <div className="group-hover:opacity-90 opacity-0 flex space-x-2 items-center mb-2 ml-2 absolute bottom-0 left-0 transition duration-200 ease-in-out">
16
+ <CopyToClipboard
17
+ text={template.id}
18
+ onCopy={() => setIdText(__('Copied...', 'extendify'))}>
19
+ <button className="bg-white border border-black p-2 rounded-md shadow-md cursor-pointer">
20
+ {idText}
21
+ </button>
22
+ </CopyToClipboard>
23
+ <a
24
+ target="_blank"
25
+ className="bg-white border font-semibold border-black p-2 rounded-md shadow-md no-underline text-black"
26
+ href={`https://airtable.com/appn5PSl8wU6X70sG/tblviYevlV5fYAEH7/viwh0L1kHmXN7FIB9/${template.id}`}
27
+ rel="noreferrer">
28
+ {__('Edit', 'extendify')}
29
+ </a>
30
+ </div>
31
+ )
32
+ }
src/components/FooterNotice.js ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Icon, closeSmall } from '@wordpress/icons'
3
+ import { Button } from '@wordpress/components'
4
+ import WelcomeNotice from './notices/WelcomeNotice'
5
+ import PromotionNotice from './notices/PromotionNotice'
6
+ import FeedbackNotice from './notices/FeedbackNotice'
7
+ import { useUserStore } from '../state/User'
8
+ import { useGlobalStore } from '../state/GlobalState'
9
+ import { useState, useEffect, useRef } from '@wordpress/element'
10
+
11
+ const NoticesByPriority = {
12
+ welcome: WelcomeNotice,
13
+ promotion: PromotionNotice,
14
+ feedback: FeedbackNotice,
15
+ }
16
+
17
+ export default function FooterNotice() {
18
+ const [hasNotice, setHasNotice] = useState(null)
19
+ const once = useRef(false)
20
+ const promotionData = useGlobalStore(
21
+ (state) => state.metaData?.banners?.footer,
22
+ )
23
+
24
+ const showFeedback = () => {
25
+ const imports = useUserStore.getState().imports ?? 0
26
+ const firstLoadedOn =
27
+ useUserStore.getState()?.firstLoadedOn ?? new Date()
28
+ const timeDifference =
29
+ new Date().getTime() - new Date(firstLoadedOn).getTime()
30
+ const daysSinceActivated = timeDifference / 86_400_000 // 24 hours
31
+
32
+ return imports >= 3 && daysSinceActivated > 3
33
+ }
34
+
35
+ // Find the first notice key to use
36
+ const componentKey =
37
+ Object.keys(NoticesByPriority).find((key) => {
38
+ if (key === 'promotion') {
39
+ return (
40
+ // When checking promotions, use the key sent from the server
41
+ // to check whether it's been dismissed
42
+ promotionData?.key &&
43
+ !useUserStore.getState().noticesDismissedAt[
44
+ promotionData.key
45
+ ]
46
+ )
47
+ }
48
+
49
+ if (key === 'feedback') {
50
+ return (
51
+ showFeedback() &&
52
+ !useUserStore.getState().noticesDismissedAt[key]
53
+ )
54
+ }
55
+
56
+ return !useUserStore.getState().noticesDismissedAt[key]
57
+ }) ?? null
58
+ const Notice = NoticesByPriority[componentKey]
59
+
60
+ const dismiss = () => {
61
+ setHasNotice(false)
62
+ // The noticesDismissedAt key will either be the key from NoticesByPriority,
63
+ // or a key passed in from the server, such as 'holiday-sale2077'
64
+ const key =
65
+ componentKey === 'promotion' ? promotionData.key : componentKey
66
+ useUserStore.setState({
67
+ noticesDismissedAt: Object.assign(
68
+ {},
69
+ {
70
+ ...useUserStore.getState().noticesDismissedAt,
71
+ [key]: new Date().toISOString(),
72
+ },
73
+ ),
74
+ })
75
+ }
76
+
77
+ useEffect(() => {
78
+ // Only show the notice once on main render and only if a notice exists.
79
+ if (NoticesByPriority[componentKey] && !once.current) {
80
+ setHasNotice(true)
81
+ once.current = true
82
+ }
83
+ }, [componentKey])
84
+
85
+ if (!hasNotice) {
86
+ return null
87
+ }
88
+ return (
89
+ <div className="bg-extendify-secondary hidden lg:flex space-x-4 py-3 px-5 justify-center items-center relative max-w-screen-4xl mx-auto">
90
+ {/* Pass all data to all components and let them decide what they use */}
91
+ <Notice promotionData={promotionData} />
92
+ <div className="absolute right-1">
93
+ <Button
94
+ className="opacity-50 hover:opacity-100 focus:opacity-100 text-extendify-black"
95
+ icon={<Icon icon={closeSmall} />}
96
+ label={__('Dismiss this notice', 'extendify')}
97
+ onClick={dismiss}
98
+ showTooltip={false}
99
+ />
100
+ </div>
101
+ </div>
102
+ )
103
+ }
src/components/ImportCounter.js ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import classnames from 'classnames'
2
+ import { Icon } from '@wordpress/icons'
3
+ import { __, sprintf } from '@wordpress/i18n'
4
+ import { useEffect } from '@wordpress/element'
5
+ import { alert } from './icons/'
6
+ import { download } from './icons/'
7
+ import { useUserStore } from '../state/User'
8
+ import { User as UserApi } from '../api/User'
9
+
10
+ export const ImportCounter = () => {
11
+ const remainingImports = useUserStore((state) => state.remainingImports)
12
+ const allowedImports = useUserStore((state) => state.allowedImports)
13
+ const status = remainingImports() > 0 ? 'has-imports' : 'no-imports'
14
+ const backgroundColor =
15
+ status === 'has-imports'
16
+ ? 'bg-extendify-main hover:bg-extendify-main-dark'
17
+ : 'bg-extendify-alert'
18
+ const icon = status === 'has-imports' ? download : alert
19
+
20
+ useEffect(() => {
21
+ if (!allowedImports) {
22
+ UserApi.allowedImports().finally((allowedImports) => {
23
+ // If something goes wrong and this isn't a number, then default to 5
24
+ allowedImports = /^[1-9]\d*$/.test(allowedImports)
25
+ ? allowedImports
26
+ : '5'
27
+ useUserStore.setState({ allowedImports })
28
+ })
29
+ }
30
+ }, [allowedImports])
31
+
32
+ if (!allowedImports) {
33
+ return null
34
+ }
35
+
36
+ return (
37
+ <a
38
+ target="_blank"
39
+ rel="noreferrer"
40
+ className={classnames(
41
+ backgroundColor,
42
+ 'hidden sm:flex w-full no-underline button-focus text-sm justify-between py-3 px-4 text-white rounded',
43
+ )}
44
+ href={`https://www.extendify.com/pricing/?utm_source=${encodeURIComponent(
45
+ window.extendifyData.sdk_partner,
46
+ )}&utm_medium=library&utm_campaign=import-counter&utm_content=upgrade&utm_term=${status}`}>
47
+ <div className="flex items-center space-x-2 no-underline">
48
+ <Icon icon={icon} size={14} />
49
+ <span>
50
+ {sprintf(
51
+ __('%s/%s Imports', 'extendify'),
52
+ remainingImports(),
53
+ Number(allowedImports),
54
+ )}
55
+ </span>
56
+ </div>
57
+ <span className="text-white no-underline font-medium outline-none">
58
+ {__('Upgrade', 'extendify')}
59
+ </span>
60
+ </a>
61
+ )
62
+ }
src/components/ImportTemplateBlock.js ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState, useRef, memo } from '@wordpress/element'
2
+ import { __, sprintf } from '@wordpress/i18n'
3
+ import { BlockPreview } from '@wordpress/block-editor'
4
+ import { rawHandler } from '@wordpress/blocks'
5
+ import { Icon } from '@wordpress/icons'
6
+ import { Button } from '@wordpress/components'
7
+ import { useInView } from 'react-intersection-observer'
8
+ import {
9
+ growthArrow,
10
+ patterns,
11
+ layouts,
12
+ support,
13
+ star,
14
+ brandLogo,
15
+ } from '../components/icons/'
16
+ import { AuthorizationCheck, Middleware } from '../middleware'
17
+ import { injectTemplateBlocks } from '../util/templateInjection'
18
+ import { useUserStore } from '../state/User'
19
+ import { useGlobalStore } from '../state/GlobalState'
20
+ import { Templates as TemplatesApi } from '../api/Templates'
21
+ import Primary from './buttons/Primary'
22
+ import SplitModal from './modals/SplitModal'
23
+ import SettingsModal from './modals/SettingsModal'
24
+ import { useIsDevMode } from '../hooks/helpers'
25
+ import { DevButtonOverlay } from './DevHelpers'
26
+
27
+ const LiveBlocksMemoized = memo(
28
+ ({ blocks }) => {
29
+ return (
30
+ <div className="with-light-shadow relative">
31
+ <BlockPreview
32
+ blocks={blocks}
33
+ live={false}
34
+ viewportWidth={1400}
35
+ />
36
+ </div>
37
+ )
38
+ },
39
+ (oldBlocks, newBlocks) => oldBlocks.clientId == newBlocks.clientId,
40
+ )
41
+ const canImportMiddleware = Middleware([
42
+ 'NeedsRegistrationModal',
43
+ 'hasRequiredPlugins',
44
+ 'hasPluginsActivated',
45
+ ])
46
+
47
+ // TODO: extract this modal
48
+ const NoImportModal = (
49
+ <SplitModal
50
+ isOpen={true}
51
+ onRequestClose={() => useGlobalStore.setState({ currentModal: null })}
52
+ left={
53
+ <>
54
+ <div className="flex space-x-2 items-center justify-center mb-10 text-extendify-black">
55
+ {brandLogo}
56
+ </div>
57
+
58
+ <h3 className="text-xl md:leading-3">
59
+ {__("You're out of imports", 'extendify')}
60
+ </h3>
61
+ <p className="text-sm text-black">
62
+ {__(
63
+ 'Sign up today and get unlimited access to our entire collection of patterns and page layouts.',
64
+ 'extendify',
65
+ )}
66
+ </p>
67
+ <div>
68
+ <Primary
69
+ tagName="a"
70
+ target="_blank"
71
+ className="m-auto mt-10 py-3"
72
+ href={`https://extendify.com/pricing/?utm_source=${window.extendifyData.sdk_partner}&utm_medium=library&utm_campaign=no-imports-modal&utm_content=get-unlimited-imports`}
73
+ rel="noreferrer">
74
+ {__('Get Unlimited Imports', 'extendify')}
75
+ <Icon
76
+ icon={growthArrow}
77
+ size={24}
78
+ className="-ml-1 mr-1"
79
+ />
80
+ </Primary>
81
+ <p className="text-sm text-extendify-gray mb-0">
82
+ {__('Have an account?', 'extendify')}
83
+ <Button
84
+ onClick={() => {
85
+ useGlobalStore.setState({
86
+ currentModal: (
87
+ <SettingsModal
88
+ isOpen={true}
89
+ onClose={() =>
90
+ useGlobalStore.setState({
91
+ currentModal: null,
92
+ })
93
+ }
94
+ />
95
+ ),
96
+ })
97
+ }}
98
+ className="underline hover:no-underline text-sm text-extendify-gray pl-2">
99
+ {__('Sign in', 'extendify')}
100
+ </Button>
101
+ </p>
102
+ </div>
103
+ </>
104
+ }
105
+ right={
106
+ <div className="space-y-2">
107
+ <div className="flex items-center space-x-2">
108
+ <Icon icon={patterns} size={24} className="-ml-1 mr-1" />
109
+ <span className="text-sm leading-none">
110
+ {__("Access to 100's of Patterns", 'extendify')}
111
+ </span>
112
+ </div>
113
+ <div className="flex items-center space-x-2">
114
+ <Icon icon={layouts} size={24} className="-ml-1 mr-1" />
115
+ <span className="text-sm leading-none">
116
+ {__('Beautiful full page layouts', 'extendify')}
117
+ </span>
118
+ </div>
119
+ <div className="flex items-center space-x-2">
120
+ <Icon icon={support} size={24} className="-ml-1 mr-1" />
121
+ <span className="text-sm leading-none">
122
+ {__('Fast and friendly support', 'extendify')}
123
+ </span>
124
+ </div>
125
+ <div className="flex items-center space-x-2">
126
+ <Icon icon={star} size={24} className="-ml-1 mr-1" />
127
+ <span className="text-sm leading-none">
128
+ {__('14-Day guarantee', 'extendify')}
129
+ </span>
130
+ </div>
131
+ </div>
132
+ }
133
+ />
134
+ )
135
+
136
+ export function ImportTemplateBlock({ template }) {
137
+ const importButtonRef = useRef(null)
138
+ const once = useRef(false)
139
+ const canImport = useUserStore((state) => state.canImport)
140
+ const setOpen = useGlobalStore((state) => state.setOpen)
141
+ const setCurrentModal = useGlobalStore((state) => state.setCurrentModal)
142
+ const blocks = rawHandler({ HTML: template.fields.code })
143
+ const [hasBeenSeen, setHasBeenSeen] = useState(false)
144
+ const [loaded, setLoaded] = useState(false)
145
+ const [onlyLoadInView, inView] = useInView()
146
+ const devMode = useIsDevMode()
147
+
148
+ const focusTrapInnerBlocks = () => {
149
+ if (once.current) return
150
+ once.current = true
151
+ Array.from(
152
+ importButtonRef.current.querySelectorAll(
153
+ 'a, button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])',
154
+ ),
155
+ ).forEach((el) => el.setAttribute('tabIndex', '-1'))
156
+ }
157
+
158
+ const importTemplates = async () => {
159
+ await canImportMiddleware.check(template)
160
+ AuthorizationCheck(canImportMiddleware)
161
+ .then(() => {
162
+ setTimeout(() => {
163
+ injectTemplateBlocks(blocks, template)
164
+ .then(() => setCurrentModal(null))
165
+ .then(() => setOpen(false))
166
+ .then(() => canImportMiddleware.reset())
167
+ }, 100)
168
+ })
169
+ .catch(() => {})
170
+ }
171
+
172
+ const handleKeyDown = (event) => {
173
+ if (['Enter', 'Space', ' '].includes(event.key)) {
174
+ event.stopPropagation()
175
+ event.preventDefault()
176
+ importTemplate()
177
+ }
178
+ }
179
+
180
+ const importTemplate = () => {
181
+ if (!canImport()) {
182
+ setCurrentModal(NoImportModal)
183
+ return
184
+ }
185
+ TemplatesApi.maybeImport(template)
186
+ importTemplates()
187
+ }
188
+
189
+ // Trigger resize event on the live previews to add
190
+ // Grammerly/Loom/etc compatability
191
+ // TODO: This can probably be removed after WP 5.9
192
+ useEffect(() => {
193
+ const rafIds = []
194
+ let rafId1, rafId2, rafId3
195
+ rafId1 = window.requestAnimationFrame(() => {
196
+ rafId2 = window.requestAnimationFrame(() => {
197
+ importButtonRef.current
198
+ .querySelectorAll('iframe')
199
+ .forEach((frame) => {
200
+ const rafId = window.requestAnimationFrame(() => {
201
+ frame.contentWindow.dispatchEvent(
202
+ new Event('resize'),
203
+ )
204
+ })
205
+ rafIds.push(rafId)
206
+ })
207
+ rafId3 = window.requestAnimationFrame(() => {
208
+ window.dispatchEvent(new Event('resize'))
209
+ setLoaded(true)
210
+ })
211
+ })
212
+ })
213
+ return () =>
214
+ [...rafIds, rafId1, rafId2, rafId3].forEach((id) =>
215
+ window.cancelAnimationFrame(id),
216
+ )
217
+ }, [])
218
+
219
+ useEffect(() => {
220
+ if (!hasBeenSeen && inView) {
221
+ setHasBeenSeen(true)
222
+ }
223
+ }, [inView, hasBeenSeen, template])
224
+
225
+ return (
226
+ <div className="relative group">
227
+ <div
228
+ role="button"
229
+ tabIndex="0"
230
+ ref={importButtonRef}
231
+ aria-label={sprintf(
232
+ __('Press to import %s', 'extendify'),
233
+ template?.fields?.type,
234
+ )}
235
+ className="mb-6 md:mb-8 cursor-pointer button-focus"
236
+ onFocus={focusTrapInnerBlocks}
237
+ onClick={importTemplate}
238
+ onKeyDown={handleKeyDown}>
239
+ <div
240
+ ref={onlyLoadInView}
241
+ className="invisible absolute inset-0 pointer-events-none"></div>
242
+ {hasBeenSeen && <LiveBlocksMemoized blocks={blocks} />}
243
+ </div>
244
+ {/* Show dev info after the preview is loaded to trigger observer */}
245
+ {devMode && loaded && <DevButtonOverlay template={template} />}
246
+ </div>
247
+ )
248
+ }
src/components/LibraryAccessModal.js ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Modal } from '@wordpress/components'
2
+ import { unmountComponentAtNode, useState, useEffect } from '@wordpress/element'
3
+ import { ToggleControl } from '@wordpress/components'
4
+ import { __ } from '@wordpress/i18n'
5
+ import { useSelect } from '@wordpress/data'
6
+
7
+ import { useUserStore } from '../state/User'
8
+ import { useSiteSettingsStore } from '../state/SiteSettings'
9
+
10
+ const LibraryAccessModal = () => {
11
+ const isAdmin = useSelect((select) =>
12
+ select('core').canUser('create', 'users'),
13
+ )
14
+
15
+ const [libraryforMyself, setLibraryforMyself] = useState(
16
+ useUserStore((store) => store.enabled),
17
+ )
18
+ const [libraryforEveryone, setLibraryforEveryone] = useState(
19
+ useSiteSettingsStore((store) => store.enabled),
20
+ )
21
+
22
+ const closeModal = () => {
23
+ const util = document.getElementById('extendify-util')
24
+ unmountComponentAtNode(util)
25
+ }
26
+
27
+ useEffect(() => {
28
+ hideButton(!libraryforMyself)
29
+ }, [libraryforMyself])
30
+
31
+ function hideButton(state = true) {
32
+ const button = document.getElementById(
33
+ 'extendify-templates-inserter-btn',
34
+ )
35
+ if (!button) return
36
+ if (state) {
37
+ button.classList.add('invisible')
38
+ } else {
39
+ button.classList.remove('invisible')
40
+ }
41
+ }
42
+
43
+ async function saveUser(value) {
44
+ await useUserStore.setState({ enabled: value })
45
+ }
46
+
47
+ async function saveSetting(value) {
48
+ await useSiteSettingsStore.setState({ enabled: value })
49
+ }
50
+
51
+ async function saveToggle(state, type) {
52
+ if (type === 'global') {
53
+ await saveSetting(state)
54
+ } else {
55
+ await saveUser(state)
56
+ }
57
+ }
58
+
59
+ function handleToggle(type) {
60
+ if (type === 'global') {
61
+ setLibraryforEveryone((state) => {
62
+ saveToggle(!state, type)
63
+ return !state
64
+ })
65
+ } else {
66
+ setLibraryforMyself((state) => {
67
+ hideButton(!state)
68
+ saveToggle(!state, type)
69
+ return !state
70
+ })
71
+ }
72
+ }
73
+
74
+ return (
75
+ <Modal
76
+ title={__('Extendify Settings', 'extendify')}
77
+ onRequestClose={closeModal}>
78
+ <ToggleControl
79
+ label={
80
+ isAdmin
81
+ ? __('Enable the library for myself', 'extendify')
82
+ : __('Enable the library', 'extendify')
83
+ }
84
+ help={__(
85
+ 'Publish with hundreds of patterns & page layouts',
86
+ 'extendify',
87
+ )}
88
+ checked={libraryforMyself}
89
+ onChange={() => handleToggle('user')}
90
+ />
91
+
92
+ {isAdmin && (
93
+ <>
94
+ <br />
95
+ <ToggleControl
96
+ label={__(
97
+ 'Allow all users to publish with the library',
98
+ )}
99
+ help={__(
100
+ 'Everyone publishes with patterns & page layouts',
101
+ 'extendify',
102
+ )}
103
+ checked={libraryforEveryone}
104
+ onChange={() => handleToggle('global')}
105
+ />
106
+ </>
107
+ )}
108
+ </Modal>
109
+ )
110
+ }
111
+
112
+ export default LibraryAccessModal
src/components/LoginInterface.js ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useUserStore } from '../state/User'
2
+ import { useState, useEffect, useRef } from '@wordpress/element'
3
+ import { User as UserApi } from '../api/User'
4
+ import { __ } from '@wordpress/i18n'
5
+ import classNames from 'classnames'
6
+ import { Spinner, Button } from '@wordpress/components'
7
+
8
+ import { Icon } from '@wordpress/icons'
9
+ import { user } from './icons/'
10
+ import { success as successIcon } from './icons/'
11
+ import { useIsDevMode } from '../hooks/helpers'
12
+
13
+ export default function LoginInterface({ actionCallback, initialFocus }) {
14
+ const loggedIn = useUserStore((state) => state.apiKey.length)
15
+ const [email, setEmail] = useState('')
16
+ const [apiKey, setApiKey] = useState('')
17
+ const [feedback, setFeedback] = useState('')
18
+ const [feedbackType, setFeedbackType] = useState('info')
19
+ const [isWorking, setIsWorking] = useState(false)
20
+ const [success, setSuccess] = useState(false)
21
+ const viewPatternsButtonRef = useRef(null)
22
+ const licenseKeyRef = useRef(null)
23
+ const devMode = useIsDevMode()
24
+
25
+ useEffect(() => {
26
+ setEmail(useUserStore.getState().email)
27
+ // This will reset the default error state to info
28
+ return () => setFeedbackType('info')
29
+ }, [])
30
+
31
+ useEffect(() => {
32
+ success && viewPatternsButtonRef?.current?.focus()
33
+ }, [success])
34
+
35
+ const logout = () => {
36
+ setApiKey('')
37
+ useUserStore.setState({ apiKey: '' })
38
+ setTimeout(() => {
39
+ licenseKeyRef?.current?.focus()
40
+ }, 0)
41
+ }
42
+
43
+ const confirmKey = async (event) => {
44
+ event.preventDefault()
45
+ setIsWorking(true)
46
+ setFeedback('')
47
+ const { token, error, exception, message } = await UserApi.authenticate(
48
+ email,
49
+ apiKey,
50
+ )
51
+
52
+ if (typeof message !== 'undefined') {
53
+ setFeedbackType('error')
54
+ setIsWorking(false)
55
+ setFeedback(
56
+ message.length
57
+ ? message
58
+ : 'Error: Are you interacting with the wrong server?',
59
+ )
60
+ return
61
+ }
62
+
63
+ if (error || exception) {
64
+ setFeedbackType('error')
65
+ setIsWorking(false)
66
+ setFeedback(error.length ? error : exception)
67
+ return
68
+ }
69
+
70
+ if (!token || typeof token !== 'string') {
71
+ setFeedbackType('error')
72
+ setIsWorking(false)
73
+ setFeedback(__('Something went wrong', 'extendify'))
74
+ return
75
+ }
76
+
77
+ setFeedbackType('success')
78
+ setFeedback('Success!')
79
+ setSuccess(true)
80
+ setIsWorking(false)
81
+ useUserStore.setState({
82
+ email: email,
83
+ apiKey: token,
84
+ })
85
+ }
86
+
87
+ if (success) {
88
+ return (
89
+ <section className="w-80 space-y-8 text-center pt-2 pb-4">
90
+ <Icon icon={successIcon} size={148} />
91
+ <p className="text-lg text-extendify-black text-center leading-extra-tight font-semibold">
92
+ {__("You've signed in to Extendify", 'extendify')}
93
+ </p>
94
+ <Button
95
+ ref={viewPatternsButtonRef}
96
+ className="px-4 p-2 cursor-pointer text-center rounded bg-extendify-main text-white"
97
+ onClick={actionCallback}>
98
+ {__('View patterns', 'extendify')}
99
+ </Button>
100
+ </section>
101
+ )
102
+ }
103
+
104
+ if (loggedIn) {
105
+ return (
106
+ <section className="space-y-8 w-full pb-2">
107
+ <p className="text-base text-extendify-black leading-extra-tight">
108
+ {__('Account', 'extendify')}
109
+ </p>
110
+ <div className="flex justify-between items-center">
111
+ <div className="flex items-center space-x-2 -ml-2">
112
+ <Icon icon={user} size={48} />
113
+ <p className="text-extendify-black">
114
+ {email?.length
115
+ ? email
116
+ : __('Logged In', 'extendify')}
117
+ </p>
118
+ </div>
119
+ {devMode && (
120
+ <Button
121
+ className="px-4 py-3 cursor-pointer text-center rounded bg-extendify-main hover:bg-extendify-main-dark text-white"
122
+ onClick={logout}>
123
+ {__('Sign out', 'extendify')}
124
+ </Button>
125
+ )}
126
+ </div>
127
+ </section>
128
+ )
129
+ }
130
+
131
+ return (
132
+ <section className="w-80 text-left space-y-8 pb-6">
133
+ <div>
134
+ <p className="text-lg text-extendify-black text-center leading-extra-tight font-semibold">
135
+ {__('Sign in to Extendify', 'extendify')}
136
+ </p>
137
+ <p className="text-sm text-extendify-gray text-center space-x-1 leading-extra-tight">
138
+ <span>{__("Don't have an account?", 'extendify')}</span>
139
+ <a
140
+ href={`https://extendify.com/pricing?utm_source=${window.extendifyData.sdk_partner}&utm_medium=library&utm_campaign=sign-in-form&utm_content=sign-up`}
141
+ target="_blank"
142
+ className="underline hover:no-underline text-extendify-gray"
143
+ rel="noreferrer">
144
+ {__('Sign up', 'extendify')}
145
+ </a>
146
+ </p>
147
+ </div>
148
+ <form onSubmit={confirmKey} className="space-y-2">
149
+ <div className="flex items-center">
150
+ <label className="sr-only" htmlFor="extendify-login-email">
151
+ {__('Email address', 'extendify')}
152
+ </label>
153
+ <input
154
+ ref={initialFocus}
155
+ id="extendify-login-email"
156
+ name="extendify-login-email"
157
+ type="email"
158
+ className="border-2 p-2 w-full rounded"
159
+ placeholder={__('Email address', 'extendify')}
160
+ value={email.length ? email : ''}
161
+ onChange={(event) => setEmail(event.target.value)}
162
+ />
163
+ </div>
164
+ <div className="flex items-center">
165
+ <label
166
+ className="sr-only"
167
+ htmlFor="extendify-login-license">
168
+ {__('License key', 'extendify')}
169
+ </label>
170
+ <input
171
+ ref={licenseKeyRef}
172
+ id="extendify-login-license"
173
+ name="extendify-login-license"
174
+ type="text"
175
+ className="border-2 p-2 w-full rounded"
176
+ placeholder={__('License key', 'extendify')}
177
+ value={apiKey}
178
+ onChange={(event) => setApiKey(event.target.value)}
179
+ />
180
+ </div>
181
+ <div className="pt-2 flex justify-center">
182
+ <button
183
+ type="submit"
184
+ className="relative p-2 py-3 w-72 max-w-full flex justify-center cursor-pointer text-center rounded bg-extendify-main hover:bg-extendify-main-dark text-base text-white ">
185
+ <span>{__('Sign In', 'extendify')}</span>
186
+ {isWorking && (
187
+ <div className="absolute right-2.5">
188
+ <Spinner />
189
+ </div>
190
+ )}
191
+ </button>
192
+ </div>
193
+ {feedback && (
194
+ <div
195
+ className={classNames({
196
+ 'border-gray-900 text-gray-900':
197
+ feedbackType === 'info',
198
+ 'border-wp-alert-red text-wp-alert-red':
199
+ feedbackType === 'error',
200
+ 'border-extendify-main text-extendify-main':
201
+ feedbackType === 'success',
202
+ })}>
203
+ {feedback}
204
+ </div>
205
+ )}
206
+ <div className="text-center pt-4">
207
+ <a
208
+ target="_blank"
209
+ rel="noreferrer"
210
+ href={`https://extendify.com/guides/sign-in?utm_source=${window.extendifyData.sdk_partner}&utm_medium=library&utm_campaign=sign-in-form&utm_content=need-help`}
211
+ className="underline hover:no-underline text-sm text-extendify-gray">
212
+ {__('Need Help?', 'extendify')}
213
+ </a>
214
+ </div>
215
+ </form>
216
+ </section>
217
+ )
218
+ }
src/components/SiteTypeSelector.js ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState, useRef, useMemo } from '@wordpress/element'
2
+ import { __ } from '@wordpress/i18n'
3
+ import classNames from 'classnames'
4
+ import Fuse from 'fuse.js'
5
+ import { useTemplatesStore } from '../state/Templates'
6
+ import { useUserStore } from '../state/User'
7
+
8
+ const searchMemo = new Map()
9
+
10
+ export default function SiteTypeSelector({ value, setValue, terms }) {
11
+ const preferredOptionsHistory = useUserStore(
12
+ (state) =>
13
+ state.preferredOptionsHistory?.siteType?.filter((t) => t.slug) ??
14
+ {},
15
+ )
16
+ const searchParams = useTemplatesStore((state) => state.searchParams)
17
+ const [expanded, setExpanded] = useState(false)
18
+ const searchRef = useRef()
19
+ const [fuzzy, setFuzzy] = useState({})
20
+ const [tempValue, setTempValue] = useState('')
21
+ const [visibleChoices, setVisibleChoices] = useState([])
22
+
23
+ const examples = useMemo(() => {
24
+ return terms
25
+ .filter((t) => t?.featured)
26
+ .sort((a, b) => {
27
+ if (a.slug < b.slug) return -1
28
+ if (a.slug > b.slug) return 1
29
+ return 0
30
+ })
31
+ }, [terms])
32
+
33
+ const updateSearch = (term) => {
34
+ setTempValue(term)
35
+ filter(term)
36
+ }
37
+
38
+ const filter = (term = '') => {
39
+ if (searchMemo.has(term)) {
40
+ setVisibleChoices(searchMemo.get(term))
41
+ return
42
+ }
43
+ const results = fuzzy.search(term)
44
+ searchMemo.set(
45
+ term,
46
+ results?.length ? results.map((t) => t.item) : examples,
47
+ )
48
+ setVisibleChoices(searchMemo.get(term))
49
+ }
50
+
51
+ const showRecent = () =>
52
+ visibleChoices === examples &&
53
+ Object.keys(preferredOptionsHistory).length > 0
54
+ const unknown = value.slug === 'unknown' || !value?.slug
55
+
56
+ useEffect(() => {
57
+ setFuzzy(
58
+ new Fuse(terms, {
59
+ keys: ['slug', 'title', 'keywords'],
60
+ minMatchCharLength: 2,
61
+ threshold: 0.3,
62
+ }),
63
+ )
64
+ }, [terms])
65
+
66
+ useEffect(() => {
67
+ if (!tempValue.length) setVisibleChoices(examples)
68
+ }, [examples, tempValue])
69
+
70
+ useEffect(() => {
71
+ expanded && searchRef.current.focus()
72
+ }, [expanded])
73
+
74
+ const contentHeader = (description) => {
75
+ return (
76
+ <>
77
+ <span className="flex flex-col text-left">
78
+ <span className="text-sm mb-1">
79
+ {__('Site Type', 'extendify')}
80
+ </span>
81
+ <span className="font-light text-xs">{description}</span>
82
+ </span>
83
+ <span className="flex items-center space-x-4">
84
+ {unknown && !expanded && (
85
+ <svg
86
+ className="text-wp-alert-red"
87
+ aria-hidden="true"
88
+ focusable="false"
89
+ width="21"
90
+ height="21"
91
+ viewBox="0 0 21 21"
92
+ fill="none"
93
+ xmlns="http://www.w3.org/2000/svg">
94
+ <path
95
+ className="stroke-current"
96
+ d="M10.9982 4.05371C7.66149 4.05371 4.95654 6.75866 4.95654 10.0954C4.95654 13.4321 7.66149 16.137 10.9982 16.137C14.3349 16.137 17.0399 13.4321 17.0399 10.0954C17.0399 6.75866 14.3349 4.05371 10.9982 4.05371V4.05371Z"
97
+ strokeWidth="1.25"
98
+ />
99
+ <path
100
+ className="fill-current"
101
+ d="M10.0205 12.8717C10.0205 12.3287 10.4508 11.8881 10.9938 11.8881C11.5368 11.8881 11.9774 12.3287 11.9774 12.8717C11.9774 13.4147 11.5368 13.8451 10.9938 13.8451C10.4508 13.8451 10.0205 13.4147 10.0205 12.8717Z"
102
+ />
103
+ <path
104
+ className="fill-current"
105
+ d="M11.6495 10.2591C11.6086 10.6177 11.3524 10.9148 10.9938 10.9148C10.625 10.9148 10.3791 10.6074 10.3483 10.2591L10.0205 7.31855C9.95901 6.81652 10.4918 6.34521 10.9938 6.34521C11.4959 6.34521 12.0286 6.81652 11.9774 7.31855L11.6495 10.2591Z"
106
+ />
107
+ </svg>
108
+ )}
109
+ <svg
110
+ className={classNames('text-gray-700 stroke-current', {
111
+ 'transform rotate-90 -translate-x-1': expanded,
112
+ })}
113
+ aria-hidden="true"
114
+ focusable="false"
115
+ width="8"
116
+ height="13"
117
+ viewBox="0 0 8 13"
118
+ fill="none"
119
+ xmlns="http://www.w3.org/2000/svg">
120
+ <path
121
+ d="M1.24194 11.5952L6.24194 6.09519L1.24194 0.595215"
122
+ strokeWidth="1.5"
123
+ />
124
+ </svg>
125
+ </span>
126
+ </>
127
+ )
128
+ }
129
+
130
+ const choicesList = (choices, title = __('Suggestions', 'extendify')) => {
131
+ if (choices === examples) {
132
+ title = __('Examples', 'extendify')
133
+ }
134
+ return (
135
+ <>
136
+ <h4 className="mt-4 mb-2 text-left uppercase text-xss text-gray-700 font-medium">
137
+ {title}
138
+ </h4>
139
+ <ul className="m-0">
140
+ {choices.map((item) => {
141
+ const label = item?.title ?? item.slug
142
+ const current =
143
+ searchParams?.taxonomies?.siteType?.slug ===
144
+ item.slug
145
+ return (
146
+ <li
147
+ key={item.slug + item?.title}
148
+ className="m-0 mb-1">
149
+ <button
150
+ type="button"
151
+ className={classNames(
152
+ 'w-full text-left text-sm bg-transparent hover:text-wp-theme-500 m-0 pl-0 cursor-pointer',
153
+ { 'text-gray-800': !current },
154
+ )}
155
+ onClick={() => {
156
+ setExpanded(false)
157
+ setValue(item)
158
+ }}>
159
+ {label}
160
+ </button>
161
+ </li>
162
+ )
163
+ })}
164
+ </ul>
165
+ </>
166
+ )
167
+ }
168
+
169
+ return (
170
+ <div className="w-full bg-extendify-transparent-black rounded">
171
+ <button
172
+ type="button"
173
+ onClick={() => setExpanded((expanded) => !expanded)}
174
+ className="flex items-center justify-between text-gray-800 button-focus w-full p-4 m-0 cursor-pointer bg-transparent hover:bg-extendify-transparent-black-100 rounded">
175
+ {contentHeader(
176
+ expanded
177
+ ? __('What kind of site is this?', 'extendify')
178
+ : value?.title ?? value.slug ?? 'Unknown',
179
+ )}
180
+ </button>
181
+ {expanded && (
182
+ <div className="p-4 pt-0 overflow-y-auto max-h-96">
183
+ <div className="relative my-2">
184
+ <label htmlFor="site-type-search" className="sr-only">
185
+ {__('Search', 'extendify')}
186
+ </label>
187
+ <input
188
+ ref={searchRef}
189
+ id="site-type-search"
190
+ value={tempValue ?? ''}
191
+ onChange={(event) =>
192
+ updateSearch(event.target.value)
193
+ }
194
+ type="text"
195
+ className="button-focus bg-white border-0 m-0 p-3.5 py-2.5 rounded text-sm w-full"
196
+ placeholder={__('Search', 'extendify')}
197
+ />
198
+ <svg
199
+ className="absolute top-2 right-2 hidden lg:block pointer-events-none"
200
+ xmlns="http://www.w3.org/2000/svg"
201
+ viewBox="0 0 24 24"
202
+ width="24"
203
+ height="24"
204
+ role="img"
205
+ aria-hidden="true"
206
+ focusable="false">
207
+ <path d="M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"></path>
208
+ </svg>
209
+ </div>
210
+ {tempValue.length > 1 && visibleChoices === examples && (
211
+ <p className="text-left">
212
+ {__('Nothing found...', 'extendify')}
213
+ </p>
214
+ )}
215
+ {showRecent() && (
216
+ <div className="mb-8">
217
+ {choicesList(
218
+ preferredOptionsHistory,
219
+ __('Recent', 'extendify'),
220
+ )}
221
+ </div>
222
+ )}
223
+ {visibleChoices.length > 0 && (
224
+ <div>{choicesList(visibleChoices)}</div>
225
+ )}
226
+ {unknown ? null : (
227
+ <button
228
+ type="button"
229
+ className="mt-4 w-full text-left text-sm bg-transparent hover:text-wp-theme-500 pl-0 cursor-pointer text-wp-theme-500"
230
+ onClick={() => {
231
+ setExpanded(false)
232
+ setValue('Unknown')
233
+ }}>
234
+ {__('Reset', 'extendify')}
235
+ </button>
236
+ )}
237
+ </div>
238
+ )}
239
+ </div>
240
+ )
241
+ }
src/components/TaxonomySection.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { PanelBody, PanelRow } from '@wordpress/components'
2
+ import classNames from 'classnames'
3
+ import { useTemplatesStore } from '../state/Templates'
4
+ import { getTaxonomyName } from '../util/general'
5
+
6
+ export default function TaxonomySection({ taxType, taxonomies }) {
7
+ const updateTaxonomies = useTemplatesStore(
8
+ (state) => state.updateTaxonomies,
9
+ )
10
+ const searchParams = useTemplatesStore((state) => state.searchParams)
11
+
12
+ if (!taxonomies?.length > 0) return null
13
+ return (
14
+ <PanelBody
15
+ title={getTaxonomyName(taxType)}
16
+ className="ext-type-control p-0"
17
+ initialOpen={true}>
18
+ <PanelRow>
19
+ <div className="overflow-hidden w-full relative">
20
+ <ul className="px-5 py-1 m-0 w-full">
21
+ {taxonomies.map((tax) => {
22
+ const isCurrentTax =
23
+ searchParams?.taxonomies[taxType]?.slug ===
24
+ tax?.slug
25
+ return (
26
+ <li className="m-0 w-full" key={tax.slug}>
27
+ <button
28
+ type="button"
29
+ className="text-left text-sm cursor-pointer w-full flex justify-between items-center px-0 py-2 m-0 leading-none bg-transparent hover:text-wp-theme-500 transition duration-200 button-focus"
30
+ onClick={() =>
31
+ updateTaxonomies({ [taxType]: tax })
32
+ }>
33
+ <span
34
+ className={classNames({
35
+ 'text-wp-theme-500':
36
+ isCurrentTax,
37
+ })}>
38
+ {tax?.title ?? tax.slug}
39
+ </span>
40
+ </button>
41
+ </li>
42
+ )
43
+ })}
44
+ </ul>
45
+ </div>
46
+ </PanelRow>
47
+ </PanelBody>
48
+ )
49
+ }
src/components/TypeSelect.js ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { useTemplatesStore } from '../state/Templates'
3
+ import classNames from 'classnames'
4
+ import { useGlobalStore } from '../state/GlobalState'
5
+
6
+ export const TypeSelect = ({ className }) => {
7
+ const updateType = useTemplatesStore((state) => state.updateType)
8
+ const currentType = useGlobalStore((state) =>
9
+ state.currentType ? state.currentType : 'pattern',
10
+ )
11
+
12
+ return (
13
+ <div className={className}>
14
+ <h4 className="sr-only">{__('Type select', 'extendify')}</h4>
15
+ <button
16
+ type="button"
17
+ className={classNames({
18
+ 'cursor-pointer text-xs leading-none m-0 py-2.5 px-4 min-w-sm border rounded-tl-sm rounded-bl-sm border-black button-focus': true,
19
+ 'bg-gray-900 text-white': currentType === 'pattern',
20
+ 'bg-transparent text-black': currentType !== 'pattern',
21
+ })}
22
+ onClick={() => updateType('pattern')}>
23
+ <span className="">{__('Patterns', 'extendify')}</span>
24
+ </button>
25
+ <button
26
+ type="button"
27
+ className={classNames({
28
+ 'cursor-pointer text-xs leading-none m-0 py-2.5 px-4 min-w-sm items-center border rounded-tr-sm rounded-br-sm border-black outline-none -ml-px button-focus': true,
29
+ 'bg-gray-900 text-white': currentType === 'template',
30
+ 'bg-transparent text-black': currentType !== 'template',
31
+ })}
32
+ onClick={() => updateType('template')}>
33
+ <span className="">{__('Page Layouts', 'extendify')}</span>
34
+ </button>
35
+ </div>
36
+ )
37
+ }
src/components/buttons/Primary.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ import classNames from 'classnames'
2
+ import { createElement } from '@wordpress/element'
3
+
4
+ export default function Primary({ tagName = 'button', children, ...props }) {
5
+ props.className = classNames(
6
+ props.className,
7
+ 'bg-extendify-main hover:bg-extendify-main-dark cursor-pointer rounded no-underline text-base text-white flex justify-center items-center',
8
+ )
9
+ return createElement(tagName, props, children)
10
+ }
src/components/icons/index.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export { default as alert } from './library/alert'
2
+ export { default as brandBlockIcon } from './library/brand-block-icon'
3
+ export { default as brandMark } from './library/brand-mark'
4
+ export { default as brandLogo } from './library/brand-logo'
5
+ export { default as download } from './library/download'
6
+ export { default as featured } from './library/featured'
7
+ export { default as growthArrow } from './library/growth-arrow'
8
+ export { default as layouts } from './library/layouts'
9
+ export { default as patterns } from './library/patterns'
10
+ export { default as success } from './library/success'
11
+ export { default as support } from './library/support'
12
+ export { default as star } from './library/star'
13
+ export { default as user } from './library/user'
src/components/icons/library/alert.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const alert = (
7
+ <SVG viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ d="M7.32457 0.907043C3.98785 0.907043 1.2829 3.61199 1.2829 6.94871C1.2829 10.2855 3.98785 12.9904 7.32457 12.9904C10.6613 12.9904 13.3663 10.2855 13.3663 6.94871C13.3663 3.61199 10.6613 0.907043 7.32457 0.907043V0.907043Z"
10
+ stroke="currentColor"
11
+ strokeWidth="1.25"
12
+ fill="none"
13
+ />
14
+ <Path
15
+ d="M6.34684 9.72526C6.34684 9.18224 6.77716 8.74168 7.32018 8.74168C7.8632 8.74168 8.30377 9.18224 8.30377 9.72526C8.30377 10.2683 7.8632 10.6986 7.32018 10.6986C6.77716 10.6986 6.34684 10.2683 6.34684 9.72526Z"
16
+ fill="currentColor"
17
+ />
18
+ <Path
19
+ d="M7.9759 7.11261C7.93492 7.47121 7.67878 7.76834 7.32018 7.76834C6.95134 7.76834 6.70544 7.46097 6.6747 7.11261L6.34684 4.1721C6.28537 3.67006 6.81814 3.19876 7.32018 3.19876C7.82222 3.19876 8.35499 3.67006 8.30377 4.1721L7.9759 7.11261Z"
20
+ fill="currentColor"
21
+ />
22
+ </SVG>
23
+ )
24
+
25
+ export default alert
src/components/icons/library/brand-block-icon.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const brandBlockIcon = (
7
+ <SVG fill="none" viewBox="0 0 25 24" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ clipRule="evenodd"
10
+ d="m14.4063 2h4.1856c1.1856 0 1.6147.12701 2.0484.36409.4336.23802.7729.58706 1.0049 1.03111.2319.445.3548.8853.3548 2.10175v4.29475c0 1.2165-.1238 1.6567-.3548 2.1017-.232.445-.5722.7931-1.0049 1.0312-.1939.1064-.3873.1939-.6476.2567v3.4179c0 1.8788-.1912 2.5588-.5481 3.246-.3582.6873-.8836 1.2249-1.552 1.5925-.6697.3676-1.3325.5623-3.1634.5623h-6.46431c-1.83096 0-2.49367-.1962-3.16346-.5623-.6698-.3676-1.19374-.9067-1.552-1.5925s-.54943-1.3672-.54943-3.246v-6.63138c0-1.87871.19117-2.55871.54801-3.24597.35827-.68727.88362-1.22632 1.55342-1.59393.66837-.36615 1.3325-.56231 3.16346-.56231h2.76781c.0519-.55814.1602-.86269.3195-1.16946.232-.445.5721-.79404 1.0058-1.03206.4328-.23708.8628-.36409 2.0483-.36409zm-2.1512 2.73372c0-.79711.6298-1.4433 1.4067-1.4433h5.6737c.777 0 1.4068.64619 1.4068 1.4433v5.82118c0 .7971-.6298 1.4433-1.4068 1.4433h-5.6737c-.7769 0-1.4067-.6462-1.4067-1.4433z"
11
+ fill="currentColor"
12
+ fillRule="evenodd"
13
+ />
14
+ </SVG>
15
+ )
16
+
17
+ export default brandBlockIcon
src/components/icons/library/brand-logo.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG, G } from '@wordpress/primitives'
5
+
6
+ const brandLogo = (
7
+ <SVG
8
+ fill="none"
9
+ width="150"
10
+ height="30"
11
+ viewBox="0 0 2524 492"
12
+ xmlns="http://www.w3.org/2000/svg">
13
+ <G fill="currentColor">
14
+ <Path d="m609.404 378.5c-24.334 0-46-5.5-65-16.5-18.667-11.333-33.334-26.667-44-46-10.667-19.667-16-42.167-16-67.5 0-25.667 5.166-48.333 15.5-68 10.333-19.667 24.833-35 43.5-46 18.666-11.333 40-17 64-17 25 0 46.5 5.333 64.5 16 18 10.333 31.833 24.833 41.5 43.5 10 18.667 15 41 15 67v18.5l-212 .5 1-39h150.5c0-17-5.5-30.667-16.5-41-10.667-10.333-25.167-15.5-43.5-15.5-14.334 0-26.5 3-36.5 9-9.667 6-17 15-22 27s-7.5 26.667-7.5 44c0 26.667 5.666 46.833 17 60.5 11.666 13.667 28.833 20.5 51.5 20.5 16.666 0 30.333-3.167 41-9.5 11-6.333 18.166-15.333 21.5-27h56.5c-5.334 27-18.667 48.167-40 63.5-21 15.333-47.667 23-80 23z" />
15
+ <path d="m797.529 372h-69.5l85-121-85-126h71l54.5 84 52.5-84h68.5l-84 125.5 81.5 121.5h-70l-53-81.5z" />
16
+ <path d="m994.142 125h155.998v51h-155.998zm108.498 247h-61v-324h61z" />
17
+ <path d="m1278.62 378.5c-24.33 0-46-5.5-65-16.5-18.66-11.333-33.33-26.667-44-46-10.66-19.667-16-42.167-16-67.5 0-25.667 5.17-48.333 15.5-68 10.34-19.667 24.84-35 43.5-46 18.67-11.333 40-17 64-17 25 0 46.5 5.333 64.5 16 18 10.333 31.84 24.833 41.5 43.5 10 18.667 15 41 15 67v18.5l-212 .5 1-39h150.5c0-17-5.5-30.667-16.5-41-10.66-10.333-25.16-15.5-43.5-15.5-14.33 0-26.5 3-36.5 9-9.66 6-17 15-22 27s-7.5 26.667-7.5 44c0 26.667 5.67 46.833 17 60.5 11.67 13.667 28.84 20.5 51.5 20.5 16.67 0 30.34-3.167 41-9.5 11-6.333 18.17-15.333 21.5-27h56.5c-5.33 27-18.66 48.167-40 63.5-21 15.333-47.66 23-80 23z" />
18
+ <path d="m1484.44 372h-61v-247h56.5l5 32c7.67-12.333 18.5-22 32.5-29 14.34-7 29.84-10.5 46.5-10.5 31 0 54.34 9.167 70 27.5 16 18.333 24 43.333 24 75v152h-61v-137.5c0-20.667-4.66-36-14-46-9.33-10.333-22-15.5-38-15.5-19 0-33.83 6-44.5 18-10.66 12-16 28-16 48z" />
19
+ <path d="m1798.38 378.5c-24 0-44.67-5.333-62-16-17-11-30.34-26.167-40-45.5-9.34-19.333-14-41.833-14-67.5s4.66-48.333 14-68c9.66-20 23.5-35.667 41.5-47s39.33-17 64-17c17.33 0 33.16 3.5 47.5 10.5 14.33 6.667 25.33 16.167 33 28.5v-156.5h60.5v372h-56l-4-38.5c-7.34 14-18.67 25-34 33-15 8-31.84 12-50.5 12zm13.5-56c14.33 0 26.66-3 37-9 10.33-6.333 18.33-15.167 24-26.5 6-11.667 9-24.833 9-39.5 0-15-3-28-9-39-5.67-11.333-13.67-20.167-24-26.5-10.34-6.667-22.67-10-37-10-14 0-26.17 3.333-36.5 10-10.34 6.333-18.34 15.167-24 26.5-5.34 11.333-8 24.333-8 39s2.66 27.667 8 39c5.66 11.333 13.66 20.167 24 26.5 10.33 6.333 22.5 9.5 36.5 9.5z" />
20
+ <path d="m1996.45 372v-247h61v247zm30-296.5c-10.34 0-19.17-3.5-26.5-10.5-7-7.3333-10.5-16.1667-10.5-26.5s3.5-19 10.5-26c7.33-6.99999 16.16-10.49998 26.5-10.49998 10.33 0 19 3.49999 26 10.49998 7.33 7 11 15.6667 11 26s-3.67 19.1667-11 26.5c-7 7-15.67 10.5-26 10.5z" />
21
+ <path d="m2085.97 125h155v51h-155zm155.5-122.5v52c-3.33 0-6.83 0-10.5 0-3.33 0-6.83 0-10.5 0-15.33 0-25.67 3.6667-31 11-5 7.3333-7.5 17.1667-7.5 29.5v277h-60.5v-277c0-22.6667 3.67-40.8333 11-54.5 7.33-14 17.67-24.1667 31-30.5 13.33-6.66666 28.83-10 46.5-10 5 0 10.17.166671 15.5.5 5.67.333329 11 .99999 16 2z" />
22
+ <path d="m2330.4 125 80.5 228-33 62.5-112-290.5zm-58 361.5v-50.5h36.5c8 0 15-1 21-3 6-1.667 11.34-5 16-10 5-5 9.17-12.333 12.5-22l102.5-276h63l-121 302c-9 22.667-20.33 39.167-34 49.5-13.66 10.333-30.66 15.5-51 15.5-8.66 0-16.83-.5-24.5-1.5-7.33-.667-14.33-2-21-4z" />
23
+ <path
24
+ clipRule="evenodd"
25
+ d="m226.926 25.1299h83.271c23.586 0 32.123 2.4639 40.751 7.0633 8.628 4.6176 15.378 11.389 19.993 20.0037 4.615 8.6329 7.059 17.1746 7.059 40.7738v83.3183c0 23.599-2.463 32.141-7.059 40.774-4.615 8.633-11.383 15.386-19.993 20.003-3.857 2.065-7.704 3.764-12.884 4.981v66.308c0 36.447-3.803 49.639-10.902 62.972-7.128 13.333-17.579 23.763-30.877 30.894-13.325 7.132-26.51 10.909-62.936 10.909h-128.605c-36.4268 0-49.6113-3.805-62.9367-10.909-13.3254-7.131-23.749-17.589-30.8765-30.894-7.12757-13.304-10.9308-26.525-10.9308-62.972v-128.649c0-36.447 3.80323-49.639 10.9026-62.972 7.1275-13.333 17.5793-23.7909 30.9047-30.9224 13.2972-7.1034 26.5099-10.9088 62.9367-10.9088h55.064c1.033-10.8281 3.188-16.7362 6.357-22.6877 4.615-8.6329 11.382-15.4043 20.01-20.0219 8.61-4.5994 17.165-7.0633 40.751-7.0633zm-42.798 53.0342c0-15.464 12.53-28 27.986-28h112.877c15.457 0 27.987 12.536 27.987 28v112.9319c0 15.464-12.53 28-27.987 28h-112.877c-15.456 0-27.986-12.536-27.986-28z"
26
+ fillRule="evenodd"
27
+ />
28
+ </G>
29
+ </SVG>
30
+ )
31
+
32
+ export default brandLogo
src/components/icons/library/brand-mark.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const brandMark = (
7
+ <SVG fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ clip-rule="evenodd"
10
+ d="m13.505 4h3.3044c.936 0 1.2747.10161 1.6171.29127.3424.19042.6102.46965.7934.82489.1831.356.2801.70824.2801 1.6814v3.43584c0 .9731-.0977 1.3254-.2801 1.6814-.1832.356-.4517.6344-.7934.8248-.153.0852-.3057.1552-.5112.2054v2.7344c0 1.503-.151 2.047-.4327 2.5968-.2828.5498-.6976.9799-1.2252 1.274-.5288.294-1.052.4498-2.4975.4498h-5.10341c-1.44549 0-1.96869-.1569-2.49747-.4498-.52878-.2941-.94242-.7254-1.22526-1.274-.28284-.5487-.43376-1.0938-.43376-2.5968v-5.3051c0-1.50301.15092-2.04701.43264-2.59682.28284-.54981.6976-.98106 1.22638-1.27514.52767-.29293 1.05198-.44985 2.49747-.44985h2.18511c.041-.44652.1265-.69015.2522-.93557.1832-.356.4517-.63523.7941-.82565.3417-.18966.6812-.29127 1.6171-.29127zm-1.6984 2.18698c0-.63769.4973-1.15464 1.1106-1.15464h4.4793c.6133 0 1.1106.51695 1.1106 1.15464v4.65692c0 .6377-.4973 1.1547-1.1106 1.1547h-4.4793c-.6133 0-1.1106-.517-1.1106-1.1547z"
11
+ fill="currentColor"
12
+ fill-rule="evenodd"
13
+ />
14
+ </SVG>
15
+ )
16
+
17
+ export default brandMark
src/components/icons/library/download.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const download = (
7
+ <SVG viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ d="M7.32457 0.907043C3.98785 0.907043 1.2829 3.61199 1.2829 6.94871C1.2829 10.2855 3.98785 12.9904 7.32457 12.9904C10.6613 12.9904 13.3663 10.2855 13.3663 6.94871C13.3663 3.61199 10.6613 0.907043 7.32457 0.907043V0.907043Z"
10
+ stroke="white"
11
+ strokeWidth="1.25"
12
+ />
13
+ <Path
14
+ d="M7.32458 10.0998L4.82458 7.59977M7.32458 10.0998V3.79764V10.0998ZM7.32458 10.0998L9.82458 7.59977L7.32458 10.0998Z"
15
+ stroke="white"
16
+ strokeWidth="1.25"
17
+ />
18
+ </SVG>
19
+ )
20
+
21
+ export default download
src/components/icons/library/featured.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG, G } from '@wordpress/primitives'
5
+
6
+ const featured = (
7
+ <SVG fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ d="m11.2721 16.9866.6041 2.2795.6042-2.2795.6213-2.3445c.0001-.0002.0001-.0004.0002-.0006.2404-.9015.8073-1.5543 1.4638-1.8165.0005-.0002.0009-.0004.0013-.0006l1.9237-.7555 1.4811-.5818-1.4811-.5817-1.9264-.7566c0-.0001-.0001-.0001-.0001-.0001-.0001 0-.0001 0-.0001 0-.654-.25727-1.2213-.90816-1.4621-1.81563-.0001-.00006-.0001-.00011-.0001-.00017l-.6215-2.34519-.6042-2.27947-.6041 2.27947-.6216 2.34519v.00017c-.2409.90747-.80819 1.55836-1.46216 1.81563-.00002 0-.00003 0-.00005 0-.00006 0-.00011 0-.00017.0001l-1.92637.7566-1.48108.5817 1.48108.5818 1.92637.7566c.00007 0 .00015.0001.00022.0001.65397.2572 1.22126.9082 1.46216 1.8156v.0002z"
10
+ stroke="currentColor"
11
+ stroke-width="1.25"
12
+ fill="none"
13
+ />
14
+ <G fill="currentColor">
15
+ <Path d="m18.1034 18.3982-.2787.8625-.2787-.8625c-.1314-.4077-.4511-.7275-.8589-.8589l-.8624-.2786.8624-.2787c.4078-.1314.7275-.4512.8589-.8589l.2787-.8624.2787.8624c.1314.4077.4511.7275.8589.8589l.8624.2787-.8624.2786c-.4078.1314-.7269.4512-.8589.8589z" />
16
+ <Path d="m6.33141 6.97291-.27868.86242-.27867-.86242c-.13142-.40775-.45116-.72749-.8589-.85891l-.86243-.27867.86243-.27868c.40774-.13141.72748-.45115.8589-.8589l.27867-.86242.27868.86242c.13142.40775.45116.72749.8589.8589l.86242.27868-.86242.27867c-.40774.13142-.7269.45116-.8589.85891z" />
17
+ </G>
18
+ </SVG>
19
+ )
20
+
21
+ export default featured
src/components/icons/library/growth-arrow.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Path, SVG } from '@wordpress/primitives'
2
+
3
+ const growthArrow = (
4
+ <SVG
5
+ fill="none"
6
+ height="24"
7
+ viewBox="0 0 25 24"
8
+ width="25"
9
+ xmlns="http://www.w3.org/2000/svg">
10
+ <Path
11
+ d="m10.3949 8.7864 5.5476-.02507m0 0-.0476 5.52507m.0476-5.52507c-2.357 2.35707-5.4183 5.41827-7.68101 7.68097"
12
+ stroke="currentColor"
13
+ strokeWidth="1.5"
14
+ />
15
+ </SVG>
16
+ )
17
+
18
+ export default growthArrow
src/components/icons/library/layouts.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG, G } from '@wordpress/primitives'
5
+
6
+ const layouts = (
7
+ <SVG
8
+ fill="none"
9
+ height="24"
10
+ viewBox="0 0 24 24"
11
+ width="24"
12
+ xmlns="http://www.w3.org/2000/svg">
13
+ <G stroke="currentColor" strokeWidth="1.5">
14
+ <Path d="m6 4.75h12c.6904 0 1.25.55964 1.25 1.25v12c0 .6904-.5596 1.25-1.25 1.25h-12c-.69036 0-1.25-.5596-1.25-1.25v-12c0-.69036.55964-1.25 1.25-1.25z" />
15
+ <Path d="m9.25 19v-14" />
16
+ </G>
17
+ </SVG>
18
+ )
19
+
20
+ export default layouts
src/components/icons/library/patterns.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const patterns = (
7
+ <SVG
8
+ width="24"
9
+ height="24"
10
+ viewBox="0 0 24 24"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg">
13
+ <Path
14
+ fillRule="evenodd"
15
+ clipRule="evenodd"
16
+ d="M7.49271 18.0092C6.97815 17.1176 7.28413 15.9755 8.17569 15.4609C9.06724 14.946 10.2094 15.252 10.7243 16.1435C11.2389 17.0355 10.9329 18.1772 10.0413 18.6922C9.14978 19.2071 8.00764 18.9011 7.49271 18.0092V18.0092Z"
17
+ fill="currentColor"
18
+ />
19
+ <Path
20
+ fillRule="evenodd"
21
+ clipRule="evenodd"
22
+ d="M16.5073 6.12747C17.0218 7.01903 16.7158 8.16117 15.8243 8.67573C14.9327 9.19066 13.7906 8.88467 13.2757 7.99312C12.7611 7.10119 13.0671 5.95942 13.9586 5.44449C14.8502 4.92956 15.9923 5.23555 16.5073 6.12747V6.12747Z"
23
+ fill="currentColor"
24
+ />
25
+ <Path
26
+ fillRule="evenodd"
27
+ clipRule="evenodd"
28
+ d="M4.60135 11.1355C5.11628 10.2439 6.25805 9.93793 7.14998 10.4525C8.04153 10.9674 8.34752 12.1096 7.83296 13.0011C7.31803 13.8927 6.17588 14.1987 5.28433 13.6841C4.39278 13.1692 4.08679 12.0274 4.60135 11.1355V11.1355Z"
29
+ fill="currentColor"
30
+ />
31
+ <Path
32
+ fillRule="evenodd"
33
+ clipRule="evenodd"
34
+ d="M19.3986 13.0011C18.8837 13.8927 17.7419 14.1987 16.85 13.6841C15.9584 13.1692 15.6525 12.027 16.167 11.1355C16.682 10.2439 17.8241 9.93793 18.7157 10.4525C19.6072 10.9674 19.9132 12.1092 19.3986 13.0011V13.0011Z"
35
+ fill="currentColor"
36
+ />
37
+ <Path
38
+ d="M9.10857 8.92594C10.1389 8.92594 10.9742 8.09066 10.9742 7.06029C10.9742 6.02992 10.1389 5.19464 9.10857 5.19464C8.0782 5.19464 7.24292 6.02992 7.24292 7.06029C7.24292 8.09066 8.0782 8.92594 9.10857 8.92594Z"
39
+ fill="currentColor"
40
+ />
41
+ <Path
42
+ d="M14.8913 18.942C15.9217 18.942 16.7569 18.1067 16.7569 17.0763C16.7569 16.046 15.9217 15.2107 14.8913 15.2107C13.8609 15.2107 13.0256 16.046 13.0256 17.0763C13.0256 18.1067 13.8609 18.942 14.8913 18.942Z"
43
+ fill="currentColor"
44
+ />
45
+ <Path
46
+ fillRule="evenodd"
47
+ clipRule="evenodd"
48
+ d="M10.3841 13.0011C9.86951 12.1096 10.1755 10.9674 11.067 10.4525C11.9586 9.93793 13.1007 10.2439 13.6157 11.1355C14.1302 12.0274 13.8242 13.1692 12.9327 13.6841C12.0411 14.1987 10.899 13.8927 10.3841 13.0011V13.0011Z"
49
+ fill="currentColor"
50
+ />
51
+ </SVG>
52
+ )
53
+
54
+ export default patterns
src/components/icons/library/star.js ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const star = (
7
+ <SVG
8
+ fill="none"
9
+ height="24"
10
+ viewBox="0 0 24 24"
11
+ width="24"
12
+ xmlns="http://www.w3.org/2000/svg">
13
+ <Path
14
+ d="m11.7758 3.45425c.0917-.18582.3567-.18581.4484 0l2.3627 4.78731c.0364.07379.1068.12493.1882.13676l5.2831.76769c.2051.02979.287.28178.1386.42642l-3.8229 3.72637c-.0589.0575-.0858.1402-.0719.2213l.9024 5.2618c.0351.2042-.1793.36-.3627.2635l-4.7254-2.4842c-.0728-.0383-.1598-.0383-.2326 0l-4.7254 2.4842c-.18341.0965-.39776-.0593-.36274-.2635l.90247-5.2618c.01391-.0811-.01298-.1638-.0719-.2213l-3.8229-3.72637c-.14838-.14464-.0665-.39663.13855-.42642l5.28312-.76769c.08143-.01183.15182-.06297.18823-.13676z"
15
+ fill="currentColor"
16
+ />
17
+ </SVG>
18
+ )
19
+
20
+ export default star
src/components/icons/library/success.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG, G, Circle, Rect } from '@wordpress/primitives'
5
+
6
+ const download = (
7
+ <SVG
8
+ fill="none"
9
+ viewBox="0 0 151 148"
10
+ width="151"
11
+ xmlns="http://www.w3.org/2000/svg">
12
+ <Circle cx="65.6441" cy="66.6114" fill="#0b4a43" r="65.3897" />
13
+ <G fill="#cbc3f5" stroke="#0b4a43">
14
+ <Path
15
+ d="m61.73 11.3928 3.0825 8.3304.1197.3234.3234.1197 8.3304 3.0825-8.3304 3.0825-.3234.1197-.1197.3234-3.0825 8.3304-3.0825-8.3304-.1197-.3234-.3234-.1197-8.3304-3.0825 8.3304-3.0825.3234-.1197.1197-.3234z"
16
+ strokeWidth="1.5"
17
+ />
18
+ <Path
19
+ d="m84.3065 31.2718c0 5.9939-12.4614 22.323-18.6978 22.323h-17.8958v56.1522c3.5249.9 11.6535 0 17.8958 0h6.2364c11.2074 3.33 36.0089 7.991 45.5529 0l-9.294-62.1623c-2.267-1.7171-5.949-6.6968-2.55-12.8786 3.4-6.1817 2.55-18.0406 0-24.5756-1.871-4.79616-8.3289-8.90882-14.4482-8.90882s-7.0825 4.00668-6.7993 6.01003z"
20
+ strokeWidth="1.75"
21
+ />
22
+ <Rect
23
+ height="45.5077"
24
+ rx="9.13723"
25
+ strokeWidth="1.75"
26
+ transform="matrix(0 1 -1 0 191.5074 -96.0026)"
27
+ width="18.2745"
28
+ x="143.755"
29
+ y="47.7524"
30
+ />
31
+ <Rect
32
+ height="42.3038"
33
+ rx="8.73674"
34
+ strokeWidth="1.75"
35
+ transform="matrix(0 1 -1 0 241.97 -50.348)"
36
+ width="17.4735"
37
+ x="146.159"
38
+ y="95.811"
39
+ />
40
+ <Rect
41
+ height="55.9204"
42
+ rx="8.73674"
43
+ strokeWidth="1.75"
44
+ transform="matrix(0 1 -1 0 213.1347 -85.5913)"
45
+ width="17.4735"
46
+ x="149.363"
47
+ y="63.7717"
48
+ />
49
+ <Rect
50
+ height="51.1145"
51
+ rx="8.73674"
52
+ strokeWidth="1.75"
53
+ transform="matrix(0 1 -1 0 229.1545 -69.5715)"
54
+ width="17.4735"
55
+ x="149.363"
56
+ y="79.7915"
57
+ />
58
+ <Path
59
+ d="m75.7483 105.349c.9858-25.6313-19.2235-42.0514-32.8401-44.0538v12.0146c8.5438 1.068 24.8303 9.7642 24.8303 36.0442 0 23.228 19.4905 33.374 29.6362 33.641v-10.413s-22.6122-1.602-21.6264-27.233z"
60
+ strokeWidth="1.75"
61
+ />
62
+ <Path
63
+ d="m68.5388 109.354c.9858-25.6312-19.2234-42.0513-32.8401-44.0537v12.0147c8.5438 1.0679 24.8303 9.7641 24.8303 36.044 0 23.228 19.4905 33.374 29.6362 33.641v-10.413s-22.6122-1.602-21.6264-27.233z"
64
+ strokeWidth="1.75"
65
+ />
66
+ </G>
67
+ </SVG>
68
+ )
69
+
70
+ export default download
src/components/icons/library/support.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { SVG, Circle } from '@wordpress/primitives'
5
+
6
+ const layouts = (
7
+ <SVG
8
+ width="24"
9
+ height="24"
10
+ viewBox="0 0 24 24"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg">
13
+ <Circle
14
+ cx="12"
15
+ cy="12"
16
+ r="7.25"
17
+ stroke="currentColor"
18
+ strokeWidth="1.5"
19
+ />
20
+ <Circle
21
+ cx="12"
22
+ cy="12"
23
+ r="4.25"
24
+ stroke="currentColor"
25
+ strokeWidth="1.5"
26
+ />
27
+ <Circle
28
+ cx="11.9999"
29
+ cy="12.2"
30
+ r="6"
31
+ transform="rotate(-45 11.9999 12.2)"
32
+ stroke="currentColor"
33
+ strokeWidth="3"
34
+ strokeDasharray="1.5 4"
35
+ />
36
+ </SVG>
37
+ )
38
+
39
+ export default layouts
src/components/icons/library/user.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Path, SVG } from '@wordpress/primitives'
5
+
6
+ const user = (
7
+ <SVG fill="none" viewBox="0 0 25 25" xmlns="http://www.w3.org/2000/svg">
8
+ <Path
9
+ clipRule="evenodd"
10
+ d="m13 4c4.9545 0 9 4.04545 9 9 0 4.9545-4.0455 9-9 9-4.95455 0-9-4.0455-9-9 0-4.95455 4.04545-9 9-9zm5.0909 13.4545c-1.9545 3.8637-8.22726 3.8637-10.22726 0-.04546-.1818-.04546-.3636 0-.5454 2-3.8636 8.27276-3.8636 10.22726 0 .0909.1818.0909.3636 0 .5454zm-5.0909-8.90905c-1.2727 0-2.3182 1.04546-2.3182 2.31815 0 1.2728 1.0455 2.3182 2.3182 2.3182s2.3182-1.0454 2.3182-2.3182c0-1.27269-1.0455-2.31815-2.3182-2.31815z"
11
+ fill="currentColor"
12
+ fillRule="evenodd"
13
+ />
14
+ </SVG>
15
+ )
16
+
17
+ export default user
src/components/modals/Modal.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Dialog, Transition } from '@headlessui/react'
2
+ import { Fragment, useRef, forwardRef } from '@wordpress/element'
3
+ import { __ } from '@wordpress/i18n'
4
+ import { Icon, close } from '@wordpress/icons'
5
+ import { Button } from '@wordpress/components'
6
+
7
+ const CloseButton = forwardRef((props, focusRef) => {
8
+ return (
9
+ <Button
10
+ {...props}
11
+ icon={<Icon icon={close} />}
12
+ ref={focusRef}
13
+ className="text-extendify-black opacity-75 hover:opacity-100"
14
+ showTooltip={false}
15
+ label={__('Close dialog', 'extendify')}
16
+ />
17
+ )
18
+ })
19
+
20
+ export const Modal = forwardRef(
21
+ ({ isOpen, heading, onRequestClose, children }, initialFocus) => {
22
+ const focusBackup = useRef(null)
23
+
24
+ return (
25
+ <Transition
26
+ appear
27
+ show={isOpen}
28
+ as={Fragment}
29
+ className="extendify">
30
+ <Dialog
31
+ initialFocus={initialFocus ?? focusBackup}
32
+ onClose={onRequestClose}>
33
+ <div className="fixed z-high inset-0 flex">
34
+ <Transition.Child
35
+ as={Fragment}
36
+ enter="ease-out duration-200 transition"
37
+ enterFrom="opacity-0"
38
+ enterTo="opacity-100">
39
+ <Dialog.Overlay className="fixed inset-0 bg-black bg-opacity-40" />
40
+ </Transition.Child>
41
+ <Transition.Child
42
+ as={Fragment}
43
+ enter="ease-out duration-300 translate transform"
44
+ enterFrom="opacity-0 translate-y-4 sm:translate-y-5"
45
+ enterTo="opacity-100 translate-y-0">
46
+ <div className="m-auto relative w-full">
47
+ <div className="bg-white shadow-modal items-center justify-center m-auto max-w-lg relative rounded-sm w-full">
48
+ {heading ? (
49
+ <div className="border-b flex justify-between items-center leading-none pl-8 py-2 pr-3">
50
+ <span className="text-base text-extendify-black whitespace-nowrap">
51
+ {heading}
52
+ </span>
53
+ <CloseButton
54
+ onClick={onRequestClose}
55
+ />
56
+ </div>
57
+ ) : (
58
+ <div className="absolute block px-4 py-4 top-0 right-0 ">
59
+ <CloseButton
60
+ ref={focusBackup}
61
+ onClick={onRequestClose}
62
+ />
63
+ </div>
64
+ )}
65
+ <div>{children}</div>
66
+ </div>
67
+ </div>
68
+ </Transition.Child>
69
+ </div>
70
+ </Dialog>
71
+ </Transition>
72
+ )
73
+ },
74
+ )
src/components/modals/SettingsModal.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useRef } from '@wordpress/element'
2
+ import { __ } from '@wordpress/i18n'
3
+ import LoginInterface from '../LoginInterface'
4
+ import { Modal } from './Modal'
5
+
6
+ export default function SettingsModal({ isOpen, onClose }) {
7
+ const initialFocus = useRef(null)
8
+
9
+ return (
10
+ <Modal
11
+ heading={__('Settings', 'extendify')}
12
+ isOpen={isOpen}
13
+ ref={initialFocus}
14
+ onRequestClose={onClose}>
15
+ <div className="flex p-6 justify-center">
16
+ <LoginInterface
17
+ initialFocus={initialFocus}
18
+ actionCallback={onClose}
19
+ />
20
+ </div>
21
+ </Modal>
22
+ )
23
+ }
src/components/modals/SplitModal.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Icon, close } from '@wordpress/icons'
2
+ import { __ } from '@wordpress/i18n'
3
+ import { Dialog, Transition } from '@headlessui/react'
4
+ import { Fragment } from '@wordpress/element'
5
+
6
+ export default function SplitModal({ onRequestClose, isOpen, left, right }) {
7
+ return (
8
+ <Transition.Root appear show={true} as={Fragment}>
9
+ <Dialog
10
+ as="div"
11
+ static
12
+ open={isOpen}
13
+ className="extendify"
14
+ onClose={onRequestClose}>
15
+ <div className="fixed z-high inset-0 flex">
16
+ <Transition.Child
17
+ as={Fragment}
18
+ enter="ease-out duration-50 transition"
19
+ enterFrom="opacity-0"
20
+ enterTo="opacity-100">
21
+ <Dialog.Overlay className="fixed inset-0 bg-black bg-opacity-40 transition-opacity" />
22
+ </Transition.Child>
23
+ <Transition.Child
24
+ as={Fragment}
25
+ enter="ease-out duration-300 translate transform"
26
+ enterFrom="opacity-0 translate-y-4 sm:translate-y-5"
27
+ enterTo="opacity-100 translate-y-0">
28
+ <div className="m-auto">
29
+ <div className="shadow-modal relative m-8 md:m-0 max-w-md rounded-sm md:flex bg-gray-100 items-center justify-center md:max-w-2xl">
30
+ <button
31
+ onClick={onRequestClose}
32
+ className="absolute bg-transparent block p-4 top-0 right-0 rounded-md cursor-pointer text-gray-700 opacity-30 hover:opacity-100">
33
+ <span className="sr-only">
34
+ {__('Close', 'extendify')}
35
+ </span>
36
+ <Icon icon={close} />
37
+ </button>
38
+ <div className="rounded-md md:rounded-l-md md:rounded-tr-none bg-white p-12 text-center md:w-7/12 items-center">
39
+ {left}
40
+ </div>
41
+ <div className="justify-center md:justify-none md:w-6/12 p-10 text-black hidden md:block ">
42
+ {right}
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </Transition.Child>
47
+ </div>
48
+ </Dialog>
49
+ </Transition.Root>
50
+ )
51
+ }
src/components/notices/FeedbackNotice.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Button } from '@wordpress/components'
3
+
4
+ export default function FeedbackNotice() {
5
+ return (
6
+ <>
7
+ <span className="text-black">
8
+ {__(
9
+ 'Tell us how to make the Extendify Library work better for you',
10
+ 'extendify',
11
+ )}
12
+ </span>
13
+ <span className="px-2 opacity-50" aria-hidden="true">
14
+ &#124;
15
+ </span>
16
+ <div className="flex space-x-2 justify-center items-center">
17
+ <Button
18
+ variant="link"
19
+ className="text-black underline hover:no-underline p-0 h-auto"
20
+ href={`https://extendify.com/feedback/?utm_source=${window.extendifyData.sdk_partner}&utm_medium=library&utm_campaign=feedback-notice&utm_content=give-feedback`}
21
+ target="_blank">
22
+ {__('Give feedback', 'extendify')}
23
+ </Button>
24
+ </div>
25
+ </>
26
+ )
27
+ }
src/components/notices/PromotionNotice.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Button } from '@wordpress/components'
2
+
3
+ export default function PromotionNotice({ promotionData }) {
4
+ return (
5
+ <>
6
+ <span className="text-black">{promotionData?.text ?? ''}</span>
7
+ <span className="px-2 opacity-50" aria-hidden="true">
8
+ &#124;
9
+ </span>
10
+ <div className="flex space-x-2 justify-center items-center">
11
+ {promotionData?.url && (
12
+ <Button
13
+ variant="link"
14
+ className="text-black underline hover:no-underline p-0 h-auto"
15
+ href={`${promotionData.url}?utm_source=${window.extendifyData.sdk_partner}`}
16
+ target="_blank">
17
+ {promotionData?.button_text}
18
+ </Button>
19
+ )}
20
+ </div>
21
+ </>
22
+ )
23
+ }
src/components/notices/WelcomeNotice.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Button } from '@wordpress/components'
3
+ import { useUserStore } from '../../state/User'
4
+ import { useGlobalStore } from '../../state/GlobalState'
5
+
6
+ export default function WelcomeNotice() {
7
+ const setOpen = useGlobalStore((state) => state.setOpen)
8
+
9
+ const disableLibrary = () => {
10
+ const button = document.getElementById(
11
+ 'extendify-templates-inserter-btn',
12
+ )
13
+ button.classList.add('invisible')
14
+ useUserStore.setState({ enabled: false })
15
+ setOpen(false)
16
+ }
17
+
18
+ return (
19
+ <>
20
+ <span className="text-black">
21
+ {__('Welcome to the Extendify Library', 'extendify')}
22
+ </span>
23
+ <span className="px-2 opacity-50" aria-hidden="true">
24
+ &#124;
25
+ </span>
26
+ <div className="flex space-x-2 justify-center items-center">
27
+ <Button
28
+ variant="link"
29
+ className="text-black underline hover:no-underline p-0 h-auto"
30
+ href={`https://extendify.com/welcome/?utm_source=${window.extendifyData.sdk_partner}&utm_medium=library&utm_campaign=welcome-notice&utm_content=tell-me-more`}
31
+ target="_blank">
32
+ {__('Tell me more', 'extendify')}
33
+ </Button>
34
+ <span className="font-bold" aria-hidden="true">
35
+ &bull;
36
+ </span>
37
+ <Button
38
+ variant="link"
39
+ className="text-black underline hover:no-underline p-0 h-auto"
40
+ onClick={disableLibrary}>
41
+ {__('Turn off the library', 'extendify')}
42
+ </Button>
43
+ </div>
44
+ </>
45
+ )
46
+ }
src/hooks/helpers.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useRef, useEffect, useState } from '@wordpress/element'
2
+
3
+ export function useIsMounted() {
4
+ const isMounted = useRef(false)
5
+
6
+ useEffect(() => {
7
+ isMounted.current = true
8
+ return () => (isMounted.current = false)
9
+ })
10
+ return isMounted
11
+ }
12
+
13
+ export const useIsDevMode = () => {
14
+ const [devMode, setDevMode] = useState(false)
15
+ const handle = () => {
16
+ setDevMode(window.location.search.indexOf('DEVMODE') > -1)
17
+ }
18
+ useEffect(() => {
19
+ setDevMode(window.location.search.indexOf('DEVMODE') > -1)
20
+ window.addEventListener('popstate', handle)
21
+ return () => {
22
+ window.removeEventListener('popstate', handle)
23
+ }
24
+ }, [])
25
+ return devMode
26
+ }
src/hooks/useTaxonomies.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useCallback } from '@wordpress/element'
2
+ import { Taxonomies as TaxonomiesApi } from '../api/Taxonomies'
3
+ import { useTaxonomyStore } from '../state/Taxonomies'
4
+ import { useTemplatesStore } from '../state/Templates'
5
+
6
+ export default function useTaxonomies(fetchImmediately = false) {
7
+ const setupDefaultTaxonomies = useTemplatesStore(
8
+ (state) => state.setupDefaultTaxonomies,
9
+ )
10
+ const setTaxonomies = useTaxonomyStore((state) => state.setTaxonomies)
11
+ const fetchTaxonomies = useCallback(async () => {
12
+ let tax = await TaxonomiesApi.get()
13
+ tax = Object.keys(tax).reduce((taxFiltered, key) => {
14
+ taxFiltered[key] = tax[key]
15
+ return taxFiltered
16
+ }, {})
17
+ if (!Object.keys(tax)?.length) {
18
+ return
19
+ }
20
+ setTaxonomies(tax)
21
+ setupDefaultTaxonomies()
22
+ }, [setTaxonomies, setupDefaultTaxonomies])
23
+
24
+ useEffect(() => {
25
+ fetchImmediately && fetchTaxonomies()
26
+ }, [fetchTaxonomies, fetchImmediately])
27
+ }
src/listeners/index.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ import { templateHandler } from './template-inserted'
2
+ import { softErrorHandler } from './softerror-encountered'
3
+ ;[templateHandler, softErrorHandler].forEach((listener) => listener.register())
src/listeners/softerror-encountered.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { camelCase } from 'lodash'
2
+ import { render } from '@wordpress/element'
3
+ import RequiredPluginsModal from '../middleware/hasRequiredPlugins/RequiredPluginsModal'
4
+
5
+ // use this to trigger an error from outside the application
6
+ export const softErrorHandler = {
7
+ register() {
8
+ window.addEventListener('extendify::softerror-encountered', (event) => {
9
+ this[camelCase(event.detail.type)](event.detail)
10
+ })
11
+ },
12
+ versionOutdated(error) {
13
+ render(
14
+ <RequiredPluginsModal
15
+ title={error.data.title}
16
+ requiredPlugins={['extendify']}
17
+ message={error.data.message}
18
+ buttonLabel={error.data.buttonLabel}
19
+ forceOpen={true}
20
+ />,
21
+ document.getElementById('extendify-root'),
22
+ )
23
+ },
24
+ }
src/listeners/template-inserted.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Templates } from '../api/Templates'
2
+ import { useUserStore } from '../state/User'
3
+ import { dispatch } from '@wordpress/data'
4
+ import { __ } from '@wordpress/i18n'
5
+
6
+ // This fires after a template is inserted
7
+ export const templateHandler = {
8
+ register() {
9
+ const { createNotice } = dispatch('core/notices')
10
+ const increaseImports = useUserStore.getState().incrementImports
11
+ window.addEventListener('extendify::template-inserted', (event) => {
12
+ createNotice('info', __('Page layout added'), {
13
+ isDismissible: true,
14
+ type: 'snackbar',
15
+ })
16
+ // This is put off to the stack in attempt to fix a bug where
17
+ // some users are having their imports go from 3->0 in an instant
18
+ setTimeout(() => {
19
+ increaseImports()
20
+ Templates.import(event.detail?.template)
21
+ }, 0)
22
+ })
23
+ },
24
+ }
src/middleware/NeedsPermissionModal.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __, sprintf } from '@wordpress/i18n'
2
+ import { Modal, Button } from '@wordpress/components'
3
+ import { render } from '@wordpress/element'
4
+ import ExtendifyLibrary from '../ExtendifyLibrary'
5
+ import { useWantedTemplateStore } from '../state/Importing'
6
+ import { getPluginDescription } from '../util/general'
7
+
8
+ export default function NeedsPermissionModal() {
9
+ const wantedTemplate = useWantedTemplateStore(
10
+ (store) => store.wantedTemplate,
11
+ )
12
+ const closeModal = () =>
13
+ render(
14
+ <ExtendifyLibrary show={true} />,
15
+ document.getElementById('extendify-root'),
16
+ )
17
+ const requiredPlugins = wantedTemplate?.fields?.required_plugins || []
18
+ return (
19
+ <Modal
20
+ title={__('Plugins required', 'extendify')}
21
+ isDismissible={false}>
22
+ <p
23
+ style={{
24
+ maxWidth: '400px',
25
+ }}>
26
+ {sprintf(
27
+ __(
28
+ 'In order to add this %s to your site, the following plugins are required to be installed and activated.',
29
+ 'extendify',
30
+ ),
31
+ wantedTemplate?.fields?.type ?? 'template',
32
+ )}
33
+ </p>
34
+ <ul>
35
+ {
36
+ // Hardcoded temporarily to not force EP install
37
+ // requiredPlugins.map((plugin) =>
38
+ requiredPlugins
39
+ .filter((p) => p !== 'editorplus')
40
+ .map((plugin) => (
41
+ <li key={plugin}>{getPluginDescription(plugin)}</li>
42
+ ))
43
+ }
44
+ </ul>
45
+ <p
46
+ style={{
47
+ maxWidth: '400px',
48
+ fontWeight: 'bold',
49
+ }}>
50
+ {__(
51
+ 'Please contact a site admin for assistance in adding these plugins to your site.',
52
+ 'extendify',
53
+ )}
54
+ </p>
55
+ <Button
56
+ isPrimary
57
+ onClick={closeModal}
58
+ style={{
59
+ boxShadow: 'none',
60
+ }}>
61
+ {__('Return to library', 'extendify')}
62
+ </Button>
63
+ </Modal>
64
+ )
65
+ }
src/middleware/NeedsRegistrationModal.js ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __, sprintf } from '@wordpress/i18n'
2
+ import { Button } from '@wordpress/components'
3
+ import { useUserStore } from '../state/User'
4
+ import { useState, useRef } from '@wordpress/element'
5
+ import { User as UserApi } from '../api/User'
6
+ import { useGlobalStore } from '../state/GlobalState'
7
+ import { Modal } from '../components/modals/Modal'
8
+ import { brandMark } from '../components/icons'
9
+ import { Icon } from '@wordpress/icons'
10
+ import Primary from '../components/buttons/Primary'
11
+ import { safeHTML } from '@wordpress/dom'
12
+
13
+ export default function NeedsRegistrationModal({ finished, resetMiddleware }) {
14
+ const [email, setEmail] = useState('')
15
+ const remainingImports = useUserStore((state) => state.remainingImports)
16
+ const emailRef = useRef(null)
17
+ const setCurrentModal = useGlobalStore((state) => state.setCurrentModal)
18
+ const registerAndContinue = async (event) => {
19
+ event.preventDefault()
20
+ const newAllowedImports =
21
+ Number(useUserStore.getState().allowedImports) + 10
22
+ useUserStore.setState({
23
+ registration: { email },
24
+ allowedImports: newAllowedImports,
25
+ })
26
+ await UserApi.registerMailingList(email)
27
+ finished()
28
+ }
29
+
30
+ const optOut = () => {
31
+ useUserStore.setState({
32
+ registration: { optedOut: true },
33
+ })
34
+ finished()
35
+ }
36
+
37
+ return (
38
+ <Modal
39
+ isOpen={true}
40
+ onRequestClose={() => {
41
+ setCurrentModal(null)
42
+ resetMiddleware()
43
+ }}
44
+ ref={emailRef}>
45
+ <div className="p-10 space-y-4 text-extendify-black">
46
+ <Icon icon={brandMark} size={42} className="-ml-2 -mt-2" />
47
+ <h3 className="text-xl md:leading-3">
48
+ {remainingImports() == 1
49
+ ? __('This is your last import', 'extendify')
50
+ : sprintf(
51
+ __('You now have %s imports left', 'extendify'),
52
+ remainingImports(),
53
+ )}
54
+ </h3>
55
+ <p
56
+ className="max-w-md text-sm"
57
+ dangerouslySetInnerHTML={{
58
+ __html: safeHTML(
59
+ sprintf(
60
+ // Translators: 1. and 2. are <strong> tags
61
+ __(
62
+ "Subscribe and %1$swe'll send you 10 more%2$s. Plus you'll get updates and special offers from us fine folks at Extendify.",
63
+ 'extendify',
64
+ ),
65
+ '<strong>',
66
+ '</strong>',
67
+ ),
68
+ ),
69
+ }}></p>
70
+ <form
71
+ onSubmit={registerAndContinue}
72
+ className="flex space-x-2 py-2 items-stretch">
73
+ <div className="relative w-full max-w-xs">
74
+ <label
75
+ htmlFor="extendify-email-register"
76
+ className="sr-only">
77
+ {__('Email', 'extendify')}
78
+ </label>
79
+ <input
80
+ ref={emailRef}
81
+ id="extendify-email-register"
82
+ name="extendify-email-register"
83
+ required
84
+ onChange={(event) => setEmail(event.target.value)}
85
+ type="email"
86
+ className="text-sm min-h-0 p-2 border-2 border-gray-900 rounded-md w-full"
87
+ placeholder={__(
88
+ 'Enter your email address',
89
+ 'extendify',
90
+ )}
91
+ />
92
+ </div>
93
+ <Primary type="submit" className="px-4 rounded-md my-0">
94
+ {__('Submit', 'extendify')}
95
+ </Primary>
96
+ </form>
97
+ <Button
98
+ isLink
99
+ className="text-extendify-gray text-sm my-0"
100
+ onClick={optOut}>
101
+ {__('No thanks — finish importing', 'extendify')}
102
+ </Button>
103
+ </div>
104
+ </Modal>
105
+ )
106
+ }
107
+
108
+ const pass = () => {
109
+ const userState = useUserStore.getState()
110
+ const remainingImports = userState?.remainingImports()
111
+
112
+ // On the last import, show the modal if they opted out
113
+ if (remainingImports === 1 && userState?.registration?.optedOut) {
114
+ return false
115
+ }
116
+ return (
117
+ userState?.registration?.email?.length || // Already registered
118
+ userState?.apiKey?.length || // Already a member
119
+ userState?.registration?.optedOut || // Already opted out
120
+ userState?.imports === 0 // Hasn't imported yet
121
+ )
122
+ }
123
+
124
+ export function check() {
125
+ return {
126
+ id: 'NeedsRegistrationModal',
127
+ pass: pass(),
128
+ allow() {},
129
+ deny() {
130
+ return new Promise((resolve, reject) => {
131
+ useGlobalStore.setState({
132
+ currentModal: (
133
+ <NeedsRegistrationModal
134
+ finished={resolve}
135
+ resetMiddleware={reject}
136
+ />
137
+ ),
138
+ })
139
+ })
140
+ },
141
+ }
142
+ }
src/middleware/ReloadRequiredModal.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Modal, Button, ButtonGroup } from '@wordpress/components'
3
+ import { useState } from '@wordpress/element'
4
+ import { dispatch, select } from '@wordpress/data'
5
+
6
+ export default function ReloadRequiredModal() {
7
+ const [isSaving, setSaving] = useState(false)
8
+ const { isEditedPostDirty } = select('core/editor')
9
+ const hasUnsavedChanges = isEditedPostDirty()
10
+ const saveChanges = () => {
11
+ setSaving(true)
12
+ dispatch('core/editor').savePost()
13
+ setSaving(false)
14
+ }
15
+ const reload = () => {
16
+ // location.reload()
17
+ }
18
+ if (!hasUnsavedChanges) {
19
+ reload()
20
+ return null
21
+ }
22
+ return (
23
+ <Modal title={__('Reload required', 'extendify')} isDismissible={false}>
24
+ <p
25
+ style={{
26
+ maxWidth: '400px',
27
+ }}>
28
+ {__(
29
+ 'Just one more thing! We need to reload the page to continue.',
30
+ 'extendify',
31
+ )}
32
+ </p>
33
+ <ButtonGroup>
34
+ <Button isPrimary onClick={reload} disabled={isSaving}>
35
+ {__('Reload page', 'extendify')}
36
+ </Button>
37
+ <Button
38
+ isSecondary
39
+ onClick={saveChanges}
40
+ isBusy={isSaving}
41
+ style={{
42
+ margin: '0 4px',
43
+ }}>
44
+ {__('Save changes', 'extendify')}
45
+ </Button>
46
+ </ButtonGroup>
47
+ </Modal>
48
+ )
49
+ }
src/middleware/hasPluginsActivated/ActivatePluginsModal.js ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __, sprintf } from '@wordpress/i18n'
2
+ import { Modal, Button, ButtonGroup } from '@wordpress/components'
3
+ import { render } from '@wordpress/element'
4
+ import ActivatingModal from './ActivatingModal'
5
+ import ExtendifyLibrary from '../../ExtendifyLibrary'
6
+ import { useWantedTemplateStore } from '../../state/Importing'
7
+ import { getPluginDescription } from '../../util/general'
8
+ import { useUserStore } from '../../state/User'
9
+ import NeedsPermissionModal from '../NeedsPermissionModal'
10
+
11
+ export default function ActivatePluginsModal(props) {
12
+ const wantedTemplate = useWantedTemplateStore(
13
+ (store) => store.wantedTemplate,
14
+ )
15
+ const closeModal = () =>
16
+ render(
17
+ <ExtendifyLibrary show={true} />,
18
+ document.getElementById('extendify-root'),
19
+ )
20
+ const installPlugins = () =>
21
+ render(<ActivatingModal />, document.getElementById('extendify-root'))
22
+ const requiredPlugins = wantedTemplate?.fields?.required_plugins || []
23
+
24
+ if (!useUserStore.getState()?.canActivatePlugins) {
25
+ return <NeedsPermissionModal />
26
+ }
27
+
28
+ return (
29
+ <Modal
30
+ title={__('Activate required plugins', 'extendify')}
31
+ isDismissible={false}>
32
+ <div>
33
+ <p
34
+ style={{
35
+ maxWidth: '400px',
36
+ }}>
37
+ {props.message ??
38
+ __(
39
+ sprintf(
40
+ 'There is just one more step. This %s requires the following plugins to be installed and activated:',
41
+ wantedTemplate?.fields?.type ?? 'template',
42
+ ),
43
+ 'extendify',
44
+ )}
45
+ </p>
46
+ <ul>
47
+ {
48
+ // Hardcoded temporarily to not force EP install
49
+ // requiredPlugins.map((plugin) =>
50
+ requiredPlugins
51
+ .filter((p) => p !== 'editorplus')
52
+ .map((plugin) => (
53
+ <li key={plugin}>
54
+ {getPluginDescription(plugin)}
55
+ </li>
56
+ ))
57
+ }
58
+ </ul>
59
+ <ButtonGroup>
60
+ <Button isPrimary onClick={installPlugins}>
61
+ {__('Activate Plugins', 'extendify')}
62
+ </Button>
63
+ {props.showClose && (
64
+ <Button
65
+ isTertiary
66
+ onClick={closeModal}
67
+ style={{
68
+ boxShadow: 'none',
69
+ margin: '0 4px',
70
+ }}>
71
+ {__('No thanks, return to library', 'extendify')}
72
+ </Button>
73
+ )}
74
+ </ButtonGroup>
75
+ </div>
76
+ </Modal>
77
+ )
78
+ }
src/middleware/hasPluginsActivated/ActivatingModal.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Modal, Button } from '@wordpress/components'
3
+ import { useState, render } from '@wordpress/element'
4
+ import { Plugins } from '../../api/Plugins'
5
+ import { useWantedTemplateStore } from '../../state/Importing'
6
+ import ErrorActivating from './ErrorActivating'
7
+ import ReloadRequiredModal from '../ReloadRequiredModal'
8
+
9
+ export default function ActivatingModal() {
10
+ const [errorMessage, setErrorMessage] = useState('')
11
+ const wantedTemplate = useWantedTemplateStore(
12
+ (store) => store.wantedTemplate,
13
+ )
14
+
15
+ // Hardcoded temporarily to not force EP install
16
+ // const required = wantedTemplate?.fields?.required_plugins
17
+ const required = wantedTemplate?.fields?.required_plugins.filter(
18
+ (p) => p !== 'editorplus',
19
+ )
20
+
21
+ Plugins.installAndActivate(required)
22
+ .then(() => {
23
+ useWantedTemplateStore.setState({
24
+ importOnLoad: true,
25
+ })
26
+ })
27
+ .then(async () => {
28
+ await new Promise((resolve) => setTimeout(resolve, 1000))
29
+ render(
30
+ <ReloadRequiredModal />,
31
+ document.getElementById('extendify-root'),
32
+ )
33
+ })
34
+ .catch(({ response }) => {
35
+ setErrorMessage(response.data.message)
36
+ })
37
+
38
+ if (errorMessage) {
39
+ return <ErrorActivating msg={errorMessage} />
40
+ }
41
+
42
+ return (
43
+ <Modal
44
+ title={__('Activating plugins', 'extendify')}
45
+ isDismissible={false}>
46
+ <Button
47
+ style={{
48
+ width: '100%',
49
+ }}
50
+ disabled
51
+ isPrimary
52
+ isBusy
53
+ onClick={() => {}}>
54
+ {__('Activating...', 'extendify')}
55
+ </Button>
56
+ </Modal>
57
+ )
58
+ }
src/middleware/hasPluginsActivated/ErrorActivating.js ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Modal, Button, Notice } from '@wordpress/components'
3
+ import { render } from '@wordpress/element'
4
+ import ActivatePluginsModal from './ActivatePluginsModal'
5
+
6
+ export default function ErrorActivating({ msg }) {
7
+ const goBack = () => {
8
+ render(
9
+ <ActivatePluginsModal />,
10
+ document.getElementById('extendify-root'),
11
+ )
12
+ }
13
+
14
+ return (
15
+ <Modal
16
+ style={{
17
+ maxWidth: '500px',
18
+ }}
19
+ title={__('Error Activating plugins', 'extendify')}
20
+ isDismissible={false}>
21
+ {__(
22
+ 'You have encountered an error that we cannot recover from. Please try again.',
23
+ 'extendify',
24
+ )}
25
+ <br />
26
+ <Notice isDismissible={false} status="error">
27
+ {msg}
28
+ </Notice>
29
+ <Button isPrimary onClick={goBack}>
30
+ {__('Go back', 'extendify')}
31
+ </Button>
32
+ </Modal>
33
+ )
34
+ }
src/middleware/hasPluginsActivated/index.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { checkIfUserNeedsToActivatePlugins } from '../helpers'
2
+ import ActivatePluginsModal from './ActivatePluginsModal'
3
+ import { render } from '@wordpress/element'
4
+
5
+ export const hasPluginsActivated = async (template) => {
6
+ return {
7
+ id: 'hasPluginsActivated',
8
+ pass: !(await checkIfUserNeedsToActivatePlugins(template)),
9
+ allow() {},
10
+ deny() {
11
+ return new Promise(() => {
12
+ render(
13
+ <ActivatePluginsModal showClose={true} />,
14
+ document.getElementById('extendify-root'),
15
+ )
16
+ })
17
+ },
18
+ }
19
+ }
src/middleware/hasRequiredPlugins/ErrorInstalling.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Modal, Button, Notice } from '@wordpress/components'
3
+ import { render } from '@wordpress/element'
4
+ import RequiredPluginsModal from './RequiredPluginsModal'
5
+
6
+ export default function ErrorInstalling({ msg }) {
7
+ const goBack = () =>
8
+ render(
9
+ <RequiredPluginsModal />,
10
+ document.getElementById('extendify-root'),
11
+ )
12
+
13
+ return (
14
+ <Modal
15
+ style={{
16
+ maxWidth: '500px',
17
+ }}
18
+ title={__('Error installing plugins', 'extendify')}
19
+ isDismissible={false}>
20
+ {__(
21
+ 'You have encountered an error that we cannot recover from. Please try again.',
22
+ 'extendify',
23
+ )}
24
+ <br />
25
+ <Notice isDismissible={false} status="error">
26
+ {msg}
27
+ </Notice>
28
+ <Button isPrimary onClick={goBack}>
29
+ {__('Go back', 'extendify')}
30
+ </Button>
31
+ </Modal>
32
+ )
33
+ }
src/middleware/hasRequiredPlugins/InstallingModal.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Modal, Button } from '@wordpress/components'
3
+ import { useState, render } from '@wordpress/element'
4
+ import { Plugins } from '../../api/Plugins'
5
+ import { useWantedTemplateStore } from '../../state/Importing'
6
+ import ErrorInstalling from './ErrorInstalling'
7
+ import ReloadRequiredModal from '../ReloadRequiredModal'
8
+
9
+ export default function InstallingModal({ requiredPlugins }) {
10
+ const [errorMessage, setErrorMessage] = useState('')
11
+ const wantedTemplate = useWantedTemplateStore(
12
+ (store) => store.wantedTemplate,
13
+ )
14
+
15
+ // Hardcoded temporarily to not force EP install
16
+ // const required = wantedTemplate?.fields?.required_plugins
17
+ const required =
18
+ requiredPlugins ??
19
+ wantedTemplate?.fields?.required_plugins.filter(
20
+ (p) => p !== 'editorplus',
21
+ )
22
+
23
+ Plugins.installAndActivate(required)
24
+ .then(() => {
25
+ useWantedTemplateStore.setState({
26
+ importOnLoad: true,
27
+ })
28
+ render(
29
+ <ReloadRequiredModal />,
30
+ document.getElementById('extendify-root'),
31
+ )
32
+ })
33
+ .catch(({ message }) => {
34
+ setErrorMessage(message)
35
+ })
36
+
37
+ if (errorMessage) {
38
+ return <ErrorInstalling msg={errorMessage} />
39
+ }
40
+
41
+ return (
42
+ <Modal
43
+ title={__('Installing plugins', 'extendify')}
44
+ isDismissible={false}>
45
+ <Button
46
+ style={{
47
+ width: '100%',
48
+ }}
49
+ disabled
50
+ isPrimary
51
+ isBusy
52
+ onClick={() => {}}>
53
+ {__('Installing...', 'extendify')}
54
+ </Button>
55
+ </Modal>
56
+ )
57
+ }
src/middleware/hasRequiredPlugins/RequiredPluginsModal.js ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __, sprintf } from '@wordpress/i18n'
2
+ import ExtendifyLibrary from '../../ExtendifyLibrary'
3
+ import { Modal, Button, ButtonGroup } from '@wordpress/components'
4
+ import { render } from '@wordpress/element'
5
+ import InstallingModal from './InstallingModal'
6
+ import { useWantedTemplateStore } from '../../state/Importing'
7
+ import { getPluginDescription } from '../../util/general'
8
+ import { useUserStore } from '../../state/User'
9
+ import NeedsPermissionModal from '../NeedsPermissionModal'
10
+
11
+ export default function RequiredPluginsModal({
12
+ forceOpen,
13
+ buttonLabel,
14
+ title,
15
+ message,
16
+ requiredPlugins,
17
+ }) {
18
+ // If there's a template in cache ready to be installed.
19
+ // TODO: this could probably be refactored out when overhauling required plugins
20
+ const wantedTemplate = useWantedTemplateStore(
21
+ (store) => store.wantedTemplate,
22
+ )
23
+ requiredPlugins =
24
+ requiredPlugins ?? wantedTemplate?.fields?.required_plugins
25
+
26
+ const closeModal = () => {
27
+ if (forceOpen) {
28
+ return
29
+ }
30
+ render(
31
+ <ExtendifyLibrary show={true} />,
32
+ document.getElementById('extendify-root'),
33
+ )
34
+ }
35
+ const installPlugins = () =>
36
+ render(
37
+ <InstallingModal requiredPlugins={requiredPlugins} />,
38
+ document.getElementById('extendify-root'),
39
+ )
40
+
41
+ if (!useUserStore.getState()?.canInstallPlugins) {
42
+ return <NeedsPermissionModal />
43
+ }
44
+
45
+ return (
46
+ <Modal
47
+ title={title ?? __('Install required plugins', 'extendify')}
48
+ isDismissible={false}>
49
+ <p
50
+ style={{
51
+ maxWidth: '400px',
52
+ }}>
53
+ {message ??
54
+ __(
55
+ sprintf(
56
+ 'There is just one more step. This %s requires the following to be automatically installed and activated:',
57
+ wantedTemplate?.fields?.type ?? 'template',
58
+ ),
59
+ 'extendify',
60
+ )}
61
+ </p>
62
+ {message?.length > 0 || (
63
+ <ul>
64
+ {
65
+ // Hardcoded temporarily to not force EP install
66
+ // requiredPlugins.map((plugin) =>
67
+ requiredPlugins
68
+ .filter((p) => p !== 'editorplus')
69
+ .map((plugin) => (
70
+ <li key={plugin}>
71
+ {getPluginDescription(plugin)}
72
+ </li>
73
+ ))
74
+ }
75
+ </ul>
76
+ )}
77
+ <ButtonGroup>
78
+ <Button isPrimary onClick={installPlugins}>
79
+ {buttonLabel ?? __('Install Plugins', 'extendify')}
80
+ </Button>
81
+ {forceOpen || (
82
+ <Button
83
+ isTertiary
84
+ onClick={closeModal}
85
+ style={{
86
+ boxShadow: 'none',
87
+ margin: '0 4px',
88
+ }}>
89
+ {__('No thanks, take me back', 'extendify')}
90
+ </Button>
91
+ )}
92
+ </ButtonGroup>
93
+ </Modal>
94
+ )
95
+ }
src/middleware/hasRequiredPlugins/index.js ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { checkIfUserNeedsToInstallPlugins } from '../helpers'
2
+ import RequiredPluginsModal from './RequiredPluginsModal'
3
+ import { render } from '@wordpress/element'
4
+
5
+ export const hasRequiredPlugins = async (template) => {
6
+ return {
7
+ id: 'hasRequiredPlugins',
8
+ pass: !(await checkIfUserNeedsToInstallPlugins(template)),
9
+ allow() {},
10
+ deny() {
11
+ return new Promise(() => {
12
+ render(
13
+ <RequiredPluginsModal />,
14
+ document.getElementById('extendify-root'),
15
+ )
16
+ })
17
+ },
18
+ }
19
+ }
src/middleware/helpers.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Plugins } from '../api/Plugins'
2
+
3
+ let installedPlugins = []
4
+ let activatedPlugins = []
5
+
6
+ export async function checkIfUserNeedsToInstallPlugins(template) {
7
+ let required = template?.fields?.required_plugins ?? []
8
+ // Hardcoded temporarily to not force EP install
9
+ required = required.filter((p) => p !== 'editorplus')
10
+ if (!required.length) {
11
+ return false
12
+ }
13
+
14
+ if (!installedPlugins.length) {
15
+ installedPlugins = Object.keys(await Plugins.getInstalled())
16
+ }
17
+ // if no dependencies are required, then this will be false automatically
18
+ const weNeedInstalls = required.length
19
+ ? required.filter((plugin) => {
20
+ // TODO: if we have better data to work with this can be more literal
21
+ return !installedPlugins.some((k) => {
22
+ return k.includes(plugin)
23
+ })
24
+ })
25
+ : false
26
+
27
+ return weNeedInstalls.length
28
+ }
29
+
30
+ export async function checkIfUserNeedsToActivatePlugins(template) {
31
+ let required = template?.fields?.required_plugins ?? []
32
+
33
+ // Hardcoded temporarily to not force EP install
34
+ required = required.filter((p) => p !== 'editorplus')
35
+ if (!required.length) {
36
+ return false
37
+ }
38
+
39
+ if (!activatedPlugins.length) {
40
+ activatedPlugins = Object.values(await Plugins.getActivated())
41
+ }
42
+
43
+ // if no dependencies are required, then this will be false automatically
44
+ const weNeedActivations = required.length
45
+ ? required.filter((plugin) => {
46
+ // TODO: if we have better data to work with this can be more literal
47
+ return !activatedPlugins.some((k) => {
48
+ return k.includes(plugin)
49
+ })
50
+ })
51
+ : false
52
+
53
+ // if the plugins we need to have activated are not even installed, handle them elsewhere
54
+ if (weNeedActivations) {
55
+ // This call is a bit more expensive so only run it if needed
56
+ if (await checkIfUserNeedsToInstallPlugins(template)) {
57
+ return false
58
+ }
59
+ }
60
+ return weNeedActivations.length
61
+ }
src/middleware/index.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { hasRequiredPlugins } from './hasRequiredPlugins'
2
+ import { hasPluginsActivated } from './hasPluginsActivated'
3
+ import { check as checkNeedsRegistrationModal } from './NeedsRegistrationModal'
4
+
5
+ export const Middleware = (middleware = []) => {
6
+ return {
7
+ hasRequiredPlugins: hasRequiredPlugins,
8
+ hasPluginsActivated: hasPluginsActivated,
9
+ NeedsRegistrationModal: checkNeedsRegistrationModal,
10
+ stack: [],
11
+ async check(template) {
12
+ for (const m of middleware) {
13
+ const cb = await this[`${m}`](template)
14
+ this.stack.push(cb.pass ? cb.allow : cb.deny)
15
+ }
16
+ },
17
+ reset() {
18
+ this.stack = []
19
+ },
20
+ }
21
+ }
22
+
23
+ export async function AuthorizationCheck(middleware) {
24
+ const middlewareGenerator = MiddlewareGenerator(middleware.stack)
25
+ while (true) {
26
+ let result
27
+ try {
28
+ result = await middlewareGenerator.next()
29
+ } catch {
30
+ // Reset the stack and exit the middleware
31
+ // This is used if you want to have the user cancel
32
+ middleware.reset()
33
+ throw 'Middleware exited'
34
+ }
35
+
36
+ // TODO: Could probably have a check for errors here
37
+ if (result.done) {
38
+ break
39
+ }
40
+ }
41
+ }
42
+ export async function* MiddlewareGenerator(middleware) {
43
+ for (const m of middleware) {
44
+ yield await m()
45
+ }
46
+ }
src/pages/GridView.js ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Masonry from 'react-masonry-css'
2
+ import { useEffect, useState, useCallback, useRef } from '@wordpress/element'
3
+ import { Spinner, Button } from '@wordpress/components'
4
+ import { __, sprintf } from '@wordpress/i18n'
5
+ import { useTemplatesStore } from '../state/Templates'
6
+ import { Templates as TemplatesApi } from '../api/Templates'
7
+ import { useInView } from 'react-intersection-observer'
8
+ import { useIsMounted } from '../hooks/helpers'
9
+ import { ImportTemplateBlock } from '../components/ImportTemplateBlock'
10
+
11
+ export default function GridView() {
12
+ const isMounted = useIsMounted()
13
+ const templates = useTemplatesStore((state) => state.templates)
14
+ const appendTemplates = useTemplatesStore((state) => state.appendTemplates)
15
+ const [serverError, setServerError] = useState('')
16
+ const [nothingFound, setNothingFound] = useState(false)
17
+ const [loadMoreRef, inView] = useInView()
18
+ const updateSearchParams = useTemplatesStore(
19
+ (state) => state.updateSearchParams,
20
+ )
21
+ const searchParamsRaw = useTemplatesStore((state) => state.searchParams)
22
+
23
+ // Store the next page in case we have pagination
24
+ const nextPage = useRef(useTemplatesStore.getState().nextPage)
25
+ const searchParams = useRef(useTemplatesStore.getState().searchParams)
26
+ const taxonomyType =
27
+ searchParams.current.type === 'pattern' ? 'patternType' : 'layoutType'
28
+ const currentTax = searchParams.current.taxonomies[taxonomyType]
29
+
30
+ // Connect to the store on mount, disconnect on unmount, catch state-changes in a reference
31
+ useEffect(
32
+ () =>
33
+ useTemplatesStore.subscribe(
34
+ (n) => (nextPage.current = n),
35
+ (state) => state.nextPage,
36
+ ),
37
+ [],
38
+ )
39
+ useEffect(
40
+ () =>
41
+ useTemplatesStore.subscribe(
42
+ (s) => (searchParams.current = s),
43
+ (state) => state.searchParams,
44
+ ),
45
+ [],
46
+ )
47
+
48
+ // Fetch the templates then add them to the current state
49
+ // TODO: This works, but it's not really doing what it's intended to do
50
+ // as it has a side effect in there, and isn't pure.
51
+ // It could be extracted to a hook
52
+ const fetchTemplates = useCallback(async () => {
53
+ setServerError('')
54
+ setNothingFound(false)
55
+ const response = await TemplatesApi.get(searchParams.current, {
56
+ offset: nextPage.current,
57
+ }).catch((error) => {
58
+ console.error(error)
59
+ setServerError(
60
+ error && error.message
61
+ ? error.message
62
+ : __(
63
+ 'Unknown error occured. Check browser console or contact support.',
64
+ 'extendify',
65
+ ),
66
+ )
67
+ })
68
+ if (!isMounted.current) {
69
+ return
70
+ }
71
+ if (response?.error?.length) {
72
+ setServerError(response?.error)
73
+ }
74
+ if (response?.records && searchParamsRaw === searchParams.current) {
75
+ useTemplatesStore.setState({
76
+ nextPage: response.offset,
77
+ })
78
+ appendTemplates(response.records)
79
+ setNothingFound(response.records.length <= 0)
80
+ }
81
+ }, [searchParamsRaw, appendTemplates, isMounted])
82
+
83
+ // This is the main driver for loading templates
84
+ // This loads the initial batch of templates. But if we don't yet have taxonomies.
85
+ // There's also an option to skip loading on first mount
86
+ useEffect(() => {
87
+ if (!Object.keys(searchParams.current.taxonomies).length) {
88
+ return
89
+ }
90
+
91
+ if (useTemplatesStore.getState().skipNextFetch) {
92
+ // This is useful if the templates are fetched already and
93
+ // the library moves to/from another state that re-renders
94
+ // The point is to keep the logic close to the list. That may change someday
95
+ useTemplatesStore.setState({
96
+ skipNextFetch: false,
97
+ })
98
+ return
99
+ }
100
+ // setImagesLoaded([])
101
+ fetchTemplates()
102
+ }, [fetchTemplates, searchParams])
103
+
104
+ // Fetches when the load more is in view
105
+ useEffect(() => {
106
+ inView && fetchTemplates()
107
+ }, [inView, fetchTemplates])
108
+
109
+ if (serverError.length) {
110
+ return (
111
+ <div className="text-left">
112
+ <h2 className="text-left">{__('Server error', 'extendify')}</h2>
113
+ <code
114
+ className="block max-w-xl p-4 mb-4"
115
+ style={{
116
+ minHeight: '10rem',
117
+ }}>
118
+ {serverError}
119
+ </code>
120
+ <Button
121
+ isTertiary
122
+ onClick={() => {
123
+ updateSearchParams({
124
+ taxonomies: {},
125
+ search: '',
126
+ })
127
+ fetchTemplates()
128
+ }}>
129
+ {__('Press here to reload experience')}
130
+ </Button>
131
+ </div>
132
+ )
133
+ }
134
+
135
+ if (nothingFound) {
136
+ return (
137
+ <div className="flex h-full items-center justify-center w-full -mt-2 sm:mt-0">
138
+ <h2 className="text-sm text-extendify-gray font-normal">
139
+ {sprintf(
140
+ searchParams.current.type === 'template'
141
+ ? __(
142
+ 'We couldn\'t find any layouts in the "%s" category.',
143
+ 'extendify',
144
+ )
145
+ : __(
146
+ 'We couldn\'t find any patterns in the "%s" category.',
147
+ 'extendify',
148
+ ),
149
+ currentTax?.title ?? currentTax.slug,
150
+ )}
151
+ </h2>
152
+ </div>
153
+ )
154
+ }
155
+
156
+ if (!templates.length) {
157
+ return (
158
+ <div className="flex h-full items-center justify-center w-full -mt-2 sm:mt-0">
159
+ <Spinner />
160
+ </div>
161
+ )
162
+ }
163
+
164
+ const breakpointColumnsObj = {
165
+ default: 2,
166
+ 1320: 2,
167
+ 860: 1,
168
+ 599: 2,
169
+ 400: 1,
170
+ }
171
+ return (
172
+ <>
173
+ <Masonry
174
+ breakpointCols={breakpointColumnsObj}
175
+ className="flex -ml-6 md:-ml-8 w-auto pb-40 pt-0.5 px-0.5"
176
+ columnClassName="pl-6 md:pl-8 bg-clip-padding min-h-screen">
177
+ {templates.map((template) => {
178
+ return (
179
+ <ImportTemplateBlock
180
+ key={template.id}
181
+ template={template}
182
+ />
183
+ )
184
+ })}
185
+ </Masonry>
186
+ {useTemplatesStore.getState().nextPage && (
187
+ <>
188
+ <div className="transform -translate-y-20">
189
+ <Spinner />
190
+ </div>
191
+ <div
192
+ className="-translate-y-full flex flex-col h-80 items-end justify-end my-2 relative transform z-0 text"
193
+ ref={loadMoreRef}
194
+ style={{ zIndex: -1 }}></div>
195
+ </>
196
+ )}
197
+ </>
198
+ )
199
+ }
src/pages/MainWindow.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Fragment, useRef } from '@wordpress/element'
2
+ import { Dialog, Transition } from '@headlessui/react'
3
+ import { useGlobalStore } from '../state/GlobalState'
4
+ import Layout from './layout/Layout'
5
+ import FooterNotice from '../components/FooterNotice'
6
+
7
+ export default function MainWindow() {
8
+ const containerRef = useRef(null)
9
+ const open = useGlobalStore((state) => state.open)
10
+ const setOpen = useGlobalStore((state) => state.setOpen)
11
+ const ModalStore = useGlobalStore((state) => state.currentModal)
12
+
13
+ return (
14
+ <Transition appear show={open} as={Fragment}>
15
+ <Dialog
16
+ as="div"
17
+ static
18
+ className="extendify"
19
+ initialFocus={containerRef}
20
+ onClose={() => setOpen(false)}>
21
+ <div className="h-screen w-screen sm:h-auto m-auto sm:w-auto fixed z-high inset-0 overflow-y-auto">
22
+ <div className="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
23
+ <Transition.Child
24
+ as={Fragment}
25
+ enter="ease-out duration-300"
26
+ enterFrom="opacity-0"
27
+ enterTo="opacity-100">
28
+ <Dialog.Overlay className="fixed inset-0 bg-black bg-opacity-40 transition-opacity" />
29
+ </Transition.Child>
30
+ <Transition.Child
31
+ as={Fragment}
32
+ enter="ease-out duration-300"
33
+ enterFrom="opacity-0 translate-y-4 sm:translate-y-5"
34
+ enterTo="opacity-100 translate-y-0">
35
+ <div
36
+ ref={containerRef}
37
+ tabIndex="0"
38
+ onClick={(e) =>
39
+ e.target === e.currentTarget &&
40
+ setOpen(false)
41
+ }
42
+ className="fixed lg:absolute inset-0 lg:overflow-hidden transform transition-all p-2 lg:p-16">
43
+ <Layout />
44
+ <FooterNotice />
45
+ {ModalStore}
46
+ </div>
47
+ </Transition.Child>
48
+ </div>
49
+ </div>
50
+ </Dialog>
51
+ </Transition>
52
+ )
53
+ }
src/pages/Sidebar.js ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useTemplatesStore } from '../state/Templates'
2
+ import { Panel } from '@wordpress/components'
3
+ import TaxonomySection from '../components/TaxonomySection'
4
+ import { useTaxonomyStore } from '../state/Taxonomies'
5
+ import SiteTypeSelector from '../components/SiteTypeSelector'
6
+ import { useUserStore } from '../state/User'
7
+ import { ImportCounter } from '../components/ImportCounter'
8
+ import { brandMark } from '../components/icons/'
9
+ import { Icon } from '@wordpress/icons'
10
+ import { featured } from '../components/icons'
11
+ import { __ } from '@wordpress/i18n'
12
+ import classNames from 'classnames'
13
+
14
+ export default function SidebarMain() {
15
+ const taxonomies = useTaxonomyStore((state) => state.taxonomies)
16
+ const searchParams = useTemplatesStore((state) => state.searchParams)
17
+ const updatePreferredSiteType = useUserStore(
18
+ (state) => state.updatePreferredSiteType,
19
+ )
20
+ const updateTaxonomies = useTemplatesStore(
21
+ (state) => state.updateTaxonomies,
22
+ )
23
+ const apiKey = useUserStore((state) => state.apiKey)
24
+ const taxonomyType =
25
+ searchParams.type === 'pattern' ? 'patternType' : 'layoutType'
26
+ const isFeatured = !searchParams?.taxonomies[taxonomyType]?.slug?.length
27
+
28
+ return (
29
+ <>
30
+ <div className="hidden sm:flex px-5 -ml-1.5 text-extendify-black">
31
+ <Icon icon={brandMark} size={40} />
32
+ </div>
33
+ <div className="px-5">
34
+ <button
35
+ onClick={() =>
36
+ updateTaxonomies({
37
+ [taxonomyType]: { slug: '', title: 'Featured' },
38
+ })
39
+ }
40
+ className={classNames(
41
+ 'text-left text-sm cursor-pointer w-full flex items-center px-0 py-2 m-0 leading-none bg-transparent hover:text-wp-theme-500 transition duration-200 button-focus space-x-1',
42
+ { 'text-wp-theme-500': isFeatured },
43
+ )}>
44
+ <Icon icon={featured} size={24} />
45
+ <span className="text-sm">
46
+ {__('Featured', 'extendify')}
47
+ </span>
48
+ </button>
49
+ </div>
50
+ <div className="sm:mb-8 mx-6 sm:mx-0 sm:mt-0 pt-0.5 px-5">
51
+ {Object.keys(taxonomies?.siteType ?? {}).length > 0 && (
52
+ <SiteTypeSelector
53
+ value={searchParams?.taxonomies?.siteType ?? ''}
54
+ setValue={(termData) => {
55
+ updatePreferredSiteType(termData)
56
+ updateTaxonomies({ siteType: termData })
57
+ }}
58
+ terms={taxonomies.siteType}
59
+ />
60
+ )}
61
+ </div>
62
+ <div className="mt-px flex-grow hidden overflow-y-auto pb-32 pt-px sm:block">
63
+ <Panel className="bg-transparent">
64
+ <TaxonomySection
65
+ taxType={taxonomyType}
66
+ taxonomies={taxonomies[taxonomyType]}
67
+ />
68
+ </Panel>
69
+ </div>
70
+ {!apiKey.length && (
71
+ <div className="px-5">
72
+ <ImportCounter />
73
+ </div>
74
+ )}
75
+ </>
76
+ )
77
+ }
src/pages/layout/HasSidebar.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export default function HasSidebar({ children }) {
2
+ return (
3
+ <>
4
+ <aside className="flex-shrink-0 py-0 sm:py-5 relative border-r border-extendify-transparent-black-100 bg-extendify-transparent-white backdrop-filter backdrop-blur-xl backdrop-saturate-200">
5
+ <div className="flex flex-col h-full sm:w-64 py-6 sm:py-0 sm:space-y-6">
6
+ {children[0]}
7
+ </div>
8
+ </aside>
9
+ <main
10
+ id="extendify-templates"
11
+ className="bg-white w-full pt-6 sm:pt-0 h-full overflow-hidden">
12
+ {children[1]}
13
+ </main>
14
+ </>
15
+ )
16
+ }
src/pages/layout/Layout.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n'
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import Sidebar from '../Sidebar'
10
+ import HasSidebar from './HasSidebar'
11
+ import { Toolbar } from './Toolbar'
12
+ import GridView from '../GridView'
13
+
14
+ export default function Layout({ setOpen }) {
15
+ return (
16
+ <div className="h-full flex flex-col items-center relative max-w-screen-4xl mx-auto">
17
+ <div className="w-full flex-grow overflow-hidden">
18
+ <button
19
+ onClick={() =>
20
+ document
21
+ .getElementById('extendify-templates')
22
+ .querySelector('button')
23
+ .focus()
24
+ }
25
+ className="sr-only focus:not-sr-only focus:text-blue-500">
26
+ {__('Skip to content', 'extendify')}
27
+ </button>
28
+ <div className="sm:flex relative mx-auto h-full">
29
+ <HasSidebar>
30
+ <Sidebar />
31
+ <div className="relative h-full z-30 flex flex-col">
32
+ <Toolbar
33
+ className="hidden sm:block w-full h-20 flex-shrink-0 px-6 md:px-8"
34
+ hideLibrary={() => setOpen(false)}
35
+ />
36
+ <div className="flex-grow z-20 overflow-y-auto px-6 md:px-8">
37
+ <GridView />
38
+ </div>
39
+ </div>
40
+ </HasSidebar>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ )
45
+ }
src/pages/layout/Toolbar.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { Icon, close } from '@wordpress/icons'
3
+ import { Button } from '@wordpress/components'
4
+ import { TypeSelect } from '../../components/TypeSelect'
5
+ import { useGlobalStore } from '../../state/GlobalState'
6
+ import { user } from '../../components/icons/'
7
+ import SettingsModal from '../../components/modals/SettingsModal'
8
+ import { useUserStore } from '../../state/User'
9
+
10
+ export const Toolbar = ({ className }) => {
11
+ const setOpen = useGlobalStore((state) => state.setOpen)
12
+ const setCurrentModal = useGlobalStore((state) => state.setCurrentModal)
13
+ const loggedIn = useUserStore((state) => state.apiKey.length)
14
+
15
+ return (
16
+ <div className={className}>
17
+ <div className="flex justify-between items-center h-full">
18
+ <div className="flex-1"></div>
19
+ <TypeSelect className="flex-1 flex items-center justify-center" />
20
+ <div className="flex-1 flex justify-end items-center">
21
+ <Button
22
+ onClick={() =>
23
+ setCurrentModal(
24
+ <SettingsModal
25
+ isOpen={true}
26
+ onClose={() => setCurrentModal(null)}
27
+ />,
28
+ )
29
+ }
30
+ icon={<Icon icon={user} size={24} />}
31
+ label={__('Login and settings area', 'extendify')}>
32
+ {loggedIn ? '' : __('Log In', 'extendify')}
33
+ </Button>
34
+ <Button
35
+ onClick={() => setOpen(false)}
36
+ icon={<Icon icon={close} size={24} />}
37
+ label={__('Close library', 'extendify')}
38
+ />
39
+ </div>
40
+ </div>
41
+ </div>
42
+ )
43
+ }
src/state/GlobalState.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { persist } from 'zustand/middleware'
3
+
4
+ export const useGlobalStore = create(
5
+ persist(
6
+ (set) => ({
7
+ open: false,
8
+ metaData: {},
9
+ // These two are here just to persist their previous values,
10
+ // but could be refactored to be the source instead.
11
+ // It would require a refactor to state/Templates.js
12
+ currentTaxonomies: {},
13
+ currentType: 'pattern',
14
+ settingsModal: false,
15
+ currentModal: null,
16
+ updateCurrentTaxonomies: (data) =>
17
+ set({
18
+ currentTaxonomies: Object.assign({}, data),
19
+ }),
20
+ updateCurrentType: (data) => set({ currentType: data }),
21
+ setOpen: (value) => {
22
+ set({ open: value })
23
+ },
24
+ setCurrentModal: (value) => {
25
+ set({ currentModal: value })
26
+ },
27
+ }),
28
+ {
29
+ name: 'extendify-global-state',
30
+ partialize: (state) => {
31
+ delete state.currentModal
32
+ return state
33
+ },
34
+ },
35
+ ),
36
+ )
src/state/Importing.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { persist } from 'zustand/middleware'
3
+
4
+ export const useWantedTemplateStore = create(
5
+ persist(
6
+ (set) => ({
7
+ wantedTemplate: {},
8
+ importOnLoad: false,
9
+ setWanted: (template) =>
10
+ set({
11
+ wantedTemplate: template,
12
+ }),
13
+ removeWanted: () =>
14
+ set({
15
+ wantedTemplate: {},
16
+ }),
17
+ }),
18
+ {
19
+ name: 'extendify-wanted-template',
20
+ },
21
+ ),
22
+ )
src/state/SiteSettings.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { persist } from 'zustand/middleware'
3
+ import { SiteSettings } from '../api/SiteSettings'
4
+
5
+ const storage = {
6
+ getItem: async () => await SiteSettings.getData(),
7
+ setItem: async (_name, value) => await SiteSettings.setData(value),
8
+ removeItem: () => {},
9
+ }
10
+
11
+ export const useSiteSettingsStore = create(
12
+ persist(
13
+ () => ({
14
+ enabled: true,
15
+ }),
16
+ {
17
+ name: 'extendify-sitesettings',
18
+ getStorage: () => storage,
19
+ },
20
+ ),
21
+ )
src/state/Taxonomies.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { persist } from 'zustand/middleware'
3
+
4
+ export const useTaxonomyStore = create(
5
+ persist(
6
+ (set) => ({
7
+ taxonomies: {},
8
+ setTaxonomies: (taxonomies) => set({ taxonomies }),
9
+ }),
10
+ {
11
+ name: 'extendify-taxonomies',
12
+ },
13
+ ),
14
+ )
src/state/Templates.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { useGlobalStore } from './GlobalState'
3
+ import { useUserStore } from './User'
4
+ import { useTaxonomyStore } from './Taxonomies'
5
+
6
+ const defaultCategoryForType = (tax) =>
7
+ tax === 'siteType'
8
+ ? { slug: '', title: 'Unknown' }
9
+ : { slug: '', title: 'Featured' }
10
+
11
+ export const useTemplatesStore = create((set, get) => ({
12
+ templates: [],
13
+ skipNextFetch: false,
14
+ fetchToken: null,
15
+ taxonomyDefaultState: {},
16
+ nextPage: '',
17
+ searchParams: {
18
+ taxonomies: {},
19
+ type: 'pattern',
20
+ },
21
+ initTemplateData() {
22
+ set({ activeTemplate: {} })
23
+ get().setupDefaultTaxonomies()
24
+ get().updateType(useGlobalStore.getState().currentType)
25
+ },
26
+ appendTemplates: (templates) =>
27
+ set({
28
+ templates: [
29
+ ...new Map(
30
+ [...get().templates, ...templates].map((item) => [
31
+ item.id,
32
+ item,
33
+ ]),
34
+ ).values(),
35
+ ],
36
+ }),
37
+ setupDefaultTaxonomies: () => {
38
+ const taxonomies = useTaxonomyStore.getState().taxonomies
39
+ let taxonomyDefaultState = Object.entries(taxonomies).reduce(
40
+ (state, current) => (
41
+ (state[current[0]] = defaultCategoryForType(current[0])), state
42
+ ),
43
+ {},
44
+ )
45
+ const tax = {}
46
+ let preferredTax =
47
+ useUserStore.getState().preferredOptions?.taxonomies ?? {}
48
+
49
+ // Check for old site type and set it if it exists
50
+ if (preferredTax.tax_categories) {
51
+ preferredTax = get().getLegacySiteType(preferredTax, taxonomies)
52
+ }
53
+ taxonomyDefaultState = Object.assign(
54
+ {},
55
+ taxonomyDefaultState,
56
+
57
+ // Override with the user's preferred taxonomies
58
+ preferredTax,
59
+
60
+ // Override with the global state
61
+ useGlobalStore.getState()?.currentTaxonomies ?? {},
62
+ )
63
+
64
+ tax.taxonomies = Object.assign({}, taxonomyDefaultState)
65
+
66
+ set({
67
+ taxonomyDefaultState: taxonomyDefaultState,
68
+ searchParams: {
69
+ ...Object.assign(get().searchParams, tax),
70
+ },
71
+ })
72
+ },
73
+ updateTaxonomies: (params) => {
74
+ const data = {}
75
+ data.taxonomies = Object.assign(
76
+ {},
77
+ get().searchParams.taxonomies,
78
+ params,
79
+ )
80
+ if (data?.taxonomies?.siteType) {
81
+ // This is what the user "prefers", which may be used outside the library
82
+ // which is persisted to the database, where as the global library state is in local storage
83
+ useUserStore
84
+ .getState()
85
+ .updatePreferredOption('siteType', data?.taxonomies?.siteType)
86
+ }
87
+ useGlobalStore.getState().updateCurrentTaxonomies(data?.taxonomies)
88
+ get().updateSearchParams(data)
89
+ },
90
+ updateType(type) {
91
+ useGlobalStore.getState().updateCurrentType(type)
92
+ get().updateSearchParams({ type })
93
+ },
94
+ updateSearchParams: (params) => {
95
+ // If taxonomies are set to {}, lets use the default
96
+ if (params?.taxonomies && !Object.keys(params.taxonomies).length) {
97
+ params.taxonomies = get().taxonomyDefaultState
98
+ }
99
+
100
+ const searchParams = Object.assign({}, get().searchParams, params)
101
+
102
+ // If the params are the same then don't update
103
+ if (
104
+ JSON.stringify(searchParams) !== JSON.stringify(get().searchParams)
105
+ ) {
106
+ set({
107
+ templates: [],
108
+ nextPage: '',
109
+ searchParams,
110
+ })
111
+ }
112
+ },
113
+ getLegacySiteType: (preferredTax, taxonomies) => {
114
+ const oldSiteType = taxonomies.siteType.find((t) =>
115
+ [t.slug, t?.title].includes(preferredTax.tax_categories),
116
+ )
117
+ // TODO: This is kind of wonky, as we keep track of the state in two places.
118
+ useUserStore.getState().updatePreferredSiteType(oldSiteType)
119
+ get().updateTaxonomies({ siteType: oldSiteType })
120
+ // Remove the legacy term so this only runs once
121
+ useUserStore.getState().updatePreferredOption('tax_categories', null)
122
+ return useUserStore.getState().preferredOptions.taxonomies
123
+ },
124
+ }))
src/state/User.js ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import create from 'zustand'
2
+ import { persist } from 'zustand/middleware'
3
+ import { User } from '../api/User'
4
+
5
+ const storage = {
6
+ getItem: async () => await User.getData(),
7
+ setItem: async (_name, value) => await User.setData(value),
8
+ removeItem: () => {},
9
+ }
10
+
11
+ const isGlobalLibraryEnabled = () =>
12
+ window.extendifyData.sitesettings === null ||
13
+ window.extendifyData?.sitesettings?.state?.enabled
14
+
15
+ export const useUserStore = create(
16
+ persist(
17
+ (set, get) => ({
18
+ firstLoadedOn: new Date().toISOString(),
19
+ email: '',
20
+ apiKey: '',
21
+ imports: 0,
22
+ uuid: '',
23
+ sdkPartner: '',
24
+ registration: {
25
+ email: '',
26
+ optedOut: false,
27
+ },
28
+ noticesDismissedAt: {},
29
+ allowedImports: 0,
30
+ entryPoint: 'not-set',
31
+ enabled: isGlobalLibraryEnabled(),
32
+ canInstallPlugins: false,
33
+ canActivatePlugins: false,
34
+ preferredOptions: {
35
+ taxonomies: {},
36
+ type: '',
37
+ search: '',
38
+ },
39
+ preferredOptionsHistory: {
40
+ siteType: [],
41
+ },
42
+ incrementImports: () => set({ imports: get().imports + 1 }),
43
+ canImport: () =>
44
+ get().apiKey
45
+ ? true
46
+ : Number(get().imports) < Number(get().allowedImports),
47
+ remainingImports: () => {
48
+ if (get().apiKey) {
49
+ return 'unlimited'
50
+ }
51
+ const remaining =
52
+ Number(get().allowedImports) - Number(get().imports)
53
+ return remaining > 0 ? remaining : 0
54
+ },
55
+ updatePreferredSiteType: (value) => {
56
+ get().updatePreferredOption('siteType', value)
57
+ if (!value?.slug || value.slug === 'unknown') return
58
+ const current = get().preferredOptionsHistory?.siteType ?? []
59
+
60
+ // If the site type isn't already included, prepend it
61
+ if (!current.find((t) => t.slug === value.slug)) {
62
+ const siteType = [value, ...current]
63
+ set({
64
+ preferredOptionsHistory: Object.assign(
65
+ {},
66
+ get().preferredOptionsHistory,
67
+ { siteType: siteType.slice(0, 3) },
68
+ ),
69
+ })
70
+ }
71
+ },
72
+ updatePreferredOption: (option, value) => {
73
+ // If the option doesn't exist, assume it's a taxonomy
74
+ if (
75
+ !Object.prototype.hasOwnProperty.call(
76
+ get().preferredOptions,
77
+ option,
78
+ )
79
+ ) {
80
+ value = Object.assign(
81
+ {},
82
+ get().preferredOptions?.taxonomies ?? {},
83
+ { [option]: value },
84
+ )
85
+ option = 'taxonomies'
86
+ }
87
+
88
+ set({
89
+ preferredOptions: {
90
+ ...Object.assign({}, get().preferredOptions, {
91
+ [option]: value,
92
+ }),
93
+ },
94
+ })
95
+ },
96
+ }),
97
+ {
98
+ name: 'extendify-user',
99
+ getStorage: () => storage,
100
+ },
101
+ ),
102
+ )
src/util/general.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { isString, toLower } from 'lodash'
2
+ import { useUserStore } from '../state/User'
3
+
4
+ /**
5
+ * Will check if the given string contains the search string
6
+ *
7
+ * @param {string} string
8
+ * @param {string} searchString
9
+ */
10
+
11
+ export function search(string, searchString) {
12
+ // type validation
13
+ if (!isString(string) || !isString(searchString)) {
14
+ return false
15
+ }
16
+
17
+ // changing case
18
+ string = toLower(string)
19
+ searchString = toLower(searchString)
20
+
21
+ // comparing
22
+ return -1 !== searchString.indexOf(string) ? true : false
23
+ }
24
+
25
+ export const openModal = (source) => setModalVisibility(source, 'open')
26
+ // export const closeModal = () => setModalVisibility('', 'close')
27
+ export function setModalVisibility(source = 'broken-event', state = 'open') {
28
+ useUserStore.setState({
29
+ entryPoint: source,
30
+ })
31
+ window.dispatchEvent(
32
+ new CustomEvent(`extendify::${state}-library`, {
33
+ detail: source,
34
+ bubbles: true,
35
+ }),
36
+ )
37
+ }
38
+
39
+ export function getPluginDescription(plugin) {
40
+ switch (plugin) {
41
+ case 'editorplus':
42
+ return 'Editor Plus'
43
+ case 'ml-slider':
44
+ return 'MetaSlider'
45
+ }
46
+ return plugin
47
+ }
48
+
49
+ export function getTaxonomyName(key) {
50
+ switch (key) {
51
+ case 'siteType':
52
+ return 'Site Type'
53
+ case 'patternType':
54
+ return 'Content'
55
+ case 'layoutType':
56
+ return 'Page Types'
57
+ }
58
+ }
src/util/templateInjection.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { dispatch, select } from '@wordpress/data'
2
+
3
+ export function injectTemplateBlocks(blocks, templateRaw) {
4
+ const { insertBlocks, replaceBlock } = dispatch('core/block-editor')
5
+ const {
6
+ getSelectedBlock,
7
+ getBlockHierarchyRootClientId,
8
+ getBlockIndex,
9
+ getGlobalBlockCount,
10
+ } = select('core/block-editor')
11
+
12
+ const { clientId, name, attributes } = getSelectedBlock() || {}
13
+ const rootClientId = clientId ? getBlockHierarchyRootClientId(clientId) : ''
14
+ const insertPointIndex =
15
+ (rootClientId ? getBlockIndex(rootClientId) : getGlobalBlockCount()) + 1
16
+
17
+ const injectblock = () =>
18
+ name === 'core/paragraph' && attributes?.content === ''
19
+ ? replaceBlock(clientId, blocks)
20
+ : insertBlocks(blocks, insertPointIndex)
21
+
22
+ return injectblock().then(() =>
23
+ window.dispatchEvent(
24
+ new CustomEvent('extendify::template-inserted', {
25
+ detail: {
26
+ template: templateRaw,
27
+ },
28
+ bubbles: true,
29
+ }),
30
+ ),
31
+ )
32
+ }
src/utility-control/index.js ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __ } from '@wordpress/i18n'
2
+ import { InspectorAdvancedControls } from '@wordpress/block-editor'
3
+ import { createHigherOrderComponent } from '@wordpress/compose'
4
+ import { addFilter } from '@wordpress/hooks'
5
+ import { FormTokenField } from '@wordpress/components'
6
+
7
+ import suggestions from '../../utility-framework/suggestions.json'
8
+
9
+ function addAttributes(settings) {
10
+ // Add new extUtilities attribute to block settings.
11
+ return {
12
+ ...settings,
13
+ attributes: {
14
+ ...settings.attributes,
15
+ extUtilities: {
16
+ type: 'array',
17
+ default: [],
18
+ },
19
+ },
20
+ }
21
+ }
22
+
23
+ function addEditProps(settings) {
24
+ const existingGetEditWrapperProps = settings.getEditWrapperProps
25
+ settings.getEditWrapperProps = (attributes) => {
26
+ let props = {}
27
+
28
+ if (existingGetEditWrapperProps) {
29
+ props = existingGetEditWrapperProps(attributes)
30
+ }
31
+
32
+ return addSaveProps(props, settings, attributes)
33
+ }
34
+
35
+ return settings
36
+ }
37
+
38
+ // Create HOC to add Extendify Utility to Advanced Panel of block.
39
+ const utilityClassEdit = createHigherOrderComponent((BlockEdit) => {
40
+ return function editPanel(props) {
41
+ const { extUtilities: classes } = props.attributes
42
+ const suggestionList = suggestions.suggestions.map((s) => {
43
+ // Remove all extra // and . from classnames
44
+ return s.replace('.', '').replace(new RegExp('\\\\', 'g'), '')
45
+ })
46
+
47
+ return (
48
+ <>
49
+ <BlockEdit {...props} />
50
+ {classes && (
51
+ <InspectorAdvancedControls>
52
+ <FormTokenField
53
+ label={__('Extendify Utilities', 'extendify')}
54
+ tokenizeOnSpace={true}
55
+ value={classes}
56
+ suggestions={suggestionList}
57
+ onChange={(value) => {
58
+ props.setAttributes({
59
+ extUtilities: value,
60
+ })
61
+ }}
62
+ />
63
+ </InspectorAdvancedControls>
64
+ )}
65
+ </>
66
+ )
67
+ }
68
+ }, 'utilityClassEdit')
69
+
70
+ function addSaveProps(saveElementProps, blockType, attributes) {
71
+ let { className: generatedClasses } = saveElementProps
72
+ let { extUtilities: classes, className: additionalClasses } = attributes
73
+
74
+ if (!classes || !Object.keys(classes).length) {
75
+ return saveElementProps
76
+ }
77
+
78
+ // EK seems to be converting string values to objects in some situations
79
+ const normalizeAsArray = (item) => {
80
+ switch (Object.prototype.toString.call(item)) {
81
+ case '[object String]':
82
+ return item.split(' ')
83
+ case '[object Array]':
84
+ return item
85
+ default:
86
+ return []
87
+ }
88
+ }
89
+ const classesCombined = new Set([
90
+ ...normalizeAsArray(additionalClasses),
91
+ ...normalizeAsArray(generatedClasses),
92
+ ...normalizeAsArray(classes),
93
+ ])
94
+
95
+ return Object.assign({}, saveElementProps, {
96
+ className: [...classesCombined].join(' '),
97
+ })
98
+ }
99
+
100
+ addFilter(
101
+ 'blocks.registerBlockType',
102
+ 'extendify/utilities/attributes',
103
+ addAttributes,
104
+ )
105
+
106
+ addFilter(
107
+ 'blocks.registerBlockType',
108
+ 'extendify/utilities/addEditProps',
109
+ addEditProps,
110
+ )
111
+
112
+ addFilter(
113
+ 'editor.BlockEdit',
114
+ 'extendify/utilities/advancedClassControls',
115
+ utilityClassEdit,
116
+ )
117
+
118
+ addFilter(
119
+ 'blocks.getSaveContent.extraProps',
120
+ 'extendify/utilities/extra-props',
121
+ addSaveProps,
122
+ )
utility-framework/block-styles/cover-angled.css ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .is-style-angled {
2
+ /* no suggestion */
3
+ @apply ext-items-center ext-justify-end;
4
+ }
5
+
6
+ .is-style-angled .wp-block-cover__image-background,
7
+ .is-style-angled .wp-block-cover__video-background {
8
+ /* no suggestion */
9
+ clip-path: polygon(0 0, 30% 0%, 50% 100%, 0% 100%);
10
+ z-index: 1;
11
+ }
12
+
13
+ @screen tablet {
14
+ .is-style-angled .wp-block-cover__image-background,
15
+ .is-style-angled .wp-block-cover__video-background {
16
+ /* no suggestion */
17
+ clip-path: polygon(0 0, 55% 0%, 65% 100%, 0% 100%);
18
+ }
19
+ }
utility-framework/classes/clip-path.css ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ .clip-path--rhombus img {
2
+ clip-path: polygon(15% 6%, 80% 29%, 84% 93%, 23% 69%);
3
+ }
4
+
5
+ .clip-path--diamond img {
6
+ clip-path: polygon(5% 29%, 60% 2%, 91% 64%, 36% 89%);
7
+ }
8
+
9
+ .clip-path--rhombus-alt img {
10
+ clip-path: polygon(14% 9%, 85% 24%, 91% 89%, 19% 76%);
11
+ }
utility-framework/classes/columns.css ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ The .ext utility is a top-level class that we use to target contents within our patterns.
3
+ We use it here to ensure columns blocks display well across themes.
4
+ */
5
+ .wp-block-columns[class*="fullwidth-cols"] {
6
+ /* no suggestion */
7
+ margin-bottom: unset;
8
+ }
9
+
10
+ /* Some popular themes use padding instead of core's margin for columns; remove it */
11
+ .ext .wp-block-columns .wp-block-column[style*="padding"] {
12
+ /* no suggestion */
13
+ @apply ext-px-0 !important;
14
+ }
15
+
16
+ /* Some popular themes add double spacing between columns; remove it */
17
+ .ext
18
+ .wp-block-columns
19
+ + .wp-block-columns:not([class*="mt-"]):not([class*="my-"]) {
20
+ /* no suggestion */
21
+ @apply ext-mt-0 !important;
22
+ }
23
+
24
+ [class*="fullwidth-cols"] .wp-block-column:first-child,
25
+ [class*="fullwidth-cols"] .wp-block-group:first-child {
26
+ /* no suggestion */
27
+ @apply ext-mt-0;
28
+ }
29
+
30
+ [class*="fullwidth-cols"] .wp-block-column:last-child,
31
+ [class*="fullwidth-cols"] .wp-block-group:last-child {
32
+ /* no suggestion */
33
+ @apply ext-mb-0;
34
+ }
35
+
36
+ [class*="fullwidth-cols"] .wp-block-column:first-child > * {
37
+ /* no suggestion */
38
+ @apply ext-mt-0;
39
+ }
40
+
41
+ [class*="fullwidth-cols"] .wp-block-column > *:first-child {
42
+ /* no suggestion */
43
+ @apply ext-mt-0;
44
+ }
45
+
46
+ [class*="fullwidth-cols"] .wp-block-column > *:last-child {
47
+ /* no suggestion */
48
+ @apply ext-mb-0;
49
+ }
50
+
51
+ .ext .is-not-stacked-on-mobile .wp-block-column {
52
+ /* no suggestion */
53
+ @apply ext-mb-0;
54
+ }
55
+
56
+ /* Add base margin bottom to all columns */
57
+ .wp-block-columns[class*="fullwidth-cols"]:not(.is-not-stacked-on-mobile)
58
+ > .wp-block-column:not(:last-child) {
59
+ /* no suggestion */
60
+ @apply ext-mb-base;
61
+ }
62
+
63
+ @screen tablet {
64
+ .wp-block-columns[class*="fullwidth-cols"]:not(.is-not-stacked-on-mobile)
65
+ > .wp-block-column:not(:last-child) {
66
+ /* no suggestion */
67
+ @apply ext-mb-0;
68
+ }
69
+ }
70
+
71
+ /* Remove margin bottom from "not-stacked" columns */
72
+ .wp-block-columns[class*="fullwidth-cols"].is-not-stacked-on-mobile
73
+ > .wp-block-column {
74
+ /* no suggestion */
75
+ @apply ext-mb-0 !important;
76
+ }
77
+
78
+ @media (min-width: 600px) and (max-width: 781px) {
79
+ .wp-block-columns[class*="fullwidth-cols"]:not(.is-not-stacked-on-mobile)
80
+ > .wp-block-column:nth-child(even) {
81
+ /* no suggestion */
82
+ margin-left: var(--wp--style--block-gap, 2em);
83
+ }
84
+ }
85
+
86
+ /*
87
+ The `tablet:fullwidth-cols` and `desktop:fullwidth-cols` utilities are used
88
+ to counter the core/columns responsive for at our breakpoints.
89
+ */
90
+ @media (max-width: 781px) {
91
+ .tablet\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile) {
92
+ @apply ext-flex-wrap;
93
+ }
94
+
95
+ .tablet\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)
96
+ > .wp-block-column {
97
+ @apply ext-ml-0 !important;
98
+ flex-basis: 100% !important; /* Required to negate core/columns flex-basis */
99
+ }
100
+ }
101
+
102
+ @media (max-width: 1079px) {
103
+ .desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile) {
104
+ @apply ext-flex-wrap;
105
+ }
106
+
107
+ .desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)
108
+ > .wp-block-column {
109
+ @apply ext-ml-0 !important;
110
+ flex-basis: 100% !important; /* Required to negate core/columns flex-basis */
111
+ }
112
+
113
+ .desktop\:fullwidth-cols.wp-block-columns:not(.is-not-stacked-on-mobile)
114
+ > .wp-block-column:not(:last-child) {
115
+ @apply ext-mb-base !important;
116
+ }
117
+ }
utility-framework/classes/direction.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ .direction-rtl {
2
+ direction: rtl;
3
+ }
4
+
5
+ .direction-ltr {
6
+ direction: ltr;
7
+ }
utility-framework/classes/editor/no-caption.css ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .editor\:no-caption .block-editor-rich-text__editable {
2
+ display: none !important;
3
+ }
utility-framework/classes/editor/no-inserter.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ .editor\:no-inserter > .block-list-appender,
2
+ .editor\:no-inserter .wp-block-group__inner-container > .block-list-appender {
3
+ display: none;
4
+ }
5
+ .editor\:no-inserter .wp-block-cover__inner-container > .block-list-appender {
6
+ display: none;
7
+ }
8
+ .editor\:no-inserter .wp-block-column:not(.is-selected) > .block-list-appender {
9
+ display: none;
10
+ }
utility-framework/classes/editor/no-resize.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ .editor\:no-resize .components-resizable-box__handle::after,
2
+ .editor\:no-resize .components-resizable-box__side-handle::before,
3
+ .editor\:no-resize .components-resizable-box__handle {
4
+ display: none;
5
+ pointer-events: none;
6
+ }
7
+
8
+ .editor\:no-resize .components-resizable-box__container {
9
+ display: block;
10
+ }
utility-framework/classes/editor/pointer-events.css ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .editor\:pointer-events-none {
2
+ pointer-events: none;
3
+ }
utility-framework/classes/fallback.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /* Ensure image block display is standardized */
2
+ .ext .wp-block-image {
3
+ /* no suggestion */
4
+ @apply ext-relative ext-text-center;
5
+ }
6
+
7
+ .ext .wp-block-image img {
8
+ /* no suggestion */
9
+ @apply ext-inline-block ext-align-middle;
10
+ }
utility-framework/classes/inline-list.css ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Use "is-style-" prefix to support adding this style to the core/list block */
2
+ .is-style-inline-list {
3
+ @apply ext-pl-0 !important;
4
+ }
5
+
6
+ .is-style-inline-list li {
7
+ /* no suggestion */
8
+ @apply ext-list-none tablet:ext-inline tablet:ext-mr-base !important;
9
+ }
10
+
11
+ .is-style-inline-list li:first-child {
12
+ /* no suggestion */
13
+ @apply tablet:ext-ml-0 !important;
14
+ }
15
+
16
+ .is-style-inline-list li:last-child {
17
+ /* no suggestion */
18
+ @apply tablet:ext-mr-0 !important;
19
+ }
utility-framework/classes/misc.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ .bring-to-front {
2
+ position: relative;
3
+ z-index: 10;
4
+ }
utility-framework/classes/text-stroke.css ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .text-stroke {
2
+ -webkit-text-stroke-width: var(
3
+ --wp--custom--typography--text-stroke-width,
4
+ 2px
5
+ );
6
+ -webkit-text-stroke-color: var(--wp--preset--color--background);
7
+ }
8
+
9
+ .text-stroke--primary {
10
+ -webkit-text-stroke-width: var(
11
+ --wp--custom--typography--text-stroke-width,
12
+ 2px
13
+ );
14
+ -webkit-text-stroke-color: var(--wp--preset--color--primary);
15
+ }
16
+
17
+ .text-stroke--secondary {
18
+ -webkit-text-stroke-width: var(
19
+ --wp--custom--typography--text-stroke-width,
20
+ 2px
21
+ );
22
+ -webkit-text-stroke-color: var(--wp--preset--color--secondary);
23
+ }
utility-framework/extendify-utilities.css ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "tailwindcss/base";
2
+ @import "tailwindcss/components";
3
+ @import "tailwindcss/utilities";
4
+
5
+ @import "./classes/clip-path";
6
+ @import "./classes/columns";
7
+ @import "./classes/direction";
8
+ @import "./classes/inline-list";
9
+ @import "./classes/misc";
10
+ @import "./classes/text-stroke";
11
+
12
+ @import "./classes/editor/no-caption";
13
+ @import "./classes/editor/no-inserter";
14
+ @import "./classes/editor/no-resize";
15
+ @import "./classes/editor/pointer-events";
16
+
17
+ @import "./block-styles/cover-angled";
18
+
19
+ @import "./fallback/align";
20
+ @import "./fallback/colors";
21
+ @import "./fallback/font-sizes";
22
+ @import "./fallback/grid";
23
+ @import "./fallback/group";
24
+ @import "./fallback/image";
25
+
26
+ body {
27
+ /* no suggestion */
28
+ /* We need to abstract this out of tailwind.config because clamp doesnt translate with negative margins */
29
+ --extendify--spacing--large: var(
30
+ --wp--custom--spacing--large,
31
+ clamp(2em, 8vw, 8em)
32
+ );
33
+
34
+ /* Add pattern preset font sizes */
35
+ --wp--preset--font-size--ext-small: 1rem;
36
+ --wp--preset--font-size--ext-medium: clamp(1.5rem, 2vw, 2rem);
37
+ --wp--preset--font-size--ext-large: clamp(2.25rem, 4vw, 3.75rem);
38
+ --wp--preset--font-size--ext-x-large: clamp(3rem, 6vw, 4.75rem);
39
+ --wp--preset--font-size--ext-gigantic: clamp(3.25rem, 7.5vw, 5.75rem);
40
+ }
41
+
42
+ /* Astra */
43
+ .ast-separate-container .ext .block-editor-block-list__layout {
44
+ /* no suggestion */
45
+ @apply ext-p-0 !important;
46
+ }
47
+
48
+ /* Astra: Remove spacer block visuals in the library */
49
+ .block-editor-block-preview__content-iframe
50
+ .ext
51
+ [data-type="core/spacer"]
52
+ .components-resizable-box__container {
53
+ /* no suggestion */
54
+ background: transparent !important;
55
+ }
56
+
57
+ .block-editor-block-preview__content-iframe
58
+ .ext
59
+ [data-type="core/spacer"]
60
+ .block-library-spacer__resize-container::before {
61
+ /* no suggestion */
62
+ display: none !important;
63
+ }
64
+
65
+ /* Twenty Twenty One */
66
+ .ext [data-block].wp-block-buttons .wp-block-button {
67
+ @apply ext-my-0;
68
+ }
69
+
70
+ .ext [data-block].wp-block-buttons .wp-block-button:first-child {
71
+ /* no suggestion */
72
+ @apply ext-mt-0 ext-mb-base !important;
73
+ }
74
+
75
+ /* Twenty Twenty adds a lot of margin automatically to blocks. We only want our own margin added to our patterns. */
76
+ .ext .wp-block-group__inner-container figure.wp-block-gallery.alignfull {
77
+ /* no suggestion */
78
+ margin-top: unset;
79
+ margin-bottom: unset;
80
+ }
81
+
82
+ /* Ensure no funky business is assigned to alignwide */
83
+ .ext .alignwide {
84
+ /* no suggestion */
85
+ @apply ext-mx-auto !important;
86
+ }
utility-framework/fallback/align.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /* Remove odd spacing some themes may apply to inner blocks */
2
+ .ext .wp-block[data-align="wide"] {
3
+ /* no suggestion */
4
+ @apply ext-my-0 !important;
5
+ }
utility-framework/fallback/colors.css ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .has-foreground-color {
2
+ /* no suggestion */
3
+ color: var(--wp--preset--color--foreground, #000) !important;
4
+ }
5
+
6
+ .has-foreground-background-color {
7
+ /* no suggestion */
8
+ background-color: var(--wp--preset--color--foreground, #000) !important;
9
+ }
10
+
11
+ .has-background-color {
12
+ /* no suggestion */
13
+ color: var(--wp--preset--color--background, #fff) !important;
14
+ }
15
+
16
+ .has-background-background-color {
17
+ /* no suggestion */
18
+ background-color: var(--wp--preset--color--background, #fff) !important;
19
+ }
20
+
21
+ .has-primary-color {
22
+ /* no suggestion */
23
+ color: var(--wp--preset--color--primary, #4b5563) !important;
24
+ }
25
+
26
+ .has-primary-background-color {
27
+ /* no suggestion */
28
+ background-color: var(--wp--preset--color--primary, #4b5563) !important;
29
+ }
30
+
31
+ .has-secondary-color {
32
+ /* no suggestion */
33
+ color: var(--wp--preset--color--secondary, #9ca3af) !important;
34
+ }
35
+
36
+ .has-secondary-background-color {
37
+ /* no suggestion */
38
+ background-color: var(--wp--preset--color--secondary, #9ca3af) !important;
39
+ }
40
+
41
+ /* Ensure themes that target specific elements use the right colors */
42
+ .ext.has-text-color p,
43
+ .ext.has-text-color h1,
44
+ .ext.has-text-color h2,
45
+ .ext.has-text-color h3,
46
+ .ext.has-text-color h4,
47
+ .ext.has-text-color h5,
48
+ .ext.has-text-color h6 {
49
+ /* no suggestion */
50
+ color: currentColor;
51
+ }
utility-framework/fallback/font-sizes.css ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .has-gigantic-font-size,
2
+ .editor-styles-wrapper .has-gigantic-font-size.wp-block {
3
+ /* no suggestion */
4
+ /* Have to be specific for how Neve targets headings */
5
+ --fallback-size: clamp(
6
+ var(--wp--preset--font-size--huge, 22px),
7
+ calc(1rem + var(--wp--custom--typography--gigantic--preferred, 5vw)),
8
+ var(--wp--preset--font-size--huge, 42px) * 2
9
+ );
10
+ font-size: var(--wp--preset--font-size--gigantic, var(--fallback-size));
11
+ }
12
+
13
+ .has-ext-small-font-size {
14
+ /* no suggestion */
15
+ font-size: var(--wp--preset--font-size--ext-small) !important;
16
+ }
17
+
18
+ .has-ext-medium-font-size {
19
+ /* no suggestion */
20
+ font-size: var(--wp--preset--font-size--ext-medium) !important;
21
+ }
22
+
23
+ .has-ext-large-font-size {
24
+ /* no suggestion */
25
+ font-size: var(--wp--preset--font-size--ext-large) !important;
26
+ }
27
+
28
+ .has-ext-x-large-font-size {
29
+ /* no suggestion */
30
+ font-size: var(--wp--preset--font-size--ext-x-large) !important;
31
+ }
32
+
33
+ .has-ext-gigantic-font-size {
34
+ /* no suggestion */
35
+ font-size: var(--wp--preset--font-size--ext-gigantic) !important;
36
+ }
utility-framework/fallback/grid.css ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Classic themes use an inner [class*="_inner-container"] that our utilities cannot directly target, so we need to do so with a few */
2
+ .ext .ext-grid > [class*="_inner-container"] {
3
+ /* no suggestion */
4
+ display: grid;
5
+ }
6
+
7
+ /* Unhinge grid for container blocks in classic themes, and < 5.9 */
8
+ .ext > [class*="_inner-container"] > .ext-grid:not([class*="columns"]),
9
+ .ext
10
+ > [class*="_inner-container"]
11
+ > .wp-block
12
+ > .ext-grid:not([class*="columns"]) {
13
+ /* no suggestion */
14
+ display: initial !important;
15
+ }
16
+
17
+ /* Grid Columns */
18
+ .ext .ext-grid-cols-1 > [class*="_inner-container"] {
19
+ /* no suggestion */
20
+ grid-template-columns: repeat(1, minmax(0, 1fr)) !important;
21
+ }
22
+
23
+ .ext .ext-grid-cols-2 > [class*="_inner-container"] {
24
+ /* no suggestion */
25
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
26
+ }
27
+
28
+ .ext .ext-grid-cols-3 > [class*="_inner-container"] {
29
+ /* no suggestion */
30
+ grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
31
+ }
32
+
33
+ .ext .ext-grid-cols-4 > [class*="_inner-container"] {
34
+ /* no suggestion */
35
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
36
+ }
37
+
38
+ .ext .ext-grid-cols-5 > [class*="_inner-container"] {
39
+ /* no suggestion */
40
+ grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
41
+ }
42
+
43
+ .ext .ext-grid-cols-6 > [class*="_inner-container"] {
44
+ /* no suggestion */
45
+ grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
46
+ }
47
+
48
+ .ext .ext-grid-cols-7 > [class*="_inner-container"] {
49
+ /* no suggestion */
50
+ grid-template-columns: repeat(7, minmax(0, 1fr)) !important;
51
+ }
52
+
53
+ .ext .ext-grid-cols-8 > [class*="_inner-container"] {
54
+ /* no suggestion */
55
+ grid-template-columns: repeat(8, minmax(0, 1fr)) !important;
56
+ }
57
+
58
+ .ext .ext-grid-cols-9 > [class*="_inner-container"] {
59
+ /* no suggestion */
60
+ grid-template-columns: repeat(9, minmax(0, 1fr)) !important;
61
+ }
62
+
63
+ .ext .ext-grid-cols-10 > [class*="_inner-container"] {
64
+ /* no suggestion */
65
+ grid-template-columns: repeat(10, minmax(0, 1fr)) !important;
66
+ }
67
+
68
+ .ext .ext-grid-cols-11 > [class*="_inner-container"] {
69
+ /* no suggestion */
70
+ grid-template-columns: repeat(11, minmax(0, 1fr)) !important;
71
+ }
72
+
73
+ .ext .ext-grid-cols-12 > [class*="_inner-container"] {
74
+ /* no suggestion */
75
+ grid-template-columns: repeat(12, minmax(0, 1fr)) !important;
76
+ }
77
+
78
+ .ext .ext-grid-cols-13 > [class*="_inner-container"] {
79
+ /* no suggestion */
80
+ grid-template-columns: repeat(13, minmax(0, 1fr)) !important;
81
+ }
82
+
83
+ .ext .ext-grid-cols-none > [class*="_inner-container"] {
84
+ /* no suggestion */
85
+ grid-template-columns: none !important;
86
+ }
87
+
88
+ /* Grid Rows */
89
+ .ext .ext-grid-rows-1 > [class*="_inner-container"] {
90
+ /* no suggestion */
91
+ grid-template-rows: repeat(1, minmax(0, 1fr)) !important;
92
+ }
93
+
94
+ .ext .ext-grid-rows-2 > [class*="_inner-container"] {
95
+ /* no suggestion */
96
+ grid-template-rows: repeat(2, minmax(0, 1fr)) !important;
97
+ }
98
+
99
+ .ext .ext-grid-rows-3 > [class*="_inner-container"] {
100
+ /* no suggestion */
101
+ grid-template-rows: repeat(3, minmax(0, 1fr)) !important;
102
+ }
103
+
104
+ .ext .ext-grid-rows-4 > [class*="_inner-container"] {
105
+ /* no suggestion */
106
+ grid-template-rows: repeat(4, minmax(0, 1fr)) !important;
107
+ }
108
+
109
+ .ext .ext-grid-rows-5 > [class*="_inner-container"] {
110
+ /* no suggestion */
111
+ grid-template-rows: repeat(5, minmax(0, 1fr)) !important;
112
+ }
113
+
114
+ .ext .ext-grid-rows-6 > [class*="_inner-container"] {
115
+ /* no suggestion */
116
+ grid-template-rows: repeat(6, minmax(0, 1fr)) !important;
117
+ }
118
+
119
+ .ext .ext-grid-rows-none > [class*="_inner-container"] {
120
+ /* no suggestion */
121
+ grid-template-rows: none !important;
122
+ }
123
+
124
+ /* Align */
125
+ .ext .ext-items-start > [class*="_inner-container"] {
126
+ align-items: flex-start !important;
127
+ }
128
+
129
+ .ext .ext-items-end > [class*="_inner-container"] {
130
+ align-items: flex-end !important;
131
+ }
132
+
133
+ .ext .ext-items-center > [class*="_inner-container"] {
134
+ align-items: center !important;
135
+ }
136
+
137
+ .ext .ext-items-baseline > [class*="_inner-container"] {
138
+ align-items: baseline !important;
139
+ }
140
+
141
+ .ext .ext-items-stretch > [class*="_inner-container"] {
142
+ align-items: stretch !important;
143
+ }
utility-framework/fallback/group.css ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .ext.wp-block-group > *:last-child {
2
+ /* no suggestion */
3
+ @apply ext-mb-0;
4
+ }
5
+
6
+ /* For <5.9 */
7
+ .ext .wp-block-group__inner-container {
8
+ /* no suggestion */
9
+ @apply ext-p-0 !important;
10
+ }
11
+
12
+ .ext.has-background {
13
+ /* no suggestion */
14
+ @apply ext-px-base;
15
+ }
16
+
17
+ /* Fallback for classic theme group blocks */
18
+ .ext *[class*="inner-container"] > .alignwide *[class*="inner-container"],
19
+ .ext
20
+ *[class*="inner-container"]
21
+ > [data-align="wide"]
22
+ *[class*="inner-container"] {
23
+ /* no suggestion */
24
+ max-width: var(--responsive--alignwide-width, 120rem);
25
+ }
26
+
27
+ .ext *[class*="inner-container"] > .alignwide *[class*="inner-container"] > *,
28
+ .ext
29
+ *[class*="inner-container"]
30
+ > [data-align="wide"]
31
+ *[class*="inner-container"]
32
+ > * {
33
+ /* no suggestion */
34
+ @apply ext-max-w-full !important;
35
+ }
36
+
37
+ .ext *[class*="inner-container"] > .alignfull *[class*="inner-container"],
38
+ .ext
39
+ *[class*="inner-container"]
40
+ > [data-align="full"]
41
+ *[class*="inner-container"] {
42
+ /* no suggestion */
43
+ @apply ext-max-w-full;
44
+ }
45
+
46
+ .ext *[class*="inner-container"] > .alignfull *[class*="inner-container"] > *,
47
+ .ext
48
+ *[class*="inner-container"]
49
+ > [data-align="full"]
50
+ *[class*="inner-container"]
51
+ > * {
52
+ /* no suggestion */
53
+ @apply ext-max-w-full !important;
54
+ }
utility-framework/fallback/image.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /* Ensure image block display is standardized */
2
+ .ext .wp-block-image {
3
+ /* no suggestion */
4
+ @apply ext-relative ext-text-center;
5
+ }
6
+
7
+ .ext .wp-block-image img {
8
+ /* no suggestion */
9
+ @apply ext-inline-block ext-align-middle;
10
+ }
utility-framework/suggestions.json ADDED
@@ -0,0 +1,570 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "notes": "This file is generated in webpack.mix.js. Do not edit directly.",
3
+ "suggestions": [
4
+ "ext-absolute",
5
+ "ext-relative",
6
+ "ext-top-base",
7
+ "ext-top-lg",
8
+ "ext--top-base",
9
+ "ext--top-lg",
10
+ "ext-right-base",
11
+ "ext-right-lg",
12
+ "ext--right-base",
13
+ "ext--right-lg",
14
+ "ext-bottom-base",
15
+ "ext-bottom-lg",
16
+ "ext--bottom-base",
17
+ "ext--bottom-lg",
18
+ "ext-left-base",
19
+ "ext-left-lg",
20
+ "ext--left-base",
21
+ "ext--left-lg",
22
+ "ext-order-1",
23
+ "ext-order-2",
24
+ "ext-col-auto",
25
+ "ext-col-span-1",
26
+ "ext-col-span-2",
27
+ "ext-col-span-3",
28
+ "ext-col-span-4",
29
+ "ext-col-span-5",
30
+ "ext-col-span-6",
31
+ "ext-col-span-7",
32
+ "ext-col-span-8",
33
+ "ext-col-span-9",
34
+ "ext-col-span-10",
35
+ "ext-col-span-11",
36
+ "ext-col-span-12",
37
+ "ext-col-span-full",
38
+ "ext-col-start-1",
39
+ "ext-col-start-2",
40
+ "ext-col-start-3",
41
+ "ext-col-start-4",
42
+ "ext-col-start-5",
43
+ "ext-col-start-6",
44
+ "ext-col-start-7",
45
+ "ext-col-start-8",
46
+ "ext-col-start-9",
47
+ "ext-col-start-10",
48
+ "ext-col-start-11",
49
+ "ext-col-start-12",
50
+ "ext-col-start-13",
51
+ "ext-col-start-auto",
52
+ "ext-col-end-1",
53
+ "ext-col-end-2",
54
+ "ext-col-end-3",
55
+ "ext-col-end-4",
56
+ "ext-col-end-5",
57
+ "ext-col-end-6",
58
+ "ext-col-end-7",
59
+ "ext-col-end-8",
60
+ "ext-col-end-9",
61
+ "ext-col-end-10",
62
+ "ext-col-end-11",
63
+ "ext-col-end-12",
64
+ "ext-col-end-13",
65
+ "ext-col-end-auto",
66
+ "ext-row-auto",
67
+ "ext-row-span-1",
68
+ "ext-row-span-2",
69
+ "ext-row-span-3",
70
+ "ext-row-span-4",
71
+ "ext-row-span-5",
72
+ "ext-row-span-6",
73
+ "ext-row-span-full",
74
+ "ext-row-start-1",
75
+ "ext-row-start-2",
76
+ "ext-row-start-3",
77
+ "ext-row-start-4",
78
+ "ext-row-start-5",
79
+ "ext-row-start-6",
80
+ "ext-row-start-7",
81
+ "ext-row-start-auto",
82
+ "ext-row-end-1",
83
+ "ext-row-end-2",
84
+ "ext-row-end-3",
85
+ "ext-row-end-4",
86
+ "ext-row-end-5",
87
+ "ext-row-end-6",
88
+ "ext-row-end-7",
89
+ "ext-row-end-auto",
90
+ "ext-m-0",
91
+ "ext-m-auto",
92
+ "ext-m-base",
93
+ "ext-m-lg",
94
+ "ext--m-base",
95
+ "ext--m-lg",
96
+ "ext-mx-0",
97
+ "ext-mx-auto",
98
+ "ext-mx-base",
99
+ "ext-mx-lg",
100
+ "ext--mx-base",
101
+ "ext--mx-lg",
102
+ "ext-my-0",
103
+ "ext-my-auto",
104
+ "ext-my-base",
105
+ "ext-my-lg",
106
+ "ext--my-base",
107
+ "ext--my-lg",
108
+ "ext-mt-0",
109
+ "ext-mt-auto",
110
+ "ext-mt-base",
111
+ "ext-mt-lg",
112
+ "ext--mt-base",
113
+ "ext--mt-lg",
114
+ "ext-mr-0",
115
+ "ext-mr-auto",
116
+ "ext-mr-base",
117
+ "ext-mr-lg",
118
+ "ext--mr-base",
119
+ "ext--mr-lg",
120
+ "ext-mb-0",
121
+ "ext-mb-auto",
122
+ "ext-mb-base",
123
+ "ext-mb-lg",
124
+ "ext--mb-base",
125
+ "ext--mb-lg",
126
+ "ext-ml-0",
127
+ "ext-ml-auto",
128
+ "ext-ml-base",
129
+ "ext-ml-lg",
130
+ "ext--ml-base",
131
+ "ext--ml-lg",
132
+ "ext-block",
133
+ "ext-inline-block",
134
+ "ext-inline",
135
+ "ext-flex",
136
+ "ext-inline-flex",
137
+ "ext-grid",
138
+ "ext-inline-grid",
139
+ "ext-hidden",
140
+ "ext-w-auto",
141
+ "ext-w-full",
142
+ "ext-max-w-full",
143
+ "ext-flex-1",
144
+ "ext-flex-auto",
145
+ "ext-flex-initial",
146
+ "ext-flex-none",
147
+ "ext-flex-shrink-0",
148
+ "ext-flex-shrink",
149
+ "ext-flex-grow-0",
150
+ "ext-flex-grow",
151
+ "ext-list-none",
152
+ "ext-grid-cols-1",
153
+ "ext-grid-cols-2",
154
+ "ext-grid-cols-3",
155
+ "ext-grid-cols-4",
156
+ "ext-grid-cols-5",
157
+ "ext-grid-cols-6",
158
+ "ext-grid-cols-7",
159
+ "ext-grid-cols-8",
160
+ "ext-grid-cols-9",
161
+ "ext-grid-cols-10",
162
+ "ext-grid-cols-11",
163
+ "ext-grid-cols-12",
164
+ "ext-grid-cols-none",
165
+ "ext-grid-rows-1",
166
+ "ext-grid-rows-2",
167
+ "ext-grid-rows-3",
168
+ "ext-grid-rows-4",
169
+ "ext-grid-rows-5",
170
+ "ext-grid-rows-6",
171
+ "ext-grid-rows-none",
172
+ "ext-flex-row",
173
+ "ext-flex-row-reverse",
174
+ "ext-flex-col",
175
+ "ext-flex-col-reverse",
176
+ "ext-flex-wrap",
177
+ "ext-flex-wrap-reverse",
178
+ "ext-flex-nowrap",
179
+ "ext-items-start",
180
+ "ext-items-end",
181
+ "ext-items-center",
182
+ "ext-items-baseline",
183
+ "ext-items-stretch",
184
+ "ext-justify-start",
185
+ "ext-justify-end",
186
+ "ext-justify-center",
187
+ "ext-justify-between",
188
+ "ext-justify-around",
189
+ "ext-justify-evenly",
190
+ "ext-justify-items-start",
191
+ "ext-justify-items-end",
192
+ "ext-justify-items-center",
193
+ "ext-justify-items-stretch",
194
+ "ext-gap-0",
195
+ "ext-gap-base",
196
+ "ext-gap-lg",
197
+ "ext-gap-x-0",
198
+ "ext-gap-x-base",
199
+ "ext-gap-x-lg",
200
+ "ext-gap-y-0",
201
+ "ext-gap-y-base",
202
+ "ext-gap-y-lg",
203
+ "ext-justify-self-auto",
204
+ "ext-justify-self-start",
205
+ "ext-justify-self-end",
206
+ "ext-justify-self-center",
207
+ "ext-justify-self-stretch",
208
+ "ext-rounded-none",
209
+ "ext-rounded-full",
210
+ "ext-rounded-t-none",
211
+ "ext-rounded-t-full",
212
+ "ext-rounded-r-none",
213
+ "ext-rounded-r-full",
214
+ "ext-rounded-b-none",
215
+ "ext-rounded-b-full",
216
+ "ext-rounded-l-none",
217
+ "ext-rounded-l-full",
218
+ "ext-rounded-tl-none",
219
+ "ext-rounded-tl-full",
220
+ "ext-rounded-tr-none",
221
+ "ext-rounded-tr-full",
222
+ "ext-rounded-br-none",
223
+ "ext-rounded-br-full",
224
+ "ext-rounded-bl-none",
225
+ "ext-rounded-bl-full",
226
+ "ext-border-0",
227
+ "ext-border-t-0",
228
+ "ext-border-r-0",
229
+ "ext-border-b-0",
230
+ "ext-border-l-0",
231
+ "ext-p-0",
232
+ "ext-p-base",
233
+ "ext-p-lg",
234
+ "ext-px-0",
235
+ "ext-px-base",
236
+ "ext-px-lg",
237
+ "ext-py-0",
238
+ "ext-py-base",
239
+ "ext-py-lg",
240
+ "ext-pt-0",
241
+ "ext-pt-base",
242
+ "ext-pt-lg",
243
+ "ext-pr-0",
244
+ "ext-pr-base",
245
+ "ext-pr-lg",
246
+ "ext-pb-0",
247
+ "ext-pb-base",
248
+ "ext-pb-lg",
249
+ "ext-pl-0",
250
+ "ext-pl-base",
251
+ "ext-pl-lg",
252
+ "ext-text-left",
253
+ "ext-text-center",
254
+ "ext-text-right",
255
+ "ext-leading-none",
256
+ "ext-leading-tight",
257
+ "ext-leading-snug",
258
+ "ext-leading-normal",
259
+ "ext-leading-relaxed",
260
+ "ext-leading-loose",
261
+ "clip-path--rhombus",
262
+ "clip-path--diamond",
263
+ "clip-path--rhombus-alt",
264
+ "wp-block-columns[class*=\"fullwidth-cols\"]\n",
265
+ "tablet\\:fullwidth-cols",
266
+ "desktop\\:fullwidth-cols",
267
+ "direction-rtl",
268
+ "direction-ltr",
269
+ "bring-to-front",
270
+ "text-stroke",
271
+ "text-stroke--primary",
272
+ "text-stroke--secondary",
273
+ "editor\\:no-caption",
274
+ "editor\\:no-inserter",
275
+ "editor\\:no-resize",
276
+ "editor\\:pointer-events-none",
277
+ "tablet\\:ext-absolute",
278
+ "tablet\\:ext-relative",
279
+ "tablet\\:ext-top-base",
280
+ "tablet\\:ext-top-lg",
281
+ "tablet\\:ext--top-base",
282
+ "tablet\\:ext--top-lg",
283
+ "tablet\\:ext-right-base",
284
+ "tablet\\:ext-right-lg",
285
+ "tablet\\:ext--right-base",
286
+ "tablet\\:ext--right-lg",
287
+ "tablet\\:ext-bottom-base",
288
+ "tablet\\:ext-bottom-lg",
289
+ "tablet\\:ext--bottom-base",
290
+ "tablet\\:ext--bottom-lg",
291
+ "tablet\\:ext-left-base",
292
+ "tablet\\:ext-left-lg",
293
+ "tablet\\:ext--left-base",
294
+ "tablet\\:ext--left-lg",
295
+ "tablet\\:ext-order-1",
296
+ "tablet\\:ext-order-2",
297
+ "tablet\\:ext-m-0",
298
+ "tablet\\:ext-m-auto",
299
+ "tablet\\:ext-m-base",
300
+ "tablet\\:ext-m-lg",
301
+ "tablet\\:ext--m-base",
302
+ "tablet\\:ext--m-lg",
303
+ "tablet\\:ext-mx-0",
304
+ "tablet\\:ext-mx-auto",
305
+ "tablet\\:ext-mx-base",
306
+ "tablet\\:ext-mx-lg",
307
+ "tablet\\:ext--mx-base",
308
+ "tablet\\:ext--mx-lg",
309
+ "tablet\\:ext-my-0",
310
+ "tablet\\:ext-my-auto",
311
+ "tablet\\:ext-my-base",
312
+ "tablet\\:ext-my-lg",
313
+ "tablet\\:ext--my-base",
314
+ "tablet\\:ext--my-lg",
315
+ "tablet\\:ext-mt-0",
316
+ "tablet\\:ext-mt-auto",
317
+ "tablet\\:ext-mt-base",
318
+ "tablet\\:ext-mt-lg",
319
+ "tablet\\:ext--mt-base",
320
+ "tablet\\:ext--mt-lg",
321
+ "tablet\\:ext-mr-0",
322
+ "tablet\\:ext-mr-auto",
323
+ "tablet\\:ext-mr-base",
324
+ "tablet\\:ext-mr-lg",
325
+ "tablet\\:ext--mr-base",
326
+ "tablet\\:ext--mr-lg",
327
+ "tablet\\:ext-mb-0",
328
+ "tablet\\:ext-mb-auto",
329
+ "tablet\\:ext-mb-base",
330
+ "tablet\\:ext-mb-lg",
331
+ "tablet\\:ext--mb-base",
332
+ "tablet\\:ext--mb-lg",
333
+ "tablet\\:ext-ml-0",
334
+ "tablet\\:ext-ml-auto",
335
+ "tablet\\:ext-ml-base",
336
+ "tablet\\:ext-ml-lg",
337
+ "tablet\\:ext--ml-base",
338
+ "tablet\\:ext--ml-lg",
339
+ "tablet\\:ext-block",
340
+ "tablet\\:ext-inline-block",
341
+ "tablet\\:ext-inline",
342
+ "tablet\\:ext-flex",
343
+ "tablet\\:ext-inline-flex",
344
+ "tablet\\:ext-grid",
345
+ "tablet\\:ext-inline-grid",
346
+ "tablet\\:ext-hidden",
347
+ "tablet\\:ext-w-auto",
348
+ "tablet\\:ext-w-full",
349
+ "tablet\\:ext-max-w-full",
350
+ "tablet\\:ext-flex-1",
351
+ "tablet\\:ext-flex-auto",
352
+ "tablet\\:ext-flex-initial",
353
+ "tablet\\:ext-flex-none",
354
+ "tablet\\:ext-flex-shrink-0",
355
+ "tablet\\:ext-flex-shrink",
356
+ "tablet\\:ext-flex-grow-0",
357
+ "tablet\\:ext-flex-grow",
358
+ "tablet\\:ext-list-none",
359
+ "tablet\\:ext-grid-cols-1",
360
+ "tablet\\:ext-grid-cols-2",
361
+ "tablet\\:ext-grid-cols-3",
362
+ "tablet\\:ext-grid-cols-4",
363
+ "tablet\\:ext-grid-cols-5",
364
+ "tablet\\:ext-grid-cols-6",
365
+ "tablet\\:ext-grid-cols-7",
366
+ "tablet\\:ext-grid-cols-8",
367
+ "tablet\\:ext-grid-cols-9",
368
+ "tablet\\:ext-grid-cols-10",
369
+ "tablet\\:ext-grid-cols-11",
370
+ "tablet\\:ext-grid-cols-12",
371
+ "tablet\\:ext-grid-cols-none",
372
+ "tablet\\:ext-flex-row",
373
+ "tablet\\:ext-flex-row-reverse",
374
+ "tablet\\:ext-flex-col",
375
+ "tablet\\:ext-flex-col-reverse",
376
+ "tablet\\:ext-flex-wrap",
377
+ "tablet\\:ext-flex-wrap-reverse",
378
+ "tablet\\:ext-flex-nowrap",
379
+ "tablet\\:ext-items-start",
380
+ "tablet\\:ext-items-end",
381
+ "tablet\\:ext-items-center",
382
+ "tablet\\:ext-items-baseline",
383
+ "tablet\\:ext-items-stretch",
384
+ "tablet\\:ext-justify-start",
385
+ "tablet\\:ext-justify-end",
386
+ "tablet\\:ext-justify-center",
387
+ "tablet\\:ext-justify-between",
388
+ "tablet\\:ext-justify-around",
389
+ "tablet\\:ext-justify-evenly",
390
+ "tablet\\:ext-justify-items-start",
391
+ "tablet\\:ext-justify-items-end",
392
+ "tablet\\:ext-justify-items-center",
393
+ "tablet\\:ext-justify-items-stretch",
394
+ "tablet\\:ext-justify-self-auto",
395
+ "tablet\\:ext-justify-self-start",
396
+ "tablet\\:ext-justify-self-end",
397
+ "tablet\\:ext-justify-self-center",
398
+ "tablet\\:ext-justify-self-stretch",
399
+ "tablet\\:ext-p-0",
400
+ "tablet\\:ext-p-base",
401
+ "tablet\\:ext-p-lg",
402
+ "tablet\\:ext-px-0",
403
+ "tablet\\:ext-px-base",
404
+ "tablet\\:ext-px-lg",
405
+ "tablet\\:ext-py-0",
406
+ "tablet\\:ext-py-base",
407
+ "tablet\\:ext-py-lg",
408
+ "tablet\\:ext-pt-0",
409
+ "tablet\\:ext-pt-base",
410
+ "tablet\\:ext-pt-lg",
411
+ "tablet\\:ext-pr-0",
412
+ "tablet\\:ext-pr-base",
413
+ "tablet\\:ext-pr-lg",
414
+ "tablet\\:ext-pb-0",
415
+ "tablet\\:ext-pb-base",
416
+ "tablet\\:ext-pb-lg",
417
+ "tablet\\:ext-pl-0",
418
+ "tablet\\:ext-pl-base",
419
+ "tablet\\:ext-pl-lg",
420
+ "tablet\\:ext-text-left",
421
+ "tablet\\:ext-text-center",
422
+ "tablet\\:ext-text-right",
423
+ "desktop\\:ext-absolute",
424
+ "desktop\\:ext-relative",
425
+ "desktop\\:ext-top-base",
426
+ "desktop\\:ext-top-lg",
427
+ "desktop\\:ext--top-base",
428
+ "desktop\\:ext--top-lg",
429
+ "desktop\\:ext-right-base",
430
+ "desktop\\:ext-right-lg",
431
+ "desktop\\:ext--right-base",
432
+ "desktop\\:ext--right-lg",
433
+ "desktop\\:ext-bottom-base",
434
+ "desktop\\:ext-bottom-lg",
435
+ "desktop\\:ext--bottom-base",
436
+ "desktop\\:ext--bottom-lg",
437
+ "desktop\\:ext-left-base",
438
+ "desktop\\:ext-left-lg",
439
+ "desktop\\:ext--left-base",
440
+ "desktop\\:ext--left-lg",
441
+ "desktop\\:ext-order-1",
442
+ "desktop\\:ext-order-2",
443
+ "desktop\\:ext-m-0",
444
+ "desktop\\:ext-m-auto",
445
+ "desktop\\:ext-m-base",
446
+ "desktop\\:ext-m-lg",
447
+ "desktop\\:ext--m-base",
448
+ "desktop\\:ext--m-lg",
449
+ "desktop\\:ext-mx-0",
450
+ "desktop\\:ext-mx-auto",
451
+ "desktop\\:ext-mx-base",
452
+ "desktop\\:ext-mx-lg",
453
+ "desktop\\:ext--mx-base",
454
+ "desktop\\:ext--mx-lg",
455
+ "desktop\\:ext-my-0",
456
+ "desktop\\:ext-my-auto",
457
+ "desktop\\:ext-my-base",
458
+ "desktop\\:ext-my-lg",
459
+ "desktop\\:ext--my-base",
460
+ "desktop\\:ext--my-lg",
461
+ "desktop\\:ext-mt-0",
462
+ "desktop\\:ext-mt-auto",
463
+ "desktop\\:ext-mt-base",
464
+ "desktop\\:ext-mt-lg",
465
+ "desktop\\:ext--mt-base",
466
+ "desktop\\:ext--mt-lg",
467
+ "desktop\\:ext-mr-0",
468
+ "desktop\\:ext-mr-auto",
469
+ "desktop\\:ext-mr-base",
470
+ "desktop\\:ext-mr-lg",
471
+ "desktop\\:ext--mr-base",
472
+ "desktop\\:ext--mr-lg",
473
+ "desktop\\:ext-mb-0",
474
+ "desktop\\:ext-mb-auto",
475
+ "desktop\\:ext-mb-base",
476
+ "desktop\\:ext-mb-lg",
477
+ "desktop\\:ext--mb-base",
478
+ "desktop\\:ext--mb-lg",
479
+ "desktop\\:ext-ml-0",
480
+ "desktop\\:ext-ml-auto",
481
+ "desktop\\:ext-ml-base",
482
+ "desktop\\:ext-ml-lg",
483
+ "desktop\\:ext--ml-base",
484
+ "desktop\\:ext--ml-lg",
485
+ "desktop\\:ext-block",
486
+ "desktop\\:ext-inline-block",
487
+ "desktop\\:ext-inline",
488
+ "desktop\\:ext-flex",
489
+ "desktop\\:ext-inline-flex",
490
+ "desktop\\:ext-grid",
491
+ "desktop\\:ext-inline-grid",
492
+ "desktop\\:ext-hidden",
493
+ "desktop\\:ext-w-auto",
494
+ "desktop\\:ext-w-full",
495
+ "desktop\\:ext-max-w-full",
496
+ "desktop\\:ext-flex-1",
497
+ "desktop\\:ext-flex-auto",
498
+ "desktop\\:ext-flex-initial",
499
+ "desktop\\:ext-flex-none",
500
+ "desktop\\:ext-flex-shrink-0",
501
+ "desktop\\:ext-flex-shrink",
502
+ "desktop\\:ext-flex-grow-0",
503
+ "desktop\\:ext-flex-grow",
504
+ "desktop\\:ext-list-none",
505
+ "desktop\\:ext-grid-cols-1",
506
+ "desktop\\:ext-grid-cols-2",
507
+ "desktop\\:ext-grid-cols-3",
508
+ "desktop\\:ext-grid-cols-4",
509
+ "desktop\\:ext-grid-cols-5",
510
+ "desktop\\:ext-grid-cols-6",
511
+ "desktop\\:ext-grid-cols-7",
512
+ "desktop\\:ext-grid-cols-8",
513
+ "desktop\\:ext-grid-cols-9",
514
+ "desktop\\:ext-grid-cols-10",
515
+ "desktop\\:ext-grid-cols-11",
516
+ "desktop\\:ext-grid-cols-12",
517
+ "desktop\\:ext-grid-cols-none",
518
+ "desktop\\:ext-flex-row",
519
+ "desktop\\:ext-flex-row-reverse",
520
+ "desktop\\:ext-flex-col",
521
+ "desktop\\:ext-flex-col-reverse",
522
+ "desktop\\:ext-flex-wrap",
523
+ "desktop\\:ext-flex-wrap-reverse",
524
+ "desktop\\:ext-flex-nowrap",
525
+ "desktop\\:ext-items-start",
526
+ "desktop\\:ext-items-end",
527
+ "desktop\\:ext-items-center",
528
+ "desktop\\:ext-items-baseline",
529
+ "desktop\\:ext-items-stretch",
530
+ "desktop\\:ext-justify-start",
531
+ "desktop\\:ext-justify-end",
532
+ "desktop\\:ext-justify-center",
533
+ "desktop\\:ext-justify-between",
534
+ "desktop\\:ext-justify-around",
535
+ "desktop\\:ext-justify-evenly",
536
+ "desktop\\:ext-justify-items-start",
537
+ "desktop\\:ext-justify-items-end",
538
+ "desktop\\:ext-justify-items-center",
539
+ "desktop\\:ext-justify-items-stretch",
540
+ "desktop\\:ext-justify-self-auto",
541
+ "desktop\\:ext-justify-self-start",
542
+ "desktop\\:ext-justify-self-end",
543
+ "desktop\\:ext-justify-self-center",
544
+ "desktop\\:ext-justify-self-stretch",
545
+ "desktop\\:ext-p-0",
546
+ "desktop\\:ext-p-base",
547
+ "desktop\\:ext-p-lg",
548
+ "desktop\\:ext-px-0",
549
+ "desktop\\:ext-px-base",
550
+ "desktop\\:ext-px-lg",
551
+ "desktop\\:ext-py-0",
552
+ "desktop\\:ext-py-base",
553
+ "desktop\\:ext-py-lg",
554
+ "desktop\\:ext-pt-0",
555
+ "desktop\\:ext-pt-base",
556
+ "desktop\\:ext-pt-lg",
557
+ "desktop\\:ext-pr-0",
558
+ "desktop\\:ext-pr-base",
559
+ "desktop\\:ext-pr-lg",
560
+ "desktop\\:ext-pb-0",
561
+ "desktop\\:ext-pb-base",
562
+ "desktop\\:ext-pb-lg",
563
+ "desktop\\:ext-pl-0",
564
+ "desktop\\:ext-pl-base",
565
+ "desktop\\:ext-pl-lg",
566
+ "desktop\\:ext-text-left",
567
+ "desktop\\:ext-text-center",
568
+ "desktop\\:ext-text-right"
569
+ ]
570
+ }
vendor/autoload.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload.php @generated by Composer
4
+
5
+ require_once __DIR__ . '/composer/autoload_real.php';
6
+
7
+ return ComposerAutoloaderInit340a6822f05e2bfceab6432d90c2eeaa::getLoader();
vendor/composer/ClassLoader.php ADDED
@@ -0,0 +1,445 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer\Autoload;
14
+
15
+ /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+ *
18
+ * $loader = new \Composer\Autoload\ClassLoader();
19
+ *
20
+ * // register classes with namespaces
21
+ * $loader->add('Symfony\Component', __DIR__.'/component');
22
+ * $loader->add('Symfony', __DIR__.'/framework');
23
+ *
24
+ * // activate the autoloader
25
+ * $loader->register();
26
+ *
27
+ * // to enable searching the include path (eg. for PEAR packages)
28
+ * $loader->setUseIncludePath(true);
29
+ *
30
+ * In this example, if you try to use a class in the Symfony\Component
31
+ * namespace or one of its children (Symfony\Component\Console for instance),
32
+ * the autoloader will first look for the class under the component/
33
+ * directory, and it will then fallback to the framework/ directory if not
34
+ * found before giving up.
35
+ *
36
+ * This class is loosely based on the Symfony UniversalClassLoader.
37
+ *
38
+ * @author Fabien Potencier <fabien@symfony.com>
39
+ * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see http://www.php-fig.org/psr/psr-0/
41
+ * @see http://www.php-fig.org/psr/psr-4/
42
+ */
43
+ class ClassLoader
44
+ {
45
+ // PSR-4
46
+ private $prefixLengthsPsr4 = array();
47
+ private $prefixDirsPsr4 = array();
48
+ private $fallbackDirsPsr4 = array();
49
+
50
+ // PSR-0
51
+ private $prefixesPsr0 = array();
52
+ private $fallbackDirsPsr0 = array();
53
+
54
+ private $useIncludePath = false;
55
+ private $classMap = array();
56
+ private $classMapAuthoritative = false;
57
+ private $missingClasses = array();
58
+ private $apcuPrefix;
59
+
60
+ public function getPrefixes()
61
+ {
62
+ if (!empty($this->prefixesPsr0)) {
63
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
64
+ }
65
+
66
+ return array();
67
+ }
68
+
69
+ public function getPrefixesPsr4()
70
+ {
71
+ return $this->prefixDirsPsr4;
72
+ }
73
+
74
+ public function getFallbackDirs()
75
+ {
76
+ return $this->fallbackDirsPsr0;
77
+ }
78
+
79
+ public function getFallbackDirsPsr4()
80
+ {
81
+ return $this->fallbackDirsPsr4;
82
+ }
83
+
84
+ public function getClassMap()
85
+ {
86
+ return $this->classMap;
87
+ }
88
+
89
+ /**
90
+ * @param array $classMap Class to filename map
91
+ */
92
+ public function addClassMap(array $classMap)
93
+ {
94
+ if ($this->classMap) {
95
+ $this->classMap = array_merge($this->classMap, $classMap);
96
+ } else {
97
+ $this->classMap = $classMap;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Registers a set of PSR-0 directories for a given prefix, either
103
+ * appending or prepending to the ones previously set for this prefix.
104
+ *
105
+ * @param string $prefix The prefix
106
+ * @param array|string $paths The PSR-0 root directories
107
+ * @param bool $prepend Whether to prepend the directories
108
+ */
109
+ public function add($prefix, $paths, $prepend = false)
110
+ {
111
+ if (!$prefix) {
112
+ if ($prepend) {
113
+ $this->fallbackDirsPsr0 = array_merge(
114
+ (array) $paths,
115
+ $this->fallbackDirsPsr0
116
+ );
117
+ } else {
118
+ $this->fallbackDirsPsr0 = array_merge(
119
+ $this->fallbackDirsPsr0,
120
+ (array) $paths
121
+ );
122
+ }
123
+
124
+ return;
125
+ }
126
+
127
+ $first = $prefix[0];
128
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
129
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
130
+
131
+ return;
132
+ }
133
+ if ($prepend) {
134
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
135
+ (array) $paths,
136
+ $this->prefixesPsr0[$first][$prefix]
137
+ );
138
+ } else {
139
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
140
+ $this->prefixesPsr0[$first][$prefix],
141
+ (array) $paths
142
+ );
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Registers a set of PSR-4 directories for a given namespace, either
148
+ * appending or prepending to the ones previously set for this namespace.
149
+ *
150
+ * @param string $prefix The prefix/namespace, with trailing '\\'
151
+ * @param array|string $paths The PSR-4 base directories
152
+ * @param bool $prepend Whether to prepend the directories
153
+ *
154
+ * @throws \InvalidArgumentException
155
+ */
156
+ public function addPsr4($prefix, $paths, $prepend = false)
157
+ {
158
+ if (!$prefix) {
159
+ // Register directories for the root namespace.
160
+ if ($prepend) {
161
+ $this->fallbackDirsPsr4 = array_merge(
162
+ (array) $paths,
163
+ $this->fallbackDirsPsr4
164
+ );
165
+ } else {
166
+ $this->fallbackDirsPsr4 = array_merge(
167
+ $this->fallbackDirsPsr4,
168
+ (array) $paths
169
+ );
170
+ }
171
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
172
+ // Register directories for a new namespace.
173
+ $length = strlen($prefix);
174
+ if ('\\' !== $prefix[$length - 1]) {
175
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
176
+ }
177
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
178
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
179
+ } elseif ($prepend) {
180
+ // Prepend directories for an already registered namespace.
181
+ $this->prefixDirsPsr4[$prefix] = array_merge(
182
+ (array) $paths,
183
+ $this->prefixDirsPsr4[$prefix]
184
+ );
185
+ } else {
186
+ // Append directories for an already registered namespace.
187
+ $this->prefixDirsPsr4[$prefix] = array_merge(
188
+ $this->prefixDirsPsr4[$prefix],
189
+ (array) $paths
190
+ );
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Registers a set of PSR-0 directories for a given prefix,
196
+ * replacing any others previously set for this prefix.
197
+ *
198
+ * @param string $prefix The prefix
199
+ * @param array|string $paths The PSR-0 base directories
200
+ */
201
+ public function set($prefix, $paths)
202
+ {
203
+ if (!$prefix) {
204
+ $this->fallbackDirsPsr0 = (array) $paths;
205
+ } else {
206
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Registers a set of PSR-4 directories for a given namespace,
212
+ * replacing any others previously set for this namespace.
213
+ *
214
+ * @param string $prefix The prefix/namespace, with trailing '\\'
215
+ * @param array|string $paths The PSR-4 base directories
216
+ *
217
+ * @throws \InvalidArgumentException
218
+ */
219
+ public function setPsr4($prefix, $paths)
220
+ {
221
+ if (!$prefix) {
222
+ $this->fallbackDirsPsr4 = (array) $paths;
223
+ } else {
224
+ $length = strlen($prefix);
225
+ if ('\\' !== $prefix[$length - 1]) {
226
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
227
+ }
228
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
229
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Turns on searching the include path for class files.
235
+ *
236
+ * @param bool $useIncludePath
237
+ */
238
+ public function setUseIncludePath($useIncludePath)
239
+ {
240
+ $this->useIncludePath = $useIncludePath;
241
+ }
242
+
243
+ /**
244
+ * Can be used to check if the autoloader uses the include path to check
245
+ * for classes.
246
+ *
247
+ * @return bool
248
+ */
249
+ public function getUseIncludePath()
250
+ {
251
+ return $this->useIncludePath;
252
+ }
253
+
254
+ /**
255
+ * Turns off searching the prefix and fallback directories for classes
256
+ * that have not been registered with the class map.
257
+ *
258
+ * @param bool $classMapAuthoritative
259
+ */
260
+ public function setClassMapAuthoritative($classMapAuthoritative)
261
+ {
262
+ $this->classMapAuthoritative = $classMapAuthoritative;
263
+ }
264
+
265
+ /**
266
+ * Should class lookup fail if not found in the current class map?
267
+ *
268
+ * @return bool
269
+ */
270
+ public function isClassMapAuthoritative()
271
+ {
272
+ return $this->classMapAuthoritative;
273
+ }
274
+
275
+ /**
276
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
+ *
278
+ * @param string|null $apcuPrefix
279
+ */
280
+ public function setApcuPrefix($apcuPrefix)
281
+ {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
283
+ }
284
+
285
+ /**
286
+ * The APCu prefix in use, or null if APCu caching is not enabled.
287
+ *
288
+ * @return string|null
289
+ */
290
+ public function getApcuPrefix()
291
+ {
292
+ return $this->apcuPrefix;
293
+ }
294
+
295
+ /**
296
+ * Registers this instance as an autoloader.
297
+ *
298
+ * @param bool $prepend Whether to prepend the autoloader or not
299
+ */
300
+ public function register($prepend = false)
301
+ {
302
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
303
+ }
304
+
305
+ /**
306
+ * Unregisters this instance as an autoloader.
307
+ */
308
+ public function unregister()
309
+ {
310
+ spl_autoload_unregister(array($this, 'loadClass'));
311
+ }
312
+
313
+ /**
314
+ * Loads the given class or interface.
315
+ *
316
+ * @param string $class The name of the class
317
+ * @return bool|null True if loaded, null otherwise
318
+ */
319
+ public function loadClass($class)
320
+ {
321
+ if ($file = $this->findFile($class)) {
322
+ includeFile($file);
323
+
324
+ return true;
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Finds the path to the file where the class is defined.
330
+ *
331
+ * @param string $class The name of the class
332
+ *
333
+ * @return string|false The path if found, false otherwise
334
+ */
335
+ public function findFile($class)
336
+ {
337
+ // class map lookup
338
+ if (isset($this->classMap[$class])) {
339
+ return $this->classMap[$class];
340
+ }
341
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
342
+ return false;
343
+ }
344
+ if (null !== $this->apcuPrefix) {
345
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
346
+ if ($hit) {
347
+ return $file;
348
+ }
349
+ }
350
+
351
+ $file = $this->findFileWithExtension($class, '.php');
352
+
353
+ // Search for Hack files if we are running on HHVM
354
+ if (false === $file && defined('HHVM_VERSION')) {
355
+ $file = $this->findFileWithExtension($class, '.hh');
356
+ }
357
+
358
+ if (null !== $this->apcuPrefix) {
359
+ apcu_add($this->apcuPrefix.$class, $file);
360
+ }
361
+
362
+ if (false === $file) {
363
+ // Remember that this class does not exist.
364
+ $this->missingClasses[$class] = true;
365
+ }
366
+
367
+ return $file;
368
+ }
369
+
370
+ private function findFileWithExtension($class, $ext)
371
+ {
372
+ // PSR-4 lookup
373
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
374
+
375
+ $first = $class[0];
376
+ if (isset($this->prefixLengthsPsr4[$first])) {
377
+ $subPath = $class;
378
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
379
+ $subPath = substr($subPath, 0, $lastPos);
380
+ $search = $subPath . '\\';
381
+ if (isset($this->prefixDirsPsr4[$search])) {
382
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
384
+ if (file_exists($file = $dir . $pathEnd)) {
385
+ return $file;
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+
392
+ // PSR-4 fallback dirs
393
+ foreach ($this->fallbackDirsPsr4 as $dir) {
394
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
395
+ return $file;
396
+ }
397
+ }
398
+
399
+ // PSR-0 lookup
400
+ if (false !== $pos = strrpos($class, '\\')) {
401
+ // namespaced class name
402
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
403
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
404
+ } else {
405
+ // PEAR-like class name
406
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
407
+ }
408
+
409
+ if (isset($this->prefixesPsr0[$first])) {
410
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
411
+ if (0 === strpos($class, $prefix)) {
412
+ foreach ($dirs as $dir) {
413
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
414
+ return $file;
415
+ }
416
+ }
417
+ }
418
+ }
419
+ }
420
+
421
+ // PSR-0 fallback dirs
422
+ foreach ($this->fallbackDirsPsr0 as $dir) {
423
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
424
+ return $file;
425
+ }
426
+ }
427
+
428
+ // PSR-0 include paths.
429
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
430
+ return $file;
431
+ }
432
+
433
+ return false;
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Scope isolated include.
439
+ *
440
+ * Prevents access to $this/self from included files.
441
+ */
442
+ function includeFile($file)
443
+ {
444
+ include $file;
445
+ }
vendor/composer/InstalledVersions.php ADDED
@@ -0,0 +1,654 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+ namespace Composer;
14
+
15
+ use Composer\Autoload\ClassLoader;
16
+ use Composer\Semver\VersionParser;
17
+
18
+
19
+
20
+
21
+
22
+
23
+ class InstalledVersions
24
+ {
25
+ private static $installed = array (
26
+ 'root' =>
27
+ array (
28
+ 'pretty_version' => 'dev-main',
29
+ 'version' => 'dev-main',
30
+ 'aliases' =>
31
+ array (
32
+ ),
33
+ 'reference' => 'ac2cfec95277e7980dfcf8dfde5cd858f1023e03',
34
+ 'name' => 'extendify/extendify',
35
+ ),
36
+ 'versions' =>
37
+ array (
38
+ 'dealerdirect/phpcodesniffer-composer-installer' =>
39
+ array (
40
+ 'pretty_version' => 'v0.7.1',
41
+ 'version' => '0.7.1.0',
42
+ 'aliases' =>
43
+ array (
44
+ ),
45
+ 'reference' => 'fe390591e0241955f22eb9ba327d137e501c771c',
46
+ ),
47
+ 'doctrine/instantiator' =>
48
+ array (
49
+ 'pretty_version' => '1.4.0',
50
+ 'version' => '1.4.0.0',
51
+ 'aliases' =>
52
+ array (
53
+ ),
54
+ 'reference' => 'd56bf6102915de5702778fe20f2de3b2fe570b5b',
55
+ ),
56
+ 'extendify/extendify' =>
57
+ array (
58
+ 'pretty_version' => 'dev-main',
59
+ 'version' => 'dev-main',
60
+ 'aliases' =>
61
+ array (
62
+ ),
63
+ 'reference' => 'ac2cfec95277e7980dfcf8dfde5cd858f1023e03',
64
+ ),
65
+ 'johnpbloch/wordpress-core' =>
66
+ array (
67
+ 'pretty_version' => '5.7.0',
68
+ 'version' => '5.7.0.0',
69
+ 'aliases' =>
70
+ array (
71
+ ),
72
+ 'reference' => '8b057056692ca196aaa7a7ddd915f29426922c6d',
73
+ ),
74
+ 'myclabs/deep-copy' =>
75
+ array (
76
+ 'pretty_version' => '1.10.2',
77
+ 'version' => '1.10.2.0',
78
+ 'aliases' =>
79
+ array (
80
+ ),
81
+ 'reference' => '776f831124e9c62e1a2c601ecc52e776d8bb7220',
82
+ 'replaced' =>
83
+ array (
84
+ 0 => '1.10.2',
85
+ ),
86
+ ),
87
+ 'nikic/php-parser' =>
88
+ array (
89
+ 'pretty_version' => 'v4.10.4',
90
+ 'version' => '4.10.4.0',
91
+ 'aliases' =>
92
+ array (
93
+ ),
94
+ 'reference' => 'c6d052fc58cb876152f89f532b95a8d7907e7f0e',
95
+ ),
96
+ 'phar-io/manifest' =>
97
+ array (
98
+ 'pretty_version' => '2.0.1',
99
+ 'version' => '2.0.1.0',
100
+ 'aliases' =>
101
+ array (
102
+ ),
103
+ 'reference' => '85265efd3af7ba3ca4b2a2c34dbfc5788dd29133',
104
+ ),
105
+ 'phar-io/version' =>
106
+ array (
107
+ 'pretty_version' => '3.1.0',
108
+ 'version' => '3.1.0.0',
109
+ 'aliases' =>
110
+ array (
111
+ ),
112
+ 'reference' => 'bae7c545bef187884426f042434e561ab1ddb182',
113
+ ),
114
+ 'phpcompatibility/php-compatibility' =>
115
+ array (
116
+ 'pretty_version' => '9.3.5',
117
+ 'version' => '9.3.5.0',
118
+ 'aliases' =>
119
+ array (
120
+ ),
121
+ 'reference' => '9fb324479acf6f39452e0655d2429cc0d3914243',
122
+ ),
123
+ 'phpcompatibility/phpcompatibility-paragonie' =>
124
+ array (
125
+ 'pretty_version' => '1.3.1',
126
+ 'version' => '1.3.1.0',
127
+ 'aliases' =>
128
+ array (
129
+ ),
130
+ 'reference' => 'ddabec839cc003651f2ce695c938686d1086cf43',
131
+ ),
132
+ 'phpcompatibility/phpcompatibility-wp' =>
133
+ array (
134
+ 'pretty_version' => '2.1.1',
135
+ 'version' => '2.1.1.0',
136
+ 'aliases' =>
137
+ array (
138
+ ),
139
+ 'reference' => 'b7dc0cd7a8f767ccac5e7637550ea1c50a67b09e',
140
+ ),
141
+ 'phpdocumentor/reflection-common' =>
142
+ array (
143
+ 'pretty_version' => '2.2.0',
144
+ 'version' => '2.2.0.0',
145
+ 'aliases' =>
146
+ array (
147
+ ),
148
+ 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
149
+ ),
150
+ 'phpdocumentor/reflection-docblock' =>
151
+ array (
152
+ 'pretty_version' => '5.2.2',
153
+ 'version' => '5.2.2.0',
154
+ 'aliases' =>
155
+ array (
156
+ ),
157
+ 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556',
158
+ ),
159
+ 'phpdocumentor/type-resolver' =>
160
+ array (
161
+ 'pretty_version' => '1.4.0',
162
+ 'version' => '1.4.0.0',
163
+ 'aliases' =>
164
+ array (
165
+ ),
166
+ 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0',
167
+ ),
168
+ 'phpspec/prophecy' =>
169
+ array (
170
+ 'pretty_version' => '1.13.0',
171
+ 'version' => '1.13.0.0',
172
+ 'aliases' =>
173
+ array (
174
+ ),
175
+ 'reference' => 'be1996ed8adc35c3fd795488a653f4b518be70ea',
176
+ ),
177
+ 'phpunit/php-code-coverage' =>
178
+ array (
179
+ 'pretty_version' => '9.2.6',
180
+ 'version' => '9.2.6.0',
181
+ 'aliases' =>
182
+ array (
183
+ ),
184
+ 'reference' => 'f6293e1b30a2354e8428e004689671b83871edde',
185
+ ),
186
+ 'phpunit/php-file-iterator' =>
187
+ array (
188
+ 'pretty_version' => '3.0.5',
189
+ 'version' => '3.0.5.0',
190
+ 'aliases' =>
191
+ array (
192
+ ),
193
+ 'reference' => 'aa4be8575f26070b100fccb67faabb28f21f66f8',
194
+ ),
195
+ 'phpunit/php-invoker' =>
196
+ array (
197
+ 'pretty_version' => '3.1.1',
198
+ 'version' => '3.1.1.0',
199
+ 'aliases' =>
200
+ array (
201
+ ),
202
+ 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
203
+ ),
204
+ 'phpunit/php-text-template' =>
205
+ array (
206
+ 'pretty_version' => '2.0.4',
207
+ 'version' => '2.0.4.0',
208
+ 'aliases' =>
209
+ array (
210
+ ),
211
+ 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
212
+ ),
213
+ 'phpunit/php-timer' =>
214
+ array (
215
+ 'pretty_version' => '5.0.3',
216
+ 'version' => '5.0.3.0',
217
+ 'aliases' =>
218
+ array (
219
+ ),
220
+ 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
221
+ ),
222
+ 'phpunit/phpunit' =>
223
+ array (
224
+ 'pretty_version' => '9.5.4',
225
+ 'version' => '9.5.4.0',
226
+ 'aliases' =>
227
+ array (
228
+ ),
229
+ 'reference' => 'c73c6737305e779771147af66c96ca6a7ed8a741',
230
+ ),
231
+ 'sebastian/cli-parser' =>
232
+ array (
233
+ 'pretty_version' => '1.0.1',
234
+ 'version' => '1.0.1.0',
235
+ 'aliases' =>
236
+ array (
237
+ ),
238
+ 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
239
+ ),
240
+ 'sebastian/code-unit' =>
241
+ array (
242
+ 'pretty_version' => '1.0.8',
243
+ 'version' => '1.0.8.0',
244
+ 'aliases' =>
245
+ array (
246
+ ),
247
+ 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
248
+ ),
249
+ 'sebastian/code-unit-reverse-lookup' =>
250
+ array (
251
+ 'pretty_version' => '2.0.3',
252
+ 'version' => '2.0.3.0',
253
+ 'aliases' =>
254
+ array (
255
+ ),
256
+ 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
257
+ ),
258
+ 'sebastian/comparator' =>
259
+ array (
260
+ 'pretty_version' => '4.0.6',
261
+ 'version' => '4.0.6.0',
262
+ 'aliases' =>
263
+ array (
264
+ ),
265
+ 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
266
+ ),
267
+ 'sebastian/complexity' =>
268
+ array (
269
+ 'pretty_version' => '2.0.2',
270
+ 'version' => '2.0.2.0',
271
+ 'aliases' =>
272
+ array (
273
+ ),
274
+ 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
275
+ ),
276
+ 'sebastian/diff' =>
277
+ array (
278
+ 'pretty_version' => '4.0.4',
279
+ 'version' => '4.0.4.0',
280
+ 'aliases' =>
281
+ array (
282
+ ),
283
+ 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
284
+ ),
285
+ 'sebastian/environment' =>
286
+ array (
287
+ 'pretty_version' => '5.1.3',
288
+ 'version' => '5.1.3.0',
289
+ 'aliases' =>
290
+ array (
291
+ ),
292
+ 'reference' => '388b6ced16caa751030f6a69e588299fa09200ac',
293
+ ),
294
+ 'sebastian/exporter' =>
295
+ array (
296
+ 'pretty_version' => '4.0.3',
297
+ 'version' => '4.0.3.0',
298
+ 'aliases' =>
299
+ array (
300
+ ),
301
+ 'reference' => 'd89cc98761b8cb5a1a235a6b703ae50d34080e65',
302
+ ),
303
+ 'sebastian/global-state' =>
304
+ array (
305
+ 'pretty_version' => '5.0.2',
306
+ 'version' => '5.0.2.0',
307
+ 'aliases' =>
308
+ array (
309
+ ),
310
+ 'reference' => 'a90ccbddffa067b51f574dea6eb25d5680839455',
311
+ ),
312
+ 'sebastian/lines-of-code' =>
313
+ array (
314
+ 'pretty_version' => '1.0.3',
315
+ 'version' => '1.0.3.0',
316
+ 'aliases' =>
317
+ array (
318
+ ),
319
+ 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
320
+ ),
321
+ 'sebastian/object-enumerator' =>
322
+ array (
323
+ 'pretty_version' => '4.0.4',
324
+ 'version' => '4.0.4.0',
325
+ 'aliases' =>
326
+ array (
327
+ ),
328
+ 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
329
+ ),
330
+ 'sebastian/object-reflector' =>
331
+ array (
332
+ 'pretty_version' => '2.0.4',
333
+ 'version' => '2.0.4.0',
334
+ 'aliases' =>
335
+ array (
336
+ ),
337
+ 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
338
+ ),
339
+ 'sebastian/recursion-context' =>
340
+ array (
341
+ 'pretty_version' => '4.0.4',
342
+ 'version' => '4.0.4.0',
343
+ 'aliases' =>
344
+ array (
345
+ ),
346
+ 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
347
+ ),
348
+ 'sebastian/resource-operations' =>
349
+ array (
350
+ 'pretty_version' => '3.0.3',
351
+ 'version' => '3.0.3.0',
352
+ 'aliases' =>
353
+ array (
354
+ ),
355
+ 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
356
+ ),
357
+ 'sebastian/type' =>
358
+ array (
359
+ 'pretty_version' => '2.3.1',
360
+ 'version' => '2.3.1.0',
361
+ 'aliases' =>
362
+ array (
363
+ ),
364
+ 'reference' => '81cd61ab7bbf2de744aba0ea61fae32f721df3d2',
365
+ ),
366
+ 'sebastian/version' =>
367
+ array (
368
+ 'pretty_version' => '3.0.2',
369
+ 'version' => '3.0.2.0',
370
+ 'aliases' =>
371
+ array (
372
+ ),
373
+ 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
374
+ ),
375
+ 'squizlabs/php_codesniffer' =>
376
+ array (
377
+ 'pretty_version' => '3.6.0',
378
+ 'version' => '3.6.0.0',
379
+ 'aliases' =>
380
+ array (
381
+ ),
382
+ 'reference' => 'ffced0d2c8fa8e6cdc4d695a743271fab6c38625',
383
+ ),
384
+ 'symfony/polyfill-ctype' =>
385
+ array (
386
+ 'pretty_version' => 'v1.22.1',
387
+ 'version' => '1.22.1.0',
388
+ 'aliases' =>
389
+ array (
390
+ ),
391
+ 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e',
392
+ ),
393
+ 'theseer/tokenizer' =>
394
+ array (
395
+ 'pretty_version' => '1.2.0',
396
+ 'version' => '1.2.0.0',
397
+ 'aliases' =>
398
+ array (
399
+ ),
400
+ 'reference' => '75a63c33a8577608444246075ea0af0d052e452a',
401
+ ),
402
+ 'webmozart/assert' =>
403
+ array (
404
+ 'pretty_version' => '1.10.0',
405
+ 'version' => '1.10.0.0',
406
+ 'aliases' =>
407
+ array (
408
+ ),
409
+ 'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
410
+ ),
411
+ 'wordpress/core-implementation' =>
412
+ array (
413
+ 'provided' =>
414
+ array (
415
+ 0 => '5.7.0',
416
+ ),
417
+ ),
418
+ ),
419
+ );
420
+ private static $canGetVendors;
421
+ private static $installedByVendor = array();
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+ public static function getInstalledPackages()
430
+ {
431
+ $packages = array();
432
+ foreach (self::getInstalled() as $installed) {
433
+ $packages[] = array_keys($installed['versions']);
434
+ }
435
+
436
+
437
+ if (1 === \count($packages)) {
438
+ return $packages[0];
439
+ }
440
+
441
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
442
+ }
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+ public static function isInstalled($packageName)
453
+ {
454
+ foreach (self::getInstalled() as $installed) {
455
+ if (isset($installed['versions'][$packageName])) {
456
+ return true;
457
+ }
458
+ }
459
+
460
+ return false;
461
+ }
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
477
+ {
478
+ $constraint = $parser->parseConstraints($constraint);
479
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
480
+
481
+ return $provided->matches($constraint);
482
+ }
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+
492
+
493
+ public static function getVersionRanges($packageName)
494
+ {
495
+ foreach (self::getInstalled() as $installed) {
496
+ if (!isset($installed['versions'][$packageName])) {
497
+ continue;
498
+ }
499
+
500
+ $ranges = array();
501
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
502
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
503
+ }
504
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
505
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
506
+ }
507
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
508
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
509
+ }
510
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
511
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
512
+ }
513
+
514
+ return implode(' || ', $ranges);
515
+ }
516
+
517
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
518
+ }
519
+
520
+
521
+
522
+
523
+
524
+ public static function getVersion($packageName)
525
+ {
526
+ foreach (self::getInstalled() as $installed) {
527
+ if (!isset($installed['versions'][$packageName])) {
528
+ continue;
529
+ }
530
+
531
+ if (!isset($installed['versions'][$packageName]['version'])) {
532
+ return null;
533
+ }
534
+
535
+ return $installed['versions'][$packageName]['version'];
536
+ }
537
+
538
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
539
+ }
540
+
541
+
542
+
543
+
544
+
545
+ public static function getPrettyVersion($packageName)
546
+ {
547
+ foreach (self::getInstalled() as $installed) {
548
+ if (!isset($installed['versions'][$packageName])) {
549
+ continue;
550
+ }
551
+
552
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
553
+ return null;
554
+ }
555
+
556
+ return $installed['versions'][$packageName]['pretty_version'];
557
+ }
558
+
559
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
560
+ }
561
+
562
+
563
+
564
+
565
+
566
+ public static function getReference($packageName)
567
+ {
568
+ foreach (self::getInstalled() as $installed) {
569
+ if (!isset($installed['versions'][$packageName])) {
570
+ continue;
571
+ }
572
+
573
+ if (!isset($installed['versions'][$packageName]['reference'])) {
574
+ return null;
575
+ }
576
+
577
+ return $installed['versions'][$packageName]['reference'];
578
+ }
579
+
580
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
581
+ }
582
+
583
+
584
+
585
+
586
+
587
+ public static function getRootPackage()
588
+ {
589
+ $installed = self::getInstalled();
590
+
591
+ return $installed[0]['root'];
592
+ }
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+ public static function getRawData()
601
+ {
602
+ return self::$installed;
603
+ }
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+
622
+
623
+ public static function reload($data)
624
+ {
625
+ self::$installed = $data;
626
+ self::$installedByVendor = array();
627
+ }
628
+
629
+
630
+
631
+
632
+ private static function getInstalled()
633
+ {
634
+ if (null === self::$canGetVendors) {
635
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
636
+ }
637
+
638
+ $installed = array();
639
+
640
+ if (self::$canGetVendors) {
641
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
642
+ if (isset(self::$installedByVendor[$vendorDir])) {
643
+ $installed[] = self::$installedByVendor[$vendorDir];
644
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
645
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
646
+ }
647
+ }
648
+ }
649
+
650
+ $installed[] = self::$installed;
651
+
652
+ return $installed;
653
+ }
654
+ }
vendor/composer/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Copyright (c) Nils Adermann, Jordi Boggiano
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is furnished
9
+ to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
vendor/composer/autoload_classmap.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_classmap.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ );
vendor/composer/autoload_namespaces.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_namespaces.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ );
vendor/composer/autoload_psr4.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_psr4.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'Extendify\\Library\\' => array($baseDir . '/app'),
10
+ );
vendor/composer/autoload_real.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInit340a6822f05e2bfceab6432d90c2eeaa
6
+ {
7
+ private static $loader;
8
+
9
+ public static function loadClassLoader($class)
10
+ {
11
+ if ('Composer\Autoload\ClassLoader' === $class) {
12
+ require __DIR__ . '/ClassLoader.php';
13
+ }
14
+ }
15
+
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
+ public static function getLoader()
20
+ {
21
+ if (null !== self::$loader) {
22
+ return self::$loader;
23
+ }
24
+
25
+ spl_autoload_register(array('ComposerAutoloaderInit340a6822f05e2bfceab6432d90c2eeaa', 'loadClassLoader'), true, true);
26
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInit340a6822f05e2bfceab6432d90c2eeaa', 'loadClassLoader'));
28
+
29
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
+ if ($useStaticLoader) {
31
+ require_once __DIR__ . '/autoload_static.php';
32
+
33
+ call_user_func(\Composer\Autoload\ComposerStaticInit340a6822f05e2bfceab6432d90c2eeaa::getInitializer($loader));
34
+ } else {
35
+ $map = require __DIR__ . '/autoload_namespaces.php';
36
+ foreach ($map as $namespace => $path) {
37
+ $loader->set($namespace, $path);
38
+ }
39
+
40
+ $map = require __DIR__ . '/autoload_psr4.php';
41
+ foreach ($map as $namespace => $path) {
42
+ $loader->setPsr4($namespace, $path);
43
+ }
44
+
45
+ $classMap = require __DIR__ . '/autoload_classmap.php';
46
+ if ($classMap) {
47
+ $loader->addClassMap($classMap);
48
+ }
49
+ }
50
+
51
+ $loader->register(true);
52
+
53
+ return $loader;
54
+ }
55
+ }
vendor/composer/autoload_static.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInit340a6822f05e2bfceab6432d90c2eeaa
8
+ {
9
+ public static $prefixLengthsPsr4 = array (
10
+ 'E' =>
11
+ array (
12
+ 'Extendify\\Library\\' => 18,
13
+ ),
14
+ );
15
+
16
+ public static $prefixDirsPsr4 = array (
17
+ 'Extendify\\Library\\' =>
18
+ array (
19
+ 0 => __DIR__ . '/../..' . '/app',
20
+ ),
21
+ );
22
+
23
+ public static function getInitializer(ClassLoader $loader)
24
+ {
25
+ return \Closure::bind(function () use ($loader) {
26
+ $loader->prefixLengthsPsr4 = ComposerStaticInit340a6822f05e2bfceab6432d90c2eeaa::$prefixLengthsPsr4;
27
+ $loader->prefixDirsPsr4 = ComposerStaticInit340a6822f05e2bfceab6432d90c2eeaa::$prefixDirsPsr4;
28
+
29
+ }, null, ClassLoader::class);
30
+ }
31
+ }
vendor/composer/installed.json ADDED
@@ -0,0 +1 @@
 
1
+ []
vendor/composer/installed.php ADDED
@@ -0,0 +1,395 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php return array (
2
+ 'root' =>
3
+ array (
4
+ 'pretty_version' => 'dev-main',
5
+ 'version' => 'dev-main',
6
+ 'aliases' =>
7
+ array (
8
+ ),
9
+ 'reference' => 'ac2cfec95277e7980dfcf8dfde5cd858f1023e03',
10
+ 'name' => 'extendify/extendify',
11
+ ),
12
+ 'versions' =>
13
+ array (
14
+ 'dealerdirect/phpcodesniffer-composer-installer' =>
15
+ array (
16
+ 'pretty_version' => 'v0.7.1',
17
+ 'version' => '0.7.1.0',
18
+ 'aliases' =>
19
+ array (
20
+ ),
21
+ 'reference' => 'fe390591e0241955f22eb9ba327d137e501c771c',
22
+ ),
23
+ 'doctrine/instantiator' =>
24
+ array (
25
+ 'pretty_version' => '1.4.0',
26
+ 'version' => '1.4.0.0',
27
+ 'aliases' =>
28
+ array (
29
+ ),
30
+ 'reference' => 'd56bf6102915de5702778fe20f2de3b2fe570b5b',
31
+ ),
32
+ 'extendify/extendify' =>
33
+ array (
34
+ 'pretty_version' => 'dev-main',
35
+ 'version' => 'dev-main',
36
+ 'aliases' =>
37
+ array (
38
+ ),
39
+ 'reference' => 'ac2cfec95277e7980dfcf8dfde5cd858f1023e03',
40
+ ),
41
+ 'johnpbloch/wordpress-core' =>
42
+ array (
43
+ 'pretty_version' => '5.7.0',
44
+ 'version' => '5.7.0.0',
45
+ 'aliases' =>
46
+ array (
47
+ ),
48
+ 'reference' => '8b057056692ca196aaa7a7ddd915f29426922c6d',
49
+ ),
50
+ 'myclabs/deep-copy' =>
51
+ array (
52
+ 'pretty_version' => '1.10.2',
53
+ 'version' => '1.10.2.0',
54
+ 'aliases' =>
55
+ array (
56
+ ),
57
+ 'reference' => '776f831124e9c62e1a2c601ecc52e776d8bb7220',
58
+ 'replaced' =>
59
+ array (
60
+ 0 => '1.10.2',
61
+ ),
62
+ ),
63
+ 'nikic/php-parser' =>
64
+ array (
65
+ 'pretty_version' => 'v4.10.4',
66
+ 'version' => '4.10.4.0',
67
+ 'aliases' =>
68
+ array (
69
+ ),
70
+ 'reference' => 'c6d052fc58cb876152f89f532b95a8d7907e7f0e',
71
+ ),
72
+ 'phar-io/manifest' =>
73
+ array (
74
+ 'pretty_version' => '2.0.1',
75
+ 'version' => '2.0.1.0',
76
+ 'aliases' =>
77
+ array (
78
+ ),
79
+ 'reference' => '85265efd3af7ba3ca4b2a2c34dbfc5788dd29133',
80
+ ),
81
+ 'phar-io/version' =>
82
+ array (
83
+ 'pretty_version' => '3.1.0',
84
+ 'version' => '3.1.0.0',
85
+ 'aliases' =>
86
+ array (
87
+ ),
88
+ 'reference' => 'bae7c545bef187884426f042434e561ab1ddb182',
89
+ ),
90
+ 'phpcompatibility/php-compatibility' =>
91
+ array (
92
+ 'pretty_version' => '9.3.5',
93
+ 'version' => '9.3.5.0',
94
+ 'aliases' =>
95
+ array (
96
+ ),
97
+ 'reference' => '9fb324479acf6f39452e0655d2429cc0d3914243',
98
+ ),
99
+ 'phpcompatibility/phpcompatibility-paragonie' =>
100
+ array (
101
+ 'pretty_version' => '1.3.1',
102
+ 'version' => '1.3.1.0',
103
+ 'aliases' =>
104
+ array (
105
+ ),
106
+ 'reference' => 'ddabec839cc003651f2ce695c938686d1086cf43',
107
+ ),
108
+ 'phpcompatibility/phpcompatibility-wp' =>
109
+ array (
110
+ 'pretty_version' => '2.1.1',
111
+ 'version' => '2.1.1.0',
112
+ 'aliases' =>
113
+ array (
114
+ ),
115
+ 'reference' => 'b7dc0cd7a8f767ccac5e7637550ea1c50a67b09e',
116
+ ),
117
+ 'phpdocumentor/reflection-common' =>
118
+ array (
119
+ 'pretty_version' => '2.2.0',
120
+ 'version' => '2.2.0.0',
121
+ 'aliases' =>
122
+ array (
123
+ ),
124
+ 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
125
+ ),
126
+ 'phpdocumentor/reflection-docblock' =>
127
+ array (
128
+ 'pretty_version' => '5.2.2',
129
+ 'version' => '5.2.2.0',
130
+ 'aliases' =>
131
+ array (
132
+ ),
133
+ 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556',
134
+ ),
135
+ 'phpdocumentor/type-resolver' =>
136
+ array (
137
+ 'pretty_version' => '1.4.0',
138
+ 'version' => '1.4.0.0',
139
+ 'aliases' =>
140
+ array (
141
+ ),
142
+ 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0',
143
+ ),
144
+ 'phpspec/prophecy' =>
145
+ array (
146
+ 'pretty_version' => '1.13.0',
147
+ 'version' => '1.13.0.0',
148
+ 'aliases' =>
149
+ array (
150
+ ),
151
+ 'reference' => 'be1996ed8adc35c3fd795488a653f4b518be70ea',
152
+ ),
153
+ 'phpunit/php-code-coverage' =>
154
+ array (
155
+ 'pretty_version' => '9.2.6',
156
+ 'version' => '9.2.6.0',
157
+ 'aliases' =>
158
+ array (
159
+ ),
160
+ 'reference' => 'f6293e1b30a2354e8428e004689671b83871edde',
161
+ ),
162
+ 'phpunit/php-file-iterator' =>
163
+ array (
164
+ 'pretty_version' => '3.0.5',
165
+ 'version' => '3.0.5.0',
166
+ 'aliases' =>
167
+ array (
168
+ ),
169
+ 'reference' => 'aa4be8575f26070b100fccb67faabb28f21f66f8',
170
+ ),
171
+ 'phpunit/php-invoker' =>
172
+ array (
173
+ 'pretty_version' => '3.1.1',
174
+ 'version' => '3.1.1.0',
175
+ 'aliases' =>
176
+ array (
177
+ ),
178
+ 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
179
+ ),
180
+ 'phpunit/php-text-template' =>
181
+ array (
182
+ 'pretty_version' => '2.0.4',
183
+ 'version' => '2.0.4.0',
184
+ 'aliases' =>
185
+ array (
186
+ ),
187
+ 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
188
+ ),
189
+ 'phpunit/php-timer' =>
190
+ array (
191
+ 'pretty_version' => '5.0.3',
192
+ 'version' => '5.0.3.0',
193
+ 'aliases' =>
194
+ array (
195
+ ),
196
+ 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
197
+ ),
198
+ 'phpunit/phpunit' =>
199
+ array (
200
+ 'pretty_version' => '9.5.4',
201
+ 'version' => '9.5.4.0',
202
+ 'aliases' =>
203
+ array (
204
+ ),
205
+ 'reference' => 'c73c6737305e779771147af66c96ca6a7ed8a741',
206
+ ),
207
+ 'sebastian/cli-parser' =>
208
+ array (
209
+ 'pretty_version' => '1.0.1',
210
+ 'version' => '1.0.1.0',
211
+ 'aliases' =>
212
+ array (
213
+ ),
214
+ 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
215
+ ),
216
+ 'sebastian/code-unit' =>
217
+ array (
218
+ 'pretty_version' => '1.0.8',
219
+ 'version' => '1.0.8.0',
220
+ 'aliases' =>
221
+ array (
222
+ ),
223
+ 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
224
+ ),
225
+ 'sebastian/code-unit-reverse-lookup' =>
226
+ array (
227
+ 'pretty_version' => '2.0.3',
228
+ 'version' => '2.0.3.0',
229
+ 'aliases' =>
230
+ array (
231
+ ),
232
+ 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
233
+ ),
234
+ 'sebastian/comparator' =>
235
+ array (
236
+ 'pretty_version' => '4.0.6',
237
+ 'version' => '4.0.6.0',
238
+ 'aliases' =>
239
+ array (
240
+ ),
241
+ 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
242
+ ),
243
+ 'sebastian/complexity' =>
244
+ array (
245
+ 'pretty_version' => '2.0.2',
246
+ 'version' => '2.0.2.0',
247
+ 'aliases' =>
248
+ array (
249
+ ),
250
+ 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
251
+ ),
252
+ 'sebastian/diff' =>
253
+ array (
254
+ 'pretty_version' => '4.0.4',
255
+ 'version' => '4.0.4.0',
256
+ 'aliases' =>
257
+ array (
258
+ ),
259
+ 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
260
+ ),
261
+ 'sebastian/environment' =>
262
+ array (
263
+ 'pretty_version' => '5.1.3',
264
+ 'version' => '5.1.3.0',
265
+ 'aliases' =>
266
+ array (
267
+ ),
268
+ 'reference' => '388b6ced16caa751030f6a69e588299fa09200ac',
269
+ ),
270
+ 'sebastian/exporter' =>
271
+ array (
272
+ 'pretty_version' => '4.0.3',
273
+ 'version' => '4.0.3.0',
274
+ 'aliases' =>
275
+ array (
276
+ ),
277
+ 'reference' => 'd89cc98761b8cb5a1a235a6b703ae50d34080e65',
278
+ ),
279
+ 'sebastian/global-state' =>
280
+ array (
281
+ 'pretty_version' => '5.0.2',
282
+ 'version' => '5.0.2.0',
283
+ 'aliases' =>
284
+ array (
285
+ ),
286
+ 'reference' => 'a90ccbddffa067b51f574dea6eb25d5680839455',
287
+ ),
288
+ 'sebastian/lines-of-code' =>
289
+ array (
290
+ 'pretty_version' => '1.0.3',
291
+ 'version' => '1.0.3.0',
292
+ 'aliases' =>
293
+ array (
294
+ ),
295
+ 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
296
+ ),
297
+ 'sebastian/object-enumerator' =>
298
+ array (
299
+ 'pretty_version' => '4.0.4',
300
+ 'version' => '4.0.4.0',
301
+ 'aliases' =>
302
+ array (
303
+ ),
304
+ 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
305
+ ),
306
+ 'sebastian/object-reflector' =>
307
+ array (
308
+ 'pretty_version' => '2.0.4',
309
+ 'version' => '2.0.4.0',
310
+ 'aliases' =>
311
+ array (
312
+ ),
313
+ 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
314
+ ),
315
+ 'sebastian/recursion-context' =>
316
+ array (
317
+ 'pretty_version' => '4.0.4',
318
+ 'version' => '4.0.4.0',
319
+ 'aliases' =>
320
+ array (
321
+ ),
322
+ 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
323
+ ),
324
+ 'sebastian/resource-operations' =>
325
+ array (
326
+ 'pretty_version' => '3.0.3',
327
+ 'version' => '3.0.3.0',
328
+ 'aliases' =>
329
+ array (
330
+ ),
331
+ 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
332
+ ),
333
+ 'sebastian/type' =>
334
+ array (
335
+ 'pretty_version' => '2.3.1',
336
+ 'version' => '2.3.1.0',
337
+ 'aliases' =>
338
+ array (
339
+ ),
340
+ 'reference' => '81cd61ab7bbf2de744aba0ea61fae32f721df3d2',
341
+ ),
342
+ 'sebastian/version' =>
343
+ array (
344
+ 'pretty_version' => '3.0.2',
345
+ 'version' => '3.0.2.0',
346
+ 'aliases' =>
347
+ array (
348
+ ),
349
+ 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
350
+ ),
351
+ 'squizlabs/php_codesniffer' =>
352
+ array (
353
+ 'pretty_version' => '3.6.0',
354
+ 'version' => '3.6.0.0',
355
+ 'aliases' =>
356
+ array (
357
+ ),
358
+ 'reference' => 'ffced0d2c8fa8e6cdc4d695a743271fab6c38625',
359
+ ),
360
+ 'symfony/polyfill-ctype' =>
361
+ array (
362
+ 'pretty_version' => 'v1.22.1',
363
+ 'version' => '1.22.1.0',
364
+ 'aliases' =>
365
+ array (
366
+ ),
367
+ 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e',
368
+ ),
369
+ 'theseer/tokenizer' =>
370
+ array (
371
+ 'pretty_version' => '1.2.0',
372
+ 'version' => '1.2.0.0',
373
+ 'aliases' =>
374
+ array (
375
+ ),
376
+ 'reference' => '75a63c33a8577608444246075ea0af0d052e452a',
377
+ ),
378
+ 'webmozart/assert' =>
379
+ array (
380
+ 'pretty_version' => '1.10.0',
381
+ 'version' => '1.10.0.0',
382
+ 'aliases' =>
383
+ array (
384
+ ),
385
+ 'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
386
+ ),
387
+ 'wordpress/core-implementation' =>
388
+ array (
389
+ 'provided' =>
390
+ array (
391
+ 0 => '5.7.0',
392
+ ),
393
+ ),
394
+ ),
395
+ );