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 | Extendify — Gutenberg Patterns and Templates |
Version | 0.1.0 |
Comparing to | |
See all releases |
Version 0.1.0
- LICENSE +339 -0
- app/Admin.php +180 -0
- app/ApiRouter.php +137 -0
- app/App.php +113 -0
- app/Controllers/AuthController.php +43 -0
- app/Controllers/MetaController.php +30 -0
- app/Controllers/PingController.php +30 -0
- app/Controllers/PluginController.php +57 -0
- app/Controllers/SiteSettingsController.php +42 -0
- app/Controllers/TaxonomyController.php +29 -0
- app/Controllers/TemplateController.php +43 -0
- app/Controllers/UserController.php +80 -0
- app/Frontend.php +70 -0
- app/Http.php +151 -0
- app/Plugin.php +34 -0
- app/Shared.php +298 -0
- app/SiteSettings.php +72 -0
- app/User.php +148 -0
- bootstrap.php +48 -0
- config.json +7 -0
- editorplus/EditorPlus.php +221 -0
- editorplus/editorplus-template.php +50 -0
- editorplus/editorplus.js +29 -0
- extendify.php +75 -0
- loader.php +50 -0
- public/.gitkeep +0 -0
- public/assets/preview.png +0 -0
- public/build/.gitkeep +0 -0
- public/build/extendify-utilities.css +7 -0
- public/build/extendify.css +1 -0
- public/build/extendify.js +2 -0
- public/build/extendify.js.LICENSE.txt +20 -0
- public/editorplus/.gitkeep +0 -0
- public/editorplus/editorplus.min.js +1 -0
- readme.txt +78 -0
- routes/api.php +48 -0
- src/ExtendifyLibrary.js +62 -0
- src/api/General.js +12 -0
- src/api/Plugins.js +19 -0
- src/api/SiteSettings.js +16 -0
- src/api/Taxonomies.js +7 -0
- src/api/Templates.js +63 -0
- src/api/User.js +54 -0
- src/api/axios.js +70 -0
- src/app.css +132 -0
- src/app.js +45 -0
- src/blocks/blocks.js +1 -0
- src/blocks/library/block.js +38 -0
- src/blocks/library/block.json +15 -0
- src/buttons.js +136 -0
- src/components/DevHelpers.js +32 -0
- src/components/FooterNotice.js +103 -0
- src/components/ImportCounter.js +62 -0
- src/components/ImportTemplateBlock.js +248 -0
- src/components/LibraryAccessModal.js +112 -0
- src/components/LoginInterface.js +218 -0
- src/components/SiteTypeSelector.js +241 -0
- src/components/TaxonomySection.js +49 -0
- src/components/TypeSelect.js +37 -0
- src/components/buttons/Primary.js +10 -0
- src/components/icons/index.js +13 -0
- src/components/icons/library/alert.js +25 -0
- src/components/icons/library/brand-block-icon.js +17 -0
- src/components/icons/library/brand-logo.js +32 -0
- src/components/icons/library/brand-mark.js +17 -0
- src/components/icons/library/download.js +21 -0
- src/components/icons/library/featured.js +21 -0
- src/components/icons/library/growth-arrow.js +18 -0
- src/components/icons/library/layouts.js +20 -0
- src/components/icons/library/patterns.js +54 -0
- src/components/icons/library/star.js +20 -0
- src/components/icons/library/success.js +70 -0
- src/components/icons/library/support.js +39 -0
- src/components/icons/library/user.js +17 -0
- src/components/modals/Modal.js +74 -0
- src/components/modals/SettingsModal.js +23 -0
- src/components/modals/SplitModal.js +51 -0
- src/components/notices/FeedbackNotice.js +27 -0
- src/components/notices/PromotionNotice.js +23 -0
- src/components/notices/WelcomeNotice.js +46 -0
- src/hooks/helpers.js +26 -0
- src/hooks/useTaxonomies.js +27 -0
- src/listeners/index.js +3 -0
- src/listeners/softerror-encountered.js +24 -0
- src/listeners/template-inserted.js +24 -0
- src/middleware/NeedsPermissionModal.js +65 -0
- src/middleware/NeedsRegistrationModal.js +142 -0
- src/middleware/ReloadRequiredModal.js +49 -0
- src/middleware/hasPluginsActivated/ActivatePluginsModal.js +78 -0
- src/middleware/hasPluginsActivated/ActivatingModal.js +58 -0
- src/middleware/hasPluginsActivated/ErrorActivating.js +34 -0
- src/middleware/hasPluginsActivated/index.js +19 -0
- src/middleware/hasRequiredPlugins/ErrorInstalling.js +33 -0
- src/middleware/hasRequiredPlugins/InstallingModal.js +57 -0
- src/middleware/hasRequiredPlugins/RequiredPluginsModal.js +95 -0
- src/middleware/hasRequiredPlugins/index.js +19 -0
- src/middleware/helpers.js +61 -0
- src/middleware/index.js +46 -0
- src/pages/GridView.js +199 -0
- src/pages/MainWindow.js +53 -0
- src/pages/Sidebar.js +77 -0
- src/pages/layout/HasSidebar.js +16 -0
- src/pages/layout/Layout.js +45 -0
- src/pages/layout/Toolbar.js +43 -0
- src/state/GlobalState.js +36 -0
- src/state/Importing.js +22 -0
- src/state/SiteSettings.js +21 -0
- src/state/Taxonomies.js +14 -0
- src/state/Templates.js +124 -0
- src/state/User.js +102 -0
- src/util/general.js +58 -0
- src/util/templateInjection.js +32 -0
- src/utility-control/index.js +122 -0
- utility-framework/block-styles/cover-angled.css +19 -0
- utility-framework/classes/clip-path.css +11 -0
- utility-framework/classes/columns.css +117 -0
- utility-framework/classes/direction.css +7 -0
- utility-framework/classes/editor/no-caption.css +3 -0
- utility-framework/classes/editor/no-inserter.css +10 -0
- utility-framework/classes/editor/no-resize.css +10 -0
- utility-framework/classes/editor/pointer-events.css +3 -0
- utility-framework/classes/fallback.css +10 -0
- utility-framework/classes/inline-list.css +19 -0
- utility-framework/classes/misc.css +4 -0
- utility-framework/classes/text-stroke.css +23 -0
- utility-framework/extendify-utilities.css +86 -0
- utility-framework/fallback/align.css +5 -0
- utility-framework/fallback/colors.css +51 -0
- utility-framework/fallback/font-sizes.css +36 -0
- utility-framework/fallback/grid.css +143 -0
- utility-framework/fallback/group.css +54 -0
- utility-framework/fallback/image.css +10 -0
- utility-framework/suggestions.json +570 -0
- vendor/autoload.php +7 -0
- vendor/composer/ClassLoader.php +445 -0
- vendor/composer/InstalledVersions.php +654 -0
- vendor/composer/LICENSE +21 -0
- vendor/composer/autoload_classmap.php +9 -0
- vendor/composer/autoload_namespaces.php +9 -0
- vendor/composer/autoload_psr4.php +10 -0
- vendor/composer/autoload_real.php +55 -0
- vendor/composer/autoload_static.php +31 -0
- vendor/composer/installed.json +1 -0
- 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 > 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 |
+
|
|
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 |
+
|
|
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 |
+
|
|
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 |
+
•
|
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 |
+
);
|